Lee Mac 发表于 2022-7-6 15:17:34

删除LISP中的图层

这是通过论坛上的另一个帖子引起我注意的,在搜索了论坛后,我只能找到VBA解决方案。
 
我的问题是如何删除层?
 
看起来很简单,(我可能错过了什么,所以可能是…),但我不太明白。
 
我试过这个:
 

(entdel (tblobjname "LAYER" "Layerx"))

 
但我认为这行不通,正如你可能已经猜到的那样——它行不通。
 
我们一如既往地感谢您在这件事上的任何帮助,我感谢您花时间阅读这篇文章。
 
干杯
 

ReMark 发表于 2022-7-6 15:30:03

您已经可以通过Express Tools和Layer Delete命令来实现这一点。它将擦除层上的所有内容,然后删除层本身。有什么理由重新发明轮子吗?或者我在这里遗漏了什么?

Lee Mac 发表于 2022-7-6 15:36:11

嗯,它需要在另一个LISP函数中使用,而express tools在另一个LISP中无法访问。
 
但是,tbh,我实际上并不知道这个工具的存在,所以我将看看它背后的LISP并从中学习。
 
谢谢你的提醒
 
编辑:在Express Tools中找不到删除层LISP

VovKa 发表于 2022-7-6 15:44:59

(vl-catch-all-apply
   'vla-Delete
   (list (vlax-ename->vla-object (tblobjname "LAYER" "Layerx"))
   )
)

Lee Mac 发表于 2022-7-6 15:52:08

神奇的VovKa,
 
谢谢你抽出时间。

ASMI 发表于 2022-7-6 16:02:05

带有一些错误消息:
 
(defun DeleteLayer(Name / layCol dLay oVal)
(vl-load-com)
(if
   (and
   (/= Name "0")
   (/= (strcat Name)(getvar "CLAYER"))
   ); end or
   (progn
   (setq layCol(vla-get-Layers
          (vla-get-ActiveDocument
              (vlax-get-acad-object))))
      (if(vl-catch-all-error-p
          (setq dLay(vl-catch-all-apply 'vla-Item
   (list layCol(strcat Name)))))
      (princ "\nLayer does not exist! ")
          (if(vl-catch-all-error-p
      (vl-catch-all-apply 'vla-Delete
         (list dLay)))
   (princ "\nCan't delete layer in use! ")
   (setq oVal T)
); end if
       ); end if
   ); end progn
   (princ "\nCan't delete active layer or layer \"0\"! ")
); end if
oVal
); end of DeleteLayer

Lee Mac 发表于 2022-7-6 16:06:00

非常感谢您的代码ASMI-其中有许多错误陷阱可以提供帮助。
 
我试图剖析您的代码,以了解其背后的VL(因为我现在正在努力学习VL)。。。
 
请您告诉我我的注释是否正确,或者如果我错了请纠正我好吗。。。
 

(defun DeleteLayer(Name / layCol dLay oVal)
(vl-load-com)
(if
   (and
   (/= Name "0") ; Check its not Layer 0
   (/= (strcat Name)(getvar "CLAYER")) ; Check its not Current Layer
   ); end or
   (progn
   (setq layCol(vla-get-Layers
         (vla-get-ActiveDocument
             (vlax-get-acad-object)))) ; Retrieve Current Layer Collection
      (if(vl-catch-all-error-p
          (setq dLay(vl-catch-all-apply 'vla-Item
      (list layCol(strcat Name))))) ; Retrieve Layer Object Name from Layer Collection? (same as tblobjname?)
      (princ "\nLayer does not exist! ") ; If vl-catch-all-error-p returns T, then Layer Doesn't Exist
          (if(vl-catch-all-error-p
         (vl-catch-all-apply 'vla-Delete
            (list dLay))) ; If Possible, Delete the Layer
      (princ "\nCan't delete layer in use! ") ; If vl-catch-all-error-p returns T, then Layer Cannot be Deleted.
      (setq oVal T)
    ); end if
       ); end if
   ); end progn
   (princ "\nCan't delete active layer or layer \"0\"! ")
); end if
oVal
); end of DeleteLayer

ASMI 发表于 2022-7-6 16:10:31

函数vl catch all apply可以返回或返回一些成功值或错误对象#。它可以被vl-catch-all-error-p函数捕获或用vl-catch-all错误消息函数解码。在命令行中尝试:
 
Command: (setq Val(vl-catch-all-apply '/ (list 2 0)))
#<%catch-all-apply-error%>

Command: (vl-catch-all-error-p Val)
T

Command: (vl-catch-all-error-message Val)
"divide by zero"
 
这种设计通常用于防止ActiveX对象出错,例如程序终止时出错。

Lee Mac 发表于 2022-7-6 16:19:03

感谢阿斯米的解释-非常感谢您的时间。
 
干杯
 
页: [1]
查看完整版本: 删除LISP中的图层