/* ============================================================================= * 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); } /** 누른 가닥 높이 · 잠근 높이 · 고른 가닥인지 → 단추(366-1) — 안 잠김 = 높이 있는 고른 가닥을 * 누를 때만 · 잠김 = 잠근 높이의 아무 가닥을 누를 때(풀기). 지나가기만 하면 안 뜸. */ export function lockButtonState( hitLevel: number | null, lockedLevel: number | null, selected: boolean, ): LockButtonState { if (lockedLevel !== null) return { visible: hitLevel === lockedLevel, pressed: true }; return { visible: hitLevel !== null && selected, 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;