- 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>
125 lines
7.7 KiB
Python
125 lines
7.7 KiB
Python
"""산외·옥성 기초 전단·세로철근 수정(2026-10-26)을 '수정 내역' 계열 시트에 추가한다.
|
||
|
||
- 수정 내역: R-10(옥성 B9), R-11(산외 B7), R-12(산외 B9·B10) 행 추가
|
||
- 수정 증거(마크별): 같은 철근 행 추가
|
||
- 미수정·보류: 산외 B7 행을 '수정 완료'로 갱신, 옥성 B9 연장 부족 행 추가
|
||
- 수정 파일·해시: 산외·옥성 수정2 를 '중간본' 으로, 수정3 두 파일을 '최신' 으로 추가
|
||
입력: Code/검토수정/결과/c1_shear_fix.json. 같은 R-10 이 이미 있으면 중단(이중 적용 방지).
|
||
"""
|
||
import copy
|
||
import datetime
|
||
import hashlib
|
||
import json
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
import openpyxl
|
||
from openpyxl.styles import PatternFill
|
||
|
||
ROOT = Path(r"D:\★Pier 자료\프로그램\Pier_T")
|
||
REV = ROOT / "검토파일"
|
||
XLSX = REV / "4개교_공통사항_종합.xlsx"
|
||
res = json.loads((ROOT / "Code" / "검토수정" / "결과" / "c1_shear_fix.json").read_text(encoding="utf-8"))
|
||
wb = openpyxl.load_workbook(XLSX)
|
||
ws = wb["수정 내역"]
|
||
if any(r[0].value == "R-10" for r in ws.iter_rows(min_row=4)):
|
||
sys.exit("R-10 이 이미 있음 - 중단")
|
||
|
||
|
||
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
|
||
|
||
|
||
so, ok = res["sanoe"], res["okseong"]
|
||
b7, b9s, b10s, b9o = so["sample"]["B7"], so["sample"]["B9"], so["sample"]["B10"], ok["sample"]["B9"]
|
||
n7, n9, n10, no9 = so["stat"]["B7_done"], so["stat"]["B9_done"], so["stat"]["B10_done"], ok["stat"]["B9_done"]
|
||
|
||
rows = [
|
||
["R-10", "옥성교", "기초 C형 띠철근 B9 (H19) 갈고리 연장", "B9 (tie-C)",
|
||
"양 끝 연장 57.1 / 길이 %.1f (재료표 L 4,763 보다 짧음)" % b9o["len_old"],
|
||
"양 끝 연장 %.1f / 길이 %.1f (= 재료표 L)" % (b9o["tail_new"], b9o["len_new"]), no9,
|
||
"사용자 승인 2026-10-26: 도면에 값이 있으면 재료표 길이를 따름 → 연장을 늘려 중심선 길이 = 재료표 L. 걸림 높이 126 / 2124 는 바깥 주철근에 이미 걸려 있어 유지",
|
||
"옥성교P1_G5_수정3_20261026.3dm",
|
||
"저장 직전 문서 확인: 171본 모두 길이 4,763.0, 객체 수 %d → %d 동일, 파이프 부피 오차 0.2%% 이내" % (ok["objects_before"], ok["objects_after"]),
|
||
"연장 %.1f < KDS 5db 95.5 (1.5mm 부족) — 재료표 L 을 따른 결과. 설계자 확인" % b9o["tail_new"]],
|
||
["R-11", "산외교", "기초 세로철근 B7 (H13) 양 끝 높이", "B7 (H13 세로철근)",
|
||
"양 끝 z 166 / 2384 (바깥 주철근 150 / 2400 안쪽) / 길이 %.1f" % b7["len_old"],
|
||
"양 끝 z 132.5 / 2414.5 (바깥 주철근에 걸림: 150−11−6.5, 2400+8+6.5) / 길이 %.1f" % b7["len_new"], n7,
|
||
"사용자 승인 2026-10-26: 피복 밖으로 나갈 수 있는 철근은 전단·세로철근, 주철근에 걸어줌 (운곡교 B9·옥성교 B9 와 같은 방식)",
|
||
"산외교P1 G5_수정3_20261026.3dm",
|
||
"저장 직전 문서 확인: 98본 z 범위 132.5~2414.5, 갈고리 R19.5·연장 80.5 유지(KDS H13 최소 R 19.05, 5db 65 만족). 객체 수 %d → %d 동일" % (so["objects_before"], so["objects_after"]),
|
||
"도면 B7 값은 [추론](체크무늬 98본, 갈고리 +Y). 길이 %.1f > 재료표 L 2,418 (+47) — 설계자 확인" % b7["len_new"]],
|
||
["R-12", "산외교", "기초 중간 직선철근 B9·B10 (H16) 갈고리 연장", "B9, B10",
|
||
"연장 76 / 길이 %.1f (재료표 L 7,500)" % b9s["len_old"],
|
||
"연장 %.1f / 길이 %.1f (= 재료표 L)" % (b9s["tail_new"], b9s["len_new"]), n9 + n10,
|
||
"사용자 승인 2026-10-26: 연장을 늘려 중심선 길이 = 재료표 L (도면에 값이 있으면 재료표를 따름)",
|
||
"산외교P1 G5_수정3_20261026.3dm",
|
||
"저장 직전 문서 확인: B9 7본·B10 7본 모두 길이 7,500.0, 연장 86.3 ≥ KDS 5db 79.5",
|
||
"-"],
|
||
]
|
||
for row in rows:
|
||
append_like(ws, row, 4)
|
||
|
||
ev = wb["수정 증거(마크별)"]
|
||
ev_rows = [
|
||
["옥성교", "B9", "H19", "전단철근 갈고리 연장", no9, "연장 57.1 / 길이 %.1f" % b9o["len_old"], "연장 %.1f / 길이 %.1f" % (b9o["tail_new"], b9o["len_new"]),
|
||
round((b9o["len_new"] - b9o["len_old"]) * no9, 1), "합계 길이 변화(mm). 재료표 L 4,763 에 맞춤"],
|
||
["산외교", "B7", "H13", "세로철근 끝 높이(기초 하단 기준 mm)", n7, "z 166 / 2384, 길이 %.1f" % b7["len_old"], "z 132.5 / 2414.5, 길이 %.1f" % b7["len_new"],
|
||
round((b7["len_new"] - b7["len_old"]) * n7, 1), "합계 길이 변화(mm). 바깥 주철근에 걸림"],
|
||
["산외교", "B9", "H16", "중간 직선철근 갈고리 연장", n9, "연장 76 / 길이 %.1f" % b9s["len_old"], "연장 %.1f / 길이 %.1f" % (b9s["tail_new"], b9s["len_new"]),
|
||
round((b9s["len_new"] - b9s["len_old"]) * n9, 1), "재료표 L 7,500 에 맞춤"],
|
||
["산외교", "B10", "H16", "중간 직선철근 갈고리 연장", n10, "연장 76 / 길이 %.1f" % b10s["len_old"], "연장 %.1f / 길이 %.1f" % (b10s["tail_new"], b10s["len_new"]),
|
||
round((b10s["len_new"] - b10s["len_old"]) * n10, 1), "재료표 L 7,500 에 맞춤"],
|
||
]
|
||
for row in ev_rows:
|
||
append_like(ev, row, 4)
|
||
|
||
hold = wb["미수정·보류"]
|
||
for r in hold.iter_rows(min_row=4):
|
||
if r[0].value == "산외교" and str(r[1].value).startswith("B7"):
|
||
r[3].value = "수정 완료(2026-10-26): 양 끝을 바깥 주철근에 걸리게 옮김 (z 132.5 / 2414.5)"
|
||
r[4].value = "도면 값이 [추론]이고 길이 2,465.3 이 재료표 L 2,418 보다 47mm 김. '수정 내역' R-11"
|
||
r[5].value = "설계자 확인 (도면 B7 형상·길이)"
|
||
append_like(hold, ["옥성교", "B9 (H19 C형 띠철근)", "171본", "연장 93.9 < KDS 5db 95.5 (1.5mm 부족)",
|
||
"재료표 L 4,763 에 맞춘 결과. 연장을 KDS 로 키우면 L 초과. '수정 내역' R-10", "설계자 확인 (L 과 KDS 중 우선)", "R-10"], 4)
|
||
append_like(hold, ["산외·옥성교", "B8·B10·B11·B12 등 겹침 이음이 있는 띠·루프철근", "-", "재료표 L 에 겹침 J 가 있으나 형상에 없음",
|
||
"공통 문제 C-3(겹침 길이를 형상에 넣을지 정책 미정)이라 이번에는 수정하지 않음", "정책 결정", "C-3"], 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 r in fs.iter_rows(min_row=4):
|
||
if r[1].value in ("검토파일/검토_산외교P1/산외교P1 G5_수정2_20261026.3dm", "검토파일/검토_옥성교P1/옥성교P1_G5_수정2_20261026.3dm"):
|
||
r[3].value = "중간본"
|
||
r[3].fill = PatternFill(fill_type=None)
|
||
new_files = [("산외교", "검토_산외교P1/산외교P1 G5_수정3_20261026.3dm", "기초 전단·세로철근(B7 걸기, B9·B10 연장) 포함 — 전체 수정 포함"),
|
||
("옥성교", "검토_옥성교P1/옥성교P1_G5_수정3_20261026.3dm", "기초 C형 띠철근 B9 연장 포함 — 전체 수정 포함")]
|
||
latest_fill = copy.copy(fs.cell(row=9, column=4).fill)
|
||
for b, rel, what in new_files:
|
||
p = REV / rel
|
||
stt = p.stat()
|
||
r = append_like(fs, [b, "검토파일/" + rel, what, "최신", round(stt.st_size / 1e6, 1),
|
||
datetime.datetime.fromtimestamp(stt.st_mtime).strftime("%Y-%m-%d %H:%M"), sha(p)], 4)
|
||
fs.cell(row=r, column=4).fill = PatternFill("solid", fgColor="FFE2EFDA")
|
||
wb.save(XLSX)
|
||
print("saved", XLSX)
|