/* ============================================================================= * A00_Common/design/design_profile_base.ts * 종단도 계획선 기준 = 측점 한 벌(서버 일반 + 지금 구조물 측점 · 272) — `design_profile` 에서 나눔(700줄). * 계산 묶음 planline 단계(`design_pipeline_page`)도 같은 기준을 받음. * ========================================================================== */ import type { SectionDetailResponse } from "../../B06_Section/B06_Section_Api_Fetch"; import type { AlignmentBase } from "../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment"; import type { IrregularStation } from "../../B05_Profile/B05_Profile_UI_IrregularStations"; import { irregularGraphStations, maxChainageOf, } from "../../B05_Profile/B05_Profile_UI_Profile_Layout"; import { followMovedNodes, oneStationList } from "../../common_util/common_util_structure_station"; /** 계획선 측점 줄 = 측점 한 벌(서버 일반 + 지금 구조물 측점 · 272) — 표 · ▲▼ · 그래프 · 3D · 횡단 다시 셈(342-1)이 * 같은 목록 · 사라진 구조물 측점의 꼭짓점은 서버와 같게 옮기거나 지움(`followMovedNodes`) · 늘 저장분에서 셈. */ export function listedBase( storedBase: AlignmentBase | null, detail: SectionDetailResponse | null, irregularStations: IrregularStation[], ): AlignmentBase | null { if (!storedBase || !detail) return storedBase; const server = detail.longitudinal.stations; const planted = irregularGraphStations(irregularStations, maxChainageOf(detail.longitudinal)); const list = oneStationList(server, planted); const after = new Set(list.map((station) => station.chainage_m.toFixed(3))); const before = new Set(server.map((station) => station.chainage_m.toFixed(3))); const gone = server .filter((station) => station.kind === "irregular" && !station.grid) .map((station) => station.chainage_m) .filter((chainage) => !after.has(chainage.toFixed(3))); const born = list .map((station) => station.chainage_m) .filter((chainage) => !before.has(chainage.toFixed(3))); return { ...storedBase, basePvi: followMovedNodes(storedBase.basePvi, gone, born), stations: list.map((station) => ({ station_id: station.station_id, chainage_m: station.chainage_m, })), }; }