fix(abut-rebar): 벽체 W7 skew 길이 · W11 ㄷ형 · RB-AB06 피복 경고

- W7 길이에 1/sin θ 적용 (2594 → 2603)
- W11 위 갈고리 추가, 아래 · 위 모두 교대축 안쪽 ㄷ형 (3433/3717 → 3679/3963), 계단 단면 삽도에 반영
- W9 · W10 연장부 피복 < c이면 RB-AB06 경고만 (A1 44.9)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-11-04 16:40:23 +09:00
1 parent a4c7bcabcf
commit 34959f5b4e
3 files changed
+32 -14

No files matched your search

+16 -6
View File
@@ -92,8 +92,8 @@ describe('교대 벽체 배근 A1 (AD4, 교대벽체철근.md §11)', () => {
expect(p.pts[1][0]).toBeCloseTo(lowRight ? sg.to + 735 : sg.to, 6);
});
it('W7: 12 × 5 = 60, 2594', () => {
expect([bar(A1, 'W7').count, bar(A1, 'W7').length]).toEqual([60, 2594]);
it('W7: 12 × 5 = 60, 2200 / sin θ + 2 × 197 = 2603 (skew, 사용자 결정 2026-11-04)', () => {
expect([bar(A1, 'W7').count, bar(A1, 'W7').length]).toEqual([60, 2603]);
});
it('W8: 3383, 낮은 끝 18 + 높은 끝 20 = 38, 끝면에서 114.3', () => {
@@ -102,15 +102,25 @@ describe('교대 벽체 배근 A1 (AD4, 교대벽체철근.md §11)', () => {
expect(w8.pts[1][0] * angle.sin).toBeCloseTo(114.3, 6);
});
it('W11: 끝면당 13 + 3 = 16, 양끝 32, 길이 3433 / 3717', () => {
it('W11: 끝면당 13 + 3 = 16, 양끝 32, ㄷ형 (위 갈고리 246 추가) 길이 3679 / 3963', () => {
const w = bar(A1, 'W11');
expect([w.count, w.length, w.lengthMax]).toEqual([32, 3433, 3717]);
expect([w.count, w.length, w.lengthMax]).toEqual([32, 3433 + 246, 3717 + 246]);
const p = A1.paths.find((q) => q.mark === 'W11')!;
expect(p.pts.length).toBe(4);
expect(p.pts[0][0]).toBeCloseTo(p.pts[3][0], 6); // both hooks turn the same way (inward)
expect(p.pts[3][0]).toBeGreaterThan(p.pts[1][0]);
const xs = A1.paths.filter((p) => p.mark === 'W11').slice(0, 16).map((p) => Math.round(p.pts[1][1]));
expect(xs).toEqual([-700, -400, -100, ...Array.from({ length: 13 }, (_, i) => i * 125)]);
});
it('A1 has no warning (RB-AB02 · RB-AB03 없음)', () => {
expect(A1.issues.filter((i) => i.level !== 'I').map((i) => i.code)).toEqual([]);
it('A1 warns only RB-AB06: W9 · W10 연장부 피복 44.9 < 100 (계단 71.1)', () => {
expect(A1.issues.filter((i) => i.level !== 'I').map((i) => i.code)).toEqual(['RB-AB06']);
expect(A1.issues.find((i) => i.code === 'RB-AB06')!.message).toContain('44.9');
});
it('RB-AB06 is gone when the steps are flat enough (높이 차 0)', () => {
const flat = { ...geom, segments: geom.segments.map((s) => ({ ...s, H: 2372 })) };
expect(abutWallRebar(flat, footing, undefined, fck27).issues.map((i) => i.code)).not.toContain('RB-AB06');
});
it('l_d 연동: fck 30 → W2 앞 다리 · W3 위 끝이 짧아짐', () => {