/* ============================================================================= * A00_Common/design/logic/design_calc_node_sections.ts * 계산 Node 입구(`design_calc_node.ts`)의 측점 몫(PLAN 511-B B-2) — 화면 묶음 stations 단계와 같은 TS. * * stations.list 입력 stations { line · curves · pipes · structures · types · definition? · plus · * interval_m · include_endpoint? · station_snap · station_snap_step } → * 측점 목록(`buildStations` · 열쇠 · 종류 · 반경 · 확폭 · 지반 null) — 계산 자리 「서버」 · * 노선 저장 옛 노선 열쇠 * stations.sections 같은 입력 + grid(DTM 격자 이진 경로) · 표본 간격 → 서버 `generate_sections` 꼴 * (`generateSections`) — 서버 측점 생성 길만(창구 `/calc` 는 막음 · 경로 입력) * stations.plan 입력 stations { types · definition? · plan: [{ pipes · structures · plus }] } → 묶음마다 * 측점 계획(`planStations`) — 서버 남은 부름(이월 열쇠 주인 · 옛 측점 옮기기 · 511-B B-5) * definition = 구조물 정의(`{types, …정의}` · 화면 `fetchStructureTypes` 와 같은 꼴) — 심는 측점 · 카드 이름 표. * ========================================================================== */ import { useCatalogDefinition, type CatalogDefinition } from "@util/common_util_structure_catalog"; import { planStations, type PlanPipe, type PlanStructure, type PlanType, } from "@util/common_util_structure_station"; import { buildStations } from "../../../B05_Profile/logic/B05_Profile_Sections_Stations"; import { generateSections } from "../../../B05_Profile/logic/B05_Profile_Sections_Generate"; import type { DesignCurve, Vertex } from "./design_pipeline_types"; import { gridAt } from "./design_calc_node_stages"; export interface SectionsInputs { stations?: { line: Vertex[]; curves?: DesignCurve[]; pipes?: PlanPipe[]; structures?: PlanStructure[]; types: PlanType[]; definition?: CatalogDefinition | null; plus?: number[]; interval_m?: number; include_endpoint?: boolean; station_snap?: boolean; station_snap_step?: number | null; grid?: string; cross_half_width_m?: number; cross_sample_interval_m?: number; long_sample_interval_m?: number; plan?: Array<{ pipes?: PlanPipe[]; structures?: PlanStructure[]; plus?: number[] }>; }; } /** id → 셈(입구 `RUNNERS` 에 얹음). */ export function sectionsRunners(inputs: SectionsInputs): Record unknown> { const args = () => { const at = inputs.stations; if (!at) throw new Error("측점 입력(stations) 없음"); if (at.definition !== undefined) useCatalogDefinition(at.definition); const options = { intervalM: at.interval_m, includeEndpoint: at.include_endpoint, stationSnap: at.station_snap ?? false, stationSnapStep: at.station_snap_step ?? null, types: at.types, plus: at.plus ?? [], crossHalfWidthM: at.cross_half_width_m, crossSampleIntervalM: at.cross_sample_interval_m, longSampleIntervalM: at.long_sample_interval_m, }; return { at, options }; }; return { "stations.list": () => { const { at, options } = args(); return buildStations(at.line, at.curves ?? [], at.pipes ?? [], at.structures ?? [], options); }, "stations.plan": () => { const { at } = args(); return (at.plan ?? []).map((group) => planStations( group.pipes ?? [], group.structures ?? [], at.types, undefined, group.plus ?? [], ), ); }, "stations.sections": () => { const { at, options } = args(); if (!at.grid) throw new Error("DTM 격자 없음 — DTM 아닌 지표면은 파이썬 길"); const grid = gridAt(at.grid); return generateSections( at.line, at.curves ?? [], at.pipes ?? [], at.structures ?? [], grid, options, ); }, }; }