设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 154|回复: 9

[求助] ssget,如何通过固定区域过滤选中的相交实体

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 7 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 zrg1 于 2021-2-22 16:17 编辑


如图,A、B实体,SS是选集的范围,ss范围由4个点以上点表构成。现A、B相交,选集SS也通过相交的地方,
代码
  • (setq ss (ssget "_cp" (list (getpoint) (getpoint)(getpoint)(getpoint)(getpoint))))
  • (sssetfirst nil ss)
这样会同时选中A和B,我想仅仅选中A实体,把B过滤剔除掉,应该怎么样写?select也不行,
小Q截图-20210222161438.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 604个

财富等级: 财运亨通

发表于 7 天前 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2021-2-22 10:11 编辑

没说清楚,你的ssget是怎么写的? 见http://bbs.xdcad.net/thread-714124-1-1.html

点评

忘记写了。已补充!!!!  详情 回复 发表于 7 天前
(setq a (ssget "_cp" (list (getpoint) (getpoint)(getpoint)(getpoint)))) (sssetfirst nil a)  详情 回复 发表于 7 天前
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 zrg1 于 2021-2-22 11:14 编辑

(setq ss (ssget "_cp" (list (getpoint) (getpoint)(getpoint)(getpoint))))
(sssetfirst nil ss)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 7 天前 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2021-2-22 10:02
没说清楚,你的ssget是怎么写的? 见http://bbs.xdcad.net/thread-714124-1-1.html

忘记写了。已补充!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 7 天前 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2021-2-22 11:59 编辑

"_cp"==>>"_w" "_WP"

点评

这个组合模式过滤参数应该怎么写?我试了都模式错误 1.(setq ss (ssget "_w " "_wp" (List (getpoint)(getpoint)(getpoint)(getpoint)))) 2.(setq ss (ssget "_w " "_wp" (getpoint)(getpoint))) 3.(setq ss (ssg  详情 回复 发表于 7 天前
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 zrg1 于 2021-2-22 16:10 编辑

这个组合模式过滤参数应该怎么写?我试了都模式错误
1.(setq ss (ssget "_w " "_wp" (List (getpoint)(getpoint)(getpoint)(getpoint))))
2.(setq ss (ssget "_w " "_wp" (getpoint)(getpoint)))
3.(setq ss (ssget "_w _wp" (List (getpoint)(getpoint)(getpoint)(getpoint))))
4.(setq ss (ssget "_w _wp" (getpoint)(getpoint)))
想要点表(≥4个点以上)构成的选集
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 6 天前 | 显示全部楼层
没人能够解决吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
1.(setq ss (ssget "_wp" (List (getpoint)(getpoint)(getpoint)(getpoint))))
2.(setq ss (ssget "_w " (getpoint)(getpoint)))

点评

参数用的是点表。第二个行不通。第一个没法选中A  详情 回复 发表于 5 天前
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 5 天前 | 显示全部楼层
lijiao 发表于 2021-2-24 08:58
1.(setq ss (ssget "_wp" (List (getpoint)(getpoint)(getpoint)(getpoint))))
2.(setq ss (ssget "_w " ( ...

参数用的是大于4个点的点表。第二个行不通。第一个没法选中A
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 5 天前 | 显示全部楼层
zrg1 发表于 2021-2-24 10:16
参数用的是大于4个点的点表。第二个行不通。第一个没法选中A

(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 . "*#"))))                            ;数字结尾
(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个不同选取集
(setq fil '("_p" ((0 . "*TEXT"))))
(if (setq ss (ssget))  
  (setq ss1 (apply 'ssget fil));从选择集中分解出文字
  (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 "X" (list (list -3 (list "*"))));带扩展数据的对象
(ssget (list '(-3 ("ACAD"))));override产生的标注


ssget 用法详解
发表于2017/5/15 21:34:39  377人阅读
分类: AutoLisp

ssget 用法详解 by yxp 2017/04/10

ALisp 编程时 ssget 是无处不在的,灵活的选择集构建方式,可以轻松的处理图形,体现了 Lisp 相对其他语言的优点。
然而强大的 ssget 估计很多人都不清楚用法,包括各种教程对 ssget 的描述都不够完善,本文试图总结 ssget 的用法,不足之处请读者指正。

语法:

(ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])
ssget 的参数均为可选参数,需要注意的是可选参数之间的组合条件。
以下语法表示中 <parameter> 尖括号代表必选,[parameter] 方括号代表可选。

一、选择集的窗口参数

[sel-method] 字符串类型,不区分大小写,指定一个选择方法。
[pt1 [pt2]] 表类型,由三个数字的点参数表,表示 xyz 坐标,也可以是仅包括xy 的坐标。
[pt-list] 表类型,由点参数表组成的表。
C 窗交(反选)

如果指定了该参数,则必须跟一对点创建一个矩形窗口,与矩形窗口相交的对象均被加入选择集。
参数语法: (ssget "c" <pt1> <pt2> [filter-list])
此时,[pt-list] 参数不能出现,否则 ssget 将会返回一个错误提示:错误的点参数
示例:

(setq pt1 (getpoint "First Pt:"))
(setq pt2 (getpoint "Second Pt:"))
(setq ss (ssget "c" pt1 pt2))
1
2
3
W 窗口(正选)

与 C 参数语法及用法类似,但功能不同,只有在矩形窗口内完整的对象才会被加入选择集。
参数语法: (ssget "w" <pt1> <pt2> [filter-list])
参数前加下划线 “_w” 可以使代码在不同版本的CAD平台下兼容,建议写上。

CP 圈交(多边形反选)

如果指定了该参数,则必须用构成多边形的点表响应,与多边形相交的对象被加入选择集。
参数语法: (ssget "CP" <pt-list> [filter-list])
此时点参数 [pt1] [pt2] 不能出现,而且,CP 参数依赖 <pt-list> 的顺序来构成一个多边形。
例如四个点按顺序连接为一个8字型,而不是一个矩形,ssget 将返回一个空选择集,即使对象与窗口相交。
如果参数为少于3个点的表,也将返回一个 nil。
示例:

(setq pt1 (getpoint "Piont1:"))
(setq pt2 (getpoint "Piont2:"))
(setq pt3 (getpoint "Piont3:"))
(setq pt4 (getpoint "Piont4:"))
(setq ss (ssget "c" (list pt1 pt2 pt4 pt4)))
1
2
3
4
5
WP 圈围(多边形正选)

与 CP 参数语法及用法类似,但只有被多边形窗口包围的对象才会被加入选择集。
参数语法: (ssget "wp" <pt-list> [filter-list])

F 栏选

将参数点表连接为一条折线,与折线相交的对象被加入选择集。
参数语法: (ssget "f" <pt-list> [filter-list])
pt-list 最少由2个点组成表,CP/WP 参数最少需要 3 个点。

P 前一批创建的图形

包括 CAD 命令或 LISP 程序创建的图形对象。
参数语法: (ssget "p" [filter-list])
P 参数不能和 [pt1 [pt2]] [pt-list] 任何一个点参数组合,否则将返回一个错误,有的 CAD 版本会返回 nil
当分解(EXPLODE)一个 CAD 图形时,p 方法特别有用,可以一次性建立分解后的所有对象选择集。

L 最后一个创建的对象

包括 CAD 命令或 LISP 程序创建的对象,注意和 P 参数的区别。
参数语法: (ssget "l" [filter-list])
在获取最后一个对象的图元名时,以下代码是等价的,但是后者不能提供直接过滤功能。

(ssname (ssget “L”) 0) == (entlast)
I 隐含窗口选择

参数语法: (ssget “i” [filter-list])
CAD 命令有两种执行方式,第一种先命令后选择,第二种先选择后命令。所以在 Lisp 中也允许先选择后命令,
而且这方式可以通过系统变量 pickfirst 来关闭(值为 0),此时 I 参数失效,(ssget “i”) 将返回 nil。
选择对象后,可以用 (sssetfirst nil) 取消选择集的亮显状态。

X 整个文件

在当前打开的CAD文件中选择所有对象,包括关闭、冻结图层中的图元和可见屏幕外的图元,不分大小写。
参数语法: (ssget "x" [filter-list])
X 用法与 A 用法等价,(ssget “A”) 也是选择所有对象。

:E 拾取框

用拾取框选择对象,此时 ssget 将不再拉出一个矩形窗口,直到点右键结束选择。
参数语法: (ssget ":E" [filter-list])
与 :E 对应的 :N 参数为只能拉出一个矩形窗口选择,而不能通过点选拾取对象。

:S 仅允许单一选择集

使用:s参数时,ssget 将点选对象一次就会结束,无论是否选中对象,未选中则返回 nil,可节省一次回车确认。
参数语法: (ssget ":S" [filter-list])
说明: “:S” 参数和 “:E” 可以同时使用,例如: (ssget "_:S:e")
以下参数可以组合使用, “+” 或 “-“,例如:(ssget "_:S+D")

:D 重复选择

允许同一个对象多次加入选择集,每选择一次,则加入一次。
参数语法: (ssget ":D" [filter-list])
例如:画两条直线,然后运行代码 (setq ss (ssget ":D")),框选3次直线后。(sslength ss) 返回 6

:L 不选择锁定图层对象

注意: L、:L、-L 的参数是不同的。
参数语法: (ssget ":L" [filter-list])
ssget 默认选择所有图层对象,这样在程序中需判断图层是否锁定,才能编辑,否则 lisp 代码将返回错误。

其他方法还有A :A -A _:V _:U _:R -M -P :P -G -L :? 等参数以及组合用法,有兴趣的朋友可以测试。
这些参数的用法官方并未在语法参考里公布,估计是程序测试留下的接口,CAD 更新时可能被关闭,不建议使用。

注意事项:

ssget 带点参数调用时,可能会受到自动捕捉的影响,一般先将系统变量 osmode 置零。
ssget 点参数包围的矩形、多边形应在当前绘图区域内可见,否则 ssget 仅返回可见区域内的对象选择集。
创建选择集会消耗 AutoCAD 的临时文件存储区,所以 AutoLISP 不允许同时创建多于 128 个选择集。
例如:画一个圆,然后执行以下代码:
(repeat 130 (setq a (cons (ssget "l") a)))
这段程序循环了 130 次,AutoCAD提示 “错误: 超出选择集数量的最大范围”,如果继续调用 (ssget) 将返回 nil;此时,只有清空选择集变量 (setq a nil) 才能继续调用 ssget。
ssget 选择时没有自定义提示,如果特别需要可用第三方函数,比如飞诗的: Fsxm-ssget
二、选择集的过滤条件

[filter-list] 过滤条件,表类型,指定与属性(DXF 组码)匹配的对象被加入选择集。
常用支持过滤的 DXF 组码:

0 实体类型
-4 条件运算, SSGET 的专用组码,包括逻辑条件与关系条件
1 图元文字内容
-3 扩展数据
2 属性标记、块名
6 线型名
7 文字样式
8 图层名
40 CIRCLE 直径或 TEXT 文字高度
62 颜色号
0 组码

指定对象实体类型,语法 ‘((0 . types)),对象类型 types 为字符,不分大小写,常用的实体类型如下:

"POINT"、"TEXT"、"MTEXT"      点、单行文本、多行文本
"LINE"、"LWPOLYLINE"、"SPLINE"    直线、多段线、样条曲线
"CIRCLE"、"ARC"、"ELLIPSE"        圆、圆弧、椭圆
"HATCH"、"DIMENSION"     填充、标注
"ATTDEF"、"INSERT"       属性文字、图块
“,” 逻辑或,对象类型可多选,名称用 “,” 分隔。例如,创建直线和文本的选择集:

(ssget ‘((0 . “TEXT,LINE”)))
框选对象后,将只有直线和文本被选中(亮显)并加入选择集。

“~” 逻辑非,用来排除某类型。例如:创建除过图块的选择集

(ssget ‘((0 . “~INSERT,LINE”)))
显然,第二个类型 LINE 毫无意义,因为第一个 ~INSERT 非图块类型范围包含了 LINE 类型。

“*” 通配符,用来表示模糊类型。例如,创建所有直线的选择集:

(ssget ‘((0 . “*LINE”)))
框选对象后,可以将 “LINE”、”LWPOLYLINE”、”SPLINE”、”MLINE” 类型加入选择集,和以下过滤条件等价:

(ssget ‘((0 . “LINE,LWPOLYLINE,SPLINE,MLINE”)))
通常我们用后者实现精确过滤。

其他:(ssget ‘((0 . “*E”))) 选择过滤所有直线、圆、椭圆的类型,因为他们的尾字母都是 E。
(ssget ‘((0 . “*”))) 与 (ssget) 等价,相当于全选。
(ssget ‘((0 . “~*”))) Lisp 都不知道你要干嘛了,因为它什么也选不上。

0 组码可以和其他组码组成 list 表过滤。例如,选择半径为 20 的圆:

(ssget ‘((0 . “CIRCLE”)(40 . 20)))
通常,对于字符类型组码均支持通配过滤语法,包括线型名、文字样式、图层等。
例如:选择非 0 层的所有对象

(ssget ‘((8 . “~0”)))
注意:并不是所有组码都支持过滤,例如下面过滤条件将返回 nil,即使存在句柄为 “25F” 的圆。

(ssget ‘((0 . “CIRCLE”)(5 . “2*”)))
-4 组码

逻辑条件运算

用 -4 组码和逻辑运算符组成表对,将一个或几个表项包夹。逻辑运算符对大小写不敏感。
表对必须成对出现,如:(-4 . "<xx")...(-4 . "xx>"), 常用的逻辑运算符如下:

or   项目并集
and  项目交集
not  不含此项
xor  两项异或
or 并集。例如,选择直线和文本:

(ssget '((-4 . "<or")(0 . "line")(0 . "text")(-4 . "or>")))
显然与 (ssget ‘((0 . “text,LINE”))) 等价,但后者写法更简洁。
例如,选择颜色为红色和绿色的文字和直线:

(ssget '((0 . "TEXT,LINE")(-4 . "<or")(62 . 1)(62 . 3)(-4 . "or>")))
and 交集。例如,选择图层为 “notes”,颜色为绿色的单行文本:

(ssget '((-4 . "<and")(0 . "text")(8 . "notes")(62 . 3)(-4 . "and>")))
not 非。例如,选择非 “notes” 层的实体对象:

(ssget '((-4 . "<not")(8 . "notes")(-4 . "not>")))
显然与 (ssget ‘((8 . “~notes”))) 等价。
注意:非运算只能有一个表项被包夹,否则 ssget 将返回 nil。

xor 异或。即半加法,实现二进制加法的不进位运算。逻辑意义: 相同为0,相异为1。
例如,选择在 “notes” 层不是绿色、或是绿色而不在 “notes” 层的文本对象:

(ssget '((0 . "text")(-4 . "<xor")(8 . "notes")(62 . 3)(-4 . "xor>")))
注意:异或运算只能有两项,如果超过两项或只有一项,ssget 将返回 nil。

逻辑运算可以嵌套,组成更复杂的条件运算。
(ssget '((0 . "text")
        (-4 . "<or")
        (-4 . "<and")(8 . "0")(62 . 1)(-4 . "and>")
        (-4 . "<and")(8 . "notes")(62 . 3)(-4 . "and>")
        (-4 . "or>")
))
1
2
3
4
5
6
关系条件运算

用 -4 组码和关系运算符组成表对,放在需要比较的表项前。
与成对出现的逻辑条件不同,关系表对单个出现,常用关系运算符如下:

"*"    通配符
"="    等于
"!="   不等于
"<>"   不等于
"<"    小于
"<="   小于或等于
">"    大于
">="   大于或等于
"&"    按位与
"&="   按位屏蔽相等(仅适用于组值为整型的组)
例如:选择半径大于或等于20的圆

(ssget '((0 . "CIRCLE")(-4 . ">=")(40 . 20)))
选择半径20的圆,颜色不是红色

(ssget '((0 . "CIRCLE")(-4 . "<and")(-4 . "!=")(62 . 1)(40 . 20)(-4 . "and>")))
对于含有多个元素的比较,如点坐标,可用 “,” 隔开关系运算符。
选择圆心坐标 x>100, y<120, z=0,图层名以 cir 开始的圆

(ssget '((0 . "CIRCLE")(-4 . ">,<,=")(10 100 120 0)(8 . "cir*")))
选择图形颜色不是随层 (bylayer) 的对象,可用以下代码
(ssget '((-4 . "&")(62 . 255)))
我们知道 CAD 的索引颜色数为 1-255,用 2 个字节表示,随层的颜色为 0,在 DXF 组码中并不显示。
此时如果用 (ssget ‘((-4 . “>”)(62 . 0))) 来过滤是不对的,随层颜色的图形也将被选上。
如果用二进制的 8 个 1 与当前颜色数进行逻辑与的位运算 &,其结果都不是 0, 即为真, 2^8=255

1 组码

文本内容的匹配运算(与 wcmatch 函数语法相同),相当于简单正则。
对于包含大量文本对象的图形,有时候需要精确的过滤条件,可以通过以下特殊符号来实现:

"*"  通配符,代表一个或多个任意字符
"|"  管道符,用来连接并列字符,表示或的关系
"?"  占位符,代表一个任意字符
"#"  数字符,代表一个0-9的字符
"@"  字母符,代表一个a-z,A-Z字符
"."  特殊字符,代表一个除字母和数字的其他字符
"~"  符号非运算
"`"  转义字符(数字 1 左边那个字符)
","  分隔两个模式的表达式
"[]" 限位符,用中括号包括一个表达式,表示一位字符
例1: CAD 中有以下 3 组 TEXT 文本

① X=35.614 ② Y=356.201 ③ Z=11.526
要求匹配以 “X=” 这两个字母开始的单行文本

(ssget ‘((0 . “TEXT”) (1 . “X=*”)))
返回第 ① 组文本的选择集
解读: “X=” 不是通配运算符,在此表示精确匹配,后面加 “*” 是任意符号。

要求匹配以 “X=” 或 “Y=” 这两个字母开始的单行文本

(ssget ‘((0 . “TEXT”) (1 . “[X|Y]=*”)))
返回第 ①、② 组文本选择集
解读: 并列出现的字符,用 “|” 连接。

要求匹配 包含数字小于 100 的单行文本

(ssget ‘((0 . “TEXT”) (1 . “@=##[.]*)))
返回第 ①、③ 组文本选择集
解读: “##” 代表两个数字,两个数字连接最大只能是 99。小数点单独出现用方括号 [.]
如果仅仅是 “.”,而没有方括号,则代表任意特殊符号。

例2: 我们再试验一组复杂的文本,在 CAD 中写入以下 10 组 TEXT 文本

① abcde ② 12345 ③ -25.390 ④ *&@125 ⑤ F35
⑥ #54-65 ⑦ 头文字 ⑧ 36 75 ⑨ F ⑩ /(*&%@!
要求匹配 包含数字 文本

(ssget ‘((0 . “TEXT”) (1 . “#“)))
以上代码将选中 ②③④⑤⑥⑧ 包含数字的 6 组文本
解读: “#” 代表一个数字字符,

要求匹配 以*开始的 文本

(ssget ‘((0 . “TEXT”) (1 . “`**”)))
以上代码将选中 ④ 以*开始的 1 组文本
解读: 因为 "*" 是通配符,要匹配语法中的专用字符用转义 "'*"

要求匹配 不含特殊字符 文本

(ssget ‘((0 . “TEXT”) (1 . “~*.*”)))
以上代码将选中 ①②⑤⑦⑨,注意:负号和小数点也是特殊符号
解读: “.” 代表一个特殊字符,前后加 “.” 包含一个特殊字符,不含特殊字符就是 “~*.*”

要求匹配 纯数字 的单行文本,包含负号和小数点

(setq ss (ssget ‘((0 . “TEXT”) (1 . “~*[~.–9]*))))
解读: 负负得正,两次取非可获取数字本身,括号内 “[~.-]”, 意为包含小数点和负号。
注意, 220-11 不能参加计算的数字也会被包括其中。

下面给出常用匹配规则,欢迎测试
匹配数字,不含小数点和正负号: “~*[~0-9]*” 如: 9824
匹配 26 个小写字母: “~*[~a-z]*” 如: loveu
匹配大写字母或数字: “~*[~A-Z],~[~0-9]*” 如: NASAA 或 9527
匹配大写字母和数字混排: “~*[~A-Z|0-9]*” 如: F36D
空格是一个很特殊的字符,用一个空格可以匹配任意个空格,其他字符没有这个特性。
例如: (wcmatch " " " ") 返回 T

-3 组码

扩展数据过滤。ALISP 中可以用如下方法给图形添加扩展数据,增加自定义组码及表值。

第一步,注册一个扩展对象应用名

(regapp “xapp”)
第二步,选择一个图元并返回组码

(setq En (entget (car (entsel))))
第三步,定义加入图元的扩展数据

(setq data ‘((-3 (“xapp” (1000 . “你好中国”)))))
第四步,将扩展数据附着更新图元

(entmod (append En data))
完成,我们可以检查一下扩展数据

(assoc -3 (entget (car (entsel)) ‘(“xapp”)))
结果返回 (-3 (“xapp” (1000 . “你好中国”)))
采用这种方法添加扩展数据,用 EXPLODE 命令不能清除。

与 -3 组码无关的话题。
用 VLisp 函数给图元添加数据比较简单,无需提前注册名称,例如
(vlax-ldata-put (car (entsel)) "xa" "你好中国")
查询数据如下:
(vlax-ldata-get (car (entsel)) "xa")
返回 "你好中国"
采用这种方法,用 EXPLODE 命令可以炸开扩展数据,相当于清除图元的扩展数据。
在某些二次开发的 CAD 程序中,扩展数据被大量使用,用来分类图元对象(图层分类法容易被修改)。
这时候的 ssget 方显英雄本色,用来精确选择,再适合不过。在参数化制图时,添加扩展数据,当参数
发生变化时,很容易遍历修改这些对象,由于扩展数据的不可见和不可分解的特性,不会被用户误操作。
这时候只需要用下面代码即可完成过滤,连对象类别的 0 组码 都不需要了。

(ssget ‘((-3 (“xapp”))))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )  

GMT+8, 2021-3-1 05:38 , Processed in 0.177841 second(s), 35 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表