/** * 화면 검증용 상태 조회 창구 — 브라우저 콘솔·자동화 스크립트가 * window.__aisloCad로 현재 객체·도면층·선택을 읽는다. 앱 동작에는 관여하지 않는다. */ import { getDesignMeta, getEntities, getHighlightedEntityIds, getLayers, getSelectedEntityIds, getScreenCanvasDrawController, getSnapPoint, isDrawingDirty, isDrawingReadOnly, } from '../state'; import { Point } from '@flatten-js/core'; import { isEntityHidden } from './visibility'; export function registerCadDebugHook(): void { (window as unknown as Record).__aisloCad = { entities: () => getEntities().map((entity) => { const box = entity.getBoundingBox(); return { id: entity.id, type: entity.getType(), layerId: entity.layerId, groupId: entity.groupId ?? null, opacity: entity.opacity ?? null, hidden: isEntityHidden(entity), color: entity.lineColor, box: [ Math.round(box.xmin), Math.round(box.ymin), Math.round(box.xmax), Math.round(box.ymax), ], }; }), layers: () => getLayers(), selection: () => getSelectedEntityIds(), // 마우스 위치의 객체 스냅점 — 잠금 도면층(도각)이 스냅에 끼는지 검증할 때 읽는다. snap: () => getSnapPoint(), // 마우스가 스친 객체 — 잠금층(도각·등고선)이 밝아지는지 수치로 본다. highlighted: () => getHighlightedEntityIds(), // 확정 도면의 편집 잠금과 미저장 표시 — 화면 검증이 상태를 직접 읽는다. readOnly: () => isDrawingReadOnly(), dirty: () => isDrawingDirty(), meta: () => getDesignMeta(), // 세계 좌표 → 화면 좌표. 그림·글자가 "제 자리에 그려졌나"를 픽셀로 판정할 때 쓴다. screen: (x: number, y: number) => { const point = getScreenCanvasDrawController().worldToTarget(new Point(x, y)); return { x: point.x, y: point.y }; }, }; }