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