From ec153bc2e853a0bc6bd4a877ba7af75f3eb77382 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 7 Sep 2026 09:49:14 +0900 Subject: [PATCH] =?UTF-8?q?fix(B06):=20=EB=8B=A4=EB=8B=A8=20=EA=B8=B0?= =?UTF-8?q?=EC=8A=AD=EB=A7=89=EC=9D=B4=20=EC=A2=8C=EC=9A=B0=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=EC=9D=B4=20=EB=A7=90=EC=97=86=EC=9D=B4=20=EC=95=88=20?= =?UTF-8?q?=EB=A8=B9=EB=8D=98=20=EA=B9=8C=EB=8B=AD=20=EC=95=8C=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 「좌우 1.0m 를 넣어도 안 움직인다」의 원인은 지형이 아니라 **선반 하한**이었음 — 좌우 이동은 선반 길이가 음수가 되지 않게 `1.2 × 상하 내림`까지 따라 나가므로, 저장값이 d 2.6m 이면 하한이 3.12m 라 1.0m 요청은 아무 변화도 못 냄. 그런데도 `shiftBlockedM`(지형에 막힌 양)은 0 이라 까닭을 알 길이 없었음. - `shiftFloorM` 추가 — 요청이 하한에 눌려 통째로 무시된 경우 그 하한을 남김. - 벽 툴팁에 한 줄 — 하한 값과 「그 아래로 넣으면 안 움직임」을 적음. 지형 탓(`shiftBlockedM`)과 자리를 나눠 두 까닭이 안 섞이게 함. - 시험 `tmp/tests/test_b06_extra_shift_floor.py` — 화면 코드를 그대로 컴파일해 Node 로 돌림. 좌우 0.5m 요청이 d 2.0m 아래에서 2.4m 로 밀리고 그 값이 알려지는 것 확인. Co-Authored-By: Claude Opus 5 (1M context) --- B06_Section/B06_Section_UI_Cross_Culvert.ts | 4 ++++ B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts | 4 ++++ B06_Section/B06_Section_UI_Cross_Culvert_Types.ts | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/B06_Section/B06_Section_UI_Cross_Culvert.ts b/B06_Section/B06_Section_UI_Cross_Culvert.ts index a4e68876..8888dd31 100644 --- a/B06_Section/B06_Section_UI_Cross_Culvert.ts +++ b/B06_Section/B06_Section_UI_Cross_Culvert.ts @@ -179,6 +179,10 @@ export function appendCulvertOverlay( (wall.lengthM ? ` · 연장 ${wall.lengthM.toFixed(1)}m` : "") + (wall.shiftBlockedM ? ` · ⚠ 좌우 이동 ${wall.shiftBlockedM.toFixed(2)}m 는 지형에 막힘(더 나가면 벽이 묻힘)` + : "") + + (wall.shiftFloorM + ? ` · ⚠ 좌우 이동 하한 ${wall.shiftFloorM.toFixed(2)}m — 상하 내림의 1.2배까지는` + + ` 따라 나가야 함(그보다 안쪽은 선반이 사라짐). 그 아래로 넣으면 안 움직임` : ""), ); if (onSelectRevet) revetShape.classList.add("is-selectable"); diff --git a/B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts b/B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts index 710c6076..2d0bbe3d 100644 --- a/B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts +++ b/B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts @@ -443,6 +443,10 @@ export function buildOutletExtras(input: OutletExtrasInput): OutletExtrasResult // 툴팁으로 알리기 위함이다(2026-09-06 실측: 다섯 측점 중 넷이 1.0m 요청에 0.0m 이동). const blocked = Math.max(0, (requestedX ?? 0) - appliedX); if (blocked > 0.005) wall.shiftBlockedM = Math.round(blocked * 100) / 100; + // 하한에 눌려 요청이 통째로 무시된 경우 — 지형이 아니라 **선반 길이**가 원인이다 + // (2026-09-07 실측: d 2.6m 이면 x 하한이 3.12m 라 1.0m 요청이 아무 변화도 못 냄). + const floor = shelfFloor(appliedD); + if (floor > (requestedX ?? 0) + 0.005) wall.shiftFloorM = Math.round(floor * 100) / 100; walls.push(wall); // 되받기 — 지반에 맞춰 조정한 값이 **실제 적용 높이**다(조정창이 그대로 받아 적는다). appliedAdjusts.push({ diff --git a/B06_Section/B06_Section_UI_Cross_Culvert_Types.ts b/B06_Section/B06_Section_UI_Cross_Culvert_Types.ts index 8329cc4a..d431a628 100644 --- a/B06_Section/B06_Section_UI_Cross_Culvert_Types.ts +++ b/B06_Section/B06_Section_UI_Cross_Culvert_Types.ts @@ -74,6 +74,10 @@ export interface WallLayout { /** 사용자가 요청한 좌우 이동을 **지형이 막아 못 나간** 거리(m, 2026-09-06). * 0보다 크면 그 자리에서 더 나가면 벽이 원지반에 묻힌다는 뜻이라 툴팁으로 알린다. */ shiftBlockedM?: number; + /** 좌우 이동의 **하한**(m, 2026-09-07). 선반 길이가 음수가 되지 않게 x 는 최소 + * `1.2 × 상하 내림`까지 따라 나간다. 요청이 이 값보다 작으면 눌러도 벽이 안 움직이고, + * 지형에 막힌 것이 아니라 `shiftBlockedM` 은 0으로 나온다 — 그 까닭을 툴팁으로 알린다. */ + shiftFloorM?: number; /** 재질(메/찰/콘크리트) — 높이 한계를 정한다(2026-08-22 사용자). */ material: RevetMaterial; outward: number;