오브젝트 배치 => 개구배치 작업중

This commit is contained in:
hyojun.choi 2024-09-09 18:13:53 +09:00
parent b02ad92fca
commit 13db9191b1
4 changed files with 76 additions and 29 deletions

View File

@ -21,3 +21,13 @@ export const LineType = {
EAVES: 'eaves', // 처마 EAVES: 'eaves', // 처마
RIDGE: 'ridge', // 용마루.... RIDGE: 'ridge', // 용마루....
} }
export const BATCH_TYPE = {
OPENING: 'opening',
SHADOW: 'shadow',
}
export const INPUT_TYPE = {
FREE: 'free',
DIMENSION: 'dimension',
}

View File

@ -5,16 +5,7 @@ import { modalState } from '@/store/modalAtom'
import { fabric } from 'fabric' import { fabric } from 'fabric'
import { QPolygon } from '@/components/fabric/QPolygon' import { QPolygon } from '@/components/fabric/QPolygon'
import { modeState, objectPlacementModeState } from '@/store/canvasAtom' import { modeState, objectPlacementModeState } from '@/store/canvasAtom'
import { BATCH_TYPE, INPUT_TYPE } from '@/common/common'
const BATCH_TYPE = {
OPENING: 'opening',
SHADOW: 'shadow',
}
const INPUT_TYPE = {
FREE: 'free',
DIMENSION: 'dimension',
}
const ObjectPlacement = ({ canvas }) => { const ObjectPlacement = ({ canvas }) => {
const [open, setOpen] = useRecoilState(modalState) const [open, setOpen] = useRecoilState(modalState)

View File

@ -13,7 +13,7 @@ import { getIntersectionPoint } from '@/util/canvas-util'
* @constructor * @constructor
*/ */
export const SurfaceShapeModal = ({ canvas }) => { export const SurfaceShapeModal = ({ canvas }) => {
const [type, setType] = useState(0) const [type, setType] = useState(1)
const setOpen = useSetRecoilState(modalState) const setOpen = useSetRecoilState(modalState)
const fontSize = useRecoilValue(fontSizeState) const fontSize = useRecoilValue(fontSizeState)
// //

View File

@ -35,7 +35,7 @@ import { QPolygon } from '@/components/fabric/QPolygon'
import offsetPolygon, { inPolygon } from '@/util/qpolygon-utils' import offsetPolygon, { inPolygon } from '@/util/qpolygon-utils'
import { isObjectNotEmpty } from '@/util/common-utils' import { isObjectNotEmpty } from '@/util/common-utils'
import * as turf from '@turf/turf' import * as turf from '@turf/turf'
import { Mode } from '@/common/common' import { INPUT_TYPE, Mode } from '@/common/common'
export function useMode() { export function useMode() {
const [mode, setMode] = useRecoilState(modeState) const [mode, setMode] = useRecoilState(modeState)
@ -1078,10 +1078,11 @@ export function useMode() {
alert('지붕 내부에만 생성 가능합니다.') alert('지붕 내부에만 생성 가능합니다.')
return return
} }
mouseEvent.openingMode.isDown = true
mouseEvent.openingMode.origX = pointer.x mouseEvent.openingMode.origX = pointer.x
mouseEvent.openingMode.origY = pointer.y mouseEvent.openingMode.origY = pointer.y
if (objectPlacementMode.inputType === INPUT_TYPE.FREE) {
mouseEvent.openingMode.isDown = true
mouseEvent.openingMode.rect = new fabric.Rect({ mouseEvent.openingMode.rect = new fabric.Rect({
fill: 'white', fill: 'white',
stroke: 'black', stroke: 'black',
@ -1092,10 +1093,23 @@ export function useMode() {
originY: 'top', originY: 'top',
width: pointer.x - mouseEvent.openingMode.origX, width: pointer.x - mouseEvent.openingMode.origX,
height: pointer.y - mouseEvent.openingMode.origY, height: pointer.y - mouseEvent.openingMode.origY,
angle: 0,
transparentCorners: false,
}) })
canvas.add(mouseEvent.openingMode.rect) canvas.add(mouseEvent.openingMode.rect)
} else if (objectPlacementMode.inputType === INPUT_TYPE.DIMENSION) {
mouseEvent.openingMode.rect = new fabric.Rect({
fill: 'white',
stroke: 'black',
strokeWidth: 1,
left: mouseEvent.openingMode.origX,
top: mouseEvent.openingMode.origY,
originX: 'left',
originY: 'top',
width: Number(objectPlacementMode.width),
height: Number(objectPlacementMode.height),
})
canvas.add(mouseEvent.openingMode.rect)
canvas.off('mouse:move')
}
}, },
move: (e) => { move: (e) => {
if (!mouseEvent.openingMode.isDown) return if (!mouseEvent.openingMode.isDown) return
@ -1130,6 +1144,7 @@ export function useMode() {
} }
mouseEvent.openingMode.rect.set({ name: 'opening' }) mouseEvent.openingMode.rect.set({ name: 'opening' })
setMode(Mode.DEFAULT)
}, },
}, },
} }
@ -1147,7 +1162,17 @@ export function useMode() {
{ x: rect.left + rect.width, y: rect.top }, { x: rect.left + rect.width, y: rect.top },
] ]
const rect1Corners = {
minX: Math.min(...rectPoints.map((point) => point.x)),
maxX: Math.max(...rectPoints.map((point) => point.x)),
minY: Math.min(...rectPoints.map((point) => point.y)),
maxY: Math.max(...rectPoints.map((point) => point.y)),
}
let isCross = true
for (let i = 0; i < openings.length; i++) { for (let i = 0; i < openings.length; i++) {
if (i !== 0 && isCross) {
break
}
const rect2 = openings[i] const rect2 = openings[i]
const rect2Points = [ const rect2Points = [
{ x: rect2.left, y: rect2.top }, { x: rect2.left, y: rect2.top },
@ -1155,9 +1180,30 @@ export function useMode() {
{ x: rect2.left + rect2.width, y: rect2.top + rect2.height }, { x: rect2.left + rect2.width, y: rect2.top + rect2.height },
{ x: rect2.left + rect2.width, y: rect2.top }, { x: rect2.left + rect2.width, y: rect2.top },
] ]
const rect2Corners = {
minX: Math.min(...rect2Points.map((point) => point.x)),
maxX: Math.max(...rect2Points.map((point) => point.x)),
minY: Math.min(...rect2Points.map((point) => point.y)),
maxY: Math.max(...rect2Points.map((point) => point.y)),
} }
return false // Check if one rectangle is to the left of the other
if (
rect1Corners.maxX < rect2Corners.minX ||
rect2Corners.maxX < rect1Corners.minX ||
rect1Corners.maxY < rect2Corners.minY ||
rect2Corners.maxY < rect1Corners.minY
) {
isCross = false
continue
} else {
isCross = true
break
}
}
return isCross
} }
const checkInsideRoof = (rect) => { const checkInsideRoof = (rect) => {