|
说明
本篇的实例演示编组的创建和删除。在 AutoCAD 中,可以使用 Group 命令来创建和删除编组,但是在 ObjectARX 中就没有直接的函数来创建和删除组,必须通过组的底层实现来操作。
2. 思路
前面已经介绍,编组的信息保存在图形数据库的有名对象字典中,在 ObjectARX 中对编组的操作实际上就是对有名对象字典中组字典的操作,可以通过 AcDbDatabase 对象的getGroupDictionary 函数获得组字典的指针。
组字典在有名对象字典的根字典中的关键字是“ACAD_GROUP ”,因此还可以通过有名对象字典的 getAt 函数来获得组字典的指针。
//通过有名对象字典的 getAt 函数来获得组字典的指针
AcDbDictionary *pNameDict;
acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNameDict, AcDb::kForRead);
pNameDict->getAt("ACAD_GROUP", (AcDbObject*&)pGroupDict, AcDb::kForWrite);
pNameDict->close();
一般情况下都不会用上面的代码来获得组字典,提供这段代码只是为了让读者更好
地理解组字典与根字典的关系。
3. 步骤
(1) 提示用户选择几个实体,将其创建成一个编组
// 提示用户选择几个实体,将其创建成一个编组
static void AddGroup(); // 提示用户选择几个实体,将其创建成一个编组
// 根据指定的 ObjectId 数组创建编组
static void CreateGroup(AcDbObjectIdArray& objIds, TCHAR* pGroupName); // 根据指定的 ObjectId 数组创建编组
//提示用户选择几个实体,将其创建成一个编组
void CXData::AddGroup()
{
// 提示用户选择多个实体
ads_name sset;
acutPrintf(_T("\n选择要成组的实体:"));
if (acedSSGet(NULL, NULL, NULL, NULL, sset) != RTNORM)
return;
long length;
acedSSLength(sset, &length);
AcDbObjectIdArray objIds;
for (long i = 0; i < length; i++)
{
// 获得指定元素的ObjectId
ads_name ent;
acedSSName(sset, i, ent);
AcDbObjectId objId;
acdbGetObjectId(objId, ent);
// 获得指向当前元素的指针
AcDbEntity *pEnt;
acdbOpenObject(pEnt, objId, AcDb::kForRead);
objIds.append(pEnt->objectId());
pEnt->close();
}
acedSSFree(sset);
// 创建组
TCHAR groupName[] = {_T("MyGroup")};
CreateGroup(objIds, groupName);
}
// 根据指定的 ObjectId 数组创建编组
void CXData::CreateGroup(AcDbObjectIdArray& objIds, TCHAR* pGroupName)
{
AcDbGroup *pGroup = new AcDbGroup(pGroupName);
for (int i = 0; i < objIds.length(); i++)
{
pGroup->append(objIds[i]);
}
// 将组添加到有名对象字典的组字典中
AcDbDictionary *pGroupDict;
acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
AcDbObjectId pGroupId;
pGroupDict->setAt(pGroupName, pGroup, pGroupId);
pGroupDict->close();
pGroup->close();
}
(2) 删除图形中的编组“MyGroup”
//删除图形中的编组“MyGroup”
static void DelGroup();
// 删除图形中的编组“MyGroup”
void CXData::DelGroup()
{
// 获得组字典
AcDbDictionary *pGroupDict;
acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
if (pGroupDict->has(_T("MyGroup")))
{
pGroupDict->remove(_T("MyGroup"));
}
pGroupDict->close();
}
(3) 在acrxEntryPoint.cpp中
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyAddGroup, MyAddGroup, ACRX_CMD_MODAL, NULL) //添加组字典
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDelGroup, MyDelGroup, ACRX_CMD_MODAL, NULL) //删除组字典
//当前项目中注册命令 AddGroup(添加组字典)
static void MidasMyGroupMyAddGroup()
{
CXData::AddGroup();
}
//当前项目中注册命令 DelGroup(查看扩展数据)
static void MidasMyGroupMyDelGroup()
{
CXData::DelGroup();
}
|
|