33 lines
2.0 KiB
Python
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)
|