删除LISP中的图层
这是通过论坛上的另一个帖子引起我注意的,在搜索了论坛后,我只能找到VBA解决方案。我的问题是如何删除层?
看起来很简单,(我可能错过了什么,所以可能是…),但我不太明白。
我试过这个:
(entdel (tblobjname "LAYER" "Layerx"))
但我认为这行不通,正如你可能已经猜到的那样——它行不通。
我们一如既往地感谢您在这件事上的任何帮助,我感谢您花时间阅读这篇文章。
干杯
李 您已经可以通过Express Tools和Layer Delete命令来实现这一点。它将擦除层上的所有内容,然后删除层本身。有什么理由重新发明轮子吗?或者我在这里遗漏了什么? 嗯,它需要在另一个LISP函数中使用,而express tools在另一个LISP中无法访问。
但是,tbh,我实际上并不知道这个工具的存在,所以我将看看它背后的LISP并从中学习。
谢谢你的提醒
编辑:在Express Tools中找不到删除层LISP (vl-catch-all-apply
'vla-Delete
(list (vlax-ename->vla-object (tblobjname "LAYER" "Layerx"))
)
)
神奇的VovKa,
谢谢你抽出时间。 带有一些错误消息:
(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 非常感谢您的代码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
函数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对象出错,例如程序终止时出错。 感谢阿斯米的解释-非常感谢您的时间。
干杯
李
页:
[1]