/* 286 물넘이포장 종횡단 헬퍼 — 진짜 TS 를 Node 로 돌려 표준출력 JSON 한 벌로. * 입력 = argv[2] JSON 파일 { pipes, structures, types }. */ const fs = require("fs"); const path = require("path"); const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript")); const CATALOG = require("./helper_322_catalog_module.cjs"); // 구조물 표(322-1) const ROOT = path.join(__dirname, "..", ".."); function loadTs(file, stubs = {}) { const js = ts.transpileModule(fs.readFileSync(file, "utf8"), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const box = { exports: {} }; const localRequire = (request) => { if (CATALOG.isCatalogRequest(request)) return CATALOG; if (stubs[request]) return stubs[request]; throw new Error(`stub 없음: ${request}`); }; new Function("exports", "module", "require", js)(box.exports, box, localRequire); return box.exports; } const input = JSON.parse(fs.readFileSync(process.argv[2], "utf8")); const station = loadTs(path.join(ROOT, "common_util", "common_util_structure_station.ts")); const ford = loadTs(path.join(ROOT, "B06_Section", "B06_Section_UI_Cross_Ford_Pavement.ts"), { "./B06_Section_UI_Cross_Wall_Hatch": loadTs( path.join(ROOT, "B06_Section", "B06_Section_UI_Cross_Wall_Hatch.ts"), { "./logic/B06_Section_UI_Cross_Culvert_Const": {} }, ), "./B06_Section_UI_Cross_Design_Surface": { appendPavementOverlay() {} }, // 관 세션 id · 신원표(323-5) — 프로젝트 없음 = 옛 자리 이름 "../A00_Common/design/design_pipe_ids": { pipeIdAt: (at) => `pipe-${at.toFixed(2)}` }, "../A00_Common/design/design_pick_match": { tagShape: (el, id, part) => { if (id) el.setAttribute("data-structure-id", id); if (part) el.setAttribute("data-part", part); }, }, }); // 286-3 도수로 · 돌붙임 길이 — 유출(좌 · 우가 높음) 성토사면 1:1.5(5 m 내려감 · 사면 길이 √(7.5²+5²) ≈ 9.01) const sets = loadTs(path.join(ROOT, "common_util", "common_util_culvert_sets.ts")); const slopeDesign = { design_elevation_m: 100, cross_slope_pct: 2, section_mode: "left_cut", road_edges: { left: { offset_m: 2.5, elevation_m: 100 }, right: { offset_m: -2.5, elevation_m: 100 }, }, design_line: [ { offset_m: 10, elevation_m: 95 }, { offset_m: 2.5, elevation_m: 100 }, { offset_m: -2.5, elevation_m: 100 }, { offset_m: -6, elevation_m: 104 }, ], }; const chuteOf = (extra) => sets.chute( { ford_chute_1_structure: "돌붙임", ford_chute_1_thickness: 30, ...extra }, "ford_chute", ); const out = { chuteNoLength: chuteOf({}), chuteLength: chuteOf({ ford_chute_1_length_m: 3 }), lineNoLength: ford.fordChuteLine(slopeDesign, chuteOf({})), lineLength: ford.fordChuteLine(slopeDesign, chuteOf({ ford_chute_1_length_m: 3 })), lineTooLong: ford.fordChuteLine(slopeDesign, chuteOf({ ford_chute_1_length_m: 50 })), fordMarks: station.pipeStationMarks({ chainage_m: 230, facility: "ford_pavement" }), planted: station.plantedChainages(input.pipes, input.structures, input.types), }; process.stdout.write(JSON.stringify(out));