diff --git a/B09_Estimation/B09_Estimation_WorkItemUnit.py b/B09_Estimation/B09_Estimation_WorkItemUnit.py index cdb8ecfb..d3f3bdf5 100644 --- a/B09_Estimation/B09_Estimation_WorkItemUnit.py +++ b/B09_Estimation/B09_Estimation_WorkItemUnit.py @@ -62,7 +62,9 @@ _RE_HEADING = re.compile(r"^#{2,4}\s*(\d+(?:-\d+)*)\s*\.\s*(.*)$") #: 「(단위: ㎡당)」·「(단위 : 100㎡당)」. 앞에 붙은 수는 밑수라 여기서는 버린다. _RE_UNIT_LINE = re.compile(r"^\(\s*단위\s*[::]\s*(.+?)\s*\)\s*$") #: 공식이 스스로 밝히는 결과 단위 — 「= ㎥/시간」·「㎥/hr」. -_RE_FORMULA_UNIT = re.compile(r"=\s*([㎡㎥m]+)\s*/\s*(?:시간|hr|h)\b") +#: ⚠ 등호와 단위 사이에 **수가 끼는 표기**가 있다 — 「A = 77.7 ㎡/시간」(9-17-1 비탈면 다짐). +#: 그 수를 건너뛰지 않으면 그 절이 통째로 안 읽힌다. +_RE_FORMULA_UNIT = re.compile(r"=\s*(?:[\d.,]+\s*)?([㎡㎥m]+)\s*/\s*(?:시간|hr|h)\b") def _project_root() -> str: @@ -135,5 +137,23 @@ def unit_of(work_item_code: str) -> str | None: # ⚠ 두 단계 위까지는 안 올라간다. 장(13) 전체는 공종이 섞여 단위가 하나가 아니다. if section in units: return units[section] + + # ⚠ **상위 절은 스스로 단위를 안 적고 하위 절만 적는 경우가 많다** — 「9-5. 발파암」은 + # 빈 제목이고 9-5-1·9-5-2·9-5-3 이 각각 ㎥ 를 밝힌다(암절취 9-4·노체 9-16·덤프운반 + # 10-12 도 같다). **하위가 모두 같은 단위일 때만** 그 단위를 상위에 준다 — + # 갈리면 안 준다(한 단위로 뭉뚱그리면 어느 하위가 틀렸는지 못 가린다). + # + # ⚠ **둘 이상이 말할 때만 듣는다.** 하나만 말한 것을 상위에 주면 장(章) 전체가 + # 그 하나의 단위가 된다 — 실제로 「13. 돌공사」가 하위 한 절 때문에 **ton** 으로 + # 나왔다(2026-09-08). 그래서 ㉠ 절 번호에 하이픈이 있고(장 자체가 아니고) + # ㉡ **말한 하위가 둘 이상**이며 ㉢ 그 값이 하나로 모일 때만 준다. + declared = [ + value + for key, value in units.items() + if key.startswith(f"{section}-") and key.count("-") == section.count("-") + 1 + ] + if "-" in section and len(declared) >= 2 and len(set(declared)) == 1: + return declared[0] + parent = section.rsplit("-", 1)[0] return units.get(parent) if parent != section and "-" in section else None