AuotLisp及vLisp函数全集
212. ssget
一. 功能
提示用户选择对象(图元),并返回一个选择集。
二. 格式
(ssget[mode] [pt1 [pt2]]
[pt_list] [filter_list])
三. 说明
(一).函数调用中各变元的说明
mode变元是指定对象(图元)选择方法的一个字符串。有效的选择方法是:'W'、 'WP'、 'C'、 'CP'、
'L'、 'P'、 'I'以及'F',它们分别对应于Window、WPolygon、Crossing、CPolygon、Last、Previous、Implied、Fence选择方法。其它的可选的mode值是'X',它用于选择整个数据库。pt1和pt2指定与选择有关的点。调用ssget时提供了一个点而不提供mode变元,等价于拾取单个点来做对象选择。ssget函数忽略ObjectSnap(对象捕捉)的现行设置方式,除非您在调用本函数时专门指定了它。filter_list变元是指定对象特征的一个关联表。与filter_list匹配的那些对象被加入到选择集中。如果调用ssget函数时,省略所有变元,则ssget函数给出'Selectobject'提示,允许用户交互地构造选择集。
选择集中可以包含图纸空间和模型空间两个空间中的对象,但该选择集由某一种操作所使用时,在现行空间中无效的那些对象会被过滤掉。由ssget函数返回的选择集中仅包含主图元(不包含属性和多义线的顶点图元)。
下面给出一些使用实例。
(1)(ssget)
让用户用普通的对象选择方法选择对象,构成选择集。
(2)(ssget 'P')
生成一个选择集,该选择集由最近所选择的那些对象所组成。
(3)(ssget 'L')
生成一个选择集,该选择集由最后被增加到图形数据库中的那个可见对象组成。
(4)(ssget 'I')
生成一个选择集,该选择集由PICKFIRST生效时所选择的那些对象组成。
(5)(ssget '(2,2))
生成一个选择集,该选择由通过点(2,2)的那些对象组成。
(6)(ssget 'w' (0
0) '(5 5))
生成一个选择集,该选择集包含了由(0,0)到(5,5)定义的窗口中的所有对象。
(7)(ssget 'c' '(0
0)'(1 1)
生成一个选择集,该选择集中既包含了由(0,0)到(1,1)定义的窗口中的所有对象,也包含了与这个窗口相交的那些对象。
(8)(ssget 'X')
生成一个选择集,该选择集中包含了现行图形数据库中的所有对象。
(9)(ssget 'X' filter_list)
扫描图形数据库,将与过滤表filter_list匹配的那些对象组成一个选择集并返回。
(10)(ssgetfilter_list)
让用户用一般的对象选择方式选择对象,将用户所选择的所用对象与过滤器表filter_list进行比较,只有与过滤器表相匹配的那些对象才放入到选择集中,最后返回所生成的这个选择集。
(11)(ssget 'P' filter_list)
生成一个选择集,入选该选择集的条件是,它既是最近所选择的那些对象,且又满足过滤器的要求。
(12)(ssget 'WP' pt_list)
生成一个选择集,该选择集中既包含了由点表pt_list定义的多边形中的所有对象。
(13)(ssget 'cp' pt_list)
生成一个选择集,该选择集中既包含了由点表pt_list定义的多边形中的所有对象,也包含了与该多边形相交的那些对象。
(14)(ssget 'F' pt_list)
生成一个选择集,该选择集中包含了与点表pt_list定义的多边形篱笆相交的全部对象。
(15)(ssget 'wp' pt_listfilter_list)
生成一个选择集,该选择集中的所有对象既必须处于由点表pt_list定义的多边形内,也必须满足过滤器表filter_list中的条件。
只有当一带变元调用ssget函数时,被选取的对象才会高亮显示。选择集会消耗AutoCAD临时文件存储区,AutoLISP不允许同时打开的选择集多于128个。如果选择集的数目达到了这个极限,AutoCAD会拒绝
再生成选择集,再调用更多次ssget函数也只能是返回nil。为了关闭不再需要的选择集。可以将它设置为nil。
对于任何以Last响应'Selectobject:'提示有效的地方,都可以向AutoCAD传递一个选择集变量。它将选择所传递的选择集中的所有对象。
(二).关于选择集中过滤器的进一步讨论
选择集过滤器表可以由任何方式所使用。您可以获得一个包含在给定图层上(或一个给定颜色、给定类型的全部对象的选择集。
下面的实例中,返回一个选择集,该选择集中仅包含在PICKFIRST方式有效时所选择的那些对象中,颜色为兰色的直线段。
(ssget'I' '((0. 'LINE')(62.5)))
使用过滤器表,您也能选择属于一个特定申请的包含在扩展数据中的全部对象。要达到这一目的,需要按如下方式
-3组码:
(ssget'P' '((0.'CIRCLE')(-3 ('APPNAME'))))
上述代码选择了申请'APPNAME'中所包含的扩展数据
(1)过滤器表中的关系测试
除非特别指定,否则对过滤器表filter_list中的每一项都隐含了一个“相等”测试。对于数值组(整数、实数、点以及矢量),
通过包含了一个专用的-4组来指定一个关系运算符,您可以指定其它的关系。一个-4组的值是一个字符串,它用于指出要作用于过滤器表中随后的测试运算符。
(ssget'X' '(((0.'CIRCLE')(-4.'>=')(40.2.0))))
上述表达式,将选择半径大于或等于2.0的所有圆来构成一个选择集。
下表中列出了过滤器表中所有可以使用的运算符。
选择集过滤器表中所用的关系运算符
____________________________________________
'*' 任何情况(总是为真)
____________________________________________
'=' 等于
____________________________________________
'!=' 不等于
____________________________________________
'/=' 不等于
____________________________________________
'<>' 不等于
____________________________________________
'
____________________________________________
'<=' 小于或等于
____________________________________________
'>' 大于
____________________________________________
'>=' 大于或等于
____________________________________________
'&' 按位于与(AND)(仅适用于组值为整型的组)
____________________________________________
'&=' 按位屏蔽相等(仅适用于组值为整型数的组)
____________________________________________
关系运算符的使用取决于用户要测试的组的类型:
. 除去按位运算符('&'和'&=')之外,所有关系运算符对组为整型数和实型数的组都是有效的。
. 按位运算符'&'和'&=',仅应用于组值为整型数的组才是有效的。如果((inter-group & filter)/=0)那么,按位'与'('&')才是真,也就是说,在屏蔽中的任何一引起位设置为1,在整型组值中那些对应位也为1时,按位'与'('&')的结果才为真。如果((integer-group & filter)=filter),按位屏蔽相等'&=',才是真,也就是说,在屏蔽中的所有位设置为1,在integer-group中也设置为1,按位屏蔽相等'&='才是真(在integer-group中的其它位可能也是置为1,但不对它作检测)。
. 对于表示点坐标的组,X,Y和Z测试可以组合成单个字符串,同时每个个运算符用逗号作分隔
(例如:'>,>,*')。如果一个运算符在字符串中被省略(例如:'=,<>'省略了Z测试),则假定它是'*'运算符。
. 方向矢量(210组)仅能用'*'、'='和'!
='运算符进行比较('! ='表示不等)。
.
组值为字符串的不能使用关系运算符进行测试,而要使用通配符进行比较。
(2)过滤器测试的逻辑分组
刚刚讨论过的关系运算符是二进制运算符。通过知生成使用分组运算符嵌套布尔表达式,您也可以对组进行测试。下表中列出了分组运算符。分组运算符同-4组指定,就象关系运算符那样。分组运算符是成对出现的,在过滤器表中它们必须匹配正确,否则,ssget函数调用就会失败。
用在选择集过滤器表中的分组运算符
_____________________________________________________
起始运算符 包含的内容
结束运算符
_____________________________________________________
'
一个或多个操作数 'ADN>'
_____________________________________________________
'
一个或多个操作数 'OR>'
_____________________________________________________
'
两个操作数 'XOR>'
_____________________________________________________
'
一个操作数 'NOT>'
_____________________________________________________
由分组运算符所使用的一个操作数是一个或多个图元域。一个关系运算符后跟一个或多个图元域,或一个由这些运算符所生成的嵌套的表达式。下面是一个在过滤器表中使用了分组运算符的实例:
(setq'X' '((-4. '
(-4.
'
(0.'CIRCLE')
(40.
1.0)
(-4.'AND>')
(-4.'
(0.'LINE')
(8.'ABC')
(-4.
'AND>')
(-4.
'OR>')
)
)
这就选择了所有关径为1.0的圆,外加在图层'ABC'上的所有直线。
由于分组运算符对小写是不敏感的,所以您可以使用与大写等价的小写形式,即:''、 ''、 ''、
'',......。
四. 实例
下面的程序实例用于改变现行图形中所有文本的尽无动于寸。
(defunC:chtext2 (atsnin