tempasdf 发表于 2024-11-12 14:37:54

ssget 选择图元后 二次分类

各位:
      请问一下 通过(setq ss (ssget'((0 . "LINE,CIRCLE")) ))选择图元后,如保再将 linecircle 分类保存到变量 sslinesscircle中

咏郡 发表于 2024-11-12 15:14:00

本帖最后由 咏郡 于 2024-11-12 15:26 编辑

可以先取两点,分别(setq sscircle (ssget (list pt1 pt2)'((0 . "CIRCLE")) ))和(setq ssline (list pt1 pt2(ssget'((0 . "LINE")) ))

kozmosovia 发表于 2024-11-12 16:38:42

本帖最后由 kozmosovia 于 2024-11-12 16:43 编辑

用command或者ssgetfirst都是变相现需要选两次,不如直接遍历选择集一次,根据图元类型分组到指定的变量中(and (setq ss (ssget '((0 . "line,circle"))))
   (setq ssline   (ssadd)
   sscircle (ssadd)
   idx      -1
   )
   (repeat (sslength ss)
       (setq sn (ssname ss (setq idx (1+ idx))))
       (ssadd sn
      (if (= (cdr (assoc 0 (entget sn))) "LINE")
    ssline
    sscircle
      )
       )
   )
)

hhh454 发表于 2024-11-12 16:32:43

我也写了个画万家灯火的插件,正好有这个按类型分图元的。
分享给你,抛砖引玉。
可以按类型分,可以按图层分,可以分的有很多种。


分好的图形,为了看的清楚我加了分色,需要分色就增加图层:ngc6,ngc4
不要分色就删除2行代码


(defun c:tt()

(setq ss (ssget));多选

(command "select" ss"");选中所有
(setq ssline (ssget "p" '((0 . "LINE"))));按类型分
(command "change" ssline"" "p" "la" "ngc4" "" )

(command "select" ss "");选中所有
(setq sscircle (ssget "p" '((0 . "CIRCLE"))));按类型分
(command "change" sscircle"" "p" "la" "ngc6" "" )

)
不想复制的就下载

你有种再说一遍 发表于 2024-11-12 15:13:48

选择集的原理:
1,从索引树或堆中取出条件相同的,最左匹配
2,没有索引的,需要运算需要计算的条件,
3,聚合.

所以是不存在你说你的分别存放的,
你只能选两次.

vitalgg 发表于 2024-11-12 15:14:01

本帖最后由 vitalgg 于 2024-11-12 15:16 编辑

(progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))


(setq ssline (pickset:from-list (vl-remove-if-not '(lambda(x)(eq (entity:getdxf x 0)"LINE")) (pickset:to-list ss))))
(setq sscircle (pickset:from-list (vl-remove-if-not '(lambda(x)(eq (entity:getdxf x 0)"CIRCLE")) (pickset:to-list ss))))

;; 或
(setq ssline (pickset:get-sub ss '((0 . "LINE"))))
(setq sscircle (pickset:get-sub ss '((0 . "CIRCLE"))))


yaojing38 发表于 2024-11-12 16:06:48

(sssetfirst nil ss)
(setq ssline (ssget "P" '((0 . "LINE" ))))
(setq sscircle (ssget "P" '((0 . "circle" ))))

wzg356 发表于 2024-11-13 13:08:49

yaojing38 发表于 2024-11-12 16:06
(sssetfirst nil ss)
(setq ssline (ssget "P" '((0 . "LINE" ))))
(setq sscircle (ssget "P" '((0 . " ...

这种方式最好,比遍历ss分类高

e2002 发表于 2024-11-14 09:55:20

问题在于后续是否需要使用选择集?如果获得选择集后,就转换为 List ,然后各种循环、遍历,都使用List,SelectionSet就不需要了。毕竟 List 在 LISP ,C#中都有大把函数与方法,处理数据方便多了。

xyp1964 发表于 2024-11-14 18:41:29

(defun c:tt ()
(if (setq ss (ssget '((0 . "LINE,CIRCLE"))))
    (progn
      (setq ss-l (ssget "p" '((0 . "LINE"))))
      (command "select" ss "")
      (setq ss-c (ssget "p" '((0 . "CIRCLE"))))
    )
)
(princ)
)
页: [1] 2
查看完整版本: ssget 选择图元后 二次分类