@@ -80,7 +95,21 @@ export default forwardRef(function WallLine({ length1Ref, length2Ref, arrow1Ref,
diff --git a/src/hooks/common/useRoofFn.js b/src/hooks/common/useRoofFn.js
index eb640d76..1148eed3 100644
--- a/src/hooks/common/useRoofFn.js
+++ b/src/hooks/common/useRoofFn.js
@@ -1,4 +1,4 @@
-import { useRecoilValue, useResetRecoilState } from 'recoil'
+import { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil'
import { canvasState, currentObjectState } from '@/store/canvasAtom'
import { selectedRoofMaterialSelector } from '@/store/settingAtom'
import { ROOF_MATERIAL_LAYOUT } from '@/components/floor-plan/modal/placementShape/PlacementShapeSetting'
@@ -25,6 +25,7 @@ export function useRoofFn() {
const { addPitchText } = useLine()
const { setPolygonLinesActualSize } = usePolygon()
const { changeCorridorDimensionText } = useText()
+ const [outerLinePoints, setOuterLinePoints] = useRecoilState(outerLinePointsState)
//면형상 선택 클릭시 지붕 패턴 입히기
function setSurfaceShapePattern(polygon, mode = 'onlyBorder', trestleMode = false, roofMaterial, isForceChange = false, isDisplay = false) {
@@ -263,6 +264,9 @@ export function useRoofFn() {
const deltaX = roof.left - originalRoofLeft
const deltaY = roof.top - originalRoofTop
+ const originOuterLinePoints = [...outerLinePoints]
+ setOuterLinePoints(originOuterLinePoints.map((point) => ({ x: point.x + deltaX, y: point.y + deltaY })))
+
// Move all related objects by the delta
allRoofObject.forEach((obj) => {
if (obj.points !== undefined) {
diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js
index 54721d94..b26ee195 100644
--- a/src/hooks/surface/useSurfaceShapeBatch.js
+++ b/src/hooks/surface/useSurfaceShapeBatch.js
@@ -1,7 +1,13 @@
'use client'
import { useRecoilValue, useResetRecoilState } from 'recoil'
-import { canvasSettingState, canvasState, currentCanvasPlanState, currentObjectState, globalPitchState } from '@/store/canvasAtom'
+import {
+ canvasSettingState,
+ canvasState,
+ currentCanvasPlanState,
+ currentObjectState,
+ globalPitchState,
+} from '@/store/canvasAtom'
import { LINE_TYPE, MENU, POLYGON_TYPE } from '@/common/common'
import { getIntersectionPoint } from '@/util/canvas-util'
import { degreesToRadians } from '@turf/turf'
@@ -879,7 +885,7 @@ export function useSurfaceShapeBatch({ isHidden, setIsHidden }) {
}
})
- // roof.fire('polygonMoved')
+ roof.fire('polygonMoved')
roof.fire('modified')
drawDirectionArrow(roof)
changeCorridorDimensionText()
diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js
index 5e21e902..fe8fbd78 100644
--- a/src/hooks/usePolygon.js
+++ b/src/hooks/usePolygon.js
@@ -856,7 +856,7 @@ export const usePolygon = () => {
if (innerLine.attributes && polygonLine.attributes.type) {
// innerLine이 polygonLine보다 긴 경우 polygonLine.need를 false로 변경
if (polygonLine.length < innerLine.length) {
- if(polygonLine.lineName !== 'eaveHelpLine'){
+ if (polygonLine.lineName !== 'eaveHelpLine') {
polygonLine.need = false
}
}
@@ -867,7 +867,6 @@ export const usePolygon = () => {
// innerLine.attributes.isStart = true
// innerLine.parentLine = polygonLine
-
// 매핑된 innerLine의 attributes를 변경 (교차점 계산 전에 적용)
innerLineMapping.forEach((polygonLine, innerLine) => {
innerLine.attributes.planeSize = innerLine.attributes.planeSize ?? polygonLine.attributes.planeSize
@@ -877,7 +876,6 @@ export const usePolygon = () => {
innerLine.attributes.isStart = true
innerLine.parentLine = polygonLine
})
-
}
}
})
@@ -1387,7 +1385,7 @@ export const usePolygon = () => {
let representLine
// 지붕을 그리면서 기존 polygon의 line중 연결된 line을 찾는다.
- [...polygonLines, ...innerLines].forEach((line) => {
+ ;[...polygonLines, ...innerLines].forEach((line) => {
let startFlag = false
let endFlag = false
const startPoint = line.startPoint
@@ -1402,7 +1400,10 @@ export const usePolygon = () => {
})
if (startFlag && endFlag) {
- if (!representLines.includes(line) && line.attributes.type === LINE_TYPE.WALLLINE.EAVES) {
+ if (
+ !representLines.includes(line) &&
+ (line.attributes.type === LINE_TYPE.WALLLINE.EAVES || line.attributes.type === LINE_TYPE.WALLLINE.EAVE_HELP_LINE)
+ ) {
representLines.push(line)
} else if (!representLines.includes(line) && line.attributes.type === LINE_TYPE.WALLLINE.HIPANDGABLE) {
representLines.push(line)
@@ -1630,79 +1631,80 @@ export const usePolygon = () => {
// }
function findShortestPath(start, end, graph, epsilon = 1) {
- const startKey = pointToKey(start, epsilon);
- const endKey = pointToKey(end, epsilon);
+ const startKey = pointToKey(start, epsilon)
+ const endKey = pointToKey(end, epsilon)
// 거리와 이전 노드 추적
- const distances = { [startKey]: 0 };
- const previous = {};
- const visited = new Set();
+ const distances = { [startKey]: 0 }
+ const previous = {}
+ const visited = new Set()
// 우선순위 큐 (거리가 짧은 순으로 정렬)
- const queue = [{ key: startKey, dist: 0 }];
+ const queue = [{ key: startKey, dist: 0 }]
// 모든 노드 초기화
for (const key in graph) {
if (key !== startKey) {
- distances[key] = Infinity;
+ distances[key] = Infinity
}
}
// 우선순위 큐에서 다음 노드 선택
const getNextNode = () => {
- if (queue.length === 0) return null;
- queue.sort((a, b) => a.dist - b.dist);
- return queue.shift();
- };
+ if (queue.length === 0) return null
+ queue.sort((a, b) => a.dist - b.dist)
+ return queue.shift()
+ }
- let current;
+ let current
while ((current = getNextNode())) {
- const currentKey = current.key;
+ const currentKey = current.key
// 목적지에 도달하면 종료
- if (currentKey === endKey) break;
+ if (currentKey === endKey) break
// 이미 방문한 노드는 건너뜀
- if (visited.has(currentKey)) continue;
- visited.add(currentKey);
+ if (visited.has(currentKey)) continue
+ visited.add(currentKey)
// 인접 노드 탐색
for (const neighbor of graph[currentKey] || []) {
- const neighborKey = pointToKey(neighbor.point, epsilon);
- if (visited.has(neighborKey)) continue;
+ const neighborKey = pointToKey(neighbor.point, epsilon)
+ if (visited.has(neighborKey)) continue
- const alt = distances[currentKey] + neighbor.distance;
+ const alt = distances[currentKey] + neighbor.distance
// 더 짧은 경로를 찾은 경우 업데이트
if (alt < (distances[neighborKey] || Infinity)) {
- distances[neighborKey] = alt;
- previous[neighborKey] = currentKey;
+ distances[neighborKey] = alt
+ previous[neighborKey] = currentKey
// 우선순위 큐에 추가
- queue.push({ key: neighborKey, dist: alt });
+ queue.push({ key: neighborKey, dist: alt })
}
}
}
// 경로 재구성
- const path = [];
- let currentKey = endKey;
+ const path = []
+ let currentKey = endKey
// 시작점에 도달할 때까지 역추적
while (previous[currentKey] !== undefined) {
- const [x, y] = currentKey.split(',').map(Number);
- path.unshift({ x, y });
- currentKey = previous[currentKey];
+ const [x, y] = currentKey.split(',').map(Number)
+ path.unshift({ x, y })
+ currentKey = previous[currentKey]
}
// 시작점 추가
if (path.length > 0) {
- const [sx, sy] = startKey.split(',').map(Number);
- path.unshift({ x: sx, y: sy });
+ const [sx, sy] = startKey.split(',').map(Number)
+ path.unshift({ x: sx, y: sy })
}
- return path.length > 0 ? path : null;
+ return path.length > 0 ? path : null
}
+
// 최종 함수
function getPath(start, end, graph, epsilon = 1) {
// startPoint와 arrivalPoint가 될 수 있는 점은 line.attributes.type이 'default' 혹은 null이 아닌 line인 경우에만 가능