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:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user