From f2fa48913b500bb4f1e013e60a8779b4a20e740d Mon Sep 17 00:00:00 2001 From: ypshim Date: Mon, 26 Oct 2026 18:21:47 +0900 Subject: [PATCH] =?UTF-8?q?feat(rebar):=20B10-2=20=EC=B5=9C=ED=95=98?= =?UTF-8?q?=EB=8B=A8=20=EB=8B=A8=20=EC=82=AD=EC=A0=9C,=20=EC=B8=A1?= =?UTF-8?q?=EB=A9=B4=20B2=20=EB=8B=A4=EB=A6=AC=EC=84=A0=20=EA=B0=95?= =?UTF-8?q?=EC=A1=B0=20(=EB=AA=A8=EC=84=9C=EB=A6=AC=20=EC=97=B0=EA=B2=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - B10-2 최하단(z = c_b)도 하면 1단 B2·B4와 같은 높이에서 간섭하므로 삭제 (승인 2026-10-26) - B10-2: 18 → 16본 (8단 × 2면). 표와 3D가 같은 규칙 - 단면 그림의 측면 B2 다리선을 굵은 주황 실선으로 그려 모서리 연결을 드러냄 - 테스트 기대값 갱신 (B10-2 16) Co-Authored-By: Claude Haiku 5.5 --- src/core/rebar/footing.ts | 3 ++- src/view/footing-section-svg.ts | 3 ++- src/view/rebar3d.ts | 3 ++- tests/rebar-footing.test.ts | 4 ++-- tests/rebar-summary.test.ts | 4 ++-- tests/rebar3d.test.ts | 4 ++-- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/core/rebar/footing.ts b/src/core/rebar/footing.ts index d09eabb..d1aa529 100644 --- a/src/core/rebar/footing.ts +++ b/src/core/rebar/footing.ts @@ -121,7 +121,8 @@ export function sideBars(L: number, W: number, H: number, f: FootingRebarSetting return [ // B10-1 lowest level (z = c_b) is removed: the 하면 1단 B2·B4 take its place at the corner (승인 2026-10-26). { name: 'B10-1', size: 'S19', count: (levels - 1) * 2, length: L - 2 * depth2 + 2 * hook }, - { name: 'B10-2', size: 'S19', count: levels * 2, length: W - 2 * depth1 + 2 * hook }, + // B10-2 lowest level (z = c_b) is removed too (승인 2026-10-26): B2·B4 take its place at the corner. + { name: 'B10-2', size: 'S19', count: (levels - 1) * 2, length: W - 2 * depth1 + 2 * hook }, ]; } diff --git a/src/view/footing-section-svg.ts b/src/view/footing-section-svg.ts index d375241..3b499c9 100644 --- a/src/view/footing-section-svg.ts +++ b/src/view/footing-section-svg.ts @@ -102,7 +102,8 @@ export function footingSectionSvg(model: PierModel): string { const xSide = i === 0 ? xSideL : xSideR; parts.push(line('ext', 'B1', xx, xSide, y(z.B1), COLOR.b14, 1)); parts.push(line('ext', 'B2', xx, xSide, y(z.B24), COLOR.b14, 1)); - parts.push(vline('leg', 'B2', xSide, y(z.B1), y(z.B24), COLOR.b14)); + // The B2 side leg (up to the B1 height at the side cover) is drawn heavier, so the corner reads as one run (승인 2026-10-26). + parts.push(``); } // B9: one purple vertical line per row along W (the rows of b9Bars). diff --git a/src/view/rebar3d.ts b/src/view/rebar3d.ts index c3df6e5..29b869c 100644 --- a/src/view/rebar3d.ts +++ b/src/view/rebar3d.ts @@ -462,7 +462,8 @@ export function buildRebar3D(m: PierModel, common: Material = DEFAULT_MATERIAL, for (const sg of [-1, 1]) { // B10-2: across W at the L faces; its ends turn inward along s. const sp = f.s + sg * sEdge; - polyline('B10-2', [[sp - sg * hookB10, zj, -nEdge], [sp, zj, -nEdge], [sp, zj, nEdge], [sp - sg * hookB10, zj, nEdge]], NOMINAL_DIAMETER.S19); + // The lowest B10-2 level is removed (승인 2026-10-26): the 하면 1단 B2·B4 take its place at the corner. + if (j > 0) polyline('B10-2', [[sp - sg * hookB10, zj, -nEdge], [sp, zj, -nEdge], [sp, zj, nEdge], [sp - sg * hookB10, zj, nEdge]], NOMINAL_DIAMETER.S19); // B10-1: along s at the W faces, 19.1 above B10-2; its ends turn inward along n. const np = sg * nEdge; const zb = zj + dB10; diff --git a/tests/rebar-footing.test.ts b/tests/rebar-footing.test.ts index 2883b27..5536899 100644 --- a/tests/rebar-footing.test.ts +++ b/tests/rebar-footing.test.ts @@ -51,11 +51,11 @@ describe('확대기초 철근 (확대기초철근 (1).md, plan C5)', () => { expect(bars.find((b) => b.name === 'B6')!.length).toBeCloseTo(11396, 0); }); - it('B10-1 16 bars ≈ 10748 (lowest level removed), B10-2 18 bars ≈ 8494', () => { + it('B10-1 16 bars ≈ 10748 (lowest level removed), B10-2 16 bars ≈ 8494', () => { const [b101, b102] = sideBars(L, W, H); expect(b101.count).toBe(16); expect(b101.length).toBeCloseTo(10748, 0); - expect(b102.count).toBe(18); + expect(b102.count).toBe(16); expect(b102.length).toBeCloseTo(8494, 0); }); diff --git a/tests/rebar-summary.test.ts b/tests/rebar-summary.test.ts index 0ac70ed..6e286c6 100644 --- a/tests/rebar-summary.test.ts +++ b/tests/rebar-summary.test.ts @@ -35,11 +35,11 @@ describe('③ 철근표 요약 (P1)', () => { expect(count('P6')).toBe(32); }); - it('footing: B1–B4 31 each, B5–B8 40 each, B10-1 16, B10-2 18, B11 30, B12 24 (k = 8)', () => { + it('footing: B1–B4 31 each, B5–B8 40 each, B10-1 16, B10-2 16, 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(16); - expect(count('B10-2')).toBe(18); + expect(count('B10-2')).toBe(16); expect(count('B11')).toBe(30); expect(count('B12')).toBe(24); }); diff --git a/tests/rebar3d.test.ts b/tests/rebar3d.test.ts index 27102c0..778128e 100644 --- a/tests/rebar3d.test.ts +++ b/tests/rebar3d.test.ts @@ -108,9 +108,9 @@ describe('확대기초 B9 · B10 · B11 · B12 in 3D (확대기초철근 (1).md expect(rb.byName.get('B9')!.length).toBe(306 * 3); }); - it('B10-1: 16 (8 levels × 2 faces, lowest removed); B10-2: 18 (9 levels × 2 faces); B11 30, B12 24 at k = 8 — one tube per bar (bends rounded, 수정 2026-10-23)', () => { + it('B10-1: 16 (8 levels × 2 faces, lowest removed); B10-2: 16 (8 levels × 2 faces, lowest removed); B11 30, B12 24 at k = 8 — one tube per bar (bends rounded, 수정 2026-10-23)', () => { expect(rb.byName.get('B10-1')!.length).toBe(16); - expect(rb.byName.get('B10-2')!.length).toBe(18); + expect(rb.byName.get('B10-2')!.length).toBe(16); expect(rb.byName.get('B11')!.length).toBe(30); expect(rb.byName.get('B12')!.length).toBe(24); });