feat(abut-rebar): 교대 흉벽 · 브라켓 배근 삽도 (단면 · 교대축 단면 · P10 다웰 평면)
- 대표 단면(흉벽 높이 = 입력값): P1–P3 · P6 · P7 · P10 선, P4 · P5 점, 두께 · 단 수 치수 - 교대축 단면: 상단 경사와 나란한 P4, P1, 끝면 P11 · P8 · P9 - P10 평면: 슬래브 측면선, 다웰 n개, P3 다리 위치와 비켜 옮긴 다웰 - verify/dump: 흉벽 삽도 덤프 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ba71911edc
commit
914e3dbda8
3 files changed
+190
No files matched your search
@@ -0,0 +1,40 @@
|
||||
// 교대 A1 흉벽 · 브라켓 배근 삽도 3장을 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 } from '../../src/core/abut/slab';
|
||||
import { abutFootingGeom, abutFootingRebar } from '../../src/core/abut/rebar/footing';
|
||||
import { skewAngle } from '../../src/core/abut/rebar/skew-layout';
|
||||
import { abutWallGeom, abutWallRebar } from '../../src/core/abut/rebar/wall';
|
||||
import { abutParapetGeom, abutParapetRebar, slabSpanAt } from '../../src/core/abut/rebar/parapet';
|
||||
import { abutPlanOutline, abutSkewK } from '../../src/view/abut-scene';
|
||||
import { abutParapetDowelSvg, abutParapetElevationSvg, abutParapetSectionSvg } from '../../src/view/abut-parapet-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 angle = skewAngle(rec.skewDeg);
|
||||
const footing = abutFootingRebar(abutFootingGeom(model.length, members.shape, angle));
|
||||
const wg = abutWallGeom(model.length, members, angle);
|
||||
const wall = abutWallRebar(wg, footing);
|
||||
const slab = resolveSlab();
|
||||
const tM = ((wg.xb + members.shape.parapetBackM * 1000) / 2) / 1000;
|
||||
const span = slabSpanAt(abutPlanOutline(model, members, wings, slab).slab, tM, abutSkewK(model))!;
|
||||
const ch = (sEnd: number) => (wings.find((w) => w.sEnd === sEnd)?.haunchM ?? 0) * 1000;
|
||||
const g = abutParapetGeom(wg, members.shape, { B: model.wing!.slabWidthMm, a: span.a, b: span.b, nearT: members.shape.parapetBackM * 1000 - slab.parapetGapMm, chamferA: ch(0), chamferB: ch(model.length) });
|
||||
const r = abutParapetRebar(g, wall);
|
||||
const ns = (svg: string) => svg.replace('<svg ', '<svg xmlns="http://www.w3.org/2000/svg" ');
|
||||
writeFileSync(`${out}/parapet-section.svg`, ns(abutParapetSectionSvg(g, r)));
|
||||
writeFileSync(`${out}/parapet-elevation.svg`, ns(abutParapetElevationSvg(g, r)));
|
||||
writeFileSync(`${out}/parapet-dowel.svg`, ns(abutParapetDowelSvg(g, r)));
|
||||
});
|
||||
Reference in new issue
Block a user