#!/usr/bin/env python3 """Render the Task 3 draft centreline report (DOC/03_설계) from the centreline CSVs written by extract_alignment_plan.py. Numbers are read, not typed.""" import csv import math import sys CSV_001, CSV_002, OUT_MD = sys.argv[1], sys.argv[2], sys.argv[3] def load(path): with open(path, encoding="utf-8") as fh: return [(int(r["station_m"]), float(r["centre_x"]), float(r["centre_y"]), float(r["side_gap_m"])) for r in csv.DictReader(fh)] a, b = load(CSV_001), load(CSV_002) same = a == b lines = ["# 본선 중심선 측점 좌표 (초안)\n", "| 버전 | 일자 | 변경 내용 |", "|---|---|---|", "| v0.1.00 | 2026-10-21 | 최초 작성. 평면도 02-001 기준 측점 4+700~5+500 중심선 초안 (HITL 검토 대상) |\n", "## 1. 추출 방법", "- 소스: 레이어 `CA-ALGN-TEXT`(측점 라벨), `CA-ALGN-STSM`(측점 눈금) [출처: C0060302-001]", "- 측점 라벨은 측점당 2개(좌우 측). 각 라벨의 최근접 눈금 2점의 **중점**을 중심선 점으로 채택 (정의 HITL 확인 대상)", "- 좌표는 도면 좌표계 그대로 (단위: 도면 표기 따름, 사용자 승인 2026-10-21)\n", "## 2. 측점별 중심선 좌표 (02-001)\n", "| 측점(m) | 표기 | X | Y | 좌우 간격(m) | 인접 거리(m) | 측점차(m) | 잔차(m) |", "|---|---|---|---|---|---|---|---|"] prev = None for sta, x, y, g in a: label = f"{sta // 1000}+{sta % 1000:03d}" if prev is None: lines.append(f"| {sta} | {label} | {x:,.3f} | {y:,.3f} | {g:.2f} | — | — | — |") else: d = math.dist(prev[1:3], (x, y)) lines.append(f"| {sta} | {label} | {x:,.3f} | {y:,.3f} | {g:.2f} | {d:.3f} | {sta - prev[0]} | {d - (sta - prev[0]):+.3f} |") prev = (sta, x, y) resid = [math.dist(a[i][1:3], a[i + 1][1:3]) - (a[i + 1][0] - a[i][0]) for i in range(len(a) - 1)] lines += ["", f"- 검증: 인접 측점 거리와 측점차의 잔차 최대 {max(abs(r) for r in resid):.3f} m (측점 9개, 8구간). 잔차는 보정하지 않고 그대로 기재", "- 범위: 4+700 ~ 5+500 (800m). **이 시트 밖의 연장은 확보된 도면이 없음**\n", "## 3. 02-002 시트 대조", f"- 02-002 추출 결과 {'02-001과 측점 좌표가 동일' if same else '02-001과 차이 있음'} ({'중복 시트 가능성' if same else '차이 확인 필요'}). 원본 파일 md5는 상이함 [출처: C0060302-002]", "- 02-002가 종단(프로파일) 시트인지 중복 시트인지는 사용자 확인 필요\n", "## 4. 미완 항목 (OPEN 등재 대상)", "- 종단 EL 추출 미실시 (측점별 계획고·지반고). `CR-TABL-TEX2`의 740.00~980.00 라벨은 20m 간격으로 보이나 측점 체계와 대응 미확인 [추론]", "- 허용오차 ±50mm 판정은 EL 추출 후 실시", "- 측점 4+700 이전·5+500 이후 구간 평면 도면 미확보\n"] open(OUT_MD, "w", encoding="utf-8").write("\n".join(lines) + "\n") print("written", OUT_MD, "same_as_002=", same, "max_resid=", round(max(abs(r) for r in resid), 3))