第一篇 ObjectARX基础 3
第1章 概述 3
1.1 ObjectARX程序设计环境 3
1.1.1 访问AutoCAD数据库 3
1.1.2 与AutoCAD编辑器通信 3
1.1.3 使用MFC创建用户界面 4
1.1.4 支持MDI 4
1.1.5 创建自定义类 4
1.1.6 编制复杂应用程序 4
1.1.7 与其他环境通信 4
1.2 ObjectARX类库 4
1.2.1 AcRx库 5
1.2.2 AcEd库 6
1.2.3 AcDb库 6
1.2.5 AcGe库 7
1.2.4 AcGi库 7
1.3 开始前的准备工作 8
1.3.1 系统要求 8
1.3.2 ObjectARX目录的树形结构 8
第2章 AutoCAD数据库入门 11
2.1 AutoCAD数据库概述 11
2.1.1 多元数据库 12
2.1.2 获得对象ID 12
2.2 基本的数据库对象 12
2.3 在AutoCAD中创建对象 13
2.4 在ObjectARX中创建对象 14
2.4.1 创建实体 14
2.4.2 创建新层 16
2.4.3 打开和关闭ObjectARX对象 16
2.4.4 在组词典中添加组 17
3.1.1 创建自定义类 18
第3章 ObjectARX应用程序基础 18
3.1 创建ObjectARX应用程序 18
3.1.2 响应AutoCAD消息 19
3.1.3 提供AutoCAD的人口 22
3.1.4 初始化ObjectARX应用程序 23
3.1.5 卸载准备 23
3.2 应用程序例子 24
3.3 注册新命令 24
3.3.1 命令栈 25
3.3.2 查找顺序 26
3.3.3 全局与本地命令名 26
3.3.4 透明与模态命令 26
3.3.5 建立一个简单的ObjectARX应用程序的例子 27
3.4 加载ObjectARX应用程序 31
3.5 卸载ObjectARX应用程序 32
3.5.1 解锁应用程序 32
3.4.2 列示已加载的ObjectARX应用程序 32
3.4.1 库搜索路径 32
3.6 请求加载 33
3.6.1 AutoCAD、Windows系统注册表和ObjectARX应用程序 33
3.6.2 在ObjectARX应用程序安装时修改注册表的有关说明 34
3.6.3 DEMANDLOAD系统变量 36
3.6.4 检测到自定义对象时的请求加载 36
3.6.5 在命令执行时请求加载 37
3.6.6 在AutoCAD启动时请求加载 38
3.6.7 使用系统注册表来管理应用程序 38
3.8 在AutoLISP中启动ObjectARX应用程序 40
3.9 错误处理 40
第4章 数据库操作 44
4.1 初始化数据库 44
4.2 创建和移植数据库 44
4.3.1 设置缺省文件格式 45
4.3 存储数据库 45
4.3.2 全局保存函数 46
4.4 写块操作 46
4.4.1 从既有的数据库创建新数据库 46
4.4.2 创建带有实体的新数据库 47
4.5 插入数据库 47
4.6 设置数据库当前值 48
4.7 数据库操作的例子 49
4.8 长事务 50
4.8.1 类和函数概述 51
4.8.2 长事务例子 52
4.9 外部引用 55
4.9.1 外部引用的前、后处理 56
4.9.2 文件锁定和一致性检查 57
4.10 索引和筛选器 57
4.11 图形摘要信息 58
4.12 Autodesk软件上次存盘信息 59
第5章 数据库对象 61
5.1 打开和关闭数据库对象 61
5.2 删除对象 63
5.3 对象的数据库隶属关系 63
5.4 添加对象专有数据 64
5.4.1 扩展数据 64
5.4.2 扩展词典 67
5.5 从数据库中删除对象 72
5.6 对象编档 73
第6章 实体 74
6.1 实体的定义 74
6.2 实体的隶属关系 74
6.3 AutoCAD R12实体 74
6.4 实体的公共属性 76
6.4.1 颜色 76
6.4.3 线型比例 77
6.4.2 线型 77
6.4.4 可见性 78
6.4.5 层 78
6.5 实体的公共函数 79
6.5.1 对象捕捉点 80
6.5.2 几何变换函数 80
6.5.3 交点 81
6.5.4 GS标记和子实体 82
6.5.5 分解实体 97
6.6 创建AutoCAD实体对象 98
6.6.1 创建一个简单实体 98
6.6.2 创建一个简单块表记录 99
6.6.3 创建一个带属性定义的块表记录 99
6.6.4 创建一个带属性的块引用 102
6.6.5 遍历块表记录 105
6.7.1 创建复杂实体 107
6.7 复杂实体 107
6.7.2 遍历多义线的顶点 108
6.8 坐标系统的访问 109
6.8.1 实体坐标系 109
6.8.2 AcDb2dPolylineVertex 109
6.9 曲线函数 110
6.10 给实体加入超链接 111
6.10.1 AcDbHyperlink类 111
6.10.2 AcDbHyperlinkCollection类 111
6.10.3 AcDbEntityHyperlinkPE类 111
6.10.4 超链接的例子 112
第7章 容器对象 114
7.1 符号表和词典的比较 114
7.2 符号表 115
7.2.1 块表 117
7.2.2 层表 117
7.2.3 遍历器 120
7.3.1 组和组词典 121
7.3 词典 121
7.3.2 MLINE线型词典 124
7.3.3 布局词典 124
7.3.4 创建词典 124
7.3.5 遍历词典表项 125
7.4 布局 126
7.4.1 ObjectARX布局类 127
7.5 扩展记录(Xrecords) 128
7.5.1 扩展记录的DXF组码 128
7.5.2 扩展记录的例子 129
8.1 简介 135
8.2.1 MFC和非模态的对话框 135
8.2 使用MFC建立ObjectARX应用程序 135
第8章 MFC专题 135
第二篇 用户界面 135
8.3 使用动态链接MFC的ObjectARX应用程序 136
8.3.1 动态链接MFC的VC++工程选项设置 136
8.3.2 用动态MFC调试ObjectARX应用程序 136
8.3.3 资源管理 136
8.4 MFC内置用户界面的使用 138
8.4.1 类的层次关系 139
8.4.2 AdUi的消息传送 139
8.4.3 AdUi提示签窗口 140
8.4.4 AdUi Dialog类集 140
8.4.5 AcUi Dialog类集 141
8.4.6 AdUi类库对标签扩展的支持 141
8.4.7 AdUi和AcUi控制条类集 142
8.4.8 AdUi和AcUi的编辑控制 142
8.4.9 AdUi和AcUi的组合框控件 143
8.4.10 AcUi MRU组合框 144
8.4.11 AdUi Button类集 146
8.4.12 AcUi Button类集 146
8.4.13 对话框数据的记忆 147
8.4.14 使用并扩展AdUi标签式对话框系统 147
8.4.15 构造一个自定义的可展开标签式对话框 147
8.4.16 扩展AutoCAD内部的标签式对话框 148
8.5 通过VC++ AppWizard使用AdUi和AcUi 149
8.5.1 创建ObjectARX MFC应用程序框架 149
8.5.2 用App Studio创建MFC对话框 151
8.5.3 创建类和控件 152
8.5.4 创建对话框控制函数 153
8.5.5 给对话框控制函数增加代码 154
第9章 选择集、实体和符号表函数 161
9.1 选择集和实体名 161
9.2 选择集的处理 161
9.2.1 选择集筛选表 164
9.2.2 选择集的管理 169
9.2.3 选择集的变换 171
9.3 实体名和实体数据操作函数 173
9.3.1 实体名函数 173
9.3.2 实体数据函数 181
9.3.3 实体数据函数和图形屏幕 191
9.3.4 对扩展数据的注解 192
9.3.5 扩展记录(Xrecord)对象 196
9.4 符号表的访问 197
第10章 访问AutoCAD的全局函数 200
10.1 AutoCAD的查询及命令 200
10.1.1 通用访问函数 200
10.2 获取用户输入 211
10.2.1 用户输入类函数 211
10.2.2 对用户输入函数的控制 212
10.2.4 用户中断函数 215
10.2.3 动态拖动函数 215
10.2.5 向AutoLISP返回值的函数 217
10.3 类型转换 217
10.3.1 字符串转换 218
10.3.2 量钢单位转换函数 220
10.4 字符处理函数 220
10.5 坐标变换函数 221
10.6 显示控制函数 222
10.6.1 交互式输出函数 222
10.6.2 图形和文本屏幕控制函数 223
10.6.3 低级图形和用户输入类控制函数 224
10.7 数字化仪校准函数 224
10.8 通配符的匹配 226
第11章 派生自定义的ObjectARX类 231
11.1 自定义类的派生 231
第三篇 定义新类 231
11.2 运行时类标识 232
11.3 类声明宏 233
11.4 实现类的宏 234
11.5 类初始化函数 235
第12章 从AcDbObject类中派生新类 236
12.1 重载AcDbObject虚函数 236
12.1.1 AcDbObject类必须重载的函数 236
12.1.2 AcDbObject类时常重载的函数 236
12.1.3 AcDbObject:类有时重载的函数 237
12.1.4 AcDbObject类很少重载的函数 237
12.1.5 AcRxObject类函数很少重载的函数 238
12.1.6 AcDbEntity类的函数重载 239
12.1.7 AcDbCurve类重载的函数 239
12.2 成员函数的实现 242
12.3 生成对象到DWG和DXF文件 242
12.3.2 dwgIn()函数 243
12.3.1 dwgOut()函数 243
12.3.3 dxfOut()函数 244
12.3.4 dxfIn()函数 244
12.3.5 错误检查 244
12.3.6 DWG文件生成函数的实现 244
12.3.7 DXF文件生成函数的实现 246
12.4 对象的引用 254
12.5 隶属关系的引用 255
12.5.1 隶属关系的使用 255
12.5.2 隶属关系的类型 255
12.5.3 建一个隶属关系的层次结构 256
12.6 指针引用 263
12.6.1 硬指针 263
12.6.2 软指针 264
12.7 自定义对象的长事务处理问题 264
12.9.1 自动撤销 266
12.9 撤销(Undo)和重做(Redo) 266
12.8 清理 266
12.9.2 局部撤销 267
12.9.3 重做(Redo) 269
12.10 subErase、subOpen、subClose和subCancel 269
12.11 一个自定义对象类的例子 280
12.11.1 头文件 280
12.11.2 源程序文件 280
12.12 对象的版本支持 284
12.12.1 类的版本 284
12.12.2 类的更名 286
12.12.3 类的数据及扩展数据的版本号 287
第13章 从AcDbEntity类中派生新类 289
13.1 派生自定义实体 289
13.1.1 必须重载的AcDbEntity类函数 289
13.1.2 通常重载的AcDbEntity类函数 290
13.1.3 很少重载的AcDbEntity类函数 291
13.2.1 重载worldDraw()和viewportDraw()函数 292
13.2 重载公用实体函数 292
13.2.2 重载saveAs()函数 294
13.2.3 对象捕捉点函数的实现 295
13.2.4 控制点(grip point)函数的实现 297
13.2.5 拉伸点函数的实现 299
13.2.6 变换函数 301
13.2.7 实体的相交 302
13.2.9 分解实体 307
13.2.8 自定义实体和另一个实体的相交 307
13.3 扩充实体的功能 308
13.4 AcEdJig类的使用 308
13.4.1 从AcEdJig派生一个新类 308
13.4.2 用AcEdJig类的一般步骤 308
13.4.3 为拖动过程序列设置参数 309
13.4.4 拖动循环 309
13.4.5 实现sampler()、update()和entity()函数 310
13.4.7 例子程序 313
13.4.6 把实体加入数据库 313
第四篇 专项论题 319
第14章 代理对象 319
14.1 代理对象的定义 319
14.2 代理对象的生存期 319
14.3 用户与代理对象 320
14.4 显示代理实体 320
14.5 编辑代理实体 320
14.6 卸载应用程序时的代理 321
第15章 通知 322
15.1 通知概述 322
15.1.1 反应器类 322
15.1.2 对象反应器的类型 323
15.2 反应器的使用 323
15.2.1 AcDbObject类和数据库通知事件 324
15.2.4 数据库反应器的使用 325
15.2.2 自定义通知 325
15.2.3 编辑器反应器的使用 325
15.2.5 对象反应器的使用 328
15.3 通知使用原则 339
第16章 多文档界面 340
16.1 概述 340
16.2 专用名词 341
16.3 SDI系统变量 344
16.4 兼容级别 344
16.4.1 SDI级 344
16.4.2 MDI唤醒级 345
16.4.3 MDI能够级 347
16.4.4 MDI增强级 347
16.5 与多文档进行交互 347
16.5.1 访问当前文档及其相关对象 347
16.5.3 在不激活的情况下设置当前文档 348
16.5.2 访问与非当前文档有关的数据库 348
16.6 文档事件通知 349
16.7 应用程序专用的文档对象 349
16.8 不可重入的命令 349
16.8.1 创建不可重入的命令 349
18.8.2 不可重入的AutoCAD命令 350
16.9 多文档命令 350
16.10 禁止文档切换 351
16.11 应用程序执行上下文 352
16.11.1 在应用程序执行上下文中调用的代码 352
16.11.2 在应用程序执行上下文中的代码特点 352
16.11.3 其他应用程序执行上下文的考虑 353
16.12 数据库撤消和事务管理功能 354
16.13 与文档无关的数据库 354
16.14 一个MDI唤醒应用程序的例子 355
17.2 事务管理器 364
第17章 事务处理 364
17.1 事务处理概述 364
17.3 嵌套事务 365
17.4 事务边界 365
17.5 在事务中获得对象指针 366
17.6 新创建的对象和事务 367
17.7 提交时注意要点 367
17.8 撤销与事务处理的关系 367
17.9 用打开和关闭机制混合事务模型 367
17.10 事务处理和图形的生成 368
17.11 事务管理反应器 368
17.12 嵌套事务的例子 369
第18章 深层克隆 380
18.1 深层克隆基础知识 380
18.1.1 使用clone()与deepClone() 380
18.1.2 克隆的基本概念 381
18.1.3 典型的深层克隆操作 382
18.1.4 从不同所有者中克隆对象 383
18.2 为自定义类实现deepClone()函数 386
18.2.1 使用深层克隆和写块克隆的AutoCAD命令 387
18.2.2 克隆阶段 387
18.2.3 转换阶段 387
18.2.4 命名对象词典 390
18.2.5 重载deepClone()函数 393
18.2.6 重载wblockClone()函数 396
18.2.7 在克隆过程中使用appendAcDbEntity()函数 403
18.2.8 在wblockClone()中处理指向AcDbEntitie对象的硬引用 405
18.2.9 编辑器反应器通知函数 408
第19章 协议扩展 413
19.1 协议扩展的定义 413
19.2 协议扩展的实现 413
19.2.1 声明并定义协议扩展类 413
19.2.3 协议扩展的缺省类 414
19.2.2 注册协议扩展类 414
19.2.5 在应用程序中使用协议扩展函数 415
19.3 为MATCH命令进行协议扩展 415
19.2.4 卸载应用程序 415
19.4 协议扩展例子 416
第20章 ObjectARX全局实用函数 421
20.1 ObjectARX库函数的普遍特性 421
20.1.1 ObjectARX全局函数和AutoLISP的差异 421
20.1.2 函数返回值与函数的结果 422
20.1.3 外部函数 423
20.1.4 出错处理 425
20.1.5 应用程序之间的通信 425
20.1.6 外部应用程序的处理 429
20.2 ObjectARX中定义的变量、类型和值 430
20.2.1 通用类型和定义 430
20.2.3 结果缓冲区结构和类型代码 435
20.2.2 常量符号 435
20.2.4 ObjectARX函数结果码 439
20.2.5 控制用户输入的位控码 440
20.3 表与其他动态数据结构 441
20.3.1 结果缓冲区内存管理 443
20.4 扩展数据所特有的数据类型 448
第21章 点输入的处理 450
21.1 自定义对象捕捉方式 450
21.1.1 对自定义对象捕捉方式进行创建和注册 450
21.1.2 创建协议扩展类 451
21.1.3 创建自定义点符 452
21.1.4 自定义对象捕捉方式的例子 452
21.2 输入点处理 458
21.2.1 输入点管理器 458
21.2.2 输入上下文事件 458
21.2.3 输入点筛选器和监视程序 464
第22章 程序配置文件的管理 473
22.1 配置文件管理器 473
22.1.1 AcApProfileManager类 473
22.1.2 AcApProfileManagerReactor类 473
22.1.3 程序配置文件管理的例子 474
第五篇 与其他环境进行通信 481
第23章 COM、ActiveX自动控件和对象属性管理器 481
23.1 ObjectARX中的COM介绍 481
23.2 在ObjectARX和其他环境使用AutoCAD COM对象 481
23.2.1 在ObjectARX中访问COM接口 482
23.3 AutoCAD ActiveX自动控件的实现 492
23.3.1 AcDbObjects和自动控件对象之间的关系 492
23.3.2 创建COM对象 495
23.4 与AutoCAD进行交互 497
23.6 建立一个注册文件 498
23.5 文档锁定 498
23.7 开放自动控件功能 500
23.7.1 建立ATL工程文件 500
23.7.2 设计一个COM 501
23.7.3 建立并注册一个COM DLL 505
23.8 对象属性管理器API 507
23.9 静态OPM COM接口 507
23.10 实现静态的OPM接口 509
23.11 动态属性和OPM 513
第24章 AutoCAD设计中心COM API 514
24.1 AutoCAD设计中心API 514
24.2 AutoCAD设计中心部件注册要求 515
24.2.1 应用程序主键 515
24.2.2 扩展主键 516
24.2.3 CLASSID注册 516
24.3 AutoCAD设计中心实现接口 517
24.4.1 创建ActiveX模板库工程 518
24.4 定制AutoCAD设计中心 518
24.4.2 加入注册表支持和一个新的ATL COM对象 519
24.4.3 添加程序代码支持新的ATL COM对象 521
第六篇 ObjectARX库 533
第25章ObjectDBX库 533
25.1 简要介绍 533
25.2 ObjectDBX的使用 534
25.3 ObjectDBX和ObjectARX的差别 535
25.4 本地化和XMX文件 536
25.5 事务管理 537
25.6 创建观察器 538
25.6.1 观察器部件 538
25.6.2 AcGi类库 538
25.6.3 AcGix类库 539
25.6.4 AcGix与AutoCAD视图的不同 539
25.6.5 SimpleView 541
25.6.6 Whip View类库 542
25.6.7 ViewAcDb类库 542
25.6.8 基本观察器的操作 542
25.6.9 配置建议 543
25.7 请求加载 543
25.8 安装ObjectDBX库文件 544
25.8.1 使用COMMONFILES 544
25.8.2 通过版本控制和以共享方式进行安装 544
25.8.3 保证文件在路径中 545
25.8.4 保证路径更新正确有效 545
25.9 其他技术说明 547
25.9.1 关于ACAD-OBJID-INLINE-INTERNAL 547
25.9.2 关于AcDbDatabase类的说明 547
25.9.3 AcDbDatabase::Insert()函数 549
25.9.4 在模型空间寻找活动视区 549
25.9.6 测试AutoCAD 2000的图形 550
25.9.5 视区的一些细节问题 550
25.9.7 使用较早版本的DWG文件 551
25.9.8 扩展实体数据 551
25.9.9 光栅图像的处理 552
第26章 图形接口类库 553
26.1 AcGi类库概述 553
26.1.1 setAttributes函数 554
26.1.2 worldDraw()函数 555
26.1.3 viewportDraw()函数 556
26.1.4 视区重新生成的类型 557
26.2 设置实体属性 557
26.2.1 子实体属性 558
26.2.2 AcGi常量 559
26.2.3 使用AcGi的例子 560
26.3 图原子 561
26.3.1 格网 561
26.3.2 壳 564
26.3.3 弧 568
26.3.4 多义线 568
26.3.5 文字 569
26.4 在对象中使用可绘制实体 572
26.5 分格处理 573
26.6 等值线 574
26.7 坐标系变换 574
26.7.1 模型坐标系 574
26.7.2 通用坐标系 575
26.7.3 视觉坐标系 575
26.7.4 显示坐标系 575
26.7.5 变换实例 575
26.8 在AcGi类库中使用边界裁剪功能 584
26.8.1 有关背景知识 584
26.8.2 边界裁剪的例子 585
27.1 AcGe库的概貌 587
第27章 使用几何类库 587
27.1.1 全局变量数据和函数 588
27.1.2 允许误差 589
27.2 基本几何计算类型 589
27.3 直线和平面类 591
27.4 参数几何结构 592
27.4.1 曲线 592
27.4.2 曲面 595
27.5 专用的求值类 596
27.5.1 关于曲线和曲面使用效率的一些提示 600
27.6 永久的AcGe实体对象 602
附录ObjectARX嵌入工具 606
A.1 ObjectARX嵌入工具配置 606
A.1.1 安装ObjectARX 2000应用程序向导 606
A.1.2 ObjectARX嵌入工具配置 606
A.2.1 “ObjectARX包含(ObjectARX Includes)”对话框 608
A.2 ObjectARX嵌入工具的功能 608
A.2.2 “ObjectARX定义命令”对话框 609
A.2.3 “ObjectARX入口点消息”对话框 610
A.2.4 “临时ObjectARX反应器”对话框 611
A.2.5 “ObjectARX类向导”对话框 613
A.2.6 ObjectARX类向导——成员函数 614
A.2.7 ObjectARX类向导——成员变量 615
A.2.8 ObjectARX类向导——代理标志 616
A.2.9 ObjectARX类向导——类信息 617
A.2.10 “ObjectARX MFC支持”对话框 617
A.2.11 “ObjectARX入口点API”对话框 619
A.2.12 “ObjectARX请求加载”对话框 620
A.2.13 新ATL对象对话框 621
A.2.14 “ObjectARX部件”对话框 622
A.2.15 ObjectARX在线帮助 623
主要参考文献 625