- 평면: 왼쪽 절반 하면 (R3 · R4 · R8) · 오른쪽 절반 상면 (R1 · R2), 모따기 모서리 R7, 교대축 · 길이 배치 치수 - 단면 (길이 방향, 폭 가운데): 브라켓 위 평탄 + 경사, 층 순서, R8은 R1 · R3 사이 - verify/dump: 접속슬래브 삽도 덤프 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
32 lines
2.2 KiB
TypeScript
32 lines
2.2 KiB
TypeScript
// 교대 A1 접속슬래브 배근 삽도 2장을 SVG로 저장한다 (PNG 확인: python3 -I ../verify/svg_to_png.py <svg> <png>).
|
|
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
import { fileURLToPath } from 'node:url';
|
|
import * as XLSX from 'xlsx';
|
|
import { it } from 'vitest';
|
|
import { buildAbut } from '../../src/core/abut/geometry';
|
|
import { parseAbutments, toAbutInput } from '../../src/core/abut/parse';
|
|
import { buildMembers } from '../../src/core/abut/members';
|
|
import { buildWings } from '../../src/core/abut/wings';
|
|
import { resolveSlab, slabGradePct, slabSection } from '../../src/core/abut/slab';
|
|
import { abutSlabGeom, abutSlabRebar } from '../../src/core/abut/rebar/slab';
|
|
import { abutPlanOutline } from '../../src/view/abut-scene';
|
|
import { abutSlabPlanSvg, abutSlabSectionSvg } from '../../src/view/abut-slab-rebar-svg';
|
|
|
|
it('dump 교대 A1 접속슬래브 삽도', () => {
|
|
const out = process.env.DUMP_OUT ?? fileURLToPath(new URL('./out', import.meta.url));
|
|
mkdirSync(out, { recursive: true });
|
|
const xlsx = fileURLToPath(new URL('../../../../RAG/운곡교P1입력.xlsx', import.meta.url));
|
|
const rec = parseAbutments(XLSX.read(readFileSync(xlsx), { type: 'buffer' })).abutments[0];
|
|
const model = buildAbut(toAbutInput(rec));
|
|
const members = buildMembers(model, { bottomEl: rec.foundationBottomEl, pileLengthMm: rec.pileLengthMm });
|
|
const wings = buildWings(model, members);
|
|
const slab = resolveSlab(process.env.FORM === 'exposed' ? { form: 'exposed' } : undefined);
|
|
const grade = slabGradePct(slab, model.wing?.slopePct ?? 0);
|
|
const ch = (sEnd: number) => (wings.find((w) => Math.abs(w.sEnd - sEnd) < 1e-9)?.haunchM ?? 0) * 1000;
|
|
const g = abutSlabGeom(slab.form, abutPlanOutline(model, members, wings, slab).slab, slabSection(slab, grade, members.shape), { startEl: members.parapetTopStartEl, endEl: members.parapetTopEndEl, L: model.length, bottomEl: members.footingBottomEl! }, [ch(0), ch(model.length)], slab.lengthMm, grade);
|
|
const r = abutSlabRebar(g);
|
|
const ns = (svg: string) => svg.replace('<svg ', '<svg xmlns="http://www.w3.org/2000/svg" ');
|
|
writeFileSync(`${out}/slab-plan.svg`, ns(abutSlabPlanSvg(g, r)));
|
|
writeFileSync(`${out}/slab-section.svg`, ns(abutSlabSectionSvg(g, r)));
|
|
});
|