每天花2小时做重复绘图?一个插件就够了
做过CAD的人都知道一个痛苦:同样的操作,每天重复几百遍。
批量标注、自动编号、图层整理、图纸比对……这些活儿不难,但量大起来能把人逼疯。
我见过太多工程师,干了十年CAD,还在手动一个个改。不是不会写插件,而是觉得门槛太高,不知道从哪下手。
今天这篇文章,就把CAD插件开发这件事彻底讲透。从选平台到写代码,从调试到发布,跟着走一遍,你就能做出自己的第一个插件。
一、先搞清楚:你要给哪个CAD写插件?
这不是废话。CAD平台太多了,选错平台,后面全白费。
目前主流的CAD二次开发平台有这么几个:
| AutoCAD | ||||
| 中望CAD | ||||
| SolidWorks | ||||
| CATIA | ||||
| Rhino |
新手建议:如果你是机械/建筑行业,从AutoCAD .NET API + C# 入手。原因很简单——用户最多、资料最全、坑最少。国产中望CAD兼容AutoCAD的ARX接口,代码几乎可以通用。
二、开发环境搭建:30分钟搞定
以AutoCAD .NET开发为例,你需要装三样东西:
1. Visual Studio 2022
社区版免费,下载安装时勾选「.NET 桌面开发」工作负载就行。
2. AutoCAD ObjectARX SDK
去Autodesk Developer Center下载对应版本的SDK。解压后记住路径,后面要引用里面的DLL。
3. 创建项目
打开Visual Studio,新建一个类库项目(.NET Framework 4.8),然后添加引用:
AcDbMgd.dll(数据库相关)AcMgd.dll(应用程序相关)AcCoreMgd.dll(核心相关)
这三个DLL都在SDK的inc目录下。记得在属性里把「复制本地」设为False,否则加载时会冲突。
using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.EditorInput;[assembly: CommandClass(typeof(MyFirstPlugin.Commands))]namespaceMyFirstPlugin{publicclassCommands { [CommandMethod("HelloCAD")]publicvoidHelloCAD() { Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; ed.WriteMessage("\n你好,CAD插件开发!"); } }}编译生成DLL,然后在AutoCAD里用NETLOAD命令加载,输入HelloCAD,看到命令行输出——恭喜,你的第一个插件跑起来了。
三、实战:写一个真正有用的插件
光输出一句话没意思。来写个实际的:批量给选中的圆标注直径。
这个需求在机械制图里太常见了,手动标一个还行,标一百个能让人抓狂。
[CommandMethod("DimAllCircles")]publicvoidDimAllCircles(){ Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor;// 让用户选择要标注的圆 PromptSelectionOptions opts = new PromptSelectionOptions(); opts.MessageForAdding = "\n选择要标注直径的圆:"; TypedValue[] filter = { new TypedValue((int)DxfCode.Start, "CIRCLE") }; SelectionFilter sf = new SelectionFilter(filter); PromptSelectionResult psr = ed.GetSelection(opts, sf);if (psr.Status != PromptStatus.OK) return;using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);foreach (SelectedObject so in psr.Value) { Circle circle = (Circle)tr.GetObject(so.ObjectId, OpenMode.ForRead);// 创建直径标注 DimDiametric dim = new DimDiametric(); dim.Center = circle.Center; dim.Radius = circle.Radius; dim.DimensionStyle = db.Dimstyle;// 把标注加到模型空间 btr.AppendEntity(dim); tr.AddNewlyCreatedDBObject(dim, true); } tr.Commit(); ed.WriteMessage($"\n完成!共标注了 {psr.Value.Count} 个圆的直径。"); }}这段代码做的事情:
弹出选择提示,用过滤器只让用户选圆 遍历所有选中的圆,读取圆心和半径 创建直径标注对象,设置参数 添加到模型空间,提交事务
核心就一个概念:所有对DWG数据库的修改都必须在Transaction(事务)里完成。这是AutoCAD .NET API最重要的设计模式,记住这点能避开80%的坑。
四、插件开发的核心知识地图
单个插件不难,但要做出好用的产品级插件,你需要掌握这几块:
1. 数据库操作
AutoCAD的DWG文件本质上是一个对象数据库。每个实体(线、圆、文字)都是数据库中的一条记录。
关键操作模式:
打开数据库 → 开启事务 → 获取模型空间 → 增删改实体 → 提交事务常见坑:忘记Commit(),所有修改都不会保存。新手最容易犯的错。
2. 交互式选择
CAD插件和普通程序最大的区别——用户需要在图纸里选东西。
常用的选择方式:
ed.GetSelection()— 框选ed.GetEntity()— 点选单个实体ed.GetPoint()— 拾取点ed.GetDistance()— 测量距离
每种方式都有PromptResult返回值,一定要检查Status,用户随时可能按ESC取消。
3. 图层与样式管理
专业插件必须做好图层管理。比如标注插件应该自动把标注放到「标注层」,而不是扔在当前图层。
// 查找或创建图层LayerTable layerTbl = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);if (!layerTbl.Has("标注层")){ layerTbl.UpgradeOpen(); LayerTableRecord ltr = new LayerTableRecord(); ltr.Name = "标注层"; ltr.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(ColorMethod.ByAci, 3); layerTbl.Add(ltr); tr.AddNewlyCreatedDBObject(ltr, true);}4. 用户界面
三种方式,按复杂度递增:
命令行交互:最简单,适合快速工具 PaletteSet面板:可停靠的WPF面板,适合复杂参数配置 模态对话框:适合向导式操作流程
新手从命令行开始,够用了。别一上来就搞WPF界面,容易陷进去出不来。
五、调试技巧:少走弯路的关键
CAD插件调试有个大坑:AutoCAD加载DLL后会锁文件,你没法重新编译。
解决办法有三个:
方法一:每次改完代码先关AutoCAD 笨但有效。适合开发初期。
方法二:用Demand Loading自动加载 在注册表里配置,AutoCAD启动时自动加载你的DLL。改代码时关掉AutoCAD,重新打开就行。
方法三:远程调试(推荐) 在Visual Studio里设置:调试 → 附加到进程 → 选择acad.exe。这样可以在AutoCAD运行时打断点调试,效率最高。
<!-- .csproj 文件里添加,启动时自动启动AutoCAD --><PropertyGroup><StartAction>Program</StartAction><StartProgram>C:\Program Files\Autodesk\AutoCAD 2024\acad.exe</StartProgram></PropertyGroup>设置好后直接按F5,Visual Studio会启动AutoCAD并自动附加调试器。打断点、看变量、单步执行,和调试普通程序一模一样。
六、从插件到产品:发布与分发
插件写完了,怎么给别人用?
方案一:手动NETLOAD
最简单。把DLL发给别人,让对方在CAD里输入NETLOAD,选择你的DLL文件。
缺点:每次开CAD都要手动加载,不专业。
方案二:自动加载(推荐)
通过注册表或acad.lsp实现开机自动加载:
;; acad.lsp 中添加(command"NETLOAD""C:/MyPlugins/MyFirstPlugin.dll")或者用Bundle机制创建插件包,放到CAD的ApplicationPlugins目录下,CAD启动时自动识别。
方案三:打包成安装程序
用Inno Setup或NSIS打包,自动处理DLL复制、注册表写入、依赖检查。适合商业化分发。
七、进阶方向:让插件更值钱
基础插件能省时间,但真正值钱的插件有几个特征:
1. 参数化设计 不是执行固定操作,而是让用户通过参数控制行为。比如批量标注时,可以设置标注样式、文字高度、箭头大小。
2. 智能识别 利用实体的属性(图层、颜色、块名)自动判断该做什么。比如自动识别所有螺钉孔并标注螺纹规格。
3. 与外部数据联动 读Excel参数表批量生成图纸、对接ERP系统自动出BOM表、连接数据库查询标准件参数——这些才是企业最愿意花钱买的功能。
4. 批处理能力 一次处理整本图纸,自动出统计报表。建筑院、设计院最需要这个。
八、学习资源与社区
官方文档:
AutoCAD .NET Developer's Guide(最权威) Autodesk Developer Center(SDK下载、API参考)
中文资源:
明经CAD社区(国内最大的AutoCAD二次开发论坛) CAD论坛二次开发版块
开源参考:
GitHub上搜「AutoCAD plugin」有很多开源项目 AutoCAD的AutoLISP和.NET示例代码
建议学习路径:
先过一遍官方的Getting Started教程 跟着写3-5个小工具练手 找一个实际工作中的痛点,做一个完整插件 尝试加入界面、参数化、批处理 打包发布,收集反馈,持续迭代
写在最后
CAD插件开发不是什么高深技术,本质上就是用代码代替手工操作。
门槛不在编程,而在你有没有发现工作中的重复模式。每天花2小时干的事,写个插件可能10秒搞定。
从一个小工具开始,别想着一步到位做出完美产品。先解决一个具体问题,再慢慢扩展。
最好的学习方式就是动手做。今天就打开Visual Studio,把上面的HelloCAD跑起来,然后改成你自己需要的功能。
你工作中最烦的CAD操作是什么?

夜雨聆风