- 겹 표(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>
93 lines
3.4 KiB
TypeScript
93 lines
3.4 KiB
TypeScript
/* =============================================================================
|
|
* design_view_profile_3d_modal.ts
|
|
* 종단 보기 3D 를 **큰 모달**로(345-2). 3D 화면은 숨긴 자리(`park`)에 살고 [3D] 를 누르면 공용 큰
|
|
* 모달(`openModal({ wide })`) 몸으로 옮겨 붙는다 — 같은 노드라 보기 조작 줄 · [3D 업데이트] ·
|
|
* 3D 안 고름(측점 · 구조물 · 우클릭 더함)이 그대로 따라간다.
|
|
*
|
|
* 처음 열 때 3D 지형을 올린다(아직이면 로딩 원). 닫으면 숨긴 자리로 되돌려 `setActive(false)` —
|
|
* 그리기 루프 · 포인터 듣기만 멈추고 WebGL 문맥 · 지형은 살린다. 버림은 페이지를 떠날 때만.
|
|
* ========================================================================== */
|
|
|
|
import { mapToolButton } from "@ui/ui_template_map_tools";
|
|
import { openModal } from "@ui/ui_template_modal";
|
|
import { createProgressCircle } from "@ui/ui_template_progress";
|
|
|
|
export interface Viewer3dModalDeps {
|
|
viewer: { root: HTMLElement; setActive: (active: boolean) => void; dispose: () => void };
|
|
/** 처음 열 때 한 번 — 3D 지형 올리기(실패해도 모달은 열림). */
|
|
loadTerrain: () => Promise<void>;
|
|
/** 종단 보기가 보이는가 — 숨은 보기에서는 안 연다. */
|
|
visible: () => boolean;
|
|
/** 열 때마다(지형이 선 뒤) — 낡은 3D 길 모형 다시 짓기(345-4). */
|
|
onOpen?: () => void;
|
|
}
|
|
|
|
export function createViewer3dModal(deps: Viewer3dModalDeps) {
|
|
const { viewer } = deps;
|
|
const park = document.createElement("div");
|
|
park.className = "b05-route__3d-park";
|
|
park.hidden = true;
|
|
park.append(viewer.root);
|
|
viewer.setActive(false); // 닫힌 동안 그리기 0
|
|
let modal: { close: () => void } | null = null;
|
|
let terrain: Promise<void> | null = null;
|
|
|
|
const putBack = (): void => {
|
|
modal = null;
|
|
park.append(viewer.root);
|
|
viewer.setActive(false);
|
|
};
|
|
|
|
function open(): void {
|
|
if (modal || !deps.visible()) return;
|
|
modal = openModal({
|
|
title: "3D 보기",
|
|
closeLabel: "닫기",
|
|
wide: true,
|
|
dialogClass: "b05-route__3d-modal",
|
|
mount: (body) => {
|
|
body.classList.add("b05-route__3d-body");
|
|
body.append(viewer.root);
|
|
},
|
|
// 닫기 단추 · Esc · 바깥 누름 — 묻지 않고 숨긴 자리로 되돌린다.
|
|
beforeClose: () => {
|
|
putBack();
|
|
return true;
|
|
},
|
|
});
|
|
viewer.setActive(true);
|
|
if (!terrain) {
|
|
const progress = createProgressCircle({ label: "3D 지형을 불러오는 중…", overlay: true });
|
|
progress.set(null);
|
|
viewer.root.append(progress.root);
|
|
terrain = deps.loadTerrain().finally(() => progress.remove());
|
|
}
|
|
void terrain.then(() => modal && deps.onOpen?.()); // 그 사이 닫았으면 안 지음
|
|
}
|
|
|
|
/** 열려 있으면 닫는다 — 보기를 떠날 때 · 페이지를 떠날 때. */
|
|
function close(): void {
|
|
if (!modal) return;
|
|
const shown = modal;
|
|
putBack();
|
|
shown.close();
|
|
}
|
|
|
|
// 평면 도구줄 아이콘 단추(568-2) — 클래스는 가이드 촬영이 잡음.
|
|
const button = mapToolButton("view3d", { onClick: open }); // 마우스 글 = 공용 표(634-2)
|
|
button.classList.add("b05-route__3d-open");
|
|
|
|
return {
|
|
park,
|
|
button,
|
|
open,
|
|
close,
|
|
isOpen: () => modal !== null,
|
|
dispose(): void {
|
|
close();
|
|
viewer.dispose();
|
|
park.remove();
|
|
},
|
|
};
|
|
}
|