乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 22|回复: 9

[编程交流] 创建辅助选择集

[复制链接]

77

主题

298

帖子

232

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
394
发表于 2022-7-6 07:37:22 | 显示全部楼层 |阅读模式
嘿伙计们,
 
只是想知道如何从一个主选择集创建两个辅助选择集。
 
我的情况是。。我希望能够选择一组线/弧/椭圆/等,这将是两个层(层名称1H和5C)中的一个。
 
我希望擦除层1H上的实体,并将层5C上的实体涂成黄色。
 
我没有示例代码或任何东西-它正在工作。我只是希望有人能让我知道如何使用“选择集1”创建“选择集2”和“选择集3”。我知道我需要哪些过滤器。。。只是不知道如何将它们应用于第一个选择集两次。
 
谢谢你的帮助。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 07:50:34 | 显示全部楼层
你好
 
收集选择集后,您可以根据需要的特定条件,按层、实体逐步遍历它。。。等
 
-像这样创建一个空选择集(setq s(ssadd))
-逐步遍历第一个选择集,当它符合您的条件时,将该实体名称添加到第一步中的新选择集
像这样(ssadd s)
-最后,如果您的条件与选择集实体名称一起找到,您将拥有一个新的愿望条件选择集。
 
祝你好运
 
塔瓦特
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 07:53:32 | 显示全部楼层
由于这两个组没有公共处理,因此最好构建两个选择集。这种方法将有一个非常简单的代码,处理速度也会更快。
  1. (ssget "_X" '((0 . "LINE,ARC,ELLIPSE") (8 . "1H")))   ;1st selection set
  2. (ssget "_X" '((0 . "LINE,ARC,ELLIPSE") (8 . "5C")))   ;2nd selection set
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:00:56 | 显示全部楼层
 
如果OP希望对每个相应层上的所有对象进行操作,则该方法将是合适的。
 
如果OP希望手动选择每个层上的多个对象,我会将初始集限制为仅允许任何一层“1H”或“5C”上的对象,然后在迭代集合时使用if语句来确定如何根据其层处理每个对象。
 
此外,请注意,通过使用“_X”模式字符串收集两个选择集,整个图形数据库将被遍历两次以检索这些集,然后分别处理这些集。
 
对于这种特殊情况,我倾向于使用以下内容:
 
  1. (if (setq s (ssget "_:L" '((0 . "LINE,ARC,ELLIPSE") (8 . "1H,5C"))))
  2.    (repeat (setq i (sslength s))
  3.        (setq e (ssname s (setq i (1- i)))
  4.              l (entget e)
  5.        )
  6.        (if (= "1H" (cdr (assoc 8 l)))
  7.            <do something>
  8.            <do something else>
  9.        )
  10.    )
  11. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 08:07:09 | 显示全部楼层
由于您将使用相同的选择集用于相同的目的,因此您只需单步执行每个选择集的。
 
例如
 
  1. (if (setq ss (ssget "_:L" '((0 . "LINE,ARC,ELLIPSE")(8 . "1H,5C"))))
  2. (repeat (setq i (sslength ss))
  3.    (setq sn (ssname ss (setq i (1- i))))
  4.    (setq l (cdr (assoc 8 (setq e (entget sn)))))
  5.    (cond ((eq l "H1") (entdel sn))
  6.          ((eq l "5C")
  7.           (if (cdr (assoc 62 e))
  8.             (entmod (subst (cons 62 2) (assoc 62 e) e))
  9.             (entmod (append e (list (cons 62 2))))
  10.           )
  11.          )
  12.    )
  13. )
  14. (princ)
  15. )
回复

使用道具 举报

77

主题

298

帖子

232

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
394
发表于 2022-7-6 08:14:37 | 显示全部楼层
大家好,
 
非常感谢您的快速回复。
 
Tharwat-我设法让你的日常生活完全符合我的需要(我认为)。代码有点太复杂了,我无法理解,但它确实有效,谢谢你。
 
同样感谢李,我不知道如何将这些操作应用到你的代码中。我还有很多东西要用LISP学习,但我发现学习LISP的时间越来越少了。
 
再次感谢大家。
 
  1. (DEFUN C:TEST ()
  2. (if (setq ss (ssget "_:L" '((0 . "LINE,ARC,ELLIPSE")(8 . "1H,5C"))))
  3. (repeat (setq i (sslength ss))
  4.    (setq sn (ssname ss (setq i (1- i))))
  5.    (setq l (cdr (assoc 8 (setq e (entget sn)))))
  6.    (cond ((eq l "1H") (entdel sn))
  7.          ((eq l "5C")
  8.           (if (cdr (assoc 62 e))
  9.             (entmod (subst (cons 62 2) (assoc 62 e) e))
  10.             (entmod (append e (list (cons 62 2))))
  11.           )
  12.          )
  13.    )
  14. )
  15. (princ)
  16. )
  17. )

 
.... 仅供参考。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 08:19:45 | 显示全部楼层
 
不客气,
 
您应该按照上面修改的方法本地化变量。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:26:29 | 显示全部楼层
不客气。
 
由于只有两种情况(1H或5C),我认为if语句比cond更合适(更可读),代码可以缩短为:
 
  1. (defun c:doit ( / e i l s )
  2.    (if (setq s (ssget "_:L" '((0 . "LINE,ARC,ELLIPSE") (8 . "1H,5C"))))
  3.        (repeat (setq i (sslength s))
  4.            (setq e (ssname s (setq i (1- i)))
  5.                  l (entget e)
  6.            )
  7.            (if (= "1H" (cdr (assoc 8 l)))
  8.                (entdel e)
  9.                (entmod (append l '((62 . 2))))
  10.            )
  11.        )
  12.    )
  13.    (princ)
  14. )
或者,如果要嵌套表达式:
 
  1. (defun c:doit ( / e i l s )
  2.    (if (setq s (ssget "_:L" '((0 . "LINE,ARC,ELLIPSE") (8 . "1H,5C"))))
  3.        (repeat (setq i (sslength s))
  4.            (if (= "1H" (cdr (assoc 8 (setq l (entget (setq e (ssname s (setq i (1- i)))))))))
  5.                (entdel e)
  6.                (entmod (append l '((62 . 2))))
  7.            )
  8.        )
  9.    )
  10.    (princ)
  11. )
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:35:36 | 显示全部楼层
我认为我误解了OP的要求。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:42:49 | 显示全部楼层
 
不用担心Mircea
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-15 07:45 , Processed in 1.644001 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表