找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1292|回复: 6

[每日一码] 在vlr-pickfirstmodified反应器回调函数里面调用引起ACAD崩溃的解决方案

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-3 23:01:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Calling (entget) in my :vlr-pickfirstmodified callback causes AutoCAD to crash.

To reproduce this, load the Lisp code below, and then select a PViewport in a layout:

  1. (vl-load-com)
  2. (vl-load-reactors)
  3. (vlr-miscellaneous-reactor nil (list (cons ':vlr-pickfirstmodified 'crash)))

  4. (defun Crash (p1 p2 / sel ii)
  5.    (setq sel (cadr (ssgetfirst))
  6.            ii  0
  7.    )
  8.    (repeat (if sel (sslength sel) 0)
  9.       (setq ent (ssname sel ii)
  10.               ii  (1+ ii)
  11.       )
  12.       (entget ent)
  13.    )
  14. )


解决方案:

反应器在SDI=1下工作正常,然而,在SDI=0的时候,会出现问题。通常,在编辑器反应器(editor reactor)中,实体不能打开进行写操作 (:vlr-miscellaneous-reactor is an editor reactor),是因为文档没有锁定。在SDI=0时候,文档不会自动的锁定。通过VLISP,没有办法进行锁定文档操作,但是可以通过ARX是可行的,因此,我们可以通过在ARX,写一个文档锁定的函数给LISP调用,来解决这个问题。

下面的ARX代码,我们通过acedDefun定义两个函数(lockDoc)和(unlockDoc)

[C++] 纯文本查看 复制代码
// ----- ads_lockdoc symbol (do not rename)
static int ads_lockdoc(void)
{
    // TODO: add your code here
    acDocManager->lockDocument(acDocManager->curDocument()) ;
    // TODO: Replace the following line by your returned value if any
    acedRetVoid () ;
    return (RSRSLT) ;
}

// ----- ads_unlockdoc symbol (do not rename)
static int ads_unlockdoc(void)
{
    // TODO: add your code here
    acDocManager->unlockDocument(acDocManager->curDocument());
    // TODO: Replace the following line by your returned value if any
    acedRetVoid () ;
    return (RSRSLT) ;
}


下面是LISP在回调函数里面使用这两个函数的代码。

[Plain Text] 纯文本查看 复制代码
(vl-load-com)
(vl-load-reactors)

;;; Check to see if the ARX program is loaded
(defun isAppLoaded (app)
   (if (not (member app (arx)))
      (setq bAppLoaded :vlax-false)
      (setq bAppLoaded :vlax-true)
   )
   bAppLoaded
)
;;; Load the ARX program if necessary
(if (= (isAppLoaded "asdkLockDoc.arx") :vlax-false)
   (arxload (findfile "asdkLockDoc.arx"))
)
(vlr-miscellaneous-reactor nil (list (cons ':vlr-pickfirstmodified 'crash)))

(defun Crash (p1 p2 / sel ii)
   (lockdoc) ; lock the document
   (setq sel (cadr (ssgetfirst))
           ii  0
   )
   (repeat (if sel (sslength sel) 0)
      (setq ent (ssname sel ii)
              ii  (1+ ii)
      )
      (entget ent)
   )
   (unlockdoc) ; unlock the document
)


上面是ARX写函数的解决方案。


XDRX API提供了文档锁定和解锁的函数


xdrx_document_lock
xdrx_document_unlock


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6468个

财富等级: 富甲天下

发表于 2017-3-4 01:49:26 | 显示全部楼层
啥也不说了,感谢楼主分享哇!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6845个

财富等级: 富甲天下

发表于 2017-3-4 10:51:41 | 显示全部楼层
谢谢提供,试用一下!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6845个

财富等级: 富甲天下

发表于 2017-3-4 10:53:00 | 显示全部楼层
谢谢提供,试用一下!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6845个

财富等级: 富甲天下

发表于 2017-3-5 00:15:14 | 显示全部楼层
谢谢版主的分享,用用了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2017-3-5 19:15:18 | 显示全部楼层

啥也不说了,感谢楼主分享哇!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 10:52 , Processed in 0.164392 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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