找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3245|回复: 12

[求助] 利用编辑反应器截获到命令后如何取消这个命令?

[复制链接]

已领礼包: 4个

财富等级: 恭喜发财

发表于 2016-11-10 15:57:22 | 显示全部楼层 |阅读模式

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

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

×
比如:我在 objectarx 中使用编辑反应器的 commandWillStart(const ACHAR * cmdStr) 捕获了“SAVEAS”命令,怎么把这个另存为命令取消掉?就是不执行这个命令。

尝试使用:acedPostCommand(_T("CANCELCMD")); 但是没有效果,在AutoCAD命令行里会显示取消,但是另存为指令照样执行。

请各位朋友多多指点,先在此谢过~

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

已领礼包: 112个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-11-11 20:51:08 | 显示全部楼层
你要阻止一个内部的ACAD命令执行,需要在AcApDocManagerReactor::documentLockModeChanged()期间,用veto()方法,除了终止,你甚至还可以创建一个你自己的SAVEAS等等。

AcApDocManagerReactor::veto Function
Acad::ErrorStatus
veto();
This function can be called during a documentLockModeChanged() callback if it is a callback for a lock request. The result will be that the lock request will be vetoed, which normally means that the command will be cancelled before it can start. When this function is called, documentLockModeChangeVetoed() will be sent.
If this is called during any other callback, or during an unlock request, it returns eNotApplicable.
It is only active during documentLockModeChanged() in case the receiver of the call needs to make any changes in the document before deciding whether to veto or not. By waiting until the changed callback, the document will be currently locked when the ability to veto is given. This is necessary because it is not possible to change the document抯 lock status from within any of these callbacks.

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2016-11-16 10:26:21 | 显示全部楼层

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-11-16 11:10:39 | 显示全部楼层

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2016-11-16 12:34:43 | 显示全部楼层

好,我在别的机子上测试已经可以正常运行了。但是我的电脑上出现了这个问题:
http://bbs.xdcad.net/forum.php?m ... p;page=1#pid3608101
十分头疼,重装vs和objectarx也没有用。请问你对这个了解吗?谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2016-11-16 12:45:33 | 显示全部楼层

Waiting for Visual Studio... ”问题莫名其妙的又好了。。。
下面放上代码,实现很简单:

新建文件反应器类,Stop.h和Stop.cpp,添加 documentLockModeChanged() 方法。方法实现如下:
  1. void Stop::documentLockModeChanged(AcApDocument * param2, AcAp::DocLockMode myPreviousMode, AcAp::DocLockMode myCurrentMode, AcAp::DocLockMode currentMode, const ACHAR * pGlobalCmdName)
  2. {
  3.   if (_tcscmp(pGlobalCmdName,_T("QSAVE")) == 0 || _tcscmp(pGlobalCmdName,_T("SAVEAS"))==0)
  4.   {
  5.     if(...)//判断是否需要取消保存或者另存为命令
  6.     {
  7.         acutPrintf(_T("\n禁止保存或另存为操作!\n"));
  8.         Acad::ErrorStatus es = veto();
  9.     }
  10.   }
  11.   AcApDocManagerReactor::documentLockModeChanged (param2, myPreviousMode, myCurrentMode, currentMode, pGlobalCmdName) ;
  12. }


然后在acrxEntryPoint.cpp 中注册反应器。
  1. #include "Stop.h"
  2. Stop* pStop = NULL;

  3. virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  4.     // TODO: Load dependencies here

  5.     // You *must* call On_kInitAppMsg here
  6.     AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  7.    
  8.     // TODO: Add your initialization code here
  9.     if (pStop == NULL)
  10.     {
  11.       pStop = new Stop();
  12.     }

  13.     return (retCode) ;
  14.   }

  15.   virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  16.     // TODO: Add your code here
  17.     if (pStop!= NULL)
  18.     {
  19.       delete pStop;
  20.       pStop = NULL;
  21.     }

  22.     // You *must* call On_kUnloadAppMsg here
  23.     AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

  24.     // TODO: Unload dependencies here

  25.     return (retCode) ;
  26.   }


至此即可实现在制定判断条件下取消保存和另存为命令。当然需要注意的是,在关闭AutoCAD的时候,会提示保存,那个保存貌似不在这里执行,需要在编辑反应器中取消关闭提示保存操作。

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 有始有终奖!

查看全部评分

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-11-16 13:00:44 | 显示全部楼层
ARX是真强大,LISP能这样就好了,楼主,你的代码起作用后,如果用户要保存图形,会有什么提示呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2016-11-17 09:07:52 | 显示全部楼层

这段代码中,判断如果可以让用用户保存,就没有提示,和系统的保存一样;如果不让用户保存,会提示:禁止保存或另存为操作!当然这个自己在代码中定义就可以了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-11-17 09:24:42 | 显示全部楼层

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

使用道具 举报

已领礼包: 305个

财富等级: 日进斗金

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 11:56 , Processed in 0.378058 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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