DXF文档详解.doc

上传人:hw****26 文档编号:3932684 上传时间:2019-08-26 格式:DOC 页数:59 大小:341KB
下载 相关 举报
DXF文档详解.doc_第1页
第1页 / 共59页
DXF文档详解.doc_第2页
第2页 / 共59页
DXF文档详解.doc_第3页
第3页 / 共59页
DXF文档详解.doc_第4页
第4页 / 共59页
DXF文档详解.doc_第5页
第5页 / 共59页
点击查看更多>>
资源描述

1、DXF 文档详解DXF 的基本惯例DXF 格式是特定版本 AutoCAD 图形文件中所包含的全部信息的标记数据的一种表示方法。标记数据的意思是指在每个数据元素前都带一个称为组码的整数。组码的值表明了其后数据元素的类型,也指出了数据元素对于给定对象(或记录)类型的含意。实际上,图形文件中所有用户指定的信息都能够以 DXF 文件格式表示。在 AutoLISP 和 ARX 应用程序中使用的 DXF 格式与上述格式基本相同,只是在某些数据组上存在着细微的差别。如不作特殊说明,本节中所出现的组码都可以应用于 DXF 文件、AutoLISP 应用程序和 ARX 应用程序。当组码说明对于应用程序和 DXF

2、文件有所不同时(或只适用于其中之一) ,在组码的说明前有如下提示符:APP 只用于应用程序的说明DXF 只用于 DXF 文件的说明如果组码说明对 DXF 文件和应用程序都适用,那么没有提示符;否则将显示适当的提示符。组码范围组码将与组码关联的值(组值)定义为整型、浮点数型或字符串型。具体说明如下表:组码范围 组码范围组值类型0-9 字符串(最多 255 个字符,对于 UNICODE 字符串则更少)10-59 双精度三维点60-79 16 位整数值90-99 32 位整数值100 字符串(最多 255 个字符,对于 UNICODE 字符串则更少)102 字符串(最多 255 个字符,对于 UNI

3、CODE 字符串则更少)105 表示十六进制句柄值的字符串140-147 双精度标量浮点值170-175 16 位整数值280-289 8 位整数值300-309 任意文字字符串310-319 表示二进制数据组的十六进制值的字符串320-329 表示十六进制句柄值的字符串330-369 表示十六进制对象标识符的字符串999 注释(字符串)1000-1009 字符串(最多 255 个字符;对于 UNICODE 字符串则更少)1010-1059 浮点值1060-1070 16 位整数值1071 32 位整数值按数字次序排列的组码下表给出了组码(或组码范围)及其说明。在表中, “固定”表示该组码的用

4、途固定不变,非固定组码的用途将随上下文变化。按数字次序排列的图元组码组码说明-5APP: persistentreactor 链表-4APP:条件运算符(仅用于 ssget)-3APP:扩展数据(XDATA)标记(固定)-2APP:图元名引用(固定)-1APP:图元名。每次打开图形时它都改变,且不被保存。 (固定)0 表示图元类型的文字字符串(固定)1 图元的主要文字值2 名称(属性标记、块名称等)3-4 其他的文字值或名称值5 图元句柄。最多 16 位十六进制数字的文字字符串(固定)6 线型名(固定)7 文字样式名(固定)8 图层名(固定)9 DXF:变量名标识符(仅用于 DXF 文件的 H

5、EADER 区域) 。10 主要点。此点为直线或文字图元的起点,圆的圆心等等。DXF:主要点的 X 值(其后为 Y 和 Z 值的组码 20 和 30)APP:三维点(三个实数构成的表)11-18 其他点。DXF:其他点的 X 值(其后为 Y 和 Z 值的组码 21-28 和 31-38)APP:三维点(三个实数构成的表)20,30 DXF:主要点的 Y 和 Z 值21-28,31-37 DXF:其他点的 Y 和 Z 值38 DXF:如果非零,则为图元的标高。只在 R11 以前的 AutoCAD 输出的 DXF 文件中存在39 如果非零,则为图元的厚度(固定)40-48 浮点值(文字高度、比例因

6、子等)48 线型比例。浮点标量值。缺省值适用于所有图元类型。49 可重复的浮点值。一个图元中的可变长度表(例如 LTYPE 表中的虚线长度)中可出现多个组码 49。组码 7x 总是在第一个组码 49 前出现,用于指定表的长度。50-58 角度(在 DXF 文件中单位为度,在 AutoLISP 和 ARX 应用程序中单位为弧度) 。60 表示图元可见性的整数值。不赋值或值为 0 时表示可见;为 1 时表示不可见。62 颜色代码(固定)66 “图元跟随” 标志(固定)67 空间,即模型空间或图纸空间(固定)68 APP:表示视口打开但不可见、未激活或者关闭。69 APP:视口标识数字。70-78

7、整数值,如重复部分的计数器、标志位或模式等。90-99 32 位整数值100 子类数据标记(把继承下来的类名当作字符串) 。由具体类继承下来的所有对象和图元类都必须有此项。此标记用于分离某个对象中由不同的类定义的数据。它也满足从 ARX 继承下来的每个独立的具体类的 DXF 命名需要(请参见子类标记!AL(XREF_11832_al_u05_c,1)) 。102 控制字符串,其后为“”或“。除了字符串必须以 “开始外,它与外部数据组码 1002 类似。其后可跟任意字符串,且此字符串的解释取决于应用程序。另一个可用的控制字符串为“,它标识组的结束。如上所述,除了在执行图形核查操作期间外 Auto

8、CAD 一般不解释这些字符串;它们仅用于应用程序。105 DIMVAR 符号表条目对象句柄。210 拉伸方向(固定) 。DXF:拉伸方向的 X 值APP:三维拉伸方向矢量220,230 DXF:拉伸方向的 Y 和 Z 值280-289 8 位整数值300-309 任意的文字字符串310-319 任意二进制数据组,与组码 1004 具有相同表示法和限制:最长为 254 个字符的十六进制字符串表示最长为 127 个字节的数据数据组。320-329 任意对象句柄。句柄值保留原样,在执行 INSERT 和 XREF 操作时它们不被转化。330-339 软键指针句柄。任意指向同一 DXF 文件或图形中的

9、其他对象的软键指针,在执行 INSERT和 XREF 操作时被转化。340-349 硬键指针句柄。任意指向同一 DXF 文件或图形中的其他对象的硬键指针,在执行 INSERT和 XREF 操作时被转化。350-359 软键从属句柄。链接到同一 DXF 文件或图形中其他对象的任意软键从属链接,在执行INSERT 和 XREF 操作时被转化。360-369 硬键从属句柄。链接到同一 DXF 文件或图形中其他对象的任意硬键从属链接,在执行INSERT 和 XREF 操作时被转化。999 DXF: 999 组码表示其后为注释字符串行。DXFOUT 不在 DXF 输出文件中包括此组;DXFIN 能识别词

10、组码,但忽略其后的注释。通过 999 组码,用户可以在所编辑的 DXF 文件中包括注释。1000 扩展数据中的 ASCII 字符串(最长 255 个字节) 。1001 扩展数据的已注册应用程序名(ASCII 字符串,最长 31 个字节) 。1002 扩展数据控制字符串(“或“) 。1003 扩展数据图层名。1004 扩展数据中的字节数据组(最长 127 字节) 。1005 扩展数据中的图元句柄。文字字符串,最多 16 位十六进制数字。1010 扩展数据中的点DXF:X 值(其后跟组码 1020 和 1030)APP:三维点1020,1030 DXF:点的 Y 和 Z 值1011 扩展数据中的三

11、维世界空间位置:X 值(其后跟组码 1021 和 1031):三维点1021,1031 DXF:世界空间位置的 Y 和 Z 值。1012 扩展数据中的三维世界空间位移:X 值(其后跟组码 1022 和 1032):三维矢量1022,1032 DXF:世界空间位移的 Y 和 Z 值1013 扩展数据中的三维世界空间方向DXF:X 值(其后跟组码 1022 和 1032)APP:三维矢量1023,1033 DXF:世界空间方向的 Y 和 Z 值1040 扩展数据浮点值。1041 扩展数据距离值。1042 扩展数据比例因子。1070 扩展数据 16 位符号整数。1071 扩展数据 32 位符号整数。

12、对象和图元的组码在 DXF 格式中,对象的定义与图元的定义不同:图元有图形表示,而对象则没有图形表示。例如,词典是对象而不是图元。对象通常作为非图形对象来使用,图元则作为图形对象来使用。在 DXF 文件中,图元可以出现在 BLOCK 和 ENTITIESE 区域中。两个区域中图元的用法一样。某些定义图元的组码始终会出现,而其他的组码仅在它们的值与缺省值不同时才出现。读取 DXF 文件的程序不应该假定说明图元的组码是按照给定次序出现的。与说明图元的组码相连的0 组码表示此图元已结束。0 组码将开始新图元或表示此区域已结束。注意如果用户以表驱动方式(即忽略未定义的组码,且对图元中的组码次序不做任何

13、假定)编写DXF 处理程序,那么该程序将比较容易针对 AutoCAD 的后续版本做调整。因为 AutoCAD 的性能将不断得到增强,所以图元中将添加一些新的组码以提供更多的功能。读取 DXF 格式文件OpenGL 是美国 SGI 公司最新推出的一套开放式的三维图形软件接口,适用于广泛的计算机环境,从个人计算机到工作站,OpenGL 都能实现高性能的三维图形功能。OpenGL 本身不仅提供对简单图元的操作和控制,还提供了许多函数用于复杂物体的建模。但是,我们通常喜欢使用 AutoCAD 和 3DS 及3Dmax 等工具来建立模型,并且我们已经有了很多这样的模型,那么我们如何才能资源共享,避免重复

14、劳动呢?利用 CAD 图形标准数据交换格式DXF 格式,我们就能很容易地实现资源共享,而不需要重复建模。DXF 文件的结构很清楚,具体如下:1.标题段(HEADER )有关图形的一般信息都可以 DXF 文件的这一节找到,每一个参数具有一个变量名和一个相关值。2.表段这一段包含的指定项的定义,它包括:a、线形表(LTYPE )b、层表(LYER)c、字体表(STYLE )d、视图表(VIEW)e、用户坐标系统表(UCS )f、视窗配置表(VPORT )g、标注字体表(DIMSTYLE)h、申请符号表(APPID)3.块段(BLOCKS )这一段含有块定义实体,这些实体描述了图形种组成每个块的实体

15、。4.实体段(ENTITIES)这一段含有实体,包括任何块的调用。5.ENDOFFILE(文件结束)下面是对 DXF 的基本结构举一实例进行说明:0 0 后接 SECTION SECTION 表明这是一个段的开始2 2 后接的是段名 HEADER 说明该段是 HEADER 段(标题段)9$ACADVER 文件是由 AUTOCAD 产生的1AC10089 9 后接$UCSORG $UCSORG 用户坐标系原点在世界坐标系中的坐标10 10 对应 X 0.0X 的值20 20 对应 Y 0.0Y 的值30 30 对应 Z 0.0Z 的值9 $UCSXDIR 这是一段不太相关的部分,略去101.0.

16、9 9 后接$EXTMIN $EXTMIN 说明三维实体模型在世界坐标系中的最小值10 10 对应 X -163.925293X 的值20 20 对应 Y -18.5415860.0Y 的值30 30 对应 Z 78.350945Z 的值9 9 后接$EXTMAN $EXTMAX 说明三维实体模型在世界坐标系中的最大值10 10 对应 X 202.492279X 的值20 20 对应 Y 112.634300Y 的值30 30 对应 Z 169.945602Z 的值0 0 后接 ENDSEC ENDSEC 说明这一段结束了0 0 后接 SECTION SECTION 表明这是一个段的开始2 2

17、 后接的是段名 TABLES 说明该段是 TABLES 段(表段).该段对我们不太相关,此处略去不进行说明0 0 后接 ENDSEC ENDSEC 说明这一段结束了0 0 后接 SECTION SECTION 表明这是一个段的开始2 2 后接的是段名 ENTITIES 说明该段是 ENTITIES 段(实体段)这是我们要详细说明的段,该段包含了所有实体的 POLYLINE 点的坐标和组成面的点序。0 后接 POLYLINE8 表明以下数据是对于一个新的实体;OBJECT018 后接的字符串是这个实体的名称66170 从 66 1 到 70 6464 说明该实体是由许多小平面组成的7138 71

18、 38 说明该实体共有 38 个点7272 72 72 说明该实体由 72 个三角形构成00VERTEXVERTEX 表明后面紧跟着的是实体的数据8OBJECT0110 对应 X 坐标 -163.925293X 的值20 对应 Y 坐标 -17.772665Y 的值30 对应 Z 坐标 128.929947Z 的值70 70 192192 表明上面的数据信息是点的坐标0 每一个从 0VERTEX 到 70 192 之间 VERTEX 的一小段是点的坐标.701920VERTEX8OBJECT01100200300 当 70 后跟 128 时,表明该实体的每个点的坐标数据已经记录 70 完了,下

19、面紧跟着的是记录这些点是以什么样的方式组合成各 128 个三角形。71 71、72、73 后面跟着的值表明某一个三角形是第二个、第 2 一个、第四个点构成的,点的顺序是按照记入 DXF 文件的顺 72 序。当某一值为负数时,则表明该点到下一点的线不要画出,1 如果要画三维实体的线型图,就必须使用这一特性,否则线条 73 将会出现紊乱。-40VERTEX.0 0 后接 SEQEND 表明该实体的数据已经全部记录完了SEQEND8OBJECT010POLYLINE0 后接 POLYLINE 表明以下又是一个新的实体.0ENDSEC0 后接 ENDSEC 表明这是该段的结尾0EOF0 后接 EOF

20、表明这个 DXF 文件结束了在 DXF 文件中,我们最关心的是如何得到模型上各个点的坐标,并且用这些点连成许多个三用形,构成面,进而绘制出整个模型。在 DXF 文件的结构中,我们已经看到,DXF 文件先叙述实体上各个点的坐标,然后叙述实体上有多少个面,每个面由哪些点构成。这样,我们至少需要 2 个数组来存储一个实体的信息,一个用于存储点的坐标,一个用于存储点序,我们可以把这 2 个数组放到一个结构中,如果模型中实体的数目不止一个是,我们就用这个结构来定义一个数组。在本文中,我们使用VisualC+6.0 来写一个读取 DXF 文件的小程序。在实际应用中,模型中实体的数目以及实体中点和面的数目都

21、是不定的,为了有效地利用内存,我们选择 MFC 类库中的聚合类 CobArray 类所创建的对象 vertex,sequence 来存储和管理实体的点坐标和点序。CObArray 类是一个用来存放数组类的聚合类,它能根据要存进来的数组(或结构)多少自动进行自身大小的高速,而且这个类本身具有的成员函数使得我们对它的对象的操作更加方便、快捷,用它编的程序也易于读懂。三维实体模型的模型信息中的一部分信息可以在标题段中读出,通过读取变量名为UCSORG 的三个变量,可以得到三维实体在世界坐标系中自身所定义的用户坐标系原点的三维坐标。通过读取EXTMAX, EXTMIN 可以获知三维实体在世界坐标系中的

22、范围,而其它部分的信息只有读完了全部DXF 文件后才可以通过计算确定。对于三维实体模型的全部点坐标、点序,可以在实体段中按照前面介绍的 DXF 文件基本结构读出。现在我们开始写这个程序。先建立一个头文件 HEAD.H 定义如下的结构:VERTEX,SEQUENCE 和类 CVertex,Csequence。typedefstructfloatx,y,z;VERTEX;/结构 VERTEX 用来存储点的坐标typedefstructinta,b,c;SEQUENCE;/结构 SEQUENCE 用来存储实体的面的组成typedefstructcharobName20;/*定义结构 myVertex

23、 来存储实体的名字,点的坐标以及面的组成,CObArrayVertex;其中,点的坐标和面的组成是由聚合类 CObArray 定义的对象来 CObArraySequence;在存储的,我们可以把VERTEX 结构和 SEQUENCE 结构加入到这两个对象中保存 */myVertex;classCVertex:publicCObject因为 CObArray 类的对象中只能加入由 CObject 派生的对象,所以 protected:我们还需要建立一个由 CObject 类派生的 CVertex 类。在 CVertex 类 CVertex();中有一个 VERTEX 结构的变量:m_vertex

24、,信息实际上是存储在这 DECLARE_DYNCREATE(CVertex)个变量中的。virtualCVertex();/Attributespublic:我们还需要建立一个由 CObject 类派生的 CVertex 类。在 CVertex 类 CVertex(VERTEX中有一个 VERTEX 结构的变量:m_vertex ,信息实际上是存储在这个变量中的,函数CVertex(VERTEX存入 CObArray 对象中。;classCSequence:publicCObject这也是一个由 CObject 类派生的类,作用和刚才 CVertex 类一样,protected:只不过 Cse

25、quence 类是用来存储实体中面的组成(点序)的。CSequence();DECLARE_DYNCREATE(CSequence)virtualCSequence();public:CSequence(SEQUENCESEQUENCEm_sequence;声明好结构与类后,我们还需要建立一个.CPP 文件,来定义几个函数。IMPLEMENT_DYNCREATE(CVertex,CObject)CVertex:CVertex()CVertex:CVertex()构造函数和销毁函数都是空的CVertex:CVertex(VERTEX它是这个类中最重要的一环。IMPLEMENT_DYNCREATE

26、(CSequence,CObject)CSequence:CSequence()Csequence 类的定义与 CVertex 类的定义差不多,只是其中的参数 m_sequence 的类型和 CVertex 类中的参数 my_vertex 的类型不一样CSequence:CSequence()CSequence:CSequence(SEQUENCE然后用结构 myVertex(如前所定义)定义一个指针*myData,目的在于根据模型中实体的多少来给指针分配合适的内存,使之成为结构数组。定义一个函数,用于确定模型中有多少个实体,函数的返回值就是实体的个数。intCJupiterView:getO

27、bjectNumber()charstr110,str210;charname=“theFirst“;intnum;num=0;FILE*fp;fp=fopen(“data.dxf“,“r“);打开 DXF 文件,data.dxfwhile(!feof(fp)实体数就加一。if(strcmp(str1,“VERTEX“)=0)fscanf(fp,“%sn“,str2);打开 DXF 文件,data.dxffscanf(fp,“%sn“,str2);这个函数是根据实体的名字来判断实体的个数的if(strcmp(name,str2)!=0)所以函数只读取实体的名字,一旦出现新的实体名字,实体数就加

28、一。strcpy(name,str2);num+;fclose(fp);returnnum;以下是读取实体点的坐标以及点序的程序代码,在这个程序中,读取了模型中点的坐标的最大值与最小值、实体的名字、点的坐标,以及点序。voidCJupiterView:OnFileInput()/TODO:AddyourcommandhandlercodehereFILE*fp,*fp2;inti,k,j;floattempX,tempY,tempZ;floatxMin,yMin,zMin,xMax,yMax,zMax,Max;intlab;charstr120,str220,str20,HT;charmyNa

29、me20;intmyNumber;VERTEXtempVertex;SEQUENCEtempSequence;typedefstructfloatx,y,z,max;MAX;MAXmax;HT=9;objectNumber=getObjectNumber();myData=newmyVertexobjectNumber;fp=fopen(FileName,“r“);i=0;j=0;k=0;myNumber=-1;strcpy(myName,“ObjectName“);while(!feof(fp)if(strcmp(str,“$EXTMIN“)=0)fscanf(fp,“%sn“,str1);

30、fscanf(fp,“%fn“,fscanf(fp,“%sn“,str1);fscanf(fp,“%fn“,fscanf(fp,“%sn“,str1);fscanf(fp,“%fn“,if(strcmp(str,“$EXTMAX“)=0)fscanf(fp,“%sn“,str1);fscanf(fp,“%fn“,fscanf(fp,“%sn“,str1);fscanf(fp,“%fn“,fscanf(fp,“%sn“,str1);fscanf(fp,“%fn“,max.x=max(abs(xMax),abs(xMin);max.y=max(abs(yMax),abs(yMin);max.z=m

31、ax(abs(zMax),abs(zMin);max.max=max(max.x,max.y);max.max=max(max.max,max.z);if(strcmp(str,“VERTEX“)=0)fscanf(fp,“%sn“,str1);fscanf(fp,“%sn“,str1);if(strcmp(myName,str1)!=0)myNumber+;strcpy(myName,str1);strcpy(myData+myNumber)-obName,myName);fscanf(fp,“%sn“,str2);fscanf(fp,“%fn“,fscanf(fp,“%sn“,str2);

32、fscanf(fp,“%fn“,fscanf(fp,“%sn“,str2);fscanf(fp,“%fn“,fscanf(fp,“%dn“,fscanf(fp,“%dn“,if(lab=192)tempVertex.x=tempX/max.max;tempVertex.y=tempY/max.max;tempVertex.z=tempZ/max.max;(myData+myNumber)-Vertex.Add(newCVertex(tempVertex);if(lab=128)fscanf(fp,“%sn“,str1);fscanf(fp,“%fn“,fscanf(fp,“%sn“,str1);fscanf(fp,“%fn“,fscanf(fp,“%sn“,str1);fscanf(fp,“%fn“,tempSequence.a=abs(tempX);tempSequence.b=abs(tempY);tempSequence.c=abs(tempZ);(myData+myNumber)-Sequence.Add(newCSequence(tempSequence);fclose(fp);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。