모듈 이동 리펙토링
This commit is contained in:
parent
12a3f8bb1a
commit
9bc00d9229
@ -36,86 +36,51 @@ export function useModule() {
|
|||||||
const { checkModuleDisjointObjects } = useModuleBasicSetting()
|
const { checkModuleDisjointObjects } = useModuleBasicSetting()
|
||||||
|
|
||||||
const moduleMove = (length, direction) => {
|
const moduleMove = (length, direction) => {
|
||||||
const checkModuleDisjointSurface = (squarePolygon, turfModuleSetupSurface) => {
|
|
||||||
return turf.booleanContains(turfModuleSetupSurface, squarePolygon) || turf.booleanWithin(squarePolygon, turfModuleSetupSurface)
|
|
||||||
}
|
|
||||||
|
|
||||||
const selectedObj = canvas.getActiveObjects() //선택된 객체들을 가져옴
|
const selectedObj = canvas.getActiveObjects() //선택된 객체들을 가져옴
|
||||||
const selectedIds = selectedObj.map((obj) => obj.id) // selectedObj의 ID 추출
|
const selectedIds = selectedObj.map((obj) => obj.id) // selectedObj의 ID 추출
|
||||||
|
|
||||||
canvas.discardActiveObject() //선택해제
|
canvas.discardActiveObject() //선택해제
|
||||||
|
|
||||||
const isSetupModules = canvas.getObjects().filter((obj) => obj.name === 'module' && !selectedIds.includes(obj.id)) // selectedObj에 없는 객체만 필터링
|
const isSetupModules = getOtherModules(selectedObj)
|
||||||
const selectedModules = canvas.getObjects().filter((obj) => selectedIds.includes(obj.id) && obj.name === 'module') //선택했던 객체들만 가져옴
|
const selectedModules = canvas.getObjects().filter((obj) => selectedIds.includes(obj.id) && obj.name === 'module') //선택했던 객체들만 가져옴
|
||||||
const setupSurface = canvas
|
const setupSurface = canvas
|
||||||
.getObjects()
|
.getObjects()
|
||||||
.filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE && obj.id === selectedModules[0].surfaceId)[0]
|
.filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE && obj.id === selectedModules[0].surfaceId)[0]
|
||||||
const isOverlapArray = []
|
let isWarning = false
|
||||||
const isInSurfaceArray = []
|
|
||||||
const isOverlapObjects = []
|
|
||||||
const objects = getObjects()
|
const objects = getObjects()
|
||||||
|
|
||||||
if (selectedModules) {
|
if (selectedModules) {
|
||||||
canvas.remove(...selectedModules)
|
|
||||||
selectedModules.forEach((module) => {
|
selectedModules.forEach((module) => {
|
||||||
module.set({
|
const { top, left } = getPosotion(module, direction, length, false)
|
||||||
originCoords: {
|
module.originCoords = {
|
||||||
left: module.left,
|
left: module.left,
|
||||||
top: module.top,
|
top: module.top,
|
||||||
},
|
fill: module.fill,
|
||||||
})
|
|
||||||
|
|
||||||
if (direction === 'up') {
|
|
||||||
module.set({ ...module, top: module.top - Number(length) })
|
|
||||||
} else if (direction === 'down') {
|
|
||||||
module.set({ ...module, top: module.top + Number(length) })
|
|
||||||
} else if (direction === 'left') {
|
|
||||||
module.set({ ...module, left: module.left - Number(length) })
|
|
||||||
} else if (direction === 'right') {
|
|
||||||
module.set({ ...module, left: module.left + Number(length) })
|
|
||||||
}
|
}
|
||||||
|
module.set({ top, left })
|
||||||
module.setCoords()
|
module.setCoords()
|
||||||
|
|
||||||
|
if (isOverlapOtherModules(module, isSetupModules) || isOverlapObjects(module, objects) || isOutsideSurface(module, setupSurface)) {
|
||||||
|
isWarning = true
|
||||||
|
module.set({ fill: 'red' })
|
||||||
|
}
|
||||||
canvas.renderAll()
|
canvas.renderAll()
|
||||||
|
|
||||||
//다른 모듈과 겹치는지 확인하는 로직
|
|
||||||
const isOverlap = isSetupModules.some((isSetupModule) =>
|
|
||||||
turf.booleanOverlap(polygonToTurfPolygon(module, true), polygonToTurfPolygon(isSetupModule, true)),
|
|
||||||
)
|
|
||||||
isOverlapArray.push(isOverlap)
|
|
||||||
|
|
||||||
const turfModuleSetupSurface = polygonToTurfPolygon(setupSurface, true)
|
|
||||||
const turfModule = polygonToTurfPolygon(module, true)
|
|
||||||
|
|
||||||
//나갔는지 확인하는 로직
|
|
||||||
const isInSurface = turf.booleanContains(turfModuleSetupSurface, turfModule) || turf.booleanWithin(turfModule, turfModuleSetupSurface)
|
|
||||||
isInSurfaceArray.push(isInSurface)
|
|
||||||
isOverlapObjects.push(!checkModuleDisjointObjects(polygonToTurfPolygon(module, true), objects))
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const isNotOverlap = isOverlapArray.some((isOverlap) => isOverlap) // true면 겹침
|
if (isWarning) {
|
||||||
const isNotOutSurface = isInSurfaceArray.every((isOutSurface) => isOutSurface) //false면 밖으로 나감
|
|
||||||
|
|
||||||
//안겹치고 안나갔으면 이동시킨다 아니면 원래 위치로 돌려놓는다
|
|
||||||
if (isNotOverlap || !isNotOutSurface || isOverlapObjects.some((isOverlap) => isOverlap)) {
|
|
||||||
swalFire({
|
swalFire({
|
||||||
title: isNotOverlap
|
title: getMessage('can.not.move.module'),
|
||||||
? '겹치는 모듈이 있습니다.'
|
|
||||||
: isOverlapObjects.some((isOverlap) => isOverlap)
|
|
||||||
? '모듈이 오브젝트와 겹칩니다.'
|
|
||||||
: '영역 밖',
|
|
||||||
icon: 'error',
|
icon: 'error',
|
||||||
type: 'alert',
|
type: 'alert',
|
||||||
confirmFn: () => {
|
confirmFn: () => {
|
||||||
selectedModules.forEach((module) => {
|
selectedModules.forEach((module) => {
|
||||||
module.set({ ...module, left: module.originCoords.left, top: module.originCoords.top })
|
module.set({ left: module.originCoords.left, top: module.originCoords.top, fill: module.originCoords.fill })
|
||||||
module.setCoords()
|
module.setCoords()
|
||||||
})
|
})
|
||||||
|
canvas.renderAll()
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas.add(...selectedModules)
|
|
||||||
canvas.renderAll()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user