aaryan 发表于 2022-7-6 07:44:04

从选择中筛选对象

大家好,
 
我做了一个例程,其中有一个具有不同层的不同对象的选择集。
请帮助我了解如何逐步通过选择集并从特定层中拾取对象。
 
 
当做
Aaryan。

MSasu 发表于 2022-7-6 07:58:03

您应该查看SSNAME和ENTGET函数;该层存储在DXF代码8下。
 
或者,当创建选择集时,可以仅过滤特定层中的实体:
(ssget "_X" (list (cons 8 MyLayer)))

aaryan 发表于 2022-7-6 08:10:58

谢谢你Mircea
 
但我想从选择集中选择一个对象,并将其保存为变量以供进一步使用。我不能使用
ssget "X"功能,因为我必须选择具有不同层的多个对象。到目前为止,我做了如下工作。
 
(defun c:test(/ Objectlist)
(prompt "\nSelect Objects to generate")
(setq sel1 (ssget '((0 . "POLYLINE,LWPOLYLINE") (8 . "Xpro,Fpro,Cpro"))))
(setq cntr 0
Objectlist '())
(repeat (sslength sel1)
   (setq entityname (ssname sel1 cntr)
Objectlist (append (list entityname) Objectlist))
   (setq cntr (1+ cntr)))
   
(setq check (mapcar '(lambda (a) (= (cdr (assoc 8 (entget a))) "Fpro")) Objectlist))
(princ))
 
我只需要check变量将对象保存在层Fpro中
请做需要的事
 
当做
Aaryan公司

MSasu 发表于 2022-7-6 08:15:14

您可以在解析选择集时创建列表-只需保留来自所述层的项目:
(defun c:test( / Objectlist sel1 cntr check )
(prompt "\nSelect Objects to generate")
(setq sel1 (ssget '((0 . "POLYLINE,LWPOLYLINE") (8 . "Xpro,Fpro,Cpro"))))
(setq cntr 0
       Objectlist '()
      check '())
(repeat (sslength sel1)
   (setq entityname (ssname sel1 cntr))
    (if (= (strcase (cdr (assoc 8 (entget entityname)))) "FPRO")
   (setq check (append (list entityname) check))
    )
    (setq Objectlist (append (list entityname) Objectlist))

   (setq cntr (1+ cntr)))

(princ))

MSasu 发表于 2022-7-6 08:29:52

如果要直接从主列表处理:
(setq check (vl-remove-if-not '(lambda(x) (= (strcase (cdr (assoc 8 (entget x)))) "FPRO"))
                              Objectlist))
 
或:
(setq check (vl-remove-if '(lambda(x) (/= (strcase (cdr (assoc 8 (entget x)))) "FPRO"))
                         Objectlist))

aaryan 发表于 2022-7-6 08:42:40

非常感谢米尔恰。
现在清楚了。
 
当做
Aaryan公司

MSasu 发表于 2022-7-6 08:52:30

很高兴听你这么说Aaryan。不客气!
页: [1]
查看完整版本: 从选择中筛选对象