ssget 后跟mode 的部分理解(不断更新)
本帖最后由 露水2 于 2012-3-26 21:43 编辑mode 大小写无所谓
;可以模拟带过滤的entsel
;选择拾取框内的实体,选择不到就结束
(defun c:test1()
(setq ss (ssget ":E:S" '((0 . "line"))))
(command "erase" ss "")
)
;?
(defun c:test2()
(setq ss (ssget ":N" '((0 . "insert"))))
(command "erase" ss "")
)
;会累加选择的实体同一个块选择两次个数就会乘以2(看命令行)
;去掉":D"你试试结果(看命令行)
(defun c:test3()
(setq ss (ssget ":D" '((0 . "insert"))))
(sslength ss)
)
;只选择一次自动结束选择
;用处省了回车
(defun c:test4()
(setq ss (ssget ":S" '((0 . "line"))))
(command "erase" ss "")
)
;会提示有几个在锁定图上 并且不选择在锁定图层的实体(看命令行)
;去掉":L"你试试结果(看命令行)
(defun c:test5()
(setq ss (ssget ":L" '((0 . "insert"))))
(sslength ss)
)
;上次的的选择集 (这个好理解)
(defun c:test6()
(setq ss (ssget "P" '((0 . "insert"))))
(sslength ss)
)
;?
(defun c:test7()
(setq ss (ssget "+." '((0 . "insert"))))
(sslength ss)
)
;可以模拟带过滤的entsel
;选择拾取框内的实体,选择不到就不结束,选择到不右键也不结束注意和":E:S"的区别
(defun c:test8()
(setq ss (ssget ":E" '((0 . "insert"))))
(sslength ss)
)
;自动选择所有的满足条件的实体(好理解)冻结的也可选择到
(defun c:test9()
(setq ss (ssget "X" '((0 . "insert"))))
(sslength ss)
)
;自动选择不包括冻结的满足条件的实体(感谢masterlong)
(defun c:test10()
(setq ss (ssget "A" '((0 . "insert"))))
(sslength ss)
)
;只选择含数字的文本(好理解)
(defun c:test11()
(setq ss (ssget '((1 . "**"))))
)
;只选择含数字的文本( 同上)(感谢caoyin提供)
(defun c:test11()
(setq ss (ssget '((1 . "*#*"))))
)
;只选择数字文本
(defun c:test12()
(setq ss (ssget '((0 . "text,mtext") (1 . "~*[~.0-9]*" ))) )
)
;选择不含数字的文本
(defun c:test13()
(setq ss (ssget '((-4 . "<NOT")
(1 . "**")
(-4 . "NOT>"))
)))
;选择不含数字的文本(同上)(caoyin 提供的)
(defun c:test13()
(setq ss(ssget '((1 . "~*#*"))))
)
;只选择含字母的文本(好理解)
(defun c:test14()
(setq ss (ssget '((1 . "**"))))
)
;只选择字母文本
(defun c:test15()
(setq ss (ssget '((0 . "text,mtext") (1 . "~*[~a-A-z-Z]*" ))))
)
;只选择不含字母的文本
(defun c:test16()
(setq ss (ssget '((-4 . "<NOT")
(1 . "**")
(-4 . "NOT>"))))
)
;只选择不含字母的文本(同上)
(defun c:test16()
(setq ss (ssget '((1 . "~**"))))
)
;选择半径大于800小于8000的圆
(defun c:test17()
(setq ss (ssget '((-4 . "<and")
(0 . "circle")
(-4 . ">")(40 . 800)
(-4 . "<")(40 . 8000)
(-4 . "and>"))
))
)
;选择图层表("图层1" "图层2" "图层3" "图层4" ---------------有很多个图层)内的线(这个要感谢网友eachy,感谢学院派xyp1964进行了优化)
(defun c:test18()
(setq la '("1" "2" "3" "4")
ss (ssget (list '(0 . "line") (cons 8 (apply 'strcat (mapcar '(lambda (x) (strcat x ",")) la)))))
))
;选择经过某点的实体,
(defun c:test19()
(setq pt (getpoint))
(setq ss (ssget “c” pt pt))
)
;选择0层以外的线
(defun c:test20()
(setq ss (ssget'((-4 . "<AND")
(0 . "line")
(-4 . "<NOT")
(8 . "0")
(-4 . "NOT>")
(-4 . "AND>"))
)))
;选择0层以外的线(同上)(感谢caoyin提供)
(defun c:test20()
(setq ss (ssget '((0 . "line")(8 . "~0"))))
)
;选择图层名不含字母以外的线(根据caoyin提供几个实例进行了重新组合还可以组合出来很多)
(defun c:test21()
(setq ss (ssget '((0 . "line")(8 . "~**"))))
)
;选择带扩展数据的实体
(defun c:test22()
(setq ss (ssget '((0."CIRCLE") (-3 ("APPNAME")))))
)
;窗选择 包含在框内的被选择 相交的不选择和"c"比较一下
;屏幕外的选择不到
(defun c:test23()
(setq pt1 (getpoint))
(setq pt3 (getcorner pt1))
(setq ss(ssget "w" pt1 pt3 '((0 . "insert"))))
;"wp"后面换成点集 (setq ss(ssget "wp" ptl '((0 . "insert"))))
)
;框选择 包含在框内的及和框相交的被选择 和"w"比较一下
;屏幕外的选择不到
(defun c:test24()
(setq pt1 (getpoint))
(setq pt3 (getcorner pt1))
(setq ss(ssget "c" pt1 pt3 '((0 . "insert"))))
;"cp"后面换成点集 (setq ss(ssget "cp" ptl '((0 . "insert"))))
)
;线相交的线删除(屏幕外的选择不到郁闷所以要用zoom "ob")
(defun c:test25()
(setq ptl nil)
(while (setq pt (getpoint))
(setq ptl (cons pt ptl))
)
(setq ss (ssget "f" ptl '((0 . "line"))))
(command "erase" ss "")
)
;删除点(0 0)和点(1000 1000)形成的矩形内的实体(在屏幕外面的也可以),(感谢masterlong)
(defun c:test26()
(setq pt1 '(00)) ;窗口左下角点
(setq pt3 '(1000 1000)) ;窗口右上角点
(setq ss (ssget "x"(list
'(-4 . "<and")
'(0. "insert")
'(-4 . ">,>,*")
(cons 10 pt1)
'(-4 . "<,<,*")
(cons 10 pt3)
'(-4 . "and>")
)))
(command "erase" ss "")
)
其他一些 慢慢再添加
【KAIXIN】 发表于 2011-12-17 10:47 static/image/common/back.gif
(defun c:test13()
(setq ss (ssget '((-4 . "")(40 . 800)
(-4 . ""))
(defun c:test13()
( setq r1(getreal))
( setq r2(getreal))
(setq ss (ssget (list '(-4 . "<and")
'(0 . "circle")
'(-4 . ">")(cons 40 (min r1 r2))
'(-4 . "<")(cons 40 (max r1 r2))
'(-4 . "and>"))
))
)
选择经过某点的实体,
(defun c:test19()
(setq pt (getpoint))
(setq ss (ssget “c” pt pt))
)这个有问题如下:
1.一个点的射线很多时,会全部选上。
2.选上的实体中,可能存在并不过指定点的实体(如果几条线在某地发散,并没有共同点,但是其端点非常近,距离在图面完全显示时看不出来即可,这时将全部选中了)其实没有一实体过指定点。 本帖最后由 sfzyr 于 2021-9-10 23:45 编辑
caoyin 发表于 2011-6-18 00:23
;选择0层以外的线
(defun c:test16()
(setq ss (ssget '((0 . "line")(8 . "~0"))))
如何结合W 和 :L框选,过滤掉框选时锁定图层。以下来自晓东论坛,作者eachy,一定要这样吗,有无简单的结合:L 和W就可以的办法:
;;;=================http://bbs.xdcad.net/thread-201245-1-1.html=========
(ssget ] )
在使用 SSGET 的过程中发现在含有 Lock 的图层时,只有 CAD 命令可以过滤掉 Lock 图层实体,
Seclect 命令和 SSGET 是不能过滤 Lock 图层的,这样在程序中循环将浪费掉大量的时间,因此
写了这个函数简单情况下替代标准的 Ssget。
参数: Msg----提示字串
mode ----同 ssget 的 method, 没有提供 pt 选项,够用就行
filter --- 过滤表
|;
(defun ea:ssget (Msg mode filter / ea:getlocklyr locklyr)
(defun ea:getlocklyr (/ d r);检索锁定图层
(setq r "")
(while (setq d (tblnext "layer" (null d)))
(if (= (cdr (assoc 70 d)) 4)
(setq r (strcat (cdr (assoc 2 d)) "," r))
)
)
(if (/= r "")
(vl-string-trim "," r);还是 2000+ 以上版本方便
nil
)
)
(setq locklyr (ea:getlocklyr));锁定图层字串
(if locklyr
(if filter
(setq
filter (append
filter
(list '(-4 . "<not") (cons 8 locklyr) '(-4 . "not>"))
)
)
(setq
filter (list '(-4 . "<not") (cons 8 locklyr) '(-4 . "not>"))
)
)
);构造图层过滤表,ssget 中即使前面有锁定的图层 not 仍旧会起作用
(if msg
(princ msg)
);提示串
(cond
((and mode filter)
(ssget mode filter);有 mode
)
(filter
(ssget filter);含有过滤表
)
(t (ssget));其它情况用标准 ssget
)
)
;;;;=============================================
(setq ss (ai_ssget (ssget)))
;;;=============================================
以上两个函数,那个运行速度会更快了??
打好基础是王道,支持一下 谢谢楼主!学习学习。 好样的,赞! 很希望多发一些这样的帖子!
对新手很有帮助! 上面的缺几个 谁要知道 可以补充一下 方便大家学习 又让我学到一招,谢谢露水兄! 顶下师傅的帖子 ssget还可以这样用啊
楼主介绍一下":?"类参数的用法吧