Manila Wolf 发表于 2022-7-6 08:10:01

基于块隔离层

有没有人有lisp可以隔离或关闭所有绘制了某个名称块的图层?除非它是当前层。
 
例如,我有多个层,层上有一个名为“PartTag”的块。我想用一个单一的点击关闭(或冻结)所有层在这个块驻留。
 
谢谢任何能帮上忙的人

Lee Mac 发表于 2022-7-6 08:13:57

尝试以下操作:
 
(defun c:TurnOffBlockLayers ( / en in la ls ss )
   (while
       (progn (setvar 'ERRNO 0) (setq en (car (entsel "\nSelect Block: ")))
         (cond
               (   (= 7 (getvar 'ERRNO))
                   (princ "\nMissed, try again.")
               )
               (   (eq 'ENAME (type en))
                   (if (not (eq "INSERT" (cdr (assoc 0 (entget en)))))
                     (princ "\nObject is not a Block.")
                   )
               )
         )
       )
   )
   (if en
       (progn
         (setq ss
               (ssget "_X"
                   (list
                      '(0 . "INSERT")
                     (assoc 2 (entget en))
                     (cons 410
                           (if (= 1 (getvar 'CVPORT))
                               (getvar 'CTAB)
                               "Model"
                           )
                     )
                   )
               )
         )
         (repeat (setq in (sslength ss))
               (setq la (cdr (assoc 8 (entget (ssname ss (setq in (1- in)))))))
               (if (not (member la ls))
                   (setq ls (cons la ls))
               )
         )
         (foreach la ls
               (setq la (entget (tblobjname "LAYER" la)))
               (entmod
                   (subst
                     (cons 62 (- (abs (cdr (assoc 62 la)))))
                     (assoc 62 la)
                     la
                   )
               )
         )
       )
   )
   (princ)
)

David Bethel 发表于 2022-7-6 08:18:24

或者更野蛮一点:
 
 

(defun c:offins (/ ss is en ln ll)
(while (or (not ss)
            (/= (sslength ss) 1))
      (princ "\nSelect INSERT:   ")
      (setq ss (ssget '((0 . "INSERT")))))

(setq is (ssget "X" (list (cons 0 "INSERT")
                           (assoc 2 (entget (ssname ss 0))))))

(while (setq en (ssname is 0))
      (setq ln (cdr (assoc 8 (entget en))))
      (and (/= ln (getvar "CLAYER"))
             (not (member ln ll))
             (setq ll (cons ln ll)))
      (ssdel en is))

(command "_.LAYER")
(foreach l ll
    (command "_Off" l))
(command "")
(prin1))

-大卫

pBe 发表于 2022-7-6 08:23:56

 
诡异的
 

David Bethel 发表于 2022-7-6 08:25:10

你死定了!
 
格罗奥安恩

Manila Wolf 发表于 2022-7-6 08:32:23

李和大卫,
 
非常感谢这两个版本回答了我的请求。
 
为我节省了更多的时间,所以我真的很感激。
 

Lee Mac 发表于 2022-7-6 08:35:02

非常欢迎你,马尼拉·沃尔夫

Manila Wolf 发表于 2022-7-6 08:39:16

大家好,
 
我经常使用这些LISP,但偶然遇到AutoCAD异常。
我在toolbutton宏中调用David的“Offins”lisp,在选择块以使块图层成为当前图层后,使用AutoCAD的select previous功能选择lisp。这确实有效,除非我在绘图中有数百个块。AutoCAD抛出了以下语句:-
 
选择对象:p
1067已找到
选择对象:
用户输入太长。
 
我的目标是单击一个块,使选定块所在的层位于当前层上,然后关闭该块所在的所有其他层,但保持当前层处于打开状态。
 
我怀疑AutoCAD对上一个命令可以调用的对象数量的限制是硬固定的,那么有没有一种方法可以简单地调整lisp以执行我想要的操作?

pBe 发表于 2022-7-6 08:41:28

 
您是否在offins命令中传递“P”?

Manila Wolf 发表于 2022-7-6 08:46:58

 
你好,PBe,
 
我在调用offins命令后调用“P”。这是我的宏:-(哈哈哈-别笑。它几乎成功了)。
 
^C^C_e;all;;oops;_atttaglay p;;-layer u *;;_layon;(setq ss1 (ssget));\;_ai_molc;!ss1;E !ss1;;oops;_offins p;;_laylock;p;;-layer LO 0;;
 
“p”不适用于TurnOffBlockLayers lisp。
页: [1] 2
查看完整版本: 基于块隔离层