From 63f12021e441b87c698e65d0d23bbdbbfc0661bf Mon Sep 17 00:00:00 2001 From: yjnoh Date: Thu, 5 Jun 2025 17:17:40 +0900 Subject: [PATCH 1/8] test test --- package.json | 1 + src/app/api/image/canvas/route.js | 50 ++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 792ddde9..14b1299b 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "framer-motion": "^11.2.13", "fs": "^0.0.1-security", "iron-session": "^8.0.2", + "jimp": "^1.6.0", "js-cookie": "^3.0.5", "mathjs": "^13.0.2", "mssql": "^11.0.1", diff --git a/src/app/api/image/canvas/route.js b/src/app/api/image/canvas/route.js index 77d1c95c..317c84a4 100644 --- a/src/app/api/image/canvas/route.js +++ b/src/app/api/image/canvas/route.js @@ -2,6 +2,8 @@ import { NextResponse } from 'next/server' import { S3Client, PutObjectCommand, DeleteObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3' import sharp from 'sharp' import { v4 as uuidv4 } from 'uuid' +import { Jimp } from 'jimp' + const Bucket = process.env.AMPLIFY_BUCKET const s3 = new S3Client({ region: process.env.AWS_REGION, @@ -33,27 +35,39 @@ const cropImage = async (Key, width, height, left, top) => { }), ) + const image = await Jimp.read(Body) + image.autocrop({ tolerance: 0.0002, leaveBorder: 10 }) + const editedBuffer = await image.getBufferAsync(Jimp.MIME_PNG) + + return editedBuffer + // Convert stream to buffer - const chunks = [] - for await (const chunk of Body) { - chunks.push(chunk) - } - const imageBuffer = Buffer.concat(chunks) + // const chunks = [] + // for await (const chunk of Body) { + // chunks.push(chunk) + // } + // const imageBuffer = Buffer.concat(chunks) + + // const image = await Jimp.read(Body) + + // if (!checkResult) { + // processedImage = await image.toBuffer() + // } let processedImage - if (!checkResult) { - processedImage = await sharp(imageBuffer).toBuffer() - } else { - processedImage = await sharp(imageBuffer) - .extract({ - width: parseInt(width), - height: parseInt(height), - left: parseInt(left), - top: parseInt(top), - }) - .png() - .toBuffer() - } + // if (!checkResult) { + // processedImage = await sharp(imageBuffer).toBuffer() + // } else { + // processedImage = await sharp(imageBuffer) + // .extract({ + // width: parseInt(width), + // height: parseInt(height), + // left: parseInt(left), + // top: parseInt(top), + // }) + // .png() + // .toBuffer() + // } return processedImage } catch (error) { console.error('Error processing image:', error) From b6a2334fb8fa6ff1541b7c2d8c10b3d3b9281fd9 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 5 Jun 2025 17:25:45 +0900 Subject: [PATCH 2/8] jimp-test --- src/app/api/image/canvas/route.js | 8 +++++--- .../modal/circuitTrestle/CircuitTrestleSetting.jsx | 9 ++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/app/api/image/canvas/route.js b/src/app/api/image/canvas/route.js index 317c84a4..2afb6b8f 100644 --- a/src/app/api/image/canvas/route.js +++ b/src/app/api/image/canvas/route.js @@ -35,9 +35,11 @@ const cropImage = async (Key, width, height, left, top) => { }), ) + console.log(Body) + const image = await Jimp.read(Body) image.autocrop({ tolerance: 0.0002, leaveBorder: 10 }) - const editedBuffer = await image.getBufferAsync(Jimp.MIME_PNG) + const editedBuffer = await image.getBuffer('image/png') return editedBuffer @@ -54,7 +56,7 @@ const cropImage = async (Key, width, height, left, top) => { // processedImage = await image.toBuffer() // } - let processedImage + //let processedImage // if (!checkResult) { // processedImage = await sharp(imageBuffer).toBuffer() // } else { @@ -68,7 +70,7 @@ const cropImage = async (Key, width, height, left, top) => { // .png() // .toBuffer() // } - return processedImage + // return processedImage } catch (error) { console.error('Error processing image:', error) throw error diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index f4972c54..1b3fb9ef 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -25,6 +25,7 @@ import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupSta import { useImgLoader } from '@/hooks/floorPlan/useImgLoader' import { usePlan } from '@/hooks/usePlan' import { QcastContext } from '@/app/QcastProvider' +import { fabric } from 'fabric' const ALLOCATION_TYPE = { AUTO: 'auto', @@ -102,10 +103,12 @@ export default function CircuitTrestleSetting({ id }) { } }, []) + // 50%로 만든 다 const handleZoomClear = () => { - setCanvasZoom(100) - canvas.set({ zoom: 1 }) - canvas.viewportTransform = [1, 0, 0, 1, 0, 0] + // setCanvasZoom(100) + const x = canvas.width / 2 + const y = canvas.height / 2 + canvas.zoomToPoint(new fabric.Point(x, y), 0.5) canvas.renderAll() } From 22deb24fa25046541e731b7690491aeeab3f204b Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 5 Jun 2025 17:46:10 +0900 Subject: [PATCH 3/8] jimp-test --- .../modal/circuitTrestle/CircuitTrestleSetting.jsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index 1b3fb9ef..b19dded2 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -103,8 +103,8 @@ export default function CircuitTrestleSetting({ id }) { } }, []) - // 50%로 만든 다 - const handleZoomClear = () => { + // 50%로 압축 + const handleZoomCompression = () => { // setCanvasZoom(100) const x = canvas.width / 2 const y = canvas.height / 2 @@ -112,6 +112,13 @@ export default function CircuitTrestleSetting({ id }) { canvas.renderAll() } + const handleZoomClear = () => { + setCanvasZoom(100) + canvas.set({ zoom: 1 }) + canvas.viewportTransform = [1, 0, 0, 1, 0, 0] + canvas.renderAll() + } + // 수동할당 시 모듈 삭제 // 시리즈중 자동으로 추천 PCS 정보 조회 @@ -353,7 +360,7 @@ export default function CircuitTrestleSetting({ id }) { // 회로할당(승압설정) 저장 버튼 클릭 시 const onApply = async () => { - handleZoomClear() + handleZoomCompression() setAllModuleSurfaceIsComplete(false) setIsGlobalLoading(true) @@ -385,6 +392,7 @@ export default function CircuitTrestleSetting({ id }) { if (result) { handleCanvasToPng(2) + handleZoomClear() // 견적서 저장 await saveEstimate(result) } else { From a0c64bdaa8f0b0e94e619752dae3747342727864 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 5 Jun 2025 17:49:37 +0900 Subject: [PATCH 4/8] jimp-test --- src/app/api/image/canvas/route.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app/api/image/canvas/route.js b/src/app/api/image/canvas/route.js index 2afb6b8f..2a20da92 100644 --- a/src/app/api/image/canvas/route.js +++ b/src/app/api/image/canvas/route.js @@ -1,6 +1,5 @@ import { NextResponse } from 'next/server' -import { S3Client, PutObjectCommand, DeleteObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3' -import sharp from 'sharp' +import { DeleteObjectCommand, GetObjectCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3' import { v4 as uuidv4 } from 'uuid' import { Jimp } from 'jimp' @@ -25,8 +24,6 @@ const checkArea = (obj) => { const cropImage = async (Key, width, height, left, top) => { try { - const checkResult = checkArea({ width, height, left, top }) - // Get the image from S3 const { Body } = await s3.send( new GetObjectCommand({ @@ -35,13 +32,16 @@ const cropImage = async (Key, width, height, left, top) => { }), ) - console.log(Body) + const chunks = [] + for await (const chunk of Body) { + chunks.push(chunk) + } + const buffer = Buffer.concat(chunks) + + const image = await Jimp.read(buffer) - const image = await Jimp.read(Body) image.autocrop({ tolerance: 0.0002, leaveBorder: 10 }) - const editedBuffer = await image.getBuffer('image/png') - - return editedBuffer + return await image.getBuffer('image/png') // Convert stream to buffer // const chunks = [] From bb7b9c020f98fdd22a49a45975e9a08aae178476 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 5 Jun 2025 18:28:58 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=BA=A1?= =?UTF-8?q?=EC=B3=90=20=EC=A0=84=EC=B2=98=EB=A6=AC=20=ED=9B=84=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../circuitTrestle/CircuitTrestleSetting.jsx | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index b19dded2..d11fe417 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -26,6 +26,7 @@ import { useImgLoader } from '@/hooks/floorPlan/useImgLoader' import { usePlan } from '@/hooks/usePlan' import { QcastContext } from '@/app/QcastProvider' import { fabric } from 'fabric' +import { fontSelector } from '@/store/fontAtom' const ALLOCATION_TYPE = { AUTO: 'auto', @@ -45,6 +46,9 @@ export default function CircuitTrestleSetting({ id }) { const { managementState, setManagementState } = useContext(GlobalDataContext) const selectedModules = useRecoilValue(selectedModuleState) const { getPcsAutoRecommendList, getPcsVoltageChk, getPcsVoltageStepUpList, getPcsManualConfChk } = useMasterController() + const flowText = useRecoilValue(fontSelector('flowText')) + const lengthText = useRecoilValue(fontSelector('lengthText')) + const circuitNumberText = useRecoilValue(fontSelector('circuitNumberText')) // 회로할당(승합설정)에서 선택된 값들을 저장할 상태 추가 const [selectedStepUpValues, setSelectedStepUpValues] = useState({}) @@ -103,19 +107,26 @@ export default function CircuitTrestleSetting({ id }) { } }, []) - // 50%로 압축 - const handleZoomCompression = () => { + // 캡쳐 전 처리 + const beforeCapture = () => { // setCanvasZoom(100) const x = canvas.width / 2 const y = canvas.height / 2 canvas.zoomToPoint(new fabric.Point(x, y), 0.5) + changeFontSize('lengthText', '28') + changeFontSize('circuitNumber', '28') + changeFontSize('flowText', '28') canvas.renderAll() } - const handleZoomClear = () => { + // 캡쳐 후 처리 + const afterCapture = () => { setCanvasZoom(100) canvas.set({ zoom: 1 }) canvas.viewportTransform = [1, 0, 0, 1, 0, 0] + changeFontSize('lengthText', lengthText.fontSize.value) + changeFontSize('circuitNumber', circuitNumberText.fontSize.value) + changeFontSize('flowText', flowText.fontSize.value) canvas.renderAll() } @@ -360,7 +371,7 @@ export default function CircuitTrestleSetting({ id }) { // 회로할당(승압설정) 저장 버튼 클릭 시 const onApply = async () => { - handleZoomCompression() + beforeCapture() setAllModuleSurfaceIsComplete(false) setIsGlobalLoading(true) @@ -392,7 +403,7 @@ export default function CircuitTrestleSetting({ id }) { if (result) { handleCanvasToPng(2) - handleZoomClear() + afterCapture() // 견적서 저장 await saveEstimate(result) } else { @@ -402,6 +413,16 @@ export default function CircuitTrestleSetting({ id }) { // removeNotAllocationModules() } + const changeFontSize = (name, size) => { + const textObjs = canvas?.getObjects().filter((obj) => obj.name === name) + textObjs.forEach((obj) => { + obj.set({ + fontSize: size, + }) + }) + canvas.renderAll() + } + // 이전 버튼 클릭 시 const onClickPrev = () => { // setAllocationType(ALLOCATION_TYPE.AUTO) From 711df07aa65b74573a67fe1691738b19a0f93874 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 5 Jun 2025 18:35:30 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=ED=9A=8C=EB=A1=9C=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=ED=95=AD=EC=83=81=20=EB=B3=B4=EC=9D=B4=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index d11fe417..d8ae2084 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -382,12 +382,9 @@ export default function CircuitTrestleSetting({ id }) { obj.pcses = getStepUpListData() }) - setViewCircuitNumberTexts(false) - handleCanvasToPng(1) //회로할당 저장 시 result=null인 경우에도 회로번호 텍스트 표시 유지 처리 - setViewCircuitNumberTexts(true) // 회로할당 저장 클릭 시 // 가대 및 지지금구 설치 From a708f28c36a4d6dfc5023feed772a184e4518f0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=8B=9D?= <43837214+Minsiki@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:29:55 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=EC=A0=81=EC=9A=A9=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=88=98=ED=96=89=20=ED=9B=84=20=ED=8C=9D=EC=97=85=20=EB=8B=AB?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useRoofAllocationSetting.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 5fbc3ab3..53d1956b 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -314,7 +314,8 @@ export function useRoofAllocationSetting(id) { setSurfaceShapePattern(currentObject, roofDisplay.column, false, selectedRoofMaterial, true) drawDirectionArrow(currentObject) modifyModuleSelectionData() - closeAll() + // closeAll() + closePopup(id) basicSettingSave() setModuleSelectionData({ ...moduleSelectionData, roofConstructions: newRoofList }) } From 6f755b8f07a969a7cf79c6f5b33842eceafdaa0f Mon Sep 17 00:00:00 2001 From: ysCha Date: Mon, 9 Jun 2025 17:07:51 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A0=80=EC=9E=A5=EC=9D=B4=ED=9B=84=20?= =?UTF-8?q?=EA=B7=B8=EB=A6=BC=EC=9C=BC=EB=A1=9C=20=ED=81=B4=EB=A6=AD?= =?UTF-8?q?=EC=8B=9C=20=EC=97=90=EB=9F=AC=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSubHeader.jsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/management/StuffSubHeader.jsx b/src/components/management/StuffSubHeader.jsx index fccafbdc..6cbfd862 100644 --- a/src/components/management/StuffSubHeader.jsx +++ b/src/components/management/StuffSubHeader.jsx @@ -56,19 +56,20 @@ export default function StuffSubHeader({ type }) { */ const moveFloorPlan = () => { setFloorPlanObjectNo({ floorPlanObjectNo: objectNo }) + const param = { - pid: managementState?.planList?.length === 0 ? '1' : managementState?.planList[0].planNo, + pid: managementState?.planList?.length > 0 ? managementState?.planList[0].planNo : '1', objectNo: objectNo, } - if (managementState?.planList?.length === 0) { - setSelectedMenu('surface') - } else { + if (managementState?.planList?.length > 0) { if (managementState?.planList[0].estimateDate) { setSelectedMenu('module') } else { setSelectedMenu('surface') } + } else { + setSelectedMenu('surface') } const url = `/floor-plan?${queryStringFormatter(param)}`