Files

57 lines
4.4 KiB
Python

#!/usr/bin/env python3
"""Render the station-by-station lining pattern report (DOC/03_설계) from the
CSVs written by extract_pattern_table.py. Values are read, not typed.
Usage: make_pattern_doc.py <dangjin.csv> <daesan_ref.csv> <lining_spec.json> <out.md>"""
import csv
import json
import sys
DJ, DS, LS, OUT = sys.argv[1:5]
dj = list(csv.DictReader(open(DJ, encoding="utf-8")))
ds = list(csv.DictReader(open(DS, encoding="utf-8")))
lin = json.load(open(LS, encoding="utf-8"))["sheets"]
drawing_groups = sorted({g["group"] for s in lin for g in s["pattern_details"] if g["group"]})
dj_names = {r["lining_pattern"] for r in dj}
ds_names = {r["lining_pattern"] for r in ds}
# Drawing group labels (read from the sheet notes, 04-004..009) -> member patterns.
# Explicit table: the labels mix letter ranges (A~C-2) and number ranges (WL-1~2).
DRAWING_MEMBERS = {"A~C-2": ["A", "B-1", "B-2", "C-1", "C-2"], "D-1~2": ["D-1", "D-2"],
"E-1~2": ["E-1", "E-2"], "WL-1~2": ["WL-1", "WL-2"], "WL-1~2,RP-1~2": ["WL-1", "WL-2", "RP-1", "RP-2"],
"WL-3~4": ["WL-3", "WL-4"], "P-2~3": ["P-2", "P-3"], "RP-1~2": ["RP-1", "RP-2"]}
members = set()
for g in drawing_groups:
members |= set(DRAWING_MEMBERS.get(g, [g]))
missing_dj = sorted(m for m in members if m not in dj_names)
only_ds = sorted(m for m in missing_dj if m in ds_names)
none_any = sorted(m for m in missing_dj if m not in ds_names)
L = ["# 측점별 콘크리트 라이닝 지보패턴표 (당진방향) (초안)\n",
"| 버전 | 일자 | 변경 내용 |", "|---|---|---|",
"| v0.1.00 | 2026-10-21 | 최초 작성. 엑셀 `참고_지보패턴현황` 당진방향 표를 측점별로 정리 (사용자 결정: 모델 placeholder 대체) |\n",
"## 1. 출처와 범위",
"- 원본: `RAG/03_터널명(대산2터널)/지보패턴현황_20260918.xlsx`, 시트 `참고_지보패턴현황`, 당진방향 표 (원본 행 55~96)",
f"- 행 {len(dj)}개, 측점 {dj[0]['sta_from']} ~ {dj[-1]['sta_to']}, 빈틈 없음 (각 행 끝 = 다음 행 시작)",
"- 모델 적용 범위 4+745 ~ 5+480 은 이 표로 전 구간 덮임 (735 m)",
"- 지보패턴(M열) = 라이닝 패턴, 실시설계(O열) = 굴착 등급. 실시설계 칸이 빈 행은 위 행의 값을 이어 받음 (병합 셀 해석, [추론])\n",
"## 2. 측점별 표",
"| 측점 from | 측점 to | 연장(m) | 지보패턴 | 실시설계 | 굴착공법 | 비고 |",
"|---|---|---|---|---|---|---|"]
def sta(x):
v = int(float(x)); return f"{v // 1000}+{v % 1000:03d}"
for r in dj:
exc = r["excavation"] + (" (이어받음)" if r["excavation_inherited"] == "True" and r["excavation"] else "")
L.append(f"| {sta(r['sta_from'])} | {sta(r['sta_to'])} | {float(r['length_m']):g} | {r['lining_pattern']} | {exc} | {r['method'].replace(chr(10), ' ')} | {r['remark']} |")
L += ["", "## 3. 도면과 표의 대응",
f"- 라이닝 도면(04-004~009)의 패턴 {len(members)}개 중 당진 표에 있는 것: {len(members) - len(missing_dj)}개",
f"- 당진 표에 없고 대산 표에만 있는 것: {', '.join(only_ds) if only_ds else '없음'} (대산 표 값 참고만, 적용 안 함 — 아래 4항)",
f"- 두 표 모두 없는 것: {', '.join(none_any) if none_any else '없음'} → 측점 지정 불가, [미확정]\n",
"## 4. 확인 필요 (HITL)",
"- [확인 필요] 대산방향 표의 WL-4 (4+758.85~4+768.85, NP-5) 를 당진 측점에 적용할지. 두 방향이 별도 튜브라는 점은 [추론]이며 확인되지 않았다. 당진 표는 같은 측점에 WL-2/WL-1 을 보여 준다.",
"- [확인 필요] 말씀하신 `NP-5BE-1-WL-4` 의 풀이 (NP-5B 의 E-1 ~ WL-4). 당진 NP-5 구간은 WL-2·WL-1 뿐이고, E-1 은 두 표 어디에도 없다.",
"- [확인 필요] 엑셀 `개요2`·`1` 시트: 굴착 등급은 NP-4/5/6 (A·B 접미사 포함), 괄호 안은 지보 하위 패턴이라는 표기. 이 해석은 엑셀 표기와 일치하는 것으로 보이나 도면 명칭 대응은 확정하지 않았다.\n",
"## 5. 적용 결과 (골격 모델)",
"- placeholder 2 m 구간은 폐기하고 이 표로 대체 (사용자 결정 2026-10-21)",
"- 뷰어의 라이닝 클릭 값: 측점, 지보패턴(본 표), 라이닝 사양 (C0060304-004~009)",
""]
open(OUT, "w", encoding="utf-8").write("\n".join(L))
print("written", OUT, "rows", len(dj), "drawing groups", len(members), "missing in dangjin", missing_dj)