diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index 7a8ddda7..789acdb8 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1598,6 +1598,29 @@ export const drawGableRoof = (roofId, canvas, textMode) => { } else if (Math.abs(normalizedAngle - 90) <= tolerance) { isVertical = true } + // [GABLE-H8 2026-06-23] 노치 결합면에서 직교정렬이 만든 same-direction roofLine 이 기존 마루 + // 구간 안에 완전히 포함되면(= 마루 위 중복선, isAlready 는 끝점 정확매칭이라 못 거름) 그리지 않는다. + // 마루가 이미 그 경계를 닫고 있으므로 중복 roofLine(H-8 과길이 원인)만 제거. cross-direction(hip)· + // 부분겹침은 건드리지 않아 정상 A타입 회귀 없음. + const _segSameDir = (analyze.isHorizontal && isHorizontal) || (analyze.isVertical && isVertical) + if (_segSameDir) { + const segV = Math.abs(points[0] - points[2]) < 1 + const sMin = segV ? Math.min(points[1], points[3]) : Math.min(points[0], points[2]) + const sMax = segV ? Math.max(points[1], points[3]) : Math.max(points[0], points[2]) + const coveredByRidge = ridgeLines.find((rg) => { + const rgV = Math.abs(rg.x1 - rg.x2) < 1 + if (rgV !== segV) return false + if (segV) { + if (Math.abs(rg.x1 - points[0]) >= 1) return false + return Math.min(rg.y1, rg.y2) - 1 <= sMin && sMax <= Math.max(rg.y1, rg.y2) + 1 + } + if (Math.abs(rg.y1 - points[1]) >= 1) return false + return Math.min(rg.x1, rg.x2) - 1 <= sMin && sMax <= Math.max(rg.x1, rg.x2) + 1 + }) + if (coveredByRidge) { + return true + } + } if (analyze.isHorizontal) { //현재라인이 수평선일때 if (isHorizontal) {