fix(B06): 독립 기슭막이 좌우 로직을 성토 경로 하나로 통일한다

이관 뒤 독립 기슭막이 벽 역할이 uphill_side로 정해져, 고른 쪽이 상단이면
유입 역할(집수정 후보·placeInletWall·다단 없음), 하단이면 유출 역할
(성토부선+buildExtrasAt)을 타서 좌우 동작이 갈렸다. 새 기하 코드를 만들지
않고 이미 있는 유출 경로 인자를 유입 쪽에도 넘겨 재사용한다.

- Const: revetHeightLimit 콘크리트 4.0 → 5.0 (materialLimit과 통일)
- Geom: hidden_pipe면 basinReason null, 유입 배치에 requireCrossing 전달,
  basinExtras 채널을 유입 벽 성토부선·다단으로 사용, inletFill 생략
- Solve: placeInletWall이 requireCrossing을 통과시킨다(기본 false 유지)
- Wire: 링크 카드에서 hidden_pipe면 유입측 다단·성토부선을 벽 연장에 맞춰 유지
- Panel/View_Structure: hiddenPipe deps 추가 — 집수정 형식 숨김, 유입 벽에도
  단 수 행 표시
- Culvert: hidden_pipe의 basinFill 툴팁 이름을 "유입부"로

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-29 09:34:45 +09:00
co-authored by Claude Opus 5
parent 5142bdde9b
commit c0bebe951d
7 changed files with 68 additions and 32 deletions
@@ -47,9 +47,13 @@ export interface StructurePanelDeps {
/** 집수정 좌우 — **화면 기준**(+ = 화면 왼쪽). 부호 환산·한계 토스트는 카드가 한다. */
nudgeBasinLateral: (screenDeltaM: number) => void;
resetBasin: () => void;
/** 집수정 계류측 다단 상태·단 수 지정(2026-08-22 — 유출측과 같은 체계). */
/** 집수정 계류측 다단 상태·단 수 지정(2026-08-22 — 유출측과 같은 체계).
* 독립 기슭막이(관 숨김)에서는 집수정이 없으므로 이 채널이 **유입측 벽의 다단**이다. */
basinExtraState: () => { canAdd: boolean; count: number };
setBasinExtraCount: (count: number) => void;
/** 독립 기슭막이(관 숨김) 카드인가 — 유입·유출 벽이 같은 성토 로직이라 조정창도
* 좌우 같은 행을 준다(집수정 형식 숨김 · 유입측 단 수 행 표시 — 2026-08-29). */
hiddenPipe: () => boolean;
/** 이동 조작 가능 여부 — 집수정(자리 고정)은 숨긴다. */
canNudge: (key: RevetKey) => boolean;
/** 좌우·상하 걸음이 0.1m인가(독립·추가 기슭막이). 배관 기준벽은 false = 1m. */
@@ -505,9 +509,12 @@ export function buildStructurePanel(deps: StructurePanelDeps): StructurePanelHan
: movable
? L("B06_Cross_Revet_Inlet")
: L("B06_Cross_Struct_InletBasin");
// 독립 기슭막이(관 숨김)는 유입·유출이 같은 성토 벽이다 — 집수정 형식 선택을
// 숨기고 유입측에도 단 수 행을 준다(2026-08-29 사용자: 좌우 조작 통일).
const ownTiers = deps.hiddenPipe() && key === "inlet";
// 형식 선택은 유입측에서만, 이동·높이 조작은 기슭막이(집수정 제외)만.
structureRow.classList.toggle("is-hidden", key !== "inlet");
if (key === "inlet") {
structureRow.classList.toggle("is-hidden", key !== "inlet" || deps.hiddenPipe());
if (key === "inlet" && !deps.hiddenPipe()) {
// 상황에 안 맞는 선택지는 숨긴다(2026-08-22 사용자). 단 지금 선택된 값은
// 남긴다 — 숨기면 셀렉트가 빈 값이 된다.
const allow = deps.optionsFor();
@@ -528,10 +535,14 @@ export function buildStructurePanel(deps: StructurePanelDeps): StructurePanelHan
basinRow.row.classList.toggle("is-hidden", !isBasin);
basinReset.classList.toggle("is-hidden", !isBasin);
const basinExtra = deps.basinExtraState();
// 독립 기슭막이 유입측은 유출측과 같은 규칙 — 단 수 행이 **항상** 보인다.
basinExtraRow.classList.toggle(
"is-hidden",
!(isBasin && (basinExtra.canAdd || basinExtra.count > 0)),
!(ownTiers || (isBasin && (basinExtra.canAdd || basinExtra.count > 0))),
);
const basinExtraLabel = basinExtraRow.querySelector(".b06-structure-panel__label");
if (basinExtraLabel)
basinExtraLabel.textContent = ownTiers ? "다단 기슭막이(단)" : "집수정 계류측 기슭막이(단)";
basinCount = basinExtra.count;
basinCountValue.textContent = `${basinExtra.count}단`;
// I형은 내공(높이·폭) 개념이 없다 — 9키의 **네 모서리**만 숨긴다.