Files
Pier_v1/Code/RampA판독/extract_g1.py
T
ahnyongjooandClaude Sonnet 5.5 964a841de1 chore(rebar): Pier_T_rebar 작업 폴더 초기 구성 및 외부 의존 파일 통합
- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환
- Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용
- pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관)
- worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md)
- D:\Rhino-MCP 경로 참조를 새 위치로 치환

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:20:18 +09:00

95 lines
4.6 KiB
Python

"""Ramp-A P1 shape reading (G1 + G5 positions) from D1 by handle -> 판독/g1_values.json.
Datums (D1 front view): pier CL x = 86041.7, z(mm) = drawing y + 534115.2 (EL 32.752 at pile bottom y -501363.2,
EL 59.952 / 60.267 at coping top y -474163.2 / -473848.2). Plan view: CL x = 86041.7, coping CL y = -465444.9.
Model axes: X along the coping (교축직각), Y across (교축), origin = pier centre, Z = EL x 1000.
"""
import json
import math
from pathlib import Path
from dxftools import doc
D = doc("D1")
X0, ZOFF = 86041.7, 534115.2
PX0, PY0 = 86041.7, -465444.9
def ent(h):
return D.entitydb[h]
def z(y):
return round(y + ZOFF, 1)
def line(h):
e = ent(h)
return (e.dxf.start.x, e.dxf.start.y), (e.dxf.end.x, e.dxf.end.y)
out = {}
# front view
(a, b) = line("857"); (c, d) = line("7D1")
out["coping"] = {
"top_left": {"x0": round(line("856")[0][0] - X0, 1), "x1": 0.0, "z": z(line("856")[0][1]), "src": "D1 856"},
"top_right": {"x0": 0.0, "x1": round(line("854")[1][0] - X0, 1), "z": z(line("854")[0][1]), "src": "D1 854"},
"end_left_front": {"bottom": [round(a[0] - X0, 1), z(a[1])], "top": [round(b[0] - X0, 1), z(b[1])], "src": "D1 857"},
"end_right_front": {"bottom": [round(c[0] - X0, 1), z(c[1])], "top": [round(d[0] - X0, 1), z(d[1])], "src": "D1 7D1"},
}
for h, k in (("501", "soffit_left"), ("4FF", "soffit_right")):
e = ent(h)
cx, cz, r = e.dxf.center.x - X0, z(e.dxf.center.y), e.dxf.radius
pts = [(round(cx + r * math.cos(math.radians(t)), 1), round(cz + r * math.sin(math.radians(t)), 1))
for t in (e.dxf.start_angle, e.dxf.end_angle)]
out["coping"][k] = {"centre": [round(cx, 1), cz], "radius": r, "ends": pts, "src": f"D1 ARC {h}"}
(p, q) = line("55A")
out["coping"]["column_top_z"] = z(p[1])
# side view (CL x 105105.6)
SX0 = 105105.6
(s0, s1) = line("504")
out["coping"]["side"] = {"half_width_top": round(SX0 - ent("520").dxf.start.x, 1),
"taper": {"from": [round(s1[0] - SX0, 1), z(s1[1])], "to": [round(s0[0] - SX0, 1), z(s0[1])]},
"src": "D1 측면도 520/521 (2,200), 503/504 (2,200 -> 2,000)"}
# plan view ends: polyline 51A / 519 with bulge
for h, k in (("51A", "plan_end_left"), ("519", "plan_end_right")):
pts = ent(h).get_points("xyb")
x_top, x_bot, bulge = pts[0][0] - PX0, pts[1][0] - PX0, pts[1][2]
chord = abs(pts[2][1] - pts[1][1])
sag = abs(bulge) * chord / 2
out["coping"][k] = {"top_edge_x": round(x_top, 1), "corner_bottom_x": round(x_bot, 1), "half_width": round(chord / 2, 1),
"sagitta": round(sag, 1), "radius": round((chord ** 2 / 4 + sag ** 2) / (2 * sag), 1),
"src": f"D1 평면 {h} bulge {bulge:.3f}"}
# column / pile (front)
out["column"] = {"d": round(line("610")[0][0] - line("60F")[0][0], 1), "z0": z(line("60F")[0][1]),
"z1": z(line("60F")[1][1]), "src": "D1 60F/610"}
out["pile_upper"] = {"d": round(line("87F")[0][0] - line("881")[0][0], 1), "z0": z(line("880")[0][1]),
"z1": z(line("881")[1][1]), "src": "D1 880-87F / 882-881, 89F"}
out["pile_lower"] = {"d": round(line("875")[0][0] - line("873")[0][0], 1), "z0": z(line("873")[1][1]),
"z1": z(line("873")[0][1]), "src": "D1 873/875, 87E"}
out["ground_z"] = z(line("89E")[0][1])
# plan: pedestals and pads (corner polylines / lines), rotation from the long (along Y) edge
def rect(pts, src):
cx = sum(p[0] for p in pts) / 4 - PX0
cy = sum(p[1] for p in pts) / 4 - PY0
e = [(pts[(i + 1) % 4][0] - pts[i][0], pts[(i + 1) % 4][1] - pts[i][1]) for i in range(4)]
L = [math.hypot(*v) for v in e]
along = max(range(4), key=lambda i: abs(e[i][1])) # edge most parallel to plan Y
vx, vy = e[along] if e[along][1] > 0 else (-e[along][0], -e[along][1])
rot = math.degrees(math.atan2(vx, vy)) # + = clockwise from +Y (bearings.py convention)
return {"centre": [round(cx, 1), round(cy, 1)], "along": round(L[along], 1), "across": round(L[(along + 1) % 4], 1),
"rotation_deg": round(rot, 3), "src": src}
out["plan"] = {}
for no, ped, pads in ((1, ("49D", "49E", "49F", "4A0"), ("486", "487", "488")),
(2, ("4A5", "4A6", "4A7", "4A8"), ("489", "48A", "48B"))):
pts = [line(h)[0] for h in ped]
out["plan"][no] = {"pedestal": rect(pts, "D1 평면 " + "/".join(ped)),
"pads": [rect([p[:2] for p in ent(h).get_points("xy")], f"D1 평면 {h}") for h in pads]}
p = Path(__file__).resolve().parent / "판독" / "g1_values.json"
p.write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8")
print(json.dumps(out, ensure_ascii=False, indent=1))