# -*- coding: utf-8 -*- """토목 표 손 지정 — 칸 안에 줄이 여럿(
)이거나 줄마다 머리가 달라 자동으로 못 읽는 표. (build_소요량_건설품셈_토목.py 가 씀)""" import re from _md표_읽기 import N, R, join from _토목_읽기 import is_num, nz from _토목_표 import bigo_items, conds_out, crew, jn, matrix, members, rate, tpose SPECIAL = {"1": {}, "2": {}, "6": {}} def finish(rows, cols, bigo=(), label=None): names = [] for r in rows: for k in r: if k not in names and k not in cols: names.append(k) return conds_out(names, rows), cols, rows, list(bigo), label def sp(ch, key): def deco(fn): SPECIAL[ch][key] = fn return fn return deco def lines(x): return [p.strip() for p in x.split("
")] # ── 제1장 ────────────────────────────────────────────────────── sp("1", "1-8-9#4")(lambda t: (*tpose(t, "트럭", "작업"), None)) sp("1", "1-8-2#2")(lambda t: (*tpose(t, "형식", "크레인"), None)) sp("1", "1-8-14#2")(lambda t: (*rate(t), None)) @sp("1", "1-9-1#1") def _(t): R0, rows, cols = t.rows, [], {"시공량": "개소"} heads = R0[2][5:8] for lo, hi in ((3, 6), (6, 9)): blk = R0[lo:hi] c_, v = members(blk, 2, 1, 3) cols.update(c_) hts = lines(blk[0][4]) for j, hd in enumerate(heads): vs = lines(blk[0][5 + j]) for i, hv in enumerate(hts): if nz(vs[i]): rows.append({"지주높이": hv, "지주 간격": hd, "시공량": N(vs[i]), **v}) return finish(rows, cols) @sp("1", "1-9-1#2") def _(t): R0, rows, cols = t.rows, [], {"시공량": "개"} heads = [jn(x) for x in R0[2][5:9]] for lo, hi, hrows in ((3, 6, [3]), (6, 10, [6, 7, 8, 9])): c_, v = members(R0[lo:hi], 2, 1, 3) cols.update(c_) for r in hrows: for j, hd in enumerate(heads): if nz(R0[r][5 + j]): rows.append( { "지주높이": jn(R0[r][4]), "방음벽 개당 면적": hd, "시공량": N(R0[r][5 + j]), **v, } ) return finish(rows, cols) @sp("1", "1-9-2#0") def _(t): R0, rows, cols = t.rows, [], {"시공량": "m"} for lo, hi in ((2, 5), (5, 8)): blk = R0[lo:hi] c_, v = members(blk, 3, 2, 4, 1) cols.update(c_) sizes = lines(blk[0][5]) for j, kind in enumerate((R0[1][6], R0[1][7])): vs = lines(blk[0][6 + j]) for i, sz in enumerate(sizes): rows.append( { "형식": jn(blk[0][0]), "규격(아래폭+높이㎜)": sz, "구간": kind, "시공량": N(vs[i]), **v, } ) return finish(rows, cols) @sp("1", "1-9-4#2") def _(t): R0, rows, notes = t.rows, [], [] for row in R0[1:]: if join(row[0]) == "산출기준": notes = ["산출기준 " + x[len("비고 ") :] for x in bigo_items(row[1])] continue d = {"구분": jn(row[0]), "단위": row[1], "수량": N(row[2])} if nz(row[3]): d["비고"] = jn(row[3]) rows.append(d) return conds_out(["구분"], rows), {"수량": "단위 칸 따름", "비고": "글"}, rows, notes, None # ── 제6장 ────────────────────────────────────────────────────── @sp("6", "6-1-1#0") def _(t): rows = [] for row in t.rows[2:]: d = {"구분": jn(row[0]), "내용": jn(row[1])} for nm, c in (("요율 품", 2), ("요율 시공량", 3)): if nz(row[c]): d[nm] = R(row[c].rstrip("%")) rows.append(d) return ( conds_out(["구분"], rows), {"내용": "글", "요율 품": "%", "요율 시공량": "%"}, rows, [], None, ) def multi(t): """칸 안에 관경 · 시공량이 줄줄이 든 [구분 단위 수량 관경 시공량] 표.""" R0, rows, cols, bigo = t.rows, [], {}, [] unit = re.search(r"\((.*)\)", join(R0[0][4])).group(1) cols["시공량"] = unit blocks = [] for row in R0[1:]: if join(row[0]) == "비고": bigo += bigo_items(row[1]) elif nz(row[3]): blocks.append([row]) else: blocks[-1].append(row) for blk in blocks: c_, v = members(blk, 1, None, 2) cols.update(c_) ds, vs = lines(blk[0][3]), lines(blk[0][4]) assert len(ds) == len(vs), (t.ident, ds, vs) for d, x in zip(ds, vs): rows.append({"관경(㎜)": d, "시공량": N(x), **v}) return conds_out(["관경(㎜)"], rows), cols, rows, bigo, None for k in ( "6-2-1#0", "6-2-1#1", "6-2-2#0", "6-2-2#1", "6-3-1#0", "6-3-1#1", "6-4-1#0", "6-4-2#0", "6-5-1#0", "6-5-2#0", "6-5-3#0", "6-5-4#0", "6-6-1#0", "6-6-2#0", ): SPECIAL["6"][k] = multi sp("6", "6-2-2#2")(lambda t: (*rate(t), None)) sp("6", "6-5-4#1")(lambda t: (*rate(t), None)) sp("6", "6-8-5#2")(lambda t: (*rate(t), None)) sp("6", "6-8-4#2")(lambda t: (*matrix(t, "본관", "지관", "중량", "㎏", 2), None)) sp("6", "6-7-5#0")(lambda t: (*crew(t, prefix_group=True), None)) @sp("6", "6-3-2#0") def _(t): R0, rows, cols = t.rows, [], {"시공량": "개소", "용접공": "인"} heads = [ (jn(R0[0][4]), jn(R0[1][4]), jn(R0[2][4])), (None, jn(R0[1][4]), jn(R0[2][5])), (None, jn(R0[1][6]), jn(R0[2][6])), ] combos = [(4, "A종", "겹치기 용접"), (5, "A종", "베벨엔드용접"), (6, "B종", "겹치기 용접")] for r in R0[3:]: if nz(r[0]): qty = N(r[2]) for c, a, b in combos: if nz(r[c]): rows.append( { "관경(㎜)": jn(r[3]), "종별": a, "용접방법": b, "시공량": N(r[c]), "용접공": qty, } ) return conds_out(["관경(㎜)", "종별", "용접방법"], rows), cols, rows, [], None