qcast-front/.claude/memory/project_hip_pitch_fallback.md

37 lines
2.4 KiB
Markdown

---
name: hip pitch 폴백 (planeSize===actualSize 버그 수정)
description: skeleton-utils.js processEavesEdge 의 pitch 폴백 누락으로 hip 의 planeSize===actualSize 가 되어 메뉴 토글이 무효였던 버그
type: project
---
skeleton-utils.js:2915 `let pitch = outerLine?.attributes?.pitch ?? roof?.pitch ?? 0`
**Why:**
- 기존: `outerLine?.attributes?.pitch ?? 0`
- outerLine.attributes.pitch 누락 시 pitch=0 → addRawLine(line 3396) 의 calcLineActualSize2(deg=0)
은 tan(0)=0 으로 인해 planeSize 와 동일값 반환
- 결과: SK builder 가 만든 모든 hip 의 attributes.planeSize === attributes.actualSize
- DIAG 로그 증거: `[v1 ext] hip 연장 ... (plane 2615→3322.14, actual 2615→3322.14)`
- 사용자 증상: 伏せ図入력(corridorDimension/planeSize) ↔ 配置面(realDimension/actualSize)
메뉴 토글 시 hip 라벨 숫자 변화 없음
**How to apply:**
- usePolygon.js:1649 패턴 (line.pitch ?? represent.pitch ?? globalPitch) 과 동일한 폴백
- skeleton-utils 는 hook 이 아니라서 globalPitch 직접 접근 불가, 대신 roof.pitch 사용
- roof 객체는 usePolygon.js:1651-1664 에서 `pitch: pitch` 로 생성됨
- 추가 보정 (useRoofAllocationSetting.js handleAlloc) 은 actualSize=0 케이스만 잡으므로
이 근본 수정 후에도 보존 (안전망 역할)
- useText.js parent.attributes 폴백, useMenu.js 직접 호출, useText DIAG 로그 도 모두 유지
- 기존 SK 가 pitch=0 으로 빌드된 경우용 즉석 재계산: useText.js `recomputeHipActualIfFlat`
- pitch 폴백 체인: line.attributes.pitch → roof.pitch → roof.roofMaterial.pitch → globalPitch ?? 4
- obj.actualSize 만 갱신 (parent.attributes 갱신 시 fabric set 사이드이펙트 위험)
**중요 함정 — lengthText min/max 는 isDiagonal 판정 불가:**
- QLine.js:122-125 가 lengthText 의 `minY: this.top, maxY: this.top + this.length` 로 설정
- `this.length` 는 라인 길이라서 수평 ridge 도 `maxY - minY = length > 0`
- 즉 lengthText 의 minX/maxX/minY/maxY 로 dx,dy 구해서 `dx>0 && dy>0` 으로 판정하면
수평/수직 ridge 까지 hip 으로 잘못 분류됨 → ridge 가 재계산/그룹통일 대상이 되어
토글 시 값 변경 / 다른 라인 값으로 덮어쓰기 발생
- **반드시 parent QLine 의 `x1/y1/x2/y2` 로 직접 dx,dy 계산** (임계 5.0 mm)
- QPolygon.js:712-734 path (Math.min/max(start,end)) 는 정확하지만 QLine path 는 부정확