SSGET函数的使用第1页共12页一.功能提示用户选择对象(图元),并返回一个选择集。二.格式(ssget[mode][pt1[pt2]][pt_list][filter_list])(SSGET[选取模式][选取点][选取点][点串行][过滤条件])三.说明(一).函数调用中各变元的说明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)(ssgetP)生成一个选择集,该选择集由最近所选择的那些对象所组成。(3)(ssgetL)生成一个选择集,该选择集由最后被增加到图形数据库中的那个可见对象组成。(4)(ssgetI)生成一个选择集,该选择集由PICKFIRST生效时所选择的那些对象组成。(5)(ssget'(2,2))生成一个选择集,该选择由通过点(2,2)的那些对象组成。(6)(ssgetw(00)'(55))生成一个选择集,该选择集包含了由(0,0)到(5,5)定义的窗口中的所有对象。(7)(ssgetc'(00)'(11)生成一个选择集,该选择集中既包含了由(0,0)到(1,1)定义的窗口中的所有对象,也包含了与这个窗口相交的那些对象。SSGET函数的使用第2页共12页(8)(ssgetX)生成一个选择集,该选择集中包含了现行图形数据库中的所有对象。(9)(ssgetXfilter_list)扫描图形数据库,将与过滤表filter_list匹配的那些对象组成一个选择集并返回。(10)(ssgetfilter_list)让用户用一般的对象选择方式选择对象,将用户所选择的所用对象与过滤器表filter_list进行比较,只有与过滤器表相匹配的那些对象才放入到选择集中,最后返回所生成的这个选择集。(11)(ssgetPfilter_list)生成一个选择集,入选该选择集的条件是,它既是最近所选择的那些对象,且又满足过滤器的要求。(12)(ssgetWPpt_list)生成一个选择集,该选择集中既包含了由点表pt_list定义的多边形中的所有对象。(13)(ssgetcppt_list)生成一个选择集,该选择集中既包含了由点表pt_list定义的多边形中的所有对象,也包含了与该多边形相交的那些对象。(14)(ssgetFpt_list)生成一个选择集,该选择集中包含了与点表pt_list定义的多边形篱笆相交的全部对象。(15)(ssgetwppt_listfilter_list)生成一个选择集,该选择集中的所有对象既必须处于由点表pt_list定义的多边形内,也必须满足过滤器表filter_list中的条件。只有当一带变元调用ssget函数时,被选取的对象才会高亮显示。选择集会消耗AutoCAD临时文件存储区,AutoLISP不允许同时打开的选择集多于128个。如果选择集的数目达到了这个极限,AutoCAD会拒绝再生成选择集,再调用更多次ssget函数也只能是返回nil。为了关闭不再需要的选择集。可以将它设置为nil。对于任何以Last响应Selectobject:提示有效的地方,都可以向AutoCAD传递一个选择集变量。它将选择所传递的选择集中的所有对象。(二).关于选择集中过滤器的进一步讨论选择集过滤器表可以由任何方式所使用。您可以获得一个包含在给定图层上(或一个给定颜色、给定类型的全部对象的选择集。下面的实例中,返回一个选择集,该选择集中仅包含在PICKFIRST方式有效时所选择的那些对象中,颜色为兰色的直线段。(ssgetI'((0.LINE)(62.5)))SSGET函数的使用第3页共12页使用过滤器表,您也能选择属于一个特定申请的包含在扩展数据中的全部对象。要达到这一目的,需要按如下方式-3组码:(ssgetP'((0.CIRCLE)(-3(APPNAME))))上述代码选择了申请APPNAME中所包含的扩展数据(1)过滤器表中的关系测试除非特别指定,否则对过滤器表filter_list中的每一项都隐含了一个“相等”测试。对于数值组(整数、实数、点以及矢量),通过包含了一个专用的-4组来指定一个关系运算符,您可以指定其它的关系。一个-4组的值是一个字符串,它用于指出要作用于过滤器表中随后的测试运算符。(ssgetX'(((0.CIRCLE)(-4.=)(40.2.0))))上述表达式,将选择半径大于或等于2.0的所有圆来构成一个选择集。下表中列出了过滤器表中所有可以使用的运算符。选择集过滤器表中所用的关系运算符____________________________________________*任何情况(总是为真)____________________________________________=等于____________________________________________!=不等于____________________________________________/=不等于____________________________________________不等于____________________________________________小于____________________________________________=小于或等于____________________________________________大于____________________________________________=大于或等于____________________________________________SSGET函数的使用第4页共12页&按位于与(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函数调用就会失败。用在选择集过滤器表中的分组运算符_____________________________________________________起始运算符包含的内容结束运算符_____________________________________________________AND一个或多个操作数ADN_____________________________________________________OR一个或多个操作数OR_____________________________________________________XOR两个操作数XOR_____________________________________________________NOT一个操作数NOT_____________________________________________________SSGET函数的使用第5页共12页由分组运算符所使用的一个操作数是一个或多个图元域。一个关系运算符后跟一个或多个图元域,或一个由这些运算符所生成的嵌套的表达式。下面是一个在过滤器表中使用了分组运算符的实例:(setqX'((-4.OR.)(-4.AND)(0.CIRCLE)(40.1.0)(-4.AND)(-4.AND)(0.LINE)(8.ABC)(-4.AND)(-4.OR)))这就选择了所有关径为1.0的圆,外加在图层ABC上的所有直线。由于分组运算符对小写是不敏感的,所以您可以使用与大写等价的小写形式,即:and、and、or、or、xor、xor、not以及not,......。四.实例下面的程序实例用于改变现行图形中所有文本的尽无动于寸。(defunC:chtext2(atsnin不设定选取模式及过滤条件,以一般方式选取对象,并将选集储存在变量中(SETQGOP(SSGET))不设定选取模式,但只将选取的文字对象加入选集,并将选集储存在变量中(SETQGOP(SSGET'((0.TEXT))))从上个选集中,选取所有圆对象形成新选集,并将选集储存在变量中(SETQGOP(SSGETP'((0.CIRCLE))))用窗选模式,选取在指定范围内且图层为DIM2的所有对象(SETQGOP(SSGETW'(00)'(10001000)'((8.DIM2))))选取图面内所有在图层0的线对象(SETQGOP(SSGETX'((-4.AND)(0.LINE)(8.0)(-4.AND))))选取图面内所有半径大于0.75的圆对象(SETQGOP(SSGETX'((0.CIRCLE)(-4.)(40.0.75))))选取图面内所有包含有S字母的文字对象(SETQGOP(SSGETX'((0.TEXT)(1.*S*))))以多边形框选模式,并提供点串行参数作为框选时的各选取点;但不提供过滤条件(SETQGOP(SSGETCP'((00)(06)(66)(60))))SSGET函数的使用第6页共12页具体方法如下:(setqss(ssget:S'((0.LINE))));只选取一次直线(省约回车)(setqss(ssgetX'((0.LINE))));自动选取直线,包含冻结的直线(setqss(ssgetA'((0.LINE)