/* ============================================================================= * logic/B05_Profile_EndOffsets.ts * 「페이지 설정」 시 · 종점 계획고 조정(448) = 첫 · 끝 측점의 계획고 편집(`station_offsets`) 한 칸. * 칸 값 = 자동 선형 대비 그 측점 편집(m) · 바꾸면 끝점 ▲▼ 와 같은 길(`adjustStation`)로 얹음 — * 계산 줄 즉시 · [저장] `alignment` 차례가 서버 정본 · [초기화]는 종단 파일과 함께 0. * ========================================================================== */ import { adjustStation, chainageKey, type AlignmentBase, type AlignmentEdits, } from "./B05_Profile_UI_Profile_Alignment"; export type ProfileEnd = "start" | "end"; function endChainage(base: AlignmentBase, end: ProfileEnd): number | undefined { const nodes = base.basePvi; return (end === "start" ? nodes[0] : nodes[nodes.length - 1])?.chainage_m; } /** 첫 · 끝 측점 계획고 편집(m) — 편집이 없으면 0. */ export function endOffsetsOf( base: AlignmentBase, edits: AlignmentEdits, ): Record { const at = (end: ProfileEnd): number => { const chainage = endChainage(base, end); return chainage === undefined ? 0 : (edits.station_offsets[chainageKey(chainage)] ?? 0); }; return { start: at("start"), end: at("end") }; } /** 그 끝 측점 계획고 편집을 `value`(m)로 — 기준이 없으면 편집 그대로. */ export function withEndOffset( base: AlignmentBase, edits: AlignmentEdits, end: ProfileEnd, value: number, ): AlignmentEdits { const chainage = endChainage(base, end); if (chainage === undefined || !Number.isFinite(value)) return edits; return adjustStation(base, edits, chainage, value - endOffsetsOf(base, edits)[end]); }