晏 韵, 许 超
(东南大学,江苏 南京 210096)
基于DWGDirect访问AutoCAD DWG图形文件
晏 韵, 许 超
(东南大学,江苏 南京 210096)
文章介绍了DWG文件的数据格式和利用DWGDirect C++函数库进行接口程序开发的主要流程。DWG文件分为头部、实体部、表部、块实体部和应急头部5个部分,对各部分的存储信息给予了简要介绍。DWGDirect是开放设计联盟(Open Design Alliance)开发的函数库,可以脱离 AutoCAD平台实现对 DWG文件的读写操作。针对CAD/CAM应用软件,讨论了对DWG文件中加工图素的读取操作实现方法,并给出部分C++代码。
计算机应用;DWGDirect C++;DWG文件;AutoCAD
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所示。
图1 DWG文件总体结构
文件头存储一些重要信息,如DWG文件标志,版本信息,各种索引地址以及一部分系统变量[2]。图形数据包括实体数据,块数据和表数据。实体是AutoCAD中的基本图形单元,线、圆、弧、文本、实心体、区域、复合线和椭圆都是实体,用户可以在屏幕上看见实体并能对其进行操作。实体数据由实体头和实体尾组成,实体头表述实体的共同属性,不同实体头结构一样。而实体尾部的长度及格式与类型编号及特征值有关,各不相同[3]。当用户生成块时,AutoCAD自动创建相应的块表以便检索。每个块两端均为起始实体和结束实体,中间为各种实体元素。表是AutoCAD为方便检索而引入的数据结构,如块表,层表,线型表,字型表等。
应急头部主要存储一些重要信息的副本,防止文件头部损坏导致整个文件数据的丢失。
图2为DWGDirect中DWG文件的数据模型。图中其他类型表包括视图表、文本表、线型表、尺寸表、视口表、用户坐标系表、注册应用表等。方框左上角的数字表示对应项目数量。
图2 DWGDirect数据模型
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()删除协议扩展。
图3 ProCAM直接读取DWG文件
利用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.
Accessing AutoCAD DWG Graphic Files with DWGDirect
YAN Yun, XU Chao
( Southeast University, Nanjing Jiangsu 210096, China )
The data format of AutoCAD DWG files and the main steps for developing the interfaces with DWGDirect C++ Libraries are presented in the paper. DWG file consists of five parts:header, entities, tables, blocks and contingency header, and the information storage of each part is briefly given. DWGDirect, a library developed by the Open Design Alliance, can be used to read and write DWG files without AutoCAD platform. With the method, the realization of how to access part entities for a CAD/CAM software is discussed and a part of C++ codes is introduced also.
computer application; DWGDirect C++; DWG file; AutoCAD
TP 391.72
A
1003-0158(2010)06-0178-04
2009-02-24
晏 韵(1984-),男,湖南株洲人,硕士研究生,主要研究方向为钣金CAD/CAM。