万丈高楼平地起,学CAD C#二次开发从一个最简单的画直线开始吧。
整个流程包括引入命名空间、定义类、定义命令、定义方法、获取当前文档和数据库、启动数据库事务、打开写入空间、创建图元、图元添加到空间、告知事务、提交事务,也是一个最基础的框架,理解后对后面的学习帮助非常大。
代码如下(含注释)
// — 准备工作:引入命名空间 —
using Autodesk.AutoCAD.Runtime; // 包含 CommandMethod 特性,用于定义命令
using Autodesk.AutoCAD.ApplicationServices; // 包含 Application 和 Document 类
using Autodesk.AutoCAD.DatabaseServices; // 包含 Database, Transaction, Line, BlockTableRecord 等核心数据库对象
using Autodesk.AutoCAD.Geometry; // 包含 Point3d 等几何对象
namespace ClassLibrary1 // 命名空间:用于组织代码的逻辑容器,防止类名冲突
{
public class Class1 // 公共类:这是包含我们命令的 C# 类
{
// — 1. 定义CAD命令 —
// [CommandMethod("LL")]
// 这是一个 .NET "特性" (Attribute),它像一个标签。
// 它告诉 AutoCAD 加载器: "请将紧随其后的这个 CreatLine() 方法注册为一个 AutoCAD 命令。"
// 用户将来在 AutoCAD 命令行中输入 "LL" 并按回车键时,就会执行这个方法。
[CommandMethod("LL")]
public void CreatLine() // 方法定义:这是命令 "LL" 被调用时实际执行的代码体
{
// --- 2. 获取当前文档和数据库 ---
// 获取 AutoCAD 应用程序的 DocumentManager (文档管理器)
// DocumentManager 负责管理所有打开的 .dwg 文件。
// MdiActiveDocument 属性指向用户当前正在操作的那个活动文档窗口。
Document acDoc = Application.DocumentManager.MdiActiveDocument;
// 从当前文档(acDoc)中,获取其核心的 Database (数据库) 对象。
// 这个 Database 对象就是 .dwg 文件的在内存中的完整表示,
// 它包含了图纸中所有的图元、图层、块定义、样式等一切信息。
Database acCurDb = acDoc.Database;
// --- 3. 启动数据库事务 ---
// 在 AutoCAD API 中,任何对数据库(acCurDb)的读/写操作都必须在“事务”中进行。
// 事务 (Transaction) 确保了操作的 "原子性"(要么全部成功,要么全部失败回滚)
// "using" 语句是 C# 的一个强大功能,它能自动管理事务的生命周期。
// 无论代码块是正常结束还是中途抛出异常,
// using 都会确保事务在退出时被正确地 Dispose (释放),
// 如果没有调用 Commit(),它会自动 Abort() (中止),从而防止数据库被锁定。
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// --- 4. 打开要写入的“空间”(块表记录) ---
// 直接从数据库获取 "CurrentSpaceId" (当前空间ID)。
// 这样做的好处是:无论用户当前是在“模型空间”还是在某个“图纸空间”布局中,
// 你的代码都能正确地在那个活动的空间中创建图元。
// 我们必须以“写入”模式(OpenMode.ForWrite)打开它,因为我们要向这个空间添加新的实体。
// acBlkTblRec 现在就代表了我们要画线的那个“容器”。
BlockTableRecord acBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
// --- 5. 在内存中创建新的图元对象 ---
// 在内存中创建一个新的 Line (直线) 类的实例。
// 此时,这条线只是一个 C# 对象,它还不存在于 AutoCAD 的数据库中。
var line = new Line();
// 创建一个 Point3d (三维点) 对象,表示直线的起点坐标 (0, 0, 0)
var pt1 = new Point3d(0, 0, 0);
// 设置直线(line)的 StartPoint (起点) 属性
line.StartPoint = pt1;
// 创建另一个 Point3d 对象,表示直线的终点坐标 (100, 100, 0)
var pt2 = new Point3d(100, 100, 0);
// 设置直线(line)的 EndPoint (终点) 属性
line.EndPoint = pt2;
// 设置直线的颜色。ColorIndex (颜色索引) 是 AutoCAD 的 ACI (AutoCAD Color Index) 颜色系统。
// 索引号 6 代表 "Magenta" (洋红色)。
line.ColorIndex = 6;
// --- 6. 将新图元添加到数据库并提交事务 ---
// (以下都是常规操作,通用)
// 将我们在内存中创建的 line 对象“附加”到我们之前打开的“当前空间”(acBlkTblRec)中。
// 这一步才真正将直线对象与 AutoCAD 数据库关联起来。
acBlkTblRec.AppendEntity(line);
// 仅仅 AppendEntity 是不够的,我们还必须“告知”事务:
// "嘿,这个 line 对象是一个全新创建的对象,请在提交时把它也加入数据库。"
// 如果没有这一步,事务在提交时会“看”不到这个新对象,导致操作失败。
acTrans.AddNewlyCreatedDBObject(line, true);
// 提交事务。
// 这是至关重要的一步。执行 Commit() 后,事务会将在此期间
// (从 StartTransaction() 到现在) 的所有更改(即添加了这条线)
// 永久性地写入到 AutoCAD 数据库(acCurDb)中。
// 只有在 Commit() 成功执行后,用户才能在 AutoCAD 绘图区看到这条新线。
acTrans.Commit();
} // "using" 语句块在此处结束,事务(acTrans)被自动释放。
}
}
} CAD自学网公众号
微信扫一扫关注我,每天分享各种免费设计干货小技巧。

我的微信
微信号已复制
育设学堂服务号
微信扫一扫关注我,各种设计实战全套视频教程在线学。

我的公众号
公众号已复制








