From bf92e56fef62f42caeb7a935239b8ea9b6d3e68c Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 14:22:37 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix(structure):=20=EA=B3=A0=EB=A5=B8=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=EB=AC=BC=20=EA=B5=B0=20=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=3D=20=ED=9A=A1=EB=8B=A8=20=EC=B9=B4=EB=93=9C=20=C2=B7=20?= =?UTF-8?q?=EB=B2=BD=20=C2=B7=20=EC=84=B8=EC=9B=94=EA=B5=90=20=C2=B7=20BOX?= =?UTF-8?q?=20=EA=B0=95=EC=A1=B0=20=C2=B7=20=EB=84=98=EA=B9=80=20=EB=90=98?= =?UTF-8?q?=EC=96=B9=EA=B8=B0=20=ED=91=9C=EC=8B=9C=20=C2=B7=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EC=B9=B8=EB=8F=84=20=ED=92=82=20=C2=B7=20B05=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=ED=92=80=EB=A9=B4=20B06=20=EB=93=A4?= =?UTF-8?q?=EC=96=B4=EC=98=AC=20=EB=95=8C=EB=8F=84=20=ED=92=82(54-38)?= 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_013rJwJMVL4EE31y77TB11AP --- A00_Common/design/design_view_cross.ts | 25 +++++- .../B05_Profile_UI_Structures_Panel_Events.ts | 5 +- .../tester/ui_checks/54-38_군바꿈_횡단강조.js | 80 +++++++++++++++++++ 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 resources/tester/ui_checks/54-38_군바꿈_횡단강조.js diff --git a/A00_Common/design/design_view_cross.ts b/A00_Common/design/design_view_cross.ts index 8a0fda6d9..9f7de9d59 100644 --- a/A00_Common/design/design_view_cross.ts +++ b/A00_Common/design/design_view_cross.ts @@ -190,7 +190,7 @@ export async function mountCrossView( focusChainage: (chainageM) => { if (!isWallSelecting()) focusStationAt(chainageM); }, - releaseCard: () => sectionView.focusStation(null), + releaseCard: () => releaseCross(), markStructure: (structureId) => sectionView.selectMark(structureId), applyPipeOptions: (chainageM, patch) => applyPipeOptionsToCache(pipeOptionsContext, chainageM, patch), @@ -491,6 +491,27 @@ export async function mountCrossView( if (applied) appliedPick = signature; } + /** 고름을 다 풂(54-38) — 카드 · 벽 · 세월교 · BOX 강조 · 넘김 되얹기 표시 · 선택 칸. */ + function releaseCross(): void { + const { revetOffset, ford, box } = stationControls; + const lit = (sectionDetail?.cross_sections ?? []).filter( + (s) => + revetOffset.highlightFor(s) || + ford.selectedFor(s.chainage_m) || + box.selectedFor(s.chainage_m), + ); + for (const s of lit) { + if (revetOffset.selectedFor(s)) revetOffset.select(s.chainage_m, null); + if (ford.selectedFor(s.chainage_m)) ford.select(s.chainage_m, null); + if (box.selectedFor(s.chainage_m)) box.select(s.chainage_m, null); + } + structuresPanel.releasePipe(); + sectionView.focusStation(null); + sectionView.refreshCards(lit.map((s) => s.chainage_m)); + appliedPick = null; + selectDesign(projectId, NO_SELECTION, { from: "b06" }); + } + function renderSectionDetail(): void { if (!sectionDetail) return; showSectionView(); @@ -541,6 +562,8 @@ export async function mountCrossView( if (currentRouteId === null) return; // 떠난 사이 종단 보기가 폼을 다른 것으로 바꿨을 수 있음 — 같은 넘김값도 다시 적용(53-1) appliedPick = null; + // 종단 보기에서 고름을 풀었으면 횡단 강조도 풂(54-38) + if (!readStructurePick(projectId)) releaseCross(); void structuresPanel.load().then(restoreStructurePick); void refreshDetailForStructures().then(() => reconcileStaleDesigns()); }); diff --git a/B05_Profile/B05_Profile_UI_Structures_Panel_Events.ts b/B05_Profile/B05_Profile_UI_Structures_Panel_Events.ts index 8f3e49e41..8c508b1b1 100644 --- a/B05_Profile/B05_Profile_UI_Structures_Panel_Events.ts +++ b/B05_Profile/B05_Profile_UI_Structures_Panel_Events.ts @@ -12,7 +12,7 @@ import type { StructureInstance, StructureType } from "./B05_Profile_Api_Structu import type { StructuresCommitContext } from "./B05_Profile_UI_Structures_Panel_Commit"; import { asRoad } from "./B05_Profile_UI_Structures_Define"; import { readState, writeState } from "../A00_Common/b_page_state"; -import { PIPE_MATCH_M } from "../A00_Common/design/design_selection"; +import { NO_SELECTION, PIPE_MATCH_M, selectDesign } from "../A00_Common/design/design_selection"; import { readGroupItems, readSummaryItem } from "../common_util/common_util_summary_item"; /** 배선에 필요한 패널 내부 값 — 이름은 분리 전 지역변수와 같다. */ @@ -40,6 +40,9 @@ export function bindStructuresEvents(ctx: StructuresEventContext): void { /** 새로 놓기(54-32) — 고름 · 측점 · 강조를 풀고 군(· 종류)만 남긴 빈 기본값 폼. */ function startNew(group: string, typeId?: string): void { ctx.resetForm(); + // 횡단 카드 · 부재 강조와 넘김 선택도 풂 — B05 → B06 넘김에서 되얹지 않게(54-38) + ctx.callbacks.onListRelease?.(); + selectDesign(ctx.projectId, NO_SELECTION, { from: "b05" }); ctx.groupSelect.value = group; ctx.syncTypeOptions(typeId); } diff --git a/resources/tester/ui_checks/54-38_군바꿈_횡단강조.js b/resources/tester/ui_checks/54-38_군바꿈_횡단강조.js new file mode 100644 index 000000000..9cae2cd4e --- /dev/null +++ b/resources/tester/ui_checks/54-38_군바꿈_횡단강조.js @@ -0,0 +1,80 @@ +/* 54-38 고른 구조물에서 군 바꿈 = 횡단 강조(카드 · 벽 · 부재 · 조정 칸)도 풂 + * 시작 화면: B06 횡단설계(#/b06-section) · 검증 프로젝트(sub4) · 로그인 + * 부르는 법: 단계마다 `window.__m5438 = "단계";` 뒤 이 파일 본문을 eval + * a (B06) 배관 1 → 유입 벽 고름 → 군 바꿈 = 강조 0 · 돌쌓기(찰) 1 → 군 바꿈 = 강조 0 + * b (B06) 배관 1 → 벽 고름 → B05 로 → 군 바꿈 → B06 로 = 강조 0 · 선택 칸 비어 있음 + * 결과는 sessionStorage `__5438_out_{단계}` · 기대: fails 0 + */ +(async () => { + const MODE = window.__m5438 || "a"; + const w = (ms) => new Promise((r) => setTimeout(r, ms)); + const pid = localStorage.getItem("frd_current_project_id"); + const t = (e) => e.innerText.replace(/\s+/g, " ").trim(); + const fails = []; + const out = {}; + const fail = (m) => fails.push(m); + const sec = () => document.querySelector(".b05-structure-section"); + const grid = () => sec().querySelectorAll(".b05-structure__grid select"); + const rows = () => [...document.querySelectorAll(".b05-route__irregular-list li")]; + const row = (head) => rows().find((li) => t(li).startsWith(head)); + const fire = (el, value) => { + el.value = value; + el.dispatchEvent(new Event("input", { bubbles: true })); + el.dispatchEvent(new Event("change", { bubbles: true })); + }; + const pick = async (head) => { + for (let k = 0; k < 40 && !row(head); k++) await w(300); + if (!row(head)?.classList.contains("is-selected")) row(head)?.click(); + await w(2000); + }; + const setGroup = async (g) => (fire(grid()[0], g), await w(2000)); + /** 횡단 강조 수 — 고른 카드 · 그림 부재 · 조정 칸 */ + const lit = () => ({ + card: document.querySelectorAll(".b06-cross-card--selected").length, + part: document.querySelectorAll(".b06-cross-card svg .is-active").length, + box: document.querySelectorAll("fieldset[data-spec-container].is-active").length, + }); + const total = (o) => o.card + o.part + o.box; + /** 고른 카드의 유입 벽을 누름 — 횡단에서 벽을 고른 길 */ + const pickWall = async () => { + const shape = document.querySelector(".b06-cross-card--selected .b06-chart__culvert-revet-hit"); + shape?.dispatchEvent(new MouseEvent("click", { bubbles: true })); + await w(1500); + return !!shape; + }; + const go = async (hash) => ((location.hash = hash), await w(5000)); + const pickState = () => sessionStorage.getItem(`aislo:draft:structure-pick:${pid}`); + + if (MODE === "a") { + await pick("4+5 배관 1"); + out.wallClicked = await pickWall(); + out.pipeBefore = lit(); + if (total(out.pipeBefore) === 0) fail("배관 고름 강조 없음"); + await setGroup("C"); + out.pipeAfter = lit(); + if (total(out.pipeAfter) !== 0) fail(`배관 군 바꿈 강조 ${JSON.stringify(out.pipeAfter)}`); + await pick("4+0~4+10 돌쌓기(찰) 1"); + out.structBefore = lit(); + if (total(out.structBefore) === 0) fail("돌쌓기 고름 강조 없음"); + await setGroup("B"); + out.structAfter = lit(); + if (total(out.structAfter) !== 0) + fail(`돌쌓기 군 바꿈 강조 ${JSON.stringify(out.structAfter)}`); + out.pick = pickState(); + } + + if (MODE === "b") { + await pick("4+5 배관 1"); + out.wallClicked = await pickWall(); + out.before = lit(); + await go("#/b05-profile"); + await pick("4+5 배관 1"); + await setGroup("C"); + out.pick = pickState(); + await go("#/b06-section"); + out.after = lit(); + if (total(out.after) !== 0) fail(`B05 군 바꿈 뒤 B06 강조 ${JSON.stringify(out.after)}`); + } + + sessionStorage.setItem(`__5438_out_${MODE}`, JSON.stringify({ fails, out })); +})(); From bb08b33d174bb30fc4d96f23c83dfe2fbcd95f15 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 14:24:24 +0900 Subject: [PATCH 2/5] =?UTF-8?q?chore(plan):=2010-6=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?=EA=B2=BD=EC=82=AC=20=EB=B2=94=EC=9C=84=20=C2=B7=20=EC=A7=91?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=82=B4=EA=B3=B5=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?=EC=9B=90=EB=AC=B8?= 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_01FJqWQpoB1RE7hiaQ2wH8qV --- docs/raw/사용자요구/2026-10-05_수정요구.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index 4ad0eda3a..8a887e2e9 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -268,3 +268,7 @@ B05에서 3D 영역의 상단 버튼들 중 원근으로, 직교로 버튼의 (10-6 사용자) 다음 배관과 흙막이의 선택지에 대한의견임. 선택 안함 항목들은 그냥 값이 없어야함. 기본 값이 아니라. + +(10-6 사용자) +1. 관 보호공 유입에서 연동과 경사 옵션은 결국 종단방향의 길이가 있는 것들에만 들어가는 옵션이야. +2. 집수정 옵션에서 내공이라는 옵션이 나오는데 의미가 뭔지 모르겠음. 필요없는 정보로 보임. From 00fc4bd215a73dcba9f313c2bd71e3155aec1eda Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 14:25:48 +0900 Subject: [PATCH 3/5] =?UTF-8?q?chore(plan):=2010-6=20=EC=83=81=EC=9E=90=20?= =?UTF-8?q?=EC=95=88=20=EB=8B=A8=EC=B6=94=20=EB=86=92=EC=9D=B4=20=ED=85=9C?= =?UTF-8?q?=ED=94=8C=EB=A6=BF=20=EC=9A=94=EC=B2=AD=20=EC=9B=90=EB=AC=B8?= 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_01FJqWQpoB1RE7hiaQ2wH8qV --- docs/raw/사용자요구/2026-10-05_수정요구.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index 8a887e2e9..d473bd1bd 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -272,3 +272,6 @@ B05에서 3D 영역의 상단 버튼들 중 원근으로, 직교로 버튼의 (10-6 사용자) 1. 관 보호공 유입에서 연동과 경사 옵션은 결국 종단방향의 길이가 있는 것들에만 들어가는 옵션이야. 2. 집수정 옵션에서 내공이라는 옵션이 나오는데 의미가 뭔지 모르겠음. 필요없는 정보로 보임. + +(10-6 사용자) +3. 연동과 경사 버튼의 높이를 추가 흙막이의 + 버튼의 높이와 같게 이건 구조물 배치 컨테이너의 하위 컨테이너 내부의 항목들 공통임. 템플릿으로 만들어서 반영. 그렇다고 삭제, 리셋 버튼까지 바꿀필요는 없음. From ad697f5340ec32f5a2abb6f2dea585282566ffea Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 14:27:43 +0900 Subject: [PATCH 4/5] =?UTF-8?q?chore(plan):=2010-6=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=EA=B0=92=20=3D=20=EC=B1=84=EC=9B=8C=20=EB=84=A3=EC=9D=80=20?= =?UTF-8?q?=EA=B0=92=20=EC=9A=94=EC=B2=AD=20=EC=9B=90=EB=AC=B8?= 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_01FJqWQpoB1RE7hiaQ2wH8qV --- docs/raw/사용자요구/2026-10-05_수정요구.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index d473bd1bd..43f70d5ed 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -275,3 +275,6 @@ B05에서 3D 영역의 상단 버튼들 중 원근으로, 직교로 버튼의 (10-6 사용자) 3. 연동과 경사 버튼의 높이를 추가 흙막이의 + 버튼의 높이와 같게 이건 구조물 배치 컨테이너의 하위 컨테이너 내부의 항목들 공통임. 템플릿으로 만들어서 반영. 그렇다고 삭제, 리셋 버튼까지 바꿀필요는 없음. + +(10-6 사용자) +기본값은 비워져 있을때 대체해서 넣어주는 값이아니라 그냥 프론트엔드에 그냥 값을 넣은 상태로 보여줬으면 해. From 43ff2931c2fcd0ad4b28dc4ee6fb2c5fe2c1e259 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 6 Oct 2026 14:34:42 +0900 Subject: [PATCH 5/5] =?UTF-8?q?chore(plan):=2010-6=20=ED=9A=A1=EB=8B=A8=20?= =?UTF-8?q?=EB=B2=BD=20=ED=98=95=EC=83=81=20=EC=9E=AC=EC=A0=95=EB=A6=AC=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=9B=90=EB=AC=B8?= 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_01FJqWQpoB1RE7hiaQ2wH8qV --- docs/raw/사용자요구/2026-10-05_수정요구.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index 43f70d5ed..7b7e584df 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -278,3 +278,11 @@ B05에서 3D 영역의 상단 버튼들 중 원근으로, 직교로 버튼의 (10-6 사용자) 기본값은 비워져 있을때 대체해서 넣어주는 값이아니라 그냥 프론트엔드에 그냥 값을 넣은 상태로 보여줬으면 해. + +(10-6 사용자) +돌쌀기(메)의 경우 형상이 원지반에 붙어서 연장됨. 형상 정보에 대해 재정리 하겠음. +1. 관보호공의 흙막이, 사면보호의 흙막이, 옹벽, 추가 흙막이 등은 전부 같은 로직으로 형상을 횡단도에 그려지고 동작해야함 +2. 관보호공의 흙막이는 배관에 연동되에 위치제어만 제약이 생김.(배관은 m 단위로 떨어져야 함으로) +3. 형태에 따라 다른건 내부 그림의 형태만 변경을 함. +4. 각각의 형태별로 원지반을 침투하는 리밋과 높이 리밋이 존재하는데 이부분은 삭제(사용자에게 선택권을 주겠음.) +5. 단 노면위로 올라오는건 방지.