明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 936|回复: 7

deepseek编写图层合并代码

  [复制链接]
发表于 2025-2-11 13:04:01 | 显示全部楼层 |阅读模式
尝试用deepseek编写一个lisp插件,居然一次成功了,很惊喜,分享一下

向deepseek提的问题是:用autolisp编写一个图层合并的插件,1、选中要合并图层的图元,获得图元图层1。2,选中合并到图层的图元,获得合并到的图层2。3、全选图层1图元,如果图层锁定,则解锁后再选中。4、将选中图元的图层设置为图层2。5、删除图层1。
deepseek提供的代码虽然有些冗余的步骤,但整体逻辑清晰,测试后也暂时没发现bug,代码如下:
  1. (defun c:MergeLayers (/ *error* ent1 ent2 layer1 layer2 ss doc layers layer1_vla wasLocked currentLayer)
  2.   (vl-load-com)
  3.   (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  4.   (setq layers (vla-get-layers doc))
  5.   
  6.   ;; 错误处理函数
  7.   (defun *error* (msg)
  8.     (if wasLocked
  9.       (vla-put-lock layer1_vla :vlax-true)
  10.     )
  11.     (princ (strcat "\n错误: " msg))
  12.   )
  13.   
  14.   ;; 步骤1:选择源图层图元
  15.   (if (not (setq ent1 (car (entsel "\n选择要合并的源图层图元: "))))
  16.     (progn
  17.       (princ "\n未选择源图层图元。")
  18.       (exit)
  19.     )
  20.   )
  21.   (setq layer1 (cdr (assoc 8 (entget ent1))))
  22.   
  23.   ;; 步骤2:选择目标图层图元
  24.   (if (not (setq ent2 (car (entsel "\n选择目标图层图元: "))))
  25.     (progn
  26.       (princ "\n未选择目标图层图元。")
  27.       (exit)
  28.     )
  29.   )
  30.   (setq layer2 (cdr (assoc 8 (entget ent2))))
  31.   
  32.   ;; 检查是否相同图层
  33.   (if (= layer1 layer2)
  34.     (progn
  35.       (princ "\n源图层与目标图层相同,无需合并。")
  36.       (exit)
  37.     )
  38.   )
  39.   
  40.   ;; 检查源图层是否存在
  41.   (if (not (tblsearch "LAYER" layer1))
  42.     (progn
  43.       (princ (strcat "\n图层 " layer1 " 不存在。"))
  44.       (exit)
  45.     )
  46.   )
  47.   
  48.   ;; 检查目标图层是否存在,若不存在则创建
  49.   (if (not (tblsearch "LAYER" layer2))
  50.     (vla-add layers layer2)
  51.   )
  52.   
  53.   ;; 步骤3:解锁源图层(如果锁定)
  54.   (setq layer1_vla (vla-item layers layer1))
  55.   (setq wasLocked (vla-get-lock layer1_vla))
  56.   (if wasLocked
  57.     (vla-put-lock layer1_vla :vlax-false)
  58.   )
  59.   
  60.   ;; 检查当前图层是否为源图层
  61.   (setq currentLayer (getvar "CLAYER"))
  62.   (if (= currentLayer layer1)
  63.     (progn
  64.       (princ "\n无法删除当前图层,请先切换当前图层。")
  65.       (exit)
  66.     )
  67.   )
  68.   
  69.   ;; 获取所有源图层图元
  70.   (setq ss (ssget "_X" (list (cons 8 layer1))))
  71.   (if (not ss)
  72.     (progn
  73.       (princ (strcat "\n图层 " layer1 " 中没有图元。"))
  74.       (exit)
  75.     )
  76.   )
  77.   
  78.   ;; 步骤4:修改图元到目标图层
  79.   (command "_.chprop" ss "" "_layer" layer2 "")
  80.   
  81.   ;; 步骤5:删除源图层
  82.   (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list layer1_vla)))
  83.     (princ (strcat "\n无法删除图层 " layer1 "(可能仍被其他对象引用)。"))
  84.     (princ (strcat "\n成功删除图层 " layer1 "。"))
  85.   )
  86.   
  87.   ;; 步骤6:重新锁定原图层(由于图层已删除,此步骤自动跳过)
  88.   (princ "\n操作完成。")
  89.   (princ)
  90. )






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1

查看全部评分

回复

使用道具 举报

发表于 2025-2-11 13:12:08 | 显示全部楼层
写得很规范,还不错。比layerm好用多了。
回复 支持 反对

使用道具 举报

发表于 2025-2-11 14:26:59 | 显示全部楼层
这个deepseek确实比之前一批的ai在代码编写上更丝滑。之前的chatgpt稍微要求多几个,写出来的几乎没有成功运行过
回复 支持 反对

使用道具 举报

发表于 2025-2-11 20:45:53 | 显示全部楼层
这样合并图层,有些乱来的图纸合并不了的。
不过这插件也算可以了。
回复 支持 反对

使用道具 举报

发表于 2025-2-11 20:49:10 | 显示全部楼层
自贡黄明儒 发表于 2025-2-11 13:12
写得很规范,还不错。比layerm好用多了。

layerm是什么命令?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-11 21:51:44 | 显示全部楼层
gzcsun 发表于 2025-2-11 20:49
layerm是什么命令?

Express的一个命令,图层合并。很强大的,可以用command调用。
回复 支持 反对

使用道具 举报

发表于 2025-2-12 08:10:47 | 显示全部楼层
hubeiwdlue 发表于 2025-2-11 21:51
Express的一个命令,图层合并。很强大的,可以用command调用。

是laymrg吧,图层合并
回复 支持 反对

使用道具 举报

发表于 2025-2-12 11:05:54 | 显示全部楼层
好资料谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 06:08 , Processed in 0.250919 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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