From edeb766b3a612ac75dff9cf9ca87e5de4868faaa Mon Sep 17 00:00:00 2001 From: sangwook yoo Date: Wed, 24 Jun 2026 14:55:34 +0900 Subject: [PATCH] =?UTF-8?q?feat(roof-shape):=20PDF=20=EC=A7=80=EB=B6=95?= =?UTF-8?q?=ED=98=95=EC=83=81=20=EB=A7=A4=EC=B9=AD=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EC=84=A0=ED=83=9D(pre-select)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [작업내용] : - 마운트 시 pdfRoofShapeDescriptorState → matchRoofShapePattern → setShapeNum(매칭 버튼 pre-select) - pre-select only: handleSave 비자동(사용자 [적용]) - consume-once: 매칭 시도 후 atom 리셋(비-PDF 재진입 stale 방지) - 매처 null(복합형) 시 강제 선택 없이 기본값 유지 - 런타임(실제 분기별 pre-select) 수동 검증 잔여 Co-Authored-By: Claude Opus 4.8 --- src/hooks/roofcover/useRoofShapeSetting.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/hooks/roofcover/useRoofShapeSetting.js b/src/hooks/roofcover/useRoofShapeSetting.js index f5c84f5b..5d4936b9 100644 --- a/src/hooks/roofcover/useRoofShapeSetting.js +++ b/src/hooks/roofcover/useRoofShapeSetting.js @@ -1,12 +1,13 @@ import { useEffect, useRef, useState } from 'react' import { useMessage } from '@/hooks/useMessage' -import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' +import { useRecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil' import { ANGLE_TYPE, canvasState, currentAngleTypeSelector, currentMenuState, currentObjectState, pitchTextSelector } from '@/store/canvasAtom' import { LINE_TYPE, POLYGON_TYPE } from '@/common/common' import { usePolygon } from '@/hooks/usePolygon' import { useMode } from '@/hooks/useMode' import { useLine } from '@/hooks/useLine' -import { outerLineFixState } from '@/store/outerLineAtom' +import { outerLineFixState, pdfRoofShapeDescriptorState } from '@/store/outerLineAtom' +import { matchRoofShapePattern } from '@/common/roofShapePattern' import { useSwal } from '@/hooks/useSwal' import { usePopup } from '@/hooks/usePopup' import { getChonByDegree, getDegreeByChon } from '@/util/canvas-util' @@ -49,6 +50,8 @@ export function useRoofShapeSetting(id) { const setCurrentMenu = useSetRecoilState(currentMenuState) const outerLineFix = useRecoilValue(outerLineFixState) + const pdfRoofShapeDescriptor = useRecoilValue(pdfRoofShapeDescriptorState) + const resetPdfRoofShapeDescriptor = useResetRecoilState(pdfRoofShapeDescriptorState) const isFixRef = useRef(false) @@ -87,6 +90,14 @@ export function useRoofShapeSetting(id) { closePopup(id) return } + + // PDF 분석 지붕형상 descriptor 가 있으면 매칭 버튼을 pre-select 한다(자동 선택만 — handleSave 는 사용자 [적용]). + if (pdfRoofShapeDescriptor) { + const matched = matchRoofShapePattern(pdfRoofShapeDescriptor) + if (matched != null) setShapeNum(matched) + resetPdfRoofShapeDescriptor() // consume-once: 비-PDF 재진입 시 stale 적용 방지 + } + return () => { if (!isFixRef.current) { return