feat(rebar): C12 in the taper band (h2) and C13 in the end band (h1), from the coping geometry

The split between C12 and C13 follows the end underside, not a fixed level: C12 rows lie between the Level underside and
the end underside (taper height h2), C13 rows between the end underside and the top (end height h1). The break is the end
underside + 127 mm, the taper line's start at the end face. P1 is unchanged (C12 41.288–42.288, C13 42.538–42.788). Tests
check the band rule for h1 and h2 changes.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-23 12:03:24 +09:00
1 parent ecaa45306c
commit 355bf4ea75
4 files changed
+40 -9

No files matched your search

+28 -2
View File
@@ -1,6 +1,7 @@
import { describe, expect, it } from 'vitest';
import { buildPier } from '../src/core/geometry';
import { P1_COPING_GEOM, sideRowLevels } from '../src/core/coping-geom';
import { P1_COPING_GEOM, SIDE_COVER_M, sideRowLevels } from '../src/core/coping-geom';
import { sideRows } from '../src/core/rebar/coping';
import { shearUHeight, shearULength } from '../src/core/rebar/coping';
import { rebarSummary } from '../src/core/rebar/summary';
import { buildRebar3D } from '../src/view/rebar3d';
@@ -45,7 +46,7 @@ describe('① 코핑 끝단 높이 h1 · 테이퍼 높이 h2 · Level 폭 (1단
});
it('side-row levels keep their P1 values from the Level underside (assumption, 명세 확인 필요)', () => {
const levels = sideRowLevels(40.911);
const levels = sideRowLevels(40.911, 42.411);
expect(levels.zBottom).toBeCloseTo(41.288, 6);
expect(levels.zBreak).toBeCloseTo(42.538, 6);
});
@@ -59,3 +60,28 @@ describe('① 코핑 끝단 높이 h1 · 테이퍼 높이 h2 · Level 폭 (1단
expect(buildRebar3D(changed).byName.get('C10')!.length).toBeGreaterThan(0);
});
});
describe('C12 in the taper band (h2), C13 in the end band (h1)', () => {
const bands = (input: Parameters<typeof buildPier>[0]) => {
const m = buildPier(input);
const lv = sideRowLevels(m.levelBottom, m.endBottom);
const rows = sideRows(lv.zBottom, lv.zBreak);
return { m, rows };
};
it.each([
['P1', {}],
['h1 800', { copingH1Mm: 800 }],
['h1 1200', { copingH1Mm: 1200 }],
['h2 1800', { copingH2Mm: 1800 }],
])('%s: every C12 row is in the taper band and every C13 row in the end band', (_name, change) => {
const { m, rows } = bands({ ...loadP1(), ...change });
for (const z of rows.c12) {
expect(z).toBeGreaterThanOrEqual(m.levelBottom - 1e-9);
expect(z).toBeLessThan(m.endBottom + SIDE_COVER_M);
}
for (const z of rows.c13) {
expect(z).toBeGreaterThanOrEqual(m.endBottom + SIDE_COVER_M - 1e-9);
expect(z).toBeLessThanOrEqual(m.copingRefTop);
}
});
});