找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2054|回复: 6

[求助] 在 documentLockModeChanged 方法中无法使用 acedSSGet 函数

[复制链接]

已领礼包: 4个

财富等级: 恭喜发财

发表于 2017-3-9 12:11:24 | 显示全部楼层 |阅读模式

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

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

×
我在 AcApDocManagerReactor 反应器中添加了 documentLockModeChanged 方法,本意是在打印前做一些判断。
整个过程在objectARX2010上都可以顺利运行,不过现在换了objectARX2016版本,运行到 acedSSGet 函数的时候就出问题了,AutoCAD中会提示:文档正在执行命令,如下图:
正在执行命令.png
我把 acedSSGet 函数放到 acrxEntryPoint.cpp 的命令里,在cad中输入命令,这个函数可以正常运行。代码如下:
  1. // ACED_ARXCOMMAND_ENTRY_AUTO(CClient_2016App, LiYuClient_2016, _test, test, ACRX_CMD_MODAL,NULL)
  2.         static void LiYuClient_2016_test () {
  3.                 ads_point poiOne = {132505.0,        148743.0,        0.0};
  4.                 ads_point poiTwo = {132569.426,        148743.0,        0.0};
  5.                 ads_point poiThr = {132569.426,        149007.0,        0.0};
  6.                 ads_point poiFou = {132505.0,        149007.0,        0.0};

  7.                 ads_name ssname;
  8.                 struct resbuf *pointlist;
  9.                 pointlist=acutBuildList(RTPOINT,poiOne, RTPOINT,poiTwo, RTPOINT,poiThr, RTPOINT,poiFou,0);
  10.                 acedSSGet(_T("WP"),pointlist,NULL,NULL,ssname);

  11.                 long lngCountInArea = 0;
  12.                 acedSSLength(ssname,&lngCountInArea);
  13.                 acedSSFree(ssname);
  14.                 acutPrintf(_T("检测到区域内有:%d 个实体。\n"),lngCountInArea);
  15.         }

请问这个是怎么回事?该如何解决?谢谢。
下面是我 documentLockModeChanged 的大体代码:
  1. void DocumentReactor::documentLockModeChanged(AcApDocument * param2, AcAp::DocLockMode myPreviousMode, AcAp::DocLockMode myCurrentMode, AcAp::DocLockMode currentMode, const ACHAR * pGlobalCmdName)
  2. {
  3.         Acad::ErrorStatus es;
  4.         if (wcscmp(pGlobalCmdName,_T("PLOT")) == 0 || wcscmp(pGlobalCmdName,_T("_PLOT")) == 0)
  5.         {
  6.                 ads_point poiOne = {132505.0,        148743.0,        0.0};
  7.                 ads_point poiTwo = {132569.426,        148743.0,        0.0};
  8.                 ads_point poiThr = {132569.426,        149007.0,        0.0};
  9.                 ads_point poiFou = {132505.0,        149007.0,        0.0};

  10.                 ads_name ssname;
  11.                 struct resbuf *pointlist;
  12.                 pointlist=acutBuildList(RTPOINT,poiOne, RTPOINT,poiTwo, RTPOINT,poiThr, RTPOINT,poiFou,0);
  13.                 acedSSGet(_T("WP"),pointlist,NULL,NULL,ssname);

  14.                 long lngCountInArea = 0;
  15.                 acedSSLength(ssname,&lngCountInArea);
  16.                 acedSSFree(ssname);
  17.                 acutPrintf(_T("检测到区域内有:%d 个实体。\n"),lngCountInArea);       
  18.         }
  19. }


是不是objectarx2016的 documentLockModeChanged 中不允许使用acedSSGet函数了?那我该如何实现在打印前判断一个区域内的实体?
谢谢!
               


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

已领礼包: 20个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2017-3-9 15:31:37 | 显示全部楼层

不行呢,就连执行:acDocManager->lockDocument(acDocManager->curDocument()); 这个语句,都会在AutoCAD2016中显示:文档正在执行命令。 重装.png
请问有什么解决办法吗?头都大了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-3-9 15:54:08 | 显示全部楼层
本帖最后由 marting 于 2017-3-9 15:57 编辑
你读下系统变量cmdactive 和 cmdname看看是哪个命令在执行。
你换下 commandWillStart() 里面判断下_plot命令,lockDocumentChanged这个太早发生了。

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2017-3-9 16:07:38 | 显示全部楼层

我需要在 documentLockModeChanged  里控制是否取消打印命令。commandWillStart里无法取消打印命令。
然后我发现,在commandWillStart里,是可以正常使用acedSSGet函数的。但为什么 documentLockModeChanged 里就执行不了呢?
谢谢你哈。请问可以加下QQ吗?这个问题我实在不知道从哪里下手了,再次感谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-3-9 16:52:13 | 显示全部楼层

QQ都不怎么用了,有空就上论坛看看,有问题就贴论坛来吧

你试试更早些的 documentLockModeWillChange ,在这个里面看什么表现?
上面的提示你正在执行命令,你读系统变量cmdname了吗,看看是什么命令在执行。

在不行的话,你就用
extern "C" int ads_queueexpr( LPCACRXSTR );

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 20:30 , Processed in 0.204193 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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