- 세월교 명세(design_structure_ford) — 세월교(관경 · 월류 폭 · 월류 높이 · 수량(련)) · 유입 구조 · 유출 구조(없음 · 날개벽 · 흙막이) · 모두 필수 · 컨테이너마다 구조물 조합 잇기(gford · gfordin · gfordout) - 구조 키 inlet_type · outlet_type + 옛 날개벽 설치 칸(wing_in · wing_out) 함께 씀 · 옛 저장 · B06 조정창 설치 칸으로 구조를 맞춤 · 옛 관종 · 날개벽 치수는 지난 정의 값 - 계산 파일 따로(design_structure_ford_calc) — 높이 = 설계유량을 그 폭으로 넘기는 Manning 필요 수심 · 0.01 올림 · 폭을 바꾸면 채움 · 그 아래는 안 받음 · 근거 통수단면.md:23~33 · :59 - B06 날개벽 조정 행 자리 = 유입 · 유출 구조 컨테이너 끝 · 세월교 옛 관종 · 관경 · 월류 칸 걷음 - 정의 종류.ford_bridge.이름 표 · 명세 등록(STRUCTURE_SPECS) · 52-1 시험 헬퍼가 같은 폴더 명세 import 를 읽음 - 시험 test_52_4_structure_spec_ford · 화면 시나리오 ui_checks/52-4_세월교_컨테이너 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPJGtfXo6GMbcpiboQC4uK
89 lines
3.6 KiB
JavaScript
89 lines
3.6 KiB
JavaScript
/* 구조물 명세 공용 틀 · 배관 명세 단위검증 헬퍼(PLAN 52-1) — `design_structure_spec.ts` ·
|
|
* `design_structure_pipe.ts` 를 그 자리에서 트랜스파일해 Node 로 돌림(꼴만 import). 결과 = JSON 한 벌.
|
|
* 인자 `names` 면 배관 이름 표(정의 `종류.pipe.이름`)만 냄.
|
|
*/
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript"));
|
|
|
|
const ROOT = path.join(__dirname, "..", "..");
|
|
const load = (file, deps = {}) => {
|
|
const src = fs.readFileSync(path.join(ROOT, "A00_Common", "design", file), "utf8");
|
|
const js = ts.transpileModule(src, {
|
|
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
|
|
}).outputText;
|
|
const box = { exports: {} };
|
|
const near = (m) => (m.startsWith("./") ? load(`${m.slice(2)}.ts`) : require(m)); // 같은 폴더 명세
|
|
new Function("exports", "module", "require", js)(box.exports, box, (m) => deps[m] ?? near(m));
|
|
return box.exports;
|
|
};
|
|
const s = load("design_structure_spec.ts");
|
|
const { PIPE_SPEC } = load("design_structure_pipe.ts");
|
|
|
|
if (process.argv[2] === "names") {
|
|
process.stdout.write(JSON.stringify(s.nameTable(PIPE_SPEC)));
|
|
process.exit(0);
|
|
}
|
|
|
|
const old = {
|
|
pipe_kind: "흄관",
|
|
wing_wall_type: "A-TYPE",
|
|
pipe_diameter_mm: 1000,
|
|
inlet_type: "집수정",
|
|
inlet_structure: "L",
|
|
inlet_basin_length_m: 2,
|
|
inlet_basin_before_m: 1,
|
|
inlet_basin_after_m: 1,
|
|
outlet_type: "기슭막이",
|
|
outlet_revet_form: "돌쌓기(메)",
|
|
outlet_revet_length_m: 10,
|
|
outlet_revet_height_m: 2.5,
|
|
soil_add_2_structure: "기슭막이",
|
|
soil_add_2_form: "바자",
|
|
soil_add_5_length_m: 4,
|
|
chute_add_1_structure: "도수로",
|
|
};
|
|
const state = s.readState(PIPE_SPEC, old);
|
|
const back = s.writeOptions(PIPE_SPEC, state);
|
|
// 흙막이로 바꿈 → 갈래 키가 기슭막이 쪽 · also(inlet_structure revet)
|
|
const soil = JSON.parse(JSON.stringify(state));
|
|
soil.inlet[0].structure = "기슭막이";
|
|
soil.inlet[0].form = "콘크리트";
|
|
soil.inlet[0].length = "6";
|
|
const soilOut = s.writeOptions(PIPE_SPEC, soil);
|
|
const inlet = PIPE_SPEC.containers.find((c) => c.id === "inlet");
|
|
const form = inlet.items.find((i) => i.id === "form");
|
|
const keys = s.specKeys(PIPE_SPEC);
|
|
|
|
const out = {
|
|
containers: PIPE_SPEC.containers.map((c) => [c.id, c.title, c.required]),
|
|
state,
|
|
back,
|
|
soilOut,
|
|
formBasin: s.choicesOf(form, { structure: "집수정" }).map((c) => c.label),
|
|
formSoil: s.choicesOf(form, { structure: "기슭막이" }).map((c) => c.label),
|
|
formNone: s.branchOf(form, {}),
|
|
outletForms: s
|
|
.choicesOf(
|
|
PIPE_SPEC.containers.find((c) => c.id === "outlet").items.find((i) => i.id === "form"),
|
|
{ structure: "기슭막이" },
|
|
)
|
|
.map((c) => c.label),
|
|
keys,
|
|
links: PIPE_SPEC.containers.map((c) => s.linkOf(c, 2)),
|
|
split: {
|
|
lengthFromSides: s.solveSplit({ length: "10", before: "3", after: "4" }, ["after", "before"]),
|
|
beforeFromLength: s.solveSplit({ length: "10", before: "3", after: "4" }, ["after", "length"]),
|
|
defaultKeepsLength: s.solveSplit({ length: "10", before: "3", after: "" }, ["before"]),
|
|
blankKept: s.solveSplit({ length: "", before: "3", after: "4" }, ["before", "length"]),
|
|
clamp: s.solveSplit({ length: "2", before: "", after: "5" }, ["after", "length"]),
|
|
},
|
|
names: {
|
|
renamed: s.itemLabel(inlet, form, { "inlet.form": "모양" }),
|
|
title: s.containerTitle(inlet, {}, "그룹 이름"),
|
|
titleOwn: s.containerTitle(inlet, { inlet: "유입 보호" }, "그룹 이름"),
|
|
choice: s.choiceLabel(inlet, form, { value: "U", label: "ㄷ형" }, {}),
|
|
},
|
|
};
|
|
process.stdout.write(JSON.stringify(out));
|