feat(rebar): B11·B12 수평간격을 배수 k 입력으로 (기본 k = 8, 방향은 문서 기준)

- 간격 = k·s: B11은 L 방향 격자(교각축 직각 s), B12는 W 방향 격자(교각축 s). 기본 k = 8 (1000 mm, s = 125)
- 개수는 격자 k칸마다, 조립 단 엇갈림 2칸 유지. 3D 철근도 같은 간격
- 기본 k = 8이므로 P1 기본값의 B11·B12 개수가 60 / 47 → 30 / 24로 바뀜 (k = 4이면 문서값 60 / 47을 재현, 테스트로 확인)
- 패널에 k 두 칸, 규칙 표시에 B11·B12 간격 (k·s)
- FT02를 n·kB11·kB12 정수 검사로 확장

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-26 17:34:51 +09:00
1 parent 48e6811600
commit 0588ffe3f4
9 files changed
+54 -39

No files matched your search

+10 -13
View File
@@ -44,27 +44,24 @@ describe('확대기초 배근 입력 (승인 2026-10-26, 시안 ③ 확대기초
expect(rows.find((r) => r.name === 'B10-1')!.basis).toBe('default');
});
it('교각축 직각 값은 B5–B8·B11·B12에만, 교각축 값은 B1–B4·B9에 적용 (승인 2026-10-26)', () => {
it('방향 (문서 기준, 승인 2026-10-26): B1–B4·B9·B12는 교각축(sAxis), B5–B8·B11은 교각축 직각(sPerp)', () => {
const rows = rebarSummary(buildPier({ ...loadP1(), footingRebar: { sPerp: 150 } })).rows;
const b5 = rows.find((r) => r.name === 'B5')!;
expect([b5.spacing, b5.basis]).toEqual(['300', 'input']);
const b12 = rows.find((r) => r.name === 'B12')!;
expect([b12.spacing, b12.basis]).toEqual(['600 (4s)', 'input']);
expect(rows.find((r) => r.name === 'B5')!.spacing).toBe('300');
expect(rows.find((r) => r.name === 'B5')!.basis).toBe('input');
expect(rows.find((r) => r.name === 'B11')!.spacing).toBe('1200 (8s)');
expect(rows.find((r) => r.name === 'B12')!.basis).toBe('default');
expect(rows.find((r) => r.name === 'B1')!.basis).toBe('default');
expect(rows.find((r) => r.name === 'B9')!.basis).toBe('default');
const rowsAxis = rebarSummary(buildPier({ ...loadP1(), footingRebar: { sAxis: 150 } })).rows;
expect(rowsAxis.find((r) => r.name === 'B9')!.spacing).toBe('600 (4s)');
expect(rowsAxis.find((r) => r.name === 'B12')!.spacing).toBe('1200 (8s)');
expect(rowsAxis.find((r) => r.name === 'B5')!.basis).toBe('default');
});
it('패널 규칙 값 (P1, H 2000): 상면·2단 250 · Δ₂ 100 · B2·B6 1723 · B9 500·250 · 조립 500 · 3단 @400', () => {
const r = footingRuleValues(2000, DEFAULT_FOOTING_REBAR);
expect([r.upper2sAxis, r.upper2sPerp, r.delta2]).toEqual([250, 250, 100]);
expect(r.b2Leg).toBeCloseTo(1723, 0);
expect(r.b6Leg).toBeCloseTo(1723, 0);
expect([r.b9Pitch, r.b9Stagger]).toEqual([500, 250]);
expect([r.assemblyPlanPitch, r.assemblyVertical, r.assemblyLevels]).toEqual([500, 400, 3]);
it('k 배수: k 4 → 간격 500, 개수 60 / 47 (문서 4s 값)', () => {
const rows = rebarSummary(buildPier({ ...loadP1(), footingRebar: { kB11: 4, kB12: 4 } })).rows;
expect(rows.find((r) => r.name === 'B11')!.count).toBe(60);
expect(rows.find((r) => r.name === 'B12')!.count).toBe(47);
});
it('the 조립 단 배수 n reaches the assembly levels', () => {
+4 -3
View File
@@ -66,11 +66,12 @@ describe('확대기초 철근 (확대기초철근 (1).md, plan C5)', () => {
expect(assemblyJs(2200)).toEqual([2, 4, 6, 8]);
});
it('B11 60 bars (20 / 20 / 20) ≈ 8359, B12 47 bars (16 / 15 / 16) ≈ 10613', () => {
// k = 8 default (승인 2026-10-26): every 8 grid steps (1000 mm). The doc's 4s (k = 4) gives 60 / 47.
it('B11 30 bars (10 / 10 / 10) ≈ 8359, B12 24 bars (8 / 8 / 8) ≈ 10613 at k = 8', () => {
const [b11, b12] = assemblyBars(L, W, H);
expect(b11.count).toBe(60);
expect(b11.count).toBe(30);
expect(b11.length).toBeCloseTo(8359, 0);
expect(b12.count).toBe(47);
expect(b12.count).toBe(24);
expect(b12.length).toBeCloseTo(10612.5, 1); // the document prints ≈ 10613
});
+3 -3
View File
@@ -35,13 +35,13 @@ describe('③ 철근표 요약 (P1)', () => {
expect(count('P6')).toBe(32);
});
it('footing: B1–B4 31 each, B5–B8 40 each, B10-1 18, B10-2 18, B11 60, B12 47', () => {
it('footing: B1–B4 31 each, B5–B8 40 each, B10-1 18, B10-2 18, B11 30, B12 24 (k = 8)', () => {
for (const n of ['B1', 'B2', 'B3', 'B4']) expect(count(n)).toBe(31);
for (const n of ['B5', 'B6', 'B7', 'B8']) expect(count(n)).toBe(40);
expect(count('B10-1')).toBe(18);
expect(count('B10-2')).toBe(18);
expect(count('B11')).toBe(60);
expect(count('B12')).toBe(47);
expect(count('B11')).toBe(30);
expect(count('B12')).toBe(24);
});
it('B9: 306 bars (320 on the grid less 14 in the column zone); warnings: B2 needs a splice (13646 > 12000)', () => {
+3 -3
View File
@@ -108,11 +108,11 @@ describe('확대기초 B9 · B10 · B11 · B12 in 3D (확대기초철근 (1).md
expect(rb.byName.get('B9')!.length).toBe(306 * 3);
});
it('B10-1 / B10-2: 18 each (9 levels × 2 faces); B11 60, B12 47 — one tube per bar (bends rounded, 수정 2026-10-23)', () => {
it('B10-1 / B10-2: 18 each (9 levels × 2 faces); B11 30, B12 24 at k = 8 — one tube per bar (bends rounded, 수정 2026-10-23)', () => {
expect(rb.byName.get('B10-1')!.length).toBe(18);
expect(rb.byName.get('B10-2')!.length).toBe(18);
expect(rb.byName.get('B11')!.length).toBe(60);
expect(rb.byName.get('B12')!.length).toBe(47);
expect(rb.byName.get('B11')!.length).toBe(30);
expect(rb.byName.get('B12')!.length).toBe(24);
});
});