[1189_3] 모듈 기본설정 마우스 드래그 이동 비활성화 — 복수선택·Del 삭제는 유지
This commit is contained in:
parent
1cb039a741
commit
6937934fc1
@ -1141,55 +1141,6 @@ export function useModule() {
|
|||||||
canvas.renderAll()
|
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 좌표 복원.
|
* [PLAN-CORRUPT-RESTORE 2026-05-18] 손상 module 좌표 복원.
|
||||||
*
|
*
|
||||||
@ -1329,7 +1280,6 @@ export function useModule() {
|
|||||||
moduleRoofRemove,
|
moduleRoofRemove,
|
||||||
alignModule,
|
alignModule,
|
||||||
recalculateAllModulesCoords,
|
recalculateAllModulesCoords,
|
||||||
commitModuleDragMove,
|
|
||||||
restoreCorruptedModules,
|
restoreCorruptedModules,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import { fontSelector } from '@/store/fontAtom'
|
|||||||
import { MENU, POLYGON_TYPE } from '@/common/common'
|
import { MENU, POLYGON_TYPE } from '@/common/common'
|
||||||
import { useText } from '@/hooks/useText'
|
import { useText } from '@/hooks/useText'
|
||||||
import { usePolygon } from '@/hooks/usePolygon'
|
import { usePolygon } from '@/hooks/usePolygon'
|
||||||
import { useModule } from '@/hooks/module/useModule'
|
|
||||||
|
|
||||||
// 캔버스에 필요한 이벤트
|
// 캔버스에 필요한 이벤트
|
||||||
export function useCanvasEvent() {
|
export function useCanvasEvent() {
|
||||||
@ -23,7 +22,6 @@ export function useCanvasEvent() {
|
|||||||
const isManualModuleSetup = useRecoilValue(isManualModuleSetupState)
|
const isManualModuleSetup = useRecoilValue(isManualModuleSetupState)
|
||||||
const { changeCorridorDimensionText } = useText()
|
const { changeCorridorDimensionText } = useText()
|
||||||
const { setPolygonLinesActualSize } = usePolygon()
|
const { setPolygonLinesActualSize } = usePolygon()
|
||||||
const { commitModuleDragMove } = useModule()
|
|
||||||
// [MODULE-MULTI-SELECT 2026-06-10] 모듈 복수선택 refine 재진입 가드 (rebuild 중첩 방지)
|
// [MODULE-MULTI-SELECT 2026-06-10] 모듈 복수선택 refine 재진입 가드 (rebuild 중첩 방지)
|
||||||
const refiningRef = useRef(false)
|
const refiningRef = useRef(false)
|
||||||
|
|
||||||
@ -61,7 +59,6 @@ export function useCanvasEvent() {
|
|||||||
canvas?.on('object:added', objectEvent.onChange)
|
canvas?.on('object:added', objectEvent.onChange)
|
||||||
canvas?.on('object:added', objectEvent.addEvent)
|
canvas?.on('object:added', objectEvent.addEvent)
|
||||||
canvas?.on('object:modified', objectEvent.onChange)
|
canvas?.on('object:modified', objectEvent.onChange)
|
||||||
canvas?.on('object:modified', handleModuleSelectionMoved)
|
|
||||||
canvas?.on('object:removed', objectEvent.onChange)
|
canvas?.on('object:removed', objectEvent.onChange)
|
||||||
canvas?.on('selection:cleared', selectionEvent.cleared)
|
canvas?.on('selection:cleared', selectionEvent.cleared)
|
||||||
canvas?.on('selection:created', selectionEvent.created)
|
canvas?.on('selection:created', selectionEvent.created)
|
||||||
@ -294,10 +291,10 @@ export function useCanvasEvent() {
|
|||||||
const active = canvas.getActiveObject()
|
const active = canvas.getActiveObject()
|
||||||
if (!active) return
|
if (!active) return
|
||||||
|
|
||||||
// 단일 모듈 선택: 마우스 이동 가능하도록 이동잠금 해제 (회전·스케일은 잠금 유지).
|
// [MODULE-DRAG-DISABLE 2026-06-12] 단일 모듈 선택: 마우스 이동 잠금 유지(드래그 박스 복수선택·Del 삭제만 허용). 회전·스케일도 잠금.
|
||||||
if (active.type !== 'activeSelection') {
|
if (active.type !== 'activeSelection') {
|
||||||
if (active.name === POLYGON_TYPE.MODULE) {
|
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()
|
canvas.requestRenderAll()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@ -317,11 +314,12 @@ export function useCanvasEvent() {
|
|||||||
refiningRef.current = false
|
refiningRef.current = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [MODULE-DRAG-DISABLE 2026-06-12] 복수선택 그룹도 이동 잠금 유지(드래그 박스 선택·Del 삭제만 허용).
|
||||||
const finalActive = canvas.getActiveObject()
|
const finalActive = canvas.getActiveObject()
|
||||||
if (finalActive?.type === 'activeSelection') {
|
if (finalActive?.type === 'activeSelection') {
|
||||||
finalActive.set({
|
finalActive.set({
|
||||||
lockMovementX: false,
|
lockMovementX: true,
|
||||||
lockMovementY: false,
|
lockMovementY: true,
|
||||||
lockScalingX: true,
|
lockScalingX: true,
|
||||||
lockScalingY: true,
|
lockScalingY: true,
|
||||||
lockRotation: true,
|
lockRotation: true,
|
||||||
@ -331,22 +329,6 @@ export function useCanvasEvent() {
|
|||||||
canvas.requestRenderAll()
|
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 = () => {
|
const removeEventOnCanvas = () => {
|
||||||
canvas?.off('object:added')
|
canvas?.off('object:added')
|
||||||
canvas?.off('object:modified')
|
canvas?.off('object:modified')
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user