edata 发表于 2024-8-1 21:55:12

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

本帖最后由 edata 于 2024-8-1 22:22 编辑

判断使用 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;
}


你有种再说一遍 发表于 2024-8-1 22:08:19

本帖最后由 你有种再说一遍 于 2024-11-15 18:58 编辑

貌似.net acad08没有长事务API,可能要DllImport
原本是通过交集+命令事件上面拦截的...速度不慢,就是感觉怪怪的...

本文收录:
https://www.cnblogs.com/JJBox/p/11185185.html

tranque 发表于 2025-12-15 20:43:57

上个月让AI生成的:lol
;;; 判断当前是否在在位编辑(In-Place Edit)中的Autolisp代码
;;; 代码通过检查系统变量REFEDITNAME来判断状态
;;; 返回值:中文字符串,表示当前状态

;; 定义主函数:IS-IN-INPLACE-EDIT
;; 该函数没有参数,返回一个描述状态的中文字符串
(defun IS-IN-INPLACE-EDIT ()
;; 获取系统变量REFEDITNAME的值
(setq refeditName (getvar "REFEDITNAME"))

;; 检查refeditName是否为空字符串
;; 如果不为空,返回"在位编辑中";否则,返回"非在位编辑中"
(if (/= refeditName "")
      "在位编辑中"; 返回中文字符串,表示在在位编辑中
    "非在位编辑中"; 返回中文字符串,表示不在在位编辑中
)
)

;; 可选:定义一个命令版本,方便从AutoCAD命令行直接调用
;; 当用户在命令行输入"ININPLACEEDIT"时,会运行此命令并显示中文结果
(defun C:ININPLACEEDIT ()
(princ (IS-IN-INPLACE-EDIT)); 调用主函数并打印返回值
(princ); 添加一个空的princ调用,确保命令行整洁
)

;; 代码结束

你有种再说一遍 发表于 2025-12-15 23:48:57

本帖最后由 你有种再说一遍 于 2025-12-15 23:52 编辑

tranque 发表于 2025-12-15 20:43
上个月让AI生成的
这个只是判断是否在编辑器状态,不能判断ids

tranque 发表于 2025-12-16 19:34:02

你有种再说一遍 发表于 2025-12-15 23:48
这个只是判断是否在编辑器状态,不能判断ids

是的,只能让AI先把中这个步骤做出来了,然后后面的功能再新开一个对话和AI说了
页: [1]
查看完整版本: ObjectARX 判断实体是否是在位编辑块对象简单例子