|
acedSSGet深度解析
arx二次开发
int acedSSGet(
const ACHAR * str,
const void * pt1,
const void * pt2,
const struct resbuf * filter,
ads_name ss
);
参数详解:
const ACHAR * str: 选择模式(例如框选窗选)
const void * pt1 :两个point和某些模式是相关联的,例如多边形框模式,还有可能是两个字符串指针,用来代替acedSSget的提示,例如:$模式
const void * pt2 :同上
const struct resbuf * filter :根据具体需求过滤掉某些并不需要的实体,例如我只想选择圆并且图层在CIRCLE图层上
ads_name ss:存储了选择的结果
注意事项:
1.得到的选择集再用完之后,一定要记得释放ads_ssfree(ss) ;
2.选择模式一共有三种分别是 Selection Method Mode Options . Colon Mode Options. Keyword Filter Mode Options
再绝大多数情况下, selection method mode 不能够和包含colon mode或者keyword filter mode options的模式一起用,
唯一准许的情况是":U" and ":V"这两种情况 。Colon mode options 能够和keyword filter mode 能够混用,并且可以使用多种合理组合,例如 ( "-#-W:$:?:K:N").
3.对于 "CP" and "WP" ,会自动闭合你提供的点链表,你没有必要提供一个闭合的点,言外之意你没有必要使第一个点等于最后一个点
4.如果你希望你所书写的代码能够在任意一个版本都运行良好,请使用 ("_") 作为模式字符串的前缀
实例解析:
需求,我希望获得一个长度,点选一个直线实体获得长度,或者直接在命令行中输入长度
分析:
大家首先想到的就是acedEntSel,但是这个函数没有办法获得一个数字字符串(我是没发现怎么可以)
用acedSSGet就比较容易实现这样的需求,前提是你仔细阅读文档,并且多加实验
实现:
typedef resbuf* (*ssgetcallback)(const TCHAR*) ;
resbuf* keywordCallback(const TCHAR* str);
struct resbuf* otherCallback(const TCHAR* str) ;
void TestSSGet()
{
resbuf* filter = ads_buildlist( RTDXF0 , _T("LINE") , 0 ) ;
//用于替换掉默认的字符串(并且加了关键字)
//注意在这里关键字并没有起任何作用,但是你可以让它发挥作用如果你需要的话
TCHAR* promtStr[2] ;
promtStr[0] = _T("[new(N)]") ; promtStr[1] = _T("[remove(R)]") ;
//下面设置关键字回调和非关键回调
//首先保存一下系统默认回调
ssgetcallback keyworldCallBackOld = NULL ;
ssgetcallback otherkeyworldCallBackOld = NULL ;
acedSSGetKwordCallbackPtr(& keyworldCallBackOld ) ;
acedSSGetOtherCallbackPtr(&otherkeyworldCallBackOld) ;
//设置回调
acedSSSetKwordCallbackPtr( keywordCallback ) ; acedSSSetOtherCallbackPtr( otherCallback ) ;
//单选并且只能选取一次用关键字:S(想使用关键字:S必须加"+.")
//替换掉默认提示必须加关键字:$
//使用关键字必须加:K
ads_name name ;
int iResult = acedSSGet( _T("_+.:S:$:K:?") , promtStr , _T("N R _ N R") , filter , name );
//恢复回调函数
acedSSSetKwordCallbackPtr( keyworldCallBackOld ) ; acedSSSetOtherCallbackPtr( otherkeyworldCallBackOld ) ;
}
resbuf* keywordCallback(const TCHAR* str) { acutPrintf(_T("\n你输入了一个关键字"), str); return NULL; } struct resbuf* otherCallback(const TCHAR* str) { acutPrintf(_T("\n在这里判断它是不是一个数字字符串,如果是转化成数字供你使用!!!!!!"), str);
//注意 根据我的项目需求如果符合条件了,就应该退出,那么在这里如果判断输入数据合法,就应该手动发送一个
//取消,这个根据个人需求写代码 return NULL; }
写的好辛苦,我这有部分代码粘贴的有部分手写的,因为我项目中的代码比这要复杂
强烈推荐看一下arx提供的demo ArxDebug项目,里面有一个命令ArxDbgTestSelSet大家搜一下,比我这个强大,看一下更容易上手
有什么问题欢迎交流
补充一个条件和判断的代码吧
return AcRx::kRetOK ;
ads_name name;
resbuf* filter = ads_buildlist( -4 , _T("
-4 , _T("") ,
-4 , _T("=") , 40 ,10000.0 , _T("AND>") ,
RTDXF0 , _T("DIMENSION") ,
-4 , _T("OR>") ,
0 ) ;
acedSSGet( NULL , NULL , NULL , filter , name ) ;
选择以下三种类型实体
1.在图层“0”上的直线
2.半径大于10000的圆 (即使是整数,也必须写为10000.0)
3.任意标注实体 |
|