Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_DrawingToArea.ts
T
eomsangdonandClaude Opus 5.5 16ac946212 feat(m02): 상세 이동 단추 · 도면 상세에서 면적산출로 보내기(105-2 · 105-4)
- 상세 머리 제목과 ? 사이 [도면][일위대가][면적산출] — 지금 것 눌림 · 문서 없는 열은 꺼짐 · 뒤로 단추와 같은 보임
- 구조물 도면 상세 머리 [면적산출로 보내기] · TOAREA 듣기 — 같은 열 면적 상세로 옮겨 가 넣을 자리 창
- 미저장 도면이면 물음 · 읽기 · 프로젝트 층 막음 · 저장은 사용자 [저장]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015KYZ2HWWdUwZWYnn3tQz7X
2026-10-08 16:22:20 +09:00

49 lines
2.4 KiB
TypeScript

/* =============================================================================
* M02_MasterTemplete_DrawingToArea.ts
* 구조물 도면 상세 → 같은 열 면적산출 상세(105-2) — 머리 [면적산출로 보내기] = CAD 에 고른 범위 요청
* (`EXPORT_TABLE_REQUEST`) · 받은 표 자료(`EXPORT_TABLE` · CAD 명령 TOAREA 도 같은 길)를 `onTable` 로.
* 옮겨 가기 · 넣을 자리 창은 부른 쪽(`UI_Main` → `importDrawingTable`) · 저장은 사용자 [저장].
* 쓸 수 없는 면적(읽기 · 프로젝트 층)이면 단추 없음 · TOAREA 는 알림만.
* ========================================================================== */
import { createButton, showToast } from "@ui/ui_template_elements";
import { EXPORT_TABLE, EXPORT_TABLE_REQUEST } from "./M02_MasterTemplete_AreaDrawing";
import type { DrawingTable } from "./M02_MasterTemplete_AreaFromDrawing";
const TEXT = {
send: "면적산출로 보내기",
sendTip:
"도면에서 고른 범위(표 · 선으로 그린 표 · 글)를 같은 열 면적산출로 옮겨 감 — 새 시트 또는 고른 칸부터 · 연동 아님",
blocked: "이 층은 면적산출을 고칠 수 없음 — 보내지 않음",
};
/** `host` = 도면 상세 칸(iframe 이 든 곳) · `slot` = 머리 칸 · 떼는 함수를 돌려줌 */
export function attachDrawingToArea(
host: HTMLElement,
slot: HTMLElement,
onTable: ((table: DrawingTable) => void) | null,
): () => void {
const frame = (): HTMLIFrameElement | null => host.querySelector("iframe");
const send = createButton({ label: TEXT.send, variant: "ghost" });
send.title = TEXT.sendTip;
send.dataset.drawingToArea = "";
send.addEventListener("click", () =>
frame()?.contentWindow?.postMessage({ type: EXPORT_TABLE_REQUEST }, window.location.origin),
);
if (onTable) slot.append(send);
const onMessage = (event: MessageEvent): void => {
const win = frame()?.contentWindow;
if (!win || event.source !== win || event.origin !== window.location.origin) return;
const data = event.data as { type?: string; table?: DrawingTable } | null;
if (data?.type !== EXPORT_TABLE || !data.table) return;
if (onTable) onTable(data.table);
else showToast(TEXT.blocked, "info");
};
window.addEventListener("message", onMessage);
return () => {
window.removeEventListener("message", onMessage);
send.remove();
};
}