ssget 选择图元后 二次分类
各位:请问一下 通过(setq ss (ssget'((0 . "LINE,CIRCLE")) ))选择图元后,如保再将 linecircle 分类保存到变量 sslinesscircle中
本帖最后由 咏郡 于 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: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
)
)
)
)
我也写了个画万家灯火的插件,正好有这个按类型分图元的。
分享给你,抛砖引玉。
可以按类型分,可以按图层分,可以分的有很多种。
分好的图形,为了看的清楚我加了分色,需要分色就增加图层: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" "" )
)
不想复制的就下载
选择集的原理:
1,从索引树或堆中取出条件相同的,最左匹配
2,没有索引的,需要运算需要计算的条件,
3,聚合.
所以是不存在你说你的分别存放的,
你只能选两次. 本帖最后由 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"))))
(sssetfirst nil ss)
(setq ssline (ssget "P" '((0 . "LINE" ))))
(setq sscircle (ssget "P" '((0 . "circle" )))) yaojing38 发表于 2024-11-12 16:06
(sssetfirst nil ss)
(setq ssline (ssget "P" '((0 . "LINE" ))))
(setq sscircle (ssget "P" '((0 . " ...
这种方式最好,比遍历ss分类高 问题在于后续是否需要使用选择集?如果获得选择集后,就转换为 List ,然后各种循环、遍历,都使用List,SelectionSet就不需要了。毕竟 List 在 LISP ,C#中都有大把函数与方法,处理数据方便多了。 (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