明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 73112|回复: 246

[基础] ssget 后跟mode 的部分理解(不断更新)

    [复制链接]
发表于 2010-12-22 21:14 | 显示全部楼层 |阅读模式
本帖最后由 露水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 . "*[0-9]*"))))
)

;只选择含数字的文本( 同上)(感谢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 . "*[0-9]*")
    (-4 . "NOT>"))
  )))

;选择不含数字的文本(同上)(caoyin 提供的)
(defun c:test13()
(setq ss(ssget '((1 . "~*#*"))))
)

;只选择含字母的文本(好理解)
(defun c:test14()
(setq ss (ssget '((1 . "*[a-A-z-Z]*"))))
)

;只选择字母文本
(defun c:test15()
(setq ss (ssget '((0 . "text,mtext") (1 . "~*[~a-A-z-Z]*" ))))
)

;只选择不含字母的文本
(defun c:test16()
(setq ss (ssget '((-4 . "<NOT")
    (1 . "*[a-A-z-Z]*")
    (-4 . "NOT>"))))
)

;只选择不含字母的文本(同上)
(defun c:test16()
(setq ss (ssget '((1 . "~*[a-A-z-Z]*"))))
)

;选择半径大于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 . "~*[a-A-z-Z]*"))))
)

;选择带扩展数据的实体
(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 '(0  0))            ;窗口左下角点
(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 "")
)

其他一些 慢慢再添加






















点评

太精辟了,有了这些,很多功能在前面都可以过滤掉,省了好多的判断代码。  发表于 2015-6-9 22:57
(setq ss (ssget "f" (list pt1 pt2 pt3 ptn) '((0 . "line"))))  发表于 2014-3-22 12:47
看了此贴,胜读十年书  发表于 2012-3-7 19:58

评分

参与人数 22威望 +1 明经币 +18 金钱 +130 收起 理由
tomonkey239 + 1
vectra + 1 很给力!
angelnoeyeb + 1 很给力!
冰之绝恋 + 1 赞一个!
bzhjl + 1 赞一个!
伪书虫86 + 10 很给力!
434939575 + 1 很给力!不加不行!
wowan1314 + 1 很给力!
ou67169488 + 1
yjr111 + 1

查看全部评分

本帖被以下淘专辑推荐:

 楼主| 发表于 2011-12-19 14:36 | 显示全部楼层
【KAIXIN】 发表于 2011-12-17 10:47
(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>"))
  ))
)

回复 支持 1 反对 0

使用道具 举报

发表于 2012-8-8 21:28 | 显示全部楼层
选择经过某点的实体,
(defun c:test19()
(setq pt (getpoint))
(setq ss (ssget “c” pt pt))
)
这个有问题如下:

1.一个点的射线很多时,会全部选上。
2.选上的实体中,可能存在并不过指定点的实体(如果几条线在某地发散,并没有共同点,但是其端点非常近,距离在图面完全显示时看不出来即可,这时将全部选中了)其实没有一实体过指定点。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-10 02:11 | 显示全部楼层
本帖最后由 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,一定要这样吗,有无简单的结合 和W就可以的办法:
;;;=================http://bbs.xdcad.net/thread-201245-1-1.html=========
(ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])

在使用 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)))
;;;=============================================
以上两个函数,那个运行速度会更快了??
发表于 2010-12-23 01:03 | 显示全部楼层
打好基础是王道,支持一下
发表于 2010-12-23 06:49 | 显示全部楼层
谢谢楼主!学习学习。
发表于 2010-12-23 06:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2010-12-23 09:02 | 显示全部楼层
好样的,赞!
发表于 2010-12-23 09:08 | 显示全部楼层
很希望多发一些这样的帖子!
对新手很有帮助!
 楼主| 发表于 2010-12-23 11:44 | 显示全部楼层
上面的缺几个 谁要知道 可以补充一下 方便大家学习
发表于 2010-12-23 15:05 | 显示全部楼层
又让我学到一招,谢谢露水兄!
发表于 2010-12-23 15:12 | 显示全部楼层
顶下师傅的帖子
发表于 2010-12-23 23:37 | 显示全部楼层
ssget还可以这样用啊
楼主介绍一下":?"类参数的用法吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 16:39 , Processed in 0.258528 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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