AutoCAD DXF文件格式与二次开发图形软件编程
本帖最后由 飞电 于 2013-12-15 15:49 编辑AutoCAD DXF文件格式与二次开发图形软件编程
刘传亮, 陆建德
(苏州大学 计算机学院,江苏 苏州 215006)
摘 要: DXF 格式文件是传统图形开发中最常用的图形交换格式之一, 众多第三方开发的图形软件均加入了对 DXF 文件的支持。针对DXF 格式文件的二次开发问题,简要介绍了DXF 格式交换文件的结构,详细分析了各代码段与组码的含义及其关系。以及在DXF 二次开发图形软件中针对DXF 文件格式的编程方法。在此基础上对DXF 文件格式的版本演进与不同版本间格式进行了细致的分析与比较, 通过在一个具体项目中的应用, 给出了一个通用的、 具有版本兼容性的 DXF 文件编程方法,为类似图形软件的二次开发提供了一个解决方案。
关键词: AutoCAD; DXF 文件;版本;图形软件;autocad论坛
中图分类号: T P311. 1 文献标识码: A 文章编号: 1005- 3751( 2004) 09- 0101- 04
Analysis on AutoCAD DXF File Format and the 2nd
Development Graphics Software Programming
LIU Chuanliang , LU Jiande
( School of Computer Science and Technology , Suzhou Univ. , Suzhou 215006, China)
Abstract: T he DXF form at is one of the w idely used graphics exchange format s in the t raditional graphics appl i cat i on development . The lots of 3rd part y- developed graphics software have supported DXF f ormat. T o resolve the DXF f ormat s 2nd development problem , this paper has i nt roduced the st ructure of the DXF format exchangeable file in brief and has compared the cont ent s and evolut ion betw een the differ ent versions of DXF f i le format . The paper has discussed and analyzed in det ail the programming methods t o DXF f ile format in the 2nd development . Finally, w i th an applicat ion in a specif ic project , the paper gives a common and version - compat ible solution f or the same kinds of application development .
Key words:AutoCAD; DXF file; version; graphics softw are
收稿日期: 2003- 12- 16
作者简介: 刘传亮( 1975 ) , 男, 江苏徐州人, 硕士研究生, 研究方向为计算机应用、 计算机网络。
0 引 言
DXF( Drawing Interchange Format, 图形交换格式) 是AutoCAD 图形文件中所包含的全部信息的标记数据的一种表示方法, 是 AutoCAD 图形文件的 ASCII 或二进制文件格式[ 1],可用于在 AutoCAD 和其他图形应用程序之间输入、 输出与交换图形文件。AutoCAD 很早就开始在中国广泛使用, 有大量的 DXF 格式的交换文件保存下来。随着 AutoCAD 的发展, 其 DXF 文件格式从 AutoCADR12, R13, R14, 到 AutoCAD2000, 2000i, 再 到 AutoCAD2002也有了较大变化。考虑到它被使用的普遍性,为了使其产生的图形数据文件具有更多的兼容性, 一些其它开发的图形软件加进了读写 DXF 文件的功能, 这里把这些图形软件叫做 DXF 文件的二次开发软件。在设计具有DXF 文件读写功能的二次开发图形软件时需要深入分析 DXF 格式交换文件的结构, 也一定要考虑产生 DXF 文件的各AutoCAD 版本的差异。笔者参加了开发 YH 线切割自动编程控制系统,该系统的软件部分本身已包含图形的生成、 编辑功能。考虑到AutoCAD 有众多的用户, 为了方便使用者, 使 AutoCAD 生成的图形文件也能读入 YH自动编程系统中使用,在该二次开发图形软件中即加进了读取 DXF 文件的功能。也考虑了要能够读取 AutoCAD各版本生成的 DXF 文件。文中将在分析 DXF 文件格式的版本演进与不同版本间格式比较的基础上, 对在二次开发图形软件中针对不同版本的 DXF 文件格式的读入编程方法进行探讨。
1 基本的DXF文件格式结构
AutoCAD 生成的 DXF 文件既可以是 ASCI I 格式也可以是二进制文件格式, ASCI I 格式比二进制文件格式更常见, 文中使用术语 DXF 文件表示ASCII DXF 文件。DXF 文件本质上是由成对的代码和与代码关联的值组成的。这些代码( 即组码) 不仅指出了其后组值的类型,而且与此组值配对。通过使用这些配对的组码和组值,DXF 文件被组织成段, 这些段由记录组成, 而记录又由依次排列的组码和数据条目组成。在 DXF 文件中, 每个组码和每个数据条目都各占一行。DXF 文件就这样包含了所有用户指定的信息, 每个数据以一个组码及一个数据元素( 组值)组成, 组码的值表明了其后数据元素的类型, 也指出了数据元素对于给定对象( 或记录)类型的含意。文件总是以一行组码跟一行组值组成,因此规定组值的最大长度不能超过 255 个字节(AutoCAD2000以后组码 0~ 9及1000~ 1009已经去除了255个字符的限制, 但通常小于 2049 个字节) , 这种规律使得编程设计更加方便。完整的 DXF 文件由七个段( SECT ION) 组成。每个段由一行组码0及一行字符串 SECTION 开始, 紧接着是组码 2及一行表示段名称的字符串( 例如HEADER)。段的结束由一行组码 0 及一行表示该段结束的字符串ENDSEC。这些段中的内容由对象或图元组成, 而这些对象或图元由标志它们属性的组码和组值组成。整个文件以一行组码 0及一行EOF 结束。以下列出的是各个段的段名及段中包含的信息:
* HEADER 段。该段包含与本图形文件有关的基本信息,它由一个 AutoCAD 数据库版本号、 存盘时的各种设置和许多系统变量组成。每个参数包括一个变量名及其组值。
* CLASSES段。该段包含有关应用程序定义类的信息, 这些类的实例包含在 BLOCKS 段、 ENT IT IES 段和OBJECTS 段的数据中。类定义在类的层次结构中是固定不变的。
* TABLES段。该段包含如下符号表的定义, 每个表的表项数目可变:
APPID(应用程序标识表)
BLOCK- RECORD( 块引用表)
DIMSTYLE(标注样式表)
LAYER(图层表)
L TYPE( 线型表)
STYL E(文本样式表)
UCS( 用户坐标系表)
VIEW(视图表)
VPORT (视口配置表)
* BLOCKS段。该段包含有在 AutoCAD 中定义的块。包括块定义和组成图形中每个块引用的图形图元。
* ENTITIES 段。包含图形中出现的所有图形对象(图元) ,包括对块的引用( 插入图元)。
* OBJECTS 段。该段包含那些没有图形显示的非图形对象, 如包含多线和组的字典、 图层等信息。所有那些非符号表记录的、 符号表的和非图元的对象都储存在此段中。
* THUMBNAILIMAGE段。该段为可选, 如果存盘时有预览图像则需要该段。组码和组值定义了对象或图元的特定样子。组值的数据类型可以是字符串型、 整型或浮点数型, 例如点的 X坐标。如果图形 DXF 文件的最大字符串长度超过 256 个字符,在 SAVE, SAVEAS和 WBLOCK 时这些字符串将被删除,在 OPEN 和 INSERT 时它们会导致操作失败。一个 DXF文件的结构可以不必都有这七个段, 如果没有设置HEADER 段中的变量,整个HEADER 段将被忽略;若不需要建立条目, TABLES 段中的表可以被忽略, 若不需要整个 TABLES 段中的内容, 可以将其全部忽略。若用户在 LT YPE 表中定义了任一线型, 则此表必须出现在 LAYER 表前。若图形中没有使用任何块定义, 则也可以忽略整个 BLOCKS 段。但若图形中使用了块定义, 则BLOCKS段必须出现在 ENTIT IES 段前。在 ENT ITIES段中,用户可以引用未在 LAYER 表中定义的图层名, 这些图层将被自动创建, 并且使用颜色 7和 CONTINUOU S线型。最后, 在文件的尾部必须出现 EOF项。下面以DXF 文件中最主要的几个段的组码为例说明各个段的结构( 注:以; 开始的为本文注解) ,详细的组码与组值定义可参见Autode sk公司的有关文档和手册。
( 1)HEADER 段组码:
; * * * * * * * * * * * * * * * * * * * * * * * *
0 ; HEADER 段的开始
SECT ION
2
HEADER
; * * * * * * * * * * * * * * * * * * * * * * * *
9 ;描述的每一个头部变量
$ < 变量> ;
< 组码> ;
< 值> ;每一个头部变量都按此四行重复
; * * * * * * * * * * * * * * * * * * * * * * * *
0 ; HEADER 区域的结束
ENDSEC
( 2) ENTITIES 段的图元组码:
; * * * * * * * * * * * * * * * * * * * * * * * *
0 ; ENTIT IES 段的开始
SECT ION
2
ENT IT IES
; * * * * * * * * * * * * * * * * * * * * * * * *
0 ;每一图元定义为一个条目
< 图元类型>
5
< 句柄>
330
< 指向所有者>
100
AcDbEntity
8
< layer>
100
AcDb< 类名>
.
. < 数据>
.
; * * * * * * * * * * * * * * * * * * * * * * * *
0 ; ENT IT IES 段的结束
ENDSEC
2 不同版本DXF 文件格式的比较与分析
( 1)DXF 文件格式的发展与版本比较、 判别。美国Autodesk公司于 1982年推出AutoCAD 的第一个版本。AutoCAD R12于 1992年 7月正式推出, 这是一个主要基于 DOS系统的版本。当时正值中国微机普及的快速发展时期, R12 在中国的使用曾相当普遍。R12 的DXF 文件只有 HEADER, TABLES, BLOCKS 和 ENT IT IES四个段。由于 R12 不是面向对象的, 所以没有CLASSES 和OBJECTS 段。分别于 1994年和 1997年推出的 R13和R14版本是第一代以Windows为平台的 AutoCAD 版本, 再加上硬件水平的处理能力的提高,使得AutoCAD 的功能大大增强。同时还支持了面向对象, 使得这些版本的 DXF 格式有了相当大的变化: 加入了 CLASSES和 OBJECTS 段, 并增加了 ELLIPSE( 椭圆)、 LWPOLYLINE( 多义线)、 SPLINE
样条曲线) 等大量实用图元类型。其后推出的AutoCAD2000, 2000i 及2002版本分别在设计环境、 人机界面和 Internet 等功能上做了改进。这些版本 DXF 文件格式改进不大,只做了局部的修改, 另外增加了一个可选的 THUMBNAILIMAGE段。DXF 文件版本信息存储在HEADER 段的开头, 其中的第一个组码 9 组值为$ ACADVER, 标志版本变量开始, 第二个组码 1组值为标志版本号的字符串。表 1列出版本号字符串与AutoCAD 对应版本的对照列表, 在设计DXF 文件的二次开发图形软件时可以据此进行版本号的判别。各版本$ ACADVER 组码对照如表 1所示。
表 1 AutoCAD 各版本的 DXF版本号
$ ACADVER值 AutoCAD版本
AC1006 AutoCAD R10
AC1009 AutoCAD R11、 R12
AC1012 AutoCAD R13
AC1014 AutoCAD R14
AC1015 AutoCAD R15、 2000
AC1015. 05 AutoCAD 2000i
( 2)DXF 文件格式主要变化的分析比较。R12与 R14 版本间的 DXF 文件格式变化较大, R12与R14版本的 AutoCAD 都是曾经广泛使用的版本, 下面仅就R12与 R14的 DXF 文件格式的主要变化加以分析。AutoCAD 从 R13 开始支持面向对象, 这时的图形信息除了可以显示的图元外,还增加了其他代表各种参数信息的对象。在 DXF 文件格式中新出现的段 CLASSES 和OBJECT S分别存储了用户和程序定义的类和对象。另一个较大的变化是在图元类型上, 以前 R12 的DXF文件只支持一些简单的图元类型, 对于圆锥曲线等复杂曲线都是用 POLYLINE( 多段线) 来表示, 记录的内容为曲线上采样的各个点。由于需要取得较多的点以使曲线平滑, 所以导致了最后的 DXF 存盘文件尺寸变大。以一个简单的椭圆为例, 在缺省精度下要记录 129个顶点( VERTEX) , 每个顶点在文件里占 14行,共需 1806行。从 R13开始补充了大量的新图元类型, 图元的表示上也有了简化和改进。以前的 VERTEX, POLYLINE 等图元类型予以保留, 增加的图元在数据表示上更加灵活高效。多数复杂曲线图元只记录对象的属性值, 而不象 R12以前版本那样采用多段线表示。以椭圆为例, R13以后版本只需记录圆心坐标、 长轴端点坐标、 长短轴比例即可, 每个椭圆在文件里只占 36行, 比 R12少占用大量空间。
3 具有版本兼容性的DXF 二次开发图形软件的编程方法
根据以上分析, 在 DXF 文件的二次开发图形软件设计中,如果用户以表驱动方式( 忽略未定义即老版本不能识别的组码, 且对图元中的组码次序不做任何假定) 编写DXF 处理程序, 那么该程序将比较容易针对AutoCAD 的后续版本做调整[ 2]。这是因为 AutoCAD 以后版本的性能将不断得到增强, 图元中将添加一些新组码以提供更多功能,二次开发图形软件中可以随之进行相应灵活的调整,而在这之前, 对未定义的组码仅是忽略而已, 不影响其对老版本图元组码的识别和处理。在 YH 线切割自动编程控制系统的设计中,即采用了以上方法完成 DXF 文件读取功能。下面是用 VC6. 0编写的读取 DXF 文件模块的部分流程, 如图 1所示。下面是用 VC6. 0编写的读取圆弧图元的部分程序。R12与R14版本的 DXF 文件中圆弧的组码顺序不同, 但是采用以下程序后都能将圆弧的各个参数正确读出[ 3]。
void CDx f: : ReadArc( F IL E* fp, CDC* pDC) {
int gCode; / / 组码
f loat x1, y1, r, start , end, pi= 3. 1415926; / /弧心、 半径、 起
始角度等本地变量
char str[ 80] ;
fscanf ( fp, %s \ n , str) ;
do {
gCode= atoi( str) ;
switch ( gCode) {
case 10: / / 读到组码 10 ,下一行为圆弧 x 坐标
fscanf( fp, % f \ n , & x1) ; / / 读取圆弧 x 坐标
break;
case 20:
fscanf ( fp, %f \ n , & y1) ; / / 读取圆弧y 坐标
break;
/ / 读取其他参数
default :
fscanf ( fp, %s \ n , str) ;
break;
}
fscanf( fp, % s \ n , str) ; / / 此处总是读到组码
} while ( strcmp( str, 0 ) ! = 0) ; / / 组码 0 ,退出循环
DrawArc( pDC, x1, y1, r, start , end) ;
}
4 结束语
笔者对二次开发图形软件 YH 系统的 DXF 读入编程进行了详细的分析, 并经反复比较各版的 DXF 文件格式读入测试,使 YH 系统的设计取得了成功, 获得了很好的效果。
参考文献:
[ 1] 罗卓书. AutoCAD 2000中文版基础培训教程[ M] .北京:电
子工业出版社, 2000.
[ 2] 清宏计算机工作室. AutoCAD 工程二次开发[ M] . 北京:机
械工业出版社, 2000.
[ 3] 方 铁. AutoCAD C语言高级编程[ M] . 北京:清华大学出
版社, 1995.
表 1 可重用构件的信息表结构
可重用构件名 功能描述 地址 权限 说明 属性 详细内容
可重用构件名: 是用户区别可重用构件的惟一标识;
功能描述: 简要描述可重用构件的功能;
地址: 描述可重用构件在库中的地址, 用于方便地检索构件;
权限: 描述构件是只读,还是可读写, 及组内外用户其进行读写操作的权限;
说明: 存放构件的功能,如何使用该构件等详细内容;
属性: 构件中面向用户的信息, 如构件的作者、 建立日期、 算法出处等信息;详细内容: 包括相应的文档、 动态连结库、 ODD 图、 以PAL 描述的 PAD 等信息。在这个文件中, 用户可以方便地对构件进行插入、 查找和使用, 此过程具有对用户透明的特点。
5 结束语
文中在基于构件的 PDM 系统框架的开发基础上, 提出了框架中工程数据的管理实现的方法和技术以及 PDM系统中构件的管理, 从而使得基于构件开发的 PDM 系统是个能够实现 即插即用的支撑平台,此系统能有效地支持在分布、 异构多用户环境中的信息、 功能和过程的集成,又能对应用领域工具产生的各种异构数据进行管理和传递,保证数据的共享。
参考文献:
[ 1] 杜晓明, 张本生, 甘茂治.并行环境下基于组件的 CAD 框架模型研究[ J] 计算机工程与应用, 2002, 39( 4) : 215-216
[ 2] 韩 鑫. 产品数据管理系统的构造框架和实现方法[ J] .软件学报, 1998, 9( 12) : 881- 883
[ 3] 李 炜,张 利, 张建军. 并行设计环境的柔性 PDM 系统框架研究[ J] 合肥工业大学学报, 2004, 26( 4) : 392- 395
[ 4] 陆 薇.基于组件的开放式 CAD 系统模型[ J] . 软件学报,1998, 9( 9) : 651- 655
[ 5] 贾宏宇. 基于构件/ 构架复用技术的工控软件设计研究[ J]计算机工程与应用, 2002, ( 1) : 130- 132
[ 6] Kuokka R. Communicat ion i nfrastructure for Concurrent Engineering [ J] . Ar tif icial Intelligence for Engineering Design,1995, ( 9) : 283- 297
页:
[1]