fix(B05): 관을 옮겨도 옛 자리 구조물 세로선이 남던 문제

구조물 측점이 두 곳에 있었다. 화면 정본인 사이드바 목록과, 경로 확정 때 종단
정본 파일에 병합된 kind="irregular" 측점이다. 그래프와 3D가 둘을 겹쳐 그려서
관을 옮기면 사이드바 목록만 따라가고 확정 당시 자리는 그대로 남았다.

그래프(_UI_Profile_Panel.draw)와 3D(_UI_Page.renderStationLines) 모두 종단
정본의 비정규 측점을 걷어내고 사이드바 목록만 얹는다. 저장분은 진입 시
restoreSections가 목록으로 되살리고, 관 항목은 배수유역도가 정본
(pipe_points.json)에 맞춰 갈아 끼운다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-02 00:58:55 +09:00
co-authored by Claude Opus 5
parent d9e8125e4c
commit a0e6289e8f
2 changed files with 14 additions and 10 deletions
+6 -2
View File
@@ -390,13 +390,17 @@ export async function renderB05Route(root: HTMLElement): Promise<void> {
}
function renderStationLines(detail: SectionDetailResponse): void {
// 확정 때 종단 정본에 병합해 둔 비정규 측점은 그리지 않는다. 화면의 정본은 사이드바 목록이고
// 관을 옮기면 그 목록만 따라오므로, 둘을 겹쳐 그리면 옮기기 전 자리가 그대로 남는다
// (2026-08-02 사용자 보고). 저장분은 진입 시 `restoreSections`가 목록으로 되살린다.
const regular = detail.longitudinal.stations.filter((station) => station.kind !== "irregular");
const injected = interpolateIrregularStations(
detail.longitudinal.stations,
regular,
irregularStations,
detail.longitudinal.length_m,
);
// 측점 바 양 끝 램프용 상단측: 사용자 변경분 → solve 자동 판정 순으로 적용.
const withUphill = [...detail.longitudinal.stations, ...injected].map((station) => ({
const withUphill = [...regular, ...injected].map((station) => ({
...station,
uphill_side:
uphillOverrides.get(uphillKey(station.chainage_m)) ?? station.uphill_side ?? null,
@@ -472,15 +472,15 @@ export function createRouteProfilePanel(
: (longitudinal.design_profiles ?? []);
// 그래프에는 비정규 측점을 일반 측점처럼(세로선+라벨) 섞어 넣는다.
const graphData = normalizedLongitudinal(longitudinal);
// 종단 정본(확정 시 병합분)에 들어 있는 비정규 측점은 걷어낸다 — 화면의 정본은 사이드바
// 목록이고, 관을 옮기면 그 목록만 따라온다. 둘을 겹쳐 그리면 옮기기 전 자리의 세로선이
// 그대로 남는다(2026-08-02 사용자 보고).
const regular = graphData.stations.filter((station) => station.kind !== "irregular");
const injected = irregularGraphStations(irregularStations, maxChainageOf(longitudinal));
const graphLongitudinal = injected.length
? {
...graphData,
stations: [...graphData.stations, ...injected].sort(
(a, b) => a.chainage_m - b.chainage_m,
),
}
: graphData;
const graphLongitudinal = {
...graphData,
stations: [...regular, ...injected].sort((a, b) => a.chainage_m - b.chainage_m),
};
let yAxis: { padLeft: number; ticks: Array<{ y: number; label: string }> } | null = null;
chartWrap.append(
createLongitudinalProfile(