guideLine 추가
This commit is contained in:
parent
58820d2bf2
commit
11fec70ac2
@ -25,6 +25,7 @@ export function useMode() {
|
|||||||
const points = useRef([])
|
const points = useRef([])
|
||||||
const historyPoints = useRef([])
|
const historyPoints = useRef([])
|
||||||
const historyLines = useRef([])
|
const historyLines = useRef([])
|
||||||
|
const startPoint = useRef()
|
||||||
const [canvas, setCanvas] = useState(null)
|
const [canvas, setCanvas] = useState(null)
|
||||||
const [zoom, setZoom] = useState(100)
|
const [zoom, setZoom] = useState(100)
|
||||||
const [fontSize] = useRecoilState(fontSizeState)
|
const [fontSize] = useRecoilState(fontSizeState)
|
||||||
@ -35,6 +36,8 @@ export function useMode() {
|
|||||||
|
|
||||||
const [endPoint, setEndPoint] = useState(null)
|
const [endPoint, setEndPoint] = useState(null)
|
||||||
|
|
||||||
|
const pointCount = useRef(0)
|
||||||
|
|
||||||
const [roofPolygonPattern, setRoofPolygonPattern] = useRecoilState(roofPolygonPatternArrayState)
|
const [roofPolygonPattern, setRoofPolygonPattern] = useRecoilState(roofPolygonPatternArrayState)
|
||||||
|
|
||||||
const [canvasSize] = useRecoilState(canvasSizeState)
|
const [canvasSize] = useRecoilState(canvasSizeState)
|
||||||
@ -102,6 +105,62 @@ export function useMode() {
|
|||||||
canvas?.renderAll()
|
canvas?.renderAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (pointCount.current <= 2) {
|
||||||
|
removeGuideLines()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
drawGuideLines()
|
||||||
|
}, [pointCount.current])
|
||||||
|
|
||||||
|
const removeGuideLines = () => {
|
||||||
|
const guideLines = canvas?._objects.filter((obj) => obj.name === 'guideLine')
|
||||||
|
guideLines?.forEach((item) => canvas?.remove(item))
|
||||||
|
}
|
||||||
|
|
||||||
|
const drawGuideLines = () => {
|
||||||
|
// 이름이 guideLine인 가이드라인을 제거합니다.
|
||||||
|
removeGuideLines()
|
||||||
|
|
||||||
|
const arrivalX = startPoint.current?.left
|
||||||
|
const arrivalY = startPoint.current?.top
|
||||||
|
|
||||||
|
const lastX = endPoint?.left
|
||||||
|
const lastY = endPoint?.top
|
||||||
|
|
||||||
|
if (lastX === arrivalX || lastY === arrivalY) {
|
||||||
|
// 둘중 하나라도 같으면 guideLine은 한개만 생성
|
||||||
|
const guideLine = new QLine([lastX, lastY, arrivalX, arrivalY], {
|
||||||
|
fontSize: fontSize,
|
||||||
|
stroke: 'black',
|
||||||
|
strokeWidth: 1,
|
||||||
|
strokeDashArray: [1, 1, 1],
|
||||||
|
})
|
||||||
|
guideLine.name = 'guideLine'
|
||||||
|
canvas?.add(guideLine)
|
||||||
|
} else {
|
||||||
|
const guideLine1 = new QLine([lastX, lastY, lastX, arrivalY], {
|
||||||
|
fontSize: fontSize,
|
||||||
|
stroke: 'black',
|
||||||
|
strokeWidth: 1,
|
||||||
|
strokeDashArray: [1, 1, 1],
|
||||||
|
})
|
||||||
|
|
||||||
|
const guideLine2 = new QLine([guideLine1.x2, guideLine1.y2, arrivalX, arrivalY], {
|
||||||
|
fontSize: fontSize,
|
||||||
|
stroke: 'black',
|
||||||
|
strokeWidth: 1,
|
||||||
|
strokeDashArray: [1, 1, 1],
|
||||||
|
})
|
||||||
|
|
||||||
|
guideLine1.name = 'guideLine'
|
||||||
|
guideLine2.name = 'guideLine'
|
||||||
|
|
||||||
|
canvas?.add(guideLine1)
|
||||||
|
canvas?.add(guideLine2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 마우스 포인터의 가이드라인을 제거합니다.
|
* 마우스 포인터의 가이드라인을 제거합니다.
|
||||||
*/
|
*/
|
||||||
@ -125,12 +184,10 @@ export function useMode() {
|
|||||||
const pointer = canvas?.getPointer(e.e)
|
const pointer = canvas?.getPointer(e.e)
|
||||||
|
|
||||||
// 마우스 포인터 위치랑 endPoint를 연결하는 line 생성
|
// 마우스 포인터 위치랑 endPoint를 연결하는 line 생성
|
||||||
const line = new QLine([endPoint.left, endPoint.top, pointer.x, pointer.y], {
|
const line = new fabric.Line([endPoint.left, endPoint.top, pointer.x, pointer.y], {
|
||||||
stroke: 'black',
|
stroke: 'black',
|
||||||
strokeWidth: 2,
|
strokeWidth: 1,
|
||||||
selectable: false,
|
selectable: false,
|
||||||
viewLengthText: true,
|
|
||||||
fontSize: fontSize,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
line.set({ name: 'connectLine' })
|
line.set({ name: 'connectLine' })
|
||||||
@ -235,8 +292,6 @@ export function useMode() {
|
|||||||
selectable: false,
|
selectable: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
setEndPoint(endPointCircle)
|
|
||||||
|
|
||||||
canvas?.add(endPointCircle)
|
canvas?.add(endPointCircle)
|
||||||
|
|
||||||
historyPoints.current.push(endPointCircle)
|
historyPoints.current.push(endPointCircle)
|
||||||
@ -244,6 +299,10 @@ export function useMode() {
|
|||||||
points.current.forEach((point) => {
|
points.current.forEach((point) => {
|
||||||
canvas?.remove(point)
|
canvas?.remove(point)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
setEndPoint(endPointCircle)
|
||||||
|
pointCount.current = pointCount.current + 1
|
||||||
|
|
||||||
points.current = [endPointCircle]
|
points.current = [endPointCircle]
|
||||||
|
|
||||||
canvas.renderAll()
|
canvas.renderAll()
|
||||||
@ -317,6 +376,8 @@ export function useMode() {
|
|||||||
|
|
||||||
const changeMode = (canvas, mode) => {
|
const changeMode = (canvas, mode) => {
|
||||||
setEndPoint(null)
|
setEndPoint(null)
|
||||||
|
pointCount.current = 0
|
||||||
|
|
||||||
setMode(mode)
|
setMode(mode)
|
||||||
// mode변경 시 이전 이벤트 제거
|
// mode변경 시 이전 이벤트 제거
|
||||||
setCanvas(canvas)
|
setCanvas(canvas)
|
||||||
@ -338,6 +399,10 @@ export function useMode() {
|
|||||||
originY: 'center',
|
originY: 'center',
|
||||||
selectable: false,
|
selectable: false,
|
||||||
})
|
})
|
||||||
|
if (!startPoint.current) {
|
||||||
|
startPoint.current = circle
|
||||||
|
pointCount.current = pointCount.current + 1
|
||||||
|
}
|
||||||
|
|
||||||
setEndPoint(circle)
|
setEndPoint(circle)
|
||||||
|
|
||||||
@ -347,6 +412,7 @@ export function useMode() {
|
|||||||
|
|
||||||
if (points.current.length === 2) {
|
if (points.current.length === 2) {
|
||||||
const length = Number(prompt('길이를 입력하세요:'))
|
const length = Number(prompt('길이를 입력하세요:'))
|
||||||
|
|
||||||
// length 값이 숫자가 아닌 경우
|
// length 값이 숫자가 아닌 경우
|
||||||
if (isNaN(length) || length === 0) {
|
if (isNaN(length) || length === 0) {
|
||||||
//마지막 추가 된 points 제거합니다.
|
//마지막 추가 된 points 제거합니다.
|
||||||
@ -382,40 +448,10 @@ export function useMode() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const line = new QLine(
|
const verticalLength = scaledVector.y
|
||||||
[points.current[0].left, points.current[0].top, points.current[0].left + scaledVector.x, points.current[0].top + scaledVector.y],
|
const horizontalLength = scaledVector.x
|
||||||
{
|
|
||||||
stroke: 'black',
|
|
||||||
strokeWidth: 2,
|
|
||||||
selectable: false,
|
|
||||||
viewLengthText: true,
|
|
||||||
direction: getDirection(points.current[0], points.current[1]),
|
|
||||||
fontSize: fontSize,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
pushHistoryLine(line)
|
drawCircleAndLine(verticalLength, horizontalLength)
|
||||||
|
|
||||||
// 라인의 끝에 점을 추가합니다.
|
|
||||||
const endPointCircle = new fabric.Circle({
|
|
||||||
radius: 1,
|
|
||||||
fill: 'transparent', // 원 안을 비웁니다.
|
|
||||||
stroke: 'black', // 원 테두리 색상을 검은색으로 설정합니다.
|
|
||||||
left: points.current[0].left + scaledVector.x,
|
|
||||||
top: points.current[0].top + scaledVector.y,
|
|
||||||
originX: 'center',
|
|
||||||
originY: 'center',
|
|
||||||
selectable: false,
|
|
||||||
})
|
|
||||||
setEndPoint(endPointCircle)
|
|
||||||
canvas?.add(endPointCircle)
|
|
||||||
|
|
||||||
historyPoints.current.push(endPointCircle)
|
|
||||||
|
|
||||||
points.current.forEach((point) => {
|
|
||||||
canvas?.remove(point)
|
|
||||||
})
|
|
||||||
points.current = [endPointCircle]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user