乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 40|回复: 8

[编程交流] 删除LISP中的图层

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:17:34 | 显示全部楼层 |阅读模式
这是通过论坛上的另一个帖子引起我注意的,在搜索了论坛后,我只能找到VBA解决方案。
 
我的问题是如何删除层?
 
看起来很简单,(我可能错过了什么,所以可能是…),但我不太明白。
 
我试过这个:
 
  1. (entdel (tblobjname "LAYER" "Layerx"))

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

使用道具 举报

10

主题

8258

帖子

8335

银币

初来乍到

Rank: 1

铜币
31
发表于 2022-7-6 15:30:03 | 显示全部楼层
您已经可以通过Express Tools和Layer Delete命令来实现这一点。它将擦除层上的所有内容,然后删除层本身。有什么理由重新发明轮子吗?或者我在这里遗漏了什么?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:36:11 | 显示全部楼层
嗯,它需要在另一个LISP函数中使用,而express tools在另一个LISP中无法访问。
 
但是,tbh,我实际上并不知道这个工具的存在,所以我将看看它背后的LISP并从中学习。
 
谢谢你的提醒
 
编辑:在Express Tools中找不到删除层LISP
回复

使用道具 举报

9

主题

383

帖子

82

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
355
发表于 2022-7-6 15:44:59 | 显示全部楼层
  1. (vl-catch-all-apply
  2.    'vla-Delete
  3.    (list (vlax-ename->vla-object (tblobjname "LAYER" "Layerx"))
  4.    )
  5. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:52:08 | 显示全部楼层
神奇的VovKa,
 
谢谢你抽出时间。
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 16:02:05 | 显示全部楼层
带有一些错误消息:
 
  1. (defun DeleteLayer(Name / layCol dLay oVal)
  2. (vl-load-com)
  3. (if
  4.    (and
  5.      (/= Name "0")
  6.      (/= (strcat Name)(getvar "CLAYER"))
  7.      ); end or
  8.    (progn
  9.      (setq layCol(vla-get-Layers
  10.             (vla-get-ActiveDocument
  11.               (vlax-get-acad-object))))
  12.       (if(vl-catch-all-error-p
  13.           (setq dLay(vl-catch-all-apply 'vla-Item
  14.      (list layCol(strcat Name)))))
  15.         (princ "\nLayer does not exist! ")
  16.           (if(vl-catch-all-error-p
  17.       (vl-catch-all-apply 'vla-Delete
  18.          (list dLay)))
  19.      (princ "\nCan't delete layer in use! ")
  20.    (setq oVal T)
  21. ); end if
  22.        ); end if
  23.      ); end progn
  24.    (princ "\nCan't delete active layer or layer "0"! ")
  25.   ); end if
  26. oVal
  27. ); end of DeleteLayer
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 16:06:00 | 显示全部楼层
非常感谢您的代码ASMI-其中有许多错误陷阱可以提供帮助。
 
我试图剖析您的代码,以了解其背后的VL(因为我现在正在努力学习VL)。。。
 
请您告诉我我的注释是否正确,或者如果我错了请纠正我好吗。。。
 
  1. (defun DeleteLayer(Name / layCol dLay oVal)
  2. (vl-load-com)
  3. (if
  4.    (and
  5.      (/= Name "0") ; [b][color=Red]Check its not Layer 0[/color][/b]
  6.      (/= (strcat Name)(getvar "CLAYER")) ; [b][color=Red]Check its not Current Layer[/color][/b]
  7.      ); end or
  8.    (progn
  9.      (setq layCol(vla-get-Layers
  10.            (vla-get-ActiveDocument
  11.              (vlax-get-acad-object)))) ; [b][color=Red]Retrieve Current Layer Collection[/color][/b]
  12.       (if(vl-catch-all-error-p
  13.           (setq dLay(vl-catch-all-apply 'vla-Item
  14.         (list layCol(strcat Name))))) ; [b][color=Red]Retrieve Layer Object Name from Layer Collection?[/color][/b][color=Red][i] [b][color=SeaGreen](same as tblobjname?)[/color][/b][/i][/color]
  15.         (princ "\nLayer does not exist! ") ; [b][color=Red]If [i][color=SeaGreen]vl-catch-all-error-p[/color][/i] returns [color=Blue]T[/color], then Layer Doesn't Exist[/color][/b]
  16.           (if(vl-catch-all-error-p
  17.          (vl-catch-all-apply 'vla-Delete
  18.             (list dLay))) [b][color=Red]; If Possible, Delete the Layer[/color][/b]
  19.         (princ "\nCan't delete layer in use! ") ; [b][color=Red]If[/color][/b] [b][i][color=SeaGreen]vl-catch-all-error-p[/color][/i][color=ReD] returns[/color] [color=Blue]T[/color][color=Red], then Layer Cannot be Deleted. [/color][/b]
  20.       (setq oVal T)
  21.     ); end if
  22.        ); end if
  23.      ); end progn
  24.    (princ "\nCan't delete active layer or layer "0"! ")
  25.   ); end if
  26. oVal
  27. ); end of DeleteLayer
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 16:10:31 | 显示全部楼层
函数vl catch all apply可以返回或返回一些成功值或错误对象#。它可以被vl-catch-all-error-p函数捕获或用vl-catch-all错误消息函数解码。在命令行中尝试:
 
  1. Command: (setq Val(vl-catch-all-apply '/ (list 2 0)))
  2. #<%catch-all-apply-error%>
  3. Command: (vl-catch-all-error-p Val)
  4. T
  5. Command: (vl-catch-all-error-message Val)
  6. "divide by zero"

 
这种设计通常用于防止ActiveX对象出错,例如程序终止时出错。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 16:19:03 | 显示全部楼层
感谢阿斯米的解释-非常感谢您的时间。
 
干杯
 
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 21:26 , Processed in 0.671122 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表