Files
Pier_v1/pierzainer_ground/inspect_support_controls.py
T

33 lines
2.0 KiB
Python

"""Find original coordinate callouts and their actual leader endpoints."""
import json,re,sys
from pathlib import Path
from ezdxf import recover
from build_sample_grounds import OUTPUT,save,PACKAGE
from pierzainer_ground.dxf_terrain import convert_dwg_to_dxf
sys.path.insert(0,str(PACKAGE/'app/Code/bridge_extractor_package/src'))
from bridge_drawing_extractor.inference import coordinate_points
from bridge_drawing_extractor.geometry import leader_endpoint
for job in json.loads((OUTPUT/'inputs.json').read_text(encoding='utf-8')):
if job['sample'] not in (5,10,11):continue
out=Path(job['output']);support=out/'cache/registration';support.mkdir(exist_ok=True)
sources=[p for p in Path(job['drawing']).parent.glob('*.dwg') if '받침' in p.name]
for source in sources:
dxf=convert_dwg_to_dxf(source,support);doc,_=recover.readfile(str(dxf))
texts=[];segments=[]
for e in doc.modelspace():
if e.dxftype() in ('TEXT','MTEXT'):
text=e.plain_text() if e.dxftype()=='MTEXT' else e.dxf.text
texts.append(dict(h=e.dxf.handle,t=text,x=e.dxf.insert.x,y=e.dxf.insert.y,height=e.dxf.get('height',1) if e.dxftype()=='TEXT' else e.dxf.char_height))
if e.dxftype()=='LINE':segments.append(dict(h=e.dxf.handle,a=list(e.dxf.start)[:2],b=list(e.dxf.end)[:2]))
elif e.dxftype()=='LWPOLYLINE':
a=[list(p)[:2] for p in e.get_points()]
segments.extend(dict(h=e.dxf.handle,a=p,b=q) for p,q in zip(a,a[1:]))
coords=coordinate_points(texts)
for point in coords:
tip=leader_endpoint(point['cad'],segments)
if tip:point['leader_tip']=tip[0];point['leader_handles']=[s['h'] for s in tip[1]]
report=dict(source=str(source),coordinate_callouts=coords,labels=[t for t in texts if re.search(r'IP[123]|P[1-9]',t['t'])])
save(out/'support_controls.json',report)
print(json.dumps({'sample':job['sample'],'coords':coords[:16],'labels':report['labels'][:12]},ensure_ascii=False),flush=True)