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 */ } } })