Files
Pier_v1/Code/새재1교P1판독/extract_g3_bars.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

66 lines
3.5 KiB
Python

"""Saejae-1 P1 footing rebar (G3: B1~B12) -> centreline polylines for the generic builder rebar_polylines.py (GATE G3).
Same rules as Okseong P1 (decisions F1-F5 applied again 2026-10-15): mats U-bars with two marks alternating along the sorted positions,
X bars 22.5 beside the Y bars, B12 (Y mid bars) lifted 19, B9 'ㄷ' ties from the drawn grid rule, UM not modelled, laps not modelled.
Inputs: 판독/g3_values.json. Output: 판독/g3_bars.json. Model axes: X along the coping, Y across, Z = EL x 1000, footing centre = origin.
"""
import json
from pathlib import Path
HERE = Path(__file__).resolve().parent
V = json.loads((HERE / "판독" / "g3_values.json").read_text(encoding="utf-8"))
bars = []
H = 3750.0 # a 7,500 / 2
def rb(d):
return ((2 * d if d <= 16 else 3.5 * d) + d) / 2
def add(mark, occ, pts, dia, L, src, r=None):
bars.append({"mark": mark, "occ": occ, "pts": [[round(v, 2) for v in p] for p in pts], "r": rb(dia) if r is None else r,
"design_length": L, "src": src})
def u_y(x, z, leg):
return [(x, -H, z + leg), (x, -H, z), (x, H, z), (x, H, z + leg)]
def u_x(y, z, leg):
return [(-H, y, z + leg), (-H, y, z), (H, y, z), (H, y, z + leg)]
for key, marks, axis, leg, L, src in (
("y_bars_bottom", ("B2", "B4"), "Y", 1800, 12010, "정면 하면 점 EL 10.132, 측면 다리 1,800"),
("x_bars_bottom", ("B6", "B8"), "X", 2400, 13210, "측면 하면 점 EL 10.1545, 정면 다리 2,400"),
("y_bars_top", ("B1", "B3"), "Y", -900, 10590, "정면 상면 점 EL 12.532, 측면 다리 900"),
("x_bars_top", ("B5", "B7"), "X", -1200, 11190, "측면 상면 점 EL 12.5095, 정면 다리 1,200")):
z = V[key]["z"]
pos = V[key]["x"] if axis == "Y" else V[key]["y"]
for i, v in enumerate(pos):
add(marks[i % 2], f"{axis.lower()}{v:+.1f}", u_y(v, z, leg) if axis == "Y" else u_x(v, z, leg), 25, L,
src + f"; {marks[0]}/{marks[1]} 교번, 겹이음 j 미모델 (F3 [추론])")
for zs, xs in V["mid_y_bars"].items():
for x in xs:
add("B12", f"z{zs}x{x:+.0f}", u_y(x, float(zs) + 19, -100), 19, 7700, f"정면 중간 점 EL {float(zs) / 1000:.3f} (+19, F4 [추론])")
for zs, ys in V["mid_x_bars"].items():
for y in ys:
add("B11", f"z{zs}y{y:+.0f}", u_x(y, float(zs), -100), 19, 7700, f"측면 중간 점 EL {float(zs) / 1000:.3f} (F4 [추론])")
c = V["b10_corner"]
for zs in V["b10_levels"]:
add("B10", f"z{zs:.0f}", [(-c, 0, zs), (-c, -c, zs), (c, -c, zs), (c, c, zs), (-c, c, zs), (-c, 0, zs)], 19, 32416,
"정면·측면 모서리 점 ±3,772.5, 재료표 7,544 x 7,544, 겹이음 560 x 4 미모델")
b9 = V["b9"]
for k, y in enumerate(b9["rows"]):
for x in (b9["cols_even"] if k % 2 == 0 else b9["cols_odd"]):
a2, cc, zt, zb = b9["a"] / 2, b9["c"], b9["zt"], b9["zb"]
add("B9", f"x{x:+.0f}y{y:+.0f}", [(x, y - a2 + cc, zb), (x, y - a2, zb), (x, y - a2, zt), (x, y + a2, zt), (x, y + a2, zb),
(x, y + a2 - cc, zb)], 19, 6332,
"정면 연직선 15곳 @500(짝수 행 8·홀수 행 7), 측면 다리 행 6 @1,200; 상세 a 1,244 b 2,444 c 100 [행·열 규칙, F1/F2형 추론]")
count = {}
for b in bars:
count[b["mark"]] = count.get(b["mark"], 0) + 1
out = {"bars": bars, "summary": {"bars": len(bars), "per_mark": count}}
(HERE / "판독" / "g3_bars.json").write_text(json.dumps(out, ensure_ascii=False), encoding="utf-8")
print(json.dumps(out["summary"], ensure_ascii=False))