Files
Aislo/resources/master_data/scripts/_토목_계수.py
T

101 lines
4.3 KiB
Python

# -*- coding: utf-8 -*-
"""글 속 계산용 수 → 그룹 계수 표 (build_소요량_건설품셈_토목.py 가 씀).
표에 붙은 주(①…)와 비고 글에서 정규식으로 수를 읽음(손으로 적지 않음). 주 한 줄마다 계수 표 하나.
"""
import re
from _md표_읽기 import R
from _토목_표 import conds_out
PCT = r"([\d.]+)%"
def clean(line):
return re.sub(r"^(비고\s*-?\s*|-\s*|[①-⑳]\s*)", "", line).strip()
def rows_of(line):
"""주 한 줄 → 계수 줄들 [(구분, 값, 단위, 딸린 칸)]."""
s = clean(line)
out = []
m = re.search(r"^(.+?)(?:는|은) (인력품|주재료비|재료비)의 " + PCT, s)
if m:
out.append((m.group(1), R(m.group(3)), "%", {"기준": m.group(2)}))
m2 = re.search(r"(블록 정밀절단\(전동절단기\)에 의한 시공이 아닌 경우) " + PCT, s)
if m2:
out.append((f"{m.group(1)} — {m2.group(1)}", R(m2.group(2)), "%", {"기준": m.group(2)}))
return out
m = re.search(
r"(시공량|본 품|크레인\(시간\))(?:의|을) " + PCT + r"(?:를|까지| 범위 내에서) ?(감|가산)", s
)
if m:
out.append((s, R(m.group(2)), "%", {"기준": m.group(1), "가감": m.group(3)}))
m = re.search(r"(특별인부) (\d+)인을 감", s)
if m:
out.append((s, R(m.group(2)), "인", {"기준": m.group(1), "가감": "감"}))
m = re.search(r"절단품은 본 품의 " + PCT + r", 선단가공\(Beveling\) 품은 본 품의 " + PCT, s)
if m:
out.append(("금긋기 및 절단품", R(m.group(1)), "%", {"기준": "본 품"}))
out.append(("선단가공(Beveling) 품", R(m.group(2)), "%", {"기준": "본 품"}))
m = re.search(r"두께 ([\d.]+)㎝일 때 ([\d,]+)㎡당 살수량은 일반적으로 ([\d.]+)ton", s)
if m:
out.append(("살수량 기준 두께", R(m.group(1)), "㎝", {}))
out.append(("살수량 기준 면적", R(m.group(2)), "㎡", {}))
out.append(("살수량", R(m.group(3)), "ton", {}))
m = re.search(r"보통인부 (\d+)인기준 두께 (\d+)㎝시 ([\d,]+)㎡, 두께 (\d+)㎝시 ([\d,]+)㎡", s)
if m:
out.append(("모래 부설 일당시공량 기준 인원", R(m.group(1)), "인", {"기준": "보통인부"}))
out.append((f"모래 부설 일당시공량 두께 {m.group(2)}㎝", R(m.group(3)), "㎡", {}))
out.append((f"모래 부설 일당시공량 두께 {m.group(4)}㎝", R(m.group(5)), "㎡", {}))
m = re.search(r"굴착기\(규격 ([\d.]+)㎥, 사용시간 ([\d.]+)hr\)", s)
if m:
out.append(("크레인 대체 굴착기 규격", R(m.group(1)), "㎥", {}))
out.append(("크레인 대체 굴착기 사용시간", R(m.group(2)), "hr", {}))
m = re.search(r"호칭압력 ([\d.]+)(㎏/㎠)를 기준", s)
if m:
out.append(("호칭압력 기준", R(m.group(1)), m.group(2), {}))
m = re.search(r"강관장 ([\d.]+)m를 기준", s)
if m:
out.append(("강관장 기준", R(m.group(1)), "m", {}))
return out
def lift(chdir, text, out, rows_fn=rows_of):
src_tabs = list(out.tables)
for t in src_tabs:
ident = t["열쇠"].split()[0]
tags = {}
for line in t["주"]:
rs = rows_fn(line)
if not rs:
continue
mt = re.match(r"[①-⑳]", line)
tag = "비고" if line.startswith("비고") else "주" + (mt.group(0) if mt else "")
tags.setdefault(tag, []).extend(rs)
for tag, rs in tags.items():
cols, rows = {"값": "구분 따름", "단위": "글"}, []
for g, v, u, extra in rs:
rows.append({"구분": g, "값": v, "단위": u, **extra})
for k in extra:
cols.setdefault(k, "글")
label = f"{t['이름']} 계수 {tag}"
key = f"{ident} {label}"
if key in out.keys:
continue
out.keys.add(key)
out.tables.append(
{
"열쇠": key,
"이름": label,
"기준": "",
"출처": f"{t['출처']} {tag}",
"그룹": "계수",
"조건": conds_out(["구분"], rows),
"값칸": cols,
"줄": rows,
"주": [],
}
)