Files
Pier_v1/Code/rebar_pipeline/rhino/02_build_shape_VII.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

60 lines
2.9 KiB
Python

# execute_rhino_code (IronPython 2.7) - 형식 VII (C8/C10) 생성 예: 단면 오프셋 120 교점 + 고정길이 + KDS 필렛
# 단면(대호지교 P1, s>0 쪽): 끝면 s=12100 (z9238~10738), 끝헌치 (12100,9238)->(8100,7738),
# 바닥 z=7738, 내측헌치 (4900,7738)->(3400,8238)
import scriptcontext as sc, Rhino, math, System
from Rhino.Geometry import Point3d, Vector3d, Polyline, Curve, Brep, PipeCapMode
d = sc.doc
tol = d.ModelAbsoluteTolerance; atol = d.ModelAngleToleranceRadians
COV = 120.0; r = 12.7; Rc = 76.2 + 12.7 # H25: 3db + db/2
A_LEG = 630.0; D_LEN = 2331.0 # 재료표 a, d
# --- 2D 오프셋선 교점 ---
sE = 12100.0 - COV # 끝면 오프셋
dx = -4000.0; dz = -1500.0; Ln = math.sqrt(dx*dx + dz*dz)
nx = -1500.0/Ln; nz = 4000.0/Ln # 안쪽 법선
p0s = 12100.0 + COV*nx; p0z = 9238.0 + COV*nz
t = (sE - p0s)/dx; Pab = (sE, p0z + t*dz)
zf = 7738.0 + COV
t = (zf - p0z)/dz; Pbc = (p0s + t*dx, zf)
dx2 = -1500.0; dz2 = 500.0; L2 = math.sqrt(dx2*dx2 + dz2*dz2)
q0s = 4900.0 + COV*500.0/L2; q0z = 7738.0 + COV*1500.0/L2
t = (zf - q0z)/dz2; Pcd = (q0s + t*dx2, zf)
D = (Pcd[0] + D_LEN*dx2/L2, zf + D_LEN*dz2/L2)
A = (sE, Pab[1] + A_LEG)
pts2 = [A, Pab, Pbc, Pcd, D] # 결과: b=4167.1, c=3158.8 (도면과 일치)
# --- 3D 생성 / 블록 교체 ---
ang = math.radians(19.105)
u = Vector3d(math.cos(ang), math.sin(ang), 0); wv = Vector3d(-math.sin(ang), math.cos(ang), 0)
c = Point3d(480714926, 153833329.5, 9331)
W_LIST = [-1630, -1375, -1125, -875, -625, -375, -125, 125, 375, 625, 875, 1125, 1375, 1630] # 1CYCLE (도면)
out = []
for nm, sg in [("C8", 1.0), ("C10", -1.0)]:
idf = d.InstanceDefinitions.Find(nm)
inst = None
for o in d.Objects.FindByLayer(d.Layers[d.Layers.FindByFullPath("P1_두부_주철근_1CYCLE::" + nm + "_H25", -1)]):
if o.ObjectType == Rhino.DocObjects.ObjectType.InstanceReference: inst = o
ok, inv = inst.Geometry.Xform.TryGetInverse()
olds = list(idf.GetObjects())
# 백업
bg = []; ba = []
for o in olds:
bg.append(o.Geometry.Duplicate()); ba.append(o.Attributes.Duplicate())
if d.InstanceDefinitions.Find(nm + "_backup") is None:
d.InstanceDefinitions.Add(nm + "_backup", "backup", Point3d.Origin, bg, ba)
newg = []; newa = []
i = 0
for w in W_LIST:
wpts = []
for p in pts2:
wpts.append(c + u*(sg*p[0]) + wv*w + Vector3d(0, 0, p[1] - c.Z))
fc = Curve.CreateFilletCornersCurve(Polyline(wpts).ToPolylineCurve(), Rc, tol, atol)
bp = Brep.CreatePipe(fc, r, False, PipeCapMode.NONE, False, tol, atol)[0]
bp.Transform(inv)
newg.append(bp); newa.append(olds[min(i, len(olds)-1)].Attributes.Duplicate())
i += 1
out.append(nm + " modify=" + str(d.InstanceDefinitions.ModifyGeometry(idf.Index, newg, newa)))
d.Views.Redraw()
result = "\n".join(out)
print(result)