From bcdfde2a05eca82ddf2ad2611b58e65e54743201 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Fri, 21 Aug 2026 17:08:40 +0900 Subject: [PATCH] =?UTF-8?q?fix(B06):=20=EC=9C=A0=EC=B6=9C=20=EA=B8=B0?= =?UTF-8?q?=EC=8A=AD=EB=A7=89=EC=9D=B4=EA=B0=80=20=EC=A7=80=EB=B0=98?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=9C=A8=EB=8D=98=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 벽 밑을 관 축(유입 → 자연 사면 끝 직선) 위에 얹고 있었다. 성토측 지반이 관 물매보다 가파른 구간에서는 축이 지반 위로 떠올라 벽이 공중에 떴다 — 13+15.7 유출 벽은 자동 자리에서도 전면 0.14m, 바깥으로 2m 밀면 배면까지 0.16m 떴다. 관 끝은 원지반 위에 놓는다는 원칙대로 벽 밑을 **그 자리 원지반**(역경사는 유입 invert로 클램프)으로 바꿨다. 관 물매는 그 자리에 맞춰 다시 잡힌다. 유입 벽은 원래 지반을 따르고 있어 멀쩡했다 — 좌우가 달라 보인 이유가 이것이다. 표기 길이도 목표값이 아니라 **실제 그려진 관**의 올림값으로 바꿨다(자리 제약에 걸려 못 늘린 경우 도면보다 길게 적혔다). 검증: 이동 ±3m 전 구간 배면 근입 +0.500 고정(종전 −0.16~+0.59), 계획고 스윕 24케이스 문제 0. tsc 통과, pytest 148 pass. Co-Authored-By: Claude Opus 5 (1M context) --- .../B06_Section_UI_Cross_Culvert_Geom.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts b/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts index cda61b92..cc841a31 100644 --- a/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts +++ b/B06_Section/B06_Section_UI_Cross_Culvert_Geom.ts @@ -414,14 +414,13 @@ export function computeCulvertLayout( }; buildWall(culvert.inlet, inlet, inletInfo.outward, basinReason); // 유출 벽 자리 — 유입과 같은 규칙(사면선이 벽 이음선 상단점을 지나는 자리, 물매는 - // 1:1.2~2.0 범위에서 역산). 벽 밑은 관 축을 따라간 invert다 — 관이 벽을 관통하므로 - // 벽 바닥은 관 자리를 따라야 한다. - const axisRun0 = outletAnchor.offset - inlet.offset; - const axisRise0 = outletAnchor.elevation - inlet.elevation; - const invertAt = (offset: number): number => - Math.abs(axisRun0) > 1e-9 - ? inlet.elevation + axisRise0 * ((offset - inlet.offset) / axisRun0) - : inlet.elevation; + // 1:1.2~2.0 범위에서 역산). + // + // 벽 밑 = 그 자리의 **원지반**. 종전처럼 관 축(inlet → 사면 끝 직선) 위에 얹으면 + // 성토측 지반이 관 물매보다 가파른 구간에서 축이 지반 위로 떠올라 **벽이 뜬다** + // (2026-08-21 사용자 지적). 관 끝은 원지반 위라는 원칙대로 지반을 따르면 벽이 + // 지반에 앉고 관 물매가 그 자리에 맞춰진다. 역경사는 유입 invert로 클램프. + const invertAt = (offset: number): number => Math.min(groundAt(offset), inlet.elevation); let outletWallAnchor = outletAnchor; let outletPlacement: FillWallPlacement | null = null; if (designAt) { @@ -573,7 +572,8 @@ export function computeCulvertLayout( rebuild(); if (!outletWall) break; } - lengthM = target; + // 표기 길이 = **실제 그려진 관**의 올림값(목표를 적으면 도면보다 길게 적힌다). + lengthM = Math.max(1, Math.ceil(cutLength(pipeCorners) - 1e-6)); slopePct = Math.abs(outlet.offset - pipeStart.offset) > 1e-9 ? ((pipeStart.elevation - outlet.elevation) / Math.abs(outlet.offset - pipeStart.offset)) *