明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2753|回复: 20

[提问] 求大神帮我修改下lisp代码,chatgpt写的在cad报错.

[复制链接]
发表于 2023-3-8 15:06:53 | 显示全部楼层 |阅读模式
11明经币
本帖最后由 轻尘 于 2023-3-9 12:54 编辑

脚本需求:作为专业间提资,需要多重分解在0-GPS图层上的块,然后保留含有*vp*关键字图层上的图元并删除其余图元。chatgpt最终代码如下:
  1. (defun unlock-all-layers() ;定义一个函数,解锁所有图层
  2. (setq layers (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))) ;获取所有图层
  3. (vla-foreach layer layers ;遍历所有图层
  4. (vla-put-locked layer :vlax-false) ;将图层锁定状态改为false
  5. )
  6. )

  7. (defun explode-gps-blocks() ;定义一个函数,多次分解在0-GPS图层上的块,直到不再有0-GPS图层的块
  8. (setq blkref (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))) ;获取当前文档中所有块参照
  9. (setq blkrefcount (vla-get-count blkref)) ;获取块参照数量
  10. (setq gpslayer (vl-catch-all-apply 'vla-getlayer (list "0-GPS"))) ;获取名为"0-GPS"的图层
  11. (setq i 0) ;初始化计数器i
  12. (while (< i blkrefcount) ;循环遍历所有块参照
  13. (setq curblkref (vla-item blkref i)) ;获取当前块参照
  14. (if (eq (vla-get-layer curblkref) gpslayer) ;判断当前块参照是否在"0-GPS"图层上
  15. (progn ;如果在"0-GPS"图层上
  16. (vl-catch-all-apply 'vla-explode (list curblkref)) ;执行块参照分解操作
  17. (setq i -1) ;将计数器i设为-1,下一轮循环重新开始
  18. )
  19. )
  20. (setq i (+ i 1)) ;计数器i加1
  21. )
  22. )

  23. (defun delete-objects-without-vp() ;定义一个函数,删除不含有vp关键字的图层上的图元对象
  24. (setq layers (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))) ;获取所有图层
  25. (vla-foreach layer layers ;遍历所有图层
  26. (setq layername (vla-get-name layer)) ;获取图层名
  27. (if (not (vl-string-search "vp" layername)) ;判断图层名中是否含有"vp"关键字
  28. (progn ;如果不含有"vp"关键字
  29. (setq objects (vla-get-objects layer)) ;获取当前图层上的所有图元对象
  30. (vla-foreach obj objects ;遍历所有图元对象
  31. (vla-delete obj)) ;删除当前图元对象
  32. )
  33. )
  34. )
  35. )

  36. (unlock-all-layers) ;解锁所有图层
  37. (repeat 100 ;执行100次以下操作
  38. (explode-gps-blocks) ;多次分解在0-GPS图层上的块,直到不再有0-GPS图层的块
  39. )
  40. (delete-objects-without-vp) ;删除不含有vp关键字的图层上的图元对象

最佳答案

查看完整内容

试试,先保存图哈,不保证不崩溃
发表于 2023-3-8 15:06:54 | 显示全部楼层
试试,先保存图哈,不保证不崩溃
  1. (defun c:tt (/ allx ss n)
  2.   (defun allx (blkobj / lst lst1)
  3.     (setq lst (vlax-safearray->list
  4.     (vlax-variant-value (vla-explode blkobj))
  5.     )
  6.     )
  7.     (vla-delete blkobj)
  8.     (foreach n lst
  9.       (if (equal (vla-get-ObjectName n) "AcDbBlockReference")
  10.   (allx n)
  11.   (if (null (vl-string-search "vp" (vla-get-layer n)))
  12.     (vla-delete n)
  13.     )
  14.   )
  15.       )
  16.     )
  17.   (setq ss (ssget "x" '((0 . "INSERT") (8 . "0-GPS"))))
  18.   (repeat (setq n (sslength ss))
  19.     (setq blkobj (vlax-ename->vla-object (ssname ss (setq n (1- n)))))
  20.     (allx blkobj)
  21.     )
  22.   )


回复

使用道具 举报

发表于 2023-3-8 17:17:41 来自手机 | 显示全部楼层
牛逼,我们落伍了
回复

使用道具 举报

发表于 2023-3-8 17:23:48 来自手机 | 显示全部楼层
告诉它运行错误,修改看看
回复

使用道具 举报

 楼主| 发表于 2023-3-8 17:39:06 | 显示全部楼层
wzg356 发表于 2023-3-8 17:23
告诉它运行错误,修改看看

试了还是不行,我百度应该是括号的问题。
回复

使用道具 举报

发表于 2023-3-8 21:25:32 来自手机 | 显示全部楼层
什么叫不删除关键字vp得图元
回复

使用道具 举报

发表于 2023-3-8 22:22:55 | 显示全部楼层
第一个defun确实少了个括号 ,内容没有测试
回复

使用道具 举报

 楼主| 发表于 2023-3-9 10:16:47 | 显示全部楼层
liuhe 发表于 2023-3-8 21:25
什么叫不删除关键字vp得图元

就是图层名中包含vp的图元例如P-VPIPE-W
回复

使用道具 举报

发表于 2023-3-9 19:57:09 来自手机 | 显示全部楼层
轻尘 发表于 2023-3-9 10:16
就是图层名中包含vp的图元例如P-VPIPE-W

图元名是自动生成的编码。你怎么标记的?你说的是块名?扩展数据?上个图纸看看呗
回复

使用道具 举报

发表于 2023-3-9 20:29:19 来自手机 | 显示全部楼层
liuhe 发表于 2023-3-9 19:57
图元名是自动生成的编码。你怎么标记的?你说的是块名?扩展数据?上个图纸看看呗

那句话,就一闪而过的纳闷
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-23 12:52 , Processed in 0.200617 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表