import json,re from pathlib import Path import numpy as np from ezdxf import recover from build_sample_grounds import OUTPUT,save from pierzainer_ground.project_coordinates import workbook_piers jobs=json.loads((OUTPUT/'inputs.json').read_text(encoding='utf-8')) for job in jobs: if job['sample'] not in (4,5,6,7,10,11,12):continue out=Path(job['output']);src=next((out/'cache').glob('*.dxf'));doc,_=recover.readfile(str(src)) centers=np.array([np.mean(p['axis'],axis=0) for p in workbook_piers(job['workbook'])]) found=[] for block in doc.blocks: for e in block: if e.dxftype() not in ('TEXT','MTEXT'):continue t=e.plain_text() if e.dxftype()=='MTEXT' else e.dxf.text if not re.fullmatch(r'[-+]?\d{1,3}\.\d+',t.strip()):continue xy=np.array([e.dxf.insert.y,e.dxf.insert.x]) for scale in (1.,.001): for dn in (0.,100000.,-100000.): a=xy*scale+[dn,0] if np.any(np.linalg.norm(centers-a,axis=1)<250): found.append(dict(block=block.name,handle=e.dxf.handle,text=t,xyz=list(e.dxf.insert),layer=e.dxf.layer,scale=scale,dn=dn)) save(out/'nearby_numeric_annotations.json',found) print(json.dumps({'sample':job['sample'],'count':len(found),'examples':found[:12]},ensure_ascii=False),flush=True)