feat(488-3 DWG 불러오기): 삽입 탭 [DWG 불러오기](IMPORT) — 끌어다 놓기와 같은 서버 변환 · 원좌표 · 골라진 채 · 화면 맞춤 · 되돌리기 한 번 · 파일 입력 문서에 숨겨 붙임 · ByLayer 도형 = 레이어 색(B07 붙이기 · M02 불러오기 같은 _color) · 시험 catalog · test_b07_dxf_clip 한 건씩
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
* 오토캐드 도형 붙이기 — 두 길 모두 서버가 DXF 를 도형으로 바꿔 현재 도면에 원좌표 그대로 붙이고
|
||||
* 고른 상태로 둔다(되돌리기 한 번에 빠짐).
|
||||
* - 끌어다 놓기: 오토캐드 WBLOCK(DWG) · DXFOUT(DXF) 로 저장한 파일, 또는 도면 파일 통째.
|
||||
* 끄는 동안 `body.cad-file-dragging` 으로 흐린 테두리.
|
||||
* - 끌어다 놓기 · [삽입 → DWG 불러오기](IMPORT · 488): 오토캐드 WBLOCK(DWG) · DXFOUT(DXF) 로 저장한 파일,
|
||||
* 또는 도면 파일 통째 · 붙인 범위로 화면 맞춤. 끄는 동안 `body.cad-file-dragging` 으로 흐린 테두리.
|
||||
* - Ctrl+V: 시스템 클립보드 글이 DXF 면 같은 길 · 아니면 앱 안 붙여넣기(PASTECLIP).
|
||||
* 키 처리(`input-controller.ts`)는 Ctrl+V 의 기본 동작을 막지 않아 브라우저가 `paste` 를 쏜다 —
|
||||
* `paste` 이벤트의 글은 권한 없이 읽힘(iframe 안에서도).
|
||||
@@ -10,10 +10,14 @@
|
||||
import { toast } from 'react-toastify';
|
||||
import { runCommandInput } from '../commands/run-command';
|
||||
import { hasClipboardContent } from '../helpers/cad-clipboard';
|
||||
import { fitView } from '../drawControllers/fit-view';
|
||||
import { getEntitiesAndLayersFromJsonObject } from '../helpers/import-export-handlers/import-entities-from-json';
|
||||
import { changeView } from '../inputController/zoom-prompt';
|
||||
import {
|
||||
addEntities,
|
||||
getLayers,
|
||||
getScreenCanvasDrawController,
|
||||
getSelectedEntities,
|
||||
isDrawingReadOnly,
|
||||
setLayers,
|
||||
setSelectedEntityIds,
|
||||
@@ -73,6 +77,24 @@ function refuseReadOnly(): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
/** 붙인 것(골라진 채)이 화면에 다 보이게 — ZOOM 이전(P)으로 돌아감 */
|
||||
function fitToSelection(count: number): number {
|
||||
const picked = getSelectedEntities();
|
||||
const controller = getScreenCanvasDrawController();
|
||||
if (picked.length)
|
||||
changeView(() => {
|
||||
const { zoom, offset } = fitView(picked, controller.getCanvasSize());
|
||||
controller.setScreenScale(zoom);
|
||||
controller.setScreenOffset(offset);
|
||||
});
|
||||
return count;
|
||||
}
|
||||
|
||||
/** DWG · DXF 파일 → 지금 도면에 더함(원좌표 · 골라진 채 · 화면 맞춤 · 되돌리기 한 번) */
|
||||
export function importDrawingFile(file: File): void {
|
||||
if (!refuseReadOnly()) reportPaste(pasteDrawingFile(file).then(fitToSelection));
|
||||
}
|
||||
|
||||
export function registerDxfClipPaste(): void {
|
||||
document.addEventListener('paste', (event: ClipboardEvent) => {
|
||||
if ((event.target as HTMLElement | null)?.closest?.('input, textarea, select')) return;
|
||||
@@ -101,6 +123,6 @@ export function registerDxfClipPaste(): void {
|
||||
event.preventDefault();
|
||||
setDragging(false);
|
||||
const file = event.dataTransfer?.files[0];
|
||||
if (file && !refuseReadOnly()) reportPaste(pasteDrawingFile(file));
|
||||
if (file) importDrawingFile(file);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user