fix(rebar): 측면 수평 C12 = 상단 · C13 = 하단 변화구간 (엑셀 Pier B357–G358)
T형과 다주형 모두 엑셀 Pier 시트 철근표(C12 상단, C13 하단(변화구간))에 맞춰 측면 수평철근 번호를 서로 바꾼다 (사용자 결정 2026-11-06). - 경사 하면에서 끊기는 아래 단 → C13, 끝면까지 가는 위 단 → C12 - 철근표 위치·비고 문구, 3D, 다주형 생성기가 같은 원천(sideRows)을 따른다 - C14 높이 순서를 유지하도록 측면 단을 아래(C13) → 위(C12) 순서로 넘김 - 테스트 기대값의 번호를 교환 (P1: C12 2단 8개, C13 5단 20개) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
fb7b4b021b
commit
2b26b7c095
10 files changed
+52
-50
No files matched your search
+15
-15
@@ -61,7 +61,7 @@ describe('① 코핑 끝단 높이 h1 · 테이퍼 높이 h2 · Level 폭 (1단
|
||||
});
|
||||
});
|
||||
|
||||
describe('C12 in the taper band (h2), C13 in the end band (h1)', () => {
|
||||
describe('C13 in the taper band (h2), C12 in the end band (h1)', () => {
|
||||
const bands = (input: Parameters<typeof buildPier>[0]) => {
|
||||
const m = buildPier(input);
|
||||
const lv = sideRowLevels(m.levelBottom, m.endBottom);
|
||||
@@ -73,13 +73,13 @@ describe('C12 in the taper band (h2), C13 in the end band (h1)', () => {
|
||||
['h1 800', { copingH1Mm: 800 }],
|
||||
['h1 1200', { copingH1Mm: 1200 }],
|
||||
['h2 1800', { copingH2Mm: 1800 }],
|
||||
])('%s: every C12 row is in the taper band and every C13 row in the end band', (_name, change) => {
|
||||
])('%s: every C13 row is in the taper band and every C12 row in the end band', (_name, change) => {
|
||||
const { m, rows } = bands({ ...loadP1(), ...change });
|
||||
for (const z of rows.c12) {
|
||||
for (const z of rows.c13) {
|
||||
expect(z).toBeGreaterThanOrEqual(m.levelBottom - 1e-9);
|
||||
expect(z).toBeLessThan(m.endBottom + SIDE_COVER_M);
|
||||
}
|
||||
for (const z of rows.c13) {
|
||||
for (const z of rows.c12) {
|
||||
expect(z).toBeGreaterThanOrEqual(m.endBottom + SIDE_COVER_M - 1e-9);
|
||||
expect(z).toBeLessThanOrEqual(m.copingRefTop);
|
||||
}
|
||||
@@ -92,23 +92,23 @@ describe('side-row grid (250, 상면 여유 400, 격자 연속)', () => {
|
||||
const lv = sideRowLevels(m.levelBottom, m.endBottom, m.copingRefTop);
|
||||
return { m, rows: sideRows(lv.zBottom, lv.zBreak, lv.zTop) };
|
||||
};
|
||||
it('P1: 5 C12 rows and 2 C13 rows, the top row at or below top − 0.4', () => {
|
||||
it('P1: 5 C13 rows and 2 C12 rows, the top row at or below top − 0.4', () => {
|
||||
const { m, rows } = rowsFor(loadP1());
|
||||
expect(rows.c12).toEqual([41.288, 41.538, 41.788, 42.038, 42.288]);
|
||||
expect(rows.c13).toEqual([42.538, 42.788]);
|
||||
expect(Math.max(...rows.c13)).toBeLessThanOrEqual(m.copingRefTop - 0.4 + 1e-9);
|
||||
expect(rows.c13).toEqual([41.288, 41.538, 41.788, 42.038, 42.288]);
|
||||
expect(rows.c12).toEqual([42.538, 42.788]);
|
||||
expect(Math.max(...rows.c12)).toBeLessThanOrEqual(m.copingRefTop - 0.4 + 1e-9);
|
||||
});
|
||||
it('taper h2 = 3000: C12 from 39.788 to 42.288 (11 rows), C13 2 rows, no row lost to a fixed count', () => {
|
||||
it('taper h2 = 3000: C13 from 39.788 to 42.288 (11 rows), C12 2 rows, no row lost to a fixed count', () => {
|
||||
const { rows } = rowsFor({ ...loadP1(), copingH2Mm: 3000 });
|
||||
expect(rows.c12.length).toBe(11);
|
||||
expect(rows.c12[0]).toBeCloseTo(39.788, 3);
|
||||
expect(rows.c13).toEqual([42.538, 42.788]);
|
||||
expect(rows.c13.length).toBe(11);
|
||||
expect(rows.c13[0]).toBeCloseTo(39.788, 3);
|
||||
expect(rows.c12).toEqual([42.538, 42.788]);
|
||||
});
|
||||
it('the C13 first row is the last C12 row plus the pitch (the grid is continuous)', () => {
|
||||
it('the C12 first row is the last C13 row plus the pitch (the grid is continuous)', () => {
|
||||
for (const h2 of [1000, 1500, 1750, 2000, 3000]) {
|
||||
const { rows } = rowsFor({ ...loadP1(), copingH2Mm: h2 });
|
||||
if (rows.c12.length && rows.c13.length) {
|
||||
expect(rows.c13[0] - rows.c12[rows.c12.length - 1]).toBeCloseTo(0.25, 6);
|
||||
if (rows.c13.length && rows.c12.length) {
|
||||
expect(rows.c12[0] - rows.c13[rows.c13.length - 1]).toBeCloseTo(0.25, 6);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -37,18 +37,18 @@ describe('코핑 철근 (코핑철근.md, plan C3)', () => {
|
||||
expect(() => shearBars(2200)).toThrow('RB-K01');
|
||||
});
|
||||
|
||||
it('C12 has 5 rows below the break at 42.538, C13 has 2 rows at and above it', () => {
|
||||
it('C13 has 5 rows below the break at 42.538, C12 has 2 rows at and above it', () => {
|
||||
const r = sideRows(41.288, 42.538);
|
||||
expect(r.c12).toEqual([41.288, 41.538, 41.788, 42.038, 42.288]);
|
||||
expect(r.c13).toEqual([42.538, 42.788]);
|
||||
expect(r.c13).toEqual([41.288, 41.538, 41.788, 42.038, 42.288]);
|
||||
expect(r.c12).toEqual([42.538, 42.788]);
|
||||
});
|
||||
|
||||
it('C12 일자 lengths 3717 / 5333 / 6950 / 8567 / 10183 and C13 11746 for L 12000 (코핑철근.md §6.2 table)', () => {
|
||||
it('C13 일자 lengths 3717 / 5333 / 6950 / 8567 / 10183 and C12 11746 for L 12000 (코핑철근.md §6.2 table)', () => {
|
||||
const s = copingSideBars(12000, 41.288, 42.538);
|
||||
const expected = [3717, 5333, 6950, 8567, 10183];
|
||||
s.c12.forEach((r, i) => expect(r.straight).toBeCloseTo(expected[i], 0));
|
||||
expect(s.c12[0].xw).toBeCloseTo(4141.7, 1);
|
||||
s.c13.forEach((r) => {
|
||||
s.c13.forEach((r, i) => expect(r.straight).toBeCloseTo(expected[i], 0));
|
||||
expect(s.c13[0].xw).toBeCloseTo(4141.7, 1);
|
||||
s.c12.forEach((r) => {
|
||||
expect(r.xw).toBe(127);
|
||||
expect(r.straight).toBe(11746);
|
||||
});
|
||||
|
||||
@@ -7,7 +7,7 @@ const m = buildPier(loadP1());
|
||||
const L = m.copingL * 1000;
|
||||
const B = m.copingB * 1000;
|
||||
const side = copingSideBars(L, 41.288, 42.538);
|
||||
const rows = [...side.c12, ...side.c13];
|
||||
const rows = [...side.c13, ...side.c12];
|
||||
const under = (x: number) => undersideAt(L, x, m.endBottom, m.levelBottom);
|
||||
|
||||
describe('C14 / C15 / C16 (코핑철근.md §7–8)', () => {
|
||||
|
||||
@@ -12,13 +12,13 @@ describe('③ 철근표 요약 (P1)', () => {
|
||||
expect(count('S2')).toBe(80);
|
||||
});
|
||||
|
||||
it('coping: C1–C8 12 each, C9 18, C10 9, C11 18, C12 20 (5 rows × 일자 2 + ㄷ 2), C13 8 (2 rows), C14 38, C15 11, C16 22', () => {
|
||||
it('coping: C1–C8 12 each, C9 18, C10 9, C11 18, C13 20 (5 rows × 일자 2 + ㄷ 2), C12 8 (2 rows), C14 38, C15 11, C16 22', () => {
|
||||
for (const n of ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8']) expect(count(n)).toBe(12);
|
||||
expect(count('C9')).toBe(18);
|
||||
expect(count('C10')).toBe(9);
|
||||
expect(count('C11')).toBe(18);
|
||||
expect(count('C12')).toBe(20);
|
||||
expect(count('C13')).toBe(8);
|
||||
expect(count('C13')).toBe(20);
|
||||
expect(count('C12')).toBe(8);
|
||||
expect(count('C14')).toBe(38);
|
||||
expect(count('C15')).toBe(11);
|
||||
expect(count('C16')).toBe(22);
|
||||
@@ -52,9 +52,9 @@ describe('③ 철근표 요약 (P1)', () => {
|
||||
expect(rows.find((r) => r.name === 'B6')!.length!).toBeCloseTo(7776, 0);
|
||||
});
|
||||
|
||||
it('lengths from the documents: C13 11746, C14 3447.5, C15 3852, C16 4070, P3 ≈ C_t + 1.3·l_d, P5 ≈ C_t', () => {
|
||||
// C13 has several lengths now: its straight bars are pieces (수정 2026-10-23); 11746 is the first 일자.
|
||||
expect(rows.find((r) => r.name === 'C13')!.pieces!.some((p) => p.length === 11746)).toBe(true);
|
||||
it('lengths from the documents: C12 11746, C14 3447.5, C15 3852, C16 4070, P3 ≈ C_t + 1.3·l_d, P5 ≈ C_t', () => {
|
||||
// C12 has several lengths now: its straight bars are pieces (수정 2026-10-23); 11746 is the first 일자.
|
||||
expect(rows.find((r) => r.name === 'C12')!.pieces!.some((p) => p.length === 11746)).toBe(true);
|
||||
expect(rows.find((r) => r.name === 'C14')!.length).toBe(3447.5);
|
||||
expect(rows.find((r) => r.name === 'C15')!.length).toBe(3852);
|
||||
expect(rows.find((r) => r.name === 'C16')!.length).toBe(4070);
|
||||
|
||||
@@ -33,8 +33,9 @@ describe('3D 철근 모델 (③)', () => {
|
||||
});
|
||||
|
||||
it('C12 / C13 in 3D: per row two 일자 and two ㄷ (body + 2 legs each end)', () => {
|
||||
expect(rb.byName.get('C12')!.length).toBe(5 * (2 + 2 * 3));
|
||||
expect(rb.byName.get('C13')!.length).toBe(2 * (2 + 2 * 3));
|
||||
// C12 = 상단 2 rows, C13 = 하단 변화구간 5 rows (엑셀 Pier B357–G358, 2026-11-06).
|
||||
expect(rb.byName.get('C12')!.length).toBe(2 * (2 + 2 * 3));
|
||||
expect(rb.byName.get('C13')!.length).toBe(5 * (2 + 2 * 3));
|
||||
});
|
||||
|
||||
it('C1 legs turn down 472 at the ends (to EL 42.812 at the end face)', () => {
|
||||
|
||||
Reference in new issue
Block a user