画图狗的救赎之路——AutoLisp语言学习之路(十一):选择集ssget函数的使用

上期讲了如何自定义函数和命令,这次来讲一个最常用的功能,那就是选择图形。

选择图形的函数是”ssget”,来讲下怎么用。

基本语法

(ssget [filter] [point1 point2] ["X"] [prev])
  • filter:这是一个可选参数,用于指定选择对象的条件。它通常是一个列表,包含要匹配的属性和对应的值。例如,你可以指定只选择特定图层上的对象。
  • point1 point2:这两个可选参数定义了一个选择窗口或交叉窗口。point1 是窗口的一个角点,point2 是对角点。根据这两个点的相对位置,你可以选择一个矩形区域内的对象(选择窗口)或两个点之间的对象(交叉窗口)。
  • "X":这是一个字符串参数,当提供时,表示使用交叉选择模式(即选择窗口的对角线方向决定了选择模式)。如果不提供,则默认为窗口选择模式。
  • prev:这是一个可选参数,用于指定是否选择上一次的选择集。如果为 T(真),则 ssget 返回上一次的选择集;如果为 nil(或未提供),则进行新的选择。
  1. 选择所有对象
(ssget)

如果在命令行输入这一段代码,将提示你选择一个或多个对象,并返回这些对象的选择集名称,如下面的19f就这个选择集的名称,一般这名称是随机的,没多少规律。

  1. 选择上一次选择的内容
(ssget “P”)

  1. 使用窗口选择对象
(SSGET "W" '(-100 -100) '(100 100))

这将提示用户选择一个交叉窗口,其左下角为 (10, 10),右上角为 (20, 20)。注意,这里的 "W" 表示窗口选择模式,它就相当于CAD中选择时从左上角选择到右下角,如果把W换成C,那就相当于从右下角选择到左上角,应该能明白这个区别吧。

  1. 选择CAD中所有的图形
(ssget “X”)

下面是一些高级的选择,只选择一些符合特定条件的图形,比如说某个图层上的圆,也是所谓的过滤选择。

1.只选择TEXT和Line

(ssget '((0 . "TEXT,LINE")))

这里的0可能一下无法理解,其实在CAD中有一种概念叫做“组码”,它其实是为了让代码比较省略,这里的0表示图元类型,0 . “TEXT,LINE”表示图元类型为TEXT或LINE。

常见的组码表如下图,更加详见其余内容可以去百度:

2.只选择某个图层上的内容

(ssget '((8 . "0")))

上述代码表示只选择图层名称为0的内容,这里的8.同上述的0.一样都是组码,表示的意思为图层名称,8 . “0”表示为图层名称为0。

3.多重条件的过滤选择

所有语言都包括“且”,“或”的概念,Lisp也是的,但是它的表达和一般的语言有点不一样,比如要表达”大于0且小于15“,一般语言往往是把逻辑符号AND放中间,比如说图层为0且图元类型为Line,往往可以这样表达:Type=”Line” AND LayerName=”0″,而Lisp却比较复杂:

(-4 . "<AND") (0 . "LINE") (8 . "0") (-4 . "AND>")

可以很明显感觉不一样,它把AND放在两侧,而且有<,>号感觉像开门关门的感觉。这里的-4.也是组码,意思是逻辑表达符号的名称,-4 . “<AND”表示逻辑表达符号为AND的起始,-4 . “AND>”表示逻辑表达符号为AND的末尾,两者共同组成一个完整的逻辑AND运算。

下面代码表示选择图层为0且图元类型为Line的内容。

(ssget '((-4 . "<AND") (0 . "TEXT,LINE") (8 . "0") (-4 . "AND>")))

发表评论