diff --git a/B05_Profile/B05_Profile_UI_Structures_Panel.ts b/B05_Profile/B05_Profile_UI_Structures_Panel.ts index bd0f0800f..6ea28ae39 100644 --- a/B05_Profile/B05_Profile_UI_Structures_Panel.ts +++ b/B05_Profile/B05_Profile_UI_Structures_Panel.ts @@ -154,9 +154,9 @@ export function createStructuresSection( } /** 측점 범위 표시 갱신 — 시작 = 기준 − 전길이, 종료 = 시작 + 길이(2026-08-19 - * 사용자 지시: 전/후 분할, 후길이 = 길이 − 전길이 자동). 계산 불가면 "—". */ + * 사용자 지시: 전/후 분할, 후길이 = 길이 − 전길이 자동). 계산 불가면 "—" · 사면안정군(C)은 줄 숨김(177-5). */ function syncRangeDisplay(): void { - const computed = hasComputedRange(currentType()); + const computed = hasComputedRange(currentType()) && currentType()?.group !== "C"; rangeWrap.hidden = !computed; if (!computed) return; const step = interval(); diff --git a/resources/tester/test_177_5_slope_range_hidden.py b/resources/tester/test_177_5_slope_range_hidden.py new file mode 100644 index 000000000..f0ead6c2a --- /dev/null +++ b/resources/tester/test_177_5_slope_range_hidden.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +"""177-5 좌측 폼 「측점 범위」 줄 — 사면안정군(C군)만 숨김. + +못박는 것 + - PNL5 `syncRangeDisplay` 가 C군이면 `rangeWrap.hidden` · 다른 구간형(B 소단배수로 · E 대피소 등)은 그대로. + - `hasComputedRange` 자체는 그대로(시작 · 종료 칸 숨김에도 씀). + - C군 = 사면안정 6종(정의 기준) · 그 밖 범위 종류는 C 가 아님. + +화면은 사용자 확인. +""" + +import os + +from B05_Profile.B05_Profile_Structures_Schema import load_structure_types + +HERE = os.path.dirname(os.path.abspath(__file__)) +ROOT = os.path.abspath(os.path.join(HERE, "..", "..")) + + +def _read(*parts: str) -> str: + with open(os.path.join(ROOT, *parts), encoding="utf-8") as handle: + return handle.read() + + +def test_범위_줄은_C군만_숨김(): + panel = _read("B05_Profile", "B05_Profile_UI_Structures_Panel.ts") + at = panel.index("function syncRangeDisplay(): void {") + body = panel[at : panel.index("\n }", at)] + assert ( + 'const computed = hasComputedRange(currentType()) && currentType()?.group !== "C";' in body + ) + assert "rangeWrap.hidden = !computed;" in body + + +def test_hasComputedRange_는_그대로(): + types = _read("B05_Profile", "B05_Profile_UI_Structures_Panel_Types.ts") + assert "export function hasComputedRange(" in types + assert '"C"' not in types[types.index("export function hasComputedRange(") :][:600] + + +def test_C군은_사면안정_6종_다른_범위_종류는_C_아님(): + groups = {t.type_id: t.group for t in load_structure_types()} + slope = { + "retaining_wall", + "masonry_wet", + "masonry_dry", + "soil_guard", + "boulder_masonry", + "berm", + } + assert {k for k, g in groups.items() if g == "C"} == slope + for kept in ("ditch_berm", "refuge", "work_yard", "guardrail"): + assert groups.get(kept) not in (None, "C"), kept