明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 785|回复: 16

[提问] ssget 选择图元后 二次分类

[复制链接]
发表于 2024-11-12 14:37:54 | 显示全部楼层 |阅读模式
各位:
      请问一下 通过(setq ss (ssget'((0 . "LINE,CIRCLE")) ))选择图元后,如保再将 line  circle 分类保存到变量 ssline  sscircle中

发表于 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")) ))
回复 支持 1 反对 0

使用道具 举报

发表于 2024-11-12 16:38:42 | 显示全部楼层
本帖最后由 kozmosovia 于 2024-11-12 16:43 编辑

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

回复 支持 1 反对 0

使用道具 举报

发表于 2024-11-12 16:32:43 | 显示全部楼层
我也写了个画万家灯火的插件,正好有这个按类型分图元的。
分享给你,抛砖引玉。
可以按类型分,可以按图层分,可以分的有很多种。


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


  1. (defun c:tt()
  2.   
  3.   (setq ss (ssget));多选

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

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

不想复制的就下载

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-11-12 15:13:48 | 显示全部楼层
选择集的原理:
1,从索引树或堆中取出条件相同的,最左匹配
2,没有索引的,需要运算需要计算的条件,
3,聚合.

所以是不存在你说你的分别存放的,
你只能选两次.
发表于 2024-11-12 15:14:01 | 显示全部楼层
本帖最后由 vitalgg 于 2024-11-12 15:16 编辑

  1. (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))))


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

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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-11-12 16:06:48 | 显示全部楼层
(sssetfirst nil ss)
(setq ssline (ssget "P" '((0 . "LINE" ))))
(setq sscircle (ssget "P" '((0 . "circle" ))))

点评

不对的,选circle前还得(sssetfirst nil ss) 才行  发表于 2024-11-12 16:22
发表于 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分类高
发表于 2024-11-14 09:55:20 | 显示全部楼层
问题在于后续是否需要使用选择集?如果获得选择集后,就转换为 List ,然后各种循环、遍历,都使用List,SelectionSet就不需要了。毕竟 List 在 LISP ,C#中都有大把函数与方法,处理数据方便多了。
发表于 2024-11-14 18:41:29 | 显示全部楼层
  1. (defun c:tt ()
  2.   (if (setq ss (ssget '((0 . "LINE,CIRCLE"))))
  3.     (progn
  4.       (setq ss-l (ssget "p" '((0 . "LINE"))))
  5.       (command "select" ss "")
  6.       (setq ss-c (ssget "p" '((0 . "CIRCLE"))))
  7.     )
  8.   )
  9.   (princ)
  10. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 09:53 , Processed in 0.222815 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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