明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8073|回复: 20

[讨论] 关于ssget 获取多种图形实体的方法

    [复制链接]
发表于 2011-1-6 15:24:40 | 显示全部楼层 |阅读模式
用ssget获取圆和直线的代码如下
  1. (setq ss1 (ssget '((0 . "LINE"))))
  2.   (setq ss2 (ssget '((0 . "circle"))))
但是要选择两次,无疑是个笨办法.所以我把它改成
  1. (setq sss (ssget  '((0 . "LINE,circle"))))
问题来了,我如何将其分离,就是把直线实体赋给选择集ss1,圆实体赋给选择集ss2 ?
我的解决办法如下
  1. (defun c:test ()
  2.   (setq ss1 nil ss2 nil)
  3.   (if (setq ss1 (ssget '((0 . "LINE,circle"))))
  4.     (foreach itm (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1)))
  5.       (if (= (cdr (assoc 0 (entget itm))) "CIRCLE")
  6.         (progn
  7.           (or ss2 (setq ss2 (ssadd)))
  8.           (ssadd itm ss2)
  9.           (ssdel itm ss1)
  10.         )
  11.       )
  12.     )
  13.   )
  14. )
期待各路高手的讲解,希望在此跟帖,看到您的解决办法.最后请斑竹评一下谁的代码最实用最精简.谢谢大家!
.

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-1-6 16:06:09 | 显示全部楼层
(defun c:test ()
  (setq ss1 nil ss2 nil)
  (if (setq ss1 (ssget '((0 . "LINE,circle"))))
    (progn
      (setq ss2 (ssget "p" '((0 . "circle"))))
      (command "select" ss1 "")
      (setq ss1 (ssget "p" '((0 . "LINE"))))
    )
  )
)
回复 支持 1 反对 0

使用道具 举报

发表于 2011-1-6 20:29:09 | 显示全部楼层
MARK~~~~~~
发表于 2012-4-26 08:32:56 | 显示全部楼层
谢谢楼主分享,代码很巧妙
发表于 2012-4-26 08:52:14 | 显示全部楼层
刚好前一段写代码有碰到这个问题,跟大家分享一下吧,我是这种做法
(setq ss(ssget))  
  ;墙
  (setq ss-wall(ssget "p" (list(cons 0 "TCH_WALL"))))
  (sssetfirst nil ss)
  ;窗
  (setq ss-window(ssget "p" (list(cons 0 "TCH_OPENING")(cons  71 1))))
  (sssetfirst nil ss)
  ;柱
  (setq ss-column(ssget "p" (list(cons 0 "TCH_COLUMN"))))
发表于 2012-7-11 07:56:25 | 显示全部楼层
谢谢楼主,学习学习
发表于 2012-7-11 08:14:07 | 显示全部楼层
  1. (defun c:tt ()
  2.   (if (setq ss (ssget '((0 . "LINE,circle"))))
  3.     (progn (setq ss1 (ssadd)
  4.                  ss2 (ssadd)
  5.                  i   -1
  6.            )
  7.            (while (setq s1 (ssname ss (setq i (1+ i))))
  8.              (if (= (cdr (assoc 0 (entget s1))) "LINE")
  9.                (ssadd s1 ss1)
  10.                (ssadd s1 ss2)
  11.              )
  12.            )
  13.     )
  14.   )
  15. )

  16. ;; 伪源码方式
  17. (defun c:tt ()
  18.   (if (setq ss (ssget '((0 . "LINE,circle"))))
  19.     (setq ss1 (ssget "p" '((0 . "LINE")))
  20.           ss2 (ssdiff ss ss1)
  21.     )
  22.   )
  23. )
发表于 2012-7-14 00:53:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2012-7-14 03:00:46 | 显示全部楼层
  1. (defun c:test (/ SS _OC)  
  2.   (if (setq ss (ssget '((0 . "LINE,CIRCLE"))))
  3.     (progn
  4.        (setq ss1 (ssget "p" '((0 . "LINE"))))
  5.        (setq _oc (getvar 'CMDECHO))
  6.        (setvar 'CMDECHO 0)
  7.        (vl-cmdf "_Select"  ss "")
  8.        (setvar 'CMDECHO _OC)
  9.        (setq ss2 (ssget "p" '((0 . "CIRCLE"))))         
  10.            )
  11.     )
  12.   (princ)
  13.   )
发表于 2012-7-14 15:44:26 | 显示全部楼层
学习了...又学到一个好方法..谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-24 01:46 , Processed in 0.197051 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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