#!/usr/bin/env python3 """Generate the main-line drawing inventory report (DOC/02_분석) from the inventory JSON so that every number in the report comes from the extraction.""" import collections import json import sys SRC_JSON, OUT_MD = sys.argv[1], sys.argv[2] rows = json.load(open(SRC_JSON, encoding="utf-8")) ok = [r for r in rows if r["ok"]] err = [r for r in rows if not r["ok"]] units = collections.Counter(str(r.get("insunits")) for r in ok) n3d = sum(1 for r in ok if r["has_3d_geometry"]) total_ents = sum(sum(r["entity_counts"].values()) for r in ok) def top_types(r, k=3): return ", ".join(f"{t} {n}" for t, n in list(r["entity_counts"].items())[:k]) lines = [] lines.append("# 대산2터널 본선 도면 인벤토리\n") lines.append("| 버전 | 일자 | 변경 내용 |\n|---|---|---|") lines.append("| v0.1.00 | 2026-10-21 | 최초 작성. 본선 21건(02 평면·종단 4, 03 본선굴착 8, 04 본선기타 9) DXF 인벤토리 |\n") lines.append("## 1. 개요\n") lines.append("- 입력: `RAG/03_터널명(대산2터널)/{02,03,04}` 하위 DXF 21건 (원본 DWG 변환본, 읽기 전용 사용)") lines.append(f"- 추출 결과: 성공 {len(ok)}건 / 실패 {len(err)}건 / 복구 모드 적용 {sum(1 for r in ok if r['recovered'])}건") lines.append(f"- 총 엔티티 {total_ents:,}개 (성공 파일 기준)") lines.append(f"- 3D 형상(Z 편차 있음) 보유 파일: **{n3d}건** — 전 도면이 2D이므로 3D 형상은 도면 해석으로 재구성해야 함 [출처: 본 인벤토리 `has_3d_geometry`]") lines.append(f"- `$INSUNITS` 분포: " + ", ".join(f"{k}={v}건" for k, v in units.items()) + " (0=미지정, 4=mm) — 단위는 도면 표기를 따름 (사용자 승인 2026-10-21)\n") lines.append("## 2. 파일별 추출 결과\n") lines.append("| # | 파일 | 상태 | 엔티티 | 주요 엔티티(상위 3) | 단위 | 코드페이지 |") lines.append("|---|---|---|---|---|---|---|") for i, r in enumerate(rows, 1): if r["ok"]: n = sum(r["entity_counts"].values()) lines.append(f"| {i} | {r['file']} | OK | {n:,} | {top_types(r)} | {r['insunits']} | {r['codepage']} |") else: lines.append(f"| {i} | {r['file']} | **ERR** | — | {r.get('error','')} | — | — |") lines.append("") lines.append("## 3. 도면 주석 관찰 (정성, 판정 어휘: 있음 / 일부 있음 / 없음 / 확인 못함)\n") lines.append("| 항목 | 판정 | 근거 |\n|---|---|---|") lines.append("| 표준단면 편경사 기준 | 있음 | 「편경사 -2.0%를 기준으로 작성」 [출처: C0060303-001, 주석 1] |") lines.append("| 표준단면 방향 표기 범위 | 일부 있음 | 「당진방향 단면만 표기, 대산방향 단면은 생략」 [출처: C0060303-001, 주석 2] — 대산방향 형상은 이 도면으로 확정 불가 |") lines.append("| 숏크리트·라이닝 두께 수치 | 없음 | 「표준지보패턴도 참조」 [출처: C0060303-001, 주석 5] — 두께 값은 다른 도면(표준지보패턴) 필요 |") lines.append("| 굴착 순서 표기 | 있음 | N, N+1, N-1 단계 표기 및 1회 굴진장 [출처: C0060303-002] |") lines.append("| 굴진 1회당 길이 | 있음 | 「굴진 (1회당 0.8m)」 [출처: C0060303-008] |") lines.append("| 라이닝 구조도 적용 구간 | 일부 있음 | 「지보패턴 입출구부 A~C-2 구간의 구조적 취약구간에 적용」 [출처: C0060304-004, 주석 5] — 전 구간 적용 여부 확인 못함 |") lines.append("| 지보패턴 명칭 | 있음 | NP-4AD-1-D-2, NP-4BD-1-D-2, NP-5AE-1-WL-4, NP-5BE-1-WL-4, NP-6A, NP-6B [출처: 03-003~008 파일명] |") lines.append("| 평면·종단 지질·구배 표기 | 있음 | 구배 S=2.4913%, 지층명(붕적층·풍화토·풍화암·보통암) [출처: C0060302-001 텍스트] |") lines.append("| 구간 측점(STA) 정합 | 확인 못함 | 평면·종단·굴착 도면 간 측점 대응표 없음 — Task 3에서 대조 필요 [추론] |") lines.append("") lines.append("## 4. 확인·보류 항목 (OPEN 등재 대상)\n") lines.append("- **C0060304-003** (공동구 및 배수계획도 3): DXF 구조 오류(`Invalid sort handle code 331`), 복구 모드도 실패. 원본 DWG 재변환 필요. 본선 3D 골격에는 필수가 아니므로 배수 요소만 보류.") lines.append("- 대산방향 단면 형상 (C0060303-001 주석 2): 3D 대산방향 재구성 여부 결정 필요 [CLARIFICATION NEEDED].") lines.append("- 라이닝 두께 수치 출처 (표준지보패턴도 미보유): 두께 값 확정 전까지 `[미확정]`으로 표기.") lines.append("") lines.append("## 5. 다음 단계\n") lines.append("Task 3(평면·종단 선형 추출, HITL) 착수 전 위 4항의 확인 응답을 받는다. 본 인벤토리의 수치는 `Code/3d-drawing/data/inventory_mainline.json`에서 자동 생성되었다.") open(OUT_MD, "w", encoding="utf-8").write("\n".join(lines) + "\n") print("written", OUT_MD, "lines", len(lines))