/* 288 맹암거 횡단 헬퍼 — 진짜 TS 를 Node 로 돌려 표준출력 JSON 한 벌로. * 입력 = argv[2] JSON 파일 { structures, sections }. */ 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, "..", ".."); const cache = new Map(); const load = (file) => { if (cache.has(file)) return cache.get(file); const js = ts.transpileModule(fs.readFileSync(file, "utf8"), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const box = { exports: {} }; cache.set(file, box.exports); const near = (m) => { if (CATALOG.isCatalogRequest(m)) return CATALOG; if (m.startsWith("@config/")) return load(path.join(ROOT, "config", `${m.slice(8)}.ts`)); if (m.startsWith("@util/")) return load(path.join(ROOT, "common_util", `${m.slice(6)}.ts`)); if (m.startsWith(".")) return load(path.join(path.dirname(file), `${m}.ts`)); return new Proxy({}, { get: () => () => {} }); }; new Function("exports", "module", "require", js)(box.exports, box, near); return box.exports; }; class Node { constructor(tag) { this.tag = tag; this.attrs = {}; this.children = []; } setAttribute(k, v) { this.attrs[k] = String(v); } getAttribute(k) { return this.attrs[k] ?? null; } append(...kids) { this.children.push(...kids); } } globalThis.document = { createElementNS: (_ns, tag) => new Node(tag) }; const input = JSON.parse(fs.readFileSync(process.argv[2], "utf8")); const util = load(path.join(ROOT, "common_util", "common_util_structure_underdrain.ts")); const draw = load(path.join(ROOT, "B06_Section", "B06_Section_UI_Cross_Underdrain.ts")); const specs = util.underdrainSpecsFrom(input.structures); const sections = input.sections.map((s) => ({ ...s })); const attached = util.attachUnderdrainSpecs(sections, specs); // 지대 낮은 쪽(우)으로 5 % 기울인 노면 · 좌 = 절토(오름) · 우 = 성토(내림) · 암거 높이 1 m const design = { road_edges: { left: { offset_m: 3, elevation_m: 100.15 }, right: { offset_m: -3, elevation_m: 99.85 }, }, design_line: [ { offset_m: 6, elevation_m: 102.9 }, { offset_m: 3, elevation_m: 100.15 }, { offset_m: -3, elevation_m: 99.85 }, { offset_m: -7, elevation_m: 97.2 }, ], }; const svg = new Node("g"); const group = draw.appendUnderdrainOverlay( svg, { structure_id: "ud-1", chainage_m: 40, height_m: 1, slope_pct: 5 }, design, (o) => o, (e) => e, ); const body = group?.children.find((k) => k.attrs.class === "b06-chart__underdrain-body"); // 288-2 형상 누름 창구 — 물넘이(pipe-…) = 시설 고름 · 맹암거 = id 알림(목록이 고름) globalThis.CustomEvent = class { constructor(type, init) { this.type = type; this.detail = init?.detail; this.bubbles = init?.bubbles; } }; const shapePick = load(path.join(ROOT, "B06_Section", "B06_Section_UI_Cross_Shape_Pick.ts")); const routed = []; const from = { dispatchEvent: (event) => routed.push([event.type, event.detail, event.bubbles]) }; const route = shapePick.shapePickRoute(from, () => routed.push(["pipe"])); route("pipe-230.00"); route("ud-1"); process.stdout.write( JSON.stringify({ specs, attached, sections: sections.map((s) => s.underdrain ?? null), outline: draw.underdrainOutline(design, 1), noHeight: draw.underdrainOutline(design, null), drew: !!group, bodyId: body?.attrs["data-structure-id"] ?? null, routed, eventName: shapePick.SHAPE_PICK_EVENT, stones: group?.children.filter((k) => k.tag === "g").flatMap((g) => g.children).length ?? 0, }), );