找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2354|回复: 7

[求助] AcEdSSGetFilter这个怎么用的啊

[复制链接]

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-11-24 09:59:48 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 1121443108qaz 于 2018-11-24 10:02 编辑

我用向导派生AcEdSSGetFilter类后,想用下述代码看看实时我选中有多少个圆,可是我每次选择集有变更,会弹出两次提示,难道一次选择变更会有两次endssget?这个问题出在哪里了啊,我之前测ssgetAddFilter()也是这样。
  1. void fjfSSgetTestUtil::endSSGet(Acad::PromptStatus returnStatus, int ssgetFlags, AcEdSelectionSetService & service, const AcDbObjectIdArray& selectionSet)
  2. {
  3. acutPrintf(L"\n当前选择集中有%d个对象", selectionSet.length());
  4. int j = 0;
  5. AcDbObjectId entId;
  6. AcDbCircle* pCir = NULL;
  7. for (int k=0;k<selectionSet.length();k++)
  8. {
  9.   entId = selectionSet.at(k);
  10.   if (acdbOpenObject(pCir,entId)==Acad::eOk)
  11.   {
  12.    j++;
  13.    pCir->close();
  14.   }
  15. }
  16. if (j>0)
  17. {
  18.   acutPrintf(L"\n有%d个圆", j);
  19. }
  20. }
捕获.PNG
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2018-11-24 10:49:33 | 显示全部楼层
我测试也确实是2次,包括按esc也会触发一次。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2018-11-24 11:44:06 | 显示全部楼层
本帖最后由 Highflybird 于 2018-11-24 11:55 编辑

Creation or modification of the PICKFIRST set normally triggers an AcEdSSGetFilter::ssgetAddFilter() or AcEdSSGetFilter::ssgetRemoveFilter() notification.
It does not typically trigger an AcEdSSGetFilter::endSSGet()notification, except in the following circumstances:
  • If the user cancels the creation of a PICKFIRST set by pressing ESC, an AcEdSSGetFilter::endSSGet() notification is sent with a PromptStatus of eCancel.
  • If an application calls the acedSSGet() or acedSSGetFirst() global function without starting a command or a LISP expression, an AcEdSSGetFilter::endSSGet() notification is sent with a PromptStatus of eNormal right before the AcEdSSGetFilter::ssgetAddFilter() notification is sent.


就是说,一般情况下不会触发这个回调函数,但有下面两种情况会触发:
1、用户按下ESC取消了PICKFIRST创建,回调会返回一个eCancel. 可见按ESC会触发。
2、如果程序采用非命令形式或者LISP表达式来调用acedSSGet 或者acedSSGetFirst函数,此回调函数就在ssgetAddFilter回调送达前送达一个eNormal提示状态。

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

使用道具 举报

已领礼包: 6434个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

 楼主| 发表于 2018-11-27 09:32:34 来自手机 | 显示全部楼层
Highflybird 发表于 2018-11-24 11:44
Creation or modification of the PICKFIRST set normally triggers an AcEdSSGetFilter::ssge ...

我查看了触发的两次promptstatus都是enormal,ssgetflags都是kpickfirstset,按你的意思是我以非命令形式调用了ssget,我想不通我哪里调用了ssget,后面我把pickfirst设置为0也还是调用了两次,我只是选择了一下并没有按任何命令啊。照这样看来我想让程序只调用一次是不是不可能的。
来自: 微社区

点评

抓到耗子就是好猫,你可以让代码完成你的任务就行了  详情 回复 发表于 2018-11-27 14:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2018-11-27 14:37:16 | 显示全部楼层
1121443108qaz 发表于 2018-11-27 09:32
我查看了触发的两次promptstatus都是enormal,ssgetflags都是kpickfirstset,按你的意思是我以非命令形式 ...

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

使用道具 举报

发表于 2020-7-27 23:01:03 | 显示全部楼层
本帖最后由 bubeilaoren 于 2020-7-28 11:28 编辑

遇到相同问题,提供一种个人思路,欢迎指正交流:可以定义一个选择集变量,用于每次选择后储存为旧选择集,下次选择时判断最新选择集与旧选择集个数,大于时进行处理;另外,用户按下ESC时,新选择集个数为变为0,判断并清空旧选择集。
void xxx::endSSGet(Acad::PromptStatus returnStatus, int ssgetFlags, AcEdSelectionSetService &service, const AcDbObjectIdArray& selectionSet)
{
        if (selectionSet.length()==0) //没有选择实体,包括esc
        {
                m_ssOld.removeAll();
        }
        if (returnStatus== Acad::eNormal && selectionSet.length()>m_ssOld.length())
        {
                m_ssOld.removeAll();
                m_ssOld.append(selectionSet);
                acutPrintf(_T("\njzh %d found"),selectionSet.length());        
        }        
}

测试结果:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 05:16 , Processed in 0.219015 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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