From 843b62cca9b03bfb4f0844e2ee40c7c2a12258d0 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 8 Sep 2026 13:22:27 +0900 Subject: [PATCH] =?UTF-8?q?feat(B09):=20=EC=9B=90=EB=AC=B8=20=EB=8B=A8?= =?UTF-8?q?=EC=9C=84=20=EC=9D=BD=EA=B8=B0=20=EB=84=93=ED=9E=98=20=E2=80=94?= =?UTF-8?q?=20=EC=83=81=EC=9C=84=20=EC=A0=88=C2=B7=EC=88=98=20=EB=82=80=20?= =?UTF-8?q?=ED=91=9C=EA=B8=B0=EA=B9=8C=EC=A7=80,=20=EB=8C=80=EC=8B=A0=20?= =?UTF-8?q?=EC=9E=A5=20=EB=8B=A8=EC=9C=84=EB=8A=94=20=EB=A7=89=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 「A = 77.7 ㎡/시간」처럼 등호와 단위 사이에 수가 끼는 표기를 읽음 (9-17-1 비탈면 다짐이 그래서 통째로 미확보였음). - 상위 절이 스스로 안 적고 하위만 적는 경우를 채움 — 암절취 9-4 · 발파암 9-5 · 노체 9-16 · 덤프운반 10-12 가 전부 ㎥. - ⚠ 좁힘: 말한 하위가 둘 이상이고 값이 하나로 모일 때만. 하나만 말한 것을 상위에 주면 장 전체가 그 단위가 됨 — 「13. 돌공사」가 실제로 ton 으로 나왔음. - 단위 빈 일위대가 73 → 61. 시험 3건 추가, 252건 통과. Co-Authored-By: Claude Opus 5 (1M context) --- B09_Estimation/B09_Estimation_WorkItemUnit.py | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) 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