找回密码
 会员注册
查看: 30|回复: 0

Python解析.dwg格式文件信息提取

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71086
发表于 2024-9-9 20:15:24 | 显示全部楼层 |阅读模式
目录一、装环境1、下载ODAFileConverter2、安装ODAFileConverter(1)、安装gdebi来处理依赖关系(2)、使用gdebi安装DEB包3、解决libxcb库问题(1)、安装依赖(2)、设置环境变量(3)、确认libxcb-util.so.1是否存在(4)、创建符号链接4、安装python包二、上代码一、装环境这里搞的人头疼,装了一大堆,各种报错,最后也不知道是靠哪个包运行成功的,反正成了1、下载ODAFileConverter从OpenDesignAlliance官网(ODA文件转换器下载页面)下载适用于Ubuntu的DEB包。2、安装ODAFileConverter(1)、安装gdebi来处理依赖关系sudoaptupdatesudoaptinstallgdebi-core12(2)、使用gdebi安装DEB包gdebiODAFileConverter_QT6_lnxX64_8.3dll_25.4.deb13、解决libxcb库问题现代的Ubuntu版本(例如22.04)可能缺少libxcb-util.so.0库。可以通过创建符号链接来解决这个问题:(1)、安装依赖sudoapt-getupdatesudoapt-get-finstallsudoaptinstalllibxcb-xinerama0libxcb-util1libxkbcommon-x11-0libglu1-mesalibxrender1libxi6libxrandr2xvfbgdal-binapt-getinstallaptitudesudoaptitudeinstallqt5-defaultqtbase5-devqtbase5-dev-tools12345(2)、设置环境变量vim~/.bashrc#写入下面的内容exportXDG_RUNTIME_DIR=/tmp/runtime-$USERmkdir-p$XDG_RUNTIME_DIRchmod700$XDG_RUNTIME_DIR#:wq保存source~/.bashrc1234567(3)、确认libxcb-util.so.1是否存在ls/usr/lib/x86_64-linux-gnu/libxcb-util.so.11(4)、创建符号链接cd/usr/lib/x86_64-linux-gnusudoln-slibxcb-util.so.1libxcb-util.so.0124、安装python包condainstall-cconda-forgegdalpipinstallezdxf12二、上代码fromezdxf.addonsimportodafcimportezdxffromosgeoimportogrimportsysimportosimportjsonimportreclassdwg_analysis:def__init__(self,filepath,format):self.filepath=filepathself.format=formatdefdwg2data(self):dxf_file=os.path.join(os.path.dirname(self.filepath),os.path.basename(self.filepath).split(".")[0]+".dxf")odafc.convert(self.filepath,dxf_file,version='R2000',replace=True)doc=ezdxf.readfile(dxf_file)msp=doc.modelspace()data={}#获取TEXT实体texts=msp.query('TEXT')text_data=[]ifformat=="dwg_txt":fortextintexts:decoded_str=re.sub(r'\\U\+([0-9A-Fa-f]{4})',lambdam:chr(int(m.group(1),16)),text.dxf.text)text_data.append(decoded_str)filtered_list=[itemforitemintext_dataifnot(isinstance(item,(int,float))or(isinstance(item,str)andstr.isdigit(item))or(isinstance(item,str)anditem.isdigit()))]data['TEXT']=self.remove_duplicates(filtered_list)returndatafortextintexts:decoded_str=re.sub(r'\\U\+([0-9A-Fa-f]{4})',lambdam:chr(int(m.group(1),16)),text.dxf.text)text_info={'text':decoded_str,'insert'text.dxf.insert[0],text.dxf.insert[1]),'height':text.dxf.height,'rotation':text.dxf.rotation,'style':text.dxf.style,'layer':text.dxf.layer}text_data.append(text_info)data['TEXT']=text_data#获取LINE实体lines=msp.query('LINE')line_data=[]forlineinlines:line_data.append({'start'line.dxf.start[0],line.dxf.start[1]),'end'line.dxf.end[0],line.dxf.end[1])})data['LINE']=line_data#获取POLYLINE实体polylines=msp.query('POLYLINE')polyline_data=[]forpolylineinpolylines:points=[]forpointinpolyline.points():points.append((point[0],point[1]))polyline_data.append(points)data['POLYLINE']=polyline_data#获取CIRCLE实体circles=msp.query('CIRCLE')circle_data=[]forcircleincircles:circle_data.append({'center'circle.dxf.center[0],circle.dxf.center[1]),'radius':circle.dxf.radius})data['CIRCLE']=circle_data#获取ARC实体arcs=msp.query('ARC')arc_data=[]forarcinarcs:arc_data.append({'center'arc.dxf.center[0],arc.dxf.center[1]),'radius':arc.dxf.radius,'start_angle':arc.dxf.start_angle,'end_angle':arc.dxf.end_angle})data['ARC']=arc_data#获取ELLIPSE实体ellipses=msp.query('ELLIPSE')ellipse_data=[]forellipseinellipses:ellipse_data.append({'center'ellipse.dxf.center[0],ellipse.dxf.center[1]),'major_axis'ellipse.dxf.major_axis[0],ellipse.dxf.major_axis[1]),'ratio':ellipse.dxf.ratio,'start_param':ellipse.dxf.start_param,'end_param':ellipse.dxf.end_param})data['ELLIPSE']=ellipse_datareturndatadefremove_duplicates(self,lst):res=[]seen={}foriinlst:ifinotinseen:seen[i]=1res.append(i)returnres#示例调用if__name__=="__main__":#DWG文件路径DWG_path="/home/hyh/data/Maintenance_test_data/AIN.dwg"format="dwg_txt"dwf=dwg_analysis(DWG_path,format)dwf_txt=dwf.dwg2data()output_path=os.path.join(os.path.dirname(DWG_path),os.path.basename(DWG_path).split(".")[0]+"_"+format+".json")withopen(output_path,'w',encoding='utf-8')asf:json.dump(dwf_txt,f,ensure_ascii=False,indent=4)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 05:58 , Processed in 0.434773 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表