diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py index 6eca6c62..105614d8 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py @@ -112,14 +112,18 @@ def _pack( def _slots(col_widths: list[float], row_heights: list[float], count: int) -> list[list[float]]: - """칸 중심 좌표 — 좌하단부터 아래→위로 채우고, 열이 차면 오른쪽 열로 넘어간다.""" + """칸의 (가로 중심, 아래 변) — 좌하단부터 아래→위로 채우고, 열이 차면 오른쪽 열. + + 세로는 중심이 아니라 **아래 변**을 준다. 수량표 높이는 모든 블록이 같으므로 + 아래를 맞추면 같은 행의 표가 한 줄로 선다(2026-08-30 사용자: 표는 행·열을 맞춘다). + """ usable_w, usable_h = usable_area() rows = len(row_heights) slots: list[list[float]] = [] for index in range(count): column, row = divmod(index, rows) x = -usable_w / 2.0 + sum(col_widths[:column]) + col_widths[column] / 2.0 - y = -usable_h / 2.0 + sum(row_heights[:row]) + row_heights[row] / 2.0 + y = -usable_h / 2.0 + sum(row_heights[:row]) slots.append([x, y]) return slots @@ -179,11 +183,12 @@ def build_cross_sheet(sheet: dict[str, Any], sections: list[dict[str, Any]]) -> if bbox is None: continue min_x, min_y, max_x, max_y = bbox - center_x, center_y = slots[index] - # 2) 칸 가운데에 오도록 원점을 옮겨 다시 만든다. + center_x, bottom_y = slots[index] + # 2) 가로는 칸 가운데, 세로는 칸 아래 변에 맞춰 원점을 옮겨 다시 만든다. + # 아래를 맞춰야 같은 행의 수량표가 한 줄로 선다. origin = ( center_x - (min_x + max_x) / 2.0, - center_y - (min_y + max_y) / 2.0, + bottom_y + _BLOCK_GAP_MM / 2.0 - min_y, ) placed = build_cross_drawing( section["source"], diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Template.py b/B07_DesignDetail/B07_DesignDetail_Engine_Template.py index b8db14a0..12783025 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Template.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Template.py @@ -29,7 +29,9 @@ A1_TEMPLATE = "00_template_A1" COMPASS_TEMPLATE = "00_template_compass" # 유역도 등 평면 도면의 방위표 # A1 내부 작도 영역(템플릿 좌표) — 콘텐츠가 이 영역 중앙에 오도록 배치한다. _A1_INNER = (42.0, 47.0, 812.0, 567.0) -_CONTENT_MARGIN = 0.05 # 내부 작도 영역 대비 콘텐츠 여백 비율(각 방향 5%) +# 내부 작도 영역 대비 콘텐츠 여백 비율(각 방향). 5%는 도각 안쪽에 70mm 가까이를 +# 비워 횡단 장이 한 장 더 늘었다 — 2%로 줄여 작도 영역을 쓴다(2026-08-30 사용자). +_CONTENT_MARGIN = 0.02 @lru_cache(maxsize=8)