From a055257961f7ed5823f5825a37a50ba375908f77 Mon Sep 17 00:00:00 2001 From: ysCha Date: Fri, 10 Jul 2026 08:19:41 +0900 Subject: [PATCH 1/2] =?UTF-8?q?debug:=20=EC=96=91=EB=8B=A8=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=B0=EC=B6=9C=20=EC=9A=B4=EC=98=81=20?= =?UTF-8?q?=EC=A7=84=EB=8B=A8=20=EB=A1=9C=EA=B7=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=E2=80=94=20Case1/Case2=20=EC=86=8C=EA=B3=84=20+=20[DBL-CABLE-P?= =?UTF-8?q?ROD]=20=EC=BD=98=EC=86=94=20=EB=8D=A4=ED=94=84,=20PassivityCirc?= =?UTF-8?q?uitAllocation=20debugger=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4 --- .../step/type/PassivityCircuitAllocation.jsx | 1 - src/hooks/module/useTrestle.js | 59 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx b/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx index 71f2ce17..962830c0 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/type/PassivityCircuitAllocation.jsx @@ -180,7 +180,6 @@ export default function PassivityCircuitAllocation(props) { .filter((obj) => obj.name === POLYGON_TYPE.MODULE && obj.pcs && obj.pcs.id === selectedPcs.id) // 1. 북면모듈, 북면외모듈 혼합 여부 체크 const targetModuleInfos = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE && targetModules.includes(obj.id)) - debugger const newTargetModuleGroup = [...new Set(targetModuleInfos.concat(originHaveThisPcsModules).map((obj) => obj.moduleInfo.northModuleYn))] if (newTargetModuleGroup.length > 1) { diff --git a/src/hooks/module/useTrestle.js b/src/hooks/module/useTrestle.js index 81a96a2f..1160391f 100644 --- a/src/hooks/module/useTrestle.js +++ b/src/hooks/module/useTrestle.js @@ -3384,18 +3384,75 @@ export const useTrestle = () => { const surfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) const modules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE) + let case1Cnt = 0 + let case2Cnt = 0 + const perSurfaceGroups = [] + surfaces.forEach((surface) => { const modules = surface.modules // 1. 현재 surface의 모듈들을 그룹화 const groupInSurface = groupPoints(modules, surface) + const surfaceCnt = countMatchingCircuitNumbers(groupInSurface) - cnt += countMatchingCircuitNumbers(groupInSurface) + perSurfaceGroups.push({ + surfaceId: surface.id, + direction: surface.direction, + moduleIntvlHor: surface.trestleDetail?.moduleIntvlHor, + moduleIntvlVer: surface.trestleDetail?.moduleIntvlVer, + addedCnt: surfaceCnt, + groups: groupInSurface.map((g) => + g.map((m) => { + const c = m.getCenterPoint() + return { id: m.id, circuitNumber: m.circuitNumber, x: +c.x.toFixed(2), y: +c.y.toFixed(2), w: m.width, h: m.height } + }), + ), + }) + + cnt += surfaceCnt + case1Cnt += surfaceCnt }) const groupByCircuitAndSurfaceCnt = groupByCircuitAndSurface(modules) Object.keys(groupByCircuitAndSurfaceCnt).forEach((key) => { cnt += groupByCircuitAndSurfaceCnt[key] - 1 + case2Cnt += groupByCircuitAndSurfaceCnt[key] - 1 + }) + + // [DBL-CABLE-PROD] 운영 1회 진단용 — env 게이트 없이 브라우저 콘솔에 전량 출력. + // 진단 후 제거. 이 한 줄만 복사해서 전달하면 원인(Case1 면내분리 / Case2 면교차) 확정 가능. + console.log('[DBL-CABLE-PROD]', { + total: cnt, + case1_sameSurfaceSplit: case1Cnt, + case2_crossSurface: case2Cnt, + groupByCircuitAndSurfaceCnt, + roofSizeSet, + modules: modules.map((m) => { + const c = m.getCenterPoint() + return { + id: m.id, + circuitNumber: m.circuitNumber, + surfaceId: m.surfaceId, + x: +c.x.toFixed(2), + y: +c.y.toFixed(2), + w: m.width, + h: m.height, + northModuleYn: m.moduleInfo?.northModuleYn, + moduleTpCd: m.moduleInfo?.moduleTpCd, + pcsItemId: m.pcsItemId, + pcsTpCd: m.pcs?.pcsTpCd, + } + }), + surfacesSummary: surfaces.map((s) => ({ + id: s.id, + direction: s.direction, + moduleCount: s.modules?.length, + pitch: s.roofMaterial?.pitch, + roofMatlCd: s.roofMaterial?.roofMatlCd, + moduleIntvlHor: s.trestleDetail?.moduleIntvlHor, + moduleIntvlVer: s.trestleDetail?.moduleIntvlVer, + })), + perSurfaceGroups, }) return cnt From 057287452ad6695c862d65a4c9b7eb4dd0a3c8a2 Mon Sep 17 00:00:00 2001 From: ysCha Date: Fri, 10 Jul 2026 09:03:23 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[1818]=20=EC=96=91=EB=8B=A8=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EB=B8=94(dblCblTotCnt)=20=EC=9C=A0=EB=A0=B9=20?= =?UTF-8?q?=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EC=88=98=EC=A0=95=20=E2=80=94=20?= =?UTF-8?q?isPointInRect=20=CE=B5=3D0.5=20=EC=97=AC=EC=9C=A0=EB=A1=9C=20?= =?UTF-8?q?=E5=8D=83=E9=B3=A5(=EC=B9=98=EB=8F=84=EB=A6=AC)=20=EB=8C=80?= =?UTF-8?q?=EA=B0=81=EC=84=A0=20=EC=9D=B4=EC=9B=83=20=EB=B0=98=EC=98=AC?= =?UTF-8?q?=EB=A6=BC=20=EC=98=A4=EC=B0=A8=20=ED=9D=A1=EC=88=98,=20?= =?UTF-8?q?=EC=A7=84=EB=8B=A8=20=EB=A1=9C=EA=B7=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useTrestle.js | 64 +++------------------------------- 1 file changed, 5 insertions(+), 59 deletions(-) diff --git a/src/hooks/module/useTrestle.js b/src/hooks/module/useTrestle.js index 1160391f..71ee6123 100644 --- a/src/hooks/module/useTrestle.js +++ b/src/hooks/module/useTrestle.js @@ -2499,8 +2499,11 @@ export const useTrestle = () => { }) } - function isPointInRect(rect, point) { - return point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height + // [DBL-CABLE-EPS 2026-07-10] 좌표가 소수점 2자리 반올림이라 千鳥 이웃 위치에 ±0.02 오차 누적 → + // 경계에 아슬아슬 걸친 이웃이 밖으로 판정되어 회로가 분리되고 유령 케이블(dblCblTotCnt) 1 발생. + // ε=0.5 로 반올림 오차 흡수(매칭 tolerance 0.5 기준). 남/북 fallback 에도 이 헬퍼 공유 사용. + function isPointInRect(rect, point, eps = 0.5) { + return point.x >= rect.x - eps && point.x <= rect.x + rect.width + eps && point.y >= rect.y - eps && point.y <= rect.y + rect.height + eps } // 25-04-02 추가 @@ -3384,75 +3387,18 @@ export const useTrestle = () => { const surfaces = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) const modules = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.MODULE) - let case1Cnt = 0 - let case2Cnt = 0 - const perSurfaceGroups = [] - surfaces.forEach((surface) => { const modules = surface.modules // 1. 현재 surface의 모듈들을 그룹화 const groupInSurface = groupPoints(modules, surface) const surfaceCnt = countMatchingCircuitNumbers(groupInSurface) - - perSurfaceGroups.push({ - surfaceId: surface.id, - direction: surface.direction, - moduleIntvlHor: surface.trestleDetail?.moduleIntvlHor, - moduleIntvlVer: surface.trestleDetail?.moduleIntvlVer, - addedCnt: surfaceCnt, - groups: groupInSurface.map((g) => - g.map((m) => { - const c = m.getCenterPoint() - return { id: m.id, circuitNumber: m.circuitNumber, x: +c.x.toFixed(2), y: +c.y.toFixed(2), w: m.width, h: m.height } - }), - ), - }) - cnt += surfaceCnt - case1Cnt += surfaceCnt }) const groupByCircuitAndSurfaceCnt = groupByCircuitAndSurface(modules) Object.keys(groupByCircuitAndSurfaceCnt).forEach((key) => { cnt += groupByCircuitAndSurfaceCnt[key] - 1 - case2Cnt += groupByCircuitAndSurfaceCnt[key] - 1 - }) - - // [DBL-CABLE-PROD] 운영 1회 진단용 — env 게이트 없이 브라우저 콘솔에 전량 출력. - // 진단 후 제거. 이 한 줄만 복사해서 전달하면 원인(Case1 면내분리 / Case2 면교차) 확정 가능. - console.log('[DBL-CABLE-PROD]', { - total: cnt, - case1_sameSurfaceSplit: case1Cnt, - case2_crossSurface: case2Cnt, - groupByCircuitAndSurfaceCnt, - roofSizeSet, - modules: modules.map((m) => { - const c = m.getCenterPoint() - return { - id: m.id, - circuitNumber: m.circuitNumber, - surfaceId: m.surfaceId, - x: +c.x.toFixed(2), - y: +c.y.toFixed(2), - w: m.width, - h: m.height, - northModuleYn: m.moduleInfo?.northModuleYn, - moduleTpCd: m.moduleInfo?.moduleTpCd, - pcsItemId: m.pcsItemId, - pcsTpCd: m.pcs?.pcsTpCd, - } - }), - surfacesSummary: surfaces.map((s) => ({ - id: s.id, - direction: s.direction, - moduleCount: s.modules?.length, - pitch: s.roofMaterial?.pitch, - roofMatlCd: s.roofMaterial?.roofMatlCd, - moduleIntvlHor: s.trestleDetail?.moduleIntvlHor, - moduleIntvlVer: s.trestleDetail?.moduleIntvlVer, - })), - perSurfaceGroups, }) return cnt