Files
Pier_v1/Code/검토수정/스크립트/add_shape_sheet_xlsx.py
T
ahnyongjooandClaude Sonnet 5.5 964a841de1 chore(rebar): Pier_T_rebar 작업 폴더 초기 구성 및 외부 의존 파일 통합
- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환
- Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용
- pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관)
- worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md)
- D:\Rhino-MCP 경로 참조를 새 위치로 치환

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:20:18 +09:00

52 lines
4.2 KiB
Python

"""4개교 전 마크 모델 형상 일람 이미지를 엑셀 새 시트 '형상 일람(모델)'로 넣고 '수정 내역' R-21(점검, 수정 없음)을 기록. 백업(양쪽) → Pier_T → 원본 복사 → SHA 확인."""
import copy, datetime, hashlib, shutil, sys
from pathlib import Path
import openpyxl
from openpyxl.drawing.image import Image as XLImage
from openpyxl.styles import Alignment, Font, PatternFill
ROOT = Path(r"D:\★Pier 자료\프로그램\Pier_T"); REV = ROOT / "검토파일"; ORIG = Path(r"D:\★Pier 자료\심수석님 검토 파일"); NAME = "4개교_공통사항_종합.xlsx"
CAP = REV / "수정후_캡처"
stamp = datetime.date.today().strftime("%Y%m%d")
for d in (REV, ORIG):
shutil.copy2(d / NAME, d / ("4개교_공통사항_종합_백업_%s_형상일람.xlsx" % stamp))
wb = openpyxl.load_workbook(REV / NAME)
ws = wb["수정 내역"]
if any(r[0].value == "R-21" for r in ws.iter_rows(min_row=4)) or "형상 일람(모델)" in wb.sheetnames:
sys.exit("이미 있음")
YEL = PatternFill("solid", fgColor="FFFFF2CC")
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
files = sorted(CAP.glob("형상일람_*.png"), key=lambda p: (["운곡", "산외", "옥성", "RampA"].index(p.stem.split("_")[1]), ["기초", "코핑", "기둥", "말뚝"].index(p.stem.split("_")[2])))
r = append_like(ws, ["R-21", "4개교", "철근 형상 전수 점검 (재료표 형식 ↔ 강종별 형상 상세 ↔ 모델) — 모델 형상 일람 작성",
"기초·코핑·기둥·말뚝 전 마크(%d장)" % len(files),
"마크별 형상이 도면 상세와 같은지 한눈에 대조할 자료가 없었음 (재료표 숫자 위주 점검)",
"모델 전 마크의 대표 1본을 2D 로 그린 일람 이미지 작성(시트 '형상 일람(모델)'). 수정은 하지 않음",
0, "사용자 요청 2026-10-27: 산외 B1·B4 지적(→ SD500 형식 I 직선으로 일치, R-20) 후 '4개교 전부 오류가 있을 수 있으니 진행'",
"각 모델 최신본(운곡 수정7, 산외 수정5, 옥성 수정6, Ramp-A 수정6)", "모델 형상 분류(직선 수·호 수·폐합·치수)를 전 마크 추출해 이미지화. 직선 철근/ㄷ자/ㅁ자/갈고리 등 큰 틀은 형식과 일치",
"마크별 상세 대조는 형식·강종별 상세 그림과 1:1 확인 필요(아래 후보 참고): 운곡 C16 형식 II 가 ㄴ자, 산외 C11·C13 조각 중 1 mm 직선 구간, 운곡 C9~C13(IV·X) 폐합형에 J 겹침 미반영(C-3), 재료표 L 의 4J 와 모델 2J 차이"], 4)
ws.cell(row=r, column=1).fill = YEL
sh = wb.create_sheet("형상 일람(모델)")
sh["A1"] = "4개교 철근 모델 형상 일람 — 마크별 대표 1본 (2D 투영). 도면 이형철근 상세(강종별 SD400/SD500)와 같은 형식인지 대조용"
sh["A1"].font = Font(bold=True, size=14)
sh["A2"] = "초록 ● 시작 / 빨강 ■ 끝. 긴 철근은 가로세로 비율을 왜곡해 형상만 보이게 함(칸 아래 표기). 'N=…·조각'은 J 겹침으로 2조각으로 나눈 철근. L(표)=재료표 길이, 모델=중심선 길이, 직선=직선 구간 길이."
row = 4
for p in files:
sh.cell(row=row, column=1, value=p.stem.replace("형상일람_", "").replace("_", " ")).font = Font(bold=True, size=12)
im = XLImage(str(p)); w0, h0 = im.width, im.height
im.width, im.height = 1250, int(1250 * h0 / w0)
sh.add_image(im, "A%d" % (row + 1))
row += int(im.height / 20) + 4
sh.column_dimensions["A"].width = 190
wb.save(REV / NAME); shutil.copy2(REV / NAME, ORIG / NAME)
sha = lambda p: hashlib.sha256(Path(p).read_bytes()).hexdigest()
print("sha equal:", sha(REV / NAME) == sha(ORIG / NAME), sha(REV / NAME)[:16], "sheet images:", len(sh._images), "files", len(files))