望山居

真相本来是一体的,太大了,所以大家给他画了格子,结果把自己困了起来

导航

ObjectARX(CAD)_Step3_0

Symbol Tables

在本章内容中, 我们会创建一个新的图层, 创建一个定义块, 并演示如何用迭代器来遍历集合在模型空间块表记录(the Model Space block table record)中的实体, 对开放对象的读写操作;

NOTE: 为读写操作打开的任何对必须在使用完毕后手动关闭, 这一点非常重要, 未能关闭的对象会导致AutoCAD崩溃

目标: 创建两个函数 CREATE & SETLAYER

  • 实现 CREATE 命令: 创建一个名为"USER" 的图层 和 创建一个名为 "EMPLOYEE" 的定义块;

    1. 创建一个图层添加 AcDbLayerTableRecordAcDbLayerTable;
    2. 创建一个定义块添加 AcDbBlockTableRecordAcDbBlockTable, 为了实现定义块, 将构成定义块的图元 添加到新创建的 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)

  1. 从激活数据库中获得 Layer (AcDbLayerTable, AcDbDatabase::getLayerTable()); 获得激活数据库的方法-> acdbHostApplicationServices()->workingDatabase())

  2. 检查我们要创建的 Layer 是否存在, (AcDbLayerTable::getAt()), 如果存在, 就将查到的 id 存入参数 layerId 中;

  3. 如果不存在, 就创建一个新的 Layer ,并将其加入到 Layer Table(表) 中. new 一个 AcDbLayerTableRecord 对象. 因为此时我们需要修改 Layer Table, 为了写入到 layer table 我们激活 layerTable. 新建的 AcDbLayerTableRecord 通过 AcDbLayerTable::add() 加入到 Layer Table 中. 最后关闭这个 LayerTable 后, 我们返回这条 Record 的 Id;

  4. 如果要使用 AcDbLayerTable, AcDbLayerTableRecord 我们需要在包含头文件 <dbsymtb.h>;但我们不必添加include,因为头文件stdafx。“utilities.h”中包含的h在标题“arxHeaders.h”中包含include语句。“arxHeaders.h”头文件包含包含所有ObjectARX头的include语句。

createBlockRecord(const TCHAR *name)

  1. 从 workingbase 中获取 block table: (AcDbBlockTable, AcDbDatabase::getBlockTable() )

  2. 检查 block table record 是否重复存在(AcDbBlockTable::has()). 如果重复, 则返回一个 error 状态值 (Acad::eDuplicateKey). Don't forget to close the block table.

  3. 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 资源.

  4. 创建一个 "EMPLOYEE" 实体, 添加到新建的 block table record 中. (AcDbBlockTableRecord::appendAcDbEntity()). "EMPLOYEE" 实体中包含三个圆(AcDbCircle) 和 一段圆弧. 通过 ACDbEntity::setColorIndex() 来设置一下颜色

  5. 不要忘记关闭打开的资源文件(entities, block, layer)

  6. 如果使用 AcDbCircle, AcDbArc, 需要包含头文件 '<dents.h>', 同样, 因为 <arcHeaders.h> , 我们不必要再添加一边头文件了.

  7. 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)

posted on 2022-03-25 16:24  穆道  阅读(264)  评论(0)    收藏  举报