fix(abut-rebar): 벽체 W9 ㄷ형 · W10 ㄴ형, 정착장 입력 (기본 330)
- 사용자 도면(2026-11-04): 끝마다 이웃 높낮이로 정함 — 높은 이웃 쪽은 경계 너머 정착장만큼 직선 겹침, 낮은 이웃 · 끝면 쪽은 경계 − c에서 연직 갈고리 정착장 - 번호는 모양으로: 양끝 갈고리 W9 (ㄷ), 한쪽 갈고리 W10 (ㄴ). A1: W9 6 (IP1 끝 구간), W10 24 - 벽체 카드에 "W9 · W10 정착장 (mm)" 입력 (기본 330, fck 연동 없음), 철근표 · 삽도 · 안내 문구 반영 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5e64a4f2ed
commit
3800a75b78
4 files changed
+69
-35
No files matched your search
@@ -67,33 +67,47 @@ describe('교대 벽체 배근 A1 (AD4, 교대벽체철근.md §11)', () => {
|
||||
expect([lv(5).count, lv(5).text]).toEqual([20, '19@125=2.375 · 181']);
|
||||
});
|
||||
|
||||
it('W9 · W10: 5구간 → W9 2구간 × 6, W10 3구간 × 6; 구간 수에 따라 W9만 / W10 (m − 2)', () => {
|
||||
expect(bar(A1, 'W9').count).toBe(12);
|
||||
expect(bar(A1, 'W10').count).toBe(18);
|
||||
it('W9 · W10 (A1, IP1 쪽으로 높아지는 5구간): 가장 높은 IP1 끝 구간만 ㄷ (W9 6개), 나머지 4구간은 ㄴ (W10 24개)', () => {
|
||||
expect(bar(A1, 'W9').count).toBe(6);
|
||||
expect(bar(A1, 'W10').count).toBe(24);
|
||||
const withSegs = (n: number): AbutWallGeom => {
|
||||
const step = geom.L / n;
|
||||
return { ...geom, segments: Array.from({ length: n }, (_, i) => ({ from: i * step, to: (i + 1) * step, H: 2372 + 50 * i, no: n - i })) };
|
||||
};
|
||||
const marks = (n: number) => abutWallRebar(withSegs(n), footing, undefined, fck27).bars.map((b) => b.mark);
|
||||
expect(marks(1)).toContain('W9');
|
||||
expect(marks(1)).not.toContain('W10');
|
||||
expect(marks(2)).not.toContain('W10');
|
||||
expect(bar(abutWallRebar(withSegs(4), footing, undefined, fck27), 'W10').count).toBe(12);
|
||||
const count = (n: number, mark: string) => abutWallRebar(withSegs(n), footing, undefined, fck27).bars.find((b) => b.mark === mark)?.count ?? 0;
|
||||
expect([count(1, 'W9'), count(1, 'W10')]).toEqual([6, 0]); // 계단 없음: 양끝 끝면 → ㄷ
|
||||
expect([count(2, 'W9'), count(2, 'W10')]).toEqual([6, 6]);
|
||||
expect([count(4, 'W9'), count(4, 'W10')]).toEqual([6, 18]);
|
||||
});
|
||||
|
||||
it('W9 · W10: ⊓ per step, ends at the boundary − 100 (끝면 쪽은 W11 안쪽), legs down l_d 735 (사용자 도면 2026-11-04)', () => {
|
||||
const k = 2; // a middle step
|
||||
it('W9 ㄷ: 양끝 연직 갈고리 330 (끝면 쪽 W11 안쪽 · 낮은 쪽 경계 − 100); W10 ㄴ: 낮은 쪽 갈고리 330 · 높은 쪽 경계 너머 330 직선 겹침 (사용자 도면 2026-11-04)', () => {
|
||||
const sg0 = geom.segments[0]; // IP1 끝, 가장 높음
|
||||
const z0 = 1100 + sg0.H - 100 - 15.9;
|
||||
const w9 = A1.paths.find((q) => q.mark === 'W9')!;
|
||||
expect(w9.pts.length).toBe(4);
|
||||
expect(w9.pts[1][0]).toBeCloseTo((100 + 15.9) / angle.sin, 6);
|
||||
expect(w9.pts[2][0]).toBeCloseTo(sg0.to - 100, 6);
|
||||
expect(w9.pts[0][2]).toBeCloseTo(z0 - 330, 6);
|
||||
expect(w9.pts[3][2]).toBeCloseTo(z0 - 330, 6);
|
||||
const k = 2; // 중간 구간: IP1 쪽 이웃이 높고, IP3 쪽 이웃이 낮음
|
||||
const sg = geom.segments[k];
|
||||
const z = 1100 + sg.H - 100 - 15.9;
|
||||
const p = A1.paths.find((q) => q.mark === 'W10' && Math.abs(q.pts[1][2] - z) < 1e-6)!;
|
||||
expect(p.pts.map((q) => Math.round(q[0] * 10) / 10)).toEqual([sg.from + 100, sg.from + 100, sg.to - 100, sg.to - 100].map((v) => Math.round(v * 10) / 10));
|
||||
expect(p.pts[0][2]).toBeCloseTo(z - 735, 6);
|
||||
expect(p.pts[3][2]).toBeCloseTo(z - 735, 6);
|
||||
const w = A1.bars.find((b) => b.mark === 'W10')!;
|
||||
expect(w.length).toBe(Math.round(sg.to - sg.from - 200 + 2 * 735));
|
||||
// 끝 계단: 끝면 쪽은 W11 안쪽 (100 + (15.9 + 15.9)/2) / sin θ.
|
||||
const w9 = A1.paths.find((q) => q.mark === 'W9')!;
|
||||
expect(w9.pts[1][0]).toBeCloseTo((100 + 15.9) / angle.sin, 6);
|
||||
const p = A1.paths.find((q) => q.mark === 'W10' && Math.abs(q.pts[0][2] - z) < 1e-6)!;
|
||||
expect(p.pts.length).toBe(3); // ㄴ: 직선 겹침 끝 + 갈고리 끝
|
||||
expect(p.pts[0][0]).toBeCloseTo(sg.from - 330, 6);
|
||||
expect(p.pts[1][0]).toBeCloseTo(sg.to - 100, 6);
|
||||
expect(p.pts[2][2]).toBeCloseTo(z - 330, 6);
|
||||
expect(bar(A1, 'W10').count).toBe(24);
|
||||
const w10 = A1.bars.find((b) => b.mark === 'W10')!;
|
||||
expect([w10.length, w10.lengthMax].every((v) => v > 0)).toBe(true);
|
||||
});
|
||||
|
||||
it('정착장 입력: 400으로 바꾸면 갈고리 · 겹침이 함께 400, RB-AB04 "수정됨"', () => {
|
||||
const r = abutWallRebar(geom, footing, { la: 400 }, fck27);
|
||||
const p = r.paths.find((q) => q.mark === 'W9')!;
|
||||
expect(p.pts[1][2] - p.pts[0][2]).toBeCloseTo(400, 6);
|
||||
expect(r.issues.map((i) => i.code)).toContain('RB-AB04');
|
||||
expect(bar(r, 'W9').modified).toBe(true);
|
||||
});
|
||||
|
||||
it('W7: 12 × 5 = 60, 2200 / sin θ + 2 × 197 = 2603 (skew, 사용자 결정 2026-11-04)', () => {
|
||||
|
||||
Reference in new issue
Block a user