feat(rebar): B1–B4와 B5–B8 방향 교환 (B1–B4는 W 방향, B5–B8은 L 방향)

- 재료표(B5–B8 9150 = 9350 − 2c, B1–B4 7600 = 7800 − 2c)와 같은 방향 배정으로 맞춤
- 격자 키를 물리 방향으로 정리: sL = L 방향 간격, sW = W 방향 간격 (기존 sAxis → sL, sPerp → sW)
- B1–B4: L 격자로 개수, 길이 W − 2c. B5–B8: W 격자로 개수, 길이 L − 2c
- B9: 열(L)은 sL, 행(W)은 sW 격자 (물리 격자 일치), 개수 불변
- B11은 L 방향 간격(sL), B12는 W 방향 간격(sW)
- 3D 확대기초 철근과 단면 그림의 역할을 교환 (B1–B4 선, B5–B8 점)
- 철근표 간격과 규칙 값, 설정 라벨을 방향 기준으로 수정
- 테스트 기대값 갱신 (B1–B4 40, B5–B8 31, B6 13646 분할 경고)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-27 09:36:20 +09:00
1 parent f2fa48913b
commit 752de2fd9d
12 files changed
+160 -167

No files matched your search

+24 -23
View File
@@ -31,24 +31,25 @@ describe('확대기초 철근 (확대기초철근 (1).md, plan C5)', () => {
expect(z.B7).toBeCloseTo(277, 6);
});
it('B2 leg 1723, B2 length 13646 (over the 12000 bar, splice needed)', () => {
// 방향 교환 (승인 2026-10-26): B1–B4 run along W (grid L, 79 steps → 80 positions); B5–B8 run along L (grid W).
it('B2 leg 1723, B2 length 11396 (W − 2c + 2 × 1723), count 40', () => {
expect(legB2(H)).toBeCloseTo(1723, 6);
const b2 = bottomBars(L, W, H).find((b) => b.name === 'B2')!;
expect(b2.length).toBeCloseTo(13646, 0);
expect(b2.count).toBe(31);
expect(b2.length).toBeCloseTo(11396, 0);
expect(b2.count).toBe(40);
});
it('B1–B4 counts 31 / 31 / 31 / 31 and B4 length 10200', () => {
it('B1–B4 counts 40 / 40 / 40 / 40 (grid along L) and B4 length 7950 (W − 2c)', () => {
const bars = bottomBars(L, W, H);
expect(bars.map((b) => b.count)).toEqual([31, 31, 31, 31]);
expect(bars.find((b) => b.name === 'B4')!.length).toBeCloseTo(10200, 6);
expect(bars.map((b) => b.count)).toEqual([40, 40, 40, 40]);
expect(bars.find((b) => b.name === 'B4')!.length).toBeCloseTo(7950, 6);
});
it('B5–B8 counts 40 each (grid along L: n 79), B8 length 7950, B6 length 11396', () => {
it('B5–B8 counts 31 each (grid along W: n 61), B8 length 10200 (L − 2c), B6 length 13646', () => {
const bars = crossBars(L, W, H);
expect(bars.map((b) => b.count)).toEqual([40, 40, 40, 40]);
expect(bars.find((b) => b.name === 'B8')!.length).toBeCloseTo(7950, 6);
expect(bars.find((b) => b.name === 'B6')!.length).toBeCloseTo(11396, 0);
expect(bars.map((b) => b.count)).toEqual([31, 31, 31, 31]);
expect(bars.find((b) => b.name === 'B8')!.length).toBeCloseTo(10200, 6);
expect(bars.find((b) => b.name === 'B6')!.length).toBeCloseTo(13646, 0);
});
it('B10-1 16 bars ≈ 10748 (lowest level removed), B10-2 16 bars ≈ 8494', () => {
@@ -108,29 +109,29 @@ describe('확대기초 배근도 재현 (확대기초철근 (1).md §13)', () =>
expect(h.B12.map((z) => Math.round(z * 10) / 10)).toEqual([569.1, 969.1, 1369.1]);
});
it('배근도 재현 W 7800 → B4 30, B2 29 (odd count split)', () => {
const bars = bottomBars(10400, 7800, 2000);
expect(bars.find((b) => b.name === 'B4')!.count).toBe(30);
expect(bars.find((b) => b.name === 'B2')!.count).toBe(29);
it('배근도 재현 W 7800 → B8 30, B6 29 (B5–B8 follow W, odd count split)', () => {
const bars = crossBars(10400, 7800, 2000);
expect(bars.find((b) => b.name === 'B8')!.count).toBe(30);
expect(bars.find((b) => b.name === 'B6')!.count).toBe(29);
});
it('배근도 재현 L 9350 → B8 36, B6 35', () => {
const bars = crossBars(9350, 8150, 2000);
expect(bars.find((b) => b.name === 'B8')!.count).toBe(36);
expect(bars.find((b) => b.name === 'B6')!.count).toBe(35);
it('배근도 재현 L 9350 → B4 36, B2 35 (B1–B4 follow L)', () => {
const bars = bottomBars(9350, 8150, 2000);
expect(bars.find((b) => b.name === 'B4')!.count).toBe(36);
expect(bars.find((b) => b.name === 'B2')!.count).toBe(35);
});
it('variables: W 8000 with s 150 → 50 grid steps, e 150, B4 26 / B2 25; W 12000 → 92 steps, e 150', () => {
const g = grid(8000, { ...DEFAULT_FOOTING_REBAR, sAxis: 150 });
const g = grid(8000, { ...DEFAULT_FOOTING_REBAR, sL: 150 });
expect(g.n).toBe(50);
expect(g.e).toBeCloseTo(150, 6);
expect(grid(12000).n).toBe(92);
expect(grid(12000).e).toBeCloseTo(150, 6);
});
it('splice cases: L 8700 → B2 11946 (no splice); L 12400 → B4 12200; W 8800 → B6 12046', () => {
expect(bottomBars(8700, 8150, 2000).find((b) => b.name === 'B2')!.length).toBeCloseTo(11946, 0);
expect(bottomBars(12400, 8150, 2000).find((b) => b.name === 'B4')!.length).toBeCloseTo(12200, 0);
expect(crossBars(10400, 8800, 2000).find((b) => b.name === 'B6')!.length).toBeCloseTo(12046, 0);
it('splice cases: W 8700 → B2 11946 (no splice); W 12400 → B4 12200; L 8800 → B6 12046', () => {
expect(bottomBars(10400, 8700, 2000).find((b) => b.name === 'B2')!.length).toBeCloseTo(11946, 0);
expect(bottomBars(10400, 12400, 2000).find((b) => b.name === 'B4')!.length).toBeCloseTo(12200, 0);
expect(crossBars(8800, 8150, 2000).find((b) => b.name === 'B6')!.length).toBeCloseTo(12046, 0);
});
});