그리드 recoil 추가

This commit is contained in:
yjnoh 2024-08-23 15:31:47 +09:00
parent f9b84f42d6
commit dfeadd5d17
4 changed files with 36 additions and 8 deletions

View File

@ -26,6 +26,7 @@ import ThumbnailList from './ui/ThumbnailLIst'
import QContextMenu from './common/context-menu/QContextMenu' import QContextMenu from './common/context-menu/QContextMenu'
import { modalContent, modalState } from '@/store/modalAtom' import { modalContent, modalState } from '@/store/modalAtom'
import SettingsModal from './SettingsModal' import SettingsModal from './SettingsModal'
import { get } from '@/lib/Axios'
export default function Roof2(props) { export default function Roof2(props) {
const { name, userId, email, isLoggedIn } = props const { name, userId, email, isLoggedIn } = props
@ -63,6 +64,8 @@ export default function Roof2(props) {
const [open, setOpen] = useRecoilState(modalState) const [open, setOpen] = useRecoilState(modalState)
const [contents, setContent] = useRecoilState(modalContent) const [contents, setContent] = useRecoilState(modalContent)
const [scale, setScale] = useState(1)
//canvas //canvas
const [thumbnails, setThumbnails] = useState([]) const [thumbnails, setThumbnails] = useState([])
const thumbnailProps = { const thumbnailProps = {

View File

@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from 'react'
import { Button, Checkbox, CheckboxGroup, RadioGroup, Radio, Input } from '@nextui-org/react' import { Button, Checkbox, CheckboxGroup, RadioGroup, Radio, Input } from '@nextui-org/react'
import { useRecoilState, useRecoilValue } from 'recoil' import { useRecoilState, useRecoilValue } from 'recoil'
import { modalContent, modalState } from '@/store/modalAtom' import { modalContent, modalState } from '@/store/modalAtom'
import { guideLineState } from '@/store/canvasAtom'
import { fabric } from 'fabric' import { fabric } from 'fabric'
export default function SettingsModal(props) { export default function SettingsModal(props) {
@ -12,12 +13,15 @@ export default function SettingsModal(props) {
const moduleLength = useRef(90) // mm const moduleLength = useRef(90) // mm
const [open, setOpen] = useRecoilState(modalState) const [open, setOpen] = useRecoilState(modalState)
const [guideLine, setGuideLine] = useRecoilState(guideLineState)
useEffect(() => { useEffect(() => {
setIsCustomGridSetting(ratioValue !== 'custom') setIsCustomGridSetting(ratioValue !== 'custom')
}, [ratioValue]) }, [ratioValue])
const drawGridSettings = () => { const drawGridSettings = () => {
const gridSettingArray = []
if (gridCheckedValue.includes('line')) { if (gridCheckedValue.includes('line')) {
// fabric.GuideRect = fabric.util.createClass(fabric.Rect, { // fabric.GuideRect = fabric.util.createClass(fabric.Rect, {
// _render: function (ctx) { // _render: function (ctx) {
@ -98,20 +102,15 @@ export default function SettingsModal(props) {
verticalLineArray.push(verticalLine) verticalLineArray.push(verticalLine)
} }
canvasProps.renderAll() canvasProps.renderAll()
const snapDistance = 10
console.log('horizontalLineArray', horizontalLineArray) const snapDistance = 10
canvasProps.on('mouse:move', function (e) { canvasProps.on('mouse:move', function (e) {
let mouseObj = e let mouseObj = e
const mouseCursorX = e.pointer.x const mouseCursorX = e.pointer.x
const mouseCursorY = e.pointer.y const mouseCursorY = e.pointer.y
console.log(`mouseCursorX : ${mouseCursorX}, mouseCursorY : ${mouseCursorY}`)
horizontalLineArray.forEach((line) => { horizontalLineArray.forEach((line) => {
console.log()
if (Math.abs(mouseCursorY - line.y1) < snapDistance) { if (Math.abs(mouseCursorY - line.y1) < snapDistance) {
mouseObj.x = mouseCursorX mouseObj.x = mouseCursorX
mouseObj.y = line.y1 mouseObj.y = line.y1
@ -154,11 +153,19 @@ export default function SettingsModal(props) {
// } // }
// }) // })
// }) // })
const recoilObj = {
guideMode: 'guideLine',
horizontalLineArray,
verticalLineArray,
moduleLength: moduleLength.current.value,
}
gridSettingArray.push(recoilObj)
} }
if (gridCheckedValue.includes('dot')) { if (gridCheckedValue.includes('dot')) {
const circle = new fabric.Circle({ const circle = new fabric.Circle({
radius: 5, radius: 2,
fill: 'red', fill: 'red',
originX: 'center', originX: 'center',
originY: 'center', originY: 'center',
@ -204,9 +211,16 @@ export default function SettingsModal(props) {
) )
canvasProps.add(backgroundPolygon) canvasProps.add(backgroundPolygon)
canvasProps.renderAll() canvasProps.renderAll()
}
const recoilObj = {
guideMode: 'guideDot',
moduleLength: moduleLength.current.value,
}
gridSettingArray.push(recoilObj)
}
canvasProps.renderAll() canvasProps.renderAll()
setGuideLine(gridSettingArray)
} }
return ( return (

View File

@ -23,6 +23,7 @@ import {
sortedPolygonArray, sortedPolygonArray,
templateTypeState, templateTypeState,
wallState, wallState,
guideLineState,
} from '@/store/canvasAtom' } from '@/store/canvasAtom'
import { QLine } from '@/components/fabric/QLine' import { QLine } from '@/components/fabric/QLine'
import { fabric } from 'fabric' import { fabric } from 'fabric'
@ -64,6 +65,8 @@ export function useMode() {
const compass = useRecoilValue(compassState) const compass = useRecoilValue(compassState)
const [isCellCenter, setIsCellCenter] = useState(false) const [isCellCenter, setIsCellCenter] = useState(false)
const guideLine = useRecoilValue(guideLineState)
useEffect(() => { useEffect(() => {
// 이벤트 리스너 추가 // 이벤트 리스너 추가
// if (!canvas) { // if (!canvas) {
@ -104,6 +107,8 @@ export function useMode() {
}, [mode, isGuidePointMode]) }, [mode, isGuidePointMode])
const drawMouseLines = (e) => { const drawMouseLines = (e) => {
console.log('guideLine', guideLine)
// 현재 마우스 포인터의 위치를 가져옵니다. // 현재 마우스 포인터의 위치를 가져옵니다.
const pointer = canvas?.getPointer(e.e) const pointer = canvas?.getPointer(e.e)

View File

@ -88,3 +88,9 @@ export const compassState = atom({
default: undefined, default: undefined,
dangerouslyAllowMutability: true, dangerouslyAllowMutability: true,
}) })
export const guideLineState = atom({
key: 'guideLine',
default: {},
dangerouslyAllowMutability: true,
})