diff --git a/src/components/Roof.jsx b/src/components/Roof.jsx
index 0b4b5ea7..eee737bf 100644
--- a/src/components/Roof.jsx
+++ b/src/components/Roof.jsx
@@ -15,6 +15,8 @@ export default function Roof() {
handlePaste,
handleRotate,
attachCustomControlOnPolygon,
+ saveImage,
+ loadImage
} = useCanvas('canvas')
const addRect = () => {
@@ -181,7 +183,19 @@ export default function Roof() {
>
45도 회전
+
+
+
{
if (canvas) {
initialize()
- canvas.on('object:added', onChange)
- canvas.on('object:added', () => {
- document.addEventListener('keydown', handleKeyDown)
- })
- canvas.on('object:modified', onChange)
- canvas.on('object:removed', onChange)
}
}, [canvas])
+ const addEventOnCanvas = () => {
+ canvas?.on('object:added', onChange)
+ canvas?.on('object:modified', onChange)
+ canvas?.on('object:removed', onChange)
+ canvas?.on('object:added', () => {
+ document.addEventListener('keydown', handleKeyDown)
+ })
+ }
+ const removeEventOnCanvas = () => {
+ canvas?.off('object:added')
+ canvas?.off('object:modified')
+ canvas?.off('object:removed')
+ canvas?.off('object:added')
+
+ }
/**
* 눈금 그리기
*/
const initialize = () => {
canvas?.clear()
+ // 기존 이벤트가 있을 경우 제거한다.
+ removeEventOnCanvas()
+
const width = canvas?.getWidth()
const height = canvas?.getHeight()
@@ -94,6 +105,8 @@ export function useCanvas(id) {
addShape(verticalLine)
}
+
+ addEventOnCanvas()
}
/**
@@ -381,6 +394,45 @@ export function useCanvas(id) {
canvas?.requestRenderAll()
}
+ /**
+ * 이미지로 저장하는 함수
+ * @param {string} title - 저장할 이미지 이름
+ */
+ const saveImage = (title = 'canvas') => {
+ const dataURL = canvas?.toDataURL('png')
+
+ // 이미지 다운로드 링크 생성
+ const link = document.createElement('a');
+ link.download = `${title}.png`;
+ link.href = dataURL;
+
+ // 링크 클릭하여 이미지 다운로드
+ link.click();
+ }
+
+ /**
+ * 이미지로 저장한 내용을 업로드 후 canvas에 그리기
+ */
+
+ const loadImage = (e) => {
+
+ const file = e.target.files[0];
+ const reader = new FileReader();
+
+ reader.onload = function(e) {
+ const dataURL = e.target.result;
+ fabric.Image.fromURL(dataURL, function(img) {
+ // 이미지 객체 생성
+ img.selectable = false
+ canvas?.add(img);
+
+ canvas?.renderAll();
+ });
+ };
+
+ reader.readAsDataURL(file);
+ }
+
return {
canvas,
addShape,
@@ -393,5 +445,7 @@ export function useCanvas(id) {
handlePaste,
handleRotate,
attachCustomControlOnPolygon,
+ saveImage,
+ loadImage
}
}