feat(B07): 토적도(유토곡선)·유역도(수리집수면적유역도)를 도면으로 낸다

납품 도면 2장을 B07 도면 목록에 새로 붙였다. 계산은 하지 않는다 —
유토곡선은 B06 확정 시 저장한 산출물(longitudinal_sections.data.mass_haul)을,
유역도는 B04 세부유역 GeoJSON과 도엽 등고선·세류선을 읽어 좌표만 종이 mm로 옮긴다.

- 도면 종류 확장: kind에 mass_haul·watershed 추가(Schema·Api_Fetch·openwebcad
  App.types), 12분류 라벨에 연결, 목록에 단장 도면 2건 상시 노출
- 엔진 신규: _Engine_Cad_MassHaul.py(축·곡선·평형선·띠 현·balloon·측점 테이블),
  _Engine_Cad_Basin.py(등고선·세류선 배경·노선·유역·구역별 정보표·방위표)
- 척도 상수: 유토곡선 H 1/2,000 · 세로 1mm=50㎥, 유역도 1/6,000 (A1 고정)
- 유토곡선 저장 payload에 띠·잔여의 기하 필드 추가 — 파이썬에 곡선 보간·토량 배분
  로직을 복제하지 않기 위해 값을 낳는 쪽(TS 엔진)에서 함께 남긴다
- 유역도 배경은 여러 도엽을 합쳐 받은 뒤 도곽 크기로 절취(clip_line_to_box)
- 배수규격은 소요 관경이 아니라 규격관(recommended_diameter_mm)으로 표기

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-30 13:01:39 +09:00
co-authored by Claude Opus 5
parent 14044de50e
commit a1dc0ee235
14 changed files with 1162 additions and 13 deletions
@@ -207,10 +207,22 @@ export function haulPlanPayload(plan: HaulPlan): Record<string, unknown> {
ea_m3: round(band.ea_m3),
rr_m3: round(band.rr_m3),
br_m3: round(band.br_m3),
// 띠의 기하 — B07 토적도가 경계현·평균운반거리 현을 이 값으로 그린다.
// 여기서 함께 저장하지 않으면 파이썬 쪽에 곡선 보간·배분 로직을 복제해야 한다.
level_base_m3: round(band.level_base_m3),
level_apex_m3: round(band.level_apex_m3),
boundary_from_m: round(band.boundary_from_m),
boundary_to_m: round(band.boundary_to_m),
haul_from_m: round(band.haul_from_m),
haul_to_m: round(band.haul_to_m),
})),
})),
residuals: plan.residuals.map((residual) => ({
index: residual.index,
kind: residual.kind,
// 평형선 단차 — 토적도 balloon을 곡선 옆 제 높이에 놓는 데 쓴다.
level_from_m3: round(residual.level_from_m3),
level_to_m3: round(residual.level_to_m3),
from_m: round(residual.from_m),
to_m: round(residual.to_m),
volume_m3: round(residual.volume_m3),