From 63428f2516c0a42368841e03b7357f94e72b73a8 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 2 Sep 2026 09:54:16 +0900 Subject: [PATCH] =?UTF-8?q?feat(B07):=20=ED=91=9C=EC=A0=9C=EB=9E=80=20?= =?UTF-8?q?=EC=B6=95=EC=B2=99=20=EC=B9=B8=EC=9D=84=20=EB=8F=84=EB=A9=B4=20?= =?UTF-8?q?=EC=B6=95=EC=B2=99=20=EC=83=81=EC=88=98=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B1=84=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 축척은 지어내는 값이 아니라 이미 정해져 있던 것 — `config_system` 의 도면별 축척 상수를 그대로 표제란에 싣는다. 도각이 `A1 = 1 :` 를 이미 찍으므로 **분모만** 낸다. - `scale_fields()` 신설 — A3 는 A1 도면을 절반으로 뽑는 종이라 분모가 2배. 가로·세로가 다른 도면(종단·토적)은 이름표를 붙여 함께 적는다. - 종단면도 `1000(H) · 200(V)` / 횡단면도 `100` / 유역도 `6000` / 토적도 `2000(H)`. A3 는 각각 2배. 담을 내용이 없는 빈 도면·표지는 축척이 없어 빈칸 그대로. 검증: `pytest tmp/tests/ -q` 135 passed / 0 failed(축척 2건 신규 — 상수 유래·A3 2배, 호출부가 넘긴 값이 도각에 실림). 백엔드 재시작 뒤 화면 실측(5174, wdw): 종단 `1000(H) · 200(V)`/`2000(H) · 400(V)`, 횡단 `100`/`200`, 유역도 `6000`/`12000`, 토적도 `2000(H)`/`4000(H)`, 표준도 빈칸. Co-Authored-By: Claude Opus 5 (1M context) --- .../B07_DesignDetail_Engine_Cad_Basin.py | 6 +++++- .../B07_DesignDetail_Engine_Cad_Long.py | 13 ++++++++++++- .../B07_DesignDetail_Engine_Cad_MassHaul.py | 11 +++++++++-- .../B07_DesignDetail_Engine_Cad_Sheet.py | 11 ++++++++++- .../B07_DesignDetail_Engine_Template.py | 17 +++++++++++++++++ 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Basin.py b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Basin.py index 090c3991..e79f7336 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Basin.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Basin.py @@ -35,6 +35,7 @@ from B07_DesignDetail.B07_DesignDetail_Engine_Template import ( compass_entities, entities_bbox, frame_entities, + scale_fields, usable_area, ) from config.config_system import DRAINAGE_RECOMMEND_DIAMETERS_MM, DRAWING_SCALE_BASIN @@ -400,7 +401,10 @@ def build_watershed_drawing( ) entities.extend( frame_entities( - drawing_id, entities_bbox(entities) or bbox, fit=False, fields={"도면명": "유역도"} + drawing_id, + entities_bbox(entities) or bbox, + fit=False, + fields={"도면명": "유역도", **scale_fields(("", DRAWING_SCALE_BASIN))}, ) ) diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Long.py b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Long.py index 54d74e9f..b1c76fa1 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Long.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Long.py @@ -44,6 +44,7 @@ from B07_DesignDetail.B07_DesignDetail_Engine_Cad import ( from B07_DesignDetail.B07_DesignDetail_Engine_Template import ( entities_bbox, frame_entities, + scale_fields, ) from common_util.common_util_route_profile import design_elevation_from_longitudinal from config.config_system import DRAWING_SCALE_LONG_H, DRAWING_SCALE_LONG_V @@ -669,7 +670,17 @@ def build_longitudinal_drawing( # A1 도각: 콘텐츠가 이미 종이 mm라 도각도 실치수(1:1)로 두고 위치만 맞춘다. bbox = entities_bbox(entities) if bbox: - entities.extend(frame_entities(drawing_id, bbox, fit=False, fields={"도면명": "종단면도"})) + entities.extend( + frame_entities( + drawing_id, + bbox, + fit=False, + fields={ + "도면명": "종단면도", + **scale_fields(("H", DRAWING_SCALE_LONG_H), ("V", DRAWING_SCALE_LONG_V)), + }, + ) + ) return { "format": DRAWING_FORMAT, diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_MassHaul.py b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_MassHaul.py index 6fce8c87..e9b37c2c 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_MassHaul.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_MassHaul.py @@ -34,7 +34,11 @@ from B07_DesignDetail.B07_DesignDetail_Engine_Cad import ( polyline_entity, station_no_label, ) -from B07_DesignDetail.B07_DesignDetail_Engine_Template import entities_bbox, frame_entities +from B07_DesignDetail.B07_DesignDetail_Engine_Template import ( + entities_bbox, + frame_entities, + scale_fields, +) from config.config_system import ( DRAWING_SCALE_MASSHAUL_H, DRAWING_SCALE_MASSHAUL_V_M3_MM, @@ -519,7 +523,10 @@ def build_mass_haul_drawing( ) entities.extend( frame_entities( - drawing_id, entities_bbox(entities) or bbox, fit=False, fields={"도면명": "토적도"} + drawing_id, + entities_bbox(entities) or bbox, + fit=False, + fields={"도면명": "토적도", **scale_fields(("H", DRAWING_SCALE_MASSHAUL_H))}, ) ) diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py index 9dd44217..43a1e52d 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Cad_Sheet.py @@ -31,8 +31,10 @@ from B07_DesignDetail.B07_DesignDetail_Engine_Cad_Table import ( from B07_DesignDetail.B07_DesignDetail_Engine_Template import ( entities_bbox, frame_entities, + scale_fields, usable_area, ) +from config.config_system import DRAWING_SCALE_CROSS # 장 도면 id — 측점 도면(cross_00020m)과 겹치지 않게 `s`를 끼운다(cross_s00020m). # 옛 순번 형식(cross_s01)도 읽어 준다 — 이미 확정한 매니페스트가 그 이름을 갖고 있다. @@ -209,7 +211,14 @@ def build_cross_sheet(sheet: dict[str, Any], sections: list[dict[str, Any]]) -> bbox = entities_bbox(entities) if bbox: - entities.extend(frame_entities(sheet["id"], bbox, fit=False, fields={"도면명": "횡단면도"})) + entities.extend( + frame_entities( + sheet["id"], + bbox, + fit=False, + fields={"도면명": "횡단면도", **scale_fields(("", DRAWING_SCALE_CROSS))}, + ) + ) return { "format": DRAWING_FORMAT, diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Template.py b/B07_DesignDetail/B07_DesignDetail_Engine_Template.py index ff940da6..cace17bc 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Template.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Template.py @@ -304,6 +304,23 @@ def _fill_placeholders( ] +def scale_fields(*denominators: tuple[str, int]) -> dict[str, str]: + """축척 칸(`{{축척_A1}}`·`{{축척_A3}}`)에 넣을 값. + + 도각이 `A1 = 1 :` 를 이미 찍으므로 **분모만** 낸다. A3 는 A1 도면을 절반으로 뽑는 + 종이라 분모가 2배다. 가로·세로 축척이 다른 도면(종단·토적)은 이름표를 붙여 함께 적는다. + 값은 `config_system` 의 축척 상수에서 오며 여기서 새로 정하지 않는다. + """ + + def text(factor: int) -> str: + return " · ".join( + f"{denominator * factor}({name})" if name else str(denominator * factor) + for name, denominator in denominators + ) + + return {"축척_A1": text(1), "축척_A3": text(2)} + + def frame_entities( drawing_id: str, content_bbox: tuple[float, float, float, float],