"""Extract the supplied DWG's actual frame and note text; never change the source.""" import json import math from pathlib import Path import sys sys.path.insert(0,str(Path(__file__).resolve().parent.parent/'pierzainer_ground')) from pierzainer_ground.dxf_terrain import read_source_document from ezdxf.disassemble import recursive_decompose from ezdxf import path as ezpath from ezdxf import bbox, colors ROOT=Path(__file__).resolve().parent doc,_=read_source_document(ROOT/'.cache/[교각-T 형] 01 일반도_20260619.dxf',ROOT/'.cache') frame=next(e for e in doc.modelspace().query('INSERT') if e.dxf.name=='CXBLKA1') entities=[] def p(q): return [float(q[0])/100,float(q[1])/100] for e in recursive_decompose([frame]): typ=e.dxftype() bb=bbox.extents([e],fast=True) logo=bb.has_data and bb.extmin.x>5000 and bb.extmax.x<18000 and bb.extmin.y>1000 and bb.extmax.y<6000 base=dict(layer='FRAME',source=dict(member='reference-logo' if logo else 'reference-frame',index=len(entities),pier='')) layer=doc.layers.get(e.dxf.layer) aci=e.dxf.get('color',256) if aci in (0,256):aci=layer.dxf.color base['cad']=dict(layer=e.dxf.layer,color=abs(aci),linetype=e.dxf.get('linetype','BYLAYER'),lineweight=e.dxf.get('lineweight',-1),textStyle=e.dxf.all_existing_dxf_attribs().get('style','Standard')) if typ=='ATTRIB': continue if typ=='LINE': entities.append(dict(**base,kind='line',a=p(e.dxf.start),b=p(e.dxf.end))) elif typ in ('ARC','ELLIPSE','LWPOLYLINE'): try: pts=[p(q) for q in ezpath.make_path(e).flattening(5)] if len(pts)>1: entities.append(dict(**base,kind='polyline',points=pts,closed=bool(getattr(e,'is_closed',False)))) except (TypeError,ValueError): pass elif typ=='TEXT': pt=e.dxf.align_point if e.dxf.get('valign',0) else e.dxf.insert entities.append(dict(**base,kind='text',point=p(pt),text=e.dxf.text,height=e.dxf.height/100,rotation=e.dxf.get('rotation',0),align='left')) elif typ=='HATCH': loops=[[p(q) for q in path.flattening(5)] for path in ezpath.from_hatch(e)] loops=[pts for pts in loops if len(pts)>2] aci=e.dxf.get('color',256) rgb=e.rgb or (colors.aci2rgb(aci) if 0