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

@@ -0,0 +1,136 @@
"""Ramp-A P3-1 갈고리를 P3 각도로 수정(수정6, 2026-10-27)한 내용을 엑셀에 반영한다.
- 도면 r135 각도가 이상해 보인다는 사용자 의견을 '도면 확인 필요'로 체크
- M-9 문구·구분·보류 행을 수정6 결과로 갱신, 수정 내역 R-18, 수정 증거, 파일·해시(수정6 최신)
- 공통 문제 상세(이미지) 24행 문구 갱신 + 25행(수정 전·후 이미지, 좌표) 추가
같은 R-18 이 이미 있으면 중단.
"""
import copy
import datetime
import hashlib
import json
import sys
from pathlib import Path
import openpyxl
from openpyxl.drawing.image import Image as XLImage
from openpyxl.styles import Alignment, PatternFill
ROOT = Path(r"D:\★Pier 자료\프로그램\Pier_T")
REV = ROOT / "검토파일"
RES = ROOT / "Code" / "검토수정" / "결과"
XLSX = REV / "4개교_공통사항_종합.xlsx"
a = json.loads((RES / "c1_p31_angle.json").read_text(encoding="utf-8"))
cv = json.loads((RES / "c1_radial_cover_s6.json").read_text(encoding="utf-8"))
c5, c6 = cv["수정5(r135 70도)"]["P3-1"], cv["수정6(P3 각도)"]["P3-1"]
co5 = json.loads((RES / "c1_hook_coords.json").read_text(encoding="utf-8"))["P1-RC-P3-1-L01X"]
co6 = json.loads((RES / "c1_hook_coords6.json").read_text(encoding="utf-8"))["P1-RC-P3-1-L01X"]
wb = openpyxl.load_workbook(XLSX)
ws = wb["수정 내역"]
if any(r[0].value == "R-18" for r in ws.iter_rows(min_row=4)):
sys.exit("R-18 이 이미 있음 - 중단")
GREEN = PatternFill("solid", fgColor="FFE2EFDA")
OLD_ADD = (" ※ 사용자 확인(2026-10-27): P3-1 은 r135 가 맞고 C 곡선(호 길이) 165, D 150 인 아래로 걸리는 갈고리 (호 70.03°) — r·c 불일치 아님. "
"모델(수정5)은 이 값 그대로. 이 형상은 갈고리가 아래·바깥으로 뻗어 말뚝 구간(반지름 1,175 / 1,250)의 밖으로 나감 → 도면 형상과 말뚝 단면(배치) 불일치, 설계자 확인")
NEW_ADD = (" ※ [도면 확인 필요] 도면 P3-1 의 r135 각도가 이상해 보임(사용자 의견 2026-10-27): P3 는 r60·c141 → 134.65° 갈고리인데 P3-1 은 r135·c165 → 70° 로 다른 모양이 되고 말뚝 밖으로 나감. "
"수정5 까지는 도면 값(r135)대로 작성했고, 수정6 에서 철근은 P3 각도(134.65°)를 따라 C 곡선 165·D 150 을 유지해 r %.2f 로 수정(48본, 말뚝 안: PL01 중심 피복 최소 %.1f / PL02 최소 %.1f mm). 도면 r135 가 맞는지는 설계자 확인" %
(a["sample"]["r"], c6["PL01"]["min_radial_centre_cover"], c6["PL02"]["min_radial_centre_cover"]))
REPL = [
(OLD_ADD, NEW_ADD),
("도면 오류로 보류: 도면 P3-1 치수는 반지름 1,250 구간에만 겨우 맞고 반지름 1,175 구간에서는 갈고리가 말뚝 밖으로 나감. 모델은 도면 치수대로 두고 오류로 기록. 구간별 치수는 설계자 확인",
"수정 완료(수정6, 2026-10-27): P3 각도(134.65°) 적용 → 말뚝 안. 도면 r135(70°) 자체는 설계자 확인 필요"),
(" (말뚝 단면·P3-1 배치 설계자 확인)", " (도면 r135 설계자 확인)"),
("도면 오류 (말뚝 돌출)", "도면 r 확인 필요 (수정6 으로 말뚝 안)"),
("[개별] Ramp-A교 P3-1 갈고리 — r135 · C 곡선 165 · D 150 (70° 아래로 걸림), 이 치수대로면 말뚝 밖으로 나감",
"[개별] Ramp-A교 P3-1 갈고리 — 도면 r135(70°) 각도가 이상해 보임, 철근은 P3 각도(134.65°)로 수정 (수정6)"),
("사용자 확인(2026-10-27): r135 가 맞고 C 곡선 길이 165, D 150. 호는 70.03° 로 아래로 걸림 — r·c 불일치 아님",
"사용자 의견(2026-10-27): 도면 r135 의 각도가 이상해 보임 — P3(r60, 134.65°)와 같은 갈고리인데 P3-1 은 70° 로 각도가 다름"),
("말뚝 단면(반지름 1,175 / 1,250 구간)과 P3-1 배치 위치 설계자 확인. 모델은 도면 값 그대로",
"도면 r 값 설계자 확인. 모델(수정6)은 P3 각도(134.65°) + C 165 + D 150 (r %.2f)" % a["sample"]["r"]),
("[오류 기록] 모델은 도면 값(r135·c165·d150)대로 작성: 호 70.03°, 호 길이 165.0, 곧은 구간 150.0. 아래 말뚝 구간(반지름 1,175) 26본 중심이 말뚝 밖, 위 구간(반지름 1,250) 22본 표면 돌출. '미수정·보류', M-9",
"수정 완료(2026-10-27): P3 각도(134.65°) 적용 → r %.2f · 호 길이 165.0 · 곧은 구간 150.0, 말뚝 안(PL01 최소 %.1f / PL02 최소 %.1f mm). 수정 전(도면 r135·70°)은 말뚝 밖(PL01 26본 중심 밖, PL02 22본 돌출). 파일 ramp-A G5_수정6_20261026.3dm, '수정 내역' R-18" %
(a["sample"]["r"], c6["PL01"]["min_radial_centre_cover"], c6["PL02"]["min_radial_centre_cover"])),
]
n = 0
for name in ("교량별 항목 합본", "개별 항목", "미수정·보류", "공통 문제 상세(이미지)", "수정 내역", "수정 증거(마크별)"):
for row in wb[name].iter_rows():
for c in row:
if isinstance(c.value, str):
v = c.value
for old, new in REPL:
if old in v:
v = v.replace(old, new)
if v != c.value:
c.value = v
n += 1
for r in wb["미수정·보류"].iter_rows(min_row=4):
if r[0].value == "Ramp-A교" and str(r[1].value).startswith("P3-1"):
r[3].value = "수정 완료(수정6): P3 각도로 다시 만들어 말뚝 안. (수정5 도면 r135·70° 는 PL01 26본 중심 밖, PL02 22본 표면 돌출)"
r[4].value = "사용자 의견: 도면 r135 의 각도(70°)가 이상해 보임 → 철근은 P3 각도(134.65°), C 165, D 150, r %.2f. 'M-9', 'R-18'" % a["sample"]["r"]
r[5].value = "도면 r135 설계자 확인"
def append_like(sheet, values, like_row):
r = sheet.max_row + 1
for j, v in enumerate(values, 1):
c = sheet.cell(row=r, column=j, value=v)
s = sheet.cell(row=like_row, column=j)
c.font = copy.copy(s.font); c.fill = copy.copy(s.fill); c.border = copy.copy(s.border); c.alignment = copy.copy(s.alignment); c.number_format = s.number_format
sheet.auto_filter.ref = "A3:%s%d" % (openpyxl.utils.get_column_letter(sheet.max_column), r)
return r
r = append_like(ws, ["R-18", "Ramp-A교", "P3-1 갈고리를 P3 각도로 수정", "P3-1 (H16)",
"도면 r135·c165·d150: 호 70.03°, 곧은 구간이 바깥으로 뻗음 / 말뚝 밖 (PL01 26본 중심 밖, PL02 22본 돌출)",
"P3 각도 134.65°, 호 길이 165.0, 곧은 구간 150.0, r %.2f (곧은 구간이 안쪽 아래로 되돌아옴) / 말뚝 안" % a["sample"]["r"], a["stat"]["done"],
"사용자 의견 2026-10-27: 도면 r135 의 각도가 이상해 보임 → 철근은 P3 각도를 따름. C 곡선 165, D 150 은 도면 값 유지, 반지름은 165 ÷ (141/60) = %.2f" % a["sample"]["r"],
"ramp-A G5_수정6_20261026.3dm",
"수정 후 재측정: r·호 각도·호 길이·곧은 구간·꼭짓점~호 시작(b 2,137) 확인, 말뚝 반경 기준 중심 피복 PL01 최소 %.1f / PL02 최소 %.1f mm(돌출 0본). 객체 수 %d → %d 동일" % (c6["PL01"]["min_radial_centre_cover"], c6["PL02"]["min_radial_centre_cover"], a["objects_before"], a["objects_after"]),
"도면 r135 의 각도 자체는 설계자 확인(체크). 증거: 공통 문제 상세(이미지) 25행 수정 전·후 Rhino 캡처·좌표"], 4)
ws.cell(row=r, column=1).fill = GREEN
ev = wb["수정 증거(마크별)"]
append_like(ev, ["Ramp-A교", "P3-1", "H16", "갈고리 각도를 P3 각도로", a["stat"]["done"], "r135 · 70.03° · c165 · d150 / 곧은 구간이 바깥", "r%.2f · 134.65° · c165 · d150 / 안쪽으로 되돌아옴" % a["sample"]["r"], 0.0,
"중심선 길이 불변(2,641.7). 좌표: 호 중심 (1068.5, 0, 33057.0) → (1068.5, 0, 33121.79), 곧은 구간 끝 (1246.61, 0, 32962.13) → (1013.05, 0, 32965.73)"], 4)
fs = wb["수정 파일·해시"]
def sha(p):
h = hashlib.sha256()
with open(p, "rb") as f:
for blk in iter(lambda: f.read(1 << 20), b""):
h.update(blk)
return h.hexdigest()
for row in fs.iter_rows(min_row=4):
if str(row[1].value).endswith("ramp-A G5_수정5_20261026.3dm") and row[3].value == "최신":
row[3].value = "중간본"
row[3].fill = PatternFill(fill_type=None)
p = REV / "Ramp-A교P1" / "ramp-A G5_수정6_20261026.3dm"
stt = p.stat()
rr = append_like(fs, ["Ramp-A교", "검토파일/Ramp-A교P1/ramp-A G5_수정6_20261026.3dm", "P3-1 갈고리 P3 각도 적용 — 전체 수정 포함", "최신", round(stt.st_size / 1e6, 1),
datetime.datetime.fromtimestamp(stt.st_mtime).strftime("%Y-%m-%d %H:%M"), sha(p)], 4)
fs.cell(row=rr, column=4).fill = GREEN
wd = wb["공통 문제 상세(이미지)"]
nr = wd.max_row + 1
like = nr - 1
pt = lambda co: "; ".join("%s 월드(%s) 2D(%s)" % (k.split("_")[0], ", ".join(str(x) for x in v["world"]), ", ".join(str(x) for x in v["2D(u,v)"])) for k, v in co["points"].items() if k.startswith(("⑤", "⑥", "⑦", "⑧")))
vals = {1: "M-9", 2: "[개별] Ramp-A교 P3-1 갈고리 수정 전·후 증거 (수정5 → 수정6)",
7: "수정 전(수정5) 철근 중심선 좌표: " + pt(co5) + " / d 방향(u,v) " + str(co5["d_direction(곧은구간 방향 단위벡터 u,v)"]),
8: "수정 후(수정6) 철근 중심선 좌표: " + pt(co6) + " / d 방향(u,v) " + str(co6["d_direction(곧은구간 방향 단위벡터 u,v)"]),
9: "수정 완료(2026-10-27): P3 각도(134.65°) 적용. 2D 좌표는 꼭짓점(다리선과 수평선 교점)을 원점, u = 수평선 방향, v = 위(+Z). 'R-18'"}
for col, v in vals.items():
c = wd.cell(row=nr, column=col, value=v)
s = wd.cell(row=like, column=col)
c.font = copy.copy(s.font); c.fill = copy.copy(s.fill); c.border = copy.copy(s.border)
c.alignment = Alignment(wrap_text=True, vertical="top")
wd.cell(row=nr, column=9).fill = copy.copy(GREEN)
wd.row_dimensions[nr].height = 460
im = XLImage(str(REV / "수정후_캡처" / "RampA_P3-1_갈고리_수정전후.png"))
w0, h0 = im.width, im.height
im.width, im.height = 900, int(900 * h0 / w0)
wd.add_image(im, "F%d" % nr)
wb.save(XLSX)
print("text cells updated:", n, "; new row", nr)