天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 56|回复: 0

ObjectArx-C++实体间的联动删除

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
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();
}
}

 

 

 

 

ObjectArx-C++实体间的联动删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 09:26 , Processed in 0.173236 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表