一、概述
- 字典:
- 功能:CAD图纸中有个全局字典,用来存放图纸中的全局信息
- 自定义数据:开发者可以通过在字典存放扩展记录方式存放自己的全局数据
- 内置数据:字典已经内置了一些数据,比如:组,多线样式,布局信息,图片定义,Wipout等数据
二、组字典
- 组:组就是一个选择集,主要为了方便选择,组中的对象仍是完全独立的
- 图块:主要应用于图纸中会重复使用的一些图形,例如机械零件、建筑的门窗等等,图块相当于一个由多个图形组成的集合
- 初始生成CAD组字典
2.1 测试代码
- Commands.h
#include "stdafx.h" void AddCommands(); void create(); void append(); void remove();
- Commands.cpp
#include "stdafx.h" #include "Commands.h" #include "Editor.h" void AddCommands() { // 新增组字典记录 Editor::AddCommand(L"c-create", ACRX_CMD_MODAL, create); // 向组字典记录中添加实体 Editor::AddCommand(L"c-append", ACRX_CMD_MODAL, append); // 剔除组中实体:非线实体 Editor::AddCommand(L"c-remove", ACRX_CMD_MODAL, remove); } // 新增组字典记录 void create() { Acad::ErrorStatus es; // 组字典记录指针 AcDbGroup *pGroup = new AcDbGroup(); AcDbDictionary *pDict; // 获得当前活动数据库的 组字典指针 acdbHostApplicationServices()->workingDatabase()-> getGroupDictionary(pDict, AcDb::kForWrite); AcDbObjectId groupId; // setAt:设置组字典记录的名称、返回 组记录 对象指针、返回 组记录 对象id es = pDict->setAt(_T("组字典记录名称"), pGroup, groupId); // 获取到对象id后尽早关闭 记录 pGroup->close(); // 纠错函数:防止未处理错误引起CAD崩溃 if (es != Acad::eOk) { acutPrintf(_T("\n错误代码为:%s"), acadErrorStatusText(es)); pDict->close(); return ; } // 清理工作 pDict->close(); } // 向组字典记录中添加选择集 void append() { // 框选获取选择集 ads_name sset; if (acedSSGet(NULL, NULL, NULL, NULL, sset) != RTNORM) { return; } // 获取组字典记录 对象id AcDbDictionary *pDict; acdbHostApplicationServices()->workingDatabase()-> getGroupDictionary(pDict, AcDb::kForWrite); AcDbObjectId groupId; pDict->getAt(_T("组字典记录名称"),groupId); pDict->close(); // 获取组字典记录 对象指针 AcDbGroup *pGroup = NULL; acdbOpenObject(pGroup, groupId, AcDb::kForWrite); // 获取选择集长度 =》 遍历选择集每个 实体元素 =》获取实体元素 对象id Adesk::Int32 len; if (acedSSLength(sset, &len) == RTNORM) { AcDbObjectId id; ads_name en; for (Adesk::Int32 i = 0; i < len; i++) { acedSSName(sset, i, en); acdbGetObjectId(id, en); // append:向组字典记录添加实体 对象id pGroup->append(id); } } // 关闭组记录、释放选择集 pGroup->close(); acedSSFree(sset); } // 剔除组中非线实体 void remove() { // 获取组字典记录 对象id AcDbDictionary *pDict; acdbHostApplicationServices()->workingDatabase()-> getGroupDictionary(pDict, AcDb::kForWrite); AcDbObjectId groupId; pDict->getAt(_T("组字典记录名称"), groupId); pDict->close(); // 获取组字典记录 对象指针 AcDbGroup *pGroup; acdbOpenObject(pGroup, groupId, AcDb::kForWrite); // 组字典迭代器,遍历组字典记录中每个元素 AcDbGroupIterator *pItr = pGroup->newIterator(); for (;!pItr->done();pItr->next()) { // 获取组字典记录中每个元素 AcDbObject *pObj; pItr->getObject(pObj, AcDb::kForRead); // 判断如果是非线类实体 if (!pObj->isKindOf(AcDbLine::desc())) { // 必须先关闭实体,才可以从组字典记录中移除 pObj->close(); // 剔除符合筛选条件的实体:传入对象id pGroup->remove(pItr->objectId()); } else { pObj->close(); } } delete pItr; // 设置组内的元素为红色 pGroup->setColorIndex(1); // 关闭组 pGroup->close(); }
1.2 效果图
- 新增组字典记录
- 向组字典中添加实体
- 向组字典中添加实体
- 剔除组中实体线并修改组颜色
传送门 返回 列表