图形交换文件(DXF)是AutoCAD与其他应用程序交换图形数据时最常使用的文件格式,DXF文件包括ASCII DXF和二进制DXF格式。ASCII DXF以文本形式存储,其特点是结构简单易读。以ASCII DXF文件作为图形数据交换的AutoCAD二次开发方式目前已被广泛使用,本书第四章介绍的带约束TIN模型生成程序的开发就采用这种方式。该开发方式具有编程语言灵活多样的特点,并且程序的执行不依赖于AutoCAD的存在。下面将对ASCII DXF文件的基本结构、组码形式和接口程序的编写进行简要介绍。
1.DXF文件的基本结构
DXF文件本质上由代码及关联值对组成。代码(通常称为组码)表明其后的值的类型。使用这些组码和值对,可以将DXF文件组织到由记录组成的区域中,这些记录由组码和数据项目组成。在DXF文件中,每个组码和值都各占一行。每段都以一个后跟字符串SECTION的组码0开始,其后是组码2和表示该段名称的字符串(例如,HEADER)。每段都由定义其元素的组码和值组成。每段都以一个后跟字符串ENDSEC的组码0结束。为了方便理解DXF文件的基本结构,可在AutoCAD下绘制简单内容后保存为DXF格式,用记事本程序打开对比查看。DXF文件完整的结构如下:
(1)HEADER段,包含有关图形的基本信息。它由AutoCAD数据库版本号和一些系统变量组成。每个参数都包含一个变量名称及其关联的值。
(2)CLASSES段,包含应用程序定义的类的信息,这些类的实例出现在数据库的BLOCKS、ENTITIES和OBJECTS段中。类定义在类的层次结构中是固定不变的。
(3)TABLES段,包含以下符号表的定义:APPID(应用程序标识表)、BLOCK_RECORD(块参照表)、DIMSTYLE(标注样式表)、LAYER(图层表)、LTYPE(线型表)、STYLE(文字样式表)、UCS(用户坐标系表)、VIEW(视图表)、VPORT(视口配置表)。
(4)BLOCKS段,包含构成图形中每个块参照的块定义和图形图元。
(5)ENTITIES段,包含图形中的图形对象(图元),其中包括块参照(插入图元)。
(6)OBJECTS段,包含图形中的非图形对象。除图元、符号表记录以及符号表以外的所有对象都存储在此段。OBJECTS段中的条目样例是包含多线样式和组的词典。
(7)THUMBNAILIMAGE段,包含图形的预览图像数据。此段为可选。
2.DXF文件的组码形式
DXF文件的组码形式包括标题组码、类组码、符号表组码、块组码、图元组码和对象组码。组码和关联值可共同定义对象或图元的特定方面,紧接组码的一行是关联值,该值可以是字符串、整数或浮点值,例如点的坐标。组中第二行后面的行(如果存在)由组定义和与组关联的数据确定。特殊组码用作文件分隔符,例如用于表示段和表的开始和结束,以及文件本身结束的标记。图元、对象、类、表和表条目以及文件分隔符通过0组码(其后是用于描述该组的名称)引入。DXF文件字符串的最大长度是256个字符。如果AutoCAD图形中包含的字符串超出了此长度,则在执行SAVE、SAVEAS和WBLOCK时将截断这些字符串;如果DXF文件包含的字符串超出了此长度,OPEN和INSERT命令将失败。表2-1列出了适用于几乎所有图形对象的组码。此处显示的某些组码仅在图元特性具有非默认值时才包含在图元定义中。
表2-1 适用于所有图形对象的组码
续表
在编程过程中经常使用的图元有点(Point)、多段线(Polyline)、顶点(Vertex)和三维面(3DFace)等,下面将对以上图元的组码信息进行介绍。
(1)点组码。表2-2中的组码适用于点图元,这里的点不同于多段线及三维面等图元的顶点。
表2-2 适用于点图元的组码
(2)多段线/多面网格组码。表2-3中的组码适用于多段线和多面网格图元。需要说明的是,多面网格在DXF中是由各种多段线图元来表示的。多段线标题通过在多段线标志70组码中显示64位编码来引入多面网格。71组码指定网格中的顶点数,72组码指定面数。多段线标题之后是指定顶点坐标的一系列顶点图元,随后是组成网格的曲面。
AutoCAD图元结构对给定图元所指定的顶点数有限制。可以将复杂的多边形分成一些三角形楔体来表示。它们的边应不可见,以防将此细化部分的可见内容绘制出来。PFACE命令自动执行此细化操作,但是当应用程序直接生成多面网格时,应用程序必须自行执行此操作。在此细化处理中,每个面上的顶点数是关键参数。PFACEVMAX系统变量为应用程序提供每个面图元的顶点数,该值为只读,设置为4。
使用PFACE命令创建的多面网格始终是通过先使用所有顶点坐标图元,然后使用曲面定义图元的方法来生成的。处理多面网格的AutoCAD代码要求按此顺序执行。生成DXF格式的多面网格的程序应先生成所有顶点,然后生成所有面。而读取DXF格式多面网格的程序应忽略顶点和面的生成顺序。
表2-3 适用于多段线图元的组码
多面网格每个顶点的顶点标志均设置为128。如果图元提供网格顶点的坐标,则设置为192(64+128),10、20、30组码给出顶点坐标。顶点索引值按顶点图元在多段线中出现的顺序确定,第一个设置为1。如果顶点定义网格的一个面,则它的顶点标志组设置为128,而不是64。这种情况下,曲面图元的10、20、30(位置)组码不相关,并且在DXF文件中始终写为0。定义网格的顶点索引由71、72、73和74组码给出,其值指定了先前由索引定义的某一顶点。如果索引值为负,则从该顶点开始的边不可见。
(3)顶点组码。表2-4中的组码适用于图元的顶点,这类图元包括直线、多段线、样条曲线、多面网格和三维面等。
表2-4 适用于图元顶点的组码
(4)三维面组码。表2-5中的组码适用于三维面图元。
表2-5 适用于图元顶点的组码
3.DXF文件的接口程序(www.xing528.com)
DXF文件接口一般包括DXF文件的读取和DXF文件的输出两个模块,下面以Visual Basic编程语言为例,说明DXF文件接口程序的编写方法。
(1)读取DXF文件。
以下是一个简单的Visual Basic程序样例,它读取DXF文件,并且从给定段的给定对象中提取特定代码和值。
ReadDXF函数从DXF文件中提取指定的代码/值对。此函数需要四个字符串参数、一个有效的DXF文件名、一个DXF段名、该段中对象的名称以及由逗号分隔的代码列表。
ReadCodes函数从打开的文件中读取两行,并返回一个包含两个项目的数组、一个组码及其组码值。只要一次读取DXF文件中的两行代码,所有程序应该都能够顺利运行。但为了使代码更可靠,应该添加一些进行错误检查和其他检查的代码。
(2)写入DXF文件。
与编写读取DXF文件的程序相比,编写创建DXF文件的程序更困难一些,因为必须保持图形的一致性,这样AutoCAD才能找到可接受的文件。AutoCAD允许省略DXF文件中的很多项目,且仍然能够获得可用的图形。
1)如果不设置标题变量,则可以省略整个HEADER段。
2)如果不需要创建条目,则可以省略TABLES段中的任何表;如果不需要TABLES段中的任何内容,则可以省略整个TABLES段。
3)如果在LTYPE表中定义了线型,则此表必须显示在LAYER表之前。
4)如果图形中未使用任何块定义,则可以省略BLOCKS段。
如果BLOCKS段存在,则该段必须出现在ENTITIES段之前。
5)在ENTITIES段中,尽管未在LAYER表中定义图层名,仍然可以参照这些图层名。系统自动使用颜色7和CONTINUOUS线型创建此类图层。
6)文件结尾处必须存在EOF项目。
下面以Visual Basic实例程序来说明创建输出多边形的DXF文件的过程。函数WriteDXFPolygon用来创建一个DXF文件,其中只包含ENTITIES段。此函数需要5个参数:DXF文件名、多边形的边数、最右侧一条边(这条边为竖直方向)底部端点的X坐标和Y坐标以及每条边的长度。注意:因为这里只要求二维点,所以不包含Z坐标(代码30和31)。直线置于Polygon图层中。
只要在需要数据的行上写入了格式正确的数据,DXFIN才会接受此函数输出的DXF文件。此函数利用了输入格式的灵活性,它生成的文件与Auto-CAD输出的文件并不完全相同。如果在AutoCAD下使用DXFIN时出现错误,AutoCAD将提示出错信息,指明错误的性质和错误位置。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。