今天使用AutoCAD时,需要复制图形中一个文本数据,使的它沿着给定的X轴和Y轴距离复制,并且每复制一次,文本数据的值相应增大一个给定的值。
我不是程序员,打算使用最近很火的deepseek试一下,帮我写个CAD插件,没想到它完美给出答案。代码如下:
(defun c:copyandincrement (/ ss ent pt x-spacing y-spacing count increment i new-pt new-text ent-data justification-h justification-v text-content start-value new-ent new-ent-list)
;; 选择要复制的文本对象(支持框选)
(setq ss (ssget '((0 . "TEXT")))) ; 只选择单行文本对象
(if (not ss)
(progn
(princ "\n未选择对象或选择的对象不是单行文本。")
(exit)
)
)
;; 获取用户输入的参数
(setq x-spacing (getdist "\n输入沿X轴的复制间距: "))
(setq y-spacing (getdist "\n输入沿Y轴的复制间距: "))
(setq count (getint "\n输入复制次数: "))
(setq increment (getint "\n输入递增值: ")) ; 用户输入递增值
;; 检查复制次数是否为正数
(if (<= count 0)
(progn
(princ "\n复制次数必须为正数。")
(exit)
)
)
;; 初始化新实体列表
(setq new-ent-list '())
;; 遍历选择集中的每个文本对象
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i)) ; 获取选择集中的第i个实体
(setq ent-data (entget ent)) ; 获取实体数据
;; 获取文本的对正方式(组码72和73)
(setq justification-h (cdr (assoc 72 ent-data))) ; 水平对正方式
(setq justification-v (cdr (assoc 73 ent-data))) ; 垂直对正方式
(if (not justification-h)
(setq justification-h 0) ; 默认为左对齐
)
(if (not justification-v)
(setq justification-v 0) ; 默认为基线对齐
)
;; 获取文本的插入点(组码10或11)
(setq pt (cdr (assoc 10 ent-data)))
(if (and (/= justification-h 0) (setq pt-alignment (cdr (assoc 11 ent-data))))
(setq pt pt-alignment) ; 如果对正方式不是左对齐,使用组码11作为插入点
)
;; 获取原始文本内容
(setq text-content (cdr (assoc 1 ent-data)))
;; 检查文本内容是否为纯数字
(if (not (numberp (atoi text-content)))
(progn
(princ "\n文本内容不是纯数字。跳过此对象。")
(setq i (1+ i)) ; 跳过非数字文本
(continue)
)
)
(setq start-value (atoi text-content))
;; 循环复制并递增
(setq j 1)
(while (<= j count)
;; 计算新位置
(setq new-pt (list (+ (car pt) (* j x-spacing))
(+ (cadr pt) (* j y-spacing))
(caddr pt)))
;; 创建新的实体数据(强制左对齐)
(setq new-ent-data (subst (cons 10 new-pt) (assoc 10 ent-data) ent-data))
(setq new-ent-data (subst (cons 1 (itoa (+ start-value (* j increment)))) (assoc 1 new-ent-data) new-ent-data))
(setq new-ent-data (subst (cons 72 0) (assoc 72 new-ent-data) new-ent-data)) ; 水平对正方式为左对齐
(setq new-ent-data (subst (cons 73 0) (assoc 73 new-ent-data) new-ent-data)) ; 垂直对正方式为基线
;; 创建新实体并保存到列表
(setq new-ent (entmakex new-ent-data))
(setq new-ent-list (cons (list new-ent justification-h justification-v new-pt) new-ent-list))
;; 递增计数器
(setq j (1+ j))
)
;; 递增选择集索引
(setq i (1+ i))
)
;; 复制完成后,恢复对齐方式
(foreach new-ent-item new-ent-list
(setq new-ent (car new-ent-item))
(setq justification-h (cadr new-ent-item))
(setq justification-v (caddr new-ent-item))
(setq new-pt (cadddr new-ent-item))
(setq new-ent-data (entget new-ent))
;; 更新对齐方式
(setq new-ent-data (subst (cons 72 justification-h) (assoc 72 new-ent-data) new-ent-data))
(setq new-ent-data (subst (cons 73 justification-v) (assoc 73 new-ent-data) new-ent-data))
;; 如果对齐方式不是左对齐,更新插入点(组码11)
(if (/= justification-h 0)
(setq new-ent-data (subst (cons 11 new-pt) (assoc 11 new-ent-data) new-ent-data))
)
(entmod new-ent-data)
)
(princ "\n复制完成!")
(princ)
)
详细操作步骤
1. 打开Visual LISP编辑器
- 在AutoCAD命令行中输入VLISP,按Enter。
2. 粘贴代码
- 在Visual LISP编辑器中,点击文件 -> 新建文件,创建一个空白文件。
- 将修正后的代码粘贴到空白文件中。
3. 保存文件
- 点击文件 -> 另存为,选择保存路径,输入文件名(例如copyandincrement.lsp),点击保存。
4. 加载LISP文件
- 回到AutoCAD命令行,输入appload,按Enter。
- 在弹出的对话框中,找到并选择copyandincrement.lsp,点击加载。
5. 运行程序
- 在AutoCAD命令行中输入copyandincrement,按Enter。
- 按照提示选择文本、输入间距、复制次数、递增值。