飞电 发表于 2013-12-15 16:35:45

AutoCAD 二次开发中对图形数据库的访问

本帖最后由 飞电 于 2013-12-15 18:00 编辑

AutoC AD 二次开发中对图形数据库的访问
杜 刚* 刘东学
( 大 连理工大学化工机械系)
   摘 要 介绍了 AutoCAD 图形数据库的概念以及对数据库常用的操作, 结合实例说明了用 O bjec t A R X 进行二次开发时访问图形数据库的基本方法。
   关键词 AutoCAD Object ARX  二次开发 图形数据库   机械设计论坛
         * 杜 刚, 男, 1979 年生, 硕士研究生。大连市, 116012。
1 引言
  Object ARX 是 AutoDesk 公司推出的新一代功能强大的 AutoCAD 二次开发工具。Object ARX 编程使用面向对象的 C + + 应用程序机制, 一个 ARX 应用程序是以动态 链接库 ( DLL ) 的形式分享 AutoCAD 地址空间的, 并且可以被 AutoCAD 直接调用。 这便于广大AutoCAD二次开发程 序员能够更加充分地利用AutoCAD的开放结构, 使程序员能 够更直接地完成对AutoCAD 的深层数据结构、 图形系统编程和用户命令的定义。Object ARX 对 AutoCAD的所有操作都是通过图形数据库来进行的, 图形数据库在 AutoCAD 的开发中处于中心位置。 一幅AutoCAD 图所包含的所有实体和对象均保存在图形数据库中, 可以通过ObjectARX 技术通过程序开发来进行修改和编辑, 这是AutoCAD 二次开发的基本出发点和最终目标。
2 图形数据库访问技术
  2 . 1  图形数据库概述
  Auto CAD 图形数据库是Object ARX 开发的最重要部分, 它保存了组成一幅图形的所有对象, 基本的数据库对象是实体( En t i t y ) 、 符号表( Block Table)和词典( Dictionary) 。实体是表示图的一种特殊数据库对象( 如 Line 、 Circle 等) , 用户可以在屏幕上看到实体并能对其进行操作。符号表和词典是用于存储数据库对象的容器, 这两个容器对象都映射一个符号名( 文本串)到一个数据库对象。图 1 列出了组成 AutoCAD数据库的主要部件。 每个图形数据库的对象、实体都有唯一的句柄( handle) 来标识。
  一个 AutoCAD数据库包含一套固定的符号表, 每个符号表包含一个特定的符号表记录的实例, 不允许向数据库添加新的符号表。如层表( AcDb Layer Table) 是符号表之一, 它包含层表记录( AcDbLayer TableRecord) ; 块表( AcDbBlock Table ) 也是一个符号表, 包含块表记录( AcDbBlock TableRecord) 。
   词典为存储对象提供了比符号表更加普通的容器。一个词典可以包含任何类型的数据库对象(AcDbObject) 及其子类的对象, 当 AutoCAD创建新图时, AutoCAD创建一个叫做“命名对象词典( NamedObject Dictionary)” 的词典。对所有与数据库有关的词典, 命名对象词典可以被视为主“目录 表” 。允许在命名对象词典中创建新词典, 并在新词典中添加新的数据库对象。
  基本的数据库对象至少应包括以下内容:
   ( 1 ) 一套( 九个) 符号表, 包括块表、层表和线型表。块表最初包括三个记录, 一个模型空间记录* MODLESPACE , 两个图纸空间记录* PAPE R- SPACE和* PAPER- SPACE0; 层表最初包含一个 0 层记录;线型表最初包含 CONTINUES 线型。
   ( 2) 一个命名对象词典, 当数据库被创建后, 命名对象词典已经包含四个数据库词典: GROUP ( 组) 词典、 MLINE类型词典、 布局词典和绘图式样名词典, 在MLINE 类型词典内, 总有STANDARD类型。
  除了基本的数据库对 象, 数 据库中的每个对象 都必须有一个所有者, 并且一个对象只能有一个所有者,数据库是一个由对象隶属关系结构组成的树, 对象的数据库隶属关系结构如下:
  ( a ) 块表记录拥有实体;
  ( b ) 每个符号表拥有一个具体类型的符号表记录;
    ( c ) AcDb Dictionary 对象可以拥有任何AcDbObject对象;
    ( d ) 任何 AcDbObject 对象可以有一个扩展词典,此扩展词典隶属于这个对象。
  2 . 2  对图形数据库的操作
  数 据库的操作包括始化数据库、创建和移植数据库、存储数据库、数据库的写块和插入操作以及深层克隆操作等。以下介绍了创建、保存、 读取以及遍历实体的操作。
  ( 1) AcDbDatabase * pDb = new AcDbDatabase
( ) ; / / 创建数据库
     …… ……
     del et e p Db ; / / 删除数据库
  A cDbD at ab as e 类的构造函数是:
     A cDb Dat abas e ( b oo l b ui l d Def au l t Dr aw i ng =
t ru e, b o ol n oDo c u men t = f al s e)
其中, 参数 buildDefault Drawing 可以控制是否创建一个含有基本要素的图形数据库 。 该参数默认值是 true,创建一个含有基本要素的数据库; 如果要创建一个完全空白的图形数据库, 可以将参数值设置为 false。
  ( 2) AcDb Database: : readDwg File( char * fileName) ; / / 读入图形文件
  ( 3) AcDb Database: : saveAs ( ch ar * fileName) ;/ / 存储 数据库
  ( 4) AcDb Database: : wblock ( AcDb Database * &newDb ) ;/ / 从已调用的数据库 创建新数据库
      AcDb Database: : wblock ( AcDb Database * &newDb , AcDbObject Id record Id ) ;/ / 复制命名块
      AcDb Database : : wblock ( AcDb Database *&newDb , const AcDbObject Id Array&d Array , const AcGePoint 3d * point ) ; / / 复制
实体阵列
  ( 5 ) AcDb Database : : insert ( AcDb Object Id &block Id , constchar * pBlock Na me,AcDb Database *pDb) ; / / 插入数据库
  ( 6 ) AcDb Database: : deep CloneObjects ( ……)/ / 数据库深层克隆
  2. 3 Object ARX 实体对象
  实体对象是带有图形表现的数 据库对象, 包括直线 ( AcDbLine) 、 圆( AcDbCircle) 、 弧线 ( AcDbArc ) 、 文字 ( AcDb Text ) 、 实 心 体 ( AcDbSolid) 、 样条曲线( AcDbSpline) 和椭圆( AcDbEllipse) 等。在图形数据库中, 实体属于块表记录类 ( AcDb Block TableRecord ) 的对象。 当创建一个新图形数据库 时, 数据库中的块表将自动含有三个预 定义的记录: 两个图纸空间记录和一个模型空间记录 , 用户添加的块记录会被添加到块表中。实体的隶属关系图如图 2 所示。
3 图形数据库操作实例
  3. 1 注册命令
  Visual C + + 为 Object ARX 提供了 默认的开发环境, 在进行 Object A RX 开发时, 需要使用 Object ARX开发工具包的资 源, 并且在每一个工程 项目中都要使用, 因此首先要在 Visual C + + 环境下配置资源路径,包括头文件和库文件。 然后创建一个新的工程。 每一个ARX 程序都有一个 入口函数acrxEntry Point ( ) ,AutoCAD 通过 acrxEntry Point ( ) 函数调入 Object ARX应用程序, 其函数原型声明如下:
  extern “ C”
  AcRx : : AppRet Code
  acr x Entry Point ( AcRx : : AppM sg Codemsg , void* pkt ) ;msg 代表 Object AR X 内核送往应用程序的消息, pkt代表保存信息包数量值, App Ret Code 包含返回到AutoCAD 的状态码。 在 acrxEntryPoint ( ) 函数定义中,一个 switch 语句解释了从 AutoCAD 发出的消息, 对每个消息执 行适当的操作并返回整形状态值。函数initApp ( ) 完成绘图命令的注册, 在此函数中注册命令“ create” :
  acedR egC md s - > a dd C omman d ( “ A S DK _ DWG _
  C OM M A ND S ” , “ A S DK _ C RE A T E” , “ C RE A T E” ,
  A C RX_ C M D_ M O DA L , creat eD w g ) ;
  3 . 2  函数实现
  creat eDw g 为命 令 “ cr eat e” 对应的处理函 数, 其实
现如下:
vo i d creat eD w g ( )
{
 A cDbD at ab as e* pD b= n ew A c D bDa t ab ase ( ) ;
/ / 生成新的图形数据库
 A cDbB l ock T ab l e* pB t b l ; / / 获得块表指 针
 p Db - > get S y mb ol T ab l e( p Bt b l , A cDb : :
k Fo rR ead) ;
/ / 获得模型空间块表记录指针
 A cDbB l ock T ab l eRecor d* p Bt bl Rcd ;
  p Bt b l - > get A t ( A C DB _ M ODE L _ S P AC E ,
p Bt b l Rcd , A cDb : : k F or Wr i t e ) ;
p Bt b l - > cl o s e ( ) ; / / 关闭块表, 下面只对模型空
间块表记录进行操作
  AcDb C i r cl e * p C i r 1 = new A c D bC i rcl e
( A cGeP oi n t 3 d ( 20 0, 2 00 , 0 ) , A cGeV ect o r3 d ( 0 , 0,
1) , 5 0. 0) ; / / 创建圆
  A c D bL i n e * p L i n e = n ew AcDb L i n e ( A cGeP oi nt 3d
( 30 0, 2 30 , 0) , AcG ePo i n t 3d ( 3 00 , 50 , 0 ) ) ; / / 创 建 直线
/ / 设 置直线属性
 p L i n e- > s et C ol or In d e x ( 1) ;
 p l i n e- > s et T h i ck n es s ( 10 0) ;
 p l i n e- > s et C ol or In dex ( 4) ;
 / / 将直线 和圆分别 加入 到模型 空间, 并 关闭实 体对
象指针
 p B t b l R c d - > ap pen d AcDb E n t i t y( pC i r 1 ) ;
 p C i r 1 - > cl os e( ) ;
 p B t b l R c d - > ap pen d AcDb E n t i t y( pL i n e) ;
 p L i n e- > cl o s e( ) ;
 p Bt b l Rcd - > c l os e ( ) ; / / 关 闭模 型空 间块 表记 录指

 p Db - > s aveA s ( “ f ace. d w g” ) ;
 d el et e pD b ;
}
4 结束语
  A u t oC A D 图是一个存储在数据库中的对象的集合。用 Object ARX 对 Auto CAD 进行开发时一个重要环节就是对图形数据库的访问, 包括创建数据库、 读入数据库、 存储数据库以及写块和 插入等操作, 灵活运用Object ARX 提供 的各种函 数实现对 AutoCAD 图形数据库的访问是 AutoCAD 二次开发的有效途径 。
参 考 文 献
 1 刘良华, 朱东海. A ut o CA D 2000 A RX 开发技术. 北京:清华大学出版社, 2000.
 2 邵俊昌, 李旭东. A ut oC A D Ob jec tA R X 2 000 开发技术指南. 北京: 电子工业出版社, 2000.
 3 朱学军, 陈昭荣. 用 O bje ct A RX 开发 A ut o CA D 时的实体访问技术. 计算机与现代化, 2002 ( 10 )
   ( 收稿日期: 2004- 01- 12)
页: [1]
查看完整版本: AutoCAD 二次开发中对图形数据库的访问