feat(core,view): bent coping stage 2 — mitred coping, stretch-local bearings, blocks and columns

- buildPier builds on buildAxis: each object carries its stretch k and a local
  s from that stretch's base; coping parts are per stretch with the mitre plane
  trimming the overlap in the scene (renderer.localClippingEnabled).
- Straight P1 output is unchanged (regression tests pass).
- Bent coping is supported for 현장타설말뚝 only; footings and piles on a bent
  axis remain 미실시 until stage 3. Kink outside the coping and columns within
  the Level half-width of the kink are refused.
- W03/W04 use coping coordinates (g).
- Tests: constructed 60° bend — world coordinates of bearings, blocks and the
  column survive the stretch frames; mitre sides; scene mesh count; refusals.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-22 09:22:57 +09:00
1 parent 46709be532
commit 5371932cca
6 files changed
+295 -78

No files matched your search

+4 -4
View File
@@ -6,7 +6,7 @@ const EXPECTED_COLUMNS: Record<PierType, number> = { 'T형': 1, '2주형': 2, '3
/** Rules from spec §10 that are not implemented in this stage. Shown to the user, never silently skipped. */
export const NOT_IMPLEMENTED_RULES = [
'E04 fck 미입력 (배근 단계, 3단계)',
'꺾인 코핑 형상 (IP4 꺾임각 ≠ 0; IP4 계산식만 구현)',
'꺾인 코핑의 확대기초·말뚝 (3단계; 현장타설말뚝만 지원)',
'W06 속성 복사 건너뜀 (2단계)',
'W08 솔플레이트 T1−T2 검사 (2단계)',
] as const;
@@ -51,7 +51,7 @@ export function validatePier(input: PierInput, model: PierModel, issues: Issue[]
const halfBlock = DIM.blockSize / 2;
const stepBounds = model.segments.slice(1).map((seg) => seg.s0);
for (const b of model.bearings) {
const nearest = Math.min(...stepBounds.map((s) => Math.abs(b.s - s)));
const nearest = Math.min(...stepBounds.map((s) => Math.abs(b.g - s)));
if (nearest < halfBlock) {
issues.push({
code: 'W03',
@@ -65,8 +65,8 @@ export function validatePier(input: PierInput, model: PierModel, issues: Issue[]
const planHalfB = model.copingB / 2;
const outside = model.blocks.some(
(b) =>
b.s - halfBlock < 0 ||
b.s + halfBlock > model.copingL ||
b.g - halfBlock < 0 ||
b.g + halfBlock > model.copingL ||
b.n - halfBlock < -planHalfB ||
b.n + halfBlock > planHalfB,
);