明经通道 AutoLISP 函数   
ssget
 

根据选定对象创建选择集

(ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])

选择集中可以包含图纸空间和模型空间两个空间中的对象,但该选择集用于某操作时,那些在当前无效的空间中的对象会被 ssget 过滤掉。由 ssget 函数返回的选择集中仅包含主图元(不包含属性和多段线顶点)。

参数

sel-method

字符串,指定对象选择方法。有效选择方法包括:

C 窗交。

CP 圈交(指定多段线内和与该多段线相交的所有对象)。

F 栏选。

I 隐含窗口选择(在执行 PICKFIRST 期间选择的对象)。

L 添加到数据库的最后一个可见对象。

P 最后一个创建的选择集。

W 窗口选择。

WP 圈围(指定多边形内的所有对象)。

X 整个数据库。如果指定了 X 选择方法,而又没有提供 filter-list 参数,则 ssget 选择数据库中的所有图元,包括关闭、冻结图层中的图元和可见屏幕外的图元。

:E 光标的对象选择拾取框中的所有对象。

:N 在执行 ssget 操作的过程中,为选定图元调用 ssnamex 获得容器块和转换矩阵的附加信息。只有通过窗口、窗交点拾取等图形选择方法选定的图元,这一附加信息才可以使用。

与其他对象选择方法不同,:N 可能会返回选择集中的多个同名图元。例如,如果用户选择了一个复杂图元(如 BlockReference、PolygonMesh 或老式多段线)的子图元,那么 ssget 将查看该子图元是否已被选中。不过,ssget 实际上会将主图元(如 BlockReference 和 PolygonMesh)添加到选择集中。这样就会在选择集中出现多个同名图元,而 ssnamex 获得的每个图元的子图元信息各不相同。

:S 仅允许单一选择集。

pt1

与选择相关的点。

pt2

与选择相关的点。

pt-list

点表。

filter-list

关联表,指定对象的特性。与 filter-list 相匹配的对象将被添加到选择集。

如果省略所有参数,则 ssget 函数给出“选择对象”提示,允许用户交互式地构造选择集。

如果仅提供了一个点,而没有提供对象选择方法,AutoCAD 假定用户拾取单个点来选择对象。

返回值

如果成功则返回创建选择集的名称。如果没有选定对象则返回 nil。

对象选择方法说明

示例

提示用户选择要加入选择集的对象:

命令: (ssget)

<Selection set: 2>

创建通过点 (2,2) 的对象的选择集:

命令: (ssget '(2 2))

nil

创建一个选择集,该选择集由最近所选择的对象组成:

命令: (ssget "_P")

<Selection set: 4>

创建一个选择集,该选择集由交叉窗选而成,交叉窗口的对角顶点是 (0,0) 和 (1,1):

命令: (ssget "_C" '(0 0) '(1 1))

<Selection set: b>

创建一个选择集,该选择集由从 (0,0) 到 (5,5) 的窗口中包含的所有对象组成:

命令: (ssget "_W" '(0 0) '(5 5))

<Selection set: d>

通过指定过滤器,可以获得由指定类型、图层或颜色的所有对象构成的选择集。下例返回的选择集仅包含隐含选择集中的蓝色直线(这些对象是在 PICKFIRST 有效时选取的):

命令: (ssget "_I" '((0 . "LINE") (62 . 5)))

<Selection set: 4>

下例中需要将点表传递给 ssget 函数。pt_list 变量不能包含定义零长度线段的点。

创建点表:

命令: (setq pt_list '((1 1)(3 1)(5 2)(2 4)))

((1 1) (3 1) (5 2) (2 4))

创建一个选择集,该选择集由 pt_list 所定义的多边形包含或与之相交的所有图元组成:

命令: (ssget "_CP" pt_list)

<Selection set: 13>

创建一个选择集,该选择集由 pt_list 所定义的多边形包含的所有蓝色线段组成:

命令: (ssget "_WP" pt_list '((0 . "LINE") (62 . 5)))

<Selection set: 8>

只有在不带参数调用 ssget 函数时,才会亮显被选取的对象。选择集会消耗 AutoCAD 的临时文件存储区,所以 AutoLISP 不允许同时打开多于 128 个选择集。如果选择集的数目达到了这个极限,AutoCAD 会拒绝再创建新的选择集,以后调用 ssget 函数只会返回 nil。可以通过将选择集设为 nil 来关闭不再需要的选择集。

在任何可以用 Last 选择方式来响应 AutoCAD“选择对象”提示的地方,都可以通过向 AutoCAD 传递一个选择集变量来响应。这样将选择该选择集变量中的所有对象。

ssget 函数忽略对象捕捉模式的当前设置,除非在调用本函数时专门指定它。

参阅

《Visual LISP 开发人员手册》中的 处理选择集选择集过滤器表

(setq ss (ssget ":S" '((0 . "LINE"))))       ;只选取一次直线(省约回车)

(setq ss (ssget "X" '((0 . "LINE"))))       ;自动选取直线,包含冻结的直线

;;自动选取直线,不包含冻结的直线(ssget "_A" '((0 . "LINE"))) All所有的意思
(setq ss (ssget "A" '((0 . "LINE"))))

(ssget "X" '((0 . "DIMENSION") (1 . "*[~<>]*")))            ;选择包括非自动标注的所有
(ssget '((0 . "dimension") (1. "~")))

(setq ss (ssget '((1 . "*#*"))))       ;只选取含数字的文本
(setq ss (ssget '((1 . "*[0-9]*"))))       ;只选取含数字的文本(只含有.-的不算数字文本)
(setq ss (ssget '((1 . "A[0-9]*"))))       ;只选字母A后面紧跟数字的文本
(setq ss (ssget '((1 . "A[0-9]B"))))       ;只选字母A和B之间一位数字文本
(setq ss (ssget '((0 . "TEXT") (1 . "A[0-9]*[0-9]B"))))     ;A后B前紧跟数字的文本
(setq ss (ssget '((0 . "TEXT") (1 . "*[`--9]*"))))     ;选取含.-数字文本,其余不选取(ssget '((1 . "*[0-9]*")))
(setq ss (ssget '((0 . "TEXT") (1 . "*[~`--9]*"))))     ;不选取纯数字文本
(setq ss (ssget '((0 . "TEXT") (1 . "~*[~`--9]*"))))     ;只选取数字文本
(ssget '((0 . "TEXT") (-4 . "<NOT") (1 . "*[0-9]*") (-4 . "NOT>")))
           ;只选择不是数字的文字,同(setq ss (ssget '((1 . "*[0-9]*"))))
(ssget '((0 . "TEXT") (1 . "~*#*")))       ;只选择不是数字的文字
(setq ss (ssget '((0 . "TEXT") (1 . "#,1#,2#,3#,4#,50"))))  ;选取1—50的数字文本
(SETQ SS (SSGET '((0 . "*text") (1 . "*(*,*)*,*(*,**)**")))) ;选取含括号的文本
(setq ss (ssget '((1 . "*[a-A-z-Z]*"))))      ;只选取字母

(setq ss (ssget '((0 . "~insert"))))       ;选取不含块的对象

(SETQ ss (ssget (list '(0 . "CIRCLE") (cons 40 RR))))     ;按半径的大小选取圆

(ssget "_+.:E:S" '((0 . "LINE")))       ;相当于entsel

(setq ss (ssget ":E:S" '((0 . "line"))))      ;选取拾取框内的直线,选取不到就结束,S single,:E Everything

(setq ss (ssget ":E" '((0 . "LINE"))))       ;选取拾取框内的直线,直到按右键

(setq ss (ssget ":N" '((0 . "LINE"))))       ;只有通过窗口、窗交点拾取

(setq ss (ssget ":D" '((0 . "LINE"))))       ;会累加选取的直线,同一条直线,选取两次个数就会乘以2,3次则3.....

(setq ss (ssget ":L" '((0 . "LINE"))))       ;提示有几个在锁定图上,选取没有的锁定的直线

(setq ss (ssget "P" '((0 . "LINE"))))       ;上次的选择集

(setq ss (ssget '((0 . "line") (8 . "~0"))))      ;选取0层以外的线

(setq ss (ssget '((0 . "line") (8 . "~*[a-A-z-Z]*"))))     ;选取图层名不含字母以外的线

(setq ss (ssget '((0. "CIRCLE") (-3 ("APPNAME")))))     ;选取带扩展数据的实体(圆)


;;得到矩形p1 p2点框内的文字,包含在框内的被选取 相交的不选取,屏幕外的选取不到,WP点集
(setq ss (ssget "w" pt1 pt3 '((0 . "*text"))))

(setq ss (ssget "_F" '((1 1) (3 1) (5 2) (2 4)) '((0 . "line")))) ;与连线相交的对象

(ssget "_CP" '((1 1) (3 1) (5 2) (2 4)))      ;多边形和其相交的对象

(ssget "_WP" '((0 1) (4 2) (6 4)) '((0 . "ARC") (40 . 1.0))) ;多边形窗口内半径为1的弧

;;得到矩形p1 p2点框内的文字,包含在框内的及和框相交的被选取,屏幕外的选取不到,CP点集
(setq ss (ssget "c" pt1 pt3 '((0 . "*text"))))

;;选取图层表("CENTER" "DIM" "COOL" "CORE" -------N个图层)内的线
(setq la '("CENTER" "DIM" "COOL" "CORE")
      ss (ssget (list '(0 . "LINE")
        (cons 8 (apply 'strcat (mapcar '(lambda (x) (strcat x ",")) la)))
  )
  )
)

;;半径不等于5的圆
(ssget '((0 . "CIRCLE") (-4 . "<>") (40 . 5.0)))     ;!= /= <>三个等价

;;选取经过某点的实体
(setq pt (getpoint))
(setq ss (ssget "C" pt pt))

;;选取不含数字的文本
(setq ss (ssget '
   ((-4 . "<AND")
    (0 . "*TEXT")
    (-4 . "<NOT")
    (1 . "*[0-9]*")
    (-4 . "NOT>")
    (-4 . "AND>")
   )
  )
)

;;只选取不含字母的文本
(setq ss (ssget '
   ((-4 . "<AND")
    (0 . "*TEXT")
    (-4 . "<NOT")
    (1 . "*[a-A-z-Z]*")
    (-4 . "NOT>")
    (-4 . "AND>")
   )
  )
)

;;"图层1" "图层2""图层n中的文本,图层1为层名
(SETQ SS (ssget "x"
  (list
    '(0 . "TEXT")
    (cons 8 "图层[1-n]")
  )
  )
)

;;选取0层以外的线
(setq ss
       (ssget '
        ((-4 . "<AND")
  (0 . "line")
  (-4 . "<NOT")
  (8 . "0")
  (-4 . "NOT>")
  (-4 . "AND>")
        )
       )
)

;;按颜色号选取对象
(setq col (KX-Int 7 "" "颜色号" col 1))
(setq SS (ssget
    (list
      '(-4 . "<OR")
      (cons 62 COL)
      '(-4 . "OR>")
    )
  )
)

;;选取含"Q235"的文本
(ssget (list '(0 . "text") (cons 1 (strcat "*" "Q235" "*"))))

;;判断选取某个区域有没有直线
(setq SS (ssget "c"
  (polar '(0 0) (* 0.25 pi) 0.5)      ;坐标点
  (polar '(0 0) (* 1.25 pi) 0.5)      ;坐标点
  '((0 . "LINE"))
  )
)

;;选取颜色不是随层的圆、直线
(setq SS (ssget "X"
  '((0 . "CIRCLE,LINE")
    (-4 . "/=")
    (62 . 256)        ;-4  62"面不可以加AND OR
   )
  )
)

;;选取颜色1和2的对象(OR)的用法
(setq ss (ssget '((-4 . "<or")
    (62 . 2)
    (62 . 1)
    (-4 . "or>")
   )
  )
)

;;选取半径大于20小于100的圆
(setq ss (ssget '
   ((-4 . "<and")
    (0 . "circle")
    (-4 . ">")
    (40 . 20)        ;大于20
    (-4 . "<")
    (40 . 100)        ;小于100
    (-4 . "and>")
   )
  )
)

;;只选取"文字(包括多行文字)、尺寸、带属性的块
(setq ss (SSGET '
   ((-4 . "<OR")
    (0 . "*TEXT,DIMENSION")
    (-4 . "<AND")
    (0 . "INSERT")
    (66 . 1)
    (-4 . "AND>")
    (-4 . "OR>")
   )
  )
)

;;屏幕外的窗口模式选取
(setq rec_p1 '(0 0))         ;窗口左下角点
(setq rec_p2 '(1000 1000))        ;窗口右上角点
(setq filter_list
       (list
  '(0 . "insert")
  '(-4 . "<and")
  '(-4 . ">,>,*")
  (cons 10 rec_p1)
  '(-4 . "<,<,*")
  (cons 10 rec_p2)
  '(-4 . "and>")
       )
)
(ssget "x" filter_list)

;;一次产生n个不同选取集
(if (setq ss (ssget))
  (setq ss1 (ssget "_p" '((0 . "*TEXT"))))
)           ;从选择集中分解出文字

           ;空回车得出不同结果的选取集
(if (setq ss (ssget))
  (setq ss (ssget "_p" flt))
  (setq ss (ssget "_x" flt))
)

;;;坐标范围选择,有点类似(ssget "c" p1 p2 filter),但本函数在屏幕外的也可选择
;;;测试 (tt (getpoint) (getpoint) '((0 . "insert")))
(defun tt (p1 p2 filter / minX minY maxX maxY)
  (setq minX (min (car p1) (car p2))
 minY (min (cadr p1) (cadr p2))
 maxX (max (car p1) (car p2))
 maxY (max (cadr p1) (cadr p2))
  )
  (if filter
    (ssget "x"
    (append (list '(-4 . "<and")
    '(-4 . ">=,>=,*")
    (list 10 minX minY 0)
    '(-4 . "<=,<=,*")
    (list 10 maxX maxY 0)
     )
     (append filter '((-4 . "and>")))
    )
    )
    (ssget "X"
    (list '(-4 . "<and")
   '(-4 . ">=,>=,*")
   (list 10 minX minY 0)
   '(-4 . "<=,<=,*")
   (list 10 maxX maxY 0)
   '(-4 . "and>")
    )
    )
  )
)

(ssget '((0 . "TEXT") (-4 . "*,<=") (11 0.0 10.0 0.0)))     ;定位点Y坐标小于等于10的文本

(ssget '((0 . "LINE") (-4 . ">,>") (11 3.0 3.0 0.0)))     ;终点XY坐标均大于3的线

(ssget '((0 . "POINT") (-4 . "<,>=,=") (10 5.0 7.0 0.0)))   ;X<5,Y>7,Z=0的点

(ssget '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1)))     ;输入C封闭的多段线

(ssget "X" (list (cons 10 (getpoint))));定位点相等的所有对象
(ssget "X" (list '(-4 . "*,=") (cons 10 (getpoint))));Y坐标相等的对象

(ssget "_:S") - selecting a single object
(ssget "_:E") - selecting all objects crossing the selection box (can be also combined to e.g. (ssget "_:E:S")
(ssget "_:N") - selecting objects including nested/child objects - e.g. with block references, polymeshes, etc.
(ssget "_:D") - duplicate objects counted separately (2x selected object = 2 selections)
(ssget "_:L") - stops users from selecting objects on locked layers
(ssget "_:P") - rejects selection of viewports
(ssget "_:R") - allow selection in long transactions
(ssget "_:U") - enable subentity selection with Ctrl
(ssget "_:V") - force subentity selection
(ssget "_+.") - allows window selection even in the single selection mode - e.g. (ssget "_+.:E:S") (may not work in some localized versions of AutoCAD)

明经通道 版权所有 未经许可 不得传播

 评论