DWG DXF 解析与可视化
概述
-
DWG 是AutoCAD软件保存设计数据使用的一种文件格式;二进制格式,数据结构并没有开源;,并没有开源; 因此关于dwg文件解析工具大多是收费的;免费的有LibreDWG , ODA , QCAD pro ; 上面部分包含商业版,需要收费;但其免费版本,基本也满足需求;
-
DXF [Drawing eXchange File], 是AutoCAD 提供对外产品数据交换的格式,数据结构是对外开放的;因此,dxf格式文件得到广泛的应用; 文件数据的存储形式包含 ASCII 和 二进制;优缺点:
- ASCII : 可以以明文方式展示,可以直接阅读;但解析速度慢,文件占用空间
- 二进制:乱码,解析速度快,文件存储占用空间小;
- AutoCAD 2011_DXF 格式
- 网络上有不少开源的库,支持dxf的解析;
dxflib SourceForge_dxflib 里面包含了详细资料;
ezdxf AND it’s Tutorials
Draft-dxf-importer
netDxf
解析与可视化流程
-
DWG格式文件,使用免费的转换器转换成dxf格式,转换器采用ODA_converter
【注意】在我电脑上 ODA这个官网有点问题,需要把浏览器窗口放大,然后拖拽缩小,才能正常显示内容;并且需要把左边导航页面删除;(这个网站有点一言难尽);
oda_file_converter的source code 找到入口,但是也要注册;(Drawings_XX\Drawing\Examples\Qt\OdaFileConverter 通过这个关键词找到source code入口)
找sourcecode 主要目的为了集成到软件时,导入dwg在进程内部通过cmdline 的方式启动ODA_converter转成dxf格式; 不过通过其它途径也找到了cmdline的参数;就不折腾了; -
使用dxflib 库解析dxf文件
-
几何表达与渲染
实现
- dwg convert to dxf
/*
# PARAMS:
# Input folder
# Output folder
# Output version: ACAD9, ACAD10, ACAD12, ACAD14, ACAD2000, ACAD2004, ACAD2007, ACAD20010, ACAD2013, ACAD2018
# Output file type: DWG, DXF, DXB
# Recurse Input Folder: 0, 1
# Audit each file: 0, 1
# (Optional) Input files filter: *.DWG, *.DXF
*/
const QString TEIGHA_PATH = "\"E:/Program Files/ODA/ODAFileConverter 25.1.0/ODAFileConverter.exe\"";
const QString INPUT_FOLDER = "F:/E/My_Test_Prj/01-CADModel/02-dwg_dxf";
const QString OUTPUT_FOLDER = "F:/E/My_Test_Prj/01-CADModel/02-dwg_dxf/dxf";
const QString OUTVER = "ACAD2018";
const QString OUTFORMAT = "DXF";
const QString RECURSIVE = "0";
const QString AUDIT = "1";
const QString INPUTFILTER = "*.DWG";
//const QString INPUTFILTER = "tablet.dwg";
QStringList arguments;
arguments.append( INPUT_FOLDER);
arguments.append( OUTPUT_FOLDER);
arguments.append( OUTVER);
arguments.append( OUTFORMAT);
arguments.append( RECURSIVE);
arguments.append( AUDIT);
arguments.append( INPUTFILTER);
QProcess process;
process.start(TEIGHA_PATH, arguments);
process.waitForFinished();
process.terminate();
- dxf parsing
2.1 文件组成:
-
标题段(Header): 记录AutoCAD系统的所有标题变量的当前值或当前状态。标题变量记录了AutoCAD系统的当前工作环境,如SNAP捕捉当前状态、栅格间距式样、当前图层层名及线型、颜色等
-
表段(TABLES):表段共包含以下,每个表又包含可变数目的表项。
Application ID (APPID) 表
Block Recod (BLOCK_RECORD) 表
Dimension Style (DIMSTYPE) 表
Layer (LAYER) 表
线型表 (LTYPE) 表
Text style (STYLE) 表
User Coordinate System (UCS) 表
View (VIEW)表
Viewport configuration (VPORT) 表 -
块段(BLOCKS)块段记录了所用块的块名,当前图层层名、块的种类、块的插入基点及组成该块的所有成员。块的种类分为图形块、带有属性的块和无名块三种。无名块包括用HATCH命令生成的剖面线和用DIM命令所完成的尺寸标准。
-
实体段(ENTITIES)实体段记录了每个实体的名称、所在图层及其名字、线型、颜色等。
-
OBJECTS 部分 – 包括非图形对象的数据,供 AutoLISP 以及 ObjectARX应用程序所使用。
-
THUMBNAILIMAGE 部分 – 包括 DXF 文件的预览图。
-
文件结束段(EOF OF FILE)DXF文件的结束标志。
具体可以查看帮助文档;在网上找到一份中文版;如下图所示 ;
2.2 注意事项
由于解析dxf文件的目的主要用于提取里面的几何数据,用于生成加工刀路;这里也只对里面的几何信息感兴趣;
- 解析几何数据需要注意单位;
- 部分几何数据包含在Blocks段中,并且Blocks包含了 多个Block,每个Block包含了多个Entity;
在Entities 里面,可以通过Insert 引用前面已经定义过的Blocks.
2.3 结果
解析可以借助上面提及的开源库,也可以从一些开源项目中抽取一些源码集成进来;本质上我们并不需要dwg/dxf里面所有信息; 一般只需要几何信息;下面是结果的展示;