From de5b9f1fb72d6c4c092001712e4361043190b171 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Wed, 20 May 2026 15:10:48 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8F=84=EB=A8=B8=20undo=20redo=20=ED=9B=84=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=ED=95=98=EB=A9=B4=20lengthText=20?= =?UTF-8?q?=EB=82=A8=EC=95=84=20=EC=9E=88=EB=8A=94=20=ED=98=84=EC=83=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EB=8F=84=EB=A8=B8=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=20=EC=8B=9C=20=EB=91=90=EB=B2=88=20=EA=B3=84=EC=82=B0=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=ED=98=84=EC=83=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/object/useObjectBatch.js | 16 +++++----------- src/hooks/useUndoRedo.js | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index ddcb725d..5b204406 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -1436,8 +1436,6 @@ export function useObjectBatch({ isHidden, setIsHidden }) { const originObj = { ...obj } const turfSurface = pointsToTurfPolygon(parentSurface.getCurrentPoints()) - const originLeft = obj.left - const originTop = obj.top addCanvasMouseEventListener('mouse:up', (e) => { //개구, 그림자 타입일 경우 폴리곤 타입 변경 @@ -1482,15 +1480,11 @@ export function useObjectBatch({ isHidden, setIsHidden }) { }) if (obj.name === BATCH_TYPE.TRIANGLE_DORMER || obj.name === BATCH_TYPE.PENTAGON_DORMER) { - const calcLeft = obj.left - originLeft - const calcTop = obj.top - originTop - - const currentDormerPoints = obj.getCurrentPoints().map((item) => { - return { - x: item.x + calcLeft, - y: item.y + calcTop, - } - }) + // getCurrentPoints() 는 calcTransformMatrix() 기반으로 이미 이동된 월드 좌표를 반환한다. + // 과거 코드에서 (obj.left - originLeft) delta 를 다시 더해 2배 이동된 좌표로 검사 → + // 빠르게 이동 시 도머가 지붕 내부에 있어도 within=false 가 되어 alert 오발생. + obj.setCoords() + const currentDormerPoints = obj.getCurrentPoints() const turfObject = pointsToTurfPolygon(currentDormerPoints) diff --git a/src/hooks/useUndoRedo.js b/src/hooks/useUndoRedo.js index 6ad030fe..e0f8bebc 100644 --- a/src/hooks/useUndoRedo.js +++ b/src/hooks/useUndoRedo.js @@ -335,10 +335,26 @@ export function useUndoRedo() { poly.name !== POLYGON_TYPE.MODULE_SETUP_SURFACE && poly.name !== POLYGON_TYPE.OBJECT_SURFACE + // lengthText 인스턴스를 parentId 기준으로 한 번만 모아둔다 (texts 배열 복원에 재사용) + const lengthTextsByParent = new Map() + objects.forEach((obj) => { + if (obj.name === 'lengthText' && obj.parentId) { + const arr = lengthTextsByParent.get(obj.parentId) || [] + arr.push(obj) + lengthTextsByParent.set(obj.parentId, arr) + } + }) + const qPolygons = objects.filter(shouldRebuildText) qPolygons.forEach((polygon) => { try { polygon.initLines() + // texts 배열 참조 복원 (재생성이 아닌 기존 lengthText 인스턴스 연결만) + // commonDeleteText 가 group._objects[i].texts / object.texts 를 통해 제거하므로, + // loadFromJSON 후 끊긴 참조를 다시 이어주지 않으면 삭제 시 lengthText 가 잔존한다. + if (polygon.id) { + polygon.texts = lengthTextsByParent.get(polygon.id) || [] + } } catch (e) { /* skip */ } }) @@ -351,6 +367,9 @@ export function useUndoRedo() { try { if (!child.canvas) child.canvas = canvas child.initLines?.() + if (child.id) { + child.texts = lengthTextsByParent.get(child.id) || [] + } } catch (e) { /* skip */ } } })