면형상 => 모듈 회로구성 => 모듈 채우기 작업중

This commit is contained in:
hyojun.choi 2024-09-03 15:07:11 +09:00
parent cb0775c493
commit 1647bc58a0
2 changed files with 79 additions and 74 deletions

View File

@ -535,44 +535,6 @@ export default function Roof2(props) {
}) })
} }
const setCurrentPattern = (polygon) => {
const { width, height, roofStyle } = roofMaterial
const roofRatio = window.devicePixelRatio || 1
const patternSourceCanvas = document.createElement('canvas')
if (roofStyle === 1) {
patternSourceCanvas.width = width * roofRatio
patternSourceCanvas.height = height * roofRatio
} else if (roofStyle === 2) {
patternSourceCanvas.width = width * 2
patternSourceCanvas.height = height * 2
}
const ctx = patternSourceCanvas.getContext('2d')
ctx.scale(roofRatio, roofRatio)
ctx.strokeStyle = 'green'
ctx.lineWidth = 0.4
//
if (roofStyle === 1) {
ctx.strokeRect(0, 0, 50, 30)
} else if (roofStyle === 2) {
//
ctx.strokeRect(0, 0, 200, 100)
ctx.strokeRect(100, 100, 200, 100)
}
//
const pattern = new fabric.Pattern({
source: patternSourceCanvas,
repeat: 'repeat',
})
polygon.set('fill', null)
polygon.set('fill', pattern)
canvas?.renderAll()
}
/** /**
* canvas 내용 불러오기 * canvas 내용 불러오기
*/ */
@ -1531,6 +1493,9 @@ export default function Roof2(props) {
}) })
} }
const moduleConfiguration = () => {
createRoofRack()
}
return ( return (
<> <>
{canvas && ( {canvas && (
@ -1764,8 +1729,11 @@ export default function Roof2(props) {
<Button className="m-1 p-2" onClick={createTemplate29}> <Button className="m-1 p-2" onClick={createTemplate29}>
29 추가 29 추가
</Button> </Button>
<Button className="m-1 p-2" onClick={createPentagon2}> <Button className="m-1 p-2" onClick={moduleConfiguration}>
오각형 추가2 모듈,회로구성
</Button>
<Button className="m-1 p-2" onClick={drawCellInTrestle}>
모듈 채우기
</Button> </Button>
<Button className="m-1 p-2" color={`${showControl ? 'primary' : 'default'}`} onClick={handleShowController}> <Button className="m-1 p-2" color={`${showControl ? 'primary' : 'default'}`} onClick={handleShowController}>
canvas 컨트롤러 {`${showControl ? '숨기기' : '보이기'}`} canvas 컨트롤러 {`${showControl ? '숨기기' : '보이기'}`}

View File

@ -1,9 +1,9 @@
import { Button, Input } from '@nextui-org/react' import { Button, Input } from '@nextui-org/react'
import { useCallback, useEffect, useState } from 'react' import { useState } from 'react'
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' import { useRecoilValue, useSetRecoilState } from 'recoil'
import { modalState } from '@/store/modalAtom' import { modalState } from '@/store/modalAtom'
import { QPolygon } from '@/components/fabric/QPolygon' import { QPolygon } from '@/components/fabric/QPolygon'
import { fontSizeState } from '@/store/canvasAtom' import { fontSizeState, roofMaterialState } from '@/store/canvasAtom'
/** /**
* 면형상 배치 모달 * 면형상 배치 모달
@ -14,6 +14,8 @@ export const SurfaceShapeModal = ({ canvas }) => {
const [type, setType] = useState(0) const [type, setType] = useState(0)
const setOpen = useSetRecoilState(modalState) const setOpen = useSetRecoilState(modalState)
const fontSize = useRecoilValue(fontSizeState) const fontSize = useRecoilValue(fontSizeState)
//
const roofMaterial = useRecoilValue(roofMaterialState)
/** /**
* 최대 5개의 length * 최대 5개의 length
@ -42,21 +44,27 @@ export const SurfaceShapeModal = ({ canvas }) => {
if (!isDrawing) { if (!isDrawing) {
return return
} }
const pointer = canvas?.getPointer(e.e)
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle'))
switch (type) { switch (type) {
case 1: { case 1: {
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle')) let newLength2 = length2
const pointer = canvas?.getPointer(e.e)
if (length3 !== 0) {
newLength2 = Math.sqrt(length3 ** 2 - (length1 / 2) ** 2)
}
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x, y: pointer.y - parseInt(length2) / 2 }, { x: pointer.x, y: pointer.y - parseInt(newLength2) / 2 },
{ x: pointer.x - parseInt(length1) / 2, y: pointer.y + parseInt(length1) / 2 }, { x: pointer.x - parseInt(length1) / 2, y: pointer.y + parseInt(newLength2) / 2 },
{ x: pointer.x + parseInt(length1) / 2, y: pointer.y + parseInt(length1) / 2 }, { x: pointer.x + parseInt(length1) / 2, y: pointer.y + parseInt(newLength2) / 2 },
], ],
{ {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -65,8 +73,6 @@ export const SurfaceShapeModal = ({ canvas }) => {
break break
} }
case 2: { case 2: {
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle'))
const pointer = canvas?.getPointer(e.e)
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 },
@ -78,7 +84,7 @@ export const SurfaceShapeModal = ({ canvas }) => {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -86,8 +92,6 @@ export const SurfaceShapeModal = ({ canvas }) => {
break break
} }
case 3: { case 3: {
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle'))
const pointer = canvas?.getPointer(e.e)
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 },
@ -99,7 +103,7 @@ export const SurfaceShapeModal = ({ canvas }) => {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -107,8 +111,6 @@ export const SurfaceShapeModal = ({ canvas }) => {
break break
} }
case 4: { case 4: {
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle'))
const pointer = canvas?.getPointer(e.e)
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 },
@ -119,7 +121,7 @@ export const SurfaceShapeModal = ({ canvas }) => {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -128,8 +130,6 @@ export const SurfaceShapeModal = ({ canvas }) => {
break break
} }
case 5: { case 5: {
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle'))
const pointer = canvas?.getPointer(e.e)
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 },
@ -140,7 +140,7 @@ export const SurfaceShapeModal = ({ canvas }) => {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -149,8 +149,6 @@ export const SurfaceShapeModal = ({ canvas }) => {
} }
case 6: { case 6: {
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle'))
const pointer = canvas?.getPointer(e.e)
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x - length1 / 2, y: pointer.y - length3 / 2 }, { x: pointer.x - length1 / 2, y: pointer.y - length3 / 2 },
@ -162,7 +160,7 @@ export const SurfaceShapeModal = ({ canvas }) => {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -171,8 +169,6 @@ export const SurfaceShapeModal = ({ canvas }) => {
} }
case 7: { case 7: {
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle'))
const pointer = canvas?.getPointer(e.e)
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x - length1 / 2, y: pointer.y - length2 / 2 }, { x: pointer.x - length1 / 2, y: pointer.y - length2 / 2 },
@ -184,7 +180,7 @@ export const SurfaceShapeModal = ({ canvas }) => {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -192,8 +188,6 @@ export const SurfaceShapeModal = ({ canvas }) => {
} }
case 8: { case 8: {
const angleInRadians = Math.asin(length2 / length3) const angleInRadians = Math.asin(length2 / length3)
canvas?.remove(...canvas?.getObjects().filter((obj) => obj.name === 'guideTriangle'))
const pointer = canvas?.getPointer(e.e)
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 }, { x: pointer.x - length1 / 2, y: pointer.y + length2 / 2 },
@ -205,7 +199,7 @@ export const SurfaceShapeModal = ({ canvas }) => {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -213,7 +207,6 @@ export const SurfaceShapeModal = ({ canvas }) => {
} }
case 9: { case 9: {
const angleInRadians = Math.asin(length2 / length3) const angleInRadians = Math.asin(length2 / length3)
const pointer = canvas?.getPointer(e.e)
obj = new QPolygon( obj = new QPolygon(
[ [
{ x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 }, { x: pointer.x + length1 / 2, y: pointer.y + length2 / 2 },
@ -225,7 +218,7 @@ export const SurfaceShapeModal = ({ canvas }) => {
fill: 'transparent', fill: 'transparent',
stroke: 'black', stroke: 'black',
strokeWidth: 2, strokeWidth: 2,
selectable: true, selectable: false,
fontSize: fontSize, fontSize: fontSize,
name: 'guideTriangle', name: 'guideTriangle',
}, },
@ -233,6 +226,8 @@ export const SurfaceShapeModal = ({ canvas }) => {
} }
} }
canvas?.add(obj) canvas?.add(obj)
setCurrentPattern(obj)
canvas?.renderAll()
}) })
canvas?.on('mouse:down', (e) => { canvas?.on('mouse:down', (e) => {
@ -265,6 +260,44 @@ export const SurfaceShapeModal = ({ canvas }) => {
} }
} }
const setCurrentPattern = (polygon) => {
const { width, height, roofStyle } = roofMaterial
const roofRatio = window.devicePixelRatio || 1
const patternSourceCanvas = document.createElement('canvas')
if (roofStyle === 1) {
patternSourceCanvas.width = width * roofRatio
patternSourceCanvas.height = height * roofRatio
} else if (roofStyle === 2) {
patternSourceCanvas.width = width * 2
patternSourceCanvas.height = height * 2
}
const ctx = patternSourceCanvas.getContext('2d')
ctx.scale(roofRatio, roofRatio)
ctx.strokeStyle = 'green'
ctx.lineWidth = 0.4
//
if (roofStyle === 1) {
ctx.strokeRect(0, 0, 50, 30)
} else if (roofStyle === 2) {
//
ctx.strokeRect(0, 0, 200, 100)
ctx.strokeRect(100, 100, 200, 100)
}
//
const pattern = new fabric.Pattern({
source: patternSourceCanvas,
repeat: 'repeat',
})
polygon.set('fill', null)
polygon.set('fill', pattern)
canvas?.renderAll()
}
return ( return (
<> <>
<div> <div>
@ -301,8 +334,12 @@ export const SurfaceShapeModal = ({ canvas }) => {
<div> <div>
길이1 길이1
<Input type="number" name={'length1'} value={length1} onChange={setLength} /> <Input type="number" name={'length1'} value={length1} onChange={setLength} />
{length3 === 0 && (
<>
길이2 길이2
<Input type="number" name={'length2'} value={length2} onChange={setLength} /> <Input type="number" name={'length2'} value={length2} onChange={setLength} />
</>
)}
길이3 <Input type="number" name={'length3'} value={length3} onChange={setLength} /> 길이3 <Input type="number" name={'length3'} value={length3} onChange={setLength} />
</div> </div>
) : type === 2 ? ( ) : type === 2 ? (