lamensterms 发表于 2022-7-6 07:37:22

创建辅助选择集

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

Tharwat 发表于 2022-7-6 07:50:34

你好
 
收集选择集后,您可以根据需要的特定条件,按层、实体逐步遍历它。。。等
 
-像这样创建一个空选择集(setq s(ssadd))
-逐步遍历第一个选择集,当它符合您的条件时,将该实体名称添加到第一步中的新选择集
像这样(ssadd s)
-最后,如果您的条件与选择集实体名称一起找到,您将拥有一个新的愿望条件选择集。
 
祝你好运
 
塔瓦特

MSasu 发表于 2022-7-6 07:53:32

由于这两个组没有公共处理,因此最好构建两个选择集。这种方法将有一个非常简单的代码,处理速度也会更快。
(ssget "_X" '((0 . "LINE,ARC,ELLIPSE") (8 . "1H")))   ;1st selection set
(ssget "_X" '((0 . "LINE,ARC,ELLIPSE") (8 . "5C")))   ;2nd selection set

Lee Mac 发表于 2022-7-6 08:00:56

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

Tharwat 发表于 2022-7-6 08:07:09

由于您将使用相同的选择集用于相同的目的,因此您只需单步执行每个选择集的。
 
例如
 

(if (setq ss (ssget "_:L" '((0 . "LINE,ARC,ELLIPSE")(8 . "1H,5C"))))
(repeat (setq i (sslength ss))
   (setq sn (ssname ss (setq i (1- i))))
   (setq l (cdr (assoc 8 (setq e (entget sn)))))
   (cond ((eq l "H1") (entdel sn))
         ((eq l "5C")
          (if (cdr (assoc 62 e))
            (entmod (subst (cons 62 2) (assoc 62 e) e))
            (entmod (append e (list (cons 62 2))))
          )
         )
   )
)
(princ)
)

lamensterms 发表于 2022-7-6 08:14:37

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

Tharwat 发表于 2022-7-6 08:19:45

 
不客气,
 
您应该按照上面修改的方法本地化变量。

Lee Mac 发表于 2022-7-6 08:26:29

不客气。
 
由于只有两种情况(1H或5C),我认为if语句比cond更合适(更可读),代码可以缩短为:
 
(defun c:doit ( / e i l s )
   (if (setq s (ssget "_:L" '((0 . "LINE,ARC,ELLIPSE") (8 . "1H,5C"))))
       (repeat (setq i (sslength s))
         (setq e (ssname s (setq i (1- i)))
               l (entget e)
         )
         (if (= "1H" (cdr (assoc 8 l)))
               (entdel e)
               (entmod (append l '((62 . 2))))
         )
       )
   )
   (princ)
)或者,如果要嵌套表达式:
 
(defun c:doit ( / e i l s )
   (if (setq s (ssget "_:L" '((0 . "LINE,ARC,ELLIPSE") (8 . "1H,5C"))))
       (repeat (setq i (sslength s))
         (if (= "1H" (cdr (assoc 8 (setq l (entget (setq e (ssname s (setq i (1- i)))))))))
               (entdel e)
               (entmod (append l '((62 . 2))))
         )
       )
   )
   (princ)
)

MSasu 发表于 2022-7-6 08:35:36

我认为我误解了OP的要求。

Lee Mac 发表于 2022-7-6 08:42:49

 
不用担心Mircea
页: [1]
查看完整版本: 创建辅助选择集