From 6937934fc1602265e64d615ee0b935b1dc4e3e2c Mon Sep 17 00:00:00 2001 From: ysCha Date: Fri, 12 Jun 2026 10:48:51 +0900 Subject: [PATCH] =?UTF-8?q?[1189=5F3]=20=EB=AA=A8=EB=93=88=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=EC=84=A4=EC=A0=95=20=EB=A7=88=EC=9A=B0=EC=8A=A4=20?= =?UTF-8?q?=EB=93=9C=EB=9E=98=EA=B7=B8=20=EC=9D=B4=EB=8F=99=20=EB=B9=84?= =?UTF-8?q?=ED=99=9C=EC=84=B1=ED=99=94=20=E2=80=94=20=EB=B3=B5=EC=88=98?= =?UTF-8?q?=EC=84=A0=ED=83=9D=C2=B7Del=20=EC=82=AD=EC=A0=9C=EB=8A=94=20?= =?UTF-8?q?=EC=9C=A0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useModule.js | 50 ----------------------------------- src/hooks/useCanvasEvent.js | 28 ++++---------------- 2 files changed, 5 insertions(+), 73 deletions(-) diff --git a/src/hooks/module/useModule.js b/src/hooks/module/useModule.js index 85d9aa3a..7f1a9ecc 100644 --- a/src/hooks/module/useModule.js +++ b/src/hooks/module/useModule.js @@ -1141,55 +1141,6 @@ export function useModule() { canvas.renderAll() } - // [MODULE-MULTI-SELECT 2026-06-10] 드래그 완료 후 지붕면 이탈/겹침 검증 → 위반 시 startPos 복원, 정상이면 확정 - const commitModuleDragMove = (target, startPos) => { - if (!canvas || !target) return - const isGroup = target.type === 'activeSelection' - const modules = isGroup - ? target.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE) - : target.name === POLYGON_TYPE.MODULE - ? [target] - : [] - if (modules.length === 0) return - - const movingIds = new Set(modules.map((module) => module.id)) - const objects = getObjects() - - const invalid = modules.some((module) => { - const surface = canvas.getObjects().find((obj) => obj.id === module.surfaceId && obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) - if (surface && isOutsideSurface(module, surface)) return true - const others = canvas - .getObjects() - .filter((obj) => obj.name === POLYGON_TYPE.MODULE && obj.surfaceId === module.surfaceId && !movingIds.has(obj.id)) - if (isOverlapOtherModules(module, others)) return true - if (isOverlapObjects(module, objects)) return true - return false - }) - - // 위반 시 드래그 시작 위치로 복원 (그룹/단일 공통 — 둘 다 left/top 평행이동) - if (invalid && startPos) { - target.set({ left: startPos.left, top: startPos.top }) - target.setCoords() - } - - // 그룹은 자식 좌표가 상대값이라 discard 로 절대좌표 베이킹. 단일은 이미 절대좌표라 선택 유지. - if (isGroup) { - canvas.discardActiveObject() - } - - const surfaceIds = [...new Set(modules.map((module) => module.surfaceId))] - surfaceIds.forEach((surfaceId) => recalculateAllModulesCoords(surfaceId)) - canvas.requestRenderAll() - - if (invalid) { - swalFire({ - title: getMessage('can.not.move.module'), - icon: 'error', - type: 'alert', - }) - } - } - /** * [PLAN-CORRUPT-RESTORE 2026-05-18] 손상 module 좌표 복원. * @@ -1329,7 +1280,6 @@ export function useModule() { moduleRoofRemove, alignModule, recalculateAllModulesCoords, - commitModuleDragMove, restoreCorruptedModules, } } diff --git a/src/hooks/useCanvasEvent.js b/src/hooks/useCanvasEvent.js index fc3b6e09..4293c15f 100644 --- a/src/hooks/useCanvasEvent.js +++ b/src/hooks/useCanvasEvent.js @@ -8,7 +8,6 @@ import { fontSelector } from '@/store/fontAtom' import { MENU, POLYGON_TYPE } from '@/common/common' import { useText } from '@/hooks/useText' import { usePolygon } from '@/hooks/usePolygon' -import { useModule } from '@/hooks/module/useModule' // 캔버스에 필요한 이벤트 export function useCanvasEvent() { @@ -23,7 +22,6 @@ export function useCanvasEvent() { const isManualModuleSetup = useRecoilValue(isManualModuleSetupState) const { changeCorridorDimensionText } = useText() const { setPolygonLinesActualSize } = usePolygon() - const { commitModuleDragMove } = useModule() // [MODULE-MULTI-SELECT 2026-06-10] 모듈 복수선택 refine 재진입 가드 (rebuild 중첩 방지) const refiningRef = useRef(false) @@ -61,7 +59,6 @@ export function useCanvasEvent() { canvas?.on('object:added', objectEvent.onChange) canvas?.on('object:added', objectEvent.addEvent) canvas?.on('object:modified', objectEvent.onChange) - canvas?.on('object:modified', handleModuleSelectionMoved) canvas?.on('object:removed', objectEvent.onChange) canvas?.on('selection:cleared', selectionEvent.cleared) canvas?.on('selection:created', selectionEvent.created) @@ -294,10 +291,10 @@ export function useCanvasEvent() { const active = canvas.getActiveObject() if (!active) return - // 단일 모듈 선택: 마우스 이동 가능하도록 이동잠금 해제 (회전·스케일은 잠금 유지). + // [MODULE-DRAG-DISABLE 2026-06-12] 단일 모듈 선택: 마우스 이동 잠금 유지(드래그 박스 복수선택·Del 삭제만 허용). 회전·스케일도 잠금. if (active.type !== 'activeSelection') { if (active.name === POLYGON_TYPE.MODULE) { - active.set({ lockMovementX: false, lockMovementY: false, lockRotation: true, lockScalingX: true, lockScalingY: true, hasControls: false }) + active.set({ lockMovementX: true, lockMovementY: true, lockRotation: true, lockScalingX: true, lockScalingY: true, hasControls: false }) canvas.requestRenderAll() } return @@ -317,11 +314,12 @@ export function useCanvasEvent() { refiningRef.current = false } + // [MODULE-DRAG-DISABLE 2026-06-12] 복수선택 그룹도 이동 잠금 유지(드래그 박스 선택·Del 삭제만 허용). const finalActive = canvas.getActiveObject() if (finalActive?.type === 'activeSelection') { finalActive.set({ - lockMovementX: false, - lockMovementY: false, + lockMovementX: true, + lockMovementY: true, lockScalingX: true, lockScalingY: true, lockRotation: true, @@ -331,22 +329,6 @@ export function useCanvasEvent() { canvas.requestRenderAll() } - // [MODULE-MULTI-SELECT 2026-06-10] object:modified 시 지붕면 경계 검증 → 위반이면 드래그 시작 좌표로 복원 - const handleModuleSelectionMoved = (e) => { - if (currentMenu !== MENU.MODULE_CIRCUIT_SETTING.BASIC_SETTING) return - const target = e?.target - if (!target) return - - const isGroup = target.type === 'activeSelection' - const isSingleModule = target.name === POLYGON_TYPE.MODULE - if (!isGroup && !isSingleModule) return - if (isGroup && !target.getObjects().some((obj) => obj.name === POLYGON_TYPE.MODULE)) return - - const original = e?.transform?.original - const startPos = original ? { left: original.left, top: original.top } : null - commitModuleDragMove(target, startPos) - } - const removeEventOnCanvas = () => { canvas?.off('object:added') canvas?.off('object:modified')