feat(B07): 표제란 축척 칸을 도면 축척 상수에서 채움

축척은 지어내는 값이 아니라 이미 정해져 있던 것 — `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) <noreply@anthropic.com>
This commit is contained in:
2026-09-02 09:54:16 +09:00
co-authored by Claude Opus 5
parent a5fba04778
commit 63428f2516
5 changed files with 53 additions and 5 deletions
@@ -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))},
)
)
@@ -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,
@@ -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))},
)
)
@@ -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,
@@ -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],