From a6197cdc468437d62d4efd0072d9ab93e2009f1e Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 19 Aug 2026 19:52:20 +0900 Subject: [PATCH] =?UTF-8?q?fix(B06):=20=ED=9A=A1=EB=8B=A8=20=EB=B0=98?= =?UTF-8?q?=ED=8F=AD=20=ED=91=9C=EC=8B=9C=20=EA=B8=B0=EB=B3=B8=EA=B0=92=20?= =?UTF-8?q?12=EA=B0=80=2020=EC=9C=BC=EB=A1=9C=20=EB=90=98=EB=8F=8C?= =?UTF-8?q?=EC=95=84=EC=98=A4=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 원인: 진입 로직이 data.options.cross_half_width_m을 '사용자가 확정한 표시 반폭'으로 보고 입력칸을 덮었다. 그 값은 종·횡단을 만들 때 쓴 **샘플링(계산) 반폭**이고 백엔드 기본이 20m라, 표시 기본값 12를 넣어도 진입할 때마다 20으로 돌아왔다. 수정: 계산 범위(백엔드 20m)는 그대로 두고, 입력칸은 사용자가 실제로 고른 표시 폭만 되살린다 — 측점 개별 표시 반폭 저장값(design.display_half_width_m)의 최대값, 그다음 세션에 남은 마지막 조절값 순. 둘 다 없으면 표시 기본 12m. 검증: tsc, pytest 125 통과, 헤드 브라우저 B06 탭에서 반폭 12·횡단면도 X축 12~-12 확인. Co-Authored-By: Claude Fable 5 --- B06_Section/B06_Section_UI_Page.ts | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/B06_Section/B06_Section_UI_Page.ts b/B06_Section/B06_Section_UI_Page.ts index 12d96b38..e3557f2c 100644 --- a/B06_Section/B06_Section_UI_Page.ts +++ b/B06_Section/B06_Section_UI_Page.ts @@ -714,14 +714,23 @@ export async function renderB06ProfileCross(root: HTMLElement): Promise { // 확정 이력의 표준 횡단면 설정값 복원(진행 중 세션 편집값이 있으면 패널이 무시). if (storedOptions?.standard_cross_section) standardPanel?.applyStored(storedOptions.standard_cross_section); - // 입력칸의 기준값은 **표시 기본 12m**(2026-08-19 사용자 지시, 위에서 이미 넣었다 — - // 계산·보유 샘플 폭은 백엔드 기본 20m 유지)이고, 사용자가 값을 지정해 확정한 이력 - // (data.options)이 있을 때만 그 값으로 바꾼다(2026-08-08 사용자 지시). 예전에는 - // options가 없으면 보유 샘플의 최대 offset을 계산해 덮었는데, 옛 기본값(15m)으로 - // 만들어진 노선이 15.0으로 보여 기준값 구실을 못 했다. - // 표시값이 보유 샘플 폭보다 크면 [전체 측점 반영]이 알아서 재생성한다(applyPanelToAll). - const storedHalfWidth = storedOptions?.cross_half_width_m ?? 0; - if (storedHalfWidth > 0) crossHalfWidthField.input.value = storedHalfWidth.toFixed(1); + /* 입력칸의 기준값은 **표시 기본 12m**(2026-08-19 사용자 지시, 위에서 이미 넣었다). + * + * ⚠ `data.options.cross_half_width_m`은 종단·횡단을 만들 때 쓴 **샘플링(계산) + * 반폭**이지 사용자가 고른 표시 폭이 아니다(엔진이 offsets 범위를 만들 때 쓰고 + * 그대로 저장한다). 그 값으로 입력칸을 덮으면 표시 기본값이 언제나 계산 기본 + * 20m으로 되돌아온다 — 2026-08-19 사용자 보고의 원인이 이것이다. 그래서 여기서는 + * 읽지 않고, 사용자가 실제로 고른 표시 폭만 되살린다: + * ① 측점 개별 표시 반폭의 저장값(design.display_half_width_m) 대표값 + * ② 세션에 남은 마지막 조절값(같은 노선으로 돌아왔을 때) + * 표시값이 보유 샘플 폭보다 크면 [전체 측점 반영]이 알아서 재생성한다. */ + const savedDisplayWidths = sectionDetail.cross_sections + .map((section) => section.design?.display_half_width_m) + .filter((width): width is number => typeof width === "number" && width > 0); + if (savedDisplayWidths.length) { + // 측점마다 다를 수 있다 — 전역 입력칸에는 가장 넓은 값을 올린다(잘림 방지). + crossHalfWidthField.input.value = Math.max(...savedDisplayWidths).toFixed(1); + } // 세션에 보관된 표시 반폭이 있으면 그것이 우선한다(사용자가 마지막으로 지정한 값). const sessionDisplayKey = displaySessionKey(); if (sessionDisplayKey) {