创建辅助选择集
嘿伙计们,只是想知道如何从一个主选择集创建两个辅助选择集。
我的情况是。。我希望能够选择一组线/弧/椭圆/等,这将是两个层(层名称1H和5C)中的一个。
我希望擦除层1H上的实体,并将层5C上的实体涂成黄色。
我没有示例代码或任何东西-它正在工作。我只是希望有人能让我知道如何使用“选择集1”创建“选择集2”和“选择集3”。我知道我需要哪些过滤器。。。只是不知道如何将它们应用于第一个选择集两次。
谢谢你的帮助。 你好
收集选择集后,您可以根据需要的特定条件,按层、实体逐步遍历它。。。等
-像这样创建一个空选择集(setq s(ssadd))
-逐步遍历第一个选择集,当它符合您的条件时,将该实体名称添加到第一步中的新选择集
像这样(ssadd s)
-最后,如果您的条件与选择集实体名称一起找到,您将拥有一个新的愿望条件选择集。
祝你好运
塔瓦特 由于这两个组没有公共处理,因此最好构建两个选择集。这种方法将有一个非常简单的代码,处理速度也会更快。
(ssget "_X" '((0 . "LINE,ARC,ELLIPSE") (8 . "1H"))) ;1st selection set
(ssget "_X" '((0 . "LINE,ARC,ELLIPSE") (8 . "5C"))) ;2nd selection set
如果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>
)
)
) 由于您将使用相同的选择集用于相同的目的,因此您只需单步执行每个选择集的。
例如
(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)
)
大家好,
非常感谢您的快速回复。
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)
)
)
.... 仅供参考。
不客气,
您应该按照上面修改的方法本地化变量。 不客气。
由于只有两种情况(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)
) 我认为我误解了OP的要求。
不用担心Mircea
页:
[1]