From f468ff738489f080e00f1a3e08ea67f797527bd7 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 15 Nov 2026 14:21:48 +0900 Subject: [PATCH] =?UTF-8?q?feat(839-1):=20=EA=B8=B0=EA=B3=84=20=EC=A0=9C?= =?UTF-8?q?=EC=96=B4=20=EA=B5=AC=EC=97=AD=20=EA=B0=92=20=EC=B9=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=ED=91=9C=EB=8F=84=20=EC=A7=A7=EC=9D=80=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=C2=B7=20=E3=80=8CP=5FEQ=EA=B8=B0=EA=B3=84?= =?UTF-8?q?=E3=80=8D=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=EA=BC=B4=20=EC=B0=A8=EB=A1=80=EB=A1=9C(=EC=A7=81=EC=A0=91=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=ED=95=B4=EB=8F=84=20=EC=95=88=20=EB=B3=80?= =?UTF-8?q?=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - machineCellName(칸) — 기계 제어 구역(836-1) 값 칸 이름표(상각비계수 → 상각 …) · 툴팁 = 원래 칸 이름 - 「P_EQ기계…」 이름 = 그 기호 개수(3 · 5 · 6)로 문서 꼴을 앎 — 칸 연결이 숫자로 바뀌어도 같은 이름 - test_839_1 에 차례 이름 = 읽는 칸 · 직접 입력 뒤 같음 추가 Co-Authored-By: Claude Sonnet 5.5 --- A00_Common/line_stack_machine_ctl.ts | 7 ++++- .../common_util_machine_symbol_name.ts | 22 +++++++++++--- .../tester/test_839_1_machine_symbol_name.py | 30 +++++++++++++++++++ 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/A00_Common/line_stack_machine_ctl.ts b/A00_Common/line_stack_machine_ctl.ts index 7ecbcb1d4..934482289 100644 --- a/A00_Common/line_stack_machine_ctl.ts +++ b/A00_Common/line_stack_machine_ctl.ts @@ -27,6 +27,7 @@ import { } from "../common_util/common_util_formula_doc_cover"; import { subInputs, type StackDoc } from "../common_util/common_util_line_stack"; import type { Picked } from "../common_util/common_util_line_stack_pick"; +import { machineCellName } from "../common_util/common_util_machine_symbol_name"; import { openFindPicker } from "../M02_MasterTemplete/M02_MasterTemplete_Find_Pick"; import { openStackPick } from "./line_stack_pick"; import { lt } from "./line_stack_text"; @@ -146,7 +147,11 @@ export function buildMachineCtl(h: CtlHooks, link: Link | undefined): HTMLElemen : numBox(col, now, UNIT[col] ?? "", ro, setVal); const row = el("div", { className: "lstk-frow", - children: [el("b", { className: "lstk-sym", text: col }), "=", box], + children: [ + el("b", { className: "lstk-sym", text: machineCellName(col), attrs: { title: col } }), + "=", + box, + ], }); if (mine !== undefined) { const tag = createBadge(lt("Ctl_Changed"), "info", { size: 18 }); diff --git a/common_util/common_util_machine_symbol_name.ts b/common_util/common_util_machine_symbol_name.ts index 1ec407f25..84f99d476 100644 --- a/common_util/common_util_machine_symbol_name.ts +++ b/common_util/common_util_machine_symbol_name.ts @@ -7,7 +7,7 @@ * 화면 없음(시험이 Node 로 돌림) · 기계 제어 구역(836-1)도 `machineAlias` 로 같은 이름 * ========================================================================== */ -import { varId, type FormulaDoc } from "./common_util_formula_doc"; +import type { FormulaDoc } from "./common_util_formula_doc"; import { symbols } from "./common_util_line_stack"; /** 기호 → 이름(품셈 말 줄임 — 가격 · 상각 · 정비 · 관리 · 손료 · 가산 · 잡품) */ @@ -72,9 +72,13 @@ const NAME: Record = { w_화물차운전사: "운전사", }; -/** 「P_EQ기계…」(기계 한 줄 칸 읽기) = 읽는 칸 이름으로 */ +/** 기계 한 줄 칸 이름 → 화면 이름(기계 제어 구역 값 칸 이름표) */ const CELL: Record = { 가격: "가격", + 상각비계수: "상각", + 정비비계수: "정비", + 관리비계수: "관리", + 주연료종류: "연료", 손료계수: "계수", 주연료: "주연료", 전력: "전력", @@ -85,13 +89,20 @@ const CELL: Record = { 경비: "시간경비", }; +/** 「P_EQ기계…」 차례 이름 — 그 기호 개수로 문서 꼴을 앎(셋 = 시간당 값 · 다섯 = 연료 · 전력 · 여섯 = 조종원도) · 칸 연결이 직접 입력으로 바뀌어도 같음 */ +const SLOTS: Record = { + 3: ["시간노무", "시간재료", "시간경비"], + 5: ["가격", "계수", "주연료", "전력", "잡품"], + 6: ["가격", "계수", "주연료", "전력", "조종원", "잡품"], +}; + /** 기계경비식 문서의 기호 → 화면 이름(이름 없는 · 겹치는 기호는 빠짐) */ export function machineAlias(doc: FormulaDoc): Record { if (doc.부품?.갈래 !== "기계경비식") return {}; const ids = symbols(doc); - const cell = new Map((doc.변수 ?? []).map((v) => [varId(v), String(v.연결?.칸 ?? "")])); + const slot = SLOTS[ids.filter((x) => x.startsWith("P_EQ기계")).length] ?? []; const want = (id: string): string | undefined => - NAME[id] ?? (id.startsWith("P_EQ기계") ? CELL[cell.get(id) ?? ""] : undefined); + NAME[id] ?? (id.startsWith("P_EQ기계") ? slot[Number(id.slice(6) || 1) - 1] : undefined); const count = new Map(); const plain = new Set(ids); for (const id of ids) { @@ -106,3 +117,6 @@ export function machineAlias(doc: FormulaDoc): Record { } return out; } + +/** 기계 칸 이름(상각비계수 …) → 짧은 이름 · 없으면 그대로 — 기계 제어 구역(836-1) 값 칸 이름표 */ +export const machineCellName = (col: string): string => CELL[col] ?? col; diff --git a/resources/tester/test_839_1_machine_symbol_name.py b/resources/tester/test_839_1_machine_symbol_name.py index d1bd81031..409922eaa 100644 --- a/resources/tester/test_839_1_machine_symbol_name.py +++ b/resources/tester/test_839_1_machine_symbol_name.py @@ -99,3 +99,33 @@ def test_손으로_바꾼_기호는_그대로(): v["아래"] = "차량" # 사용자가 손으로 고친 기호 = P_차량 alias = _ts("별칭", [{"문서": doc}])[0]["별칭"] assert "P_차량" not in alias # 그림 사전 안 탐 = 그 글 그대로 + + +def test_칸_읽는_기호_차례_이름_칸과_같음(): + """「P_EQ기계…」 이름 = 문서 모양 차례 — 읽는 칸(연결 칸)과 같고, 직접 입력으로 바뀌어도 안 변함.""" + want = { + "가격": "가격", + "손료계수": "계수", + "주연료": "주연료", + "전력": "전력", + "조종원": "조종원", + "잡재료율": "잡품", + "노무비": "시간노무", + "재료비": "시간재료", + "경비": "시간경비", + } + docs = _machines() + for k in ("GC001199", "GC001200", "GC001201"): + doc = copy.deepcopy(docs[k]) + eq = { + f"P_{v['아래']}": want[v["연결"]["칸"]] + for v in doc["변수"] + if v["기호"] == "P" and v["아래"].startswith("EQ기계") + } + got = _ts("별칭", [{"문서": doc}])[0]["별칭"] + assert {i: got[i] for i in eq} == eq, k + for v in doc["변수"]: + if v["아래"].startswith("EQ기계"): + v["연결"] = {"갈래": "숫자", "값": 7} # 직접 입력 = 칸 연결 없음 + typed = _ts("별칭", [{"문서": doc}])[0]["별칭"] + assert {i: typed[i] for i in eq} == eq, k