|
C++实现AutoCad自定义实体间的联动删除功能。
主要思路是:
自定义实体基类CthEntity继承ObjectArx里底层基类AcDbEntity。
重写自定义基类CthEntity的subErase()函数。
在subErase()函数里添加要联动删除的实体,一般以持久反应器实现联动。
代码示例如下:
删除实体触发Erase命令的subErase()函数
//zhaoanan subErase命令
Acad::ErrorStatus CthEntity::subErase(Adesk::Boolean erasing)
{
try
{
// 调试
if (id() != AcDbObjectId::kNull)
{
ACHAR s[30];
id().handle().getIntoAsciiBuffer(s);
wcscat_s(s, 30, _T(" subErase"));
CthLog::WriteLog(s);
}
//删除实体的公里标对象
this->removeDimension();
Acad::ErrorStatus es = AcDbEntity::subErase(erasing);
if (es != Acad::eOk)
return es;
}
catch (...)
{
return Acad::eOk;
}
return Acad::eOk;
}
删除实体的公里标对象,使用永久反应器实现联动功能
//删除实体的公里标对象
void CthEntity::removeDimension()
{
//激活支持撤销恢复,该函数主要为“退回”操作及“保存”的操作;如不加则会在上述操作中出现异常。
assertWriteEnabled() ;
/*- 1.获取到公里标反应器数组*/
const AcDbVoidPtrArray* rs = reactors();
if (rs != NULL)
{
/*- 2.根据公里标反应器数组,循环查找公里标依赖*/
acutPrintf(_T("rs->length()=%d\n"), rs->length());
for (int i = 0; i < rs->length(); i++)
{
void* p = rs->at(i);
if (!acdbIsPersistentReactor(p))
continue;
/*- 2.1根据公里标反应器,查找公里标依赖objecid*/
AcDbObjectId oi = acdbPersistentReactorObjectId(p);
acutPrintf(_T("CthDependency's AcDbObjectId=%p\n"), &oi);
CthDimension *pDimension =NULL;
CthDependency *pDedp =NULL;
//智能指针打开对象
//AcDbObjectPointer<AcDbObject> obj(oi,AcDb::kForRead);
/*- 2.1根据公里标依赖objecid,打开实体公里标依赖*/
Acad::ErrorStatus es = acdbOpenObject(pDedp, oi, AcDb::kForWrite, Adesk::kTrue);
if (es != Acad::eOk)
continue;
/*- 获取到公里标反应器*/
/*- 2.2根据公里标依赖,打开实体公里标对象*/
acutPrintf(_T("&pDedp=%p\n"), pDedp);
if(pDedp!=NULL)
{
AcDbObjectId id = pDedp->dependencyId();
AcDbEntity *ppEnt=NULL;
/*- 2.3打开实体公里标对象*/
if(Acad::eOk==acdbOpenAcDbEntity(ppEnt,id,AcDb::kForRead))
{
if(ppEnt->isKindOf(CthDimension::desc()))
{
pDimension = CthDimension::cast(ppEnt);
}
}
}
/*- 3删除公里标对象*/
pDimension->upgradeOpen();
pDimension->erase();
pDimension->downgradeOpen();
pDimension->close();
/*- 4关闭公里标依赖对象*/
pDedp->close();
/*- 5删除公里标对象依赖反应器*/
this->removePersistentReactor(oi);
}
/*- 5释放删除公里标对象依赖反应器的空字典*/
this->releaseExtensionDictionary();
}
} |
|