feat(rebar): 현장타설 말뚝 · 다주형 코핑 형상과 철근 계산
- 현장타설 기둥·말뚝 형상(cast-in-place-shape)과 주철근·횡철근·커플러 계산(rebar/cast-in-place, cast-layout) - 다주형 코핑 철근(multicol-coping), 기둥 높이 · 양단부 연장 - 철근표 요약 · 재료 수량 · 3D 뷰 연결과 삽도(cast-rebar-svg) - 검사 기준 갱신과 회귀 테스트, 검증 스크립트 보관 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3922b330d5
commit
2e0bfb6fc8
29 files changed
+1750
-71
No files matched your search
@@ -82,29 +82,56 @@ describe('foundation types', () => {
|
||||
expect(m.piles[0].diameter).toBeCloseTo(0.6096, 6);
|
||||
});
|
||||
|
||||
it('2주형: underside between columns drops 300 below Level, T형 has no such point (Q3 추천안)', () => {
|
||||
it('2주형: underside between columns rises 300 above Level; column tops and T형 stay at Level', () => {
|
||||
const t = buildPier(loadP1());
|
||||
const dip = t.levelBottom - 0.3;
|
||||
expect(t.copingParts[0].profile.some(([, z]) => Math.abs(z - dip) < 1e-9)).toBe(false);
|
||||
const raised = t.levelBottom + 0.3;
|
||||
expect(t.copingParts[0].profile.some(([, z]) => Math.abs(z - raised) < 1e-9)).toBe(false);
|
||||
|
||||
const two = buildPier({ ...loadP1(), type: '2주형', columnCount: 2 });
|
||||
expect(two.copingParts[0].profile.some(([, z]) => Math.abs(z - dip) < 1e-9)).toBe(true);
|
||||
expect(two.copingParts[0].profile.some(([, z]) => Math.abs(z - raised) < 1e-9)).toBe(true);
|
||||
const outlineLow = Math.min(...two.copingParts[0].profile.map(([, z]) => z));
|
||||
expect(outlineLow).toBeCloseTo(dip, 9);
|
||||
expect(outlineLow).toBeCloseTo(two.levelBottom, 9);
|
||||
expect(two.columns.every((c) => c.top === two.levelBottom)).toBe(true);
|
||||
});
|
||||
|
||||
it('3주형 builds with two gaps of haunches', () => {
|
||||
const m = buildPier({ ...loadP1(), type: '3주형', columnCount: 3 });
|
||||
const dips = m.copingParts[0].profile.filter(([, z]) => Math.abs(z - (m.levelBottom - 0.3)) < 1e-9);
|
||||
expect(dips).toHaveLength(4);
|
||||
const raised = m.copingParts[0].profile.filter(([, z]) => Math.abs(z - (m.levelBottom + 0.3)) < 1e-9);
|
||||
expect(raised).toHaveLength(4);
|
||||
});
|
||||
|
||||
it('현장타설말뚝: no footing, one pile of column diameter per column, tip = bottom EL − length', () => {
|
||||
const m = buildPier({ ...loadP1(), foundationType: '현장타설말뚝' });
|
||||
for (const type of ['2주형', '3주형'] as const) {
|
||||
for (const dims of [{}, { copingLengthMm: 15000, copingH1Mm: 1200, copingH2Mm: 1000, levelWidthMm: 2400 }]) {
|
||||
it(`${type}: raised spans and 300 × 300 haunches follow every column, dimensions ${JSON.stringify(dims)}`, () => {
|
||||
const m = buildPier({ ...loadP1(), ...dims, type, columnCount: type === '2주형' ? 2 : 3 });
|
||||
const profile = m.copingParts[0].profile;
|
||||
const half = m.copingGeom.levelWidth / 2000;
|
||||
const has = (x: number, z: number) => profile.some(([s, el]) => Math.abs(s - x) < 1e-9 && Math.abs(el - z) < 1e-9);
|
||||
for (const c of m.columns) {
|
||||
expect(has(c.s - half, m.levelBottom)).toBe(true);
|
||||
expect(has(c.s + half, m.levelBottom)).toBe(true);
|
||||
expect(c.top).toBe(m.levelBottom);
|
||||
}
|
||||
for (let i = 0; i < m.columns.length - 1; i++) {
|
||||
const left = m.columns[i].s + half;
|
||||
const right = m.columns[i + 1].s - half;
|
||||
expect(has(left + 0.3, m.levelBottom + 0.3)).toBe(true);
|
||||
expect(has(right - 0.3, m.levelBottom + 0.3)).toBe(true);
|
||||
}
|
||||
expect(Math.min(...profile.map(([, z]) => z))).toBeCloseTo(m.levelBottom, 9);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
it('현장타설말뚝: no footing, one pile of column diameter per column, tip = ground EL − length', () => {
|
||||
const input = { ...loadP1(), foundationType: '현장타설말뚝' as const };
|
||||
const m = buildPier(input);
|
||||
expect(m.footings).toHaveLength(0);
|
||||
expect(m.piles).toHaveLength(1);
|
||||
expect(m.piles[0].diameter).toBeCloseTo(2.0, 6);
|
||||
expect(m.piles[0].bottom).toBeCloseTo(26.208 - 24, 6);
|
||||
expect(m.piles[0].top).toBe(input.groundEl);
|
||||
expect(m.columns[0].bottom).toBe(input.groundEl);
|
||||
expect(m.piles[0].bottom).toBeCloseTo(input.groundEl - input.pileLengthMm / 1000, 6);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user