hubeiwdlue 发表于 2025-2-11 13:04:01

deepseek编写图层合并代码

尝试用deepseek编写一个lisp插件,居然一次成功了,很惊喜,分享一下

向deepseek提的问题是:用autolisp编写一个图层合并的插件,1、选中要合并图层的图元,获得图元图层1。2,选中合并到图层的图元,获得合并到的图层2。3、全选图层1图元,如果图层锁定,则解锁后再选中。4、将选中图元的图层设置为图层2。5、删除图层1。
deepseek提供的代码虽然有些冗余的步骤,但整体逻辑清晰,测试后也暂时没发现bug,代码如下:
(defun c:MergeLayers (/ *error* ent1 ent2 layer1 layer2 ss doc layers layer1_vla wasLocked currentLayer)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq layers (vla-get-layers doc))

;; 错误处理函数
(defun *error* (msg)
    (if wasLocked
      (vla-put-lock layer1_vla :vlax-true)
    )
    (princ (strcat "\n错误: " msg))
)

;; 步骤1:选择源图层图元
(if (not (setq ent1 (car (entsel "\n选择要合并的源图层图元: "))))
    (progn
      (princ "\n未选择源图层图元。")
      (exit)
    )
)
(setq layer1 (cdr (assoc 8 (entget ent1))))

;; 步骤2:选择目标图层图元
(if (not (setq ent2 (car (entsel "\n选择目标图层图元: "))))
    (progn
      (princ "\n未选择目标图层图元。")
      (exit)
    )
)
(setq layer2 (cdr (assoc 8 (entget ent2))))

;; 检查是否相同图层
(if (= layer1 layer2)
    (progn
      (princ "\n源图层与目标图层相同,无需合并。")
      (exit)
    )
)

;; 检查源图层是否存在
(if (not (tblsearch "LAYER" layer1))
    (progn
      (princ (strcat "\n图层 " layer1 " 不存在。"))
      (exit)
    )
)

;; 检查目标图层是否存在,若不存在则创建
(if (not (tblsearch "LAYER" layer2))
    (vla-add layers layer2)
)

;; 步骤3:解锁源图层(如果锁定)
(setq layer1_vla (vla-item layers layer1))
(setq wasLocked (vla-get-lock layer1_vla))
(if wasLocked
    (vla-put-lock layer1_vla :vlax-false)
)

;; 检查当前图层是否为源图层
(setq currentLayer (getvar "CLAYER"))
(if (= currentLayer layer1)
    (progn
      (princ "\n无法删除当前图层,请先切换当前图层。")
      (exit)
    )
)

;; 获取所有源图层图元
(setq ss (ssget "_X" (list (cons 8 layer1))))
(if (not ss)
    (progn
      (princ (strcat "\n图层 " layer1 " 中没有图元。"))
      (exit)
    )
)

;; 步骤4:修改图元到目标图层
(command "_.chprop" ss "" "_layer" layer2 "")

;; 步骤5:删除源图层
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list layer1_vla)))
    (princ (strcat "\n无法删除图层 " layer1 "(可能仍被其他对象引用)。"))
    (princ (strcat "\n成功删除图层 " layer1 "。"))
)

;; 步骤6:重新锁定原图层(由于图层已删除,此步骤自动跳过)
(princ "\n操作完成。")
(princ)
)





自贡黄明儒 发表于 2025-2-11 13:12:08

写得很规范,还不错。比layerm好用多了。

帝都划水王 发表于 2025-2-11 14:26:59

这个deepseek确实比之前一批的ai在代码编写上更丝滑。之前的chatgpt稍微要求多几个,写出来的几乎没有成功运行过

gzcsun 发表于 2025-2-11 20:45:53

这样合并图层,有些乱来的图纸合并不了的。
不过这插件也算可以了。

gzcsun 发表于 2025-2-11 20:49:10

自贡黄明儒 发表于 2025-2-11 13:12
写得很规范,还不错。比layerm好用多了。

layerm是什么命令?

hubeiwdlue 发表于 2025-2-11 21:51:44

gzcsun 发表于 2025-2-11 20:49
layerm是什么命令?

Express的一个命令,图层合并。很强大的,可以用command调用。

Klein 发表于 2025-2-12 08:10:47

hubeiwdlue 发表于 2025-2-11 21:51
Express的一个命令,图层合并。很强大的,可以用command调用。

是laymrg吧,图层合并

advksf 发表于 2025-2-12 11:05:54

好资料谢谢分享
页: [1]
查看完整版本: deepseek编写图层合并代码