C# AutoCAD 二次开发极简入门:从环境搭建到高效实战
对于许多工程师和开发者而言,AutoCAD 不仅是强大的设计平台,更是一个可以通过二次开发实现自动化、定制化工作的宝库。本文将带你从零开始,一步步踏入 C# AutoCAD 二次开发的世界,从创建项目、引用库,到实现复杂实体操作,并最终推荐一个能让你事半功倍的开源利器。
一、启程:搭建开发环境
在编码之前,我们需要准备好正确的工具。
- 开发工具:Visual Studio(建议 2019 或更高版本)。
- AutoCAD 软件:需安装支持 .NET API 的版本(如 AutoCAD 2020 或更高版本)。
- .NET 框架:确保你的项目目标框架与 AutoCAD 版本兼容。例如,AutoCAD 2024 对应 .NET 6.0/8.0,而更早的版本多基于 .NET Framework 4.x。
二、第一步:创建项目,引用 CAD 的核心库
- 打开 Visual Studio,新建一个 类库 (.NET Framework) 或 类库 (.NET Core/.NET) 项目,取决于你的目标 AutoCAD 版本。
- 添加 AutoCAD 的核心引用。在解决方案资源管理器中右键点击"引用",选择"添加引用",然后浏览到 AutoCAD 安装目录(例如
C:\Program Files\Autodesk\AutoCAD 2024),添加以下三个 DLL 文件:AcDbMgd.dllAcMgd.dllAcCoreMgd.dll
- 引用的复制本地 属性设置为 False,避免生成冗余文件。
一个关键操作 :为了让 AutoCAD 能够发现并加载你的程序,需要将生成的 DLL 文件路径告知它。可以创建一个文本文件,扩展名改为 .lsp,内容写入 (command "netload" "你的DLL完整路径.dll"),然后在 AutoCAD 中通过 APPLOAD 命令加载启动,即可自动执行。
三、小试牛刀:编写第一个命令
现在,来创建第一个让 AutoCAD 执行自定义动作的命令。
csharp
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
// 这条程序集属性可以让AutoCAD更快地找到命令类
[assembly: CommandClass(typeof(HelloCAD.MyCommands))]
namespace HelloCAD
{
public class MyCommands
{
// CommandMethod 特性将普通方法标记为AutoCAD命令
[CommandMethod("SayHello")]
public void SayHello()
{
// 获取当前活动文档和命令行编辑器
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
// 在命令行输出文本
ed.WriteMessage("\n你好,AutoCAD二次开发!");
}
}
}
编译项目,在 AutoCAD 中加载你的 DLL,然后在命令行中输入 SayHello,你将看到亲切的问候语。
四、更上一层楼:操控图形实体
仅仅是输出文字还不够,我们来真正地"画图"。以下代码演示了如何创建一个图层、并在其上画一个红色的圆。
csharp
[CommandMethod("CreateMyCircle")]
public void CreateMyCircle()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
// 使用事务确保操作的安全与原子性
using (Transaction trans = db.TransactionManager.StartTransaction())
{
// 1. 获取或创建一个名为"MyLayer"的图层,并设为红色
LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
if (!lt.Has("MyLayer"))
{
LayerTableRecord ltr = new LayerTableRecord();
ltr.Name = "MyLayer";
ltr.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(ColorMethod.ByAci, 1); // 红色
lt.UpgradeOpen();
lt.Add(ltr);
}
// 2. 在模型空间创建一个圆
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord modelSpace = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
Circle circle = new Circle();
circle.Center = new Point3d(10, 10, 0);
circle.Radius = 5;
circle.Layer = "MyLayer"; // 将圆放在我们创建的图层上
modelSpace.AppendEntity(circle);
trans.AddNewlyCreatedDBObject(circle, true);
// 3. 提交事务,使所有更改生效
trans.Commit();
}
}
运行命令 CreateMyCircle,一个红色圆圈就会出现在当前图纸中。
五、进阶利器:推荐开源项目 AutoCAD.EntityTools
掌握了基础,你会发现很多常用操作(如过滤选择实体、计算几何信息等)的代码写起来比较繁琐。此时,一个优秀的开源工具库能极大地提升你的开发效率,这便是我要向你推荐的 AutoCAD.EntityTools。
项目简介
AutoCAD.EntityTools 是一套功能强大的 AutoCAD 二次开发工具库,它为原生的 .NET API 提供了丰富的扩展方法 ,覆盖了实体操作、几何计算、图层管理、用户界面等多个方面,能让许多复杂操作简化为一两行代码。

项目地址 :https://gitee.com/gwhsss/auto-cad.-entity-tools

它能做什么?
这个库的核心思想是 "化繁为简",看看下面的对比你就明白了:
| 原生 API 写法 (较复杂) | 使用工具库 (极简) |
|---|---|
| 通过 ObjectId 获取实体需手动开启事务、获取对象、关闭事务等多步操作。 | Entity entity = doc.Database.GetEntity(objectId); |
| 移动实体需获取实体对象、构造矩阵、调用 TransformBy 方法等。 | objectId.Move(sourcePt, targetPt); |
| 缩放视图需要计算图形边界,然后构造缩放操作。 | editor.ZoomExtents(); |
| 获取用户选择的直线或多段线,需构造复杂的选择过滤器代码。 | ObjectId[] ids = editor.GetSelectionLineAndPolyLine("请选择"); |
核心功能模块一览
- 实体操作 (
EntityTools): 实体的增删改查、移动、旋转、复制、镜像等一键操作。 - 几何计算 (
PointTools,VectorTools): 提供中点计算、极坐标点、点集创建多段线等几何算法。 - 用户交互 (
EditorTools): 极大地简化了用户输入点、获取选择集等交互过程。 - 数据管理 (
LayerTools,TransactionTools): 轻松创建和管理图层,提供更安全的事务使用模式。 - 用户界面 (
Ribbon,Jig): 帮助构建自定义功能区界面,并实现动态拖拽绘制功能。
快速安装与使用
你可以通过 NuGet 包管理器直接安装:
bash
dotnet add package AutoCAD.EntityTool --version 1.0.5
安装后,就能使用它强大的扩展方法了,例如快速画一条直线并显示消息:
csharp
[CommandMethod("QuickLine")]
public void CreateLineWithTools()
{
var doc = Application.DocumentManager.MdiActiveDocument;
using (doc.LockDocument())
{
// 调用库的扩展方法,一行代码创建直线
doc.Database.AddLineToModelSpace(Point3d.Origin, new Point3d(100, 100, 0));
// 调用库的扩展方法,显示提示
"直线创建完成".CadAlert();
}
}
为什么推荐它?
- 显著提升效率:让你专注于业务逻辑,而非重复的API细节。
- 代码更健壮:库内部封装了大量的安全检查和异常处理。
- 易于学习:简洁的扩展方法本身就是最好的学习范例,能帮助你理解原生API对象的操作流程。
写在最后
从搭建环境、编写第一个命令,到创建实体,你已经完成了 C# AutoCAD 二次开发的入门之旅。而掌握了像 AutoCAD.EntityTools 这样的工具库,你便拥有了进入更高层次开发的钥匙,能够更快、更稳健地将你的想法转化为实际的CAD功能。
希望这篇博文能成为你探索 AutoCAD 二次开发世界的一块有用铺路石。现在,开始创造属于你自己的自动化设计工具吧!