From 5b28a6e9410e85e5ab313f8a9d3ef3929b61e8b1 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 23:43:35 +0900 Subject: [PATCH] =?UTF-8?q?fix(B06):=20=ED=9D=99=EB=A7=89=EC=9D=B4=20?= =?UTF-8?q?=C2=B7=20=EC=98=B9=EB=B2=BD=20=EC=95=88=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A7=80=EB=82=98=EA=B0=80=EB=8A=94=20=EB=8B=A4=EB=A5=B8=20?= =?UTF-8?q?=EC=84=A0=20=EC=88=A8=EA=B9=80=20=E2=80=94=20=EB=B2=BD=EC=9D=B4?= =?UTF-8?q?=20=EB=B0=94=ED=83=95=EC=83=89=20=EB=8D=AE=EA=B0=9C=EC=99=80=20?= =?UTF-8?q?=ED=95=A8=EA=BB=98=20=EC=9C=84=EC=97=90=EC=84=9C=20=EB=8D=AE?= =?UTF-8?q?=EC=9D=8C(PLAN=2066-5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 벽 · 무늬를 덮개와 함께 맨 위로 · 관 · 클릭 판정면 · 글은 그 위로 다시(지금 차례 그대로) - 원지반 · 설계선 · 비탈 · 다른 외곽이 벽 안에서 안 보임 · 벽 자기 외곽 · 무늬는 그대로 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EYJJRCfHfdCGNhmXTjQKV7 --- B06_Section/B06_Section_UI_Cross_View.ts | 6 ++-- B06_Section/B06_Section_UI_Cross_Wall.ts | 35 +++++++++++++++++++ .../B06_Section_UI_Style_Cross_Areas.css | 21 +++++++---- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/B06_Section/B06_Section_UI_Cross_View.ts b/B06_Section/B06_Section_UI_Cross_View.ts index e25adf01e..85343d197 100644 --- a/B06_Section/B06_Section_UI_Cross_View.ts +++ b/B06_Section/B06_Section_UI_Cross_View.ts @@ -20,6 +20,7 @@ import { appendFordSurfaceDropPlan, } from "./B06_Section_UI_Cross_Ford_Pavement"; import { culvertWallsStandAt } from "./B06_Section_UI_Cross_Culvert_Wire"; +import { raiseWalls } from "./B06_Section_UI_Cross_Wall"; import { appendSpoilFillOverlay } from "./B06_Section_UI_Cross_SpoilFill"; import { appendRevetmentOverlay, computeRevetmentLayout } from "./B06_Section_UI_Cross_Revetment"; import { @@ -468,13 +469,12 @@ export function createCrossSectionCard( // (2026-09-06 사용자 확정: 구조물 자체 면적을 빼는 것이 아니다). 그림과 면적이 // 같은 트림 값을 쓰므로 "그림은 이런데 수량은 저렇다"가 생기지 않는다. applyStructureAreas(section, designTrim); - appendCrossDesignOverlay(plotLayer, section.design, x, toDisplayY, drawSamples, designTrim, { const designFrom = plotLayer.childElementCount; + appendCrossDesignOverlay(plotLayer, section.design, x, toDisplayY, drawSamples, designTrim, { layer: svg, x: (CROSS_PAD.left + widthPx - CROSS_PAD.right) / 2, y: heightPx - CROSS_PAD.bottom - 4, }); - // 사토장(유용토운반작업장) — 교본 6장 3절이 횡단도 표시를 요구한다. 값은 설계 결과에서 // 물넘이 자리 = 노면 · 측구 설계선 걷음(66-2 · 66-3 — 옛 계획고 점선이 드러남) if (fordPaved && section.ford_pavement) hideFordPavedRoad( @@ -485,6 +485,7 @@ export function createCrossSectionCard( x, toDisplayY, ); + // 사토장(유용토운반작업장) — 교본 6장 3절이 횡단도 표시를 요구한다. 값은 설계 결과에서 // 그대로 오고 여기서 다시 세지 않는다. 선 종류는 터파기 파선과 갈라 둔다. appendSpoilFillOverlay(plotLayer, section.design, x, toDisplayY); // 배수관 세트 — 조정창이 쓸 카드 상태를 받아 둔다(2026-08-19) · 링크 카드도 채운다(2026-08-24). @@ -528,6 +529,7 @@ export function createCrossSectionCard( ); if (highlightRevet) setRevetActive(highlightRevet); } + raiseWalls(plotLayer); // 흙막이 · 옹벽 안을 지나는 다른 선 가림(66-5) } // 십자선(계획 노선 자리) · 축선 · 높이 축 이름 — `_Cross_View_Frame`(700줄 제한). diff --git a/B06_Section/B06_Section_UI_Cross_Wall.ts b/B06_Section/B06_Section_UI_Cross_Wall.ts index 5c7670e0b..4702ee779 100644 --- a/B06_Section/B06_Section_UI_Cross_Wall.ts +++ b/B06_Section/B06_Section_UI_Cross_Wall.ts @@ -160,3 +160,38 @@ export function appendPlanLine( } layer.append(line); } + +/** + * 벽 안으로 지나가는 다른 선(원지반 · 설계선 · 비탈 · 다른 외곽)을 가린다(66-5) — 흙막이 · 옹벽을 + * 바탕색 덮개와 함께 맨 위로 올림. 벽 자기 외곽 · 무늬는 그대로. 관 · 클릭 판정면 · 글은 그 위로 + * 다시 올려 지금 차례(관이 벽을 지나감 · 판정면 맨 위)를 지킨다. + */ +export function raiseWalls(layer: SVGElement): void { + const kids = [...layer.children]; + const groups = kids + .filter((el) => el.classList.contains("b06-chart__culvert-revet")) + .map((wall) => { + // 무늬 = 벽 바로 뒤의 clipPath + 잘린 묶음(`appendWallHatch`) + const hatch: Element[] = []; + let next = wall.nextElementSibling; + while ( + next && + (next.tagName === "clipPath" || + next.getAttribute("clip-path")?.startsWith("url(#b06-revet-clip-")) + ) { + hatch.push(next); + next = next.nextElementSibling; + } + const cover = document.createElementNS(SVG_NS, "polygon"); + cover.setAttribute("points", wall.getAttribute("points") ?? ""); + cover.setAttribute("class", "b06-chart__wall-cover"); + return [cover, wall, ...hatch]; + }); + if (!groups.length) return; + for (const group of groups) layer.append(...group); + layer.append( + ...kids.filter((el) => + el.matches(".b06-chart__culvert-pipe, .b06-chart__culvert-revet-hit, text"), + ), + ); +} diff --git a/B06_Section/B06_Section_UI_Style_Cross_Areas.css b/B06_Section/B06_Section_UI_Style_Cross_Areas.css index ce6ea58be..4e6925180 100644 --- a/B06_Section/B06_Section_UI_Style_Cross_Areas.css +++ b/B06_Section/B06_Section_UI_Style_Cross_Areas.css @@ -254,6 +254,13 @@ stroke-width: 2.2; } +/* 흙막이 · 옹벽 덮개(66-5) — 벽 안으로 지나가는 다른 선을 바탕색으로 가림. */ +.b06-chart__wall-cover { + fill: var(--color-surface-raised); + stroke: none; + pointer-events: none; +} + /* 클릭 판정용 투명 겹면 — 관·보호공보다 위에 얹혀 벽 가운데도 눌린다. */ .b06-chart__culvert-revet-hit { fill: transparent; @@ -367,13 +374,6 @@ stroke-linejoin: round; } -/* BOX암거 내공(유로) — 면은 비우고 윤곽만. 물이 지나는 빈 공간이라 채우지 않는다. */ -.b06-chart__box-barrel { - fill: none; - stroke: var(--color-text-secondary); - stroke-width: 1; - stroke-dasharray: 4 3; - stroke-linejoin: round; /* 세월교 본체(바닥판 · 관) 선택 강조(66-1) — 측벽 강조와 같은 색. */ .b06-chart__ford-slab.is-active, .b06-chart__culvert-pipe.is-active { @@ -382,6 +382,13 @@ stroke-width: 2.2; } +/* BOX암거 내공(유로) — 면은 비우고 윤곽만. 물이 지나는 빈 공간이라 채우지 않는다. */ +.b06-chart__box-barrel { + fill: none; + stroke: var(--color-text-secondary); + stroke-width: 1; + stroke-dasharray: 4 3; + stroke-linejoin: round; } /* 터파기 선(2026-09-09 사용자 확정 ④) — **파선**으로 그린다. 구조물 실체가 아니라