feat(B06): 집수정 관 끝선·두께 0.2·구조물 형식 드롭다운

2026-08-22 사용자 요청 3건:
- 관 끝선 = I형 벽의 안쪽(물받는 쪽) 변 복사(기슭막이와 동일 방식).
  관 시작점(하단): ㄴ·ㄷ형은 측벽 안쪽 변×바닥 윗면 교차점, I형은
  내공 1.0m 유지.
- 집수정 부재(벽·바닥판) 두께 0.2m(BASIN_MEMBER_THICKNESS_M).
- 유입 구조물 형식 드롭다운: 자동(규칙)/기슭막이+배관/집수정 I·ㄴ·ㄷ형.
  집수정 클릭 선택 가능, 선택 시 조정창에 드롭다운(집수정은 ◀▶ 숨김).
  세션 보관(inletstruct)·revet 선택 시 양측성토 로직 복귀·manual 사유.
- 집수정 구성을 _Cross_Culvert_Basin.ts로 분리(700줄 제한 — Geom 690줄).
  I형 바닥판 제거(벽뿐 — 정의 정합).
- 검증: 13+15.7 모듈(auto/revet/I/L/U 전부 기대 형상·관유입 자리 일치)
  + UI 실조작(집수정 클릭→드롭다운 revet/U/auto 전환, 부재 수 2→0→3→2,
  세션 왕복) + 스크린샷 대조.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-22 11:04:40 +09:00
co-authored by Claude Opus 5
parent 934419bbaa
commit 1774d61101
13 changed files with 433 additions and 184 deletions
@@ -308,3 +308,39 @@ export function solveWallVertical(
const floatGap = Math.max(0, desiredTop - limitHeight - groundBase);
return { height, baseElevation: groundBase + floatGap, floatGapM: floatGap };
}
/** 교점을 마감면 **선분 안**으로 자른다 — 선분 밖(벽 하단 아래 등)으로 새지 않게. */
export function clampToFace(
point: OffsetPoint,
face: { base: OffsetPoint; direction: { offset: number; elevation: number } },
): OffsetPoint {
const dot =
(point.offset - face.base.offset) * face.direction.offset +
(point.elevation - face.base.elevation) * face.direction.elevation;
const len2 =
face.direction.offset * face.direction.offset +
face.direction.elevation * face.direction.elevation;
const t = len2 > 1e-12 ? Math.min(Math.max(dot / len2, 0), 1) : 0;
return {
offset: face.base.offset + face.direction.offset * t,
elevation: face.base.elevation + face.direction.elevation * t,
};
}
/** 설계선을 따라 [from → to] 구간의 경사길이(m)를 잰다 — 성토사면 길이 측정용. */
export function slopeLengthAlong(
designAt: (offset: number) => number,
from: number,
to: number,
): number {
const steps = 60;
let length = 0;
let prevElev = designAt(from);
for (let i = 1; i <= steps; i += 1) {
const o = from + ((to - from) * i) / steps;
const e = designAt(o);
length += Math.hypot((to - from) / steps, e - prevElev);
prevElev = e;
}
return length;
}