2024年2月20日发(作者:)
基于DWGDirect访问AutoCAD DWG图形文件
晏韵;许超
【摘 要】文章介绍了DWG文件的数据格式和利用DWGDirect C++函数库进行接口程序开发的主要流程.DWG文件分为头部、实体部、表部、块实体部和应急头部5个部分,对各部分的存储信息给予了简要介绍.DWGDirect是开放设计联盟(Open Design Alliance)开发的函数库,可以脱离AutoCAD平台实现对DWG文件的读写操作.针对CAD/CAM应用软件,讨论了对DWG文件中加工图素的读取操作实现方法,并给出部分C++代码.
【期刊名称】《图学学报》
【年(卷),期】2010(031)006
【总页数】4页(P178-181)
【关键词】计算机应用;DWGDirect C++;DWG文件;AutoCAD
【作 者】晏韵;许超
【作者单位】东南大学,江苏,南京,210096;东南大学,江苏,南京,210096
【正文语种】中 文
【中图分类】TP391.72
AutoCAD是美国Autodesk公司设计的计算机辅助设计软件,已经成为国际上广为流行的绘图工具。DWG文件格式也成为二维绘图的事实标准格式。因此,对于国内开发的众多CAD/CAM软件而言,兼容DWG格式是极其重要的一环。鉴于使用AutoCAD本身提供的开发工具包如AutoLISP、ADS、ARX以及VBA等开
发出来的程序都无法脱离AutoCAD平台本身[1]。而且Autodesk公司提供的数据转换格式DXF存在阅读时内存资源消耗大,处理速度慢等缺点。对于批量文件,全部转化为DXF格式也很困难。因此,随着信息集成化程度愈来愈高,在独立平台上自由读取DWG文件显得相当重要。
DWG文件格式尚未公开,独立开发接口程序存在相当的难度。而且随着AutoCAD升级,DWG文件会或多或少相应变化,造成读写困难。幸运的是,开放设计联盟(Open Design Alliance)提供了一套函数库DWGDirect,开发人员只要对DWG文件的整体结构有一定了解,再结合图形的特点,就可以轻松实现DWG文件的自由读写操作。
(1) DWG文件数据类型
DWG文件为二进制格式文件,共有5种数据形式:字符型,单字节型,双字节整型,四字节整型和以IEEE标准存储的浮点数(即双精度浮点数)。
(2) DWG文件整体结构
DWG文件包含5个部分:头部、实体部、表部、块实体部和应急头部[2],如图1所示。
文件头存储一些重要信息,如DWG文件标志,版本信息,各种索引地址以及一部分系统变量[2]。图形数据包括实体数据,块数据和表数据。实体是AutoCAD中的基本图形单元,线、圆、弧、文本、实心体、区域、复合线和椭圆都是实体,用户可以在屏幕上看见实体并能对其进行操作。实体数据由实体头和实体尾组成,实体头表述实体的共同属性,不同实体头结构一样。而实体尾部的长度及格式与类型编号及特征值有关,各不相同[3]。当用户生成块时,AutoCAD自动创建相应的块表以便检索。每个块两端均为起始实体和结束实体,中间为各种实体元素。表是AutoCAD为方便检索而引入的数据结构,如块表,层表,线型表,字型表等。
应急头部主要存储一些重要信息的副本,防止文件头部损坏导致整个文件数据的丢
失。
图2为DWGDirect中DWG文件的数据模型。图中其他类型表包括视图表、文本表、线型表、尺寸表、视口表、用户坐标系表、注册应用表等。方框左上角的数字表示对应项目数量。
DWGDirect中的类有固定的命名规则,如OdRx——表示运行时类注册和识别的类,OdDb——表示数据库类,OdGi——表示数据库类对象矢量化的类,OdGe——通用图形类(点和矢量)等。数据库类表示图素信息,是一般接口程序的研究重点。以直线类OdDbLine为例:
由以上直线类定义可知,成员函数不仅可以读出实体信息,而且可以设置实体信息,这就为DWGDirect读写DWG文件提供了方便。
(1) 添加DWGDirect Libraries
在编辑接口程序的工程中添加 DWGDirect include目录下的头文件,这些头文件对相关的类做了定义,用户使用时可以方便调用,重写或者派生出自定义的对象类。同时还要添加 lib目录下的库文件。
(2) 创建自定义服务和DWGDirect对象
在 DWGDirect具体应用时,往往需要自定义服务和DWGDirect对象。
DWGDirect允许客户程序执行几种服务,如状态标定(文件加载,保存等),字体文件定位等。这些服务在OdDbHostAppService类中定义。每个数据库实例都有相关的OdDbHostAppService对象,这种关联由以下方式获得:
·OdDbHostAppService实例调用
creatDatabase(),创建新的空数据库对象,与该数据库相关的服务对象就是创建它的实例。
· 客户程序调用
OdDbHostAppService::readFile()或者OdDbHostAppService::
recoverFile(),将返回的数据库与期望得到的OdDbHostAppService实例联系起来。
DWGDirect对象均由现有类派生而来,如OdDbEntity,OdDbObject,一般自定义应用要求重写下面6个函数:
virtual bool OdDbEntity::worldDraw(OdGiWorldDraw *pWd ) const; //由OdDbEntity派生类调用,能独立在任何模型空间或者图纸空间表示实体
virtual void OdDbEntity::viewportDraw
(OdGiViewportDraw *pVd ) const; //调用无限制,建立与视图相关的实体表示法OdResult dwgInFields(OdDbDwgFiler*pFiler);//从 DWG文件装载自定义实体时调用该函数
void dwgOutFields(OdDbDwgFiler* pFiler)const; //将自定义实体保存到DWG文件时调用该函数
OdResult dxfInFields(OdDbDxfFiler* pFiler);//从DFX文件装载自定义实体时调用该函数
void dxfOutFields(OdDbDxfFiler* pFiler) const;//将自定义实体保存到DFX文件时调用该函数
需要注意的是,客户程序要在创建任何DWGDirect对象之前调用OdInitialize(),它优先于任何DWGDirect的函数调用。所有的DWGDirect调用完成之后,要调用OdUninitialize()删除所有DWGDirect对象(除了传递给 Initialize()的OdDbSystemService指针)。
(3) 复杂实体的处理
在DWG文件中存在一些包含其他对象的复杂实体,这些对象保存着实体的几何图形信息。可以用 explode()函数把一些实体分解成一系列简单的元素,如长方体能被先分解成面,再分解成直线,多义线则能被分解成直线段和圆弧段,多行文字
能被分解成单行文字,等等。主要程序如下://将分解的块表记录添加到链表中
然后只需按照普通实体的操作方法读取所需的加工图素。
(4) 实体的读取实现
实体的读取要依次遍历块表,块表记录和每个实体数据。下面的函数实现对实体的遍历:
关于具体实体信息的读取,限于篇幅,这里不再详述。
(5) 数据转换
读取实体信息之后需要把数据转换为用户程序的数据类型,才能实现文件信息的正确显示。以国外 CAM 软件 ProCAM 为例,需要将DWGDirect 4×4矩阵转化为4×3的矩阵,从而在ProCAM中实现线型、字符、加工图素、坐标、尺寸、引导线等信息的正确读取,如图3所示。
(6) 关闭实体
必须注意,无论何时打开数据库对象,应尽可能早的关闭。如果使用了扩展协议类,需要利用函数delXs()删除协议扩展。
利用DWGDirect直接读写DWG文件,简单方便,不需要花费大量的人力物力开发接口程序。但是,由于需要进行数据转换,读写较大DWG文件时速度较慢。另外,尽管开放设计联盟(Open Design Alliance)能较快地更新函数库,但是相对AutoCAD的最新版本仍然不可避免地存在滞后性,而且由于开发的不系统性导致函数库中存在一些错误。在CAM应用中最关键的是加工图素的图形转换和读取,这是本文讨论的重点。希望这里介绍的思路帮助读者开发类似应用接口提供参考,并利用DWGDirect完善DWG文件的读写双向操作。
【相关文献】
[1]万明民, 顾景文. AutoCAD图形数据格式的分析[J].工程图学学报, 2004, 25(1):34-36.
[2]孙向红. 图形文件DWG数据格式及信息传递[J]. 西安科技学院学报, 2001, (4):372-374.
[3]黄维丰, 李桥梁, 吴洪涛. 基于OpenDWG Toolkit访问 AutoCAD DWG 图形文件[J]. MODERN
COMPUTER, 2003, (1):69-72.


发布评论