diff --git a/B05_Profile/B05_Profile_Structure_Types.json b/B05_Profile/B05_Profile_Structure_Types.json index c3fbe39f..4f4e5f58 100644 --- a/B05_Profile/B05_Profile_Structure_Types.json +++ b/B05_Profile/B05_Profile_Structure_Types.json @@ -179,6 +179,15 @@ "default": 2.5, "required": false, "phase": "detail" + }, + { + "key": "revet_foundation", + "label": "기슭막이 기초", + "input": "select", + "choices": ["기초유", "기초버림"], + "default": null, + "required": false, + "phase": "detail" } ] }, @@ -202,6 +211,15 @@ "default": 2.0, "required": false }, + { + "key": "revet_foundation", + "label": "기슭막이 기초", + "input": "select", + "choices": ["기초유", "기초버림"], + "default": null, + "required": false, + "phase": "detail" + }, { "key": "body_height_m", "label": "본체 높이", @@ -779,6 +797,24 @@ "required": false, "phase": "detail" }, + { + "key": "stone_coeff_basis", + "label": "야면석 계수", + "input": "select", + "choices": ["품셈", "실무 관행"], + "default": null, + "required": false, + "phase": "detail" + }, + { + "key": "fill_concrete_mpa", + "label": "채움 강도", + "input": "select", + "choices": ["180", "210"], + "default": null, + "required": false, + "phase": "detail" + }, { "key": "face_slope_ratio", "label": "전면 기울기 (1:n 의 n)", @@ -879,6 +915,24 @@ "required": false, "phase": "detail" }, + { + "key": "stone_coeff_basis", + "label": "야면석 계수", + "input": "select", + "choices": ["품셈", "실무 관행"], + "default": null, + "required": false, + "phase": "detail" + }, + { + "key": "fill_concrete_mpa", + "label": "채움 강도", + "input": "select", + "choices": ["180", "210"], + "default": null, + "required": false, + "phase": "detail" + }, { "key": "face_slope_ratio", "label": "전면 기울기 (1:n 의 n)", @@ -1044,6 +1098,24 @@ "required": false, "phase": "detail" }, + { + "key": "stone_coeff_basis", + "label": "야면석 계수", + "input": "select", + "choices": ["품셈", "실무 관행"], + "default": null, + "required": false, + "phase": "detail" + }, + { + "key": "fill_concrete_mpa", + "label": "채움 강도", + "input": "select", + "choices": ["180", "210"], + "default": null, + "required": false, + "phase": "detail" + }, { "key": "face_slope_ratio", "label": "전면 기울기 (1:n 의 n)", @@ -1166,6 +1238,24 @@ "required": false, "phase": "detail" }, + { + "key": "stone_coeff_basis", + "label": "야면석 계수", + "input": "select", + "choices": ["품셈", "실무 관행"], + "default": null, + "required": false, + "phase": "detail" + }, + { + "key": "fill_concrete_mpa", + "label": "채움 강도", + "input": "select", + "choices": ["180", "210"], + "default": null, + "required": false, + "phase": "detail" + }, { "key": "face_slope_ratio", "label": "전면 기울기 (1:n 의 n)", @@ -1228,6 +1318,24 @@ "required": false, "phase": "detail" }, + { + "key": "stone_coeff_basis", + "label": "야면석 계수", + "input": "select", + "choices": ["품셈", "실무 관행"], + "default": null, + "required": false, + "phase": "detail" + }, + { + "key": "fill_concrete_mpa", + "label": "채움 강도", + "input": "select", + "choices": ["180", "210"], + "default": null, + "required": false, + "phase": "detail" + }, { "key": "face_slope_ratio", "label": "전면 기울기 (1:n 의 n)", @@ -1353,6 +1461,24 @@ "required": false, "phase": "detail" }, + { + "key": "stone_coeff_basis", + "label": "야면석 계수", + "input": "select", + "choices": ["품셈", "실무 관행"], + "default": null, + "required": false, + "phase": "detail" + }, + { + "key": "fill_concrete_mpa", + "label": "채움 강도", + "input": "select", + "choices": ["180", "210"], + "default": null, + "required": false, + "phase": "detail" + }, { "key": "face_slope_ratio", "label": "전면 기울기 (1:n 의 n)", diff --git a/B06_Section/B06_Section_Engine_Culvert.py b/B06_Section/B06_Section_Engine_Culvert.py index de563489..5f18bbd2 100644 --- a/B06_Section/B06_Section_Engine_Culvert.py +++ b/B06_Section/B06_Section_Engine_Culvert.py @@ -213,6 +213,12 @@ def _culvert_set(options: dict[str, Any] | None) -> dict[str, Any]: "pipe_kind": str(kind) if kind else None, "diameter_m": round((diameter_mm or 1000.0) / 1000.0, 3), "min_cover_m": MIN_PIPE_COVER_M, + # 관 기슭막이 기초 축 — **유입·유출 한 칸으로** 받는다(2026-09-09). 한쪽만 기초유로 + # 하는 일이 드물어 폼을 둘로 늘리지 않았다. 실무가 갈라 쓰면 그때 나눌 것. + "foundation": ( + str(values.get("revet_foundation") or defaults.get("revet_foundation") or "").strip() + or None + ), "inlet": _side_spec(values, defaults, "inlet"), "outlet": _side_spec(values, defaults, "outlet"), } @@ -264,9 +270,7 @@ def _revet_set(options: dict[str, Any] | None) -> dict[str, Any]: "side": str(values.get("side") or "양쪽"), "tiers": int(_number(values.get("tiers"), 1.0) or 1), # 기초 축(기초유/기초버림) — 터파기 그림·물량이 같이 쓴다. 비어 있으면 안 그린다. - "foundation": (str(values["foundation"]).strip() or None) - if values.get("foundation") is not None - else None, + "foundation": (str(values.get("foundation") or "").strip() or None), "pipe_kind": None, "diameter_m": 0.3, "min_cover_m": 0.0, diff --git a/B06_Section/B06_Section_Engine_Structures_Wall.py b/B06_Section/B06_Section_Engine_Structures_Wall.py index d4b3a70d..637ebcec 100644 --- a/B06_Section/B06_Section_Engine_Structures_Wall.py +++ b/B06_Section/B06_Section_Engine_Structures_Wall.py @@ -73,6 +73,9 @@ def load_wall_structures(project_root: Path) -> list[dict[str, Any]]: # C군 폼에는 설치 측 칸이 없다 — 비워 두면 화면이 **성토가 나는 쪽**으로 # 세운다(`computeRevetmentLayout`). 사용자가 정하고 싶어지면 그때 칸을 낸다. "side": options.get("side"), + # 기초 축(기초유/기초버림) — 터파기 그림·물량이 같이 쓴다. + # 비어 있으면 화면이 터파기를 안 그린다(근거 없음). + "foundation": options.get("foundation"), "tiers": options.get("tiers"), "lift_m": options.get("lift_m"), "shift_m": options.get("shift_m"), diff --git a/B06_Section/B06_Section_UI_Cross_Revetment.ts b/B06_Section/B06_Section_UI_Cross_Revetment.ts index 5c45ff3d..d6f4578c 100644 --- a/B06_Section/B06_Section_UI_Cross_Revetment.ts +++ b/B06_Section/B06_Section_UI_Cross_Revetment.ts @@ -37,6 +37,7 @@ import { type WallAdjust, type WallLayout, } from "./B06_Section_UI_Cross_Culvert_Types"; +import { appendWallTrench, foundationChoice } from "./B06_Section_UI_Cross_Excavation"; import { appendPlanLine, buildRevetWallGeometry, drawRevetWall } from "./B06_Section_UI_Cross_Wall"; const SVG_NS = "http://www.w3.org/2000/svg"; @@ -53,6 +54,8 @@ export interface RevetmentSpec { height_m?: number | null; /** 사용자가 고른 설치 측 — "좌" | "우". */ side?: string | null; + /** 기초 축 — "기초유" | "기초버림". **비어 있으면 터파기를 안 그린다**(근거 없음). */ + foundation?: string | null; /** 단 수(다단). 1이면 단일 벽. */ tiers?: number | null; /** (구 모델) 기준 올림·좌우 이동 — 배관식 전환 뒤 자리는 조정창 4축(x·d)이 정한다. */ @@ -89,6 +92,8 @@ export interface RevetmentLayout { top: RevetPoint; /** 벽 목록(1단 + 다단) — 배관 벽과 같은 `WallLayout`, 그리기가 그대로 쓴다. */ walls: WallLayout[]; + /** 기초 축 — 저장 칸과 **같은 글자**(`foundation`). 터파기 그림이 이 값으로 갈린다. */ + foundation: string | null; /** 벽 사이·벽 아래 성토부선(배관 다단과 같은 체계). */ fillSegments: OutletFillSegment[]; /** 성토 설계선을 벽 상단에서 끊고 노견→벽 성토선을 대신 그리는 트림. */ @@ -304,6 +309,7 @@ export function computeRevetmentLayout( requestedTiers, top: jt, walls, + foundation: typeof spec.foundation === "string" ? spec.foundation.trim() || null : null, fillSegments: extras.segments, designTrim, appliedAdjust: { x: appliedX, d: appliedDrop, h: adjust?.h ?? null, m: null }, @@ -359,6 +365,11 @@ export function appendRevetmentOverlay( ` · 성토 물매 1:${(segment.ratio ?? 1.2).toFixed(2)}`, ); } + // 터파기는 벽보다 **먼저** — 파선이 벽 밑에 깔린다. 기초 축이 비어 있으면 안 그린다. + const trenchFoundation = foundationChoice(layout.foundation); + for (const wall of layout.walls) { + appendWallTrench(svg, wall, trenchFoundation, x, y); + } const drawn: SVGPolygonElement[] = []; layout.walls.forEach((wall, index) => { const keyId = index === 0 ? "own" : `own-extra${index - 1}`; diff --git a/common_util/common_util_culvert_sets.ts b/common_util/common_util_culvert_sets.ts index 51e77620..165ed43c 100644 --- a/common_util/common_util_culvert_sets.ts +++ b/common_util/common_util_culvert_sets.ts @@ -138,6 +138,10 @@ function culvertSet( pipe_kind: text(options.pipe_kind) ?? text(defaults.pipe_kind), diameter_m: pipeDiameterM(diameterMm), min_cover_m: MIN_PIPE_COVER_M, + // 관 기슭막이 기초 축 — **유입·유출 한 칸으로** 받는다. 한 공사에서 한쪽만 기초유로 + // 하는 일은 드물어 폼을 둘로 늘리지 않았다(2026-09-09). 실무가 갈라 쓰는 것이 + // 확인되면 그때 나눌 것. + foundation: text(options.revet_foundation) ?? text(defaults.revet_foundation), inlet: sideSpec(options, defaults, "inlet"), outlet: sideSpec(options, defaults, "outlet"), };