diff --git a/B06_Section/B06_Section_UI_Adjust_Dock.ts b/B06_Section/B06_Section_UI_Adjust_Dock.ts index 30ef832d1..28fcf846a 100644 --- a/B06_Section/B06_Section_UI_Adjust_Dock.ts +++ b/B06_Section/B06_Section_UI_Adjust_Dock.ts @@ -47,14 +47,13 @@ const EXTRA_ROWS = [ ".b06-structure-panel__struct--span", ].join(", "); -/** 유입구·유출구·날개벽 칸은 폼에 없는 줄만 받는다 — 읽기(좌우 · 상하 · 구체 길이 · 표고) · - * 단 수 · 옵션 · 집수정 내공 · 세월교 측벽 높이(24-4a). */ +/** 유입구·유출구 칸은 폼에 없는 줄만 받는다 — 읽기(좌우 · 상하 · 구체 길이 · 표고) · + * 단 수 · 옵션 · 집수정 내공(24-4a). */ const SIDE_ROWS = [ ".b06-structure-panel__struct--readout", ".b06-structure-panel__struct--tier", ".b06-structure-panel__struct--options", ".b06-structure-panel__struct--basin-size", - ".b06-structure-panel__struct--wall-height", ].join(", "); /** 배관 칸 = 폼에 자리 없는 집수정 내공 · 유입 단 수만 — 목록에서 골라도 같은 글(54-29). @@ -64,12 +63,11 @@ const PIPE_INLET_ROWS = [ ".b06-structure-panel__struct--basin-size", ].join(", "); const PIPE_OUTLET_ROWS = ".b06-structure-panel__struct--basin-size"; -const WALL_HEIGHT_ROW = ".b06-structure-panel__struct--wall-height"; /** 받을 칸에 맞는 줄 — 배관 유입 · 유출 칸이 아니면 옛 줄 그대로 · 세월교 · 박스 유입 · 유출 칸은 - * 세월교 측벽 높이(바닥 손 조정 · 91-2)만 받음(좌우 · 상하 · 바닥판 읽기는 칸에 안 둠 · 65-1). */ + * 받는 줄 없음(측벽 높이 줄 지움 · 107-3 · 읽기는 칸에 안 둠 · 65-1). */ function rowsFor(slot: HTMLElement): string | null { - if (slot === sideSlots?.wingInlet || slot === sideSlots?.wingOutlet) return WALL_HEIGHT_ROW; + if (slot === sideSlots?.wingInlet || slot === sideSlots?.wingOutlet) return null; if (slot === sideSlots?.outlet) return PIPE_OUTLET_ROWS; return slot === sideSlots?.inlet ? PIPE_INLET_ROWS : SIDE_ROWS; } diff --git a/B06_Section/B06_Section_UI_Cross_Ford_Panel.ts b/B06_Section/B06_Section_UI_Cross_Ford_Panel.ts index 3e0f4cab2..edf4b76f7 100644 --- a/B06_Section/B06_Section_UI_Cross_Ford_Panel.ts +++ b/B06_Section/B06_Section_UI_Cross_Ford_Panel.ts @@ -6,8 +6,8 @@ * `_Cross_Panel_Base.ts`)을 쓴다 — 머리줄(제목·닫기), 2행 항목 구조, * **십자 조작 세트는 창 맨 아래**, 키보드 방향키 제어 포함(2026-08-25 일원화). * - * 조작: 측벽 좌우(노견 확장) · 측벽 상하(1:1.2 대각) — 십자 · 그림 끌기. 측벽 높이는 폼 날개벽 - * 칸으로 옮겨 붙는 줄 · 관경 · 수량 · 날개벽 제원은 폼 칸 하나(계획서 24-4a). + * 조작: 측벽 좌우(노견 확장) · 측벽 상하(1:1.2 대각) — 십자 · 그림 끌기. 측벽 높이 줄 없음(107-3) · + * 관경 · 수량 · 날개벽 제원은 폼 칸 하나(계획서 24-4a). * 바닥판 연장은 날개벽 길이×cos(각도)가 정하므로 읽기 전용으로 보여 준다. * ========================================================================== */ @@ -19,7 +19,6 @@ import { buildPanelShell, dpadButton, dragReadout, - makeButton, makeRow, } from "./B06_Section_UI_Cross_Panel_Base"; @@ -29,8 +28,6 @@ export interface FordPanelDeps { adjustFor: (role: FordWallRole) => FordWallAdjust; /** 실제 그려진 벽 높이(m) — 자동일 때도 숫자를 보여 준다. */ heightFor: (role: FordWallRole) => number; - /** 높이 ±0.1m. */ - nudgeHeight: (role: FordWallRole, deltaM: number) => void; /** 좌우: 화면 좌(+)/우(−)로 미는 양(m). 부호 환산은 카드가 한다. */ nudge: (role: FordWallRole, screenDeltaM: number) => void; /** 상하: 1:1.2 사면을 타는 대각 이동(수평 성분 m, + = 사면 아래). */ @@ -54,7 +51,7 @@ const STEP_M = 0.1; /** 세월교 측벽 조정 오버레이 창을 만든다. 처음에는 숨어 있다. * 관경 · 수량 · 날개벽은 좌측 폼 칸이 정본이라 창에 두지 않는다(계획서 24-4a). - * `opts.dock` — 좌측 폼에 옮겨 붙을 줄(읽기 · 측벽 높이)만 만든다 — 폼에 없던 칸이다. + * `opts.dock` — 읽기 줄만 만든다(측벽 높이 줄 없음 · 107-3). * 오버레이는 읽기 + 십자 + 그림 끌기 손잡이. */ export function buildFordPanel(deps: FordPanelDeps, opts?: { dock?: boolean }): FordPanelHandle { const shell = buildPanelShell(() => deps.close()); @@ -75,26 +72,6 @@ export function buildFordPanel(deps: FordPanelDeps, opts?: { dock?: boolean }): if (current) run(current); }; - // 측벽 높이 — 폼에 칸이 없던 값이라 폼 날개벽 칸으로 옮겨 붙는 줄(24-4a). - const heightRow = makeRow("측벽 높이"); - heightRow.row.classList.add("b06-structure-panel__struct--wall-height"); - const heightLabel = heightRow.row.querySelector(".b06-structure-panel__label")!; - const heightValue = document.createElement("span"); - heightValue.className = "b06-structure-panel__hval"; - heightRow.controls.append( - makeButton( - "−", - "측벽 높이 0.1m 낮추기", - act((role) => deps.nudgeHeight(role, -STEP_M)), - ), - heightValue, - makeButton( - "+", - "측벽 높이 0.1m 높이기", - act((role) => deps.nudgeHeight(role, STEP_M)), - ), - ); - // 십자 조작 세트 — **창 맨 아래**(템플릿 규약). const moveRow = makeRow("이동"); moveRow.controls.classList.add("b06-structure-panel__buttons"); @@ -126,7 +103,9 @@ export function buildFordPanel(deps: FordPanelDeps, opts?: { dock?: boolean }): ), ); - root.append(value, opts?.dock ? heightRow.row : moveRow.row); + // 측벽 높이 줄 없음 — 세월교 바닥은 노면 − (관경 + 토피) 기본(107-3) + root.append(value); + if (!opts?.dock) root.append(moveRow.row); const arrows = opts?.dock ? { attach: (): void => undefined, detach: (): void => undefined } @@ -153,9 +132,6 @@ export function buildFordPanel(deps: FordPanelDeps, opts?: { dock?: boolean }): `높이 ${deps.heightFor(current).toFixed(2)}m` + (adjust.heightM === null ? " (자동)" : ""); moveLine.textContent = `좌우 ${adjust.lateralM.toFixed(1)}m · 상하 ${adjust.slopeM.toFixed(1)}m`; slabLine.textContent = `바닥판 ${deps.slabLengthM().toFixed(2)}m`; - heightValue.textContent = `${deps.heightFor(current).toFixed(1)}m`; - // 자동 = 바닥판이 계류 하상을 따라감 · 손 값 = 원지반이 바뀌어도 그대로(91-2) — 값 칸이 좁아 이름표에 - heightLabel.textContent = adjust.heightM === null ? "측벽 높이 (자동)" : "측벽 높이"; } return { diff --git a/B06_Section/B06_Section_UI_Cross_View_Ford.ts b/B06_Section/B06_Section_UI_Cross_View_Ford.ts index 30159b342..881dd3c8c 100644 --- a/B06_Section/B06_Section_UI_Cross_View_Ford.ts +++ b/B06_Section/B06_Section_UI_Cross_View_Ford.ts @@ -13,7 +13,7 @@ import type { FordLayout, FordWallRole } from "./B06_Section_UI_Cross_Ford"; export interface FordPanelContext { section: CrossSection; ford: FordControl; - /** 마지막 계산의 측벽 높이(m) — 높이 조작의 시작값. */ + /** 마지막 계산의 측벽 높이(m) — 읽기 줄. */ heightFor: (role: FordWallRole) => number; /** 마지막 계산의 바닥판 길이(m). */ slabLengthM: () => number; @@ -31,8 +31,6 @@ export function fordPanelDeps(context: FordPanelContext): FordPanelDeps { return { adjustFor: (role) => ford.adjustFor(chainage)[role], heightFor: context.heightFor, - nudgeHeight: (role, deltaM) => - ford.update(chainage, role, { heightM: context.heightFor(role) + deltaM }), nudge: (role, screenDeltaM) => ford.update(chainage, role, { lateralM: ford.adjustFor(chainage)[role].lateralM + screenDeltaM * outwardOf(section, role), diff --git a/resources/tester/helper_b06_adjust_single_form.cjs b/resources/tester/helper_b06_adjust_single_form.cjs index 726b0e7a8..6e97bc8ed 100644 --- a/resources/tester/helper_b06_adjust_single_form.cjs +++ b/resources/tester/helper_b06_adjust_single_form.cjs @@ -186,7 +186,6 @@ for (const [label, key, kind] of [ const fordDeps = { adjustFor: () => ({ heightM: null, lateralM: 0, slopeM: 0 }), heightFor: () => 1.5, - nudgeHeight: () => {}, nudge: () => {}, nudgeSlope: () => {}, reset: () => {}, diff --git a/resources/tester/test_65_ford_defaults.py b/resources/tester/test_65_ford_defaults.py index cd8102698..934e4b7ea 100644 --- a/resources/tester/test_65_ford_defaults.py +++ b/resources/tester/test_65_ford_defaults.py @@ -164,12 +164,9 @@ def test_집계표_세월교_박스_흙막이_상자는_유출_단_수만큼(): assert groups(type_id, "", None) == [] -def test_B06_세월교_박스_칸은_측벽_높이_줄만_받음(): +def test_B06_세월교_박스_칸은_받는_줄_없음(): + """107-3 — 측벽 높이 줄 지움.""" dock = (ROOT / "B06_Section/B06_Section_UI_Adjust_Dock.ts").read_text(encoding="utf-8") - assert ( - "slot === sideSlots?.wingInlet || slot === sideSlots?.wingOutlet) return WALL_HEIGHT_ROW" - in dock - ) - assert 'WALL_HEIGHT_ROW = ".b06-structure-panel__struct--wall-height"' in dock + assert "slot === sideSlots?.wingInlet || slot === sideSlots?.wingOutlet) return null" in dock lists = (ROOT / "B05_Profile/B05_Profile_UI_Structures_List.ts").read_text(encoding="utf-8") assert "return isNone(c, state[c.id][0])" in lists diff --git a/resources/tester/test_91_ground_free.py b/resources/tester/test_91_ground_free.py index 243dd1005..29d5db9de 100644 --- a/resources/tester/test_91_ground_free.py +++ b/resources/tester/test_91_ground_free.py @@ -41,9 +41,11 @@ def test_세월교_바닥_손_값은_원지반을_바꿔도_그대로(fit: dict) assert side["wallBottom"] == pytest.approx(side["slabTop"] - 0.3, abs=1e-3) -def test_세월교_박스_칸은_측벽_높이_줄을_받음() -> None: +def test_세월교_박스_칸은_측벽_높이_줄_없음() -> None: + """107-3 — 「측벽 높이(자동)」 줄 지움(유입 · 유출).""" dock = (ROOT / "B06_Section/B06_Section_UI_Adjust_Dock.ts").read_text(encoding="utf-8") - assert "sideSlots?.wingOutlet) return WALL_HEIGHT_ROW" in dock + assert "sideSlots?.wingOutlet) return null" in dock + assert "wall-height" not in dock def test_다단_자동_자리는_원지반과_무관_사면_1m(fit: dict) -> None: diff --git a/resources/tester/test_b06_adjust_single_form.py b/resources/tester/test_b06_adjust_single_form.py index 682ce6482..1d0d98fad 100644 --- a/resources/tester/test_b06_adjust_single_form.py +++ b/resources/tester/test_b06_adjust_single_form.py @@ -41,7 +41,7 @@ def test_폼과_같은_값은_사본_줄로_만들지_않는다(out) -> None: assert out["dock"]["outlet"] == ["options", "readout", "tier"] # 집수정 내공 줄은 화면에서 숨김(54-40 · 값 · 그림 그대로) assert out["dock"]["basin"] == ["options", "readout"] - assert out["dock"]["ford"] == ["readout", "wall-height"] + assert out["dock"]["ford"] == ["readout"] # 측벽 높이 줄 지움(107-3) assert out["dock"]["box"] == ["readout"] @@ -86,7 +86,6 @@ def test_사본_줄은_모두_폼_칸으로_옮겨_붙는다() -> None: "tier", "options", "basin-size", - "wall-height", "form", "height", "span",