From 83e63c70a6455261913b4f7fd9c2353f25c971b0 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 8 Sep 2026 19:32:10 +0900 Subject: [PATCH] =?UTF-8?q?feat(B07):=20=ED=9A=A1=EB=8B=A8=EB=8F=84=20?= =?UTF-8?q?=EC=88=98=EB=9F=89=ED=91=9C=EC=97=90=20=EC=B8=A1=EA=B5=AC=20?= =?UTF-8?q?=ED=86=A0=EC=82=AC=C2=B7=EC=95=94=EC=84=9D=20=EB=91=90=20?= =?UTF-8?q?=EC=B9=B8=20=E2=80=94=2014=20=E2=86=92=2016=EC=B9=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 랩탑 메인이 측구를 갈라 냈으므로(`6a7c339f`) 그 값을 그대로 옮김. 여기서 다시 가르지 않음 — 근거가 없는 측점은 B06 이 나누지 않고 사유를 함께 냄. `split_basis()` 를 함께 둠 — `ditch_split_basis` 를 사람이 읽는 말로 바꿔 준다. ⚠ 표 칸은 숫자만 담으므로 이 말은 표 밖(주기·화면)에 실어야 함. 「전량 암」이 경계선을 못 찾아서인지 정말 암 지반이어서인지 숫자만으로는 구별 안 됨. ⚠ 층따기 밑수가 바뀐 것이 이 표에도 그대로 왔음 — 랩탑 메인이 「성토 사면길이」에서 「B06 이 낸 원지반 깎는 길이(`bench_cut_length_m`)」로 고쳤고, 이 모듈이 B08 `_length_of` 를 빌려 쓰므로 **같이 움직였음**. 값이 없는 옛 저장분에서는 0 으로 섬 — 성토 사면길이로 대신 채우지 않는 것이 맞음(다른 면을 세게 됨). 실측(936be972, 옛 저장분) — 여전히 **14칸**. `ditch_split_basis`·`bench_cut_length_m` 둘 다 저장된 설계에 없음(B06 확정 전 자료). 새 키가 있는 자료에서 16칸이 되는 것은 시험으로 확인함. 자체검증 — 시험 11건(측구 두 칸 · 못 가른 측점 사유 · 층따기 밑수 따라가기 추가), 회귀 573 통과 · 0 실패. Co-Authored-By: Claude Opus 5 (1M context) --- .../B07_DesignDetail_Engine_Cross_Quantity.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/B07_DesignDetail/B07_DesignDetail_Engine_Cross_Quantity.py b/B07_DesignDetail/B07_DesignDetail_Engine_Cross_Quantity.py index 5306f1ee..c51b7a3c 100644 --- a/B07_DesignDetail/B07_DesignDetail_Engine_Cross_Quantity.py +++ b/B07_DesignDetail/B07_DesignDetail_Engine_Cross_Quantity.py @@ -38,12 +38,27 @@ from B08_Quantity.B08_Quantity_Engine_SlopeArea import PROTECTION_SOURCE, _key, from B08_Quantity.B08_Quantity_Engine_SlopeLength import station_slope #: 저장된 설계 단면적을 그대로 옮기는 칸 — `표 키 → 설계 키`. +#: ⚠ 측구 둘은 B06 이 **절토 분리와 같은 근거**(지반 유형 + 암반 경계선)로 갈라 낸 값이다 +#: (2026-09-09 `6a7c339f`). 여기서 다시 가르지 않는다 — 근거가 없는 측점은 그쪽이 +#: **나누지 않고** 사유(`ditch_split_basis`)를 함께 낸다. `split_basis()` 로 읽는다. AREA_KEYS: tuple[tuple[str, str], ...] = ( ("cut_soil", "cut_soil_area_m2"), ("cut_rock", "cut_rock_area_m2"), ("embankment", "fill_area_m2"), + ("ditch_soil", "ditch_soil_area_m2"), + ("ditch_rock", "ditch_rock_area_m2"), ) +#: `ditch_split_basis` 를 사람이 읽는 말로. 도면·화면이 「왜 이렇게 갈렸나」를 보일 때 쓴다. +#: ⚠ `rock_ground_no_boundary` 는 **못 가른 것**이다 — 절반씩 임의로 나누는 대신 전량 암으로 +#: 두고 그 사실을 남긴다. 그 측점의 표에는 「암」 한 칸만 서는 것이 정상이다. +DITCH_SPLIT_LABEL: dict[str, str] = { + "no_ditch": "측구 없음", + "soil_ground": "토사 지반 — 전량 토사", + "rock_ground_no_boundary": "암 지반인데 암반 경계선이 없어 **못 가름** — 전량 암", + "rock_boundary": "암반 경계선으로 가름", +} + #: 사면 계열에서 오는 칸 — `표 키 → (B08 계열, 면)`. #: 성토파종·절토살포는 **법면보호공**이고, 그것은 B08 에서 면고르기를 참조한다 #: (`PROTECTION_SOURCE`). 참조를 끊으면 그쪽 한 곳만 고치면 이 표도 따라온다. @@ -62,6 +77,20 @@ def _num(value: Any) -> float | None: return float(value) if isinstance(value, (int, float)) else None +def split_basis(design: dict[str, Any] | None) -> tuple[str, str] | None: + """측구를 무슨 근거로 갈랐나 — `(코드, 사람이 읽는 말)`. 값이 없으면 `None`. + + ⚠ 표 칸은 숫자만 담으므로 이 말은 **표 밖**(주기·화면)에 실어야 한다. 「전량 암」이 + 경계선을 못 찾아서인지 정말 암 지반이어서인지는 숫자만 봐서는 알 수 없다. + """ + if not isinstance(design, dict): + return None + code = design.get("ditch_split_basis") + if not isinstance(code, str) or not code: + return None + return code, DITCH_SPLIT_LABEL.get(code, code) + + def derived_cells(chainage_m: float, design: dict[str, Any] | None) -> dict[str, float | None]: """저장된 횡단 설계 하나에서 **채울 수 있는 칸**만 낸다.