diff --git a/resources/master_data/scripts/_설비_계수.py b/resources/master_data/scripts/_설비_계수.py new file mode 100644 index 00000000..f1e8b16f --- /dev/null +++ b/resources/master_data/scripts/_설비_계수.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +"""기계설비 글 속 계산용 수 → 계수 표 줄 (토목 규칙 + 기계설비 규칙).""" + +import re + +from _md표_읽기 import R +from _토목_계수 import clean +from _토목_계수 import rows_of as base_rows + +PCT = r"([\d.]+)%" + + +def rows_of(line): + """주 한 줄 → 계수 줄들 [(구분, 값, 단위, 딸린 칸)].""" + s = clean(line) + out = base_rows(re.sub(r"(인력품|주재료비|재료비)의\([^)]*\) ", r"\1의 ", line)) + if out: + return out + m = re.search(r"^(.+?)(?:은|는) 본 품에 " + PCT + r"를 (가산|감)", s) + if m: + return [(m.group(1), R(m.group(2)), "%", {"기준": "본 품", "가감": m.group(3)})] + m = re.search( + r"(\d+)본 감할 때마다 " + PCT + r"씩 감하고, (\d+)본 증할 때마다 " + PCT + r"씩 가산", s + ) + if m: + return [ + ( + f"튜브 {m.group(1)}본 감할 때마다", + R(m.group(2)), + "%", + {"기준": "본 품", "가감": "감"}, + ), + ( + f"튜브 {m.group(3)}본 증할 때마다", + R(m.group(4)), + "%", + {"기준": "본 품", "가감": "가산"}, + ), + ] + m = re.search(r"^(.+? 3절 초과하는 경우 매 1절 증가마다) " + PCT + r"씩 가산", s) + if m: + return [(m.group(1), R(m.group(2)), "%", {"기준": "본 품", "가감": "가산"})] + m = re.search(r"^(.+?(?:증가마다)) " + PCT + r"씩 가산", s) + if m: + return [(m.group(1), R(m.group(2)), "%", {"기준": "본 품", "가감": "가산"})] + m = re.search(r"^(.+?구조일 경우) " + PCT + r" 가산", s) + if m: + return [(m.group(1), R(m.group(2)), "%", {"기준": "본 품", "가감": "가산"})] + m = re.search( + r"(높이 6∼9m까지는) 품을 " + + PCT + + r" 가산하고 (높이 9m를 초과하는 경우 매 3m 증가마다) 품을 " + + PCT, + s, + ) + if m: + return [ + (f"비계 사용 {m.group(1)}", R(m.group(2)), "%", {"기준": "본 품", "가감": "가산"}), + (f"비계 사용 {m.group(3)}", R(m.group(4)), "%", {"기준": "본 품", "가감": "가산"}), + ] + m = re.search(r"단독주택 (\d+)호당 1조 및 집단아파트 (\d+)호당 1조", s) + if m: + return [ + ("단독주택 1조당 호수", R(m.group(1)), "호", {}), + ("집단아파트 1조당 호수", R(m.group(2)), "호", {}), + ] + return [] diff --git a/resources/master_data/scripts/_설비_손.py b/resources/master_data/scripts/_설비_손.py new file mode 100644 index 00000000..065dac09 --- /dev/null +++ b/resources/master_data/scripts/_설비_손.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +"""기계설비 표별 지정 — 「항#순번」: convert 옵션(H 머리 줄 수 · L 라벨 칸 수 · M 직종 칸 · -1 = 직종 칸 없음).""" + +SPEC = { + "9-5-1#0": {"L": 3}, +} diff --git a/resources/master_data/scripts/_설비_읽기.py b/resources/master_data/scripts/_설비_읽기.py new file mode 100644 index 00000000..72a317c0 --- /dev/null +++ b/resources/master_data/scripts/_설비_읽기.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +"""건설품셈 기계설비 제7~13장 md 읽기 (build_소요량_건설품셈_기계설비.py 가 씀). + +항(###) · 목(####) · 표 · 표 머리 깊이(주석) · 표 앞 글 · [주] [비고] [계산예] 글을 읽음. +""" + +import re + +from _md표_읽기 import unesc +from _토목_읽기 import ROOT + +BASE = ROOT / "resources/knowledge/original/원가계산/건설공사_표준품셈/본문/04_기계설비부문" +DIV = "건설품셈 기계설비 " +NOTE0 = re.compile(r"^[①-⑳]") +BLOCK = re.compile(r"^\[(주|비고|계산예|참고|참고자료|별표)\]\s*(.*)$") + + +class Tab: + def __init__(self, ident, title, mok, base, rows, k, hdr, pre): + self.ident, self.title, self.mok, self.base = ident, title, mok, base + self.rows, self.k, self.hdr, self.pre = rows, k, hdr, pre + self.notes: list[str] = [] + + +def cells(line): + return [c.strip() for c in line.strip().strip("|").split("|")] + + +def title_of(s): + return re.sub(r"\s*\((?:['‘’]\d\d[^)]*)\)\s*$", "", s).strip() + + +def clean(ln): + ln = re.sub(r"", "", ln).rstrip() + return re.sub(r"^>\s?", "", ln) + + +def read_chapter(chdir): + """장 폴더 → 표 목록 (표마다 항 · 목 · 기준 · 머리 깊이 · 앞 글 · 주).""" + tabs = [] + for p in sorted(next(BASE.glob(chdir + "*")).glob("*.md")): + L = p.read_text(encoding="utf-8").split("\n") + L = L[[i for i, x in enumerate(L) if x.strip() == "---"][1] + 1 :] + ident = title = mok = base = "" + pre: list[str] = [] + k, mode, i = 0, "", 0 + while i < len(L): + raw = L[i] + ln = clean(raw) + m = re.match(r"^(#{2,4})\s+(.*)$", ln) + if m: + mode, base, pre = "", "", [] + d = len(m.group(1)) + if d == 2: + mm = re.match(r"^(\d+-\d+)\s+(.*)$", m.group(2)) + ident, title, mok, k = mm.group(1), title_of(mm.group(2)), "", 0 + elif d == 3: + mm = re.match(r"^(\d+-\d+-\d+)\s+(.*)$", m.group(2)) + ident, title, mok, k = mm.group(1), title_of(mm.group(2)), "", 0 + elif d == 4: + mk = re.match(r"^(?:\d+|[가-힣])\.\s*(.*)$", m.group(2)) + mok = title_of(mk.group(1) if mk else m.group(2)) + i += 1 + continue + if not ident: + i += 1 + continue + if ln.startswith("|"): + j, rows = i, [] + while j < len(L) and L[j].startswith("|"): + c = cells(L[j]) + if not all(re.fullmatch(r":?-+:?", x) for x in c): + rows.append(c) + j += 1 + hint = "" + while j < len(L) and (L[j].startswith("