/* ============================================================================= * B05_Profile_UI_IrregularStations.ts * 비정규 측점(구조물 측점) 꼴 · 배수관 판정 · 표시 라벨 — 종단 그래프 · 표 · 3D 가 같이 씀. * * chainage_m = 측점번호 × 측점간격(m) + 잔여거리(m). * ========================================================================== */ import { PIPE_DISPLAY_NAME } from "../common_util/common_util_structure_catalog"; import { ESCAPE_ROUTE_DEFAULT_WIDTH_M, PIPE_DEFAULT_DIAMETER_MM, PIPE_DEFAULT_TYPE, STRUCTURE_ETC_DEFAULT_NAME, type StructureType, } from "@config/config_frontend"; // 그래프 측점 id · 측점 표기 = logic(511-B B-3) — 부르는 쪽은 그대로 여기서 받음 export { irregularLabel, irregularStationId } from "./logic/B05_Profile_Profile_Planted"; export interface IrregularStation { id: string; /** 측점번호 X. */ station: number; /** 잔여거리 XX (m). */ remainder: number; /** = station × 측점간격 + remainder. 그래프·테이블·3D의 X축 기준. */ chainage_m: number; /** 표시용 구조물 라벨 — structureLabel()이 만든다 (예: "파형강관 D800", "대피로 2.0m"). */ structure: string; /** 구조물 종류 드롭다운 값 (2026-08-05 사용자 확정). 구버전 항목은 undefined → "기타" 취급. */ structureType?: StructureType; /** 배관 하위 옵션 — 관종·직경. */ pipeType?: string; diameterMm?: number; /** 사용자가 관종·직경을 손으로 바꿨는가. true면 배수유역 재계산 때 자동 지정으로 덮지 않는다. */ userSized?: boolean; /** 대피로 하위 옵션 — 폭(m). */ escapeWidthM?: number; /** 기타 하위 옵션 — 이름 자유 텍스트. */ customName?: string; /** 어디서 온 항목인가. `pipe`는 배수유역도의 관 매설 지점이 투영된 것이라 손으로 * 지우거나 옮겨도 정본(`pipe_points.json`)을 거쳐야 한다(2026-08-01 사용자 지시). */ origin?: "user" | "pipe"; } /** 관 매설 지점이 구조물 목록에 실체화될 때 쓰는 종류 값(구 데이터 판정 키라 유지 — * 화면 표시 이름은 "배수관"이다, 2026-08-17 사용자 지시). */ export const PIPE_STRUCTURE_NAME = "배관"; /** 배수관으로 볼 항목인가. 드롭다운 종류가 "배관"이거나 손으로 이름을 "배관"·"배수관"이라 * 적은 것도 관 지점 정본을 따르게 한다 — 아니면 [초기화]로 지워지지 않고 배수유역도와 * 어긋난다. */ export function isPipeStation(station: { origin?: "user" | "pipe"; structure: string; structureType?: StructureType; }): boolean { const name = station.structure.trim(); return ( station.origin === "pipe" || station.structureType === PIPE_STRUCTURE_NAME || name === PIPE_STRUCTURE_NAME || name === PIPE_DISPLAY_NAME ); } /** 옵션 값들로 표시 라벨을 만든다 — 목록·종단 그래프·3D 마커가 같은 문자열을 쓴다. */ export function structureLabel(entry: { structureType?: StructureType; pipeType?: string; diameterMm?: number; escapeWidthM?: number; customName?: string; structure?: string; }): string { switch (entry.structureType) { case "배관": return `${entry.pipeType ?? PIPE_DEFAULT_TYPE} D${entry.diameterMm ?? PIPE_DEFAULT_DIAMETER_MM}`; case "기성막이": return "기성막이"; case "대피로": return `대피로 ${(entry.escapeWidthM ?? ESCAPE_ROUTE_DEFAULT_WIDTH_M).toFixed(1)}m`; case "기타": return entry.customName?.trim() || STRUCTURE_ETC_DEFAULT_NAME; default: return entry.structure ?? ""; } }