如何读取DXF格式文件
dxftool的用法 -回复
dxftool的用法-回复DXFTool是一种用于编辑和转换AutoCAD DWG文件的工具。
它能够读取和写入DXF格式的文件,并提供了各种功能,如裁剪、旋转、缩放等。
本文将一步一步介绍DXFTool的使用方法。
1. 安装DXFTool首先,前往DXFTool的官方网站并下载最新版本的软件。
安装过程通常很简单,只需按照向导中的说明进行操作即可。
安装完成后,就可以开始使用DXFTool了。
2. 打开DWG文件在DXFTool的主界面上,点击“打开”按钮,选择要编辑的DWG 文件。
一旦文件打开,你将能够在界面上看到绘图图层和对象。
3. 编辑图层DXFTool提供了一些常用的图层编辑功能,如创建新图层、重命名图层、删除不需要的图层等。
你可以通过选择图层并点击相应按钮来执行这些操作。
此外,你还可以调整图层的显示顺序、改变图层的颜色和线型等。
4. 编辑对象可以使用DXFTool对绘图中的对象进行编辑。
选择要编辑的对象,然后点击“编辑”按钮,将弹出一个对话框,提供了各种操作选项。
你可以移动、旋转、缩放和镜像对象,还可以裁剪或延长线段,或者改变对象的属性,如颜色、线型等。
5. 裁剪图纸如果你需要裁剪DWG文件的某部分,DXFTool可以帮助你实现这一目标。
选择“裁剪”工具,然后按照指示框选要保留的区域。
选定区域后,点击“裁剪”按钮即可完成裁剪操作。
6. 保存和导出当你完成所有编辑操作后,可以选择将文件保存为DWG格式或导出为DXF文件。
点击“保存”按钮,选择存储的位置和文件名,然后点击“保存”即可。
如果要导出为DXF文件,选择“导出”按钮,然后按照指示选择保存路径和文件名。
导出的DXF文件可用于与其他CAD软件进行交互。
7. 批量处理文件DXFTool还支持批量处理多个DWG文件。
点击“工具”菜单中的“批量处理”选项,然后选择要处理的文件夹和操作类型(如批量保存或批量导出)。
设置好参数后,点击“开始”按钮即可自动处理多个文件。
T-用C读取DXF文件
/*-------------------------------------------------* Header.C *读取DXF文件中HEADER段中DXF文件版本号的小程序。 * eryar@ 02-05-08 18:55 *----------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define STRLEN 30 int main(int argc, char *argv[]) { int code; /*存储组码*/ char codevalue[STRLEN]; /*存储组码对应的值*/ FILE *dxf; /*文件指针*/ char filename[STRLEN]; /*文件名*/ char suffix[6] = ".dxf"; /*只输入文件名打开DXF文件,不用输后缀.*/ printf("请输入文件名:"); gets(filename); strcat(filename,suffix); dxf = fopen(filename,"r"); /*打开文件进行读操作*/ if(!dxf) { printf("打开文件出错!/n按任意键退出..."); getch(); exit(0); } else
#define STRLEN 60 #define DATASIZE sizeof(EntityData) /*-----每个实体的结构-----*/ //你可在在此添加其它的实体 //为了提高精度,变量可定义为双精度型 typedef struct tagLine { float x1,y1,z1; float x2,y2,z2; }LINE; typedef struct tagCircle { float x,y,z; float radius; }CIRCLE;//给tagcircle起个别名叫circle /*------------------------*/ typedef union specialData { LINE line; CIRCLE circle; }privateData; /*------实体的数据结构-------*/ typedef struct commonData { char id[STRLEN]; /*实体标识字符串*/ char layer[STRLEN]; /*层名字符串*/ privateData data; /*特有数据块*/ struct commonData *next; /*用于构建链表*/ }EntityData;
【免费下载】DXF文件的打开
9 $UCSXDIR 这是一段不太相关的部分,略去
【笔记】 1. 以上是两个控件的命令。 2. Trim()方法
返回一个字符串,它包含一个没有前导空格 ( LTrim)、没有尾随空格 ( RTrim) 或 既没有前导空格也没有尾随空格 ( Trim) 的指定字符串的副本。
3. FileStream(String, FileMode, FileAccess)构造函数
+ 40; + 40;
private void btDraw_Click(object sender, EventArgs e) {
double width = Math.Ceiling(rightx) - Math.Ceiling(leftx)
double height = Math.Ceiling(righty) - Math.Ceiling(lefty)
{ string path = this.openFileDialog1.FileName; fs = new FileStream(path, FileMode.Open,
FileAccess.Read); sr = new StreamReader(fs); Read();
} }
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根保通据护过生高管产中线工资敷艺料设高试技中卷术资配,料置不试技仅卷术可要是以求指解,机决对组吊电在顶气进层设行配备继置进电不行保规空护范载高与中带资负料荷试下卷高总问中体题资配,料置而试时且卷,可调需保控要障试在各验最类;大管对限路设度习备内题进来到行确位调保。整机在使组管其高路在中敷正资设常料过工试程况卷中下安,与全要过,加度并强工且看作尽护下可关都能于可地管以缩路正小高常故中工障资作高料;中试对资卷于料连继试接电卷管保破口护坏处进范理行围高整,中核或资对者料定对试值某卷,些弯审异扁核常度与高固校中定对资盒图料位纸试置,.卷编保工写护况复层进杂防行设腐自备跨动与接处装地理置线,高弯尤中曲其资半要料径避试标免卷高错调等误试,高方要中案求资,技料编术试5写交卷、重底保电要。护气设管装设备线置备4高敷动调、中设作试电资技,高气料术并中课3试中且资件、卷包拒料中管试含绝试调路验线动卷试敷方槽作技设案、,术技以管来术及架避系等免统多不启项必动方要方式高案,中;为资对解料整决试套高卷启中突动语然过文停程电机中气。高课因中件此资中,料管电试壁力卷薄高电、中气接资设口料备不试进严卷行等保调问护试题装工,置作合调并理试且利技进用术行管,过线要关敷求运设电行技力高术保中。护资线装料缆置试敷做卷设到技原准术则确指:灵导在活。分。对线对于盒于调处差试,动过当保程不护中同装高电置中压高资回中料路资试交料卷叉试技时卷术,调问应试题采技,用术作金是为属指调隔发试板电人进机员行一,隔变需开压要处器在理组事;在前同发掌一生握线内图槽部纸内故资,障料强时、电,设回需备路要制须进造同行厂时外家切部出断电具习源高题高中电中资源资料,料试线试卷缆卷试敷切验设除报完从告毕而与,采相要用关进高技行中术检资资查料料和试,检卷并测主且处要了理保解。护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
bigemap地图下载器如何打开dxf文件?
注意:(中文乱码)为了打开的中文不出现乱码,保存DXF文件请选择如下的选项点击软件左上角【文件】,打开dxf文件,如下图:在弹出的对话框中,点击【浏览】,找到要打开的数据,点击【打开】如下图:然后【选择】坐标投影,注意:选择坐标投影的时候一定要知道你的DXF数据是西安80或者北京54或者CGCS2000或者其他的坐标系,然后在选择对用【地区】,如下图,本次打开的是坐标系北京54坐标系,对应的坐标位置是中央子午线117度,如下图:说明:需要套合的数据一般都是没有转换参数的,所以,不需要勾选七参数,直接【确定】打开数据。
点击【确定】之后,经过数据加载,在BIGEMAP软件中显示出设计的点、线、面等信息,如下图:在BIGEMAP中放大打开的数据,我们可以看到有明显的偏移,数据和地图没有完全的吻合,如下图:第二步:套合矢量数据和卫星图像由于我们要套合的是整个加载的“蚌埠文化广场54-3”数据,因此,我们要选择整个加载的数据文件,然后点【右键】,弹出对话菜单,选择菜单里面的【套合】,如下图:弹出如下对话框:通过打开的矢量文件数据与地图(底图)对比,我们找到3个控制点(矢量数据对应到地图上应该在什么位置),如下图:上图中三个控制点的位置(右边红色框住的三个位置)分别是:【1'移动到1】、【2'移动到2】、【3'移动到3】。
首先点击【增加控制点】,然后鼠标点击1'的位置按住鼠标拖到到1的位置;同样,再次点击【增加控制点】,将鼠标从2'的位置拖到到2的位置,3'拖动到3的位置,完成之后如下图:(注意:控制点不一定非得选择三个点,一般两个点就可以了,但是间隔必须远一点,一般选择套合范围靠近四个角的地方来筛选控制点,本例中只是为了描述方法,这么近的三个点实际不可取。
)三个控制点选择完成,然后点击上图中的【套合】,矢量数据会根据你选择的控制点自动进行套合,如下图:从上图中可以看出,我们通过套合之后,矢量图已经完全和地图(底图)重叠在一起,这样就完成了对矢量数据坐标的纠偏,即现在的坐标就是真实准确的经纬度坐标。
dxf 格式 读取高程 散点
dxf 格式读取高程散点正文:作为一种常用的数字化图形格式,DXF(Drawing Exchange Format)广泛应用于各种工程领域。
本文将介绍如何利用DXF格式读取高程散点数据,并进行实际应用。
1.DXF格式简介DXF格式是一种中性文件格式,可以兼容多种计算机辅助设计(CAD)软件。
它主要用于存储二维和三维图形数据,包括线段、多边形、文本等。
在高程测量领域,DXF文件通常包含高程点数据,这些数据可以用作地图制图、地形分析等。
2.读取高程散点的方法要读取DXF格式的高程散点数据,首先需要将文件导入到相应的软件中。
常见的导入软件有ArcGIS、AutoCAD等。
以下以ArcGIS为例,介绍读取高程散点数据的步骤:(1)打开ArcGIS软件,点击“文件”→“打开”→“dxf文件”,选择需要读取的DXF文件。
(2)在ArcCatalog中,可以看到导入的DXF文件。
右键点击文件,选择“导出要素”,将高程散点数据导出为Shapefile格式。
(3)在ArcMap中,加载导出的Shapefile文件,即可查看高程散点数据。
3.应用实例及步骤以下以一个实际项目为例,说明如何利用读取的高程散点数据进行地形分析:(1)在ArcMap中,加载高程散点数据。
(2)使用“地形分析”工具,计算高程散点数据的地形起伏。
(3)利用“聚类分析”工具,根据高程散点数据的分布特点,将其划分为不同区域。
(4)根据地形起伏和聚类结果,对地形进行合理利用和规划。
4.注意事项(1)在选择导入软件时,请确保软件支持DXF格式的高程散点数据。
(2)若DXF文件包含多个图层,可通过图层属性进行筛选,仅导入所需的高程散点图层。
(3)在实际应用中,可能需要对高程散点数据进行插值处理,以提高地形分析的精度。
通过以上方法,我们可以充分利用DXF格式的高程散点数据,为工程设计提供有力支持。
dxf 格式 读取高程 散点
读取高程散点的dxf格式是指从dxf文件中提取出地理信息系统(GIS)中的高程散点数据。
这些数据通常包括地形的不同高度、地形轮廓以及其他地理信息。
读取这些数据对于地质勘探、地形测量、城市规划等领域非常重要。
下面将介绍如何使用dxf格式读取高程散点的方法。
一、了解dxf格式dxf格式是AutoCAD绘图软件的文件格式之一,它是一种二进制文件格式,主要用于存储CAD(计算机辅助设计)数据。
dxf文件中可以包含各种类型的地理信息,包括高程散点数据。
二、使用CAD软件打开dxf文件要读取dxf格式的高程散点数据,首先需要使用CAD软件打开这个dxf文件。
CAD软件通常具有强大的数据解析和显示功能,可以方便地查看和处理dxf文件中的各种信息。
三、查找高程散点数据在打开了dxf文件之后,需要查找其中的高程散点数据。
这些数据通常以点的形式存在,每个点包括三维坐标信息,分别对应x、y、z轴。
通过CAD软件的查询功能或者图层管理功能,可以找到这些高程散点数据并进行进一步处理。
四、导出高程数据一旦找到了高程数据,可以将这些数据导出到其他格式,比如txt、csv等。
这样方便后续的数据分析和处理工作。
五、数据处理与分析导出高程数据之后,可以使用GIS软件进行数据处理和分析。
GIS软件提供了丰富的空间分析功能,可以对高程数据进行地形剖面分析、等高线生成等操作,为后续的地理信息处理工作提供支持。
六、应用领域读取dxf格式的高程散点数据在地质勘探、地形测量、城市规划等领域有着广泛的应用。
比如在地质勘探中,可以通过这些数据分析地下岩层的分布和结构;在城市规划中,可以通过这些数据进行地形分析和可视化展示等。
总结:通过对dxf格式的高程散点数据的读取,可以为各种地理信息处理工作提供支持,为相关领域的研究和实践工作提供有力的数据基础。
希望上述方法和应用可以对相关工作者有所帮助。
dxf格式的高程散点数据具有广泛的应用领域,不仅在地质勘探、地形测量和城市规划中发挥作用,还在环境保护、农业生产、灾害监测等领域具有重要价值。
dxf读取例程
dxf读取例程DXF(Drawing Exchange Format)是一种CAD(计算机辅助设计)文件格式,用于将图形数据从一个CAD程序导出并传输到另一个CAD程序中。
本文将介绍DXF读取的相关参考内容,包括DXF文件结构、DXF文件的常见实体和属性、DXF读取的实现方法和常用的DXF读取库。
首先,我们来了解一下DXF文件的结构。
DXF文件是以ASCII码形式存储,可以使用文本编辑器打开和查看。
DXF文件主要由多个段(section)和块(block)组成。
段中包含了多个实体(entity),每个实体对应一个图形对象,如直线、圆等。
每个实体包含一系列的属性(属性代码和属性值),用于描述该实体的特征和属性。
DXF文件还包含了一些元数据(metadata),如文件版本、文件单位、文件的创建人等。
了解DXF文件的结构对于读取和解析DXF文件非常重要。
其次,我们需要了解DXF文件中的一些常见实体和属性。
常见的实体包括点(Point)、直线(Line)、圆(Circle)、多段线(LWPolyline)、文本(Text)等。
每个实体都具有一组属性,这些属性以属性代码和属性值的形式存储。
例如,直线实体的属性包括起点坐标、终点坐标、颜色、线宽等。
文本实体的属性包括文本内容、位置、字体、高度等。
了解DXF文件中实体和属性的种类和特征,可以帮助我们准确地读取和解析DXF文件中的数据。
接下来,我们需要选择适合的方法来实现DXF文件的读取。
实现DXF文件的读取可以采用底层的文本解析方法,也可以使用现有的DXF读取库。
底层的文本解析方法需要我们自己编写解析代码,按照DXF文件的结构和规则解析文件内容,提取所需数据。
这种方法需要一定的编程能力和对DXF文件格式的深入了解。
另一种方法是使用现有的DXF读取库,这些库已经封装了DXF文件的读取和解析功能,可以简化我们的开发工作。
常见的DXF读取库包括EZdxf、libDXF、Teigha等。
基于dxflib库的dxf格式文件读取和写入方法研究
292CULTURE 区域治理作者简介:梁小锋,生于1992年,本科,测绘助理工程师,研究方向为国土空间规划,地理空间数据的开发与应用相关工作。
基于dxflib 库的dxf 格式文件读取和写入方法研究梁小锋1,张海洋21.江门市江海区自然资源信息中心;2.广东省海洋地质调查院摘要:dxf格式文件是一种采用度较高的通用图形格式,本文基于可移植性高的dxflib库,通过构建的图元对象完成了dxf文件读取和写入操作该方法基于开源C++库,具有很大的灵活性,能满足不同用户对dxf文件使用的需求。
关键词:dxflib;dxf 中图分类号:U692.4+2文献标识码:A文章编号:2096-4595(2020)41-0292-0001dxf 格式文件是常见图形交换格式之一,在多行业中都得到广泛应用[1-2],但是由于其数据结构复杂,解析dxf 文件还是相对繁琐的。
dxflib 库是一个开源的C++库,使用dxflib 库进行dxf 文件的读写,可以很方便进行移植到自己的程序中去。
一、dxf 格式文件介绍dxf 文件是一种开放的矢量数据格式,由多个SECTION 组成,每个SECTION 依次记录了文件的四至、图层、块表、实体等信息。
为嵌套结构,本文主要对BLOCK 段和ENTITIES 段进行了研究。
其中BLOCK 段记录了块表信息,包含了该块中的包含的点、多段线、圆等图元信息。
在dxf 文件中,模型空间和布局都也是作为一个块表保存。
二、dxflib 库介绍dxflib 库是一个开源的c++库,方便进行调用。
该库中的核心类为dl_dxf 和dl_creationinterface ,此外还对图元数据进行了定义,如直线图元数据定义为DL_LineData 结构体,保存直线的起点和端点坐标。
圆图元数据定义为DL_CircleData 结构体,保存圆心坐标和半径。
dl_dxf 类对dxf 文件进行了解析,构建了dxf 文件读取和写入的模块,对各个图元的读取都给出了定义,并调用dl_creationinterface 类中的可供覆写的虚函数供用户保存。
dxf文件怎么打开?打开DXF文件的方法
• • •
方法如下: 一、使用autocad软件打开 dxf文件默认打开方式为autocad。可在 autocad中执行命令:d打开 方法一:点击文件按钮,在下拉菜单 中点击打开,在打开的对话框中选择dxf文 件,双击打开即可。
•
方法二:直接双击dxf文件,在打开方 式里选择其他程序,找到“caxa电子图版” 后双击,即可打开dxf文件了。
• 上述也就是打开dxf文件方法的全部内容了。 如有遇到和上述一样的问题的用户,可以 按照上述的方法步骤去操作,也许这样就 可以帮你解决问题了,希望在这里能够帮 助到有需要的人。
• Jjhl7684dggds如果你想学到更多的电脑知 识请随时关注系统114,记住我们的官方网 站:系统之家下载站 /
系统之家下载站/
dxf文件怎么打开?打开dxf文件 的方法
• dxf文件是一个2D转换的格式,它是是由很 多的“代码”和“值”组成的“数据对” 构造而成。dxf是Autodesk公司开发的用于 AutoCAD与其它软件之间进行CAD数据交 换的CAD数据文件格式。那dxf的文件怎么 打开呢?今天,小编就和大家说一下打开 dxf文件的方法。
读取、识别、显示DXF格式文件源码
问题的提出和解决方案Software development in industry, building and many other fields requires working with CAD drawings. The most popular CAD formats are AutoCAD DWG and AutoCAD DXF, the latter being "simplified" dwg - a special format to be used by developers. The problem is that DXF and DWG formats are really complicated. They have dozens of objects with hundreds of interaction tricks and thousands of properties. Official DXF Reference from Autodesk has 256 pages though it fails to describe many important facts. Hence, the development for CAD drawings is often required but is not easy to implement. This article is to tell you how to write the DXF reader in C#, what problems can arise and of course you can find example in C# source code, which is free for use under MPL license.DXF 结构DXF is an open ASCII format from Autodesk and you can easily find documentation on it in the web. Here are some words about it. Below is a very simple example, to show the main parts:Hide Copy CodeSECTION2ENTITIESLINE1039.199533920433172036.4554281665769300.01139.1995339204332221736.4554281665768310.0ENDSECEOF0 - introduction of extended symbol names, following the "0"SECTION, ENDSEC - begin / end of section. Sections can include Header, Entities, Objects. In the above code, you see only Entities section where the entities are.LINE - begins LINE entity description. Lines:Hide Copy Code1039.19953392043317mean X1 double value. The value after 20 is Y1, after 30 - Z1 (0 in 2D drawings). 11, 21 and 31 codes are consequently for X2, Y2, Z2. So here we see the line with coordinates (39.19.., 36, 45.. - 39,19.., 736,45..) - this is vertical line.So our aim is to read this ASCII format. We need to load the file to stream and to take lines - even lines (0, 2, 4..) are CODE, odd lines (1, 3, 5...) are VALUE and repeat this procedure step by step till the end of file "EOF".Hide Shrink Copy Code// take a pair of lines in DXF file, repeat this till "EOF":public void Next(){FCode = Convert.ToInt32(FStream.ReadLine()); //codeFValue = FStream.ReadLine(); // value}// for code=0 we create entities. Entities here are not only those which visible in AutoCAD.// Entities can be also names of Sections and many other internal DXF objects.// This method is called for all FCode == 0public DXFEntity CreateEntity(){DXFEntity E;switch (FValue){case "ENDSEC":return null; // here we do not create entitycase "ENDBLK":return null;case "ENDTAB":return null;case "LINE": // for "LINE" value we create DXFLine objectE = new DXFLine();break;case "SECTION": // "SECTION" will be object to store other objects like LineE = new DXFSection();break;case "BLOCK": // create block objectE = new DXFBlock();break;case "INSERT": // insert is reference to block.E = new DXFInsert();break;case "TABLE":E = new DXFTable();break;case "CIRCLE":E = new DXFCircle();break;case "LAYER":E = new DXFLayer();break;case "TEXT":E = new DXFText();break;case "MTEXT":E = new DXFMText();break;case "ARC":E = new DXFArc();break;case "ELLIPSE":E = new DXFEllipse();break;default: // there are many other objects are possible. For them we create empty EntityE = new DXFEntity();break;}// each Entity will need reference to the Base object Converter, which stores all Entities.E.Converter = this;return E; // return Entity and after it is added to the array of Entities }The method to read properties of entities is essentially similar to the one described above but it has one important point: different entities have both identical and different properties. For instance, many Entities have "base point" - in DXF, which is described by codes: 10 (x), 20 (y), 30(z):Hide Copy CodeLINE1039.199533920433172036.4554281665769300.0These codes are the same for LINE, CIRCLE, ELLIPSE, TEXT and for many others. So we can make Object-Oriented structure to read and to store the properties in order to avoid double-coding. We will store Layer and Base Point in entity "DXFVisibleEntity" which will be ancestor for all visible entities. Look at the code to read these properties:Hide Shrink Copy Code//base class for all visible entitiespublic class DXFVisibleEntity : DXFEntity{//Base point (x, y, z) for all entitiespublic DXFImport.SFPoint Point1 = new SFPoint();// virtual function ReadProperty() is overridden in all descendants of Entity to read//specific propertiespublic override void ReadProperty(){// for the different codes we read valuesswitch (Converter.FCode){//read Layercase 8:layer = yerByName(Converter.FValue);break;//read Coordinatescase 10: //XPoint1.X = Convert.ToSingle(Converter.FValue, Converter.N);break;case 20: //YPoint1.Y = Convert.ToSingle(Converter.FValue, Converter.N);break;//read Colorcase 62:FColor = CADImage.IntToColor(Convert.ToInt32(Converter.FValue, Converter.N));break;}}}We use the same approach to read the second coordinate in LINE, radius in Circle and so on.DXF File and DXF Import .NET StructureThis scheme shows main parts of DXF file and the way they are connected with the C# source code in the project. The dash lines stand for associations between DXF file objects and objects, programmed in C#.CADImage is a class for loading from DXF file and drawing to Graphics. It stores the DXF Entities in field:Hide Copy Codepublic DXFSection FEntities;In the scheme, it is DXFSection.DXFEntity is base class for all Entities classes. Classes DXFBlocks and DXFSection are not visible. Class DXFVisibleEntity is the ancestor for all visible Entities.By the way, the scheme above is made in DXF format in ABViewer software. CAD TricksIf you are not familiar with AutoCAD, please pay attention to the structure of DXF entities. There is a special entity "Block" which may have many "inserts" in the CAD drawing. Block is just set of entities (including nested blocks) which can be inserted many times.NoteHide Copy CodeBlock changes many properties of element when showing it.So if you want to know the color of entity, it is not enough to read "Entity.Color" - it is necessary to see all the Inserts and Blocks, in which this entity can be included. To get the correct color in DXF Import .NET project we made the following function: EntColor(DXFEntity E, DXFInsert Ins).Please use EntColor() function get the correct Color type even if you do not have Blocks in the file. Pay attention that the most common color is "ByLayer" and in order to read the correct color, we need to read the color from Layer entity. This functionality is also provided in this function.Below is the EntColor function. It has many tricks, for instance checking the == "0" - in DXF layer "0" is special and elements with color "ByLayer" get the color from Block if they are on "0" layer.Hide Shrink Copy Code//Use this func to know the color of Entity, DXFInsert is Insert entity or null.public static Color EntColor(DXFEntity E, DXFInsert Ins){DXFInsert vIns = Ins;DXFEntity Ent = E;Color Result = DXFConst.clNone;if(Ent is DXFVisibleEntity) Result = E.FColor;/*if(Ent is Polyline)Result = ((Polyline)Ent).Pen.Pen.Color;*/if(yer == null) return Result;/* algorithm is rather difficult here. This is the way, how AutoCAD works with the colors,if you try to create entities in AutoCAD, you will see how they use Colors */if((Result == clByLayer)||(Result == clByBlock)){if((vIns == null)||((Result == clByLayer)&&( != "0"))){if(Result == clByLayer){if(yer.color != clNone)Result = yer.color;else Result = Color.Black;}}else{while(vIns != null){Result = vIns.color;if((Result != clByBlock) && !((Result == clByLayer) &&( == "0"))){if(Result == clByLayer)Result = yer.color;break;}if((vIns.owner == null)&&(Result == clByLayer))Result = yer.color;vIns = vIns.owner;}}}if((Result == clByLayer)||(Result == clByBlock))Result = clNone;return Result;}How to Use the SoftwareThe main code is in DXFImport.cs. You can just use this file in your project or see to it as an example of reading and visualization of DXF files. Sample code to use DXFImport.cs is Form1.cs.How to View EntitiesIn Form1.cs, we use the Form1_Paint event:Hide Copy Codeprivate void Form1_Paint(object sender,System.Windows.Forms.PaintEventArgs e){//FCADImage - base class to reference to DXFif (FCADImage == null)return;FCADImage.Draw(e.Graphics); // CADImage.Draw() accepts Graphics to draw to}We can use FCADImage.Draw() for drawing to any Graphics - for instance, to printer. FCADImage.Draw() function should use a special algorithm, when each entity is drawn with the use of block/insert/layer parameters.Hide Copy Codepublic void Draw(Graphics e){if (FMain == null)return;FGraphics = e;// Iterate begins to over the entities to draw all of themFEntities.Iterate(new CADEntityProc(DrawEntity), FParams);}Pay attention to FEntities.Iterate() func, it allows accessing all entities including their being inside the blocks. This is how it works: There is a class DXFGroup which is an ancestor of Entity and which can store array of Entities. For instance, Block is ancestor of DXFGroup and can store many entities like LINE. For better unification, we can use ONE BASE GROUP ENTITY object for all the drawing, this Entity will have array of all entities, each of them can also be the Group - the classic "Tree".Iterate method finally should call Draw() for each Entity in order to draw it to the Graphics:Hide Copy Codeprotected static void DrawEntity(DXFEntity Ent){Ent.Draw(FGraphics);}Draw() method is overridden in descendants of Entity to draw particular entities. Let us see in detail how it is implemented in DXFLine:Hide Copy Code// draw linepublic override void Draw(System.Drawing.Graphics G){// points P1 (x1, y1) and P2 (x2, y2) of LineSFPoint P1, P2;// read color via EntColor to get real colorColor RealColor = DXFConst.EntColor(this,Converter.FParams.Insert);// Read point 1 -convert global coordinates to the screen coordinates: P1 = Converter.GetPoint(Point1);//read point 2P2 = Converter.GetPoint(Point2);if (FVisible)G.DrawLine(new Pen(RealColor, 1), P1.X, P1.Y, P2.X, P2.Y);}1.We get the Real Color via DXFConst.EntColor(this,Converter.FParams.Insert); as I described before.2.Points are converted from Global Coordinates to screen coordinatesin function GetPoint(). GetPoint not only convertsglobal-to-screen but also uses Block offsets and block scale inside.Thus it facilitates the development work, eliminating the need to "see" what block is being drawn at the moment - Block changes"FParams.matrix" to draw itself. And all entities coordinates use this "FParams.matrix".3.Entity is drawn to the given Graphics G:So you can draw to printer, to raster image or to other Graphics. DXF Import .NET ReferenceHide Copy Codepublic class DXFConstStores constants and base functions.Hide Copy Codepublic class DXFMatrixClass to work with coordinates.Hide Copy Codepublic struct FRectDescription of 3D space where the CAD drawing is situated in global coordinates.Hide Copy Codepublic struct CADIterateStores all needed parameters for entities when processing "Iterate" function.Hide Copy Codepublic class CADImageClass to draw CAD drawing.Hide Copy Codepublic class DXFEntityBase class for all DXF Entities.Hide Copy Codepublic class DXFGroup : DXFEntityBase class for all group entities.Hide Copy Codepublic class DXFTable : DXFGroupClass to read from DXF "Table" section - here it reads only Layers.Hide Copy Codepublic class DXFVisibleEntity : DXFEntityBase class for all visible entities (invisible - are "DXFTable", "DXFLayer", etc.)Hide Copy Codepublic class DXFCustomVertex: DXFVisibleEntitySpecial class for 3D point in DXF.Hide Copy Codepublic class DXFText: DXFCustomVertexStores and Draws "Text" DXF entity.The following classes are for particular DXF entities:Hide Copy Codepublic class DXFLine : DXFVisibleEntitypublic class DXFArc: DXFCirclepublic class DXFEllipse: DXFArcpublic class DXFLayer: DXFEntityHide Copy Codepublic class DXFBlock : DXFGroupClass to work with DXF Block.Hide Copy Codepublic class DXFInsert : DXFVisibleEntityClass to work with "Insert" in DXF, for AutoCAD users this is "Block reference". Blocks are not visible, Inserts are visible.ConclusionThe purpose of the article is to give some advice how to write DXF readers. DXF file structure is not so difficult as its logical presentation. The article looks through the base DXF format problems and shows how to find solution for them. The example source is written in C# and may be helpful for all who need to have access to DXF files.。
libdxfrw 使用方法
libdxfrw 使用方法libdxfrw 是一个用于读取和写入DXF文件的库,它支持不同版本的AutoCAD和其他CAD软件所生成的DXF文件。
首先,需要在您的计算机上安装libdxfrw。
具体安装方法取决于您使用的操作系统和语言。
可以从libdxfrw官网上下载适合您操作系统的二进制文件。
在windows系统上可以下载“win32” 或者“win64”版本。
2. 加载DXF文件使用libdxfrw读取DXF文件,需要在程序中添加libdxfrw库并使用其中的函数。
加载DXF文件的方法是使用libdxfrw中的DWG读取器方法。
例如:DWGdirect::DWGdirect()//创建DWGdirect对象DWGdirect::readFile(const QString &filename) //读取DXF文件注:此处的QString是Qt中的字符串类型。
读取DXF文件之后,需要解析其中包含的信息。
libdxfrw库提供了许多便于处理DXF 文件的函数。
DXFDocument::entityAt(int index) //获取指定索引处的实体的指针DXFDocument::header() //获取文件头信息以上函数是libdxfrw库中一些常用的函数。
它们可以让您轻松地解析DXF文件。
使用libdxfrw库可以创建新的DXF文件。
创建新的DXF文件需要进行以下步骤:1.创建DWGdirect对象。
3.创建图层。
DXFLayer layer; //创建图层4.创建实体对象并设置属性。
DXFEntity entity; //创建实体对象entity.addProperty("1", "LINE"); //设置属性5.将图层和实体添加到DXF文件中。
6.保存DXF文件。
以上步骤可以将创建新的DXF文件的过程概括。
它们可以为您创建DXF文件提供帮助。
DXF文件格式读取(VC例子)
Download demo project - 167 KbIntroductionWhat is DXF?Drawing Interchange Format (DXF) files enable the interchange of drawings between AutoCAD and other programs. DXF files can be either ASCII or binary formats. Because ASCII DXF files are more common than the binary format, CadLib uses ASCII DXF format.What is CadLib?The CadLib is not a Computer Aided Design (CAD) program. It is a tool for creating DXF files that are used in the CAD programs. It consists of two parts. One of them is a Dynamic Link Library to create the DXF file. The other part is the programming interface. It is a class that integrates the cadio.dll functions. It can be used in Microsoft Visual C++ projects. In addition, the cadio.dll can be used in other Win32 programs.Why use CadLib?In some programs, it is needed to create a drawing output for use in other programs such as AutoCad. For example, in a "Building Detail Sheet Generator Program", the program needs to create a drawing output. And the most standard format for communicating drawing data is DXF.DXF file structureThe DXF format is a tagged data representation of all the information contained in a drawing file. Tagged data means that each data element in the file is preceded by an integer number that is called a group code. A group code's value indicates what type of data element follows. This value also indicates the meaning of a data element for a given object (or record) type. Virtually all user-specified information in a drawing file can be represented in DXF format. (from AutoCad's DXF reference)A DXF file consists of some sections. Each section has some drawing data in itself. The CadLib uses the following sections:1.HEADER2.TABLES3.BLOCKS4.ENTITIESThe main reference for DXF file structure that is used for CadLib is the AutoCad's DXF reference. You can find more information about DXF file structure here.ClassesThe classes are interfaces between CadIO.dll and the main program. "Test" has come with CadLib to demonstrate how to generate a DXF file with CDxfFileWrite and CDrawing classes.CDxfFileWrite classCDxfFileWrite gathers all the commands needed to directly create a DXF file. Usage of CDxfFileWrite is as follows:1.Create the DXF fileCollapse | Copy Code2.Begin and end the HEADER section. It's here for compatibility with some CADprograms. Others work without having HEADER section.Collapse | Copy Code3.Begin the TABLES section and put the LAYER, LTYPE, STYLE, DIMSTYLEtable-types as many as you want and then close the sectionCollapse | Copy Code4.Begin ENTITIES section and put entities data (LINE, CIRCLE, SOLID, TEXT,ARC, POINT, DIMLINEAR) and finally close the sectionCollapse | Copy Code5.Close the DXF fileCollapse | Copy CodeCDrawing classCDrawing class has all the commands to create a drawing in memory and save it as a DXF file. Usage of CDrawing is as follows:1.Create the on-memory drawingCollapse | Copy Code2.Create new LAYER, LTYPE, STYLE, DIMSTYLE table-types as many as youwant.Collapse | Copy Code3.Make entities data (LINE, CIRCLE, SOLID, TEXT, ARC, POINT, DIMLINEAR,POLYLINE).Collapse | Copy Code4.Save data to a DXF file.Collapse | Copy Code5.Destroy CDrawing and free allocated memory.Collapse | Copy CodeLoading data from a DXF file1.Create the on-memory drawing.Collapse | Copy Codee LoadDXFFile member function to load DXF file into memory.Collapse | Copy CodeThat's all!ConclusionSince I am a Civil Engineer, I decided to write a program to generate a beam or columns detail sheet without the use of AutoCAD. I have written a program that, with a little data about beam or column, will create the detail sheet automatically. Output of this program is a DXF file and it can be shown in AutoCAD or it can be plotted with it. This program can save the time for drawing the detail sheet withAutoCAD. If you are an AutoCAD operator, you will understand the meaning of words that are used in this article, or if you are a programmer who wants to write a program to create DXF files, first you need a little knowledge about AutoCAD or the drawing programs such as is mentioned above. This code can be useful for programmers who need to create DXF files from their programs. CadLib is not the best one and also there are many commercial software for creating DXF files but they are not open source. Feel free to change the code. Your comments in regards to this article will cause the improvement of CadLib.History∙20 Dec 2002o First release of CadLib∙19 Jan 2003o Some bug fixeso Added Dimension-Line support. It's a combination of other entity commands like "Line" and "Solid"o Added BLOCKS section supporto Added Arc, Point and InsertBlock commands for ENTITIES sectiono Text command has been improved∙11 May 2003o Added CDrawing class to store drawing data in memory and change the data before saving it as a DXF file.∙28 June 2003o Added DXF read capability to CDrawing classo Some bug fixes of CDrawing class when writing data to a DXF file ∙22 Nov 2003 (CadLib Version 2.00)o Added Drawing View capabilityo Added PolyLine command (by Tran duy Dung)o Improved DXF loading speedo Some bug fixes of drawing memory management functions ∙24 Aug 2004 (CadLib Version 2.10)o Added ZoomExtents Functiono Improved Viewing functions to show Dashed Lineso Added "ChangeEntity" & "DeleteEntity" commandso Added Dimension view capabilityo Fixed a bug occures when viewing a rotated blocko Improved viewing of textsLicenseThis article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)About the Author。
DXF格式文件读取方法
DXF格式文件读取方法DXF(Drawing Exchange Format)是一种用于交换CAD数据的文件格式,它可以包含2D和3D图形和元数据。
下面是使用Python读取DXF文件的方法。
1. 安装依赖:首先,需要安装适用于DXF文件的Python库。
其中,较流行的库是`ezdxf`和`dxfgrabber`。
可以使用以下命令安装其中一个库:```pip install ezdxfpip install dxfgrabber```2.导入库:使用以下代码导入所需的库:```pythonimport ezdxf#或者import dxfgrabber```3.读取DXF文件:选择适用的库,使用以下代码读取DXF文件:使用`ezdxf`库:```pythondoc = ezdxf.readfile('example.dxf')```使用`dxfgrabber`库:```pythondoc = dxfgrabber.readfile('example.dxf')```4.访问实体:接下来,可以通过以下方式访问DXF中的实体:使用`ezdxf`库:```pythonmsp = doc.modelspace( # 访问模型空间for entity in msp:if entity.dxftype( == 'LINE': # 仅处理类型为线的实体start = entity.dxf.start # 起点坐标end = entity.dxf.end # 终点坐标print(f"Line: {start}, {end}")elif entity.dxftype( == 'CIRCLE': # 处理圆center = entity.dxf.center # 圆心坐标radius = entity.dxf.radius # 半径print(f"Circle: {center}, {radius}")```使用`dxfgrabber`库:```pythonentities = doc.entitiesfor entity in entities:if entity.dxftype == 'LINE':start = entity.start # 起点坐标end = entity.end # 终点坐标print(f"Line: {start}, {end}")elif entity.dxftype == 'CIRCLE':center = entity.center # 圆心坐标radius = entity.radius # 半径print(f"Circle: {center}, {radius}")```以上代码遍历DXF文件中的所有实体,并打印出线段和圆的相关信息。
DXF文件读取
objectNumber.Add(Entity);//第一个实体的顶点开始位置肯定是在顶点序列的第 0 个位 置
objectNumber.Add(Entity);//为后面的实体先开辟个值来记录, } continue; }
v1[0]=vertexArray.GetAt(tempSequence.a+objectNumber.GetAt(i).VertexNumber).x; v1[1]=vertexArray.GetAt(tempSequence.a+objectNumber.GetAt(i).VertexNumber).y; v1[2]=vertexArray.GetAt(tempSequence.a+objectNumber.GetAt(i).VertexNumber).z;
fscanf(fp, "%s\n ",str2); fscanf(fp, "%f\n ",&tempY);
fscanf(fp, "%s\n ",str2); fscanf(fp, "%f\n ",&tempZ);
tempVertex.x=tempX;//max.max; tempVertex.y=tempY;//max.max; tempVertex.z=tempZ;//max.max; vertexArray.Add(tempVertex); if (objectNumber.GetSize()>0) {
int a,b,c,d; }; //结构 SEQUENCE 用来存储实体的面的组成,记录的是 4 个顶点在顶点序列《vertexArray》中的位置
DXF文件中圆弧数据的读取及重新绘制流程
DXF文件中圆弧数据的读取及重新绘制流程【摘要】:AUTOCAD绘图软件广泛的使用到加工行业,因为每个绘图人员的习惯不一样,所以要想按照绘图员的思想能够完整的进行加工,必须首先对AUTOCAD软件生成的DXF文件进行读取和重新绘制,以方便后续按照重新绘制的图纸进行加工时提高加工效率,本文主要对圆弧数据的读取和重新绘制进行描述。
【关键字】:DXF文件文件读取重新绘制圆弧数据一:DXF文件信息元素构成一幅完整的CAD图形,会包含图层、线型、直线、多段线、圆弧、椭圆、样条曲线等多种元素信息。
为了更加完整且有条理的解析图形原有的信息,并还原出最符合加工要求的图形[2],本文将DXF文件读入的流程分为几个功能模块,文件读入流程如图1所示。
图1DXF文件读取流程图二:圆弧数据的读写流程设计从圆弧的概念当中可以看出对于圆弧有两个最重要的形成条件,一就是定点也就是我们说的圆心,二就是定长也就是我们说的圆半径。
所以在读取圆弧类数据的时候这两个条件是读取的关键点。
在观察DXF文件的存储信息中,我们可以看到“arc”的信息段,该信息段的下方表示的是圆弧实体段曲线的数据。
在图元实体模块中,圆弧曲线的实体信息如表1所示:表1圆弧曲线的DXF组码根据DXF文件的编码规则,圆弧数据段的结构如下:1、直线关键字为“arc”2、组码“10”的下方,代表椭圆圆心点X坐标值3、组码“20”的下方,代表椭圆圆心点Y坐标值4、组码“40”的下方,代表圆弧半径5、组码“50”的下方,代表起点角度值6、组码“51”的下方,代表终点角度值圆弧数据类读取流程如图2:图2圆弧的读取流程图圆弧类数据的重新绘制:根据表1的内容,可以求出圆弧的圆心坐标和半径的准确值。
而利用 自带的DrawEllipse函数就可以绘制出一个标准圆弧。
根据圆弧的方程可计算出起始第一个点的点坐标值。
在绘制圆弧过程中按照0.01度的值进行旋转增加绘制第二点,以此类推,绘制出最后一个点,也就是绘制出了一个完成的圆弧。
读取dxf文件的vb代码
读取dxf文件的vb代码读取dxf文件的vb代码' ReadDXF从DXF文件中提取指定代码/值对。
' 该函数需要4个字符串参数,一个有效的DXF文件名、' 一个DXF区域名称、一个在该区域中对象的名称以及' 一个列出代码的逗号分隔符。
'Function ReadDXF( _ByVal dxfFile As String, ByVal strSection As String, _ ByVal strObject As String, ByVal strCodeList As String) Dim tmpCode, lastObj As StringOpen dxfFile For Input As #1' 获得第一个代码/值对codes = ReadCodes' 在整个文件中循环直到找到"EOF"行While codes(1) <> "EOF"' 如果该组码为"0"并且其值为"SECTION" ..If codes(0) = "0" And codes(1) = "SECTION" Then' 这必定是一个新的区域,所以获取下一个代码/值对codes = ReadCodes()' 如果该区域为所要寻找的区域..If codes(1) = strSection Then' 取得下一代码/值对并且..codes = ReadCodes' 在该区域中循环直到找到"ENDSEC"While codes(1) <> "ENDSEC"' 在这个区域中,所有"0"代码表示一个对象。
' 如果发现"0"就可保存对象名以便以后使用。
DXF格式文件读取方法
读取DXF格式文件OpenGL是美国SGI公司最新推出的一套开放式的三维图形软件接口,适用于广泛的计算机环境,从个人计算机到工作站,OpenGL都能实现高性能的三维图形功能。
OpenGL本身不仅提供对简单图元的操作和控制,还提供了许多函数用于复杂物体的建模。
但是,我们通常喜欢使用AutoCAD和3DS及3Dmax等工具来建立模型,并且我们已经有了很多这样的模型,那么我们如何才能资源共享,避免重复劳动呢?利用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)这一段含有块定义实体,这些实体描述了图形种组成每个块的实体。
4. 实体段(ENTITIES )这一段含有实体,包括任何块的调用。
5. END OF FILE(文件结束)下面是对DXF的基本结构举一实例进行说明:0 0 后接SECTIONSECTION 表明这是一个段的开始2 2 后接的是段名HEADER 说明该段是HEADER 段(标题段)9$ACADVER 文件是由AUTOCAD 产生的1AC10089 9 后接 $UCSORG$UCSORG 用户坐标系原点在世界坐标系中的坐标10 10 对应 X0.0 X 的值20 20 对应 Y0.0 Y 的值30 30 对应 Z0.0 Z 的值9$UCSXDIR 这是一段不太相关的部分,略去101.0... ....9 9 后接 $EXTMIN$EXTMIN 说明三维实体模型在世界坐标系中的最小值10 10 对应 X-163.925293 X 的值20 20 对应 Y-18.5415860.0 Y 的值30 30 对应 Z78.350945 Z 的值9 9 后接 $EXTMAN$EXTMAX 说明三维实体模型在世界坐标系中的最大值10 10 对应 X202.492279 X 的值20 20 对应 Y112.634300 Y 的值30 30 对应 Z169.945602 Z 的值0 0 后接 ENDSECENDSEC 说明这一段结束了0 0 后接SECTIONSECTION 表明这是一个段的开始2 2 后接的是段名TABLES 说明该段是TABLES 段(表段)... ... ... ... 该段对我们不太相关,此处略去不进行说明0 0 后接 ENDSECENDSEC 说明这一段结束了0 0 后接SECTIONSECTION 表明这是一个段的开始2 2 后接的是段名ENTITIES 说明该段是ENTITIES 段(实体段)这是我0 们要详细说明的段,该段包含了所有实体的POLYLINE 点的坐标和组成面的点序。
提取dxf的最外围范围框
提取DXF文件的最外围范围框需要以下几个步骤:1. 打开DXF文件:首先,需要使用DXF阅读器或CAD软件打开DXF文件。
DXF文件是一种CAD文件格式,用于存储和交换三维设计数据。
2. 识别边界框:在打开的DXF文件中,需要找到最外围范围框的边界框。
边界框通常是一个矩形区域,包含了DXF文件中的所有对象。
可以通过查看文件中的对象数量和位置来确定边界框的位置和大小。
3. 提取边界框:一旦确定了边界框的位置和大小,可以使用CAD软件中的提取工具或手动选择对象来提取边界框。
提取后的边界框应该是一个单独的图形对象,可以保存为新的DXF 文件或进行其他操作。
以下是一个可能的800字文章提纲,可以围绕这些步骤展开:一、引言1. 介绍DXF文件及其应用场景2. 说明提取DXF最外围范围框的重要性二、如何打开DXF文件1. 介绍常见的DXF阅读器或CAD软件2. 说明如何打开并导入DXF文件三、识别DXF文件的最外围范围框1. 描述如何识别边界框的位置和大小a. 观察对象数量和分布b. 参考其他图元的位置和大小2. 分析边界框的重要性和作用四、提取最外围范围框的方法1. 介绍提取边界框的工具或方法2. 说明如何将边界框提取为单独的图形对象3. 描述提取后的边界框的应用场景五、结论1. 总结提取DXF最外围范围框的步骤和要点2. 强调DXF文件在工程设计中的重要性和广泛应用前景通过以上几个步骤,你可以逐步提取出DXF文件的最外围范围框,并了解其在工程设计中的应用价值。
请注意,具体操作方法可能因不同的CAD软件而有所不同,建议参考相关软件的官方文档或寻求专业人士的帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何读取DXF格式文件?--------------------------------------------------------------------------------OpenGL是美国SGI公司最新推出的一套开放式的三维图形软件接口,适用于广泛的计算机环境,从个人计算机到工作站,OpenGL都能实现高性能的三维图形功能。
OpenGL本身不仅提供对简单图元的操作和控制,还提供了许多函数用于复杂物体的建模。
但是,我们通常喜欢使用AutoCAD和3DS及3Dmax等工具来建立模型,并且我们已经有了很多这样的模型,那么我们如何才能资源共享,避免重复劳动呢?利用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)这一段含有块定义实体,这些实体描述了图形种组成每个块的实体。
4. 实体段(ENTITIES )这一段含有实体,包括任何块的调用。
5. END OF FILE(文件结束)下面是对DXF的基本结构举一实例进行说明:0 0 后接SECTIONSECTION 表明这是一个段的开始2 2 后接的是段名HEADER 说明该段是HEADER 段(标题段)9$ACADVER 文件是由AUTOCAD 产生的1AC10089 9 后接$UCSORG$UCSORG 用户坐标系原点在世界坐标系中的坐标10 10 对应X0.0 X 的值20 20 对应Y0.0 Y 的值30 30 对应Z0.0 Z 的值9$UCSXDIR 这是一段不太相关的部分,略去101.0... ....9 9 后接$EXTMIN$EXTMIN 说明三维实体模型在世界坐标系中的最小值10 10 对应X-163.925293 X 的值20 20 对应Y-18.5415860.0 Y 的值30 30 对应Z78.350945 Z 的值9 9 后接$EXTMAN$EXTMAX 说明三维实体模型在世界坐标系中的最大值10 10 对应X202.492279 X 的值20 20 对应Y112.634300 Y 的值30 30 对应Z169.945602 Z 的值0 0 后接ENDSECENDSEC 说明这一段结束了0 0 后接SECTIONSECTION 表明这是一个段的开始2 2 后接的是段名TABLES 说明该段是TABLES 段(表段)... ... ... ... 该段对我们不太相关,此处略去不进行说明0 0 后接ENDSECENDSEC 说明这一段结束了0 0 后接SECTIONSECTION 表明这是一个段的开始2 2 后接的是段名ENTITIES 说明该段是ENTITIES 段(实体段)这是我0 们要详细说明的段,该段包含了所有实体的POLYLINE 点的坐标和组成面的点序。
0后接POLYLINE8 表明以下数据是对于一个新的实体;OBJECT01 8后接的字符串是这个实体的名称66170 从66 1 到70 6464 说明该实体是由许多小平面组成的7138 71 38说明该实体共有38 个点7272 72 72 说明该实体由72 个三角形构成0 0 VERTEXVERTEX 表明后面紧跟着的是实体的数据8OBJECT0110 对应X 坐标-163.925293 X 的值20 对应Y 坐标-17.772665 Y 的值30 对应Z 坐标128.929947 Z 的值70 70 192192 表明上面的数据信息是点的坐标0 每一个从0 VERTEX 到70 192 之间VERTEX 的一小段是点的坐标... ... ...70192VERTEX8OBJECT011020300 当70 后跟128 时,表明该实体的每个点的坐标数据已经记录70 完了,下面紧跟着的是记录这些点是以什么样的方式组合成各128 个三角形。
71 71、72、73 后面跟着的值表明某一个三角形是第二个、第2 一个、第四个点构成的,点的顺序是按照记入DXF 文件的顺72 序。
当某一值为负数时,则表明该点到下一点的线不要画出,1 如果要画三维实体的线型图,就必须使用这一特性,否则线条73 将会出现紊乱。
-4VERTEX... ... ... ...0 0 后接SEQEND 表明该实体的数据已经全部记录完了SEQEND8OBJECT01POLYLINE 0 后接POLYLINE 表明以下又是一个新的实体... ... ... ...ENDSEC 0 后接ENDSEC 表明这是该段的结尾EOF 0后接EOF 表明这个DXF 文件结束了在DXF文件中,我们最关心的是如何得到模型上各个点的坐标,并且用这些点连成许多个三用形,构成面,进而绘制出整个模型。
在DXF文件的结构中,我们已经看到,DXF文件先叙述实体上各个点的坐标,然后叙述实体上有多少个面,每个面由哪些点构成。
这样,我们至少需要2个数组来存储一个实体的信息,一个用于存储点的坐标,一个用于存储点序,我们可以把这2个数组放到一个结构中,如果模型中实体的数目不止一个是,我们就用这个结构来定义一个数组。
在本文中,我们使用Visual C++ 6.0 来写一个读取DXF文件的小程序。
在实际应用中,模型中实体的数目以及实体中点和面的数目都是不定的,为了有效地利用内存,我们选择MFC类库中的聚合类CobArray类所创建的对象vertex, sequence来存储和管理实体的点坐标和点序。
CObArray类是一个用来存放数组类的聚合类,它能根据要存进来的数组(或结构)多少自动进行自身大小的高速,而且这个类本身具有的成员函数使得我们对它的对象的操作更加方便、快捷,用它编的程序也易于读懂。
三维实体模型的模型信息中的一部分信息可以在标题段中读出,通过读取变量名为$UCSORG的三个变量,可以得到三维实体在世界坐标系中自身所定义的用户坐标系原点的三维坐标。
通过读取$EXTMAX,$EXTMIN可以获知三维实体在世界坐标系中的范围,而其它部分的信息只有读完了全部DXF文件后才可以通过计算确定。
对于三维实体模型的全部点坐标、点序,可以在实体段中按照前面介绍的DXF文件基本结构读出。
现在我们开始写这个程序。
先建立一个头文件HEAD.H定义如下的结构:VERTEX, SEQUENCE和类CVertex, Csequence。
typedef struct {float x,y,z;}VERTEX; 结构VERTEX用来存储点的坐标typedef struct {int a,b,c;}SEQUENCE; 结构SEQUENCE用来存储实体的面的组成typedef struct {char obName[20]; 定义结构myVertex来存储实体的名字,点的坐标以及面的组成,CObArray Vertex; 其中,点的坐标和面的组成是由聚合类CObArray定义的对象来CObArray Sequence; 在存储的,我们可以把VERTEX结构和SEQUENCE结构加入到}myVertex; 这两个对象中保存class CVertex : public CObject{ 因为CObArray类的对象中只能加入由CObject派生的对象,所以protected: 我们还需要建立一个由CObject类派生的CVertex类。
在CVertex类CVertex(); 中有一个VERTEX结构的变量:m_vertex,信息实际上是存储在这DECLARE_DYNCREATE(CVertex) 个变量中的。
virtual ~CVertex();// Attributespublic: 我们还需要建立一个由CObject类派生的CVertex类。
在CVertex类CVertex(VERTEX& ver); 中有一个VERTEX结构的变量:m_vertex,信息实际上是存储在这个变量中的,函数CVertex(VERTEX& ver)把VERTEX结构的变量VERTEX m_vertex; 存入CObArray对象中。
};class CSequence : public CObject{ 这也是一个由CObject类派生的类,作用和刚才CVertex类一样,protected: 只不过Csequence类是用来存储实体中面的组成(点序)的。
CSequence();DECLARE_DYNCREATE(CSequence)virtual ~CSequence();public:CSequence(SEQUENCE& sequ);SEQUENCE m_sequence;};声明好结构与类后,我们还需要建立一个.CPP文件,来定义几个函数。
IMPLEMENT_DYNCREATE(CVertex,CObject)CVertex::CVertex(){}CVertex::~CVertex() 构造函数和销毁函数都是空的{}CVertex::CVertex(VERTEX& ver){ 这个函数的作用是:把一个VERTEX结构的数据存入变量m_vertex中m_vertex = ver; 它是这个类中最重要的一环。
}IMPLEMENT_DYNCREATE(CSequence,CObject)CSequence::CSequence(){} Csequence类的定义与CVertex类的定义差不多,只是其中的参数m_sequence的类型和CVertex类中的参数my_vertex的类型不一样CSequence::~CSequence(){}CSequence::CSequence(SEQUENCE& sequ){m_sequence=sequ;}然后用结构myVertex(如前所定义)定义一个指针*myData,目的在于根据模型中实体的多少来给指针分配合适的内存,使之成为结构数组。
定义一个函数,用于确定模型中有多少个实体,函数的返回值就是实体的个数。
int CJupiterView::getObjectNumber(){char str1[10],str2[10];char name[]="theFirst";int num;num=0;FILE* fp;fp=fopen("data.dxf","r"); 打开DXF文件,data.dxfwhile(! feof(fp) && ! ferror(fp)) 这个函数是根据实体的名字来判断实体的个数的{ 所以函数只读取实体的名字,一旦出现新的实体名字,fscanf(fp,"%s\n",str1); 实体数就加一。