DWG文件转DXF
dwg文件转dxf文件主要用到的是ezdxf模块(ezdxf-addons-odafc配置),该模块支持R2018以下所有dwg格式文件的转换以及读取,非常好用。
下面是odafc读取和转换dwg文件的代码:
from ezdxf.addons import odafc
# 读取dwg文件
doc = odafc.readfile('**.dwg' # dwg文件名或者路径)
# 转换dwg文件。replace=true允许覆盖已有文件。
# 输出文件可用空字符代替'',转换后文件会默认输出到输入文件所在目录,与输入文件同名。
odafc.convert('input.dwg', 'out.dxf', version='R2000', replace=True)
未知版本的dwg文件转为dxf后,就可利用ogr模块对dxf文件进行操作,通过geometry的ExportToWkb或者ExportToWkt把几何要素转为对应的字符串格式。完整代码如下:
from osgeo import ogr
import sys
from ezdxf.addons import odafc
class file2geo:
def __init__(self, filepath, layername):
self.filepath = filepath
self.layername = layername
def dwg2wkb(self):
# dwg文件转换为2000格式的dxf文件, 因为ogr不支持读取高版本dwg
odafc.convert(self.filepath, 'out.dxf', version='R2000', replace=True)
geometry_list = []
# 图形类型列表
geomtype_list = ['AcDbEntity:AcDbPolyline', 'AcDbEntity:AcDb3dPolyline', 'AcDbEntity:AcDbCircle:AcDbArc',
'AcDbEntity:AcDbLine', 'AcDbEntity:AcDb2dPolyline']
driver = ogr.GetDriverByName('DXF')
datasource = driver.Open('out.dxf')
if datasource is None:
sys.exit('无法打开文件{0}.'.format(self.filepath))
layer = datasource.GetLayer() # dxf文件只有一个图层
feature = layer.GetFeature(0)
for key in feature.keys():
print(key, end=' ')
print()
for feature in layer:
# 根据图层名和图形类型过滤feature(图层在dxf文件中只是一个字段)
if feature.GetField('Layer') == self.layername and feature.GetField('SubClasses') in geomtype_list:
for key in feature.keys():
print(f'{feature.GetField(key)}', end=' ')
print()
geom = feature.geometry()
geometry_list.append(geom.ExportToWkb()) # 转为wkb二进制文件,如果用WKT则转为文本文件
return geometry_list