import WithDraggable from '@/components/common/draggable/WithDraggable' import QSelectBox from '@/components/common/select/QSelectBox' import { useEffect, useState } from 'react' import { useMessage } from '@/hooks/useMessage' import { canvasState, dotLineGridSettingState, dotLineIntervalSelector } from '@/store/canvasAtom' import { useRecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil' import { onlyNumberInputChange } from '@/util/input-utils' import { fabric } from 'fabric' import { gridColorState } from '@/store/gridAtom' import { gridDisplaySelector, settingModalGridOptionsState } from '@/store/settingAtom' import { useAxios } from '@/hooks/useAxios' import { useSwal } from '@/hooks/useSwal' const TYPE = { DOT: 'DOT', LINE: 'LINE', } export default function DotLineGrid(props) { // const [modalOption, setModalOption] = useRecoilState(modalState); //modal 열림닫힘 state const [objectNo, setObjectNo] = useState('test123240912001') // 이후 삭제 필요 const [close, setClose] = useState(false) const { setShowDotLineGridModal } = props const setSettingModalGridOptions = useSetRecoilState(settingModalGridOptionsState) const gridColor = useRecoilValue(gridColorState) const canvas = useRecoilValue(canvasState) const isGridDisplay = useRecoilValue(gridDisplaySelector) const [dotLineGridSetting, setDotLineGridSettingState] = useRecoilState(dotLineGridSettingState) const resetDotLineGridSetting = useResetRecoilState(dotLineGridSettingState) const interval = useRecoilValue(dotLineIntervalSelector) const { getMessage } = useMessage() const { get, post } = useAxios() const { swalFire } = useSwal() useEffect(() => { return () => { setSettingModalGridOptions((prev) => { const newSettingOptions = [...prev] newSettingOptions[1].selected = false return [...newSettingOptions] }) } }, []) const SelectOption = [ { id: 1, name: getMessage('modal.canvas.setting.grid.dot.line.setting.line.origin'), value: 1 }, { id: 2, name: '1/2', value: 1 / 2 }, { id: 3, name: '1/4', value: 1 / 4 }, { id: 4, name: '1/10', value: 1 / 10 }, ] const [selectOption, setSelectOption] = useState(SelectOption[0]) // 데이터를 최초 한 번만 조회 useEffect(() => { console.log('DotLineGrid useEffect 실행') fetchGridSettings() }, [objectNo]) const HandleClickClose = () => { // setClose(true) // setTimeout(() => { // setModalOption({ ...modalOption, gridoption: false }) // setClose(false) // }, 180) } const handleCheckBoxChange = (e) => { const { value, checked } = e.target setDotLineGridSettingState((prev) => { return { ...prev, [value]: checked, } }) } // Canvas Grid Setting 조회 및 초기화 const fetchGridSettings = async () => { try { const res = await get({ url: `/api/canvas-management/canvas-grid-settings/by-object/${objectNo}` }) const patternData = { INTERVAL: { type: res.gridType, horizontalInterval: res.gridHorizon, verticalInterval: res.gridVertical, ratioInterval: res.gridRatio, }, dimension: res.gridDimen, DOT: res.dotGridDisplay, LINE: res.lineGridDisplay, } const matchedOption = SelectOption.find((option) => option.value == res.gridDimen) // dimension 값에 맞는 옵션을 선택 setSelectOption(matchedOption) // 서버에서 받은 데이터로 상태 업데이트 setDotLineGridSettingState(patternData) } catch (error) { console.error('Data fetching error:', error) } } const handleSave = async () => { try { const patternData = { objectNo, dotGridDisplay: dotLineGridSetting.DOT, lineGridDisplay: dotLineGridSetting.LINE, gridType: dotLineGridSetting.INTERVAL.type, gridHorizon: dotLineGridSetting.INTERVAL.horizontalInterval, gridVertical: dotLineGridSetting.INTERVAL.verticalInterval, gridRatio: dotLineGridSetting.INTERVAL.ratioInterval, gridDimen: dotLineGridSetting.INTERVAL.dimension, } // HTTP POST 요청 보내기 await post({ url: `/api/canvas-management/canvas-grid-settings`, data: patternData }).then((res) => { swalFire({ text: getMessage(res.returnMessage) }) // 1. 점.선 그리드 설정으로 만들어진 기존 오브젝트 제거 canvas ?.getObjects() .filter((obj) => obj.name === 'lineGrid') .forEach((obj) => canvas?.remove(obj)) canvas ?.getObjects() .filter((obj) => obj.name === 'dotGrid') .forEach((obj) => canvas?.remove(obj)) //const horizontalInterval = interval.horizontalInterval //const verticalInterval = interval.verticalInterval if (patternData.dotGridDisplay) { const circle = new fabric.Circle({ radius: 2, fill: 'red', strokeWidth: 0.7, originX: 'center', originY: 'center', selectable: false, lockMovementX: true, lockMovementY: true, lockRotation: true, lockScalingX: true, lockScalingY: true, }) const patternSourceCanvas = new fabric.StaticCanvas(null, { width: patternData.gridHorizon, height: patternData.gridVertical, }) patternSourceCanvas.add(circle) circle.set({ left: patternSourceCanvas.width / 2, top: patternSourceCanvas.height / 2, }) patternSourceCanvas.renderAll() const pattern = new fabric.Pattern({ source: patternSourceCanvas.getElement(), repeat: 'repeat', }) const backgroundPolygon = new fabric.Polygon( [ { x: 0, y: 0 }, { x: canvas.width, y: 0 }, { x: canvas.width, y: canvas.height }, { x: 0, y: canvas.height }, ], { fill: pattern, selectable: false, name: 'dotGrid', visible: isGridDisplay, }, ) canvas.add(backgroundPolygon) backgroundPolygon.sendToBack() canvas.renderAll() } if (patternData.lineGridDisplay) { for (let i = 0; i < canvas.height / patternData.gridVertical + 1; i++) { const horizontalLine = new fabric.Line( [ 0, i * patternData.gridVertical - patternData.gridVertical / 2, canvas.width, i * patternData.gridVertical - patternData.gridVertical / 2, ], { stroke: gridColor, strokeWidth: 1, selectable: true, lockMovementX: true, lockMovementY: true, lockRotation: true, lockScalingX: true, lockScalingY: true, name: 'lineGrid', strokeDashArray: [5, 2], opacity: 0.3, direction: 'horizontal', visible: isGridDisplay, }, ) canvas.add(horizontalLine) } for (let i = 0; i < canvas.width / patternData.gridHorizon + 1; i++) { const verticalLine = new fabric.Line( [ i * patternData.gridHorizon - patternData.gridHorizon / 2, 0, i * patternData.gridHorizon - patternData.gridHorizon / 2, canvas.height, ], { stroke: gridColor, strokeWidth: 1, selectable: true, lockMovementX: true, lockMovementY: true, lockRotation: true, lockScalingX: true, lockScalingY: true, name: 'lineGrid', strokeDashArray: [5, 2], opacity: 0.3, direction: 'vertical', visible: isGridDisplay, }, ) canvas.add(verticalLine) } } canvas.renderAll() }) } catch (error) { swalFire({ text: getMessage(res.returnMessage), icon: 'error' }) } } const handleRadioChange = (e) => { const { value, name, checked, selected } = e.target setDotLineGridSettingState((prev) => { return { ...prev, INTERVAL: { ...prev.INTERVAL, type: Number(value), }, } }) } const changeInput = (value, e) => { const { name } = e.target setDotLineGridSettingState((prev) => { return { ...prev, INTERVAL: { ...prev.INTERVAL, [name]: value, }, } }) } const changeDimension = (result) => { const { value } = result setDotLineGridSettingState((prev) => { return { ...prev, INTERVAL: { ...prev.INTERVAL, dimension: value, }, } }) } // 초기화 const reset = () => { canvas ?.getObjects() .filter((obj) => obj.name === 'lineGrid') .forEach((obj) => canvas?.remove(obj)) canvas ?.getObjects() .filter((obj) => obj.name === 'dotGrid') .forEach((obj) => canvas?.remove(obj)) resetDotLineGridSetting() setSelectOption(SelectOption[0]) } return (

{getMessage('modal.canvas.setting.grid.dot.line.setting')}

{getMessage('modal.canvas.setting.grid.dot.line.setting.horizon')}
onlyNumberInputChange(e, changeInput)} />
mm
{getMessage('modal.canvas.setting.grid.dot.line.setting.vertical')}
onlyNumberInputChange(e, changeInput)} />
mm
{getMessage('modal.canvas.setting.grid.dot.line.setting.ratio')}
onlyNumberInputChange(e, changeInput)} />
mm
) }