Merge remote-tracking branch 'origin/sub_laptop_1' into main_laptop_1

This commit is contained in:
2026-11-04 20:41:37 +09:00
9 changed files with 311 additions and 18 deletions
+13 -2
View File
@@ -2,12 +2,14 @@
"""견본 입력 — 마스터 화면 보기용 자동값(프로젝트 기본값 아님 · 저장 안 함).
고르기 = 목록 첫째 · 범위 = 최솟값 · 찾기 조건 값으로 쓰이는 수 = 그 표 그 칸 가장 낮은 줄 값
(범위 줄이면 그 줄에 드는 아래 끝) · 나누는 자리에 오는 수 = 1 · 그 밖 0.
(범위 줄이면 그 줄에 드는 아래 끝) · 나누는 자리에 오는 수 = 1 · 그 밖 0
(「만약(X > 0, X, 기본)」 의 X 는 나누는 자리여도 0 = 기본).
찾기·나누기 쓰임은 로직 식(중간 · 결과 · 호표 수량·요소 · 덧줄)을 풀어 알아냄.
"""
from __future__ import annotations
import re
from decimal import Decimal
import master_formula as mf
@@ -46,12 +48,21 @@ def _uses(row: dict) -> tuple[dict, set]:
for cond, arg in part[2]:
if arg[0] == "name":
finds.setdefault(arg[1], []).append((part[1], cond))
guard = guards(row) # 「0 = 기본」 칸은 나누는 자리로 안 퍼뜨림(자동값 0 = 기본)
for step in reversed(row.get("중간", [])):
if step["이름"] in divs:
divs |= _names(mf.parse(step["식"]))
divs |= _names(mf.parse(step["식"])) - guard
return finds, divs
_GUARD = re.compile(r"만약\(\s*(\w+)\s*>\s*0\s*,\s*\1\s*,")
def guards(row: dict) -> set:
"""「만약(X > 0, X, 기본)」 꼴 중간 식의 X — 0 이면 원문 기본(25㎏ · 450분 · 식 · 표)."""
return {m for s in row.get("중간", []) for m in _GUARD.findall(s["식"])}
def _fits(master: mf.Master, ref: str, cond: str) -> list:
"""표 `ref` 조건 칸 `cond` 에 드는 수 — 낮은 차례 · 범위 칸이면 줄마다 그 줄에 드는 끝
(아래 끝이 열린 줄 「60 미만」 은 0)."""