feat(B05·B06): 터파기 축을 관에도 · 독립 벽까지 잇고, 계수·강도 칸 신설
- `pipe.revet_foundation`(기슭막이 기초) 신설 — **유입·유출 한 칸**. 한 공사에서 한쪽만 기초유로 하는 일이 드물어 폼을 둘로 안 늘렸다. 실무가 갈라 쓰면 그때 나눌 것. - 독립 기슭막이·돌쌓기 갈래도 이음: 구조물 정본 `foundation` → `RevetmentSpec` → `RevetmentLayout.foundation` → 터파기 그림. ⚠ 이름을 저장 칸과 **같은 글자**로 뒀다. - ⑨ `stone_coeff_basis`(품셈/실무 관행) · ⑩ `fill_concrete_mpa`(180/210) 칸 신설. ⚠ **기본값 없음** — 「비어 있음 = 아직 안 정함」이고 기본값(⑨ 품셈 · ⑩ 210)은 계산 쪽이 갖는다. - 저장 왕복 확인: PUT 200 → 되읽기에서 "실무 관행"·"180"·"기초유" 그대로. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -179,6 +179,15 @@
|
|||||||
"default": 2.5,
|
"default": 2.5,
|
||||||
"required": false,
|
"required": false,
|
||||||
"phase": "detail"
|
"phase": "detail"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "revet_foundation",
|
||||||
|
"label": "기슭막이 기초",
|
||||||
|
"input": "select",
|
||||||
|
"choices": ["기초유", "기초버림"],
|
||||||
|
"default": null,
|
||||||
|
"required": false,
|
||||||
|
"phase": "detail"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -202,6 +211,15 @@
|
|||||||
"default": 2.0,
|
"default": 2.0,
|
||||||
"required": false
|
"required": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"key": "revet_foundation",
|
||||||
|
"label": "기슭막이 기초",
|
||||||
|
"input": "select",
|
||||||
|
"choices": ["기초유", "기초버림"],
|
||||||
|
"default": null,
|
||||||
|
"required": false,
|
||||||
|
"phase": "detail"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"key": "body_height_m",
|
"key": "body_height_m",
|
||||||
"label": "본체 높이",
|
"label": "본체 높이",
|
||||||
@@ -779,6 +797,24 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"phase": "detail"
|
"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",
|
"key": "face_slope_ratio",
|
||||||
"label": "전면 기울기 (1:n 의 n)",
|
"label": "전면 기울기 (1:n 의 n)",
|
||||||
@@ -879,6 +915,24 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"phase": "detail"
|
"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",
|
"key": "face_slope_ratio",
|
||||||
"label": "전면 기울기 (1:n 의 n)",
|
"label": "전면 기울기 (1:n 의 n)",
|
||||||
@@ -1044,6 +1098,24 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"phase": "detail"
|
"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",
|
"key": "face_slope_ratio",
|
||||||
"label": "전면 기울기 (1:n 의 n)",
|
"label": "전면 기울기 (1:n 의 n)",
|
||||||
@@ -1166,6 +1238,24 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"phase": "detail"
|
"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",
|
"key": "face_slope_ratio",
|
||||||
"label": "전면 기울기 (1:n 의 n)",
|
"label": "전면 기울기 (1:n 의 n)",
|
||||||
@@ -1228,6 +1318,24 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"phase": "detail"
|
"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",
|
"key": "face_slope_ratio",
|
||||||
"label": "전면 기울기 (1:n 의 n)",
|
"label": "전면 기울기 (1:n 의 n)",
|
||||||
@@ -1353,6 +1461,24 @@
|
|||||||
"required": false,
|
"required": false,
|
||||||
"phase": "detail"
|
"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",
|
"key": "face_slope_ratio",
|
||||||
"label": "전면 기울기 (1:n 의 n)",
|
"label": "전면 기울기 (1:n 의 n)",
|
||||||
|
|||||||
@@ -213,6 +213,12 @@ def _culvert_set(options: dict[str, Any] | None) -> dict[str, Any]:
|
|||||||
"pipe_kind": str(kind) if kind else None,
|
"pipe_kind": str(kind) if kind else None,
|
||||||
"diameter_m": round((diameter_mm or 1000.0) / 1000.0, 3),
|
"diameter_m": round((diameter_mm or 1000.0) / 1000.0, 3),
|
||||||
"min_cover_m": MIN_PIPE_COVER_M,
|
"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"),
|
"inlet": _side_spec(values, defaults, "inlet"),
|
||||||
"outlet": _side_spec(values, defaults, "outlet"),
|
"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 "양쪽"),
|
"side": str(values.get("side") or "양쪽"),
|
||||||
"tiers": int(_number(values.get("tiers"), 1.0) or 1),
|
"tiers": int(_number(values.get("tiers"), 1.0) or 1),
|
||||||
# 기초 축(기초유/기초버림) — 터파기 그림·물량이 같이 쓴다. 비어 있으면 안 그린다.
|
# 기초 축(기초유/기초버림) — 터파기 그림·물량이 같이 쓴다. 비어 있으면 안 그린다.
|
||||||
"foundation": (str(values["foundation"]).strip() or None)
|
"foundation": (str(values.get("foundation") or "").strip() or None),
|
||||||
if values.get("foundation") is not None
|
|
||||||
else None,
|
|
||||||
"pipe_kind": None,
|
"pipe_kind": None,
|
||||||
"diameter_m": 0.3,
|
"diameter_m": 0.3,
|
||||||
"min_cover_m": 0.0,
|
"min_cover_m": 0.0,
|
||||||
|
|||||||
@@ -73,6 +73,9 @@ def load_wall_structures(project_root: Path) -> list[dict[str, Any]]:
|
|||||||
# C군 폼에는 설치 측 칸이 없다 — 비워 두면 화면이 **성토가 나는 쪽**으로
|
# C군 폼에는 설치 측 칸이 없다 — 비워 두면 화면이 **성토가 나는 쪽**으로
|
||||||
# 세운다(`computeRevetmentLayout`). 사용자가 정하고 싶어지면 그때 칸을 낸다.
|
# 세운다(`computeRevetmentLayout`). 사용자가 정하고 싶어지면 그때 칸을 낸다.
|
||||||
"side": options.get("side"),
|
"side": options.get("side"),
|
||||||
|
# 기초 축(기초유/기초버림) — 터파기 그림·물량이 같이 쓴다.
|
||||||
|
# 비어 있으면 화면이 터파기를 안 그린다(근거 없음).
|
||||||
|
"foundation": options.get("foundation"),
|
||||||
"tiers": options.get("tiers"),
|
"tiers": options.get("tiers"),
|
||||||
"lift_m": options.get("lift_m"),
|
"lift_m": options.get("lift_m"),
|
||||||
"shift_m": options.get("shift_m"),
|
"shift_m": options.get("shift_m"),
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import {
|
|||||||
type WallAdjust,
|
type WallAdjust,
|
||||||
type WallLayout,
|
type WallLayout,
|
||||||
} from "./B06_Section_UI_Cross_Culvert_Types";
|
} 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";
|
import { appendPlanLine, buildRevetWallGeometry, drawRevetWall } from "./B06_Section_UI_Cross_Wall";
|
||||||
|
|
||||||
const SVG_NS = "http://www.w3.org/2000/svg";
|
const SVG_NS = "http://www.w3.org/2000/svg";
|
||||||
@@ -53,6 +54,8 @@ export interface RevetmentSpec {
|
|||||||
height_m?: number | null;
|
height_m?: number | null;
|
||||||
/** 사용자가 고른 설치 측 — "좌" | "우". */
|
/** 사용자가 고른 설치 측 — "좌" | "우". */
|
||||||
side?: string | null;
|
side?: string | null;
|
||||||
|
/** 기초 축 — "기초유" | "기초버림". **비어 있으면 터파기를 안 그린다**(근거 없음). */
|
||||||
|
foundation?: string | null;
|
||||||
/** 단 수(다단). 1이면 단일 벽. */
|
/** 단 수(다단). 1이면 단일 벽. */
|
||||||
tiers?: number | null;
|
tiers?: number | null;
|
||||||
/** (구 모델) 기준 올림·좌우 이동 — 배관식 전환 뒤 자리는 조정창 4축(x·d)이 정한다. */
|
/** (구 모델) 기준 올림·좌우 이동 — 배관식 전환 뒤 자리는 조정창 4축(x·d)이 정한다. */
|
||||||
@@ -89,6 +92,8 @@ export interface RevetmentLayout {
|
|||||||
top: RevetPoint;
|
top: RevetPoint;
|
||||||
/** 벽 목록(1단 + 다단) — 배관 벽과 같은 `WallLayout`, 그리기가 그대로 쓴다. */
|
/** 벽 목록(1단 + 다단) — 배관 벽과 같은 `WallLayout`, 그리기가 그대로 쓴다. */
|
||||||
walls: WallLayout[];
|
walls: WallLayout[];
|
||||||
|
/** 기초 축 — 저장 칸과 **같은 글자**(`foundation`). 터파기 그림이 이 값으로 갈린다. */
|
||||||
|
foundation: string | null;
|
||||||
/** 벽 사이·벽 아래 성토부선(배관 다단과 같은 체계). */
|
/** 벽 사이·벽 아래 성토부선(배관 다단과 같은 체계). */
|
||||||
fillSegments: OutletFillSegment[];
|
fillSegments: OutletFillSegment[];
|
||||||
/** 성토 설계선을 벽 상단에서 끊고 노견→벽 성토선을 대신 그리는 트림. */
|
/** 성토 설계선을 벽 상단에서 끊고 노견→벽 성토선을 대신 그리는 트림. */
|
||||||
@@ -304,6 +309,7 @@ export function computeRevetmentLayout(
|
|||||||
requestedTiers,
|
requestedTiers,
|
||||||
top: jt,
|
top: jt,
|
||||||
walls,
|
walls,
|
||||||
|
foundation: typeof spec.foundation === "string" ? spec.foundation.trim() || null : null,
|
||||||
fillSegments: extras.segments,
|
fillSegments: extras.segments,
|
||||||
designTrim,
|
designTrim,
|
||||||
appliedAdjust: { x: appliedX, d: appliedDrop, h: adjust?.h ?? null, m: null },
|
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)}`,
|
` · 성토 물매 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[] = [];
|
const drawn: SVGPolygonElement[] = [];
|
||||||
layout.walls.forEach((wall, index) => {
|
layout.walls.forEach((wall, index) => {
|
||||||
const keyId = index === 0 ? "own" : `own-extra${index - 1}`;
|
const keyId = index === 0 ? "own" : `own-extra${index - 1}`;
|
||||||
|
|||||||
@@ -138,6 +138,10 @@ function culvertSet(
|
|||||||
pipe_kind: text(options.pipe_kind) ?? text(defaults.pipe_kind),
|
pipe_kind: text(options.pipe_kind) ?? text(defaults.pipe_kind),
|
||||||
diameter_m: pipeDiameterM(diameterMm),
|
diameter_m: pipeDiameterM(diameterMm),
|
||||||
min_cover_m: MIN_PIPE_COVER_M,
|
min_cover_m: MIN_PIPE_COVER_M,
|
||||||
|
// 관 기슭막이 기초 축 — **유입·유출 한 칸으로** 받는다. 한 공사에서 한쪽만 기초유로
|
||||||
|
// 하는 일은 드물어 폼을 둘로 늘리지 않았다(2026-09-09). 실무가 갈라 쓰는 것이
|
||||||
|
// 확인되면 그때 나눌 것.
|
||||||
|
foundation: text(options.revet_foundation) ?? text(defaults.revet_foundation),
|
||||||
inlet: sideSpec(options, defaults, "inlet"),
|
inlet: sideSpec(options, defaults, "inlet"),
|
||||||
outlet: sideSpec(options, defaults, "outlet"),
|
outlet: sideSpec(options, defaults, "outlet"),
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user