Files
Pier_v1/Code/review_pipeline/dots_method/ok_rerun1.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

57 lines
2.9 KiB
Python

# 옥성교 재료표 처음부터: DXF 재판독 → ok2_table.json, ok2_shapes.json
import sys, re, json, collections
sys.path.insert(0,'pylib')
import ezdxf
F=r"D:\★Pier 자료\심수석님 검토 파일\검토_옥성교P1\옥성교P1.dxf"
d=ezdxf.readfile(F); m=d.modelspace()
FONT=re.compile(chr(92)*2+'f[^;]*;')
texts=[]; tags=[]
def walk(ents,depth=0):
for e in ents:
t=e.dxftype()
if t=='TEXT': texts.append((e.dxf.insert.x,e.dxf.insert.y,FONT.sub('',e.dxf.text).replace('{','').replace('}','').strip(),e.dxf.layer))
elif t=='MTEXT':
s=FONT.sub('',e.text).replace('{','').replace('}','').replace(chr(92)+'P',' / ')
texts.append((e.dxf.insert.x,e.dxf.insert.y,s.strip(),e.dxf.layer))
elif t=='INSERT':
if e.dxf.name.startswith('CSBNUM1'):
tags.append((e.dxf.insert.x,e.dxf.insert.y,dict((a.dxf.tag,a.dxf.text.strip()) for a in e.attribs)))
walk(m)
print('texts',len(texts),'tags',len(tags))
# ---- 재료표
rows=collections.defaultdict(dict)
for x,y,t,l in texts:
if l=='CS-TABL-TEX2' and x>=715000 and 324000<y<340000: rows[round(y/10)][round(x)]=t
tab=[]; dia=None
for y in sorted(rows,reverse=True):
r=rows[y]
mk=r.get(715129)
if mk and (re.match(r'^[A-Z]{1,2}\d+$',mk) or mk=='UM'):
dd=r.get(715879)
if dd=='"': dd=dia
dia=dd
tab.append({'mark':mk,'dia':dd,'L':float(r[717004])*1000,'n':int(r[717629]),'tot':float(r[719004]),'y':y*10,'raw':r})
print('표 행',len(tab))
json.dump(tab,open('ok2_table.json','w',encoding='utf-8'),ensure_ascii=False,indent=0)
# ---- 철근상세
Lt=[t for t in texts if t[2].replace(' ','').startswith('L=') and t[3]=='CS-TEXT']
print('Lt',len(Lt), Lt[:2], collections.Counter(t[3] for t in Lt))
det=[]
for xt,yt,a in tags:
mk=a.get('RB_NO');
if not mk: continue
# L= 글자: 태그 오른쪽 x+1700..+2100, y 차이 <60
cand=[t for t in Lt if xt+1600<t[0]<xt+2200 and abs(t[1]-yt)<60]
if not cand: det.append({'mark':mk,'dia':a.get('RB_DIA'),'note':'L 글자 없음','x':xt,'y':yt}); continue
L=cand[0]
N=[t for t in texts if re.match(r'N\s*=',t[2]) and abs(t[1]-L[1])<5 and L[0]<t[0]<L[0]+3000]
row=[t for t in texts if abs(t[1]-(L[1]-200))<5 and xt+900<t[0]<xt+5900 and re.match(r'^[a-zA-Z]\d?\s*=',t[2])]
row.sort(key=lambda t:t[0])
row2=[t for t in texts if abs(t[1]-(L[1]-400))<5 and xt+900<t[0]<xt+5900 and re.match(r'^[a-zA-Z]\d?\s*=',t[2])]
det.append({'mark':mk,'dia':a.get('RB_DIA'),'L':L[2],'N':N[0][2] if N else None,'dims':[t[2] for t in row],'dims2':[t[2] for t in sorted(row2,key=lambda t:t[0])],'x':L[0],'y':L[1]})
json.dump(det,open('ok2_shapes.json','w',encoding='utf-8'),ensure_ascii=False,indent=0)
print('상세',len(det),'마크',len(set(e['mark'] for e in det)))
cs=[t for t in texts if t[3]=='CS-TEXT']
print('CS-TEXT',len(cs))
open('dbg_cs.txt','w',encoding='utf-8').write('\n'.join(repr(t[2]) for t in cs[:15]))