ObjectARX(CAD)_Step3_0
Symbol Tables
NOTE: 为读写操作打开的任何对必须在使用完毕后手动关闭, 这一点非常重要, 未能关闭的对象会导致AutoCAD崩溃在本章内容中, 我们会创建一个新的图层, 创建一个定义块, 并演示如何用迭代器来遍历集合在模型空间块表记录(the Model Space block table record)中的实体, 对开放对象的读写操作;
目标: 创建两个函数 CREATE
& SETLAYER
-
实现 CREATE 命令: 创建一个名为"USER" 的图层 和 创建一个名为 "EMPLOYEE" 的定义块;
- 创建一个图层添加
AcDbLayerTableRecord
到AcDbLayerTable
; - 创建一个定义块添加
AcDbBlockTableRecord
到AcDbBlockTable
, 为了实现定义块, 将构成定义块的图元 添加到新创建的AcDbBlockTableRecord
中. 使用 AutoCAD INSERT 命令来创建一个定义块实例. 块定义的实例称为AcDbBlockReference
实体。AcDbBlockReference
图元将附加到模型空间或AutoCAD的一个图纸空间布局中。
- 创建一个图层添加
-
实现 SETLAYER 命令:
- 在模型空间中搜索“EMPLOYEE”块的实例(具有对“EMPLOYEE”AcDbBlockTableRecord的引用的AcDbBlockReference实体)。对于找到的每个“EMPLOYEE”块,将“EMPLOYEE”块的层更改为“USER”层。在模型空间中搜索“EMPLOYEE”块的实例将使用块表迭代器AcDbBlockTableRecordIterator
utilities.h & utilities.cpp
createLayer(const TCHAR* layerName, AcDbObjectId &layerId)
-
从激活数据库中获得 Layer (AcDbLayerTable, AcDbDatabase::getLayerTable()); 获得激活数据库的方法-> acdbHostApplicationServices()->workingDatabase())
-
检查我们要创建的 Layer 是否存在, (AcDbLayerTable::getAt()), 如果存在, 就将查到的
id
存入参数layerId
中; -
如果不存在, 就创建一个新的 Layer ,并将其加入到 Layer Table(表) 中. new 一个 AcDbLayerTableRecord 对象. 因为此时我们需要修改 Layer Table, 为了写入到 layer table 我们激活 layerTable. 新建的 AcDbLayerTableRecord 通过
AcDbLayerTable::add()
加入到 Layer Table 中. 最后关闭这个 LayerTable 后, 我们返回这条 Record 的 Id; -
如果要使用
AcDbLayerTable
,AcDbLayerTableRecord
我们需要在包含头文件<dbsymtb.h>
;但我们不必添加include,因为头文件stdafx。“utilities.h”中包含的h在标题“arxHeaders.h”中包含include语句。“arxHeaders.h”头文件包含包含所有ObjectARX头的include语句。
createBlockRecord(const TCHAR *name)
-
从 workingbase 中获取 block table: (AcDbBlockTable, AcDbDatabase::getBlockTable() )
-
检查 block table record 是否重复存在(AcDbBlockTable::has()). 如果重复, 则返回一个 error 状态值 (Acad::eDuplicateKey). Don't forget to close the block table.
-
new 一个新的 block table record 然后将其加入到 block table 中 (AcDbBlockTableRecord, AcDbBlockTable::add() ). (用于修改的block black 必须是激活的). 初始化 block table record. 设置原点位置为(0,0,0) (AcDbBlockTableRecord::setOrigin (AcGePoint3d::kOrigin) ). 设置它的名称. 添加 block record 成功后, 关闭编辑的 block table 资源.
-
创建一个 "EMPLOYEE" 实体, 添加到新建的 block table record 中. (AcDbBlockTableRecord::appendAcDbEntity()). "EMPLOYEE" 实体中包含三个圆(AcDbCircle) 和 一段圆弧. 通过 ACDbEntity::setColorIndex() 来设置一下颜色
-
不要忘记关闭打开的资源文件(entities, block, layer)
-
如果使用 AcDbCircle, AcDbArc, 需要包含头文件 '<dents.h>', 同样, 因为 <arcHeaders.h> , 我们不必要再添加一边头文件了.
-
PI 可以设值为 3.141592654.
Block name "EMPLOYEE" | AcDbBlockReference | ||||
---|---|---|---|---|---|
Block origin | (0, 0, 0) | ||||
Face characteristics | AcDbCircle (yellow) | Center = (0,0,0) | Radius=1.0 | ||
Left eye | AcDbCircle (blue) | Center = (0.33,0.25,0) | Radius = 0.1 | ||
Right eye | AcDbCircle (blue) | Center = (-0.33,0.25,0) | Radius = 0.1 | ||
Mouth | AcDbArc (red) | Center = (0,0.5,0) | Radius = 1.0 | Start Angle = PI+(PI*0.3) | End Angle = PI+(PI*0.7) |