- 겹 표(map_layer_list) = 그룹1 22 줄 표 차례 · title = 호버제목 · group(수계망도 · 도로 · 토지·건물 · 제한·재해) · pages · 숨김 표 걷음 · 도로300m 한 줄(「도로」 묶음 · 기능 남김) - 겹 줄(map_layer_bar) = 단독 넷 | 묶음 넷(여럿 고르기 메뉴 · 켠 수 배지 · 안 닫힘) | 그래픽 카드 · sync 가 단추 · 메뉴 줄 막힘 · 글을 맞춤(why = 페이지 까닭) - 도구 표(map_toolbar) = 그룹2 17 줄 title · mapToolGroups 가 글을 표로 맞춤 · 기본 단추 생성 · 지형 칩 막힘 「수치지형도/라이다 — 까닭」 - 띠 = 한 자료 · 겹 둘(GL fillEdge 거름 · 옛 캔버스 · 범례 줄 따로) · B05 띠 받기(D03 과 같은 서버 길 · bandCollection 공용) - D03 = 겹 줄 · 도구줄 한 행(createMapToolRow) · 222px 기댐 · 줄바꿈 CSS 걷음 · 측점 · 기울기 호버 덮어쓰기 걷음 · LAS 올리기 호버 걷음 - B05 = 세로 두 줄 → 한 행 · 호버 덮어쓰기 걷음(도구줄 · 1m 등고선 · 3D · 추천) · 겹 막힘 querySelector 덮어쓰기 → 공용 sync · 임도(업로드) 보임 + 「받은 임도 자료 없음」 막힘 · 스냅 간격 날 select → 고르기 메뉴(하나) - 켬끔 기억 열쇠 · 측점 · 기울기 처음 값 · 그래픽 카드 취향 열쇠 둘 그대로 - 낡은 시험 고침(568_1 · 622_2 · 624_2 · 624_3 · 553_4 · 625_draw · b05_routeedit_initial · 626_3 · 390_4 · 346_2 · 353_1 · 581_2 · 584_1 · 584_3) — 표 꼴 row() · 호버 글 = 표 · 한 행 · 고르기 메뉴로 바뀐 글을 잡음 · 새 지킴 634_2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
2.9 KiB
TypeScript
66 lines
2.9 KiB
TypeScript
/* =============================================================================
|
|
* map_terrain_chip.ts
|
|
* 공용 지도 지형 칩(PLAN 624-2 · 요구 530 · 결정 A④ · A⑤ · D2) — 도구줄 끝 분할 고르기 하나: 수치지형도 · 라이다.
|
|
* 마우스 글 = 도구줄 표 호버제목(「수치지형도/라이다」 · 634-2) · 확인창은 B05 몫.
|
|
* 없는 원천 = 막힘 + 「제목 — 까닭」(D03 라이다 = D 프로젝트에 LAS 올린 뒤 · 624-4).
|
|
* 화면 칩만 — 바꾸는 일(서버 원천 인자 624-1 · B05 설계 지형 바꿈 626-1)은 `onChange` 로 페이지가 붙임.
|
|
* 쓰는 법 = `createTerrainChip({ page: "d03", value: "sheet", have: ["sheet"] })` → `{ root, set, setHave }` · root 를 도구줄 `terrain` 칸에.
|
|
* ========================================================================== */
|
|
|
|
import { createSegment } from "@ui/ui_template_segment";
|
|
import type { MapPage } from "./map_layer_list";
|
|
import { mapToolTitle } from "./map_toolbar";
|
|
|
|
/** 서버 겹 길 `terrain=` 값과 같음(624-1 · 빈 값 = 설계 지형). */
|
|
export type TerrainSource = "sheet" | "lidar";
|
|
|
|
export const TERRAIN_NAMES: Record<TerrainSource, string> = {
|
|
sheet: "수치지형도",
|
|
lidar: "라이다",
|
|
};
|
|
|
|
/** 막힘 까닭(마우스 글 = 「수치지형도/라이다 — 까닭」 · 요구 546). */
|
|
const MISSING: Record<TerrainSource, string> = {
|
|
sheet: "이 프로젝트 범위에 도엽 지형 없음",
|
|
lidar: "올린 LAS 없음",
|
|
};
|
|
const TITLE = mapToolTitle("terrain");
|
|
|
|
export interface TerrainChip {
|
|
root: HTMLElement;
|
|
/** 고름을 바꿈(onChange 는 안 부름). */
|
|
set: (value: TerrainSource) => void;
|
|
/** 고를 수 있는 원천 — 없는 것은 막힘. */
|
|
setHave: (have: readonly TerrainSource[]) => void;
|
|
}
|
|
|
|
export function createTerrainChip(opts: {
|
|
page: MapPage;
|
|
value: TerrainSource;
|
|
have: readonly TerrainSource[];
|
|
onChange?: (value: TerrainSource) => void;
|
|
}): TerrainChip {
|
|
const sources = Object.keys(TERRAIN_NAMES) as TerrainSource[];
|
|
const segment = createSegment({
|
|
options: sources.map((value) => ({ value, label: TERRAIN_NAMES[value] })),
|
|
value: opts.value,
|
|
size: 32,
|
|
ariaLabel: TITLE,
|
|
onChange: (value) => opts.onChange?.(value as TerrainSource),
|
|
});
|
|
const root = segment.root;
|
|
root.dataset.act = "terrain";
|
|
root.title = TITLE;
|
|
const setHave = (have: readonly TerrainSource[]): void => {
|
|
for (const value of sources) {
|
|
const item = root.querySelector<HTMLButtonElement>(`[data-value="${value}"]`)!;
|
|
item.disabled = !have.includes(value);
|
|
// 열림 = 글 없음(칩 글 「수치지형도/라이다」 그대로) · 막힘 = 「제목 — 까닭」
|
|
if (item.disabled) item.title = `${TITLE} — ${TERRAIN_NAMES[value]} ${MISSING[value]}`;
|
|
else item.removeAttribute("title");
|
|
}
|
|
};
|
|
setHave(opts.have);
|
|
return { root, set: (value) => segment.set(value), setHave };
|
|
}
|