效果
方式一
通过实体所在对象的永久反应器获取组对象
ads_name ent;
ads_point pt;
if (RTNORM != acedEntSel(_T("
选择对象: "),ent,pt))
{
return;
}
AcDbObjectId objId;
acdbGetObjectId(objId,ent);
AcDbEntityPointer pEnt(objId,AcDb::kForRead);
Acad::ErrorStatus es=pEnt.openStatus();
if (Acad::eOk != es)
{
acutPrintf(_T("
打开对象失败,错误码=%s"),acadErrorStatusText(es));
return;
}
const AcDbVoidPtrArray *pReactors=pEnt->reactors();
if (pReactors==NULL || pReactors->length()<1)
{
acutPrintf(_T("
该对象没有组!"));
return;
}
CStringArray strGroupNames;
for (int i=0;i<pReactors->length();i++)
{
void* pSomething = pReactors->at(i);
if (pSomething==NULL) continue;
if (!acdbIsPersistentReactor(pSomething)) continue;
AcDbObjectId persReactorId=acdbPersistentReactorObjectId(pSomething);
AcDbObjectPointer<AcDbGroup> pGroup(persReactorId,AcDb::kForRead);
if (Acad::eOk != es) continue;
strGroupNames.Add(pGroup->name());
}
int nCount=strGroupNames.GetCount();
if (nCount<1)
{
acutPrintf(_T("
该对象没有组!"));
return;
}
acutPrintf(_T("
该对象拥有 %d 个组"),nCount);
for (int i=0;i<nCount;i++)
{
acutPrintf(_T("
第 %d 个组名为 %s ."),i+1,strGroupNames.GetAt(i));
}
方式二
通过遍历组字典判断组是否包含实体对象来获取组对象
ads_name ent;
ads_point pt;
if (RTNORM != acedEntSel(_T("
选择对象: "),ent,pt))
{
return;
}
AcDbObjectId objId;
acdbGetObjectId(objId,ent);
AcDbEntityPointer pEnt(objId,AcDb::kForRead);
Acad::ErrorStatus es=pEnt.openStatus();
if (Acad::eOk != es)
{
acutPrintf(_T("
打开对象失败,错误码=%s"),acadErrorStatusText(es));
return;
}
AcDbObjectId groupDicId=acdbHostApplicationServices()->workingDatabase()->groupDictionaryId();
AcDbObjectPointer<AcDbDictionary> pGroupDic(groupDicId,AcDb::kForRead);
es=pGroupDic.openStatus();
if (Acad::eOk != es)
{
acutPrintf(_T("
打开组字典失败,错误码=%s"),acadErrorStatusText(es));
return;
}
CStringArray strGroupNames;
AcDbDictionaryIterator *pIter= pGroupDic->newIterator();
for (;!pIter->done();pIter->next())
{
AcDbObjectId groupId= pIter->objectId();
AcDbObjectPointer<AcDbGroup> pGroup(groupId,AcDb::kForRead);
es = pGroup.openStatus();
if (Acad::eOk != es)
{
acutPrintf(_T("
打开组失败,错误码=%s"),acadErrorStatusText(es));
continue;
}
if (pGroup->has(pEnt))
{
strGroupNames.Add(pGroup->name());
}
}
if (pIter!=NULL)
{
delete pIter;
}
int nCount=strGroupNames.GetCount();
if (nCount<1)
{
acutPrintf(_T("
该对象没有组!"));
return;
}
acutPrintf(_T("
该对象拥有 %d 个组"),nCount);
for (int i=0;i<nCount;i++)
{
acutPrintf(_T("
第 %d 个组名为 %s ."),i+1,strGroupNames.GetAt(i));
}