/* ============================================================================= * B05_Profile/logic/B05_Profile_ContourLock.ts * 평면 등고선 고정(353-2) — 고른 높이 하나를 쥐고, 잠긴 동안 다른 지정을 막는 규칙. * * 높이값으로 쥔다(가닥 번호는 지형을 바꾸면 달라짐) · 페이지 동안만(저장 안 함). * 순수 계산 — 화면 · three · fetch · sessionStorage 없음. 단추는 `B05_Profile_UI_RouteEdit_ContourLock`. * ========================================================================== */ /** 가닥마다 높이(모르면 null). */ export type ContourLevels = ReadonlyArray; /** 자물쇠 단추 — 보일지 · 눌린 모양인지. */ export interface LockButtonState { visible: boolean; pressed: boolean; } /** 그 높이의 첫 가닥 번호 — 없으면 -1(지형을 바꾼 뒤 잠근 높이 다시 짚기). */ export function featureOfLevel(levels: ContourLevels, level: number | null): number { if (level === null) return -1; return levels.findIndex((value) => value === level); } /** 커서 아래 가닥 높이 · 잠근 높이 → 단추 — 안 잠김 = 높이 있는 가닥 위에서 · 잠김 = 그 높이 위에서만. */ export function lockButtonState( hoverLevel: number | null, lockedLevel: number | null, ): LockButtonState { if (lockedLevel !== null) return { visible: hoverLevel === lockedLevel, pressed: true }; return { visible: hoverLevel !== null, pressed: false }; } /** 단추 누름 — 잠김이면 풂(null) · 아니면 그 가닥 높이로 잠금. */ export function toggleLock(lockedLevel: number | null, targetLevel: number | null): number | null { return lockedLevel !== null ? null : targetLevel; } /** 잠긴 동안은 고른 가닥이 안 바뀜(다른 가닥 · 빈 곳 눌러도). */ export const canPickContour = (lockedLevel: number | null): boolean => lockedLevel === null;