
CAD 这个行当里有个老笑话画图的不如改图的改图的不如会写脚本的。我干了十来年机械设计和工装夹具前前后后待过几个厂子见过太多人每天在重复劳动里打转——画标准件、标尺寸、套图框、改图层一套流程下来半天没了。后来接触到用 AI 来驱动 CAD 自动化的思路尤其是看到 TmAgent 这个方案把 107 个工具、MCP 协议和 LISP 脚本串在一起我第一反应是这条路子对了。它解决的不是能不能画的问题而是能不能让机器替你画的问题。这篇文章适合三类人看天天跟 CAD 打交道想提效的工程师、对 AI 辅助设计好奇但不知道从哪下手的技术爱好者、以及想搞清楚 MCP 和 LISP 到底怎么配合的开发者。我会把 TmAgent 这套东西拆开揉碎从架构逻辑到实操细节再到我踩过的坑全部摊开讲。1. 为什么AI 控制 CAD这件事值得认真对待1.1 传统 CAD 自动化的天花板在哪先说清楚一个前提CAD 自动化不是新东西。AutoLISP 从 1986 年就有了VBA 宏、.NET API、Python 脚本每一代都有各自的拥趸。我在上一家公司的时候用 AutoLISP 写过一套批量标注尺寸的脚本当时觉得效率提升挺明显但用了一段时间就发现几个绕不过去的坎。第一个坎是脚本的刚性。LISP 脚本本质上是如果 A 则 B的硬逻辑你告诉它选中所有直径小于 10 的圆改成红色它就照做。但实际工作中图纸上的情况千变万化——同样是直径 8 的圆有的是螺栓孔需要标红有的是工艺孔不需要动。脚本没法判断这个区别因为它不理解意图。第二个坎是维护成本。一套稍微复杂的 LISP 脚本动辄几百上千行写的时候爽改的时候痛苦。参数一多函数嵌套一深过两个月自己都看不懂。更别提换个人接手基本等于重写。第三个坎是交互的割裂感。传统脚本的触发方式是命令行输入或者菜单点击你得记住命令名得知道参数顺序。这跟我想让 CAD 帮我做件事的自然表达之间隔着一道鸿沟。1.2 TmAgent 带来的思路转变TmAgent 的核心思路跟传统脚本完全不同。它不是在写更复杂的脚本而是在让 AI 理解你的意图然后调用合适的工具去执行。这个转变的关键在于三个东西的配合107 个工具提供了足够细粒度的操作能力MCP 协议解决了 AI 和 CAD 之间的通信问题LISP作为底层执行引擎保证了操作的精确性和兼容性。打个比方。传统 LISP 脚本像是一把专用扳手只能拧一种螺丝。TmAgent 像是一个工具箱里面有 107 把不同的工具而 AI 是那个帮你选工具、递工具、甚至帮你拧的助手。你说把这个法兰上的螺栓孔都标上中心线AI 会自己判断先识别哪些是螺栓孔然后调用选择工具再调用中心线绘制工具最后检查结果。整个过程你不需要知道用了哪几个工具、按什么顺序调用。这个思路的价值在于它把怎么写脚本的问题变成了怎么描述需求的问题。对于大多数工程师来说描述需求比写代码容易得多。1.3 107 个工具意味着什么107 这个数字不是随便定的。我仔细研究过 TmAgent 的工具分类大致可以分成这么几类工具类别大致数量典型功能图元操作约 30 个创建、修改、删除线条/圆/圆弧/文字图层管理约 12 个新建、切换、冻结、锁定图层标注与注释约 18 个线性标注、角度标注、引线、公差块与属性约 15 个插入块、编辑属性、炸开块查询与选择约 20 个按条件选择、统计、测量文件与输出约 12 个保存、导出、打印配置这个粒度设计得很讲究。太粗了AI 没法精确控制太细了工具数量爆炸AI 选择困难。107 个工具刚好覆盖了日常绘图的绝大多数场景同时每个工具的职责足够单一不会出现一个工具干三件事的模糊地带。这里有个经验工具的数量不是越多越好。我见过一些方案堆了三四百个工具结果 AI 经常选错因为很多工具的功能有重叠。107 个这个量级配合清晰的工具描述AI 的选择准确率会高很多。2. MCP 协议在 CAD 场景里到底扮演什么角色2.1 从函数调用到协议通信的升级MCP 全称是 Model Context Protocol翻译过来叫模型上下文协议。这个名字听起来很学术但它的作用可以用一句话说清楚让 AI 模型和外部工具之间有一套标准化的对话方式。在没有 MCP 之前如果你想让 AI 调用 CAD 的功能通常得自己写一层适配代码。比如 AI 输出一段 JSON你的程序解析这段 JSON然后调用对应的 CAD API。问题是每个 AI 模型输出的格式可能不一样每个 CAD 软件的 API 也不一样你等于要给每一对组合都写一套适配。这就像早年手机充电口诺基亚一个口、摩托罗拉一个口、索尼爱立信又一个口出门得带一把线。MCP 做的事情就是把这些口统一成 Type-C。AI 那边按照 MCP 的格式发请求CAD 这边按照 MCP 的格式接请求中间不需要额外的翻译层。TmAgent 把 107 个工具都封装成了 MCP 兼容的接口AI 模型只要支持 MCP就能直接调用这些工具。2.2 MCP 的三层结构拆解具体来说MCP 在 TmAgent 里的运作分成三层第一层是工具描述层。每个工具都有一份标准化的描述包括工具名称、功能说明、参数列表、参数类型、返回值格式。这份描述是给 AI 看的AI 根据描述来判断用户的需求应该用哪个工具。比如用户说画一个半径 50 的圆AI 会扫描工具描述找到创建圆这个工具看到它需要圆心坐标和半径两个参数然后从用户的话里提取出半径 50圆心坐标可能默认用原点或者让用户补充。第二层是请求路由层。AI 决定用哪个工具之后会生成一个符合 MCP 格式的请求。这个请求包含工具名称和参数值。MCP 的路由层负责把这个请求转发给对应的工具执行器。这一层的关键是错误处理——如果 AI 传的参数类型不对比如半径传了个字符串五十而不是数字 50路由层要能识别并返回错误信息让 AI 重新生成请求。第三层是执行反馈层。工具执行完之后结果要返回给 AI。这个结果不只是成功或失败还包括执行的具体信息比如创建了一个圆圆心坐标 (0,0)半径 50位于图层0。AI 拿到这个反馈之后可以决定下一步做什么或者向用户确认结果。2.3 为什么不用直接调 API 而要走 MCP有人可能会问既然 TmAgent 底层还是调 CAD 的 API为什么不直接让 AI 调 API非要加一层 MCP这个问题我一开始也想过。后来实际用下来发现 MCP 这层中间商有三个不可替代的作用一是解耦。CAD 软件的 API 是会变的。今天 AutoCAD 的某个函数叫这个名字明天新版本可能就改了。如果 AI 直接调 API每次 API 变动都要重新训练或调整 AI。有了 MCP 这层API 变了只需要改 MCP 的工具实现AI 那边的工具描述可以保持不变。二是安全边界。直接让 AI 调 CAD API 是有风险的。AI 可能生成一个删除所有图元的请求或者一个死循环的脚本。MCP 层可以做权限控制、参数校验、操作审计。比如你可以配置成AI 只能操作当前图层不能删除其他图层的内容。三是可观测性。所有的工具调用都经过 MCP 层意味着你可以记录每一次调用的详细信息什么时间、调了什么工具、传了什么参数、返回了什么结果。这对于调试和优化非常重要。我刚开始用的时候经常通过查看 MCP 日志来理解 AI 为什么做了某个操作。3. LISP 为什么还是那个不可替代的底层3.1 LISP 在 CAD 生态里的特殊地位现在提到编程大家首先想到的是 Python、JavaScript。但在 CAD 这个领域LISP 的地位至今没有被撼动。原因很简单AutoLISP 是 AutoCAD 的原生脚本语言它跟 CAD 内核的贴合度是任何外部语言都比不了的。我举个具体的例子。用 Python 通过 COM 接口操作 AutoCAD创建一个圆大概是这样的流程启动 Python 环境加载 COM 库连接到 AutoCAD 实例获取当前文档对象获取模型空间对象调用 AddCircle 方法传入圆心和半径参数。这一套下来光是建立连接就可能花掉几百毫秒。用 LISP 呢一行代码(command CIRCLE (0 0) 50)。没有连接开销没有对象层级直接就是 CAD 的原生命令。执行速度的差距在批量操作的时候特别明显——画 1000 个圆LISP 可能几秒钟搞定Python COM 可能要几十秒。3.2 TmAgent 里 LISP 的具体职责在 TmAgent 的架构里LISP 不是直接暴露给 AI 的。AI 看到的是 MCP 工具LISP 是这些工具背后的执行引擎。具体来说LISP 承担了三个职责第一是原子操作的实现。107 个工具里大部分底层都是用 LISP 实现的。比如创建直线这个工具底层就是 LISP 的(command LINE ...)。修改图层这个工具底层就是(command LAYER ...)。这些操作用 LISP 实现保证了跟 CAD 内核的零距离。第二是复杂操作的封装。有些工具不是单一命令能完成的需要多个 LISP 函数配合。比如批量标注螺栓孔中心线这个工具LISP 层面要做的事情包括遍历选择集、判断图元类型、计算中心点、绘制中心线、设置图层和线型。这些逻辑用 LISP 写成一个函数对外暴露成一个 MCP 工具。第三是数据格式的转换。AI 和 CAD 之间的数据格式是不一样的。AI 习惯 JSONCAD 习惯 LISP 的列表list。LISP 层要做双向转换把 AI 传来的 JSON 参数转成 LISP 能处理的列表把 LISP 的执行结果转成 JSON 返回给 AI。3.3 一个具体的 LISP 工具实现示例光说理论太虚我拿一个实际场景来演示。假设我们要实现一个统计当前图纸中所有圆的直径分布的工具。这个工具在 TmAgent 里可能叫count_circles_by_diameter。LISP 层面的实现逻辑大概是这样的(defun count-circles-by-diameter ( / ss i ent ed radius diameter-list result) ;; 创建选择集筛选所有圆 (setq ss (ssget X ((0 . CIRCLE)))) (if ss (progn (setq i 0) (setq diameter-list ()) ;; 遍历选择集 (while ( i (sslength ss)) (setq ent (ssname ss i)) (setq ed (entget ent)) ;; 提取半径计算直径 (setq radius (cdr (assoc 40 ed))) (setq diameter (* radius 2)) ;; 收集直径值 (setq diameter-list (cons diameter diameter-list)) (setq i (1 i)) ) ;; 统计各直径出现的次数 (setq result (count-occurrences diameter-list)) ) (setq result 图纸中没有圆) ) result )这段代码的核心逻辑是用ssget筛选所有圆遍历每个圆提取半径计算直径然后用一个辅助函数统计每个直径值出现的次数。最终返回一个类似((10 . 5) (20 . 3) (50 . 2))的列表表示直径 10 的有 5 个直径 20 的有 3 个直径 50 的有 2 个。MCP 层拿到这个列表之后转成 JSON 格式{10: 5, 20: 3, 50: 2}返回给 AI。AI 再根据这个数据生成自然语言的回答当前图纸中共有 10 个圆直径 10 的有 5 个直径 20 的有 3 个直径 50 的有 2 个。这个例子展示了三层架构的完整链路AI 理解需求 → MCP 路由请求 → LISP 执行操作 → MCP 转换结果 → AI 生成回答。每一层各司其职配合起来就很顺畅。4. 107 个工具的分类逻辑与选用策略4.1 工具分类背后的设计哲学107 个工具怎么分类这不是拍脑袋决定的。我研究下来发现 TmAgent 的工具分类遵循了一个原则按照工程师的思维习惯来分而不是按照 CAD 的功能模块来分。什么意思CAD 软件本身的菜单是按功能模块分的绘图、修改、标注、图层、块、特性。但工程师在干活的时候脑子里想的不是我要用修改菜单里的偏移命令而是我要把这根线往旁边挪 20 毫米。TmAgent 的工具分类更贴近后者。比如偏移这个操作在 CAD 菜单里属于修改模块。但在 TmAgent 里它可能被归类到图元变换这个类别下跟移动旋转镜像放在一起。因为这些操作在工程师的思维里都是改变图元的位置或形态。4.2 高频工具与低频工具的区分107 个工具里实际高频使用的可能只有二三十个。我根据自己的使用记录整理了一份高频工具清单工具名称使用频率典型场景创建直线极高画轮廓、辅助线创建圆极高孔、倒角、圆弧过渡偏移高壁厚、间距、平行线修剪高清理多余线段延伸高闭合轮廓标注尺寸高出图前的标注切换图层高按标准分层插入块中标准件、图框文字编辑中技术要求、标题栏图案填充中剖面线、区域标识这个清单的意义在于如果你刚开始用 TmAgent不需要把 107 个工具都摸一遍。先把这十来个高频工具用熟就能覆盖 80% 的日常操作。剩下的工具等遇到具体需求的时候再查。4.3 工具组合使用的实战案例单个工具的能力有限真正体现价值的是工具组合。我拿一个实际案例来说明。需求把图纸中所有直径小于 5 的圆改成红色并移到废弃图层。这个需求拆解下来需要用到这些工具select_by_property按属性选择条件是图元类型圆 且 直径5change_color修改选中图元的颜色为红色move_to_layer把选中图元移到指定图层AI 接到这个需求后会生成一个工具调用序列第一步调用 select_by_property参数 {type: circle, diameter_max: 5} 第二步调用 change_color参数 {color: red, target: selection} 第三步调用 move_to_layer参数 {layer: 废弃, target: selection}每一步执行完MCP 层会返回结果。如果第一步选择到了 12 个圆第二步和第三步就会对这 12 个圆生效。如果第一步没选到任何圆后续步骤会收到选择集为空的提示AI 会告诉用户没有找到符合条件的圆。这个案例的关键在于AI 不需要知道怎么实现按属性选择它只需要知道有这个工具、这个工具需要什么参数。具体的实现细节被封装在 LISP 层AI 和用户都不需要关心。5. 实际部署中容易踩的坑5.1 环境配置的隐藏陷阱TmAgent 的部署看起来简单——装个 CAD装个 TmAgent配一下 MCP 连接就能用了。但实际操作中环境配置这一步能卡住不少人。第一个坑是CAD 版本兼容性。TmAgent 的 LISP 工具依赖一些 CAD 的内置函数不同版本的 CAD 对这些函数的支持程度不一样。我试过在 2018 版和 2023 版上跑同一套工具2018 版有几个工具直接报错原因是用了新版本才引入的函数。解决办法是在 LISP 层做版本判断针对不同版本走不同的代码分支。第二个坑是MCP 服务的端口占用。MCP 通信需要一个本地端口默认可能是 8080 或者 3000。这两个端口太常用了很容易被其他程序占用。我建议在配置的时候直接改成不常用的端口比如 51820 或者 49152 以上的端口。第三个坑是LISP 加载路径。TmAgent 的 LISP 文件需要被 CAD 加载才能生效。加载方式有两种一种是手动在 CAD 里用APPLOAD命令加载另一种是配置在启动脚本里自动加载。手动加载的问题是每次重启 CAD 都要重新加载容易忘。自动加载的问题是如果路径写错了CAD 启动会报错。我的做法是先用手动加载测试确认没问题之后再配自动加载。5.2 AI 理解偏差的典型表现AI 不是万能的它在理解用户需求的时候会出偏差。我遇到过几种典型的偏差一种是参数提取错误。用户说画一个半径 50 的圆AI 可能把 50 理解成直径。这种偏差在中文语境下特别常见因为中文里半径 50和直径 50的表述有时候会省略半径或直径两个字。解决办法是在工具描述里明确写清楚参数的含义同时在 AI 的提示词里强调如果用户没有明确说是半径还是直径默认按半径处理并向用户确认。另一种是操作顺序错误。用户说把这个图层的所有内容移到另一个图层然后删除原图层AI 可能先删除图层再移动内容。这种偏差的原因是 AI 没有理解操作之间的依赖关系。解决办法是在工具描述里标注前置条件比如删除图层这个工具的描述里写执行前请确保该图层上没有图元。还有一种是范围理解错误。用户说把所有的线都加粗AI 可能把标注线、中心线、辅助线都算进去了。这种偏差的原因是所有的线这个表述太模糊。解决办法是引导用户说得更具体或者在工具层面提供更细的筛选条件。5.3 性能瓶颈的排查思路TmAgent 跑小图纸没问题但图纸一大性能问题就出来了。我处理过一个包含上万個图元的装配图用 TmAgent 做批量操作的时候明显感觉到卡顿。排查下来瓶颈主要在两个地方一是 LISP 的遍历效率。LISP 处理选择集的时候如果选择集很大遍历速度会明显下降。优化方法是尽量用ssget的过滤条件缩小选择集范围而不是先选全部再逐个判断。比如要选所有直径小于 5 的圆应该用(ssget X ((0 . CIRCLE) (-4 . ) (40 . 2.5)))而不是先选所有圆再在循环里判断半径。二是 MCP 的通信开销。每次工具调用都要经过 MCP 层如果工具调用次数太多通信开销会累积。优化方法是把多个小操作合并成一个复合工具。比如选择改色移层这三个操作如果每次都单独调用就是三次 MCP 通信。如果封装成一个批量处理工具就只需要一次通信。这里有个经验数据在中等配置的机器上单次 MCP 调用的开销大约是 10-50 毫秒。如果一次任务需要调用 100 次工具光通信开销就是 1-5 秒。所以对于复杂任务尽量用复合工具减少调用次数。6. 从能用到好用的进阶思路6.1 自定义工具的扩展方法TmAgent 自带的 107 个工具覆盖了大部分场景但每个行业、每个公司都有自己的特殊需求。这时候就需要自定义工具。自定义工具的流程分三步第一步是写 LISP 函数。把你想要的功能用 LISP 实现出来确保在 CAD 里能正常运行。比如你们公司有个特殊的图框每次插入的时候都要自动填写日期和版本号这个逻辑就可以写成一个 LISP 函数。第二步是封装成 MCP 工具。给这个 LISP 函数写一份工具描述定义好工具名称、参数、返回值。然后把描述注册到 MCP 服务里。第三步是测试和调优。用自然语言触发这个工具看 AI 能不能正确理解和使用。如果 AI 经常选错参数就调整工具描述里的措辞。我自己的经验是自定义工具的描述要写得啰嗦一点。宁可多写几句说明也不要让 AI 去猜。比如插入图框这个工具描述里要写清楚图框的尺寸有哪些选项、日期格式是什么、版本号从哪里读取。这些信息看起来琐碎但能大幅提高 AI 的调用准确率。6.2 提示词工程的实战技巧TmAgent 的效果很大程度上取决于你怎么跟它说话。我总结了几条提示词技巧技巧一先说目标再说细节。比如我要出一张装配图先帮我检查一下所有零件的图层是否正确然后统计一下标准件的数量。先说目标AI 能建立整体认知再说细节AI 知道具体做什么。技巧二用 CAD 的术语但不要用命令名。说偏移而不是OFFSET说修剪而不是TRIM。AI 对自然语言的理解比对命令名的理解更好。但也不要太口语化比如把那个线往旁边挪挪就不如把这条线向右偏移 20清晰。技巧三复杂任务分步说。不要一次性说帮我画一个法兰外径 200内径 1008 个直径 12 的螺栓孔均匀分布中心线用点划线轮廓线用粗实线。分成几步说先画外圆和内圆再画螺栓孔最后设置线型。每步确认结果后再进行下一步。技巧四善用检查和确认。在关键步骤之后让 AI 检查一下结果。比如画完螺栓孔之后检查一下数量对不对。这样能及早发现问题避免错误累积。6.3 与现有工作流的融合方式TmAgent 不是一个孤立的东西它要融入你现有的工作流才能发挥最大价值。我摸索出几种融合方式方式一是作为快捷命令使用。把 TmAgent 当成一个更智能的命令行。以前你要输入OFFSET然后选线、输距离、点方向现在你直接说把这根线偏移 20。这种方式的学习成本最低适合刚开始接触的人。方式二是作为批处理引擎使用。把重复性的、规则明确的任务交给 TmAgent 批量处理。比如把图纸里所有标题栏的日期改成今天这种任务人工做要几分钟TmAgent 几秒钟搞定。方式三是作为检查工具使用。让 TmAgent 帮你检查图纸的规范性。比如检查一下有没有图元在错误的图层上检查一下标注样式是否统一。这种用法能发现人工容易忽略的问题。方式四是作为设计助手使用。这是最高级的用法。让 TmAgent 参与设计过程比如根据这个零件的受力情况建议一下加强筋的位置和厚度。这种用法需要 AI 对设计有更深的理解目前还在探索阶段但潜力很大。7. 我对这套方案的真实看法用了这段时间我对 TmAgent 这套方案的评价是方向正确完成度不错但还有提升空间。方向正确是因为它抓住了核心矛盾——CAD 操作的复杂性和工程师需求的多样性之间的不匹配。107 个工具 MCP LISP 这个组合是目前我见过的最务实的解法。它没有追求全自动而是追求人机协作让 AI 做它擅长的理解意图、选择工具、执行操作让人做他擅长的判断结果、处理异常、做决策。完成度不错体现在工具的覆盖面和稳定性上。107 个工具基本覆盖了日常绘图的各个环节MCP 的通信也比较稳定LISP 的执行效率在可接受范围内。提升空间主要在两个方面一是 AI 对复杂空间关系的理解还不够比如把这个孔移到跟那个孔对齐的位置这种涉及空间推理的需求AI 有时候会理解错二是错误恢复机制还不够完善如果某个工具执行失败了AI 有时候不知道怎么回退或者重试。不过话说回来任何工具都是在使用中逐步完善的。我刚开始用 LISP 的时候也觉得各种不顺手用久了就离不开了。TmAgent 这套东西我觉得值得花时间研究。尤其是对于每天要花大量时间在重复性绘图操作上的工程师来说早点上手早点省力。最后分享一个我自己的小习惯我会把常用的 TmAgent 操作记录下来整理成一个常用指令清单。比如批量改图层批量标注批量检查这些高频操作我把触发它们的自然语言表述固定下来用的时候直接复制粘贴。这样既省去了组织语言的功夫也保证了每次调用的准确性。这个清单我还在持续更新每遇到一个新的好用指令就加进去。时间长了这份清单就成了我自己的效率手册。