fix(m01): 이름 식 별칭 = 짧은 표 제목 + 찾은 줄 값 · 긴 품명은 앞 핵심만 (PLAN 5장 5바퀴)

- 표 키(QC…) 대신 표 제목을 짧게 — 규격·코드 뗌 · 길면 첫 + 끝 낱말 · 제목 없으면 공종 · 상세구분
- 같은 표 여러 번은 번호 대신 서로 가르는 인자 값만(낙석방지망설치재료_철망 · 합판거푸집_각재)
- 호표 줄 이름도 짧은 품명 · 한 로직 안에서 겹치면 꼬리 _2
- 자동값 7,008줄: 표 키 1,188→0 · 번호 별칭 982→4 · 붙인 20자 넘는 이름 108→0 · 금액 변화 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V1MKKZKpUHTPKb513FneU8
This commit is contained in:
2026-09-24 12:04:39 +09:00
co-authored by Claude Opus 5.5
parent 68daa24259
commit f808b67285
4 changed files with 230 additions and 32 deletions
+25 -12
View File
@@ -118,7 +118,7 @@ def _elem_name(master, ref: str) -> str:
): # 별칭 이름이 표 열쇠 그대로인 것(QC…) — 밑이름을 풀어쓰지 않음
return ref
try:
name = mc.plain(master.get(ref).get("이름"))
name = mc.short(master.get(ref).get("이름"))
except mf.FormulaError:
name = ""
return f"{name}{ELEM_TAIL.get(str(ref)[:2], '단가')}" if name else ref
@@ -389,12 +389,24 @@ def _line_text(item: dict, line: dict, env: dict, master, part: str | None) -> s
return f"{fmt_price(price)} * {qty} = {fmt_money(money)}"
def _line_names(item: dict, line: dict, env: dict, master, part: str | None, name_of: dict) -> str:
def _item_names(items: list) -> list[tuple[str, str]]:
"""호표 줄마다 (짧은 품명(규격·코드 뗌), 겹침 꼬리) — 한 로직 안에서 겹치면 꼬리 `_2`."""
taken: set[str] = set()
out = []
for item in items:
name = mc.short(item.get("이름")) or "값"
out.append((name, mc._free(name, taken)[len(name) :]))
return out
def _line_names(
item: dict, env: dict, master, part: str | None, name_of: dict, label: tuple[str, str]
) -> str:
"""같은 줄을 변수 이름으로 — 「석공노임 * 메쌓기인력.석공 * (1 + 증가율) = 석공비」."""
name = mc.plain(item.get("이름") or line.get("이름")) or "값"
name, dup = label
tail = PRICE_TAIL.get(str(item.get("종류") or ""), "단가")
price = f"{name}{part or ''}{tail}"
money = f"{name}{part}" if part else f"{name}비"
price = f"{name}{part or ''}{tail}{dup}"
money = f"{name}{part}{dup}" if part else f"{name}비{dup}"
qty = _times(_names(item["수량"], env, master, name_of), item, env, master)
return f"{price} * {qty} = {money}"
@@ -406,7 +418,7 @@ def _extra_text(extra: dict, line: dict, env: dict, master) -> str:
def _extra_names(extra: dict, env: dict, master, name_of: dict) -> str:
got = mc.plain(extra.get("이름")) or "덧줄"
got = mc.short(extra.get("이름")) or "덧줄"
return f"{_names(extra['식'], env, master, name_of)} = {got}"
@@ -437,7 +449,7 @@ def lines(files: dict, key: str, given: dict) -> dict:
if "결과" in row:
조각 = _formula_pieces(row["결과"]["식"], env, master, name_of, alias_by_name)
got = mc.plain(row.get("이름")) or "결과"
got = mc.short(row.get("이름")) or "결과"
shown = (
fmt_money if str(row.get("결과단위") or "").startswith("원") else fmt
) # 돈 결과만 정수
@@ -472,10 +484,11 @@ def lines(files: dict, key: str, given: dict) -> dict:
made: dict[str, list] = {name: [] for name in mf.COST_ITEMS}
items = row.get("호표") or []
labels = _item_names(items)
if result is not None:
shown = result["줄"]
env["줄"] = {r["이름"]: r["금액"] for r in shown if r["이름"]}
for item, line in zip(items, shown):
for item, line, label in zip(items, shown, labels):
조각 = _formula_pieces(item["수량"], env, master, name_of, alias_by_name)
요소 = _item_pieces(item, env, master)
for part, money in _shares(line):
@@ -483,7 +496,7 @@ def lines(files: dict, key: str, given: dict) -> dict:
one = {
"이름": _label(item, line),
"글": _line_text(item, line, env, master, split),
"이름글": _line_names(item, line, env, master, split, name_of),
"이름글": _line_names(item, env, master, split, name_of, label),
"금액": money,
"조각": 조각,
"요소조각": 요소,
@@ -495,7 +508,7 @@ def lines(files: dict, key: str, given: dict) -> dict:
끝수 = _cut_note(row)
계 = result["계"]
else:
for item in items:
for item, label in zip(items, labels):
parts = (
list(mf.COST_ITEMS)
if item.get("종류") == "로직" and "비목" not in item
@@ -511,7 +524,7 @@ def lines(files: dict, key: str, given: dict) -> dict:
{
"이름": _label(item, {}),
"글": "",
"이름글": _line_names(item, {}, env, master, split, name_of),
"이름글": _line_names(item, env, master, split, name_of, label),
"금액": None,
"조각": 조각,
"요소조각": 요소,
@@ -524,7 +537,7 @@ def lines(files: dict, key: str, given: dict) -> dict:
"글": "",
"이름글": (
f"{_names(extra['식'], env, master, name_of)} = "
f"{mc.plain(extra.get('이름')) or '덧줄'}"
f"{mc.short(extra.get('이름')) or '덧줄'}"
),
"금액": None,
"조각": _formula_pieces(extra["식"], env, master, name_of, alias_by_name),