AutoCAD LISP二次开发入门教程:从Hello World到模具设计自动化脚本
-
<p><strong>核心结论:AutoLISP是AutoCAD内置的编程语言,无需额外安装编译器。掌握LISP编程可以将重复性操作自动化(一键图层切换、批量标注、自动清理等),是模具设计师提升30%效率的必学技能。</strong></p>
<h3>什么是AutoLISP?</h3>
<p>AutoLISP是AutoCAD内置的LISP编程方言,1986年随AutoCAD 2.18引入,至今已近40年。它基于Common Lisp的轻量子集,专门用于AutoCAD二次开发。</p>
<h4>LISP的三大优势</h4>
<ul>
<li><strong>零配置</strong>:记事本就能写,APPLOAD加载即运行</li>
<li><strong>全版本兼容</strong>:从R14到2026,LISP代码基本通用</li>
<li><strong>简洁高效</strong>:几十行代码完成复杂批量操作</li>
</ul><h3>第一个LISP程序</h3>
<pre><code>
(defun c:hello ( / msg )
(setq msg "你好,模具设计工程师!")
(alert msg)
(princ)
)
</code></pre><p>保存为hello.lsp,APPLOAD加载,输入HELLO运行。</p>
<h3>LISP基础语法速查</h3>
<h4>变量与数据类型</h4>
<pre><code>
(setq name "张三") ; 字符串
(setq count 5) ; 整数
(setq pt (list 100 200 0)) ; 坐标点
</code></pre><h4>常用系统变量</h4>
<pre><code>
(getvar "clayer") ; 获取当前图层
(setvar "clayer" "轮廓线") ; 设置当前图层
(getvar "dwgname") ; 获取DWG文件名
(getvar "dimscale") ; 标注全局比例
</code></pre><h4>选择集操作(核心)</h4>
<pre><code>
(setq ss (ssget)) ; 用户选择对象
(setq ss (ssget "X" '((0 . "LINE")))) ; 选中所有直线
(setq count (sslength ss)) ; 获取数量
(setq ent (ssname ss 0)) ; 获取第1个对象
</code></pre><h3>模具设计必备的5个LISP工具</h3>
<h4>1. 一键切换图层</h4>
<pre><code>
(defun c:L01 ( / ) (setvar "clayer" "轮廓线")(princ "\n层:轮廓线")(princ))
(defun c:L02 ( / ) (setvar "clayer" "细实线")(princ "\n层:细实线")(princ))
(defun c:L03 ( / ) (setvar "clayer" "中心线")(princ "\n层:中心线")(princ))
(defun c:L04 ( / ) (setvar "clayer" "虚线")(princ "\n层:虚线")(princ))
(defun c:L05 ( / ) (setvar "clayer" "标注层")(princ "\n层:标注层")(princ))
</code></pre>
<p>按下L01/L02/L03秒切图层,比下拉菜单快5倍。</p><h4>2. 批量标注所有圆直径</h4>
<pre><code>
(defun c:BD ( / ss i ent cen rad)
(setq ss (ssget '((0 . "CIRCLE"))))
(if (not ss) (princ "\n未选中任何圆"))
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq cen (cdr (assoc 10 (entget ent))))
(setq rad (cdr (assoc 40 (entget ent))))
(command "dimdiameter" ent (polar cen (/ pi 4) rad))
(setq i (1+ i))
)
(princ (strcat "\n已完成 " (itoa i) " 个圆的直径标注"))
(princ)
)
</code></pre><h4>3. 选中对象批量移动到指定图层</h4>
<pre><code>
(defun c:MTL ( / ss lay i ent)
(setq ss (ssget))
(if (not ss) (princ "\n未选中任何对象"))
(setq lay (getstring "\n输入目标图层名: "))
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(command "chprop" ent "" "la" lay "")
(setq i (1+ i))
)
(princ (strcat "\n已将 " (itoa i) " 个对象移动到 " lay))
(princ)
)
</code></pre><h4>4. 一键清理空图层</h4>
<pre><code>
(defun c:PCL ( / )
(command "-purge" "la" "" "n")
(command "-purge" "la" "" "n")
(command "-purge" "la" "" "n")
(princ "\n空图层已清理")
(princ)
)
</code></pre><h4>5. 快速画模具中心线</h4>
<pre><code>
(defun c:QCL ( / pt1 pt2 mp)
(setq pt1 (getpoint "\n指定第一个点: "))
(setq pt2 (getpoint "\n指定第二个点: "))
(setq mp (mapcar (function (lambda (a b) (/ (+ a b) 2.0))) pt1 pt2))
(setq oldlay (getvar "clayer"))
(setvar "clayer" "中心线")
(command "line" (list (- (car mp) 10) (cadr mp) 0) (list (+ (car mp) 10) (cadr mp) 0) "")
(setvar "clayer" oldlay)
(princ)
)
</code></pre><h3>LISP程序的加载方式</h3>
<table>
<tr><td>方式</td><td>操作</td><td>适用场景</td></tr>
<tr><td>APPLOAD加载</td><td>命令行输入APPLOAD,选择LSP文件</td><td>临时使用</td></tr>
<tr><td>启动组</td><td>APPLOAD->启动组->添加LSP文件</td><td>自动加载</td></tr>
<tr><td>ACAD.LSP</td><td>放入启动目录,AutoCAD自动加载</td><td>团队统一</td></tr>
</table><h3>LISP调试技巧</h3>
<ol>
<li><code>(princ "调试信息")</code> — 在命令行显示信息</li>
<li><code>!变量名</code> — 在命令行查看变量值</li>
<li><code>VLIDE</code> — 启动完整的LISP开发环境</li>
<li>在关键位置加<code>(getstring "\n按Enter继续...")</code>暂停</li>
</ol><h3>学习资源推荐</h3>
<ul>
<li><strong>书籍</strong>:吴永进《AutoCAD AutoLISP(Visual LISP)程序设计》</li>
<li><strong>官方文档</strong>:AutoCAD帮助 -> AutoLISP开发者指南</li>
<li><strong>在线教程</strong>:AFRAutoLISP教程、Lee Mac的LISP博客</li>
<li><strong>论坛</strong>:Theswamp.org LISP论坛、明经通道</li>
</ul><hr>
<p><strong>相关推荐:</strong></p>
<ul>
<li><a href="https://www.mj7.cn/t/keybase">压铸模具技术规范标准文档汇总(KeyBase)</a></li>
<li><a href="https://www.mj7.cn/t/topic">小批量试生产管理:异常问题记录与改善对策(附真实案例)</a></li>
<li><a href="https://www.mj7.cn/t/topic">样机客户试用管理:从申请到确认的完整操作流程</a></li>
</ul><hr>
<p>你在实际生产中遇到过类似问题吗?欢迎留言讨论。</p>