From eee74edf9e9a45e534970af14fbdfc84e3935518 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 4 Dec 2025 17:13:34 +0900 Subject: [PATCH] =?UTF-8?q?=EC=99=B8=EB=B2=BD=EC=84=A0=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/setting01/FirstOption.jsx | 19 +++++++- .../roofcover/useRoofAllocationSetting.js | 45 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/components/floor-plan/modal/setting01/FirstOption.jsx b/src/components/floor-plan/modal/setting01/FirstOption.jsx index 51a52cdb..ef2d8e0b 100644 --- a/src/components/floor-plan/modal/setting01/FirstOption.jsx +++ b/src/components/floor-plan/modal/setting01/FirstOption.jsx @@ -1,8 +1,10 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect } from 'react' import { useMessage } from '@/hooks/useMessage' import { POLYGON_TYPE } from '@/common/common' import { useEvent } from '@/hooks/useEvent' import { useRoofFn } from '@/hooks/common/useRoofFn' +import { outlineDisplaySelector } from '@/store/settingAtom' +import { useRecoilValue } from 'recoil' export default function FirstOption(props) { const { getMessage } = useMessage() @@ -11,6 +13,7 @@ export default function FirstOption(props) { const { option1, option2, dimensionDisplay } = settingModalFirstOptions const { initEvent } = useEvent() const { setSurfaceShapePattern } = useRoofFn() + const outlineDisplay = useRecoilValue(outlineDisplaySelector) // 데이터를 최초 한 번만 조회 useEffect(() => { @@ -18,6 +21,13 @@ export default function FirstOption(props) { setSettingsDataSave({ ...settingsData }) }, []) + useEffect(() => { + const outline = canvas.getObjects().filter((obj) => obj.name === 'originRoofOuterLine') + outline.forEach((obj) => { + obj.visible = outlineDisplay + }) + }, [outlineDisplay]) + const onClickOption = async (item) => { let dimensionDisplay = settingModalFirstOptions?.dimensionDisplay let option1 = settingModalFirstOptions?.option1 @@ -58,7 +68,12 @@ export default function FirstOption(props) { // setSettingModalFirstOptions({ ...settingModalFirstOptions, option1: [...options] }) } - setSettingsData({ ...settingsData, option1: [...option1], option2: [...option2], dimensionDisplay: [...dimensionDisplay] }) + setSettingsData({ + ...settingsData, + option1: [...option1], + option2: [...option2], + dimensionDisplay: [...dimensionDisplay], + }) } // useEffect(() => { diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 799e3a72..8839516f 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -9,6 +9,7 @@ import { basicSettingState, correntObjectNoState, corridorDimensionSelector, + outlineDisplaySelector, roofDisplaySelector, roofMaterialsSelector, selectedRoofMaterialSelector, @@ -59,9 +60,11 @@ export function useRoofAllocationSetting(id) { const { saveCanvas } = usePlan() const [roofsStore, setRoofsStore] = useRecoilState(roofsState) const [moduleSelectionData, setModuleSelectionData] = useRecoilState(moduleSelectionDataState) + const outerLinePoints = useRecoilValue(outerLinePointsState) const resetPoints = useResetRecoilState(outerLinePointsState) const [corridorDimension, setCorridorDimension] = useRecoilState(corridorDimensionSelector) const { changeCorridorDimensionText } = useText() + const outlineDisplay = useRecoilValue(outlineDisplaySelector) useEffect(() => { /** 배치면 초기설정에서 선택한 지붕재 배열 설정 */ @@ -303,11 +306,53 @@ export function useRoofAllocationSetting(id) { addPopup(popupId, 1, ) } else { apply() + //기존 지붕 선은 남겨둔다. + drawOriginRoofLine() resetPoints() + basicSettingSave() } } + const drawOriginRoofLine = () => { + // outerLinePoints 배열을 이용하여 빨간색 Line 객체들 생성 + if (outerLinePoints && outerLinePoints.length > 1) { + // 연속된 점들을 연결하여 라인 생성 + for (let i = 0; i < outerLinePoints.length - 1; i++) { + const point1 = outerLinePoints[i] + const point2 = outerLinePoints[i + 1] + + const line = new fabric.Line([point1.x, point1.y, point2.x, point2.y], { + stroke: 'black', + strokeDashArray: [5, 2], + strokeWidth: 1, + selectable: false, + name: 'originRoofOuterLine', + visible: outlineDisplay, + }) + + canvas.add(line) + } + + // 마지막 점과 첫 점을 연결하여 폐곡선 만들기 + if (outerLinePoints.length > 2) { + const lastPoint = outerLinePoints[outerLinePoints.length - 1] + const firstPoint = outerLinePoints[0] + + const closingLine = new fabric.Line([lastPoint.x, lastPoint.y, firstPoint.x, firstPoint.y], { + stroke: 'red', + strokeWidth: 2, + selectable: false, + name: 'originRoofOuterLine', + }) + + canvas.add(closingLine) + } + + canvas.renderAll() + } + } + /** * 지붕재 오른쪽 마우스 클릭 후 단일로 지붕재 변경 필요한 경우 */