- 공용 틀(A00_Common/design/design_structure_*) — 명세(컨테이너 필수/선택 · 여러 개 · 항목 고르기/숫자/자동 · 상위 값에 따른 선택지 · 저장 키) · 그리기([추가]/[빼기]) · 길이 = 전 + 후 맞물림(마지막에 고친 둘을 지킴) - 배관 명세 = 관 · 관 보호공(유입) · 관 보호공(유출) · 흙막이 추가 · 도수로/돌붙임 · 저장 키는 pipe_points 옛 키 그대로 · 옛 관종 · 날개벽 · 집수정 형식은 화면에서 빼고 지난 정의 값으로 남김 - 컨테이너 인스턴스마다 「구조물 조합」 잇기(group_items · 그룹 [고르기] 길 그대로) · 명세 종류는 그룹 상자 · 종류 단위 줄 가림 · 종류 단위 잇기 줄은 기준 측점 바로 아래 - 관 길이 자동 = 횡단 기하 computeStoredLayouts 값(서버 Node 와 같은 함수) · 높이 빈 칸 안내 = 관경 기준 최소 높이 - 정의 판 6 — 종류.pipe.이름 표(이름 바꿈 키) · 검사기가 이름 표 받음 · 판 5 이력 보관 - 시험 test_52_structure_spec_pipe · 병합 시험 기대값(빠진 옛 칸은 남음) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BVPp2o6Mh2FZJr72yW3ofZ
88 lines
3.5 KiB
JavaScript
88 lines
3.5 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: {} };
|
|
new Function("exports", "module", "require", js)(box.exports, box, (m) => deps[m] ?? require(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));
|