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>
This commit is contained in:
ahnyongjooandClaude Sonnet 5.5 committed 2026-10-28 11:20:18 +09:00
commit 964a841de1
3978 files changed
+58013356

No files matched your search

+61
View File
@@ -0,0 +1,61 @@
"""Add the column rebar (G2: P1 main, P2 hoops, P3 ties) to the app pier 'Ramp-A교P1'.
params = drawn / chain values (판독/g2_values.json, DOC 판독서 v0.1.02 §11) and user decisions K1-K4 (2026-10-13);
expected = schedule L / N / r (D4 재료표(기둥), D3 철근 상세) and the D2 chain anchor, typed in by hand.
Backs up params.json / expected.json to data/Ramp-A교P1/backup/2026-10-13_g2/ first. Refuses if G2 is already in scope.
"""
import json
import shutil
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
APP = HERE.parents[1] / "Code" / "교각모델링앱"
D = APP / "data" / "Ramp-A교P1"
V = json.loads((HERE / "판독" / "g2_values.json").read_text(encoding="utf-8"))
P = json.loads((D / "params.json").read_text(encoding="utf-8"))
X = json.loads((D / "expected.json").read_text(encoding="utf-8"))
if "G2" in P["scope"]:
sys.exit("G2 already in scope")
bk = D / "backup" / "2026-10-13_g2"
bk.mkdir(parents=True, exist_ok=True)
for f in ("params.json", "expected.json"):
shutil.copy2(D / f, bk / f)
A = 45492.0 # chain anchor (D2 '띠철근외측' / '크로스타이' common tick)
mf, ms = V["main_front"], V["main_section"]
P["scope"] = ["G1", "G2", "G5"]
P["builders"]["G2"] = "column_rebar_straight.py"
P["rebar_marks"] = {"P1": {"dia": "H35", "shape": "I"}, "P2": {"dia": "H16", "shape": "hoop-lap"},
"P3": {"dia": "H16", "shape": "tie-90/135"}}
P["rebar_marks_src"] = "D4 철근 재료표(기둥) 기호·직경, D3 철근 상세 형상. 말뚝 철근망(P1-1·P1-2·P2-1·P3-1·P3-2)은 범위 밖"
P["display"]["rebar_palette"]["35"] = [148, 103, 189]
P["display"]["rebar_palette_src_H35"] = "H35 (148,103,189) Agent 제안 2026-10-13 — R8 등재 확정 대기"
P["column_rebar"] = {
"form": "straight",
"main": {"mark": "P1", "count": ms["count"], "start_deg": 0.0, "radius": ms["radius"],
"z0": mf["bottom_EL"], "z1": mf["top_EL"], "coupler_length": 40.0},
"hoops": {"mark": "P2", "radius": 901.0, "levels": [43542.0 + 150 * k for k in range(107)],
"a": 2829.0, "lap": 650.0, "hook": 200.0, "join_deg": [90, 0]},
"ties": {"mark": "P3", "levels": [43692.0 + 300 * k for k in range(54)], "straight": 1832.0, "leg": 200.0,
"hook_tail": 150.0, "y_lift": 16.0},
"design_lengths": {"P1": mf["top_EL"] - mf["bottom_EL"], "P2": 2829.0 + 650.0 + 2 * 200.0,
"P3": 200.0 + 1832.0 + 141.0 + 100.0},
"src": {"main": "D2 단면 C-C 기호 54개 r 875 (0°부터 6.667°), 정면 작도 EL 43.492~59.752; 하단 커플러 40 = L 16,300 - 작도 16,260 (K1)",
"hoops": "재료표 r 901, a 2,829, b 200, j 650x2; 단 = 사슬 격자 43.542 + 150k, 107단 (K2); 이음 90°/0° 교번 (K4 [추론])",
"ties": "재료표 a 200, b 1,832, c 141, d 100; 단 = 43.692 + 300k, 54단, X·Y 1단 2개, Y +16 (K3 [추론]); 다리·갈고리 좌우 교번 (K4 [추론]); 갈고리 꼬리 작도 150 [추론]",
"design_lengths": "P1 작도 길이(+커플러 40 = L), P2 a+j+2b 한 조각(두 조각 = L 7,758), P3 a+b+c+d = 2,273 (L 2,274 반올림)"},
}
X["checkers"]["G2"] = "g2_straight.py"
X["negative"]["G2"] = [{"mark": "P1", "d": [5, 0, 0]}, {"mark": "P2", "d": [0, 0, 5]}]
X["rebar_palette"]["35"] = [148, 103, 189]
X["G2"] = {"schedule_L": {"P1": 16300, "P2": 7758, "P3": 2274}, "schedule_n": {"P1": 54, "P2": 107, "P3": 108},
"dia": {"P1": 35, "P2": 16, "P3": 16}, "chain_anchor": A,
"main": {"mark": "P1", "radius": 875, "divisions": 54, "start_deg": 0.0, "below_anchor": 2000, "coupler": 40},
"hoops": {"mark": "P2", "radius": 901, "pitch": 150, "below": 13},
"ties": {"mark": "P3", "pitch": 300, "below": 6, "per_level": 2, "y_lift": 16},
"src": "D4 재료표(기둥) L·N, D3 상세 r 901; D2 단면 '125, 875, 875, 125' DIVISION 54; D2 사슬 '2,000', H4 14@150, H5 78@150, "
"H1 7@300, H2 39@300 (기점 EL 45.492); K1 커플러 40, K2 hoop 13단 아래, K3 Y +16 (사용자 결정 2026-10-13)"}
(D / "params.json").write_text(json.dumps(P, ensure_ascii=False, indent=1), encoding="utf-8")
(D / "expected.json").write_text(json.dumps(X, ensure_ascii=False, indent=1), encoding="utf-8")
print("G2 added; backup", bk)
+75
View File
@@ -0,0 +1,75 @@
"""Add the shaft cage (G3: P1-1, P1-2, P2-1, P3-1, P3-2, anti-uplift plate) to the app pier 'Ramp-A교P1'.
params = drawn / table values (판독/g3_values.json, 판독서 v0.1.04 §12) and user decisions S1-S6 (2026-10-13);
expected = D4 schedule L / N, 구조물 치수표 chains from the shaft top, section radii, typed in by hand.
Backs up params.json / expected.json to data/Ramp-A교P1/backup/2026-10-13_g3/ first. Refuses if G3 is in scope.
"""
import json
import math
import shutil
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
D = HERE.parents[1] / "Code" / "교각모델링앱" / "data" / "Ramp-A교P1"
V = json.loads((HERE / "판독" / "g3_values.json").read_text(encoding="utf-8"))
P = json.loads((D / "params.json").read_text(encoding="utf-8"))
X = json.loads((D / "expected.json").read_text(encoding="utf-8"))
if "G3" in P["scope"]:
sys.exit("G3 already in scope")
bk = D / "backup" / "2026-10-13_g3"
bk.mkdir(parents=True, exist_ok=True)
for f in ("params.json", "expected.json"):
shutil.copy2(D / f, bk / f)
TOP = 45452.0 # shaft top (D1)
hoops = [TOP - 110 - 150 * k for k in range(14)]
hoops += [hoops[-1] - 300 * k for k in range(1, 35)]
ties = [TOP - 260 - 300 * k for k in range(7)]
ties += [ties[-1] - 600 * k for k in range(1, 18)]
assert len(hoops) == 48 and len(ties) == 24 and hoops[0] - hoops[-1] == 8750 + 3400
zb = 32752.0 + 100 # U bottom (centreline), shaft bottom + 100
leg_top = zb + math.sqrt(581 ** 2 - 135 ** 2)
jj = V["J-J"]
P["scope"] = ["G1", "G2", "G3", "G5"]
P["builders"]["G3"] = "shaft_rebar.py"
P["rebar_marks"].update({"P1-1": {"dia": "H35", "shape": "I"}, "P1-2": {"dia": "H22", "shape": "I"},
"P2-1": {"dia": "H16", "shape": "hoop-lap"}, "P3-1": {"dia": "H16", "shape": "tie-90/135"},
"P3-2": {"dia": "H16", "shape": "U"}})
P["rebar_marks_src"] = "D4 철근 재료표(기둥) 기호·직경, D3 철근 상세 형상 (기둥 P1~P3 + 말뚝 P1-1~P3-2)"
P["shaft_rebar"] = {
"form": "shaft_cage",
"main": {"count": jj["bar_count"], "start_deg": jj["first_deg"], "radius": 999.5, "coupler_length": 0.0,
"pieces": [{"mark": "P1-2", "z0": hoops[-1], "z1": hoops[-1] + 3400},
{"mark": "P1-1", "z0": hoops[-1] + 3400, "z1": hoops[0]}]},
"hoops": {"mark": "P2-1", "radius": 1025.0, "levels": sorted(hoops), "a": 3220.0, "lap": 880.0, "hook": 200.0,
"join_deg": [90, 0]},
"ties": {"mark": "P3-1", "levels": sorted(ties), "straight": 2137.0, "leg": 200.0, "hook_tail": 150.0, "y_lift": 16.0},
"u_bars": {"mark": "P3-2", "count": 30, "z_bottom": zb, "half_bottom": 890.0, "half_top": 1025.0,
"leg_top_z": round(leg_top, 1), "top_z": round(leg_top + 200, 1), "bend_r": 135.0},
"plate": {"size": 1250.0, "thickness": 4.0, "z_top": zb - 8, "colour": [150, 150, 150]},
"design_lengths": {"P1-1": 8750.0, "P1-2": 3400.0, "P2-1": 3220.0 + 880.0 + 2 * 200.0,
"P3-1": 200.0 + 2137.0 + 165.0 + 150.0, "P3-2": 1780.0 + 2 * 581.0 + 2 * 200.0},
"src": {"main": "D4 단면 G-G·J-J 61개 1.475°부터 5.902°; r 999.5 (S2); P1-1 45.342~36.592, P1-2 36.592~33.192 (첫~끝 띠철근 단, 커플러 0, S6)",
"hoops": "구조물 치수표 H4 13@150, H3 34@300, 사슬 '110' (48단); r 1,025 (S1, 재료표 r 929는 오기); 겹이음 880 교번 (S5 [추론])",
"ties": "H2 6@300, H1 17@600, 사슬 '260' (24단 × X·Y); 재료표 a 200 b 2,137 c 165 d 150; Y +16, 교번 (S5 [추론])",
"u_bars": "재료표 r 135, a 1,780, b 581, c 200; 바닥 = 말뚝 바닥 +100; 중심 통과 30면, 주철근 0~29번 각도 (S3 [추론])",
"plate": "D4 PLATE 1,250×1,250×4 (T=4mm); U형 바닥 아래, 중심 (S4 [추론])",
"not_modelled": "SPACER 4mm 간격재 (공식 {H-2.500-(0.500x2)}x2개소만 기록, 사용자 결정)"},
}
X["checkers"]["G3"] = "g3_shaft.py"
X["negative"]["G3"] = [{"mark": "P1-1", "d": [5, 0, 0]}, {"mark": "P2-1", "d": [0, 0, 5]}]
X["G3"] = {"schedule_L": {"P1-1": 8750, "P1-2": 3400, "P2-1": 9000, "P3-1": 2652, "P3-2": 3342},
"schedule_n": {"P1-1": 61, "P1-2": 61, "P2-1": 48, "P3-1": 48, "P3-2": 30},
"dia": {"P1-1": 35, "P1-2": 22, "P2-1": 16, "P3-1": 16, "P3-2": 16}, "shaft_top": TOP,
"main": {"pieces": ["P1-2", "P1-1"], "radius": 999.5, "divisions": 61, "start_deg": 1.475},
"hoops": {"mark": "P2-1", "radius": 1025, "chain": {"first": 110, "groups": [[13, 150], [34, 300]]}},
"ties": {"mark": "P3-1", "chain": {"first": 260, "groups": [[6, 300], [17, 600]]}, "y_lift": 16},
"u_bars": {"mark": "P3-2", "bottom_above": 100},
"plate": {"size": 1250, "thickness": 4},
"src": "D4 재료표(기둥)·PLATE 재료표; 구조물 치수표 H 12,700, H1 17@600, H2 6@300, H3 34@300, H4 13@150, H5·H6 340, "
"사슬 '260'·'110'·'100'; 단면 원 r 1,025, DIVISION 61 (첫 1.475°); S1~S6 사용자 결정 2026-10-13"}
(D / "params.json").write_text(json.dumps(P, ensure_ascii=False, indent=1), encoding="utf-8")
(D / "expected.json").write_text(json.dumps(X, ensure_ascii=False, indent=1), encoding="utf-8")
print("G3 added; backup", bk)
+66
View File
@@ -0,0 +1,66 @@
"""Add the coping rebar (G4: C1~C16, S1~S4) to the app pier 'Ramp-A교P1' (generic builder rebar_polylines.py).
params = 판독/g4_bars.json (extract_g4.py: drawn values + decisions T1-T6, 2026-10-14)
expected = D3 schedule L / N, D2 / D3 drawn positions and section dimensions, typed in by hand.
Backs up params.json / expected.json to data/Ramp-A교P1/backup/2026-10-14_g4/ first. Refuses if G4 is in scope.
"""
import json
import shutil
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
D = HERE.parents[1] / "Code" / "교각모델링앱" / "data" / "Ramp-A교P1"
B = json.loads((HERE / "판독" / "g4_bars.json").read_text(encoding="utf-8"))
P = json.loads((D / "params.json").read_text(encoding="utf-8"))
X = json.loads((D / "expected.json").read_text(encoding="utf-8"))
if "G4" in P["scope"]:
sys.exit("G4 already in scope")
bk = D / "backup" / "2026-10-14_g4"
bk.mkdir(parents=True, exist_ok=True)
for f in ("params.json", "expected.json"):
shutil.copy2(D / f, bk / f)
SCHED = {"C1": (8617, 9, "H29"), "C2": (7177, 9, "H29"), "C4": (8617, 8, "H29"), "C5": (7177, 8, "H29"),
"C3": (7230, 9, "H25"), "C6": (9003, 9, "H25"), "S3": (1250, 44, "H25"), "S4": (1250, 44, "H25"),
"C7": (7480, 20, "H19"), "C8": (6071, 40, "H19"), "C9": (9251, 15, "H19"), "C10": (7426, 30, "H19"),
"C11": (8110, 20, "H19"), "C12": (5333, 40, "H19"), "C13": (11309, 18, "H19"), "C14": (18057, 12, "H19"),
"C15": (2700, 51, "H19"), "C16": (4000, 17, "H19"), "S1": (2700, 22, "H16"), "S2": (2600, 24, "H16")}
SHAPE = {"C1": "top-legs", "C2": "top-legs", "C3": "top-legs", "C4": "top-legs", "C5": "top-legs", "C6": "soffit-R",
"C7": "stirrup", "C8": "stirrup-chamfer", "C9": "stirrup", "C10": "stirrup-chamfer", "C11": "stirrup",
"C12": "stirrup-chamfer", "C13": "loop", "C14": "loop", "C15": "U", "C16": "U", "S1": "U", "S2": "U",
"S3": "I", "S4": "I"}
P["scope"] = ["G1", "G2", "G3", "G4", "G5"]
P["builders"]["G4"] = "rebar_polylines.py"
P["rebar_marks"].update({m: {"dia": d, "shape": SHAPE[m]} for m, (_, _, d) in SCHED.items()})
P["coping_rebar"] = {"form": "polylines", "host": "CP", "group": "코핑", "bars": B["bars"],
"src": "Code/RampA판독/extract_g4.py -> 판독/g4_bars.json; 판독서 v0.1.06 §13, 결정 T1~T6 (2026-10-14)"}
X["checkers"]["G4"] = "g4_ramp.py"
X["negative"]["G4"] = [{"mark": "C1", "d": [0, 5, 0]}, {"mark": "C7", "d": [0, 0, 5]}]
row = lambda s, p, n: {"start": s, "pitch": p, "n": n}
X["G4"] = {
"schedule": {m: [L, n] for m, (L, n, _) in SCHED.items()},
"dia": {m: int(d[1:]) for m, (_, _, d) in SCHED.items()},
"fixed_length": ["C1", "C2", "C3", "C4", "C5", "C6", "C15", "C16", "S1", "S2", "S3", "S4"],
"layers": {"C1": {"z": 59852, "y": row(-1000, 250, 9), "x_top": [-3425.6, 3492.1]},
"C4": {"z": 59852, "y": row(-875, 250, 8), "x_top": [-3425.6, 3492.1]},
"C2": {"z": 59752, "y": row(-1000, 250, 9), "x_top": [-3455.6, 3515.0]},
"C5": {"z": 59752, "y": row(-875, 250, 8), "x_top": [-3455.6, 3515.0]},
"C3": {"z": 59652, "y": row(-1000, 250, 9), "x_top": [-3485.6, 3537.8]},
"C16": {"z": 60167, "y": row(-1000, 125, 17), "x_top": [100, 3400]}},
"stirrups": {"x": row(-3375, 125, 55), "inner_dx": 20, "top_cover": 77.5, "bottom_cover": 77.5,
"outer_y": [-875, 750],
"zones": {"left": ["C7", "C8", -3375, -1000], "centre": ["C9", "C10", -875, 875],
"right": ["C11", "C12", 1000, 3375]}},
"loops": {"per_level": 3, "levels": {"C14": [59827, 59577, 59327, 59077],
"C13": [58827, 58577, 58327, 58077, 57827, 57577]}},
"c6": {"z_bottom": 57552, "y": [-906.5, -750, -500, -250, 0, 250, 500, 750, 906.5],
"y_note": "T1 @250 9본; 하면 직선부(EL 57.552)에서는 바깥 2본이 측면 테이퍼 피복 100.2로 ±906.5"},
"c15": {"a": 2000},
"seats": {"1": {"S1": 11, "S2": 12, "S3": 22, "S4": 22}, "2": {"S1": 11, "S2": 12, "S3": 22, "S4": 22}},
"src": "D3 재료표·철근 상세; D2 정면 작도(상면 3단 EL·x 끝, 스터럽 55곳, C13·C14 단, C16); 단면 A-A·B-B(행 @125/@250, "
"스터럽 y·피복 77.5); 교좌면 E-E·F-F; 결정 T1~T6 (2026-10-14)",
}
(D / "params.json").write_text(json.dumps(P, ensure_ascii=False, indent=1), encoding="utf-8")
(D / "expected.json").write_text(json.dumps(X, ensure_ascii=False, indent=1), encoding="utf-8")
print("G4 added:", len(B["bars"]), "bars; backup", bk)
+20
View File
@@ -0,0 +1,20 @@
"""Ramp-A P1: convert copies of RAG/Ramp-A교 P1 교각(1..4).dwg to DXF (Code/RampA판독/dxf) and index texts.
Uses the app reader (sources are copied before conversion and never touched). Labels D1..D4 by file order."""
import json
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT / "Code" / "교각모델링앱"))
from engine import reader # noqa: E402
OUT = Path(__file__).resolve().parent / "dxf"
dwgs = sorted((ROOT / "RAG").glob("Ramp-A교 P1 교각(*).dwg"))
audit = reader.convert(dwgs, OUT)
labels = [f"D{i}" for i in range(1, len(audit) + 1)]
for a, lab in zip(audit, labels):
a["label"] = lab
(OUT / "audit.json").write_text(json.dumps(audit, ensure_ascii=False, indent=1), encoding="utf-8")
texts = reader.build_index([OUT / a["dxf"] for a in audit], labels, OUT / "texts.json")
print(json.dumps(audit, ensure_ascii=False, indent=1))
print("texts", len(texts))
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+34
View File
@@ -0,0 +1,34 @@
[
{
"source": "Ramp-A교 P1 교각(1).dwg",
"source_sha256": "8a7d7d1baac8a882130389776ff4d2c41c1c91306642be907a31bdb599adc479",
"dxf": "Ramp-A교 P1 교각(1).dxf",
"dxf_sha256": "b2bd3f6ad4a0d985472af97eaa1b842f2e8d4937cf7f20eeabe38c3761266bad",
"engine": "ODA File Converter 27.1.0",
"label": "D1"
},
{
"source": "Ramp-A교 P1 교각(2).dwg",
"source_sha256": "0549a0f9165f5105192e45a86bd8b4603e38f89e880a2f0e09d0aae2d651cabf",
"dxf": "Ramp-A교 P1 교각(2).dxf",
"dxf_sha256": "4bcd46ade02bcf46ba7f6358238a285e98f346bfb54fb530300b0b5b63db8b3d",
"engine": "ODA File Converter 27.1.0",
"label": "D2"
},
{
"source": "Ramp-A교 P1 교각(3).dwg",
"source_sha256": "7e28c5f9919ef054b6328aa8bfc4a12cba08550de4351606b614c3e7643d2b8a",
"dxf": "Ramp-A교 P1 교각(3).dxf",
"dxf_sha256": "e4e426156d031f4c88f96103daae422acaf5287a7473e53e3acfc66644d81a47",
"engine": "ODA File Converter 27.1.0",
"label": "D3"
},
{
"source": "Ramp-A교 P1 교각(4).dwg",
"source_sha256": "0919ec2f363c68495acd11f6c4aa2cda66dd0cce225df7df1115a5c58e57f78e",
"dxf": "Ramp-A교 P1 교각(4).dxf",
"dxf_sha256": "50d7b2c77fc64c7f77e6e6b7c4bc760385f86bab21019407defb32790f103c5d",
"engine": "ODA File Converter 27.1.0",
"label": "D4"
}
]
+1
View File
@@ -0,0 +1 @@
[{"dwg": "D1", "layer": "CS-DIMT", "x": 88916.7, "y": -471214.1, "h": 300.0, "text": "1,250", "handle": "BD"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 87166.7, "y": -471214.1, "h": 300.0, "text": "2,250", "handle": "CD"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 84916.7, "y": -471214.1, "h": 300.0, "text": "2,250", "handle": "D3"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 83166.7, "y": -471214.1, "h": 300.0, "text": "1,250", "handle": "D9"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 86041.7, "y": -470214.1, "h": 300.0, "text": "7,000", "handle": "E1"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 105655.6, "y": -471154.0, "h": 300.0, "text": "1,100", "handle": "E7"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 105105.6, "y": -470154.0, "h": 300.0, "text": "2,200", "handle": "EF"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 104555.6, "y": -471154.0, "h": 300.0, "text": "1,100", "handle": "F5"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 78714.0, "y": -474663.2, "h": 300.0, "text": "1,000", "handle": "FD"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 78714.0, "y": -475913.2, "h": 300.0, "text": "1,500", "handle": "105"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 92811.2, "y": -474663.2, "h": 300.0, "text": "1,000", "handle": "10B"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 92811.2, "y": -475913.2, "h": 300.0, "text": "1,500", "handle": "113"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 93340.5, "y": -474005.7, "h": 300.0, "text": "315", "handle": "119"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 77714.0, "y": -487763.2, "h": 300.0, "text": "27,200", "handle": "121"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 83641.7, "y": -477794.6, "h": 300.0, "text": "2,800", "handle": "127"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 86041.7, "y": -478794.6, "h": 300.0, "text": "7,600", "handle": "12D"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 81582.6, "y": -471243.0, "h": 300.0, "text": "300", "handle": "133"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 88441.7, "y": -477794.6, "h": 300.0, "text": "2,800", "handle": "13B"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 105105.6, "y": -462050.8, "h": 300.0, "text": "2,000", "handle": "141"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 78742.9, "y": -488413.2, "h": 300.0, "text": "500", "handle": "147"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 78714.0, "y": -482413.2, "h": 300.0, "text": "11,500", "handle": "14F"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 78714.0, "y": -497613.2, "h": 300.0, "text": "7,500", "handle": "155"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 78714.0, "y": -491263.2, "h": 300.0, "text": "5,200", "handle": "15B"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 101823.6, "y": -465444.9, "h": 300.0, "text": "2,000", "handle": "161"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 84829.0, "y": -503213.0, "h": 300.0, "text": "75", "handle": "167"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 86041.7, "y": -504184.1, "h": 300.0, "text": "2,500", "handle": "16F"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 86041.5, "y": -503184.1, "h": 300.0, "text": "2,350", "handle": "175"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 87254.0, "y": -503213.0, "h": 300.0, "text": "75", "handle": "17B"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 90500.8, "y": -471243.0, "h": 300.0, "text": "300", "handle": "183"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 86041.7, "y": -477794.6, "h": 300.0, "text": "2,000", "handle": "18B"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 86041.7, "y": -485966.1, "h": 300.0, "text": "2,000", "handle": "191"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 84916.7, "y": -485995.0, "h": 300.0, "text": "250", "handle": "197"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 87166.7, "y": -485995.0, "h": 300.0, "text": "250", "handle": "19F"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 86041.7, "y": -484966.1, "h": 300.0, "text": "2,500", "handle": "1A7"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 86041.7, "y": -490363.6, "h": 300.0, "text": "2,500", "handle": "1AD"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 97777.8, "y": -474663.2, "h": 300.0, "text": "1,000", "handle": "1B3"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 97777.8, "y": -475913.2, "h": 300.0, "text": "1,500", "handle": "1BB"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 96777.8, "y": -487763.2, "h": 300.0, "text": "27,200", "handle": "1C1"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 97806.7, "y": -488413.2, "h": 300.0, "text": "500", "handle": "1C7"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 97777.8, "y": -482413.2, "h": 300.0, "text": "11,500", "handle": "1CF"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 97777.8, "y": -497613.2, "h": 300.0, "text": "7,500", "handle": "1D5"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 97777.8, "y": -491263.2, "h": 300.0, "text": "5,200", "handle": "1DB"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 103892.9, "y": -503213.0, "h": 300.0, "text": "75", "handle": "1E1"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 105105.6, "y": -504184.1, "h": 300.0, "text": "2,500", "handle": "1E9"}, {"dwg": "D1", "layer": "CS-DIMT", "x": 105105.4, "y": -503184.1, "h": 300.0, "text": "2,350", "handle": "1EF"}, {"dwg": "D1", "layer": Line truncated
+100
View File
@@ -0,0 +1,100 @@
"""Reading aids for the Ramp-A P1 drawings (read only): render a region, dump entities of a region.
usage:
python dxftools.py render <D1..D4> x0 y0 x1 y1 <name> [px] -> 판독/<name>.png
python dxftools.py dump <D1..D4> x0 y0 x1 y1 [layer-regex] -> prints LINE/LWPOLYLINE/ARC/CIRCLE/TEXT
DXF source: Code/RampA판독/dxf (converted from copies of RAG/Ramp-A교 P1 교각(1..4).dwg).
"""
import re
import sys
from pathlib import Path
import ezdxf
from ezdxf import bbox
HERE = Path(__file__).resolve().parent
DXF = HERE / "dxf"
_CACHE = {}
def doc(label):
if label not in _CACHE:
path = sorted(DXF.glob("*.dxf"))[int(label[1]) - 1]
_CACHE[label] = ezdxf.readfile(path)
return _CACHE[label]
def in_region(e, x0, y0, x1, y1):
try:
b = bbox.extents([e], fast=True)
except Exception:
return False
return b.has_data and b.extmax.x >= x0 and b.extmin.x <= x1 and b.extmax.y >= y0 and b.extmin.y <= y1
def entities(label, x0, y0, x1, y1, layer=None):
rx = re.compile(layer) if layer else None
for e in doc(label).modelspace():
if rx and not rx.search(e.dxf.layer):
continue
if in_region(e, x0, y0, x1, y1):
yield e
def describe(e):
t, L, h = e.dxftype(), e.dxf.layer, e.dxf.handle
r = lambda v: round(v, 1)
if t == "LINE":
s, f = e.dxf.start, e.dxf.end
return f"{h} {L} LINE ({r(s.x)},{r(s.y)})-({r(f.x)},{r(f.y)}) len {r(s.distance(f))}"
if t == "LWPOLYLINE":
pts = [(r(p[0]), r(p[1])) for p in e.get_points()]
return f"{h} {L} PLINE closed={e.closed} {pts}"
if t == "ARC":
c = e.dxf.center
return f"{h} {L} ARC c({r(c.x)},{r(c.y)}) r {r(e.dxf.radius)} {r(e.dxf.start_angle)}..{r(e.dxf.end_angle)}"
if t == "CIRCLE":
c = e.dxf.center
return f"{h} {L} CIRCLE c({r(c.x)},{r(c.y)}) r {r(e.dxf.radius)}"
if t in ("TEXT", "MTEXT"):
p = e.dxf.insert
s = e.plain_text() if t == "MTEXT" else e.dxf.text
return f"{h} {L} {t} ({r(p.x)},{r(p.y)}) '{s.strip()}'"
if t == "INSERT":
p = e.dxf.insert
return f"{h} {L} INSERT {e.dxf.name} ({r(p.x)},{r(p.y)})"
return f"{h} {L} {t}"
def render(label, x0, y0, x1, y1, name, px=2400):
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from ezdxf.addons.drawing import Frontend, RenderContext
from ezdxf.addons.drawing.config import BackgroundPolicy, ColorPolicy, Configuration
from ezdxf.addons.drawing.matplotlib import MatplotlibBackend
d = doc(label)
keep = list(entities(label, x0, y0, x1, y1))
fig = plt.figure(figsize=(px / 100, px * (y1 - y0) / (x1 - x0) / 100), dpi=100)
ax = fig.add_axes([0, 0, 1, 1])
cfg = Configuration(background_policy=BackgroundPolicy.WHITE, color_policy=ColorPolicy.BLACK)
Frontend(RenderContext(d), MatplotlibBackend(ax), config=cfg).draw_entities(keep)
ax.set_xlim(x0, x1)
ax.set_ylim(y0, y1)
ax.set_aspect("equal")
ax.axis("off")
out = HERE / "판독" / f"{name}.png"
out.parent.mkdir(exist_ok=True)
fig.savefig(out, facecolor="white")
plt.close(fig)
return out
if __name__ == "__main__":
cmd, label = sys.argv[1], sys.argv[2]
x0, y0, x1, y1 = map(float, sys.argv[3:7])
if cmd == "render":
print(render(label, x0, y0, x1, y1, sys.argv[7], int(sys.argv[8]) if len(sys.argv) > 8 else 2400))
else:
for e in entities(label, x0, y0, x1, y1, sys.argv[7] if len(sys.argv) > 7 else None):
print(describe(e))
+94
View File
@@ -0,0 +1,94 @@
"""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))
+45
View File
@@ -0,0 +1,45 @@
"""Ramp-A P1 column rebar reading (G2: P1 main, P2 hoops, P3 ties) from D2 -> 판독/g2_values.json.
D2 front view: column CL x 12741.4; shaft top (EL 45.452) at y -700829.1, coping bottom (EL 57.452) at y -692829.1;
the view is broken between y -696879.1 and -696779.1 (4,000 hidden): EL = 45452 + (y + 700829.1) [+ 4000 above].
Left dimension chains (ticks at x 8216 '띠철근외측' and x 7716 '크로스타이') give the hoop / tie zones.
Section C-C (centre 1045.1, -698159.3): main bars = INSERT symbols on r 875.
"""
import json
import math
from collections import defaultdict
from pathlib import Path
from dxftools import entities
el = lambda y: round(45452 + (y + 700829.1) + (4000 if y > -696829 else 0), 1)
out = {}
ticks = defaultdict(set)
for e in entities("D2", 6800, -706000, 9200, -688500):
if e.dxftype() == "INSERT":
ticks[round(e.dxf.insert.x)].add(round(e.dxf.insert.y, 1))
out["chain_hoop_EL"] = [el(y) for y in sorted(ticks[8216])]
out["chain_tie_EL"] = [el(y) for y in sorted(ticks[7716])]
# main bars in the front view (verticals of the column group)
v = [e for e in entities("D2", 11800, -703000, 13700, -690500, "CS-RBAR-MAJR") if e.dxftype() == "LINE"
and abs(e.dxf.start.x - e.dxf.end.x) < 0.5 and abs(e.dxf.start.y - e.dxf.end.y) > 3000]
out["main_front"] = {"x_min_rel": round(min(e.dxf.start.x for e in v) - 12741.4, 1),
"x_max_rel": round(max(e.dxf.start.x for e in v) - 12741.4, 1),
"bottom_EL": el(min(min(e.dxf.start.y, e.dxf.end.y) for e in v)),
"top_EL": el(max(max(e.dxf.start.y, e.dxf.end.y) for e in v))}
# hoops drawn (front, EREC) and side view hoops / ties
hy = sorted({round(e.dxf.start.y, 1) for e in entities("D2", 11000, -703000, 14500, -690900, "CS-RBAR-EREC")
if e.dxftype() == "LINE" and abs(e.dxf.start.y - e.dxf.end.y) < 0.5 and abs(e.dxf.start.x - e.dxf.end.x) > 1500})
out["hoops_front_drawn"] = {"count": len(hy), "first_EL": el(hy[0]), "last_EL": el(hy[-1])}
# section C-C main bars
cx, cy = 1045.1, -698159.3
angs = sorted(round(math.degrees(math.atan2(e.dxf.insert.y - cy, e.dxf.insert.x - cx)) % 360, 3)
for e in entities("D2", -500, -700000, 2600, -696300) if e.dxftype() == "INSERT"
and abs(math.hypot(e.dxf.insert.x - cx, e.dxf.insert.y - cy) - 875) < 3)
out["main_section"] = {"count": len(angs), "radius": 875.0, "first_deg": angs[0], "step_deg": round(angs[1] - angs[0], 3)}
ties = [e for e in entities("D2", -1500, -698500, 4500, -692000, "CS-RBAR") if e.dxftype() == "LINE"]
out["ties_section"] = [{"handle": e.dxf.handle, "len": round(e.dxf.start.distance(e.dxf.end), 1),
"dir": "Y" if abs(e.dxf.start.x - e.dxf.end.x) < 0.5 else "X"} for e in ties]
p = Path(__file__).resolve().parent / "판독" / "g2_values.json"
p.write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8")
print(json.dumps(out, ensure_ascii=False))
+41
View File
@@ -0,0 +1,41 @@
"""Ramp-A P1 shaft cage reading (G3: P1-1, P1-2, P2-1, P3-1, P3-2, PLATE) from D4 -> 판독/g3_values.json.
D4 elevation is schematic (upper D2,500 part drawn 12,700 long, rock line 3,900 above the bottom vs D1 7,500), so
levels come from the 구조물 치수표 (H 12,700; H1 17@600, H2 6@300, H3 34@300, H4 13@150, H5 340, H6 340) and the
chain texts ('260' / '110' at the top, '100' at the bottom). Sections G-G / J-J give radii and bar angles.
"""
import json
import math
from collections import Counter
from pathlib import Path
from dxftools import entities
out = {}
for name, (x0, y0, x1, y1) in {"G-G": (90000, -697000, 96000, -688000), "J-J": (98000, -706000, 104500, -697000)}.items():
big = [e for e in entities("D4", x0, y0, x1, y1) if e.dxftype() == "CIRCLE" and e.dxf.radius > 1000]
c = big[0].dxf.center
radii = sorted({round(e.dxf.radius, 1) for e in big if e.dxf.center.distance(c) < 1})
ins = [e for e in entities("D4", x0, y0, x1, y1) if e.dxftype() == "INSERT"]
rr = Counter(round(math.hypot(e.dxf.insert.x - c.x, e.dxf.insert.y - c.y), 1) for e in ins)
r0 = rr.most_common(1)[0][0]
a = sorted(round(math.degrees(math.atan2(e.dxf.insert.y - c.y, e.dxf.insert.x - c.x)) % 360, 3)
for e in ins if abs(math.hypot(e.dxf.insert.x - c.x, e.dxf.insert.y - c.y) - r0) < 1)
lines = [round(e.dxf.start.distance(e.dxf.end), 1) for e in entities("D4", x0, y0, x1, y1, "CS-RBAR")
if e.dxftype() == "LINE" and e.dxf.start.distance(e.dxf.end) > 1500]
out[name] = {"concrete_and_hoop_radii": radii, "bar_symbol_radius": r0, "bar_count": len(a), "first_deg": a[0],
"step_deg": round((a[-1] - a[0]) / (len(a) - 1), 4) if name == "J-J" else None, "tie_lines": lines}
H0 = 45452.0 # shaft top (D1)
hoops = [H0 - 110 - 150 * k for k in range(14)]
hoops += [hoops[-1] - 300 * k for k in range(1, 35)]
ties = [H0 - 260 - 300 * k for k in range(7)]
ties += [ties[-1] - 600 * k for k in range(1, 18)]
out["hoop_levels_from_table"] = {"count": len(hoops), "top": hoops[0], "bottom": hoops[-1],
"rule": "shaft top -110, 13@150, 34@300 (+H6 340 +100 = shaft bottom)"}
out["tie_levels_from_table"] = {"count": len(ties), "top": ties[0], "bottom": ties[-1],
"rule": "shaft top -260, 6@300, 17@600 (+H5 340 +100)"}
out["chain_check"] = {"hoops": 110 + 1950 + 10200 + 340 + 100, "ties": 260 + 1800 + 10200 + 340 + 100, "H": 12700}
out["main_span"] = {"top": hoops[0], "bottom": hoops[-1], "length": hoops[0] - hoops[-1], "P1-1 + P1-2": 8750 + 3400}
p = Path(__file__).resolve().parent / "판독" / "g3_values.json"
p.write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8")
print(json.dumps(out, ensure_ascii=False))
+198
View File
@@ -0,0 +1,198 @@
"""Ramp-A P1 coping rebar (G4: C1~C16, S1~S4) -> centreline polylines for the generic builder rebar_polylines.py.
Inputs: drawn values read from D2 / D3 (판독서 v0.1.06 §13, values typed below with their source) and the user
decisions T1-T6 (2026-10-14). Output: 판독/g4_bars.json {"bars": [...], "summary": {...}} used by add_g4.py.
Model axes: X along the coping, Y across, Z = EL x 1000; pier centre at the origin.
"""
import json
import math
from pathlib import Path
HERE = Path(__file__).resolve().parent
APP = HERE.parents[1] / "Code" / "교각모델링앱"
P = json.loads((APP / "data" / "Ramp-A교P1" / "params.json").read_text(encoding="utf-8"))
CP = P["coping"]
TL, TR = CP["z_top_left"], CP["z_top_right"] # 59952 / 60267
ZB, ZT = CP["z_bottom"], CP["z_tip"] # 57452 / 58952
SCX, SCZ = abs(CP["soffit"]["centre_x"]), CP["soffit"]["centre_z"]
bars = []
def rb(dia): # min bend radius of the centreline (as the other builders)
return ((2 * dia if dia <= 16 else 3.5 * dia) + dia) / 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": round(L, 1), "src": src})
def top(x):
return TL if x <= 0 else TR
def arc_z(x, R):
"""z of the soffit-parallel arc of radius R (centre (+-SCX, SCZ)) at x; flat zone at the column handled by caller."""
d = SCX - abs(x)
return SCZ + math.sqrt(R * R - d * d)
def face_y(z):
"""Half width of the coping side at z (2,200 above the tip level, taper to 2,000 at the column top)."""
return 1100.0 if z >= ZT else 1000.0 + 100.0 * (z - ZB) / (ZT - ZB)
# ---- top bars C1/C4 (1단), C2/C5 (2단), C3 (3단): D2 정면 작도 end points, 단면 A-A/B-B rows
ROW17 = [-1000 + 125 * k for k in range(17)]
ROW9 = [-1000 + 250 * k for k in range(9)]
TOPS = { # mark: (z, [left leg end], x_left, x_right, [right leg end], L, dia)
1: (59852.0, (-3672.0, 59030.4), -3425.6, 3492.1, (3679.3, 59031.7), 8617, 29),
2: (59752.0, (-3485.6, 59652.0), -3455.6, 3515.0, (3537.8, 59652.0), 7177, 29),
3: (59652.0, (-3515.6, 59552.0), -3485.6, 3537.8, (3560.6, 59552.0), 7230, 25),
}
for layer, (z, le, xl, xr, re_, L, dia) in TOPS.items():
ys = ROW9 if layer == 3 else ROW17
for k, y in enumerate(ys):
mark = {1: ("C1", "C4"), 2: ("C2", "C5"), 3: ("C3", "C3")}[layer][k % 2]
add(mark, f"y{y:+.0f}", [(le[0], y, le[1]), (xl, y, z), (xr, y, z), (re_[0], y, re_[1])], dia, L,
f"D2 정면 {layer}단 작도선, 단면 A-A/B-B {'@250' if layer == 3 else '@125 교번'}")
# ---- C6 soffit bars: leg 400 along the end face, R 5,100 arc, bottom 1,914 at EL 57.552 (D2 ARC 478/479); T1: 9 @250;
# the bars near the faces keep inside the side taper (y <= face - 100.2) [T1 추론]
for k in range(9):
y0 = -1000 + 250 * k
pts = [(-3557.1, y0, 59413.5)]
a0, a1 = math.radians(79.1), math.radians(43.8)
for i in range(21):
t = a0 + (a1 - a0) * i / 20
pts.append((-SCX + 5100 * math.cos(t), y0, SCZ + 5100 * math.sin(t)))
for i in range(21):
t = math.radians(180 - 43.8) + (math.radians(180 - 79.1) - math.radians(180 - 43.8)) * i / 20
pts.append((SCX + 5100 * math.cos(t), y0, SCZ + 5100 * math.sin(t)))
pts.append((3590.3, y0, 59421.7))
pts = [(x, math.copysign(min(abs(y), face_y(z) - 100.2), y) if y else 0.0, z) for x, y, z in pts]
add("C6", f"y{y0:+.0f}", pts, 25, 9003, "D2 정면 ARC 478/479 R5,100, 하면 1,914 EL 57.552; @250 9본 (T1 [추론])", r=0)
# ---- stirrups at x = -3375 ... 3375 @125 (D2 정면 55 작도선): outer C7 / C9 / C11, inner pair C8 / C10 / C12
XS = [-3375 + 125 * i for i in range(55)]
def bottom(x):
"""Stirrup bottom (centreline): 77.5 above the soffit, i.e. on R 5,077.5, flat 57,529.5 over the column."""
return ZB + 77.5 if abs(x) < 1000 else arc_z(x, 5077.5)
Z_C1 = TL - 996.7 # inner outer-leg vertical bottom (단면 A-A/B-B)
for x in XS:
zt, zb = top(x) - 77.5, bottom(x)
b = zt - zb
outer, inner = ("C7", "C8") if x < -875 else (("C9", "C10") if x <= 875 else ("C11", "C12"))
add(outer, f"x{x:+.0f}", [(x, -62.5, zt), (x, 750, zt), (x, 750, zb), (x, -875, zb), (x, -875, zt), (x, -62.5, zt)],
19, 2 * 1673 + 2 * b + 2 * 450, f"D2 정면 x {x}; 단면 B-B y -875~750; b {b:.1f}")
yb = face_y(zb) - 100.2
for s in (1, -1):
xi = x + 20 # beside the outer stirrup (T6 [추론])
p = [(xi, s * 687.5, zt), (xi, s * 1000, zt), (xi, s * 1000, Z_C1), (xi, s * yb, zb), (xi, s * 375, zb),
(xi, s * 375, zt), (xi, s * 687.5, zt)]
c2 = math.hypot(1000 - yb, Z_C1 - zb)
add(inner, f"x{x:+.0f}{'R' if s > 0 else 'L'}", p, 19, 673 + b + (yb - 375) + c2 + (zt - Z_C1) + 2 * 450,
f"단면 A-A/B-B 안쪽 모따기 스터럽, x {x}+20 [T6 추론]; c1 {zt - Z_C1:.0f} (T4)")
# ---- side loops C14 (4 levels) / C13 (6 levels): D2 정면 수평선 ends; 3 concentric loops per level (T2)
LEVELS = [ # z, x_left, x_right (D2 정면)
(59827.0, -3433.1, 3497.9), (59577.0, -3508.1, 3554.9), (59327.0, -3583.1, 3611.9), (59077.0, -3658.1, 3669.0),
(58827.0, -2927.0, 2927.1), (58577.0, -2343.2, 2343.2), (58327.0, -1903.0, 1903.1), (58077.0, -1544.6, 1544.7),
(57827.0, -1241.9, 1242.0), (57577.0, -981.2, 981.3)]
for i, (z, xl, xr) in enumerate(LEVELS):
mark = "C14" if i < 4 else "C13"
yo = min(977.5, face_y(z) - 122.7) # outer dots follow the taper (단면 B-B -968.9 ...)
for k, (yn, yp) in enumerate(((-yo, yo), (-852.5, 727.5), (-397.5, 397.5))):
a, b_ = xl + 25 * k, xr - 25 * k
p = [(0, yp, z), (b_, yp, z), (b_, yn, z), (a, yn, z), (a, yp, z), (0, yp, z)]
L = 2 * (b_ - a + 48) + 2 * (yp - yn) + 2 * 350 + (290 if mark == "C14" else 0)
add(mark, f"z{z:.0f}-{k}", p, 19, L, f"D2 정면 수평선 EL {z / 1000:.3f}; 동심 고리 {k} (T2 [추론])")
# ---- C16: raised right top, x 100~3,400 at EL 60.167, legs 350, y @125 (17)
for y in ROW17:
add("C16", f"y{y:+.0f}", [(100, y, 60167 - 350), (100, y, 60167), (3400, y, 60167), (3400, y, 60167 - 350)], 19,
4000, "D2 정면 C16 EL 60.167, x 100~3,400, 다리 350")
# ---- C15: transverse U on top, midway between stirrups, |x| <= 3,187.5 except 62.5 (T3 [추론]) -> 51
for x in [-3312.5 + 125 * i for i in range(54)]:
if abs(x) > 3187.5 or x == 62.5:
continue
z = top(x) - 77.5 - 19
add("C15", f"x{x:+.1f}", [(x, -1000, z - 350), (x, -1000, z), (x, 1000, z), (x, 1000, z - 350)], 19, 2700,
"상면 횡방향 U형, 스터럽 사이 중간 위치 (T3 [추론])")
# ---- seat bars per bearing (T5): local axes u (along, rotated), v (across); pedestal top = seat_z + h1
for bng in P["bearing_seats"]["bearings"]:
no, (cx, cy), rot = bng["no"], bng["centre"], math.radians(bng["rotation_deg"])
u = (math.sin(rot), math.cos(rot))
v = (math.cos(rot), -math.sin(rot))
zp = bng["seat_z"] + bng["h1"]
g = lambda su, sv, z: (cx + su * u[0] + sv * v[0], cy + su * u[1] + sv * v[1], z)
# S1: straight a 1,300 along u, legs 700, 11 positions along v (50|100|8@125|100|50 = 1,300)
for j, sv in enumerate([-600] + [-500 + 125 * k for k in range(9)] + [600]):
z = zp - 50
add("S1", f"B{no}-{j:02d}", [g(-650, sv, z - 700), g(-650, sv, z), g(650, sv, z), g(650, sv, z - 700)], 16, 2700,
f"교좌면 보강 E-E, 받침 {no} [T5 추론]")
# S2: straight a 1,200 along v, legs 700, 12 positions along u (9@125 + 2 edge [추론])
for j, su in enumerate([-625] + [-562.5 + 125 * k for k in range(10)] + [625]):
z = zp - 50 - 16
add("S2", f"B{no}-{j:02d}", [g(su, -600, z - 700), g(su, -600, z), g(su, 600, z), g(su, 600, z - 700)], 16, 2600,
f"교좌면 보강 E-E, 받침 {no} [T5 추론]")
# S3 (along u) / S4 (along v): 2 layers x 11, 10@125 = 1,250, straight 1,250, 345 / 445 below the pedestal top
for layer, dz in enumerate((345, 445)):
for j, s_ in enumerate([-625 + 125 * k for k in range(11)]):
add("S3", f"B{no}-{layer}{j:02d}", [g(-625, s_, zp - dz), g(625, s_, zp - dz)], 25, 1250,
f"교좌면 보강 F-F, 받침 {no}, {layer + 1}층 [T5 추론]", r=0)
add("S4", f"B{no}-{layer}{j:02d}", [g(s_, -625, zp - dz - 25), g(s_, 625, zp - dz - 25)], 25, 1250,
f"교좌면 보강 F-F, 받침 {no}, {layer + 1}층 [T5 추론]", r=0)
# ---- plan-corner clipping [추론, 울산 R500 모서리 단축과 같은 방식]: the end face is convex in plan (corner 3,650 at the
# tip level vs 3,800 at y = 0), so points nearer than cover 40 (+ bar radius) to it are pulled inwards in x
PE = CP["plan_end"]
RP = (PE["half_width"] ** 2 + (PE["tip_x"] - PE["corner_x"]) ** 2) / (2 * (PE["tip_x"] - PE["corner_x"]))
def face_x(y, z, sx):
xa = PE["tip_x"] - (RP - math.sqrt(RP * RP - min(abs(y), PE["half_width"]) ** 2))
zt = TL if sx < 0 else TR
return xa + (z - ZT) / (zt - ZT) * (CP["top_half"] - xa)
DIA = {"C1": 29, "C2": 29, "C3": 25, "C4": 29, "C5": 29, "C6": 25, "C13": 19, "C14": 19}
clipped = {}
for b in bars:
m = b["mark"]
if m not in DIA:
continue
r = DIA[m] / 2
pts = b["pts"]
if m in ("C13", "C14"): # keep the loop rectangular: one limit per short side
ymax = max(abs(p[1]) for p in pts)
for sx in (-1, 1):
lim = min(face_x(ymax + r, p[2], sx) for p in pts) - (r + 40)
if any(p[0] * sx > lim for p in pts):
clipped[m] = clipped.get(m, 0) + 1
for p in pts:
if p[0] * sx > 0 and abs(p[0]) > 1:
p[0] = round(sx * min(abs(p[0]), lim), 2)
continue
hit = False
for p in pts:
sx = 1 if p[0] > 0 else -1
lim = face_x(abs(p[1]) + r, p[2], sx) - (r + 40)
if abs(p[0]) > lim:
p[0] = round(sx * lim, 2)
hit = True
clipped[m] = clipped.get(m, 0) + hit
if hit:
b["src"] += "; 평면 모서리 단축 [추론]"
count = {}
for b in bars:
count[b["mark"]] = count.get(b["mark"], 0) + 1
out = {"bars": bars, "summary": {"bars": len(bars), "per_mark": count, "corner_clipped": clipped}}
(HERE / "판독" / "g4_bars.json").write_text(json.dumps(out, ensure_ascii=False), encoding="utf-8")
print(json.dumps(out["summary"], ensure_ascii=False))
+136
View File
@@ -0,0 +1,136 @@
"""Create the app pier 'Ramp-A교P1' (form "single shaft", scope G1 + G5) through the web client:
new pier (Ulsan template as a starting copy), upload copies of the four RAG DWGs, then write params / expected
from the reading (판독/g1_values.json, D1 tables; DOC/02_분석/분석_Ramp-A교P1교각도면판독_2026-10-13_v0.1.00.md).
params = drawn values (handles), user decisions R1-R4 (2026-10-13).
expected = dimension / EL texts and the D1 tables, typed in by hand; two drawn-only inputs marked [작도].
usage: python make_pier.py (refuses if the pier already exists)
"""
import json
import math
import sys
from io import BytesIO
from pathlib import Path
HERE = Path(__file__).resolve().parent
ROOT = HERE.parents[1]
APP = ROOT / "Code" / "교각모델링앱"
sys.path.insert(0, str(APP / "web"))
sys.path.insert(0, str(APP))
import app as webapp # noqa: E402
import store # noqa: E402
NAME = "Ramp-A교P1"
V = json.loads((HERE / "판독" / "g1_values.json").read_text(encoding="utf-8"))
cp = V["coping"]
def circle_centre(a, b, r):
"""Centre (lower side) of the radius-r circle through a and b."""
(ax, az), (bx, bz) = a, b
mx, mz = (ax + bx) / 2, (az + bz) / 2
d = math.hypot(bx - ax, bz - az)
h = math.sqrt(r * r - d * d / 4)
ux, uz = (bz - az) / d, -(bx - ax) / d
return min(((mx + h * ux, mz + h * uz), (mx - h * ux, mz - h * uz)), key=lambda c: c[1])
ZB, ZT = V["column"]["z1"], cp["end_left_front"]["bottom"][1]
cx, cz = circle_centre((-1000.0, ZB), (-3800.0, ZT), 5000.0)
bear = {1: dict(el_x=60112, seat_z=cp["top_left"]["z"]), 2: dict(el_x=60427, seat_z=cp["top_right"]["z"])}
params = {
"_schema": "pier-T/1",
"pier_id": "P1",
"_meta": {"structure": "Ramp-A교 P1 교각 (T형 계열: 단주 + Y형 코핑 + 단일 현장타설말뚝)",
"status": "형상(G1)·받침(G5) 판독 2026-10-13, 결정 R1~R4 사용자 확정. 철근 G2~G4 미판독(범위 밖)",
"units": "mm; Z = EL x 1000",
"frame": "X 교축직각(정면도 좌→우), Y 교축(평면도 아래→위), 원점 = 교각 중심",
"sources": {"D1": "RAG/Ramp-A교 P1 교각(1).dwg 일반도", "D2": "(2) 코핑·기둥 배근(1)",
"D3": "(3) 주철근 조립도·재료표", "D4": "(4) 기둥 재료표·떠오름 방지 PLATE"},
"reading": "DOC/02_분석/분석_Ramp-A교P1교각도면판독_2026-10-13_v0.1.00.md, Code/RampA판독/판독/g1_values.json"},
"scope": ["G1", "G5"],
"builders": {"G1": "concrete_shaft.py"},
"pile": {"segments": [{"d": V["pile_lower"]["d"], "z0": V["pile_lower"]["z0"], "z1": V["pile_lower"]["z1"]},
{"d": V["pile_upper"]["d"], "z0": V["pile_upper"]["z0"], "z1": V["pile_upper"]["z1"]}],
"kind": "현장타설말뚝 (암반 근입 Ø2,350 + 상부 Ø2,500)",
"src": f"D1 정면 {V['pile_lower']['src']}; {V['pile_upper']['src']}; 상부 Ø2,500은 '75, 2,350, 75' 표기(케이싱 포함 가능) — 작도선대로 콘크리트"},
"column": {"shape": "circular", "diameter": V["column"]["d"], "z0": V["column"]["z0"], "z1": V["column"]["z1"],
"src": f"D1 정면 {V['column']['src']}"},
"coping": {"form": "y_shaft", "z_bottom": ZB, "z_tip": ZT, "half_bottom": 1000.0,
"soffit": {"centre_x": round(cx, 4), "centre_z": round(cz, 4), "radius": 5000.0},
"z_top_left": cp["top_left"]["z"], "z_top_right": cp["top_right"]["z"], "top_half": 3500.0,
"plan_end": {"corner_x": abs(cp["plan_end_left"]["corner_bottom_x"]), "tip_x": 3800.0,
"half_width": cp["plan_end_left"]["half_width"]},
"side": {"half_width_top": cp["side"]["half_width_top"], "half_width_bottom": 1000.0},
"src": {"front": "D1 정면 856/854/855 상면, 857/7D1 끝면, ARC 501/4FF R5,000 (중심은 기둥면·끝 하단 두 점과 R로 재계산)",
"side": cp["side"]["src"], "plan_end": f"{cp['plan_end_left']['src']} / {cp['plan_end_right']['src']}",
"decisions": "R2 직사각 단면(정면 ∩ 측면), R3 우측 상단 3,500(평면값; 정면 작도 3,495.1)",
"not_modelled": "R1 장식 홈(상세 B, 30x30 2줄)"}},
"materials": {"fck": {"pile": "35MPa", "column": "40MPa", "coping": "40MPa", "seat": "40MPa"},
"src": "D1 NOTE '기둥 (40MPa), 코핑 (40MPa), 현장타설말뚝 (35MPa)'; 대좌 40 [추론]"},
"bearing_seats": {
"_note": "pedestal = C3 (along) x C6 (across) box per bearing (h1), rotated as drawn; pad (h2) = frustum (A+200)x(B+200) -> (A+100)x(B+100)",
"pedestal": {"size_x": 1300.0, "size_y": 1400.0}, "pad_margin_bottom": 200, "pad_margin_top": 100,
"bearings": [dict(no=no, type="7000 kN", centre=V["plan"][str(no)]["pedestal"]["centre"],
rotation_deg=V["plan"][str(no)]["pedestal"]["rotation_deg"], h1=110, h2=50, A=900, B=800,
**bear[no]) for no in (1, 2)],
"src": "D1 평면 49D~4A0 / 4A5~4A8 (대좌), 486~48B (패드·받침), ELEVATION TABLE h1·h2·A·B·C3·C6"},
"sole_plates": {"table": [{"no": no, "S": -5.526, "L": 1000, "W": 900, "T": 50, "T1": 78, "T2": 22} for no in (1, 2)],
"h3": 190, "bearing_size": "AB", "bearing_shrink": 100,
"colours": {"bearing": [0, 0, 0], "sole_plate": [150, 150, 150]},
"sole_plate_src": "D1 솔플레이트 상세 TABLE (S, L, W, T, T1, T2); L 교축 방향; S < 0 -> 두꺼운 쪽 -Y (R4, 운곡교 규칙 [추론])",
"src": "교량받침 = A x B (900 x 800), h3 190 (ELEVATION TABLE); 솔플레이트 T = h4 50"},
"rebar_marks": {},
"rebar_marks_src": "철근 G2~G4 다음 Task",
}
expected = {
"_schema": "pier-T-expected/1",
"_note": "독립 기대값: D1 치수 문자·EL 문자·표에서 옮긴 값. params와 별도. [작도] = 치수 문자 없음(작도값)",
"pier_id": "P1",
"tol_mm": 1.0,
"checkers": {"G1": "g1_shaft.py"},
"negative": {"G1": [{"id": "BS02", "d": [3, 0, 0]}, {"id": "BP01", "d": [0, 0, 2]}],
"G5": [{"id": "BB02", "d": [5, 0, 0]}, {"id": "SP01", "d": [0, 0, 5]}]},
"planned_fail": [],
"G1": {
"pile": {"z_bottom": 32752, "segments": [{"d": 2350, "length": 7500}, {"d": 2500, "length": 5200}],
"src": "'EL=32.752', '75, 2,350, 75', '2,500', '7,500', '5,200'"},
"column": {"d": 2000, "z0": 45452, "length": 12000, "src": "'2,000', 'EL=45.452', '11,500' + '500'"},
"coping": {"top_length": 7000, "bottom_length": 7600, "column_face_half": 1000, "soffit_rise": 1500,
"soffit_radius": 5000, "width_y": 2200, "side_bottom_width": 2000, "z_top_left": 59952,
"z_top_right": 60267, "top_step": 315, "plan_end_corner_x": 3650,
"src": "'7,000', '7,600' (2,800+2,000+2,800), '1,500', '1,000', 'R=5,000', '2,200' (1,100+1,100), "
"'EL=59.952', 'EL=60.267', '315'; plan_end_corner_x [작도] D1 평면 51A"},
"total_height": 27200,
"seats": {"table": {"1": [60112, 110, 50, 900, 800], "2": [60427, 110, 50, 900, 800]},
"pos": {"1": [-2250, 0], "2": [2250, 0]}, "pedestal_along": 1400, "pedestal_across": 1300,
"rotation_deg": {"1": -5.55, "2": -9.194}, "pad_margin": [200, 100],
"src": "ELEVATION TABLE; 평면 '2,250' x2; C3 1,400, C6 1,300; rotation [작도] D1 평면"},
},
"G5": {"el_x": {"1": 60112, "2": 60427}, "S": {"1": -5.526, "2": -5.526}, "W": {"1": 900, "2": 900},
"L": 1000, "T": 50, "h3": 190, "bearing_size": {"1": [900, 800], "2": [900, 800]}, "bearing_shrink": 100,
"thick_end": "-Y", "colours": {"bearing": [0, 0, 0], "sole_plate": [150, 150, 150]},
"src": "ELEVATION TABLE (EL.'X', h3, A, B, h4 = T); 솔플레이트 상세 TABLE (S, L, W, T1 78 / T2 22 -> 두꺼운 쪽 -Y, R4)"},
}
if __name__ == "__main__":
if (store.DATA / NAME).exists():
sys.exit(f"pier exists: {NAME}")
c = webapp.app.test_client()
r = c.post("/pier/new", data={"name": NAME, "type": "T형", "template": "tpl:산외교울산P1형"})
assert r.status_code == 302, r.status_code
dwgs = sorted((ROOT / "RAG").glob("Ramp-A교 P1 교각(*).dwg"))
r = c.post(f"/pier/{NAME}/upload", data={"dwg": [(BytesIO(p.read_bytes()), p.name) for p in dwgs]},
content_type="multipart/form-data")
assert r.status_code == 302, r.status_code
p = store.Pier(NAME)
params["display"] = p.load("params")["display"] # Ulsan display (layers incl. 말뚝, palette)
expected["rebar_palette"] = p.load("expected")["rebar_palette"]
p.save("params", params)
p.save("expected", expected)
meta = store.rjson(p.dir / "pier.json")
meta["template"] = "신규 판독 (Ramp-A교 P1 판독서 v0.1.00)"
store.wjson(p.dir / "pier.json", meta)
print("created", p.dir, "texts", len(p.texts()))
+17
View File
@@ -0,0 +1,17 @@
"""Run gates G1 then G5 of the app pier 'Ramp-A교P1' with the engine (no confirmation / approval: those are the
user's review records in the app). Results: data/Ramp-A교P1/runs/current/G*_gate.json, G*.3dm.
usage: python run_gates.py [G1|G5 ...]"""
import json
import sys
from pathlib import Path
APP = Path(__file__).resolve().parents[2] / "Code" / "교각모델링앱"
sys.path.insert(0, str(APP))
from engine.gates import run_gate # noqa: E402
D = APP / "data" / "Ramp-A교P1"
for g in sys.argv[1:] or ["G1", "G5"]:
rep = run_gate(g, D / "params.json", D / "expected.json", D / "runs" / "current")
print(json.dumps({k: rep[k] for k in ("gate", "verdict", "summary", "unplanned_fails", "reload", "secs")}, ensure_ascii=False))
if rep["verdict"] != "PASS":
break
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

@@ -0,0 +1,178 @@
4FF CS-CONC-MAJR ARC c(90680.5,-480092.3) r 5000.0 99.7..136.7
500 CS-CONC-MAJR ARC c(90680.5,-480092.3) r 5000.0 99.7..136.7
501 CS-CONC-MAJR ARC c(81402.9,-480092.3) r 5000.0 43.3..80.3
502 CS-CONC-MAJR ARC c(81402.9,-480092.3) r 5000.0 43.3..80.3
74A CS-CONC-MAJR ARC c(84773.7,-494123.1) r 94.4 298.1..61.9
74B CS-CONC-MAJR ARC c(84773.7,-495289.7) r 94.4 349.8..61.9
74C CS-CONC-MAJR ARC c(84773.7,-494956.4) r 94.4 298.1..61.9
74D CS-CONC-MAJR ARC c(84773.7,-495123.1) r 94.4 298.1..61.9
74E CS-CONC-MAJR ARC c(84773.7,-494789.7) r 94.4 298.1..61.9
74F CS-CONC-MAJR ARC c(84773.7,-493789.7) r 94.4 298.1..308.9
750 CS-CONC-MAJR ARC c(84773.7,-493956.4) r 94.4 298.1..61.9
751 CS-CONC-MAJR ARC c(84773.7,-494289.7) r 94.4 298.1..61.9
752 CS-CONC-MAJR ARC c(84773.7,-494456.4) r 94.4 298.1..61.9
753 CS-CONC-MAJR ARC c(84773.7,-494623.1) r 94.4 298.1..61.9
754 CS-CONC-MAJR ARC c(87309.7,-494123.1) r 94.4 118.1..241.9
755 CS-CONC-MAJR ARC c(87309.7,-495289.7) r 94.4 118.1..190.2
756 CS-CONC-MAJR ARC c(87309.7,-494956.4) r 94.4 118.1..241.9
757 CS-CONC-MAJR ARC c(87309.7,-495123.1) r 94.4 118.1..241.9
758 CS-CONC-MAJR ARC c(87309.7,-494789.7) r 94.4 118.1..241.9
759 CS-CONC-MAJR ARC c(87309.7,-493789.7) r 94.4 231.1..241.9
75A CS-CONC-MAJR ARC c(87309.7,-493956.4) r 94.4 118.1..241.9
75B CS-CONC-MAJR ARC c(87309.7,-494289.7) r 94.4 118.1..241.9
75C CS-CONC-MAJR ARC c(87309.7,-494456.4) r 94.4 118.1..241.9
75D CS-CONC-MAJR ARC c(87309.7,-494623.1) r 94.4 118.1..241.9
75E CS-CONC-MAJR ARC c(84773.7,-496123.1) r 94.4 298.1..61.9
75F CS-CONC-MAJR ARC c(84773.7,-497289.7) r 94.4 349.8..61.9
760 CS-CONC-MAJR ARC c(84773.7,-496956.4) r 94.4 298.1..61.9
761 CS-CONC-MAJR ARC c(84773.7,-497123.1) r 94.4 298.1..61.9
762 CS-CONC-MAJR ARC c(84773.7,-496789.7) r 94.4 298.1..61.9
763 CS-CONC-MAJR ARC c(84773.7,-495289.7) r 94.4 298.1..0.0
764 CS-CONC-MAJR ARC c(84773.7,-495456.4) r 94.4 298.1..61.9
765 CS-CONC-MAJR ARC c(84773.7,-495623.1) r 94.4 298.1..61.9
766 CS-CONC-MAJR ARC c(84773.7,-495789.7) r 94.4 298.1..61.9
767 CS-CONC-MAJR ARC c(84773.7,-495956.4) r 94.4 298.1..61.9
768 CS-CONC-MAJR ARC c(84773.7,-496289.7) r 94.4 298.1..61.9
769 CS-CONC-MAJR ARC c(84773.7,-496456.4) r 94.4 298.1..61.9
76A CS-CONC-MAJR ARC c(84773.7,-496623.1) r 94.4 298.1..61.9
76B CS-CONC-MAJR ARC c(87309.7,-496123.1) r 94.4 118.1..241.9
76C CS-CONC-MAJR ARC c(87309.7,-497289.7) r 94.4 118.1..190.2
76D CS-CONC-MAJR ARC c(87309.7,-496956.4) r 94.4 118.1..241.9
76E CS-CONC-MAJR ARC c(87309.7,-497123.1) r 94.4 118.1..241.9
76F CS-CONC-MAJR ARC c(87309.7,-496789.7) r 94.4 118.1..241.9
770 CS-CONC-MAJR ARC c(87309.7,-495289.7) r 94.4 180.0..241.9
771 CS-CONC-MAJR ARC c(87309.7,-495456.4) r 94.4 118.1..241.9
772 CS-CONC-MAJR ARC c(87309.7,-495623.1) r 94.4 118.1..241.9
773 CS-CONC-MAJR ARC c(87309.7,-495789.7) r 94.4 118.1..241.9
774 CS-CONC-MAJR ARC c(87309.7,-495956.4) r 94.4 118.1..241.9
775 CS-CONC-MAJR ARC c(87309.7,-496289.7) r 94.4 118.1..241.9
776 CS-CONC-MAJR ARC c(87309.7,-496456.4) r 94.4 118.1..241.9
777 CS-CONC-MAJR ARC c(87309.7,-496623.1) r 94.4 118.1..241.9
778 CS-CONC-MAJR ARC c(84772.3,-498163.2) r 94.4 298.1..61.9
779 CS-CONC-MAJR ARC c(84772.3,-499329.9) r 94.4 349.8..61.9
77A CS-CONC-MAJR ARC c(84772.3,-498996.5) r 94.4 298.1..61.9
77B CS-CONC-MAJR ARC c(84772.3,-499163.2) r 94.4 298.1..61.9
77C CS-CONC-MAJR ARC c(84772.3,-498829.9) r 94.4 298.1..61.9
77D CS-CONC-MAJR ARC c(84772.3,-497329.9) r 94.4 298.1..0.0
77E CS-CONC-MAJR ARC c(84772.3,-497496.5) r 94.4 298.1..61.9
77F CS-CONC-MAJR ARC c(84772.3,-497663.2) r 94.4 298.1..61.9
780 CS-CONC-MAJR ARC c(84772.3,-497829.9) r 94.4 298.1..61.9
781 CS-CONC-MAJR ARC c(84772.3,-497996.5) r 94.4 298.1..61.9
782 CS-CONC-MAJR ARC c(84772.3,-498329.9) r 94.4 298.1..61.9
783 CS-CONC-MAJR ARC c(84772.3,-498496.5) r 94.4 298.1..61.9
784 CS-CONC-MAJR ARC c(84772.3,-498663.2) r 94.4 298.1..61.9
785 CS-CONC-MAJR ARC c(87308.2,-498163.2) r 94.4 118.1..241.9
786 CS-CONC-MAJR ARC c(87308.2,-499329.9) r 94.4 118.1..190.2
787 CS-CONC-MAJR ARC c(87308.2,-498996.5) r 94.4 118.1..241.9
788 CS-CONC-MAJR ARC c(87308.2,-499163.2) r 94.4 118.1..241.9
789 CS-CONC-MAJR ARC c(87308.2,-498829.9) r 94.4 118.1..241.9
78A CS-CONC-MAJR ARC c(87308.2,-497329.9) r 94.4 180.0..241.9
78B CS-CONC-MAJR ARC c(87308.2,-497496.5) r 94.4 118.1..241.9
78C CS-CONC-MAJR ARC c(87308.2,-497663.2) r 94.4 118.1..241.9
78D CS-CONC-MAJR ARC c(87308.2,-497829.9) r 94.4 118.1..241.9
78E CS-CONC-MAJR ARC c(87308.2,-497996.5) r 94.4 118.1..241.9
78F CS-CONC-MAJR ARC c(87308.2,-498329.9) r 94.4 118.1..241.9
790 CS-CONC-MAJR ARC c(87308.2,-498496.5) r 94.4 118.1..241.9
791 CS-CONC-MAJR ARC c(87308.2,-498663.2) r 94.4 118.1..241.9
858 CS-CONC-MAJR ARC c(84773.7,-500179.9) r 94.4 298.1..61.9
859 CS-CONC-MAJR ARC c(84773.7,-501346.5) r 94.4 349.8..61.9
85A CS-CONC-MAJR ARC c(84773.7,-501013.2) r 94.4 298.1..61.9
85B CS-CONC-MAJR ARC c(84773.7,-501179.9) r 94.4 298.1..61.9
85C CS-CONC-MAJR ARC c(84773.7,-500846.5) r 94.4 298.1..61.9
85D CS-CONC-MAJR ARC c(84773.7,-499346.5) r 94.4 298.1..0.0
85E CS-CONC-MAJR ARC c(84773.7,-499513.2) r 94.4 298.1..61.9
85F CS-CONC-MAJR ARC c(84773.7,-499679.9) r 94.4 298.1..61.9
860 CS-CONC-MAJR ARC c(84773.7,-499846.5) r 94.4 298.1..61.9
861 CS-CONC-MAJR ARC c(84773.7,-500013.2) r 94.4 298.1..61.9
862 CS-CONC-MAJR ARC c(84773.7,-500346.5) r 94.4 298.1..61.9
863 CS-CONC-MAJR ARC c(84773.7,-500513.2) r 94.4 298.1..61.9
864 CS-CONC-MAJR ARC c(84773.7,-500679.9) r 94.4 298.1..61.9
865 CS-CONC-MAJR ARC c(87309.7,-500179.9) r 94.4 118.1..241.9
866 CS-CONC-MAJR ARC c(87309.7,-501346.5) r 94.4 118.1..190.2
867 CS-CONC-MAJR ARC c(87309.7,-501013.2) r 94.4 118.1..241.9
868 CS-CONC-MAJR ARC c(87309.7,-501179.9) r 94.4 118.1..241.9
869 CS-CONC-MAJR ARC c(87309.7,-500846.5) r 94.4 118.1..241.9
86A CS-CONC-MAJR ARC c(87309.7,-499346.5) r 94.4 180.0..241.9
86B CS-CONC-MAJR ARC c(87309.7,-499513.2) r 94.4 118.1..241.9
86C CS-CONC-MAJR ARC c(87309.7,-499679.9) r 94.4 118.1..241.9
86D CS-CONC-MAJR ARC c(87309.7,-499846.5) r 94.4 118.1..241.9
86E CS-CONC-MAJR ARC c(87309.7,-500013.2) r 94.4 118.1..241.9
86F CS-CONC-MAJR ARC c(87309.7,-500346.5) r 94.4 118.1..241.9
870 CS-CONC-MAJR ARC c(87309.7,-500513.2) r 94.4 118.1..241.9
871 CS-CONC-MAJR ARC c(87309.7,-500679.9) r 94.4 118.1..241.9
55A CS-CONC-MAJR LINE (85041.7,-476663.2)-(87041.7,-476663.2) len 2000.0
60F CS-CONC-MAJR LINE (85041.7,-488663.2)-(85041.7,-476663.2) len 12000.0
610 CS-CONC-MAJR LINE (87041.7,-488663.2)-(87041.7,-476663.2) len 12000.0
7D1 CS-CONC-MAJR LINE (89841.7,-475163.2)-(89536.8,-473848.2) len 1349.9
81E CS-CONC-MAJR LINE (87641.7,-473848.2)-(88941.7,-473848.2) len 1300.0
81F CS-CONC-MAJR LINE (88666.7,-473638.2)-(87916.7,-473638.2) len 750.0
820 CS-CONC-MAJR LINE (88666.7,-473588.2)-(88666.7,-473638.2) len 50.0
821 CS-CONC-MAJR LINE (87916.7,-473588.2)-(88666.7,-473588.2) len 750.0
822 CS-CONC-MAJR LINE (87916.7,-473638.2)-(87916.7,-473588.2) len 50.0
823 CS-CONC-MAJR LINE (88291.7,-473688.2)-(88291.7,-473638.2) len 50.0
824 CS-CONC-MAJR LINE (88291.7,-473688.2)-(88291.7,-473638.2) len 50.0
825 CS-CONC-MAJR LINE (88141.7,-473688.2)-(88141.7,-473638.2) len 50.0
826 CS-CONC-MAJR LINE (88441.7,-473688.2)-(88441.7,-473638.2) len 50.0
827 CS-CONC-MAJR LINE (88091.7,-473688.2)-(88091.7,-473638.2) len 50.0
828 CS-CONC-MAJR LINE (88491.7,-473688.2)-(88491.7,-473638.2) len 50.0
829 CS-CONC-MAJR LINE (88062.6,-473688.2)-(88062.6,-473638.2) len 50.0
82A CS-CONC-MAJR LINE (88520.8,-473688.2)-(88520.8,-473638.2) len 50.0
82B CS-CONC-MAJR LINE (88046.8,-473688.2)-(88046.8,-473638.2) len 50.0
82C CS-CONC-MAJR LINE (88536.6,-473688.2)-(88536.6,-473638.2) len 50.0
82D CS-CONC-MAJR LINE (88541.7,-473688.2)-(88041.7,-473688.2) len 500.0
82E CS-CONC-MAJR LINE (88541.7,-473638.2)-(88541.7,-473688.2) len 50.0
82F CS-CONC-MAJR LINE (88041.7,-473638.2)-(88541.7,-473638.2) len 500.0
830 CS-CONC-MAJR LINE (88041.7,-473688.2)-(88041.7,-473638.2) len 50.0
831 CS-CONC-MAJR LINE (88641.7,-473738.2)-(87941.7,-473738.2) len 700.0
832 CS-CONC-MAJR LINE (88591.7,-473688.2)-(88641.7,-473738.2) len 70.7
833 CS-CONC-MAJR LINE (87991.7,-473688.2)-(88591.7,-473688.2) len 600.0
834 CS-CONC-MAJR LINE (87941.7,-473738.2)-(87991.7,-473688.2) len 70.7
835 CS-CONC-MAJR LINE (88941.7,-473738.2)-(88941.7,-473848.2) len 110.0
836 CS-CONC-MAJR LINE (87641.7,-473738.2)-(88941.7,-473738.2) len 1300.0
837 CS-CONC-MAJR LINE (87641.7,-473848.2)-(87641.7,-473738.2) len 110.0
838 CS-CONC-MAJR LINE (83141.7,-474163.2)-(84441.7,-474163.2) len 1300.0
839 CS-CONC-MAJR LINE (84166.7,-473953.2)-(83416.7,-473953.2) len 750.0
83A CS-CONC-MAJR LINE (84166.7,-473903.2)-(84166.7,-473953.2) len 50.0
83B CS-CONC-MAJR LINE (83416.7,-473903.2)-(84166.7,-473903.2) len 750.0
83C CS-CONC-MAJR LINE (83416.7,-473953.2)-(83416.7,-473903.2) len 50.0
83D CS-CONC-MAJR LINE (83791.7,-474003.2)-(83791.7,-473953.2) len 50.0
83E CS-CONC-MAJR LINE (83791.7,-474003.2)-(83791.7,-473953.2) len 50.0
83F CS-CONC-MAJR LINE (83641.7,-474003.2)-(83641.7,-473953.2) len 50.0
840 CS-CONC-MAJR LINE (83941.7,-474003.2)-(83941.7,-473953.2) len 50.0
841 CS-CONC-MAJR LINE (83591.7,-474003.2)-(83591.7,-473953.2) len 50.0
842 CS-CONC-MAJR LINE (83991.7,-474003.2)-(83991.7,-473953.2) len 50.0
843 CS-CONC-MAJR LINE (83562.6,-474003.2)-(83562.6,-473953.2) len 50.0
844 CS-CONC-MAJR LINE (84020.8,-474003.2)-(84020.8,-473953.2) len 50.0
845 CS-CONC-MAJR LINE (83546.8,-474003.2)-(83546.8,-473953.2) len 50.0
846 CS-CONC-MAJR LINE (84036.6,-474003.2)-(84036.6,-473953.2) len 50.0
847 CS-CONC-MAJR LINE (84041.7,-474003.2)-(83541.7,-474003.2) len 500.0
848 CS-CONC-MAJR LINE (84041.7,-473953.2)-(84041.7,-474003.2) len 50.0
849 CS-CONC-MAJR LINE (83541.7,-473953.2)-(84041.7,-473953.2) len 500.0
84A CS-CONC-MAJR LINE (83541.7,-474003.2)-(83541.7,-473953.2) len 50.0
84B CS-CONC-MAJR LINE (84141.7,-474053.2)-(83441.7,-474053.2) len 700.0
84C CS-CONC-MAJR LINE (84091.7,-474003.2)-(84141.7,-474053.2) len 70.7
84D CS-CONC-MAJR LINE (83491.7,-474003.2)-(84091.7,-474003.2) len 600.0
84E CS-CONC-MAJR LINE (83441.7,-474053.2)-(83491.7,-474003.2) len 70.7
84F CS-CONC-MAJR LINE (84441.7,-474053.2)-(84441.7,-474163.2) len 110.0
850 CS-CONC-MAJR LINE (83141.7,-474053.2)-(84441.7,-474053.2) len 1300.0
851 CS-CONC-MAJR LINE (83141.7,-474163.2)-(83141.7,-474053.2) len 110.0
854 CS-CONC-MAJR LINE (86041.7,-473848.2)-(89536.8,-473848.2) len 3495.1
855 CS-CONC-MAJR LINE (86041.7,-473848.2)-(86041.7,-474163.2) len 315.0
856 CS-CONC-MAJR LINE (82541.7,-474163.2)-(86041.7,-474163.2) len 3500.0
857 CS-CONC-MAJR LINE (82241.7,-475163.2)-(82541.7,-474163.2) len 1044.0
872 CS-CONC-MAJR LINE (84866.7,-493863.2)-(87216.7,-493863.2) len 2350.0
873 CS-CONC-MAJR LINE (84866.7,-493863.2)-(84866.7,-501363.2) len 7500.0
874 CS-CONC-MAJR LINE (84791.7,-493863.2)-(84866.7,-493863.2) len 75.0
875 CS-CONC-MAJR LINE (87216.7,-493863.2)-(87216.7,-501363.2) len 7500.0
876 CS-CONC-MAJR LINE (87291.7,-493863.2)-(87216.7,-493863.2) len 75.0
87E CS-CONC-MAJR LINE (84866.7,-501363.2)-(87216.7,-501363.2) len 2350.0
87F CS-CONC-MAJR LINE (87291.7,-493218.3)-(87291.7,-488663.2) len 4555.1
880 CS-CONC-MAJR LINE (87291.7,-493863.2)-(87291.7,-493218.3) len 644.9
881 CS-CONC-MAJR LINE (84791.7,-493218.3)-(84791.7,-488663.2) len 4555.1
882 CS-CONC-MAJR LINE (84791.7,-493863.2)-(84791.7,-493218.3) len 644.9
883 CS-CNTL LINE (86041.7,-493218.3)-(86041.7,-501363.2) len 8144.9
884 CS-CNTL LINE (86041.7,-488663.2)-(86041.7,-493218.3) len 4555.1
885 CS-CNTL LINE (86041.7,-473158.2)-(86041.7,-488663.2) len 15505.0
89E CC-GRND LINE (81441.7,-488163.2)-(90611.1,-488163.2) len 9169.4
89F CS-CONC-MAJR LINE (84791.7,-488663.2)-(87291.7,-488663.2) len 2500.0
7DC CS-CONC-MAJR PLINE closed=False [(np.float64(84591.7), np.float64(-474163.2)), (np.float64(85855.3), np.float64(-476150.9)), (np.float64(86228.1), np.float64(-476150.9)), (np.float64(87662.4), np.float64(-473848.2))]
Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

+214
View File
@@ -0,0 +1,214 @@
{
"coping": {
"top_left": {
"x0": -3500.0,
"x1": 0.0,
"z": 59952.0,
"src": "D1 856"
},
"top_right": {
"x0": 0.0,
"x1": 3495.1,
"z": 60267.0,
"src": "D1 854"
},
"end_left_front": {
"bottom": [
-3800.0,
58952.0
],
"top": [
-3500.0,
59952.0
],
"src": "D1 857"
},
"end_right_front": {
"bottom": [
3800.0,
58952.0
],
"top": [
3495.1,
60267.0
],
"src": "D1 7D1"
},
"soffit_left": {
"centre": [
-4638.8,
54022.9
],
"radius": 5000.0,
"ends": [
[
-1000.0,
57452.0
],
[
-3800.0,
58952.0
]
],
"src": "D1 ARC 501"
},
"soffit_right": {
"centre": [
4638.8,
54022.9
],
"radius": 5000.0,
"ends": [
[
3800.0,
58952.0
],
[
1000.0,
57452.0
]
],
"src": "D1 ARC 4FF"
},
"column_top_z": 57452.0,
"side": {
"half_width_top": 1100.0,
"taper": {
"from": [
-1100.0,
58952.0
],
"to": [
-1000.0,
57452.0
]
},
"src": "D1 측면도 520/521 (2,200), 503/504 (2,200 -> 2,000)"
},
"plan_end_left": {
"top_edge_x": -3500.0,
"corner_bottom_x": -3650.0,
"half_width": 1100.0,
"sagitta": 150.0,
"radius": 4108.3,
"src": "D1 평면 51A bulge 0.136"
},
"plan_end_right": {
"top_edge_x": 3500.0,
"corner_bottom_x": 3650.0,
"half_width": 1100.0,
"sagitta": 150.0,
"radius": 4108.3,
"src": "D1 평면 519 bulge -0.136"
}
},
"column": {
"d": 2000.0,
"z0": 45452.0,
"z1": 57452.0,
"src": "D1 60F/610"
},
"pile_upper": {
"d": 2500.0,
"z0": 40252.0,
"z1": 45452.0,
"src": "D1 880-87F / 882-881, 89F"
},
"pile_lower": {
"d": 2350.0,
"z0": 32752.0,
"z1": 40252.0,
"src": "D1 873/875, 87E"
},
"ground_z": 45952.0,
"plan": {
"1": {
"pedestal": {
"centre": [
-2250.0,
0.0
],
"along": 1400.0,
"across": 1300.0,
"rotation_deg": -5.55,
"src": "D1 평면 49D/49E/49F/4A0"
},
"pads": [
{
"centre": [
-2250.0,
0.0
],
"along": 900.0,
"across": 800.0,
"rotation_deg": -5.55,
"src": "D1 평면 486"
},
{
"centre": [
-2250.0,
0.0
],
"along": 1000.0,
"across": 900.0,
"rotation_deg": -5.55,
"src": "D1 평면 487"
},
{
"centre": [
-2250.0,
0.0
],
"along": 1100.0,
"across": 1000.0,
"rotation_deg": -5.55,
"src": "D1 평면 488"
}
]
},
"2": {
"pedestal": {
"centre": [
2250.0,
0.0
],
"along": 1400.0,
"across": 1300.0,
"rotation_deg": -9.194,
"src": "D1 평면 4A5/4A6/4A7/4A8"
},
"pads": [
{
"centre": [
2250.0,
0.0
],
"along": 900.0,
"across": 800.0,
"rotation_deg": -9.194,
"src": "D1 평면 489"
},
{
"centre": [
2250.0,
0.0
],
"along": 1000.0,
"across": 900.0,
"rotation_deg": -9.194,
"src": "D1 평면 48A"
},
{
"centre": [
2250.0,
0.0
],
"along": 1100.0,
"across": 1000.0,
"rotation_deg": -9.194,
"src": "D1 평면 48B"
}
]
}
}
}
+46
View File
@@ -0,0 +1,46 @@
{
"chain_hoop_EL": [
43492.0,
45492.0,
47592.0,
59292.0,
59852.0,
59952.0
],
"chain_tie_EL": [
45492.0,
47592.0,
59292.0,
59852.0,
59952.0
],
"main_front": {
"x_min_rel": -875.0,
"x_max_rel": 875.0,
"bottom_EL": 43492.0,
"top_EL": 59752.0
},
"hoops_front_drawn": {
"count": 76,
"first_EL": 43542.0,
"last_EL": 59092.0
},
"main_section": {
"count": 54,
"radius": 875.0,
"first_deg": 0.001,
"step_deg": 6.667
},
"ties_section": [
{
"handle": "36C",
"len": 1795.0,
"dir": "Y"
},
{
"handle": "36D",
"len": 1795.0,
"dir": "X"
}
]
}
+53
View File
@@ -0,0 +1,53 @@
{
"G-G": {
"concrete_and_hoop_radii": [
1025.0,
1250.0
],
"bar_symbol_radius": 1002.5,
"bar_count": 60,
"first_deg": 1.475,
"step_deg": null,
"tie_lines": [
2050.0,
2050.0
]
},
"J-J": {
"concrete_and_hoop_radii": [
1025.0,
1175.0
],
"bar_symbol_radius": 1002.5,
"bar_count": 61,
"first_deg": 1.475,
"step_deg": 5.9017,
"tie_lines": [
2050.0,
2050.0
]
},
"hoop_levels_from_table": {
"count": 48,
"top": 45342.0,
"bottom": 33192.0,
"rule": "shaft top -110, 13@150, 34@300 (+H6 340 +100 = shaft bottom)"
},
"tie_levels_from_table": {
"count": 24,
"top": 45192.0,
"bottom": 33192.0,
"rule": "shaft top -260, 6@300, 17@600 (+H5 340 +100)"
},
"chain_check": {
"hoops": 12700,
"ties": 12700,
"H": 12700
},
"main_span": {
"top": 45342.0,
"bottom": 33192.0,
"length": 12150.0,
"P1-1 + P1-2": 12150
}
}
+1
View File
@@ -0,0 +1 @@
{"bars": [{"mark": "C1", "occ": "y-1000", "pts": [[-3604.73, -1000, 59030.4], [-3425.6, -1000, 59852.0], [3492.1, -1000, 59852.0], [3607.8, -1000, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번; 평면 모서리 단축 [추론]"}, {"mark": "C4", "occ": "y-875", "pts": [[-3632.17, -875, 59030.4], [-3425.6, -875, 59852.0], [3492.1, -875, 59852.0], [3635.77, -875, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번; 평면 모서리 단축 [추론]"}, {"mark": "C1", "occ": "y-750", "pts": [[-3655.85, -750, 59030.4], [-3425.6, -750, 59852.0], [3492.1, -750, 59852.0], [3659.91, -750, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번; 평면 모서리 단축 [추론]"}, {"mark": "C4", "occ": "y-625", "pts": [[-3672.0, -625, 59030.4], [-3425.6, -625, 59852.0], [3492.1, -625, 59852.0], [3679.3, -625, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C1", "occ": "y-500", "pts": [[-3672.0, -500, 59030.4], [-3425.6, -500, 59852.0], [3492.1, -500, 59852.0], [3679.3, -500, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C4", "occ": "y-375", "pts": [[-3672.0, -375, 59030.4], [-3425.6, -375, 59852.0], [3492.1, -375, 59852.0], [3679.3, -375, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C1", "occ": "y-250", "pts": [[-3672.0, -250, 59030.4], [-3425.6, -250, 59852.0], [3492.1, -250, 59852.0], [3679.3, -250, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C4", "occ": "y-125", "pts": [[-3672.0, -125, 59030.4], [-3425.6, -125, 59852.0], [3492.1, -125, 59852.0], [3679.3, -125, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C1", "occ": "y+0", "pts": [[-3672.0, 0, 59030.4], [-3425.6, 0, 59852.0], [3492.1, 0, 59852.0], [3679.3, 0, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C4", "occ": "y+125", "pts": [[-3672.0, 125, 59030.4], [-3425.6, 125, 59852.0], [3492.1, 125, 59852.0], [3679.3, 125, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C1", "occ": "y+250", "pts": [[-3672.0, 250, 59030.4], [-3425.6, 250, 59852.0], [3492.1, 250, 59852.0], [3679.3, 250, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C4", "occ": "y+375", "pts": [[-3672.0, 375, 59030.4], [-3425.6, 375, 59852.0], [3492.1, 375, 59852.0], [3679.3, 375, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C1", "occ": "y+500", "pts": [[-3672.0, 500, 59030.4], [-3425.6, 500, 59852.0], [3492.1, 500, 59852.0], [3679.3, 500, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C4", "occ": "y+625", "pts": [[-3672.0, 625, 59030.4], [-3425.6, 625, 59852.0], [3492.1, 625, 59852.0], [3679.3, 625, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C1", "occ": "y+750", "pts": [[-3655.85, 750, 59030.4], [-3425.6, 750, 59852.0], [3492.1, 750, 59852.0], [3659.91, 750, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번; 평면 모서리 단축 [추론]"}, {"mark": "C4", "occ": "y+875", "pts": [[-3632.17, 875, 59030.4], [-3425.6, 875, 59852.0], [3492.1, 875, 59852.0], [3635.77, 875, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번; 평면 모서리 단축 [추론]"}, {"mark": "C1", "occ": "y+1000", "pts": [[-3604.73, 1000, 59030.4], [-3425.6, 1000, 59852.0], [3492.1, 1000, 59852.0], [3607.8, 1000, 59031.7]], "r": 65.25, "design_length": 8617, "src": "D2 정면 1단 작도선, 단면 A-A/B-B @125 교번; 평면 모서리 단축 [추론]"}, {"mark": "C2", "occ": "y-1000", "pts": [[-3485.6, -1000, 59652.0], [-3455.6, -1000, 59752.0], [3513.16, -1000, 59752.0], [3526.3, -1000, 59652.0]], "r": 65.25, "design_length": 7177, "src": "D2 정면 2단 작도선, 단면 A-A/B-B @125 교번; 평면 모서리 단축 [추론]"}, {"mark": "C5", "occ": "y-875", "pts": [[-3485.6, -875, 59652.0], [-3455.6, -875, 59752.0], [3515.0, -875, 59752.0], [3537.8, -875, 59652.0]], "r": 65.25, "design_length": 7177, "src": "D2 정면 2단 작도선, 단면 A-A/B-B @125 교번"}, {"mark": "C2", "occ": "y-750", "pts": [[-3485.6, -750, 59652.0], [-3455.6, -750, 59752.0], [3515.0, -750, 59752.0], [3537.8, -750, 59652.0]], "r": 65.25, "design_length": 7177, "src": "D2 정Line truncated