자동 설치 작업중
This commit is contained in:
parent
2f1d0f3b0e
commit
dc717b051a
@ -434,107 +434,7 @@ export function useModuleBasicSetting() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const moduleSetupArray = []
|
const moduleOptions = {
|
||||||
moduleSetupSurfaces.forEach((moduleSetupSurface, index) => {
|
|
||||||
moduleSetupSurface.fire('mousedown')
|
|
||||||
|
|
||||||
const surfaceMaxLines = findSetupSurfaceMaxLines(moduleSetupSurface)
|
|
||||||
|
|
||||||
let maxLengthLine = moduleSetupSurface.lines.reduce((acc, cur) => {
|
|
||||||
return acc.length > cur.length ? acc : cur
|
|
||||||
})
|
|
||||||
|
|
||||||
const turfModuleSetupSurface = polygonToTurfPolygon(moduleSetupSurface) //폴리곤을 turf 객체로 변환
|
|
||||||
|
|
||||||
const containsBatchObjects = batchObjects.filter((batchObject) => {
|
|
||||||
let convertBatchObject
|
|
||||||
|
|
||||||
if (batchObject.type === 'group') {
|
|
||||||
//도머는 그룹형태임
|
|
||||||
convertBatchObject = batchObjectGroupToTurfPolygon(batchObject)
|
|
||||||
} else {
|
|
||||||
//개구, 그림자
|
|
||||||
batchObject.set({
|
|
||||||
points: rectToPolygon(batchObject),
|
|
||||||
})
|
|
||||||
canvas?.renderAll() // set된걸 바로 적용하기 위해
|
|
||||||
convertBatchObject = polygonToTurfPolygon(batchObject) //rect를 폴리곤으로 변환 -> turf 폴리곤으로 변환
|
|
||||||
}
|
|
||||||
|
|
||||||
// 폴리곤 안에 도머 폴리곤이 포함되어있는지 확인해서 반환하는 로직
|
|
||||||
return turf.booleanContains(turfModuleSetupSurface, convertBatchObject) || turf.booleanWithin(convertBatchObject, turfModuleSetupSurface)
|
|
||||||
})
|
|
||||||
|
|
||||||
let difference = turfModuleSetupSurface //기본 객체(면형상)
|
|
||||||
|
|
||||||
if (containsBatchObjects.length > 0) {
|
|
||||||
//turf로 도머를 제외시키는 로직
|
|
||||||
for (let i = 0; i < containsBatchObjects.length; i++) {
|
|
||||||
let convertBatchObject
|
|
||||||
if (containsBatchObjects[i].type === 'group') {
|
|
||||||
convertBatchObject = batchObjectGroupToTurfPolygon(containsBatchObjects[i])
|
|
||||||
} else {
|
|
||||||
convertBatchObject = polygonToTurfPolygon(containsBatchObjects[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let width = maxLengthLine.flowDirection === 'east' || maxLengthLine.flowDirection === 'west' ? 172.2 : 113.4
|
|
||||||
let height = maxLengthLine.flowDirection === 'east' || maxLengthLine.flowDirection === 'west' ? 113.4 : 172.2
|
|
||||||
|
|
||||||
//배치면때는 방향쪽으로 패널이 넓게 누워져야함
|
|
||||||
if (moduleSetupSurface.flowDirection !== undefined) {
|
|
||||||
width = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 172.2 : 113.4
|
|
||||||
height = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 113.4 : 172.2
|
|
||||||
}
|
|
||||||
|
|
||||||
let square
|
|
||||||
let startPoint, endPoint
|
|
||||||
|
|
||||||
if (setupLocation === 'eaves') {
|
|
||||||
if (moduleSetupSurface.flowDirection === 'south') {
|
|
||||||
startPoint = flowModuleLine.find((obj) => obj.target === 'bottom')
|
|
||||||
endPoint = flowModuleLine.find((obj) => obj.target === 'top')
|
|
||||||
const totalHeight = endPoint.y1 - startPoint.y1
|
|
||||||
const diffHeight = Math.abs(totalHeight / height)
|
|
||||||
let leftMargin = 0
|
|
||||||
let bottomMargin = 0
|
|
||||||
|
|
||||||
for (let i = 0; i < diffHeight; i++) {
|
|
||||||
leftMargin = i === 0 ? 1 : 0
|
|
||||||
bottomMargin = i === 0 ? 0 : 1
|
|
||||||
|
|
||||||
square = [
|
|
||||||
[startPoint.x1 + leftMargin, startPoint.y1 - height - bottomMargin],
|
|
||||||
[startPoint.x1 + leftMargin, startPoint.y1 - bottomMargin],
|
|
||||||
[startPoint.x1 + leftMargin + width, startPoint.y1 - bottomMargin],
|
|
||||||
[startPoint.x1 + leftMargin + width, startPoint.y1 - height - bottomMargin],
|
|
||||||
[startPoint.x1 + leftMargin, startPoint.y1 - height - bottomMargin],
|
|
||||||
]
|
|
||||||
|
|
||||||
const squarePolygon = turf.polygon([square])
|
|
||||||
|
|
||||||
//설치면 안에 있는지 확인
|
|
||||||
const disjointFromTrestle =
|
|
||||||
turf.booleanContains(turfModuleSetupSurface, squarePolygon) || turf.booleanWithin(squarePolygon, turfModuleSetupSurface)
|
|
||||||
|
|
||||||
if (disjointFromTrestle) {
|
|
||||||
let turfCoordnates = squarePolygon.geometry.coordinates[0].slice(0, -1)
|
|
||||||
const points = turfCoordnates.map((coord) => ({ x: coord[0], y: coord[1] }))
|
|
||||||
|
|
||||||
if (containsBatchObjects.length > 0) {
|
|
||||||
let convertBatchObject
|
|
||||||
//도머가 있으면 적용되는 로직
|
|
||||||
const isDisjoint = containsBatchObjects.every((batchObject) => {
|
|
||||||
if (batchObject.type === 'group') {
|
|
||||||
convertBatchObject = batchObjectGroupToTurfPolygon(batchObject)
|
|
||||||
} else {
|
|
||||||
convertBatchObject = polygonToTurfPolygon(batchObject)
|
|
||||||
}
|
|
||||||
return turf.booleanDisjoint(squarePolygon, convertBatchObject) //도머가 여러개일수있으므로 겹치는게 있다면...
|
|
||||||
})
|
|
||||||
if (isDisjoint) {
|
|
||||||
const tempModule = new QPolygon(points, {
|
|
||||||
fill: '#BFFD9F',
|
fill: '#BFFD9F',
|
||||||
stroke: 'black',
|
stroke: 'black',
|
||||||
strokeWidth: 0.1,
|
strokeWidth: 0.1,
|
||||||
@ -547,43 +447,184 @@ export function useModuleBasicSetting() {
|
|||||||
opacity: 0.8,
|
opacity: 0.8,
|
||||||
parentId: moduleSetupSurface.parentId,
|
parentId: moduleSetupSurface.parentId,
|
||||||
name: 'module',
|
name: 'module',
|
||||||
})
|
|
||||||
tempModule.setViewLengthText(false)
|
|
||||||
canvas?.add(tempModule)
|
|
||||||
moduleSetupArray.push(tempModule)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//선택된 지붕안에 오브젝트(도머, 개구등)이 있는지 확인하는 로직 포함되면 배열 반환
|
||||||
|
const objectsIncludeSurface = (turfModuleSetupSurface) => {
|
||||||
|
let containsBatchObjects = []
|
||||||
|
containsBatchObjects = batchObjects.filter((batchObject) => {
|
||||||
|
let convertBatchObject
|
||||||
|
|
||||||
|
if (batchObject.type === 'group') {
|
||||||
|
//도머는 그룹형태임
|
||||||
|
convertBatchObject = batchObjectGroupToTurfPolygon(batchObject)
|
||||||
} else {
|
} else {
|
||||||
//도머가 없을땐 그냥 그림
|
//개구, 그림자
|
||||||
const tempModule = new QPolygon(points, {
|
batchObject.set({ points: rectToPolygon(batchObject) })
|
||||||
fill: '#BFFD9F',
|
canvas?.renderAll() // set된걸 바로 적용하기 위해
|
||||||
stroke: 'black',
|
convertBatchObject = polygonToTurfPolygon(batchObject) //rect를 폴리곤으로 변환 -> turf 폴리곤으로 변환
|
||||||
selectable: true, // 선택 가능하게 설정
|
}
|
||||||
lockMovementX: true, // X 축 이동 잠금
|
|
||||||
lockMovementY: true, // Y 축 이동 잠금
|
// 폴리곤 안에 도머 폴리곤이 포함되어있는지 확인해서 반환하는 로직
|
||||||
lockRotation: true, // 회전 잠금
|
return turf.booleanContains(turfModuleSetupSurface, convertBatchObject) || turf.booleanWithin(convertBatchObject, turfModuleSetupSurface)
|
||||||
lockScalingX: true, // X 축 크기 조정 잠금
|
|
||||||
lockScalingY: true, // Y 축 크기 조정 잠금
|
|
||||||
opacity: 0.8,
|
|
||||||
parentId: moduleSetupSurface.parentId,
|
|
||||||
name: 'module',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
return containsBatchObjects
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 도머나 개구가 모듈에 걸치는지 확인하는 로직
|
||||||
|
* @param {*} squarePolygon
|
||||||
|
* @param {*} containsBatchObjects
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const checkModuleDisjointObjects = (squarePolygon, containsBatchObjects) => {
|
||||||
|
let isDisjoint = false
|
||||||
|
|
||||||
|
if (containsBatchObjects.length > 0) {
|
||||||
|
let convertBatchObject
|
||||||
|
//도머가 있으면 적용되는 로직
|
||||||
|
isDisjoint = containsBatchObjects.every((batchObject) => {
|
||||||
|
if (batchObject.type === 'group') {
|
||||||
|
convertBatchObject = batchObjectGroupToTurfPolygon(batchObject)
|
||||||
|
} else {
|
||||||
|
convertBatchObject = polygonToTurfPolygon(batchObject)
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 도머가 여러개일수있으므로 겹치는게 있다면...
|
||||||
|
* 안겹치는지 확인하는 로직이라 안겹치면 true를 반환
|
||||||
|
*/
|
||||||
|
return turf.booleanDisjoint(squarePolygon, convertBatchObject)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
isDisjoint = true
|
||||||
|
}
|
||||||
|
return isDisjoint
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 배치면 안에 있는지 확인
|
||||||
|
* @param {*} squarePolygon
|
||||||
|
* @param {*} turfModuleSetupSurface
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const checkModuleDisjointSurface = (squarePolygon, turfModuleSetupSurface) => {
|
||||||
|
return turf.booleanContains(turfModuleSetupSurface, squarePolygon) || turf.booleanWithin(squarePolygon, turfModuleSetupSurface)
|
||||||
|
}
|
||||||
|
|
||||||
|
moduleSetupSurfaces.forEach((moduleSetupSurface, index) => {
|
||||||
|
moduleSetupSurface.fire('mousedown')
|
||||||
|
const moduleSetupArray = []
|
||||||
|
|
||||||
|
let maxLengthLine = moduleSetupSurface.lines.reduce((acc, cur) => {
|
||||||
|
return acc.length > cur.length ? acc : cur
|
||||||
|
})
|
||||||
|
|
||||||
|
const turfModuleSetupSurface = polygonToTurfPolygon(moduleSetupSurface) //폴리곤을 turf 객체로 변환
|
||||||
|
const containsBatchObjects = objectsIncludeSurface(turfModuleSetupSurface) //배치면에 오브젝트(도머, 개구등)이 있는지 확인하는 로직
|
||||||
|
|
||||||
|
let width = maxLengthLine.flowDirection === 'east' || maxLengthLine.flowDirection === 'west' ? 172.2 : 113.4
|
||||||
|
let height = maxLengthLine.flowDirection === 'east' || maxLengthLine.flowDirection === 'west' ? 113.4 : 172.2
|
||||||
|
|
||||||
|
//배치면때는 방향쪽으로 패널이 넓게 누워져야함
|
||||||
|
if (moduleSetupSurface.flowDirection !== undefined) {
|
||||||
|
width = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 172.2 : 113.4
|
||||||
|
height = moduleSetupSurface.flowDirection === 'south' || moduleSetupSurface.flowDirection === 'north' ? 113.4 : 172.2
|
||||||
|
}
|
||||||
|
|
||||||
|
const surfaceMaxLines = findSetupSurfaceMaxLines(moduleSetupSurface)
|
||||||
|
const maxLeftEndPoint = surfaceMaxLines.left.x1 //최 좌측
|
||||||
|
const maxRightEndPoint = surfaceMaxLines.right.x1 //최 우측
|
||||||
|
const maxTopEndPoint = surfaceMaxLines.top.y1 //최 상단
|
||||||
|
const maxBottomEndPoint = surfaceMaxLines.bottom.y1 //최 하단
|
||||||
|
let leftMargin, bottomMargin, square
|
||||||
|
|
||||||
|
if (setupLocation === 'eaves') {
|
||||||
|
if (moduleSetupSurface.flowDirection === 'south') {
|
||||||
|
let startPoint = flowModuleLine.find((obj) => obj.target === 'bottom')
|
||||||
|
let totalLeftEndPoint = maxLeftEndPoint - startPoint.x1
|
||||||
|
let totalTopEndPoint = maxTopEndPoint - startPoint.y1
|
||||||
|
let totalWidth = Math.ceil(Math.abs(maxRightEndPoint - maxLeftEndPoint) / width)
|
||||||
|
let diffLeftEndPoint = Math.abs(totalLeftEndPoint / width)
|
||||||
|
let diffTopEndPoint = Math.abs(totalTopEndPoint / height)
|
||||||
|
let startColPoint = Math.abs(width * Math.ceil(diffLeftEndPoint) - startPoint.x1)
|
||||||
|
|
||||||
|
for (let j = 0; j < diffTopEndPoint; j++) {
|
||||||
|
bottomMargin = 1
|
||||||
|
for (let i = 0; i <= totalWidth; i++) {
|
||||||
|
leftMargin = i === 0 ? 0 : 1 //숫자가 0이면 0, 1이면 1로 바꾸기
|
||||||
|
square = [
|
||||||
|
[startColPoint + width * i + leftMargin, startPoint.y1 - height * j - bottomMargin],
|
||||||
|
[startColPoint + width * i + width - leftMargin, startPoint.y1 - height * j - bottomMargin],
|
||||||
|
[startColPoint + width * i + width - leftMargin, startPoint.y1 - height * j - height - bottomMargin],
|
||||||
|
[startColPoint + width * i + leftMargin, startPoint.y1 - height * j - height - bottomMargin],
|
||||||
|
[startColPoint + width * i + leftMargin, startPoint.y1 - height * j - bottomMargin],
|
||||||
|
]
|
||||||
|
let squarePolygon = turf.polygon([square])
|
||||||
|
let turfCoordnates = squarePolygon.geometry.coordinates[0].slice(0, -1)
|
||||||
|
let points = turfCoordnates.map((coord) => ({ x: coord[0], y: coord[1] }))
|
||||||
|
|
||||||
|
// if (disjointFromTrestle && isDisjoint) {
|
||||||
|
let tempModule = new QPolygon(points, { ...moduleOptions, turfPoints: squarePolygon })
|
||||||
canvas?.add(tempModule)
|
canvas?.add(tempModule)
|
||||||
moduleSetupArray.push(tempModule)
|
moduleSetupArray.push(tempModule)
|
||||||
}
|
}
|
||||||
startPoint = { x1: points[0].x, y1: points[0].y, x2: points[3].x, y2: points[3].y }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (setupLocation === 'ridge') {
|
} else if (setupLocation === 'ridge') {
|
||||||
|
if (moduleSetupSurface.flowDirection === 'south') {
|
||||||
|
let startPoint = flowModuleLine.find((obj) => obj.target === 'top')
|
||||||
|
let totalLeftEndPoint = maxLeftEndPoint - startPoint.x1
|
||||||
|
let totalRightEndPoint = maxLeftEndPoint - maxRightEndPoint
|
||||||
|
let totalBottomEndPoint = maxBottomEndPoint - startPoint.y1
|
||||||
|
let diffLeftEndPoint = Math.abs(totalLeftEndPoint / width)
|
||||||
|
let diffRightEndPoint = Math.abs(totalRightEndPoint / width)
|
||||||
|
let diffBottomEndPoint = Math.abs(totalBottomEndPoint / height)
|
||||||
|
let startColPoint = Math.abs(width * Math.ceil(diffLeftEndPoint) - startPoint.x1)
|
||||||
|
|
||||||
|
for (let j = 0; j < diffBottomEndPoint; j++) {
|
||||||
|
bottomMargin = 1
|
||||||
|
for (let i = 0; i < diffRightEndPoint; i++) {
|
||||||
|
leftMargin = i === 0 ? 0 : 1
|
||||||
|
|
||||||
|
square = [
|
||||||
|
[startColPoint + width * i - leftMargin, startPoint.y1 + height * j + bottomMargin],
|
||||||
|
[startColPoint + width * i - leftMargin, startPoint.y1 + height * j + height + bottomMargin],
|
||||||
|
[startColPoint + width * i + width - leftMargin, startPoint.y1 + height * j + height + bottomMargin],
|
||||||
|
[startColPoint + width * i + width - leftMargin, startPoint.y1 + height * j + bottomMargin],
|
||||||
|
[startColPoint + width * i - leftMargin, startPoint.y1 + height * j + bottomMargin],
|
||||||
|
]
|
||||||
|
let squarePolygon = turf.polygon([square])
|
||||||
|
let turfCoordnates = squarePolygon.geometry.coordinates[0].slice(0, -1)
|
||||||
|
let points = turfCoordnates.map((coord) => ({ x: coord[0], y: coord[1] }))
|
||||||
|
|
||||||
|
// if (disjointFromTrestle && isDisjoint) {
|
||||||
|
let tempModule = new QPolygon(points, { ...moduleOptions, turfPoints: squarePolygon })
|
||||||
|
canvas?.add(tempModule)
|
||||||
|
moduleSetupArray.push(tempModule)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
|
|
||||||
moduleSetupSurface.set({ modules: moduleSetupArray })
|
const setupedModules = moduleSetupArray.filter((module) => {
|
||||||
|
let disjointFromTrestle = checkModuleDisjointSurface(module.turfPoints, turfModuleSetupSurface)
|
||||||
|
let isDisjoint = checkModuleDisjointObjects(module.turfPoints, containsBatchObjects)
|
||||||
|
|
||||||
|
if (!(disjointFromTrestle && isDisjoint)) {
|
||||||
|
canvas?.remove(module)
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
return module
|
||||||
|
}
|
||||||
|
})
|
||||||
|
moduleSetupSurface.set({ modules: setupedModules })
|
||||||
})
|
})
|
||||||
|
|
||||||
setModuleIsSetup(moduleSetupArray)
|
setModuleIsSetup(moduleSetupArray)
|
||||||
|
|
||||||
console.log(calculateForApi(moduleSetupArray))
|
// console.log(calculateForApi(moduleSetupArray))
|
||||||
}
|
}
|
||||||
|
|
||||||
const calculateForApi = (moduleSetupArray) => {
|
const calculateForApi = (moduleSetupArray) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user