diff --git a/A00_Common/design/design_profile.ts b/A00_Common/design/design_profile.ts new file mode 100644 index 00000000..6fa286f5 --- /dev/null +++ b/A00_Common/design/design_profile.ts @@ -0,0 +1,65 @@ +/* ============================================================================= + * A00_Common/design/design_profile.ts + * 종단도 한 벌(계획서 24-1 · 24-2c) — 종단 보기 · 횡단 보기가 **같은 종단도**를 가운데 + * 아래쪽에 둔다. 도구(▲▼ 고치기 · 되돌리기 · 직선화 · 옮기기 · 확대 · 표 · 유토곡선 · 범례 · + * 뱃지)와 막기 규칙(최소 흙덮기 · 기울기 상한)은 보기와 무관하게 하나. + * + * 판 자리 둘 — 종단도는 자리만 내주고 판은 밖에서 만들어 끼운다(나중에 떼기 쉽게). + * · side 종단도 오른쪽 판(배수유역도 · sub7). `DesignSideFactory` 로 받는다. + * · overlay 종단도 위 겹침 판(유토곡선 · 표). 종단도가 직접 만든다. + * ========================================================================== */ + +import type { + DrainagePanel, + DrainagePanelCallbacks, +} from "../../B05_Profile/B05_Profile_UI_Drainage_Panel_Types"; + +/** 가운데 보기 — 종단 보기(3D + 종단도) · 횡단 보기(종단도 + 횡단 카드). */ +export type DesignView = "profile" | "cross"; + +/** + * 오른쪽 판을 만들 때 종단도가 넘겨 주는 것 — 판이 알릴 일(관 목록 · 유역 · 관 고름 · + * 우클릭 메뉴 항목)과 처음 보기. 판은 `onPipesChanged` 를 **반드시** 불러야 종단도가 + * 최소 흙덮기를 판정한다. + */ +export interface DesignSideHost extends DrainagePanelCallbacks { + projectId: string; + view: DesignView; +} + +/** + * 오른쪽 판(배수유역도). 종단도는 만든 직후 `load(projectId)` · 노선이 오면 `setRoute` · + * 구조물이 바뀌면 `setIntervalSpans` · 되돌리기에 `pipeChainages`/`setPipeChainages` · + * 보기가 바뀌면 `setView` · 걷을 때 `dispose` 를 부른다. 뿌리(`root`)는 종단 열 오른쪽에 붙는다. + */ +export type DesignSideBoard = DrainagePanel & { + /** 보기가 바뀌었다 — 횡단 보기에서도 켜고 끈다(판이 정함). */ + setView?: (view: DesignView) => void; +}; + +/** 오른쪽 판을 끼우는 함수 모양 — 종단도를 만들 때 한 번 부른다. */ +export type DesignSideFactory = (host: DesignSideHost) => DesignSideBoard; + +/** 위 겹침 판(유토곡선 · 표) — 종단 스크롤러와 가로 스크롤을 맞추는 떼었다 붙이는 판. */ +export interface DesignOverlayBoard { + overlay: HTMLElement; + handle: HTMLElement; + attachScrollSync: (scroller: HTMLElement) => void; +} + +/** 종단도를 만들 때 넘기는 것. */ +export interface DesignProfileContext { + projectId: string; + /** 처음 보기. */ + view: DesignView; + /** 오른쪽 판 — 없으면 판 없이 종단 열만. */ + side?: DesignSideFactory; +} + +/** 종단도 한 벌. */ +export interface DesignProfile { + root: HTMLElement; + /** 보기가 바뀌었다 — 종단도는 그대로 두고 판에만 알린다(다시 만들지 않음). */ + setView: (view: DesignView) => void; + dispose: () => void; +}