fix(B05): 확정된 구조물 측점의 편집 버튼 이중 생성 제거

확정을 거친 구조물 측점은 종단 정본(alignment.stations)에 이미 병합돼 있는데
사이드바 목록(irregular)에서 또 추가돼 ▲▼가 2개씩 생겼다(같은 자리에 겹쳐 있다가
겹침 회피 캐스케이드가 옆으로 벌리면서 드러남). 같은 chainage(소수 3자리)는 한 번만
버튼을 단다. 검증: 버튼 27→23개(배관 4곳 중복 제거), 근접 측점 비킴은 유지.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-04 19:08:15 +09:00
co-authored by Claude Opus 5
parent d4fc73c012
commit c8eeb15b81
+13 -4
View File
@@ -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(