50 lines
3.1 KiB
Python
50 lines
3.1 KiB
Python
#!/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))
|