diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit.ts b/B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit.ts index 180395ba..8ab19cb4 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit.ts +++ b/B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit.ts @@ -241,16 +241,25 @@ export function createEditOverlay(options: EditOverlayOptions): HTMLElement { * 비정규 측점(구조물)이 규칙 측점 바로 옆에 서면 ▲▼가 서로 덮였다(2026-08-04 사용자 * 보고) — 앞 버튼과 최소 간격(BUTTON_CLEARANCE_PX)을 강제하며 오른쪽으로 밀어낸다. * 측점선 자체는 그대로라 버튼만 살짝 비켜선다. + * + * 확정을 거친 구조물 측점은 종단 정본(alignment.stations)에 **이미 병합**돼 있어 + * 사이드바 목록(irregular)과 이중으로 잡힌다 — 같은 chainage(소수 3자리)는 한 번만 + * 버튼을 단다(2026-08-04 사용자 보고: 구조물 측점 버튼이 2개씩 생김). */ + const alignmentStationKeys = new Set( + alignment.stations.map((station) => chainageKey(station.chainage_m)), + ); const stationPlacements = [ ...alignment.stations.map((station) => ({ chainage: station.chainage_m, plan: station.plan_elevation_m, })), - ...irregular.map((station) => ({ - chainage: station.chainage_m, - plan: planElevationAtSample(alignment, station.chainage_m), - })), + ...irregular + .filter((station) => !alignmentStationKeys.has(chainageKey(station.chainage_m))) + .map((station) => ({ + chainage: station.chainage_m, + plan: planElevationAtSample(alignment, station.chainage_m), + })), ] .sort((a, b) => a.chainage - b.chainage) .map(