尝试用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)
- )
|