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>
No files matched your search
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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))
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
@@ -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
|
||||
@@ -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))
|
||||
@@ -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))
|
||||
@@ -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))
|
||||
@@ -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))
|
||||
@@ -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))
|
||||
@@ -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()))
|
||||
@@ -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
|
||||
|
After Width: | Height: | Size: 42 KiB |
|
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))]
|
||||
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 222 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 375 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 353 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 275 KiB |
|
After Width: | Height: | Size: 120 KiB |
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||