上期讲了如何自定义函数和命令,这次来讲一个最常用的功能,那就是选择图形。
选择图形的函数是”ssget”,来讲下怎么用。
基本语法
(ssget [filter] [point1 point2] ["X"] [prev])
filter
:这是一个可选参数,用于指定选择对象的条件。它通常是一个列表,包含要匹配的属性和对应的值。例如,你可以指定只选择特定图层上的对象。point1 point2
:这两个可选参数定义了一个选择窗口或交叉窗口。point1
是窗口的一个角点,point2
是对角点。根据这两个点的相对位置,你可以选择一个矩形区域内的对象(选择窗口)或两个点之间的对象(交叉窗口)。"X"
:这是一个字符串参数,当提供时,表示使用交叉选择模式(即选择窗口的对角线方向决定了选择模式)。如果不提供,则默认为窗口选择模式。prev
:这是一个可选参数,用于指定是否选择上一次的选择集。如果为T
(真),则ssget
返回上一次的选择集;如果为nil
(或未提供),则进行新的选择。
上面讲的比较理论化,来举几个例子就能明白了,为了简单点,就不再使用自定义命令的方式了,请将下述代码直接复制进命令行。
- 选择所有对象
(ssget)
如果在命令行输入这一段代码,将提示你选择一个或多个对象,并返回这些对象的选择集名称,如下面的19f就这个选择集的名称,一般这名称是随机的,没多少规律。

- 选择上一次选择的内容
(ssget “P”)
- 使用窗口选择对象
(SSGET "W" '(-100 -100) '(100 100))
这将提示用户选择一个交叉窗口,其左下角为 (10, 10),右上角为 (20, 20)。注意,这里的 "W"
表示窗口选择模式,它就相当于CAD中选择时从左上角选择到右下角,如果把W换成C,那就相当于从右下角选择到左上角,应该能明白这个区别吧。
- 选择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>")))
过滤选择乍一看有点烦,其实写多了也是很好理解的,这个非常重要,自己多试试才能更深入的理解。