From 89820848ec8570b866a75465819fc1eb14baf66b Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 6 Sep 2026 20:03:28 +0900 Subject: [PATCH] =?UTF-8?q?fix(B06):=20=EC=B6=94=EA=B0=80=20=EA=B8=B0?= =?UTF-8?q?=EC=8A=AD=EB=A7=89=EC=9D=B4=20=EB=B0=94=EB=8B=A5=EC=9D=84=20?= =?UTF-8?q?=EC=9B=90=EC=A7=80=EB=B0=98=EC=97=90=20=EC=95=89=ED=9E=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 연계(추가) 기슭막이가 성토사면과 안 맞는다는 지적(3-5)을 수치로 재니, 어긋난 곳은 접점이 아니라 바닥이었음 — 상단은 1:1.2 성토선에 붙는데 키는 요청값 그대로라 지형이 모자라면 바닥이 떴음(실측 0.12~0.87m). 자리는 그대로 두고 키를 지반까지 맞춤 — 지반이 낮으면 형태 높이 한계까지 키우고, 높으면 최소 높이까지 줄임. 조정창 되받기 값도 조정된 높이로 나감. 검증: 264.06 0.394 → 0.000m(키 1.00 → 1.39), 821.62 0.427 → 0.000, 914.93 0.122 → 0.000. 731.31 은 0.873 → 0.373 으로 줄되 남음(돌쌓기(메) 높이 한계 2.0m — 경고 유지가 맞음). 테스트 390 통과. Co-Authored-By: Claude Opus 5 (1M context) --- .../B06_Section_UI_Cross_Culvert_Extra.ts | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts b/B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts index 55c5d595..ddd83b73 100644 --- a/B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts +++ b/B06_Section/B06_Section_UI_Cross_Culvert_Extra.ts @@ -312,8 +312,9 @@ export function buildOutletExtras(input: OutletExtrasInput): OutletExtrasResult ), limit, ); - /** 기준선(근입 위)~상단 — 도형·자리 계산은 종전대로 이 값으로 한다. */ - const exposed = height - REVET_EMBED_DEPTH_M; + /** 기준선(근입 위)~상단 — 도형·자리 계산은 종전대로 이 값으로 한다. + * 지형이 요청 높이만큼 안 나오면 아래 스캔 뒤 **낮춰서** 바닥을 지반에 앉힌다. */ + let exposed = height - REVET_EMBED_DEPTH_M; /** 자리 x(벽 하단 중점)에 지반 안착 + 상단이 성토선에 닿는 데 필요한 높이. */ const heightAt = (x: number): number => { @@ -416,26 +417,36 @@ export function buildOutletExtras(input: OutletExtrasInput): OutletExtrasResult if (!placeable(appliedX, appliedD)) break; // 자동 자리조차 매몰 — 이 단은 불가. appliedD = Math.round(appliedD * 10) / 10; appliedX = Math.round(appliedX * 10) / 10; - appliedAdjusts.push({ - x: appliedX, - d: appliedD, - h: adjust.h != null ? height : null, - m: adjust.m, - }); - const topElevation = autoTop - appliedD; const anchorX = autoOffset + outward * appliedX; - const base = topElevation - exposed; // 근입 0.5 위 기준선 + // 바닥을 **원지반에 앉힌다**(2026-09-06 사용자 지적: 연계 기슭막이가 사면과 안 맞음). + // 상단은 1:1.2 성토선에 붙어 있어야 하므로 자리는 그대로 두고 **키만** 지반까지 + // 맞춘다 — 지반이 낮으면 키우고(형태 한계까지), 높으면 줄인다(최소 높이까지). + // 예전에는 요청 높이를 그대로 써 바닥이 최대 0.87m 떠 있었다(실측 264.06·731.31). + const groundBase = groundAt(anchorX); + const fitted = Math.min( + Math.max(topElevation - groundBase, EXTRA_WALL_MIN_HEIGHT_M - REVET_EMBED_DEPTH_M), + limit - REVET_EMBED_DEPTH_M, + ); + const appliedExposed = Number.isFinite(fitted) ? fitted : exposed; + const base = topElevation - appliedExposed; // 근입 0.5 위 기준선 const wall = buildExtraWall( i, { offset: anchorX, elevation: base }, outward, - exposed, + appliedExposed, material, - Math.max(0, base - groundAt(anchorX)), + Math.max(0, base - groundBase), form, ); walls.push(wall); + // 되받기 — 지반에 맞춰 조정한 값이 **실제 적용 높이**다(조정창이 그대로 받아 적는다). + appliedAdjusts.push({ + x: appliedX, + d: appliedD, + h: adjust.h != null ? appliedExposed + REVET_EMBED_DEPTH_M : null, + m: adjust.m, + }); // 성토선: src → (수평 선반 x>0이면 선반 끝) → 이음선 상단점. 사면길이 = 경사부. const shelfRun = Math.max(0, appliedX - FILL_SLOPE_RATIO_MIN * appliedD); const shelf: OffsetPoint | null =