nkmjg 发表于 2024-8-2 07:17:37

ObjectARX 判断实体是否是在位编辑块对象简单例子

判断使用 acdbIsInLongTransaction 应该就可以,该函数接口 objectarx2008 新增。低版本arx可以参考后面函数例子实现。ads_name ent;
    ads_point pt;
    if(RTNORM != acedEntSel(_T("\n选择对象: "),ent,pt)){
      return;
    }
    AcDbObjectIdobjId;
    acdbGetObjectId(objId,ent);
    //直接判断
    //if(acdbIsInLongTransaction(objId))
    //判断并移除工作集
    if(isWorksetAndRemove(objId))
    {
      acutPrintf(_T("\n在长事务中"));
    }
    else
    {
      acutPrintf(_T("\n不在长事务中"));
    }

判断并移除对象函数,通过currentLongTransactionFor,可以实现获取长事务对象id,可以处理对象增加到工作集,移除等操作。
简单示例

//从工作集中移除
static bool isWorksetAndRemove(AcDbObjectId objId){
    AcDbObjectId longtransId = acapLongTransactionManagerPtr()->currentLongTransactionFor(curDoc());
    if (AcDbObjectId::kNull != longtransId)
    {
      AcDbObjectPointer<AcDbLongTransaction> pLongTrans(longtransId,AcDb::kForRead);
      if(Acad::eOk != pLongTrans.openStatus()) return false;
      //判断是否在工作集
      if(pLongTrans->workSetHas(objId))
      {
      //升级打开
      pLongTrans->upgradeOpen();
      if(pLongTrans->isWriteEnabled())
      {
          //移除工作集
          pLongTrans->removeFromWorkSet(objId);
      }
      return true;
      }      
    }
    return false;
}
页: [1]
查看完整版本: ObjectARX 判断实体是否是在位编辑块对象简单例子