vernonlee 发表于 2022-7-5 22:43:18

 
如果你在我的第一篇文章中提到“……(通过添加到lisp)”,我实际上是指寻找一个独立的lisp,在那里我可以输入该lisp;预定义的图层名,用于在运行lisp时隔离这些图层。
 
我希望这更清楚。

Tharwat 发表于 2022-7-5 22:47:26

看一看
 

(defun c:Test ( / lays l c n e)
;;    Tharwat 17.Nov.2014            ;;
;; --------------------------      ;;
;; Isolate a specifc list of         ;;
;; Layer names .                ;;

(setq lays '("Layer1" "Layer2" "Layer3")) ;; < Change this list of layer names to meet your needs .
(while (setq l (tblnext "LAYER" (not l)))
   (setq c (cdr (assoc 62
                     (setq e
                              (entget (tblobjname "LAYER" (setq n (cdr (assoc 2 l)))))
                     )
                )
         )
   )
   (if (member n lays)
   (if (minusp c)
       (entmod (subst (cons 62 (abs c)) (assoc 62 e) e))
   )
   (if (not (minusp c))
       (entmod (subst (cons 62 (- c)) (assoc 62 e) e))
   )
   )
)
(princ)
)

vernonlee 发表于 2022-7-5 22:50:44

 
它成功了。它确实隔离了所需的层。但是unisolate命令在“隔离”之前不会恢复原始分层设置?
 
它可以包含在你写的lisp中吗?
 
抱歉没有说清楚。
 
基本上我需要隔离一个预定义的层,在我修改了图纸后,我希望他们回到图纸“隔离”之前的状态
 
我没有提到Earler,因为我认为Unisolite命令会起作用。
 
谢谢

YZ 发表于 2022-7-5 22:55:04

有一个名为LAYERP的命令
 
它将恢复以前的图层设置。
 
我总是返回到所有层打开,但如果你有更复杂的设置,并想返回到一些被打开和一些被关闭,然后尝试LAYERP。
 
在宏开始时将变量“Expert”设置为3将阻止AutoCAD询问您是否确实要关闭当前图层。

Tharwat 发表于 2022-7-5 22:57:54

 
你可以找这样的东西吗?
 
注意:不要忘记根据您的图层名更改图层名列表。
 

(defun c:Test-1 (/ l n lst)
(setq *Lays_Status1* nil
       *Lays_Status2* nil
       l            '("Layer1" "Layer3" "Layer5")
)
(vlax-for x (vla-get-layers
               (vla-get-activedocument (vlax-get-acad-object))
             )
   (if (member (setq n (vla-get-name x)) l)
   (progn
       (setq *Lays_Status1*
            (cons (list n (vla-get-layeron x))
                  *Lays_Status1*
            )
       )
       (vla-put-layeron x :vlax-true)
   )
   (progn
       (setq *Lays_Status2*
            (cons (list n (vla-get-layeron x))
                  *Lays_Status2*
            )
       )
       (vla-put-layeron x :vlax-false)
   )
   )
)
(princ)
)
;;                                             ;;
(defun c:Test-2 (/ l n as)
(setq l '("Layer1" "Layer3" "Layer5"))
(if (and *Lays_Status1* *Lays_Status2*)
   (vlax-for x (vla-get-layers
               (vla-get-activedocument (vlax-get-acad-object))
               )
   (cond ((setq as (assoc (setq n (vla-get-name x)) *Lays_Status1*))
            (vla-put-layeron x (cadr as))
         )
         ((setq as (assoc (setq n (vla-get-name x)) *Lays_Status2*))
            (vla-put-layeron x (cadr as))
         )
   )
   )
)
(setq *Lays_Status1* nil
       *Lays_Status2* nil
)
(princ)
)(vl-load-com)

vernonlee 发表于 2022-7-5 22:59:03

 
凉的这或多或少解决了我的问题。我将为LAYERP制作另一个宏&我应该很好。万岁!!
 
顺便说一句,我检查了我的专家设置,它是0。但它仍然没有问我。
 
谢谢兄弟。

Lee Mac 发表于 2022-7-5 23:01:28

 
假设您使用的是标准版本的AutoCAD,其中LAYISO命令可用,请尝试以下操作:
(defun c:mylayiso ( / lay sel )
   (setq lay "layer1,layer2,layer3")
   (if (setq sel (ssget "_X" (list (cons 8 lay) (if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model")))))
       (command "_.layiso" sel "")
   )
   (princ)
)
然后,可以使用LAYUNISO命令来隔离层。

vernonlee 发表于 2022-7-5 23:06:47

 
谢谢塔瓦。它成功了。这将非常有用。
 
谢谢李。它也起作用。
 
我也很喜欢你的&如果你能在纸空间(布局选项卡)中使用它,那就更好了。

Tharwat 发表于 2022-7-5 23:07:44

 
对你很好-不客气。

vernonlee 发表于 2022-7-5 23:10:59

我喜欢再次打开这个线程,因为我经常发现,我遇到的层不是固定的层名称,而是共享相同名称但略有不同的层。
那么有没有可能合并一个通配符名称,例如*rev*
 
谢谢
页: 1 [2]
查看完整版本: 帮助:Lisp隔离一组