工控网首页
>

应用设计

>

二维零件图提取技术的研究及应用

二维零件图提取技术的研究及应用

2006/5/17 9:48:00
关键词:CAD;DXF;二维零件图;信息集成 中图分类号:T23 文献标识码:A Application & Research on Technology of Extracting 2D Part Drawing ZHOU Xiao-hui, ZHOU Chun-jie, Wan Yi (Department of Control Science and Engineering , HuaZhong University of Science and Technology, WuHan 430074, China) Abstract: The article introduces the basic structure of DXF files which is widely used by various CAD sys- tem, and discusses in- depth the process of extracting entities information from DXF files and the technology of assembling these information into 2D Part Drawing in CIMS, which has significant sense in the information integration of CAD/CAPP/CAM. Key words: CAD; DXF; 2D part drawing; information integration 1 引言 近年来,国内计算机辅助设计(CAD)得到普遍应用,经较长时间的使用打下了良好的基础并产生了较好的效果。MRPII/ERP/CIMS系统在制造行业的应用也得到了相当的发展。 在制造业信息集成的过程中,各种工程的 CAD图纸是制造数据的来源,从CAD图纸中提取的各种零件的基本信息可以作为信息集成系统中后继的物料采购与出入库、零件下料与切割、工程成本核算等等各个过程的数据来源及参考,由此可见提取零件图数据的重要性。然而,目前国内外 CAD市场上,各种自主版权的CAD软件共存,各个CAD软件各有所长,各个CAD系统之间的不兼容性形成一道信息壁垒,给数据交换、共享和信息集成造成障碍。DXF文件是由Auto Desk公司设计的为了与其他的CAD软件进行数据交换的文件,随着AutoCAD版本的不断升级,DXF(图形交换文件)逐渐成熟,DXF标准已经成为国际通用的图形数据交换标准,被大多数的CAD系统所接受。因此,实现一种从DXF文件中提取图元基本信息并形成零件图的方法,对众多企业实现信息集成有着重要的指导意义。 2 DXF文件介绍 DXF(Drawing Inter Change Format)称为图形交换格式文件,用来在AutoCAD和其他CAD软件之间交换图形数据。DXF文件有两种存储方式,ASCII码格式和二进制格式,我们主要研究ASCII码格式。 DXF图形交换文件是一种顺序文件。它是在一定的组码符号规定下,包括了实体命令和几何数据信息在内的数据文件。该文件由标题段、类段、表段、块段、实体段和对象段六个部分组成,对各段功能的简要说明如下: (1)标题段(HEAD section):包含了图形的基本信息。由AutoCAD版本号及一些系统变量组成。每个参数包括了一个变量名及其值。 (2)类段(CLASSES section):包含了程序自己定义的各种类,这些类的实例出现在块段、实体段以及对象段中。类的定义在类的层次结构上是固定不变的。 (3)表段(TABLES section):表段共包含4个表,每个表又包含可变数目的表项。这些表是AP.PID、BLOCK-RECORD、DIMSTYLE、LAYER、 LTYPE、STYLE、UCS、VIEW、VPORT。 (4)块段(BLOCK section):包含了所用块的块名,当前图层名、块的种类、块的插入基点及组成该块的所有成员。块的种类分为图形块、带有属性的块和匿名块三种。 (5)实体段(ENTITIES section)包含了每个实体的名称,实体所在图层及其名字、线型、颜色等。 (6)对象段(OBJECTS section):包含了图形中所有的非图形对象。所有不是实体或者符号表记录对象都在这个区段保存。 各个段都是由组构成。组是DXF文件书写的基本单位,每个组分两行,第一行为组码,代表该组数据的意义,其数据类型规定为整数;第二行为组值,即这种数据的具体数值。一个DXF文件包括图形数据库中所有信息。由于DXF文件的格式很规范,描述每个段和实体的组码、组值也很有规律。因此,便于用高级语言来编写处理程序。 3 DXF文件信息提取 前所述,从DXF文件提取图元信息的技术对于企业信息集成有着极为重要的作用,并广泛应用于各种CAD和信息集成系统之中。为了提高软件的重用性,避免重复开发读取DXF文件的功能模块,笔者设计了通用的读取DXF文件的类DXF- Interface和DXF-Parser。其中类DXF-Parser完成按组码和组值读取DXF文件的功能,完成从DXF文件中提取和解析各种实体的组码和组值的工作;类DXF-Interface是一个抽象类,该类提供了一个用的DXF程序接口,该接口将实体数据暴露给需要获取DXF文件中的实体数据的各种CAD软件信息集成系统。任何第三方开发者通过调用DXF- Interface的派生类的各种方法,即可得到DXF- Parser类从DXF文件中读取到的各种实体的数据。这样的设计使得DXF文件读取模块重用性大大提高。
DXF-Parser类的主要方法如图2所示。方法 ReadDXFFile()将指定的DXF文件打开,以文件流的形式进行读取文件。方法ReadDxfGroups()调用方法GetChoppedLine()每次从DXF文件中读取两个数据行,再调用方法ProcessDXFGroup()对这两个数据行进行处理,解析出其中包含的组码和对应的组值。如此循环,读取DXF文件中所有的组码组值对。所有的实体数据都通过一个DXF-In- terface对象向外传递,以提供给任何使用该DXF- Parser类的程序读取DXF实体数据的接口。 DXF-Interface类被设计为一个纯虚类。该类提供了一个访问DXF-Parser类的接口。开发者只需从DXF-Interface类继承出一个适合于系统开发需要的新类,并实现DXF-Interface的全部虚函数,就可以直接通过DXF-Parser类将DXF文件中所有的信息提取出来。 下面的代码演示了如何从DXF-Interface类继承一个新类,并示例性的实现了其中的几个纯虚方法。在这个示范代码中,笔者仅仅把读取到的各种实体的属性值打印了出来,其他开发者应该根据各个不同系统的开发需要,对读取到的实体数据进行相应的处理。需要注意的是,类DXF-Interface是一个抽象类,它仅仅只能作为基类,不能为抽象类 DXF-Interface创建它的对象。自定义类Test. Dxf-Interface从抽象类DXF-Interfaee继承而来,其基类DXF-Interface中所有的虚函数都必须在子类Test-DxfInterface中得到实现,否则将出现编译错误。
class Test-Dxflnterface : public DXF-Interface { public : Test-Dxflnterface( ) ; //构造函数 Test-Dxflnterface( ) ; //析构函数 virtual void getLine(const CLine& data); virtual void getArc(const CArc& data); ... ... ... } void Test-DxfInterface::getLine(const CLine& data) { printf("LINE(%6.3f, %6.3f, %6.3f)(%6.3f, %6.3f, %6.3f)\n", data. xl, data. yl, data. zl, data. x2, data. y2, data. z2); } void Test-DxfInterface: :getArc(const CArc& data) { printf("ARC(%6.3f, %6.3f, %6.3f)%6.3f, %6.3f, %6.3f\n", data. cx, data. cy, data. cz, data. radius, data. angle1, data. angle2) ;} 下面的代码演示了如何在自己的程序中使用 DXF-Parser类和Test-DxfInterface类。所要做的就是创建一个DXF-Parser的对象和一个Test- DxfInterface的对象,并将Test-DxfInterface的对象以引用参数的形式传给DXF-Parser的对象的in()函数。然后我们就可以通过Test-DxfInterface的对象访问各种实体的数据了。 Test-Dxflnterface Dxflnterface = new Test-DxfInterrace; Dxf-Parser * dxf = new Dxf-Parser(); if (! dxf - > in (" your-dxf-file, dxf" & Dxf Interface) ) { //如果文件打开失败 std::cerr<<“打开文件失败!\n”; return 0: } 4 图元信息存储数据结构设计 基于通用性和功能独立性的考虑,类DXF- Parser并没有提供任何形式的数据结构来保存和处理所有的实体数据,它仅仅是从DXF文件中读取相应的实体数据并传递给DXF-Interface类的对象。开发者需要根据实际应用,在继承DXF-Inter face类的时候,设计符合不同的应用需要的数据结构,来存储和处理各种实体的数据。 MFC提供了CMap、CList、CArray三种模板集合类来管理文档数据。C++模板是创建可重用软件类的最有效的工具之一,基于模板的类具有更好的类型安全性。在综合考虑了排序、查找、索引等要求后,选定使用类型指针型对象链表CtypedP. trList作为本应用的数据结构。CtypedPtrList的用法如下: typedef CtypedPtrList < CObList, CEntity *> CEntityList : CEntityList以链表形式保存所有的实体对象的指针,模板中第一个参数说明CtypedPtrList的基类是CObList。CObList类支持非唯一CObject指针的有序链表,这些指针可以按序号或者值访问。在链表的头部、尾部、已知的位置处插入元素的操作都非常块。模板中第二个参数说明该链表中保存的是CEntity类的对象的指针。CEntity类是自行定义的各种图形实体的基类,从CEntity类又派生出CRect、CLine、CCircle、CPloyLine等图形实体类。CEntityList对象的存储结构如图3所示。
5 零件图的组装成形 下面的工作是完成零件的组装。DXF文件中保存的实体的数据是按照生成实体的先后顺序存储的,因此提取出的原始数据是杂乱无章的。这就需要对数据进行整理并排序,最终将分散的图形实体组合成为现实世界中的零件,并保存在对应的零件对象数据结构中。由于本系统的主要研究对象是二维零件图形,我们的目标是找出所有的二维封闭图形。 零件图的组装主要有以下几个步骤: (1)找出零件号和标注直线端点坐标。本系统中零件号的标<
投诉建议

提交

查看更多评论
其他资讯

查看更多

助力企业恢复“战斗状态”:MyMRO我的万物集·固安捷升级开工场景方案

车规MOSFET技术确保功率开关管的可靠性和强电流处理能力

未来十年, 化工企业应如何提高资源效率及减少运营中的碳足迹?

2023年制造业“开门红”,抢滩大湾区市场锁定DMP工博会

2023钢铁展洽会4月全新起航 将在日照触发更多商机