- 정의 덧칸 얹기 — GET /m02/structure-definition 의 구조물군 이름 · 기준측점 · 동작 · 배치 · 규칙 · 그룹 형상을 종류에 얹음(못 받으면 옛 화면 그대로)
- 레지스트리 칸 — 배치(줄 · 칸 · 너비) 격자 · 차례 · 안 씀(enabled:false) · 규칙(선택지 · 보이기 · 기본값) 즉시 적용 · 규칙이 가린 칸은 저장 안 건드림
- 손코딩 시설 폼(동작 계곡통과시설) — 안 씀 · 선택지 · 규칙을 칸 표식으로 붙임 · 배치 · 이름은 손코딩 그대로
- 지난 정의 값 — 지금 정의에 없는 키 값을 읽기만 상자로
- 그룹 형상 칸 — 길이 · 높이 · 전 · 후 받기 켬끔 · 값은 옵션 {그룹 id}__{칸}
- 정의에서 뺀 선택지를 고른 옛 값은 그 값만 남겨 보임
- 시험 test_b05_structures_define 8 · 헬퍼 문맥 groupBoxes 로
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BVPp2o6Mh2FZJr72yW3ofZ
100 lines
3.6 KiB
JavaScript
100 lines
3.6 KiB
JavaScript
/* 구조물 정의 → 칸 모양 단위검증 헬퍼(PLAN 48-3 · 48-4) — `B05_Profile_UI_Structures_Define.ts` 를
|
|
* 그 자리에서 트랜스파일해 Node 로 돌림(import 없는 파일). 결과는 표준출력에 JSON 한 벌.
|
|
* 판 1 정의(`resources/master_template/구조물정의.json`)도 읽어 지금 화면과 같은지(차례 · 2열) 봄.
|
|
*/
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript"));
|
|
|
|
const ROOT = path.join(__dirname, "..", "..");
|
|
const src = fs.readFileSync(
|
|
path.join(ROOT, "B05_Profile", "B05_Profile_UI_Structures_Define.ts"),
|
|
"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, require);
|
|
const d = box.exports;
|
|
|
|
const opt = (key, extra = {}) => ({
|
|
key,
|
|
label: key,
|
|
input: "select",
|
|
choices: ["a", "b", "c"],
|
|
default: null,
|
|
...extra,
|
|
});
|
|
const type = {
|
|
options: [
|
|
opt("p"),
|
|
opt("q"),
|
|
opt("r", { enabled: false }),
|
|
opt("s", { visible: false }),
|
|
opt("t"),
|
|
],
|
|
spots: { t: { 줄: 1, 칸: 1, 너비: 2 }, p: { 줄: 2, 칸: 2 } },
|
|
rules: [
|
|
{
|
|
종류: "x",
|
|
만약: { 옵션: "p", 값들: ["a"] },
|
|
그러면: { 옵션: "q", 선택지: ["b", "c"], 기본값: "c" },
|
|
},
|
|
{ 종류: "x", 만약: { 옵션: "p", 값들: ["b"] }, 그러면: { 옵션: "q", 보이기: false } },
|
|
{ 종류: "x", 만약: { 옵션: "q", 값들: ["c"] }, 그러면: { 옵션: "t", 보이기: false } },
|
|
],
|
|
};
|
|
const plain = (states) => Object.fromEntries([...states].map(([k, v]) => [k, v]));
|
|
|
|
const def = JSON.parse(
|
|
fs.readFileSync(path.join(ROOT, "resources", "master_template", "구조물정의.json"), "utf8"),
|
|
);
|
|
const merged = d.withDefinition(
|
|
def.types.map((t) => ({ ...t, groups: (def.그룹[t.type_id] ?? []).map((g) => ({ id: g.id })) })),
|
|
def,
|
|
);
|
|
const v1 = merged.map((t) => ({
|
|
id: t.type_id,
|
|
same:
|
|
JSON.stringify(d.orderedOptions(t).map((o) => o.key)) ===
|
|
JSON.stringify(t.options.filter((o) => o.enabled !== false).map((o) => o.key)),
|
|
columns: d.columnsOf(t),
|
|
anchor: d.showsAnchor(t),
|
|
}));
|
|
|
|
const out = {
|
|
order: d.orderedOptions(type).map((o) => o.key),
|
|
columns: d.columnsOf(type),
|
|
columnsNone: d.columnsOf({}),
|
|
placeT: d.gridPlace(type.spots.t, 2),
|
|
placeNone: d.gridPlace(undefined, 2),
|
|
stateA: plain(d.ruleStates(type, { p: "a", q: "c" })),
|
|
stateB: plain(d.ruleStates(type, { p: "b", q: "c" })),
|
|
defaultsA: d.ruleDefaults(type, "p", { p: "a" }),
|
|
defaultsB: d.ruleDefaults(type, "p", { p: "b" }),
|
|
stale: d.staleValues({ p: "a", old_key: 3, g1__length_m: 2 }, ["p", "g1__length_m"]),
|
|
shapes: d.shapeFields({
|
|
길이: { 받기: true, 뜻: "연장" },
|
|
높이: { 받기: false },
|
|
후: { 받기: true },
|
|
}),
|
|
shapeKey: d.shapeKey("g1", "length_m"),
|
|
withNull: d.withDefinition([{ type_id: "a", group: "A" }], null),
|
|
withDef: d.withDefinition([{ type_id: "a", group: "A", groups: [{ id: "g1" }] }], {
|
|
구조물군: { A: "가 군" },
|
|
종류: { a: { 기준측점: false, 동작: ["계곡통과시설"] } },
|
|
그룹: { a: [{ id: "g1", 형상: { 길이: { 받기: true } } }] },
|
|
배치: { a: { k: { 줄: 1, 칸: 1 } } },
|
|
규칙: [
|
|
{ ...type.rules[0], 종류: "a" },
|
|
{ ...type.rules[1], 종류: "b" },
|
|
],
|
|
}),
|
|
v1Types: v1.length,
|
|
v1Same: v1.every((t) => t.same),
|
|
v1Columns: [...new Set(v1.map((t) => t.columns))],
|
|
v1Anchor: v1.every((t) => t.anchor),
|
|
};
|
|
process.stdout.write(JSON.stringify(out));
|