2022年DXF文件的打开 .pdf
关于 DXF 文件的打开1、DXF 格式DXF格式是 AutoCAD 图形文件中 包含全部信息的标记数据 的一种表示方法。标记数据:为了分别每个数据,于是在每个数据前带一个名为“组码”的整数。不同的组码有不同的意义。2、DXF 文件的数据特点DXF (Drawing Exchange File)文件即标准图形交换文件,是AutoCAD 软件的一种ASCII格式的文件。它由若干节组成,包括:1 标题节( HEADER ) :存储图像的一般信息2 类节(CLASSES ) : 存储图形的类, 这些类的事例会出现在块(BLOCKS ) 、 实体(ENTITIES )和实体( OBJECTS )中。3 表节( TABLES ) :包括块参照表、图层表、线形表等一系列表。4 块节( BLOCKS ) :定义块和构成块的实体。5 实体节( ENTITLES ) :包括图形中的图形对象或实体以及被看作插入实体的块参照。6 对象节( OBJECKS ) :包括图形中的非图形对象。3、我认为:CAD图像的每一个点都包含改点的全部信息。那么这些信息存储在哪里呢?就是以DXF为名的文件,即DXF文件包含了CAD图像的所有信息。而DXF文件的内容是数字或者成为组码。 每个组码具有不同的意义。用程序翻译这些组码,就可以实现对CAD文件的读取或者转变。如把CAD图像转换成ArcGIS图形。参考:4、打开程序如下privatevoid btOpen_Click(object sender, EventArgs e) btDraw.Enabled = false ; LayerList.Clear(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - LineList.Clear(); ArcList.Clear(); EllipseList.Clear(); LwopolylineList.Clear(); SplineList.Clear(); this .openFileDialog1.ShowDialog(); if ( this .openFileDialog1.FileName.Trim() != )/ 如果路径不为空 string path = this .openFileDialog1.FileName; fs = new FileStream (path, FileMode.Open, FileAccess .Read); sr = new StreamReader(fs); Read(); privatevoid btDraw_Click(object sender, EventArgs e) double width = Math.Ceiling(rightx) - Math.Ceiling(leftx) + 40; double height = Math.Ceiling(righty) - Math.Ceiling(lefty) + 40; Bitmap bmp = new Bitmap( int )width, (int )height); Graphics gx = Graphics .FromImage(bmp); double pw = width / (double )460; double ph = height / (double )384; for ( int i = 0; i LineList.Count; i+) LINE temp = (LINE)LineListi; temp.Move(leftx, lefty, righty - lefty + 39); temp.Draw(gx); for ( int i = 0; i ArcList.Count; i+) ARC temp = (ARC )ArcListi; temp.Move(leftx, lefty, righty - lefty + 39); temp.Draw(gx); for ( int i = 0; i EllipseList.Count; i+) ELLIPSE temp = (ELLIPSE )EllipseListi; temp.Move(leftx + 1, lefty + 1); temp.Draw(gx, height - 1, pw, ph); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - for ( int i = 0; i LwopolylineList.Count; i+) LWPOLYLINE temp = (LWPOLYLINE)LwopolylineListi; temp.Draw(gx, leftx, lefty, righty - lefty + 39); for ( int i = 0; i SplineList.Count; i+) SPLINE temp = (SPLINE )SplineListi; temp.Draw(gx, leftx - 10, lefty, righty - lefty + 39); this .pictureBox1.Image = bmp; 【笔记】1.以上是两个控件的命令。2. Trim()方法返回一个字符串,它包含一个没有前导空格( LTrim )、没有尾随空格( RTrim ) 或既没有前导空格也没有尾随空格( Trim) 的指定字符串的副本。3.FileStream(String, FileMode, FileAccess)构造函数使用指定的路径、创建模式和读/写权限初始化 FileStream 类的新实例。4.Math.Ceiling() 方法返回大于或等于指定数字的最小整数。5、下面是对 DXF 的基本结构举一实例进行说明:下面是对 DXF的基本结构举一实例进行说明:0 0 后接 SECTION SECTION 表明这是一个段的开始2 2 后接的是段名HEADER说明该段是HEADER段(标题段)9 $ACADVER文件是由AUTOCAD产生的1 AC1008 9 9 后接 $UCSORG $UCSORG用户坐标系原点在世界坐标系中的坐标10 10 对应 X 0.0X 的值20 20 对应 Y0.0Y的值30 30 对应 Z 0.0Z的值9 $UCSXDIR这是一段不太相关的部分,略去10 1.0 . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - 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 对应 Y112.634300Y 的值30 30 对应 Z 169.945602Z 的值0 0 后接 ENDSEC ENDSEC 说明这一段结束了0 0 后接 SECTION SECTION 表明这是一个段的开始2 2 后接的是段名TABLES 说明该段是TABLES 段(表段).该段对我们不太相关,此处略去不进行说明0 0 后接 ENDSEC ENDSEC 说明这一段结束了0 0 后接 SECTION SECTION 表明这是一个段的开始2 2 后接的是段名ENTITIES说明该段是ENTITIES段(实体段)是要详细说明的段,该段包含了所有实体的POLYLINE 点的坐标和组成面的点序。0 后接 POLYLINE 8 表明以下数据是对于一个新的实体;OBJECT018 后接的字符串是这个实体的名称66 1 70 从 66 1 到 70 64 64 说明该实体是由许多小平面组成的71 38 71 38 说明该实体共有38 个点72 72 72 72 说明该实体由72 个三角形构成00VERTEX VERTEX 表明后面紧跟着的是实体的数据8 OBJECT01 10 对应 X坐标-163.925293X 的值20 对应 Y坐标-17.772665Y 的值30 对应 Z坐标128.929947Z 的值70 70 192 192 表明上面的数据信息是点的坐标0 每一个从 0VERTEX 到 70 192 之间 VERTEX 的一小段是点的坐标. 70 192 0 VERTEX 8 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - OBJECT01 10 0 20 0 30 0 当 70 后跟 128 时,表明该实体的每个点的坐标数据已经记录70 完了,下面紧跟着的是记录这些点是以什么样的方式组合成各128 个三角形。71 71、72、73 后面跟着的值表明某一个三角形是第二个、第2 一个、第四个点构成的,点的顺序是按照记入DXF文件的顺72 序。当某一值为负数时,则表明该点到下一点的线不要画出, 1 如果要画三维实体的线型图,就必须使用这一特性,否则线条73 将会出现紊乱。-4 0 VERTEX . 0 0 后接 SEQEND 表明该实体的数据已经全部记录完了SEQEND 8 OBJECT01 0 POLYLINE0 后接 POLYLINE 表明以下又是一个新的实体. 0 ENDSEC0 后接 ENDSEC 表明这是该段的结尾0 EOF0后接 EOF表明这个DXF文件结束了6、文件读取说明注意到上面每一段或每一节的区分都是以一个“数字”(字符型)加该段(节)的名字组成,所以在读取是可以用二维数组。str0 存放“数字”,str1 存放名字。见程序:if (str0 = 0 & str1 = LAYER) LayerList.Add(newlayer); return; 7、错误!关于 ellipse ,line ,spline 等报错我在 msdn中查找 ellipse是椭圆类,它属于System.Windows.Shapes.Shape名空间。但是我添加上using System.Windows.Shapes; 会报错:“命名空间“ System.Windows”中不存在类型或命名空间名称“ Shapes”。是否缺少程序集引用?”。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -