196 lines
6.5 KiB
JavaScript
196 lines
6.5 KiB
JavaScript
import { useEffect } from 'react'
|
|
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
|
|
import { basicSettingState, roofDisplaySelector, settingModalFirstOptionsState } from '@/store/settingAtom'
|
|
import { canvasState, dotLineGridSettingState, pitchText, pitchTextSelector, showAngleUnitSelector } from '@/store/canvasAtom'
|
|
import { getChonByDegree, getDegreeByChon, setSurfaceShapePattern } from '@/util/canvas-util'
|
|
import { useFont } from '@/hooks/common/useFont'
|
|
import { useGrid } from '@/hooks/common/useGrid'
|
|
import { globalFontAtom } from '@/store/fontAtom'
|
|
import { useRoof } from '@/hooks/common/useRoof'
|
|
|
|
export function useCanvasConfigInitialize() {
|
|
const canvas = useRecoilValue(canvasState)
|
|
const [settingModalFirstOptions, setSettingModalFirstOptions] = useRecoilState(settingModalFirstOptionsState)
|
|
const [basicSetting, setBasicSettings] = useRecoilState(basicSettingState)
|
|
const roofDisplay = useRecoilValue(roofDisplaySelector)
|
|
const setGlobalFonts = useSetRecoilState(globalFontAtom)
|
|
const setDotLineGridSetting = useSetRecoilState(dotLineGridSettingState)
|
|
const pitchText = useRecoilValue(pitchTextSelector)
|
|
const angleUnit = useRecoilValue(showAngleUnitSelector)
|
|
const {} = useFont()
|
|
const {} = useGrid()
|
|
const {} = useRoof()
|
|
|
|
useEffect(() => {
|
|
if (!canvas) return
|
|
canvas
|
|
.getObjects()
|
|
.filter((polygon) => polygon.name === 'roof')
|
|
.forEach((polygon) => {
|
|
setSurfaceShapePattern(polygon, roofDisplay.column)
|
|
})
|
|
canvas.renderAll()
|
|
}, [roofDisplay])
|
|
|
|
useEffect(() => {
|
|
if (!canvas) return
|
|
const offsetTexts = canvas.getObjects().filter((obj) => obj.name === 'pitchText')
|
|
const flowTexts = canvas.getObjects().filter((obj) => obj.name === 'flowText')
|
|
if (basicSetting.roofAngleSet === 'slope') {
|
|
offsetTexts.forEach((obj) => {
|
|
obj.set({ text: `${obj.originText}-∠${obj.pitch}${angleUnit}` })
|
|
})
|
|
flowTexts.forEach((obj) => {
|
|
obj.set({ text: `${obj.originText}-∠${obj.pitch}${pitchText}` })
|
|
})
|
|
}
|
|
|
|
if (basicSetting.roofAngleSet === 'flat') {
|
|
offsetTexts.forEach((obj) => {
|
|
obj.set({ text: `${obj.originText}-∠${getDegreeByChon(obj.pitch)}${angleUnit}` })
|
|
})
|
|
flowTexts.forEach((obj) => {
|
|
obj.set({ text: `${obj.originText}-∠${getDegreeByChon(obj.pitch)}${pitchText}` })
|
|
})
|
|
}
|
|
|
|
canvas.renderAll()
|
|
}, [basicSetting])
|
|
|
|
const canvasLoadInit = () => {
|
|
roofInit() //화면표시 초기화
|
|
groupDimensionInit()
|
|
reGroupInit() //그룹 객체 재그룹
|
|
}
|
|
|
|
const gridInit = () => {
|
|
setDotLineGridSetting((prev) => {
|
|
return { ...prev, INTERVAL: { ...prev.INTERVAL } }
|
|
})
|
|
}
|
|
|
|
//치수표시, 화면표시, 글꼴등 초기화
|
|
const roofInit = () => {
|
|
setSettingModalFirstOptions((prev) => {
|
|
// ...prev에서 내부에 있는 option2 객체의 주소값도 다르게 만들어줘
|
|
const option1 = prev.option1.map((option) => {
|
|
return { ...option }
|
|
})
|
|
const option2 = prev.option2.map((option) => {
|
|
return { ...option }
|
|
})
|
|
const dimensionDisplay = prev.dimensionDisplay.map((option) => {
|
|
return { ...option }
|
|
})
|
|
return { ...prev, option1, option2, dimensionDisplay }
|
|
})
|
|
gridInit()
|
|
|
|
setGlobalFonts((prev) => {
|
|
const commonText = { ...prev.commonText }
|
|
const dimensionLineText = { ...prev.dimensionLineText }
|
|
const flowText = { ...prev.flowText }
|
|
const lengthText = { ...prev.lengthText }
|
|
const circuitNumberText = { ...prev.circuitNumberText }
|
|
return { commonText, dimensionLineText, flowText, lengthText, circuitNumberText }
|
|
})
|
|
}
|
|
|
|
const groupDimensionInit = () => {
|
|
const groups = canvas.getObjects().filter((obj) => obj.groupYn && obj.name === 'dimensionGroup')
|
|
const groupIds = []
|
|
|
|
groups.forEach((group) => {
|
|
if (!groupIds.includes(group.id)) {
|
|
groupIds.push(group.id)
|
|
}
|
|
})
|
|
|
|
groupIds.forEach((id) => {
|
|
const groupObjects = canvas.getObjects().filter((obj) => obj.id === id && obj.type !== 'text')
|
|
const objectsName = canvas.getObjects().filter((obj) => obj.id === id && obj.type !== 'text')[0].groupName
|
|
const lineDirection = canvas.getObjects().filter((obj) => obj.id === id && obj.name === 'centerLine')[0].lineDirection
|
|
const text = canvas.getObjects().filter((obj) => obj.id === id && obj.type === 'text')[0]
|
|
|
|
let objectArray = []
|
|
|
|
if (groupObjects) {
|
|
groupObjects.forEach((obj) => {
|
|
objectArray.push(obj)
|
|
})
|
|
}
|
|
objectArray.push(text)
|
|
|
|
objectArray.forEach((obj) => {
|
|
canvas?.remove(obj)
|
|
})
|
|
|
|
const group = new fabric.Group(objectArray, {
|
|
groupId: id,
|
|
name: objectsName,
|
|
selectable: true,
|
|
lockMovementX: true,
|
|
lockMovementY: true,
|
|
originX: 'center',
|
|
originY: 'center',
|
|
lineDirection: lineDirection,
|
|
})
|
|
canvas.add(group)
|
|
})
|
|
}
|
|
|
|
const reGroupInit = () => {
|
|
const excludeObjects = ['dimensionGroup', 'dimensionLineText']
|
|
|
|
const groups = canvas.getObjects().filter((obj) => obj.groupYn && !obj.name.includes(excludeObjects))
|
|
const groupIds = []
|
|
|
|
groups.forEach((group) => {
|
|
if (!groupIds.includes(group.groupId)) {
|
|
groupIds.push(group.groupId)
|
|
}
|
|
})
|
|
|
|
groupIds.forEach((id) => {
|
|
//그룹아이디로 캔버스의 객체를 조회함
|
|
const groupObjects = canvas.getObjects().filter((obj) => obj.groupId === id || obj.id === id)
|
|
const objectsName = canvas.getObjects().filter((obj) => obj.groupId === id || obj.id === id)[0].groupName
|
|
const objectsParentId = canvas.getObjects().filter((obj) => obj.groupId === id || obj.id === id)[0].parentId
|
|
|
|
let objectArray = []
|
|
|
|
//그룹객체가 있으면 배열에 추가함
|
|
if (groupObjects) {
|
|
groupObjects.forEach((obj) => {
|
|
objectArray.push(obj)
|
|
})
|
|
}
|
|
|
|
//그룹객체를 캔버스에서 제거함
|
|
objectArray.forEach((obj) => {
|
|
canvas?.remove(obj)
|
|
})
|
|
|
|
//그룹 객체로 다시 만든다 (좌표때문에)
|
|
const group = new fabric.Group(objectArray, {
|
|
groupId: id,
|
|
name: objectsName,
|
|
selectable: true,
|
|
lockMovementX: true,
|
|
lockMovementY: true,
|
|
originX: 'center',
|
|
originY: 'center',
|
|
parentId: objectsParentId,
|
|
})
|
|
canvas.add(group)
|
|
|
|
//그룹 객체 재그룹 완료
|
|
group.getObjects().forEach((obj) => {
|
|
obj.fire('modified')
|
|
})
|
|
})
|
|
}
|
|
|
|
return { canvasLoadInit, gridInit }
|
|
}
|