// 교대 A1 받침 ① 위치의 높이 후보들 (흉벽 상단 · 교좌면 · 받침 z · 저판 상면 · 기초 하단)을 JSON으로 저장한다. 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'; it('dump 받침 ① 높이 후보', () => { 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 m = buildMembers(model, { bottomEl: rec.foundationBottomEl, pileLengthMm: rec.pileLengthMm }); const b1 = model.bearings[0]; const L = model.length; const topAt = (s: number) => m.parapetTopStartEl + ((m.parapetTopEndEl - m.parapetTopStartEl) * s) / L; const r = { L, bearings: model.bearings.map((b) => ({ no: b.no, s: b.s, z: b.z, seatEl: b.seatEl, block: b.blockHeightMm })), b1s: b1.s, top_b1: topAt(b1.s), seat_b1: b1.seatEl, z_b1: b1.z, footingTop: m.footingTopEl, footingBottom: m.footingBottomEl, parapetHeight: m.shape.parapetHeightM, bracketH: m.shape.bracketHeightM, top_minus_seat: topAt(b1.s) - b1.seatEl, top_minus_z: topAt(b1.s) - b1.z, top_minus_footingTop: topAt(b1.s) - m.footingTopEl, seat_minus_footingTop: b1.seatEl - m.footingTopEl, top_minus_footingBottom: topAt(b1.s) - (m.footingBottomEl ?? NaN), }; writeFileSync(out + '/bearing1.json', JSON.stringify(r, null, 1)); });