You are on page 1of 3

第 21 卷第 12 期     计算机应用与软件 Vol.21 ,No.

12
2004 年 12 月    Computer Applications and Software Dec.2004

基于 AutoCAD 图形数据库的 ARX 应用程序开发


朱 学 军
(宁夏大学机械工程学院  银川 750021)

摘  要   图形数据库在 AutoCAD 的开发过程中处于中心地位 。 在系统阐述 AutoCAD 图形数据库基本 结构的同时 , 就开 发 ARX 应


用程序时的实体访问技术进行了详细论述 , 提 出了具体的实现方法 , 并通过实例予以说明 。

关键词   ARX  AutoCAD  图形数据库  实体

DEVELOPING ARX APPLICATION PROGRAMS BASED ON


GRAPHIC DATABASE OF AUTOCAD

Zhu Xuejun
(School of Mechanical Engineering , Ningxia University , Yinchuan 750021)

Abstract   Graphic database is the center in the process for developing AutoCAD . The basic structure of graphic database of AutoCAD is introduced
At the same time , the accessing technology of entity for developing ARX application programs is introduced in this paper , and a concrete
with system.
Meanwhile , a living exampls is given.
method of this is putted forward.

Keywords  ARX  AutoCAD  Graphic database  Entity

图 1所示为 AutoCAD 图形数据库的基本结构 。


0  引  言 AcDb 库是 ARX 编译 环境
下 的 AutoCAD 图 形 数 据 库 ,
ObjectARX(AutoCAD Runtime Extension)是 AutoDesk 公 司 在 ARX 可 以 方 便 地 对 AutoCAD
AutoCAD R13 之后 推 出的 一 个全 新 的 、面 向 对 象 的开 发 环 境 。 结构类 实 体 数 据进 行 直 接 操
它以动态链 接库(DLL)的 形式 与 AutoCAD 共 享同 一地 址空 间 , 作 。AutoCAD 环境 下所绘 图形
图 1  AutoCA D 的
可直接访问 AutoCAD 的 数据 库 , 为用 户提 供一 个能 对 AutoCAD 图形数据库 是一个存储于数 据库中的 Ac-
进行深层次开发的控制权 。ObjectARX 应用程序在执行过 程中 , Db-对象的 集合 , 它 从两 个方
对 AutoCAD 的所有操作都是通过图形数据库来进行的 , 因此 , 图 面对实体进行描述和 记录 :一是对几何实体(如直线 、圆等)进行
形数据库在 AutoCAD 的开发中处于中心地位 。 一幅 AutoCAD 图 几何特 征的描述 ;
二是 符号表和字 典等的记录 , 如层 、块的 名称
形所包含的 所有实体和对象 均保存 在图形数 据库中 , 可 以使用 等 。 数据库中的每个对象都有 一个句柄 。 句柄在一幅图中是唯
ObjectARX 技术 , 通过程序开 发来进 行修改 和编 辑 ;
关键在 于实 一的 、不重复的 , 是对象在这幅 图中的标识 。
体结构的分 析和灵活运用实 体函数 对实体进 行访问 , 这 也正是 1.2 直线 、圆的描述
AutoCAD 二次开发的基 本出发点 。 当实体对象生成后 , 会被 添加到 图形数 据库中 合适的 容器
对象中 , 如图形实体被添加到图
1  AutoCAD 图形数据库 块表的记录中 , 符号表记录被添
加到合 适的 符号 表 中 。 一 个数
1 图形数据库的基本结构
1. 据库建立后 , 必须具有符号表和
AutoCAD 的图形数据 库由 9 个 符号 表 、一个 有名 的对 象词 图形的 指定 对象 字 典 。 图 块表
典和一组固定 的顶 层 变量 组成 。 其中 , 实体 类图 形 库是 Auto- 已 包 含 两 个 记 录 , *MODEL 图 2  直线 、圆的数据库生成
CAD 图形库 的主要内容 , 如直线 、圆等 , 均可在屏幕上显示 出来 。 SPACE 和 *PAPER SPACE;
层表包含一个记录即 Layer0;
对象字
AutoCAD 初始化时 , 仅包 含被 AutoCAD 使用 的两 个其 它字 典的 典中包含两个 数据 库字典 , 即 组字 典和符 合线(MLINE)类型 字
ID 号 , 因此 , 可以 自由地 向字 典中添 加任 何实 体 。 符 号表 则属 典 。 这些对象可以在一 个新的 数据库 对象中 被自动 地创建 , 方
于非实体数 据库 , 如图 层 、线 型 、颜色 等 。AutoCAD 在 数据 库中 法是向构造函数的 buildDefaultDrawing 参数 传递 kTrue ;
若传 递的
提供了一套 固定的符号表 , 每个符 号表中 包含符 号表记 录的一
个特定的类的实例 , 如层表包含了图层表记录 、图块表包含了图
收稿日期 :
2003 -09-18 。 本文为 国家科技 型中小企 业创新基 金项
块表记录等 。AutoCAD 虽 然定 义了 200 多 个顶 层变 量 , 但 它们
目(99c26216400612)。 朱学军 , 副教授 , 主研领 域 :
机械 优化设 计和自 动
不属于 数 据 库 实体 。 图 块表 记 录 拥 有所 有 的 AutoCAD 实 体 。
控制 。
 
 
16     计算机应用与软件 2004 年

是 kFalse , 则用于为 加载一 个 DWG 或 DXF 文 件做准 备 。 直 线 、 2.2 实体对象的打开与关闭


圆的数据库生成如图 2 所示 。 用于打开一个对象的 函数是 acdbOpenObject()。 具体而言 ,
用“ Line” 和“ Circle” 命令 分 别绘 制 可以通过 kFofRead(读 模式)、kForWrite(写 模式)或 kForNotify(通
一条直线 和一个 圆 , AutoCAD 的图 形数 知模式)等来打开一个对象 。 在多任务环境中 , 一个打开的图形
据库中将分别生 成 AcDbLine 类和 AcD- 数据库对象可能被对换到磁盘 中 。为了 确保存取对象时该对象
图 3  生成一个
bCircle 类 , 并存储 于模型空 间的块 记录 能够 被调入 或存在 于物理内 存中 , Object ARX 规定 在修改 实体
新的图层
中 。 当激活 AutoCAD 时 , 图形数 据库处 )函数 来打开对象 , 并且 在操
对象之前必须使用 acdbOpenObject(
于基本状态 , 实体被添加到模型空间 , 即 AutoCAD 的主空间 。 图 作完成后的第一时间 内将该实体对象关 闭(调用成 员函数 pOb-
纸空间支持“ 文本” 几何实 体 , 如 标题块 、表 轮廓和标 注文本 等 。 ject ->clos()
);否 则 , 可能 会导 致系 统 运行 出错 , 甚至 发生 崩
对于被添加 到当前图形数据 库中的 生成实体 , 可 以进行 查询和 溃 。 与此同时 , 使用“new” 命令生成的实体指针也应及时删除 。
修改等操作 。 用“layer make mylayer”生成一 个新的图层 , 如图 3 例如 , 在 一 个 具 体 的 ARX 例 程 中 包 含 有 addLayer()和
所示 。 将上述两种数据库用“Group” 组 合在一起 , 生成一 个新的 )两个函 数 , 前 者用 于新图 层的 建立 , 后 者用 于删 除
deleteLayer(
组 。在屏幕 背后 , AutoCAD 会将这一新组 加入到组字 典中 , 组字 所建的新图层 。 但在实际操作 中 , 只要执行 deleteLayer()函 数就
典包含于有名对象字典中 。 会出现一个 致命的 错误 :
INTERNAL ERROR :
! DBPURGE .
CPP @
416 , eWasOpenForWrite 。 经 检 查 得 知 , 有 一 个 AcDbLayerT-
2  开发 ARX 应用程序时的实体访问技术 ableRecord 的对象 pLayerTblRcd 未 被关 闭 , 从而导 致应 用程 序不
能对层表进行修改 , 因为已 被打开的 层表记 录不能 从层表 中删
1 获取实体对象的具体方法
2. 除。
一个实体是 一个 有图 形表 示的 数据 库对 象 , 如 line 、circle 、 下面的代码描述 了获取直线端点坐标的具体方法 :
arc 、solid 、text、region、spline 等 。 除少 量例 外 , 实体 包含 所有 有关 ads point pt , pt1 , pt2 ;
它们的几何信息 。 所有实体均 具有一 定数量的 共同属 性(如颜 ads name en ;
色 、线型 、图 层 、可见性 、线型比例和出图形式名称等)以及 设置 、 void get lineEnt(ads name en , ads point pt , ads point pt 1, ads point
pt2)
获取其值的成员函数 。 用户在屏幕上可以看到一个实体并对其
{
进行处理 。
 AcDbObjectId eId =0 ;
数据库实体的所有权结构如图 4 所 示 。
 acedEntSel(″ n 选择直线:
″, en , pt);
 acdbGetObjectId(eId , en);∥获得实体地址
 AcDbEntity * pEnt ;
 acdbOpenObject(pEnt , eId , AcDb ∷kForRead);∥获得实体指针
 ∥查询实体类型
 if(pEnt ->isK indOf(AcDbLine∷desc()))∥直线
 {
图 4  AcDbEntity 所有权类层次   ∥获得直线端点坐标
AcDbEntity 类由 AcDbObject 派生而来 。 为了画出自己 , 每个   AcDbLine *pLine=(AcDbLine *&)pEnt ;
  pt1[ X] =pLine ->startPoint()[ X] ;
实体都会调 用 AcGi 库 中 的 原 始 图 形 , 如 polylines 、circle 和 arc
  pt1[ Y] =pLine ->startPoint()[ Y] ;
等 。从 AcDbEntity 派生的任何类 都可以将 一个 GS(Graphics Sys-
  pt2[ X] =pLine ->endPoint()[ X] ;
tem)标记和用于绘制自己的显示向量相 关联 。 实体类 的生成器
  pt2[ Y] =pLine ->endPoint()[ Y] ;
决定 GS 标记被插入 的合 理位 置 。 当用 户选 择一 个实 体时 , GS
 }
标记用于识别实体中被拾取的部分 。 例 如 , 从 AcDb3dSolid 派生  acedRedraw(en , 3);∥高亮显示实体
的 Solid 是由 vertex(顶点)、edge(边)和 face(面)所组成 。 这些元  pEnt ->close();∥关闭实体记录指针
素中的每一个均可用一个 GS 标记识别 。 }
综合而言 , 通过 句柄 、对象 ID(Object ID)和C ++实 例 指针
(Pointer)获取实体属性 , 是 ARX 应 用程 序得以 实现 的三种 具体 3  应用实例
方法 。 当 AutoCAD 的 DWG 文件保存 在磁盘上时 , 对象通过句柄
进行标识 。 打开 DWG 文 件后 , ARX 应用 程序通过 对象 ID 引用 上述方法已被成功 应用 于某服 装 CIMS 工程 的 PDS(Pattern
数据 库中的 对象 。 数据 库中 的每个 对象 都有 一个 对象 ID 。 从 Desing System ——— 服装纸样设计系统)的开发 与定制过 程中 。 基
础开发平台为 AutoCAD2000 , 开 发工具 为 Visual C++6 .
0 和 Ob-
ject ARX2000SDK 。 现以该软 件中 的功能 指令 之一 ———“ 做已 知
图 5  Hnadle、Object ID 和C ++Pointer 的关系 圆定长切线” 为例 , 说明 ARX 应用程序的 设计和执行过程 :
∥This is command `QX' (做已知圆的定长切线)
对象所在数据库产生到数据库被删除的编辑进程中 , 这个 ID 一
void arxBqx()
直存在 。OPEN 函数将对象 ID 作为一个参数并返 回一个指向该
{
对象的地址指针 。 这个指针 在对象 被关闭 之前都是 合法的 , 如
acedEntSel(″ n 请选择圆上的一点 :
″, en , pt 1);
图 5 所示 。
acedRedraw(en , 3);∥被选择实体(圆)高亮显示 (下转第 93 页)
 
第 12 期     张专成等 :
基于结构树集合分割的效能选择性图像编码算法的改进  
93

算术编码的压缩空间已经非常之小 , 更加接近 于最大熵编号 。 acdbOpenObject(pcir, circldId , AcDb ∷kForRead);∥获得实体(圆)指针


centpoint =pci r->center();∥获取圆心坐标
  pt [ X] =centpoint .
x;
  pt3[ Y] =centpoint .
y;
n =acutA ngle(pt 3, pt1);∥计算角度
acedGetPoi nt(pt1 ,″ n 请选择方向点 :
″, pt2);
if(acedGetDist(pt 1, ″ n 请输入 距离 :
″, &m)==RTNONE)∥切 线长

{
m=acutDistance(pt1 , pt2);
}
∥判断方向
acedCommand(RTSTR ,″LINE″, RTPOINT , pt1 , RTPOINT , pt2 , RTSTR ,″
″,
图 6  各种算法实验结果比较
0);∥画切线
acedRedraw(en , 4);∥恢复实体(圆)的非高亮显示
5  结束语 在 AutoCAD2000 环 境下输入“QX” 形式 的命令 , 应 用程 序的
执行过程如图 6 所示 。
本文在 阐 明 EZW 算 法 基 本 原 理 的 基 础 上 , 重 点 讨 论 了
SPIHT 算 法及其 扩展应 用 AS-SPIHT 算 法 , 最后针 对 SPIHT 算法
存在的缺陷提出 了 IAS-SPIHT 算法 , 在 算法 实现 中建 立了 四元
组模型 , 充分利用了已检出重要系数的先验知识 , 从而不仅简化
了 AS-SPIHT 算法 , 而 且 进一 步提 高 了压 缩 比 。 实践 证 明 IAS-
SPIHT 算法具有简单高效的实用价值 。

参 考 文 献
图 6  A RX 应用程序的执行过程
[ 1 ] Ramos M .
G .,Hemami S .
S .,A ctivity selective SPIHT coding[ C] , SPIE
Conf .
on Visual Communications and Image Processing , 1999 , 3653:315 ~
326. 4  结  论
[ 2 ] Shapiro J .M .,Embedded image coding using zerotrees of wavelet coeffi-
cients[ J] , IEEE Transactions on Signal Processing, 1993 , 41(12):
3445 ~ 在VC +
+环境下 开发 ARX 应 用程 序 , 以实 现 AutoCAD 功能
3462 . 扩展的过程中 , 实体访问技术至关重要 ; 充分了解和分析实体结
[ 3 ] Said A .,Pearlman W .
A .,A new fast and ef ficient image codec based on 构 , 灵活运用 ObjectARX 所提供的操作 函数 , 是深入 开发和 应用
set partitioning in hierarchical t ree[ J] , IEEE Transactions on Circuit s and
AutoCAD 的一个有效途径 。
systems for Vi deo Technology , 1996, 6(6)243 ~ 249 .
[ 4 ] Rajpoot N .,Wilson R .,Progressive image coding using augment ed zerotrees 参 考 文 献
of wavelet coefficients[ R] , Research Report CS-RR-350 , Department of
[ 1 ] Laiserin , Jerry. 2002 ,
Autodesk Architectural Studio[ J] Computer Sof tware.
Computer Science, University of Warwick(UK), September 1998 .
24(10):
54~ 55.
[ 5 ] Muzaffar T.,Choi T.S .,Simplified EZW image coder with residual data
[ 2 ] Gould , Lawrence S .
New approaches to CAD“ Integration” [ J] Automotive
transmission[ C] .IEEE International Conference on Multimedia and Expro
Manufacturing &Production .
2001, 113(6):
48 ~ 50 .
(I), 2000 :
111~ 114.
[ 3 ] J P Hao, Y L Yu, Q Xue.
A maintainability analysis visualization syst em and
[ 6 ] C .S .
Barreto and G .
V.Mendonca, Enhanced Zerotree Wavelet Transform
its development under the AutoCAD environment[ J] M aterials Processing
Image Coding Exploiting Smi larities Inside Subbands[ C] , In Proceeding
Technology .
2002 , [ 129] :
277~ 282 .
IEEE Conf .
O n Image Proc, volume Ⅱ , 1996 , 549 ~ 551.
[ 4 ] 宋建厚 , “ 基于 A RX 技术的 交互式 CAD 应用程 序开发[ J] ” , 《 信阳
[ 7] Jie Liang, Highly Scalable Image Coding for Multimedia Applicat ions[ C] .
In
师范学院学报》 , 2000 , 13(2):
223~ 226 .
Proceeding of the Fifth ACM Intl . 11 ~ 19.
Multimedia Conference, 1997:
[ 5 ] 李刚 、刘华明等 , “用 Visual C ++开发 AutoCAD[ J] ” , 《机械与电子》 ,
[ 8 ] Said A .,Example of appli cation for image compression[ EB/OL] .
http :∥
1999 , (5):
21 ~ 23.
www .
cipr .
rpi .
edu .
[ 6 ] 支剑锋 、尉朝闻 , “ 基于 A RX 环境 下图形数据库的 设计[ J] ” , 《西安
[ 9 ] Antonini M .,Barlaud M., Mathieu P .,Daubechies I, Image codi ng using
科技学院学报》 , 2000 , 20(2):
181~ 184 .
wavelet transform[ J] , IEEE Trans.
Image Processing , 1992 , 1 :
205 ~ 220 .
[ 7 ] 朱东海 、江见鲸等 , “ObjectA RX 开发的经验和技 巧[ J] ” , 《四 川建筑
[ 10] Witten I.
H., Neal R.
M.Cleary J .
G .,Arithmetic coding for data compres-
科学研究》 , 2001 , 27(1):
65 ~ 67 .
sion[ J] , Commun .
ACM , 1987 , 30 :
520 ~ 540.
[ 8 ] 闵落明 、王宵等 , “ VC ++环 境下 Object ARX 应用 程序 开发的 关键
技术[ J] ” , 《计算机应用研究》 , 1999(6):
68~ 70.
(上接第 16 页) [ 9 ] 王政 、高全学等 , “ADS 应用程序向 A RX 环 境移植的 研究[ J] ” , 《甘
  AcGePoint3d centpoint ;
肃工业大学学报》 , 2000 , 26(4):
6 ~ 9.
AcDbObjectId circleId ;
[ 10] 陈昕 、李卫民 、唐阳山 , “ 可视化的 A RX 应用程序开发[ J] ” , 《辽宁工
AcDbCircle *pcir;
学院学报》 , 2000, 20(1):
9 ~ 12.
acdbGetObjectId(circleId , en);∥获得地址

You might also like