From 02cabeccf208727f0d84962a91631853bb87a3cf Mon Sep 17 00:00:00 2001 From: umsangdon Date: Wed, 4 Nov 2026 22:13:41 +0900 Subject: [PATCH] =?UTF-8?q?feat(785-1):=20=EB=8B=A8=EA=B0=80=EC=82=B0?= =?UTF-8?q?=EC=B6=9C=20=EB=B8=94=EB=A1=9D=20=EA=B8=80=20=E2=86=92=20?= =?UTF-8?q?=EC=A0=88=20=EB=82=98=EB=AC=B4=20=C2=B7=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=C2=B7=20=EB=8C=80=EC=9E=85=EC=8B=9D=20=C2=B7=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=EA=B0=92=20=C2=B7=20=EC=A0=88=20=EB=AA=AB(=EC=83=88?= =?UTF-8?q?=20M02=5FHopyo=5FFormula)=20=C2=B7=20Book=20=EB=8B=A8=EC=82=B0?= =?UTF-8?q?=20=EB=B8=94=EB=A1=9D=20=EA=B8=80=ED=96=89=20=C2=B7=20=EC=A0=88?= =?UTF-8?q?=20=EC=B9=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 새 M02_Hopyo_Formula — tree · head · works · line_of · factors · find(순수 · M01 · 엔진 안 부름) - ReadEst 글행 남김 · 절 나무 칸 · Excel Book 단산 keep 에 글행 · 절 - 꼴 = PLAN 785 이음 줄(785-1) Co-Authored-By: Claude Opus 5.5 --- M02_MasterTemplete/M02_Hopyo_Excel.py | 2 +- M02_MasterTemplete/M02_Hopyo_Formula.py | 352 ++++++++++++++++++++++++ M02_MasterTemplete/M02_Hopyo_ReadEst.py | 11 +- 3 files changed, 360 insertions(+), 5 deletions(-) create mode 100644 M02_MasterTemplete/M02_Hopyo_Formula.py diff --git a/M02_MasterTemplete/M02_Hopyo_Excel.py b/M02_MasterTemplete/M02_Hopyo_Excel.py index 14f4e1cf1..c4e216361 100644 --- a/M02_MasterTemplete/M02_Hopyo_Excel.py +++ b/M02_MasterTemplete/M02_Hopyo_Excel.py @@ -366,7 +366,7 @@ def read_book(name: str, data: bytes) -> dict[str, Any]: {**_json(hopyo), "줄": [_json(line) for line in lines]} for hopyo, lines in zip(hopyos, raw, strict=True) ] - keep = ("번", "이름", "단위", "행", "출처", "직종", "글", "금액", "항목") + keep = ("번", "이름", "단위", "행", "출처", "직종", "글", "글행", "금액", "항목", "절") basis = [{k: b[k] for k in keep} for b in blocks.values()] book = { "꼴": "엑셀꼴", diff --git a/M02_MasterTemplete/M02_Hopyo_Formula.py b/M02_MasterTemplete/M02_Hopyo_Formula.py new file mode 100644 index 000000000..c077f4108 --- /dev/null +++ b/M02_MasterTemplete/M02_Hopyo_Formula.py @@ -0,0 +1,352 @@ +"""M02 일위대가 실무자료 단가산출 블록 글 → 절 나무 · 선택값 · 상수 · 대입식 · 몫(PLAN 785-1 · +요구 642 · 설계 642-A 2-2 ⓑ · 2-5 ④-2 · ④-3 B2~B4). + +글 먼저 · 찾기 없음 — 글에 적힌 것만 꼴로 옮김(값을 짓지 않음 · 못 읽은 것은 안 냄) · +M01 · 엔진 안 부름. + +절 나무 `tree(글, 글행, 항목)` → [절] — 절 = {번, 층, 제목, 갈래, 행 [시작, 끝], 글 [첫, 끝], + 상수, 식, 선택값, 몫, 소계, 항목, 아래}: + 층 1 「1.」 · 2 「가.」 · 3 「1)」 · 빠진 번호 그대로(단산6 1 → 3) · + 갈래 = 합계(합계 · 소계 · 총계) · 비목(재료비 · 인건비 · 노무비 · 경비 …) · 일(그 밖) · + 상수 = 「q = 0.6㎥ K = 0.55」 · 「L = 6m {경사도 = 35°(α=8)}」 · 「운반회수 : n = 42회/일」 → + {기호, 값, 단위, 덧?, 이름?, 행} · + 식 = 「기호 = 식 = … = 값」 → {기호, 글, 값, 단위, 꼴 곱|합|분수, 분자, 분모, 대입, 행} — + 곱 = 「×」 「÷」 「/」 만 · 괄호 뒤 「÷」 는 괄호 안 모두 분모 · + 대입 = 기호 식과 수 식의 인자 자리가 같을 때 {기호: 수} · + 합(「+」) · 분수(「──」 그림 줄)는 값만 · + 선택값 = 「※ …」 · 작업조건 줄 {글, 행} · + 몫 = 그 절 비목 줄(노무비 · 재료비 · 경비) 「단가 ÷ Q」 · 「단가 × Q」 뒤 곱수(모두 같을 때) · + 없으면 직종 줄 「단가 × 품」 뒤 % 곱수 → {글, 값, 행} · + 소계 = 합계 갈래 아래 절(없으면 그 절 「소계」 줄) 비목 값 {노무비, 재료비, 경비, 계} · + 항목 = 행이 그 절(아래 절 뺌) 안인 단위 줄 차례. +머리 `head(글, 글행)` = 첫 절 앞 줄 {행, 상수, 식, 선택값}. +일 절 `works(나무)` = 일 갈래 중 아래에 일 절이 없는 절 · 하나도 없으면 [](블록 통째 한 일). +""" + +from __future__ import annotations + +import re +from typing import Any + +NUM = r"[\d,]+(?:\.\d+)?" +_LEVELS = ( + (1, re.compile(r"^\s*(\d+)\s*\.\s*(.*)$")), + (2, re.compile(r"^\s*([가-하])\s*\.\s*(.*)$")), + (3, re.compile(r"^\s*(\d+)\)\s*(.*)$")), +) +_DECIMAL = re.compile(r"^\s*\d+\.\d") +_TOTAL = re.compile(r"(합\s*계|소\s*계|총\s*계)") +_COSTS = ("재료비", "인건비", "노무비", "경비", "기계경비", "자재비", "재료", "인건", "노무") +_SEG = re.compile( + r"(?:^\s*|(?<=\s\s)|(?<=[{(]))(?:(?P