协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
ifoxcad【开发与工程】Use when developing AutoCAD plugins with .NET/C# — entity creation, layer management, block references, transaction handling. iFoxCAD: AutoCAD .NET secondary development framework with simplified API wrappers.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: ifoxcad description: "Use when developing AutoCAD plugins with .NET/C# — entity creation, layer management, block references, transaction handling. iFoxCAD: AutoCAD .NET secondary development framework with simplified API wrappers." tags:
项目地址: https://gitee.com/inspirefunction/ifoxcad
GitHub 镜像: https://github.com/inspirefunction/ifoxcad
NuGet:
IFoxCAD.Cad许可证: MIT
IFoxCAD 通过统一的事务封装和大量扩展方法,让 AutoCAD .NET API 的开发体验大幅提升:
using var tr = new DBTrans();db.AddEntityToModelSpace(line, circle, ...)dotnet add package IFoxCAD.Cad
项目需引用对应 CAD 的 acdbmgd、acmgd、accoremgd,并设置 Copy Local = false。
参考官方模板:https://gitee.com/inspirefunction/ifoxcad
using IFoxCAD.Cad;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
[assembly: ExtensionApplication(typeof(MyApp))]
[assembly: CommandClass(typeof(MyCommands))]
public class MyApp : IExtensionApplication
{
public void Initialize() { /* 加载时执行 */ }
public void Terminate() { /* 卸载时执行 */ }
}
[CommandMethod("DRAWLINE")]
public void DrawLine()
{
using var tr = new DBTrans(); // 自动管理 Database/Transaction
var line = new Line(Point3d.Origin, new Point3d(100, 100, 0));
tr.CurrentSpace.AddEntity(line); // 加入当前空间
tr.Commit();
}
DBTrans 自动持有:
Database / TransactionBlockTable / BlockTableRecord / LayerTable / TextStyleTable / LinetypeTable ...CurrentSpace / ModelSpace / PaperSpacevar ed = Env.Editor;
// 取一个点
if (ed.GetPoint("\n请选择起点:").GetPointResult(out var p)) {
// p 是 Point3d
}
// 取角度、整数、关键字
ed.GetDouble("\n请输入半径:").GetDoubleResult(out var r);
ed.GetKeyword("\n请选择 [圆(C)/矩形(R)]:", "C", "R").GetStringResult(out var k);
// 选择集
var sel = ed.SelectAll(new SelectionFilter(new[] {
new TypedValue((int)DxfCode.Start, "LINE")
}));
using var tr = new DBTrans();
var line = new Line(Point3d.Origin, new Point3d(10, 0, 0)) {
LayerId = tr.LayerTable.GetOrCreate("墙体", l => l.Color = ColorIndex.Red),
ColorIndex = 1
};
var circle = new Circle(new Point3d(5, 0, 0), Vector3d.ZAxis, 2);
var text = new DBText { Position = new Point3d(0, -5, 0),
TextString = "Hello", Height = 2 };
tr.CurrentSpace.AddEntity(line, circle, text);
tr.Commit();
using var tr = new DBTrans();
// 1. 创建块定义
ObjectId btrId = tr.BlockTable.Add("MyBlock", btr => {
btr.Origin = Point3d.Origin;
btr.AppendEntity(new Circle(Point3d.Origin, Vector3d.ZAxis, 1));
btr.AppendEntity(new Line(new Point3d(-1,0,0), new Point3d(1,0,0)));
});
// 2. 插入块参照
var br = new BlockReference(new Point3d(10, 10, 0), btrId);
tr.CurrentSpace.AddEntity(br);
// 3. 块属性
br.AddAttributes(("TAG1", "VALUE1"), ("TAG2", "VALUE2"));
tr.Commit();
using var tr = new DBTrans();
var layerId = tr.LayerTable.GetOrCreate("钢筋", l => {
l.Color = ColorIndex.Yellow;
l.LineWeight = LineWeight.LineWeight030;
});
IFoxCAD 提供大量基于 AutoCAD Geometry 的扩展:
var line = new Line(p1, p2);
double angle = line.Angle();
double len = line.Length;
var poly = new Polyline();
poly.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
poly.AddVertexAt(1, new Point2d(10, 0), 0, 0, 0);
poly.AddVertexAt(2, new Point2d(10, 10), 0, 0, 0);
poly.Closed = true;
double area = poly.Area;
var ed = Env.Editor;
var res = ed.GetSelection(new SelectionFilter(new[] {
new TypedValue(0, "LINE,LWPOLYLINE"),
new TypedValue(8, "钢筋") // 限定图层
}));
if (res.Status == PromptStatus.OK)
{
using var tr = new DBTrans();
foreach (var id in res.Value.GetObjectIds())
{
var ent = tr.GetObject<Entity>(id);
ent.ColorIndex = 1;
}
tr.Commit();
}
public class MyCommands
{
[CommandMethod("MY_HELLO", CommandFlags.Modal)]
public void Hello() => Env.Editor.WriteMessage("\nHello IFoxCAD");
[CommandMethod("MY_PUR", CommandFlags.Session)]
public void Purge() { /* ... */ }
}
IFoxCAD 通过条件编译支持:
IFOX_CAD2025 / IFOX_CAD2024 ...ZWCAD / GCAD 等#if ZWCAD
using ZwSoft.ZwCAD.DatabaseServices;
#else
using Autodesk.AutoCAD.DatabaseServices;
#endif
dotnet new classlib 创建 .NET 类库项目IFoxCAD.Cad 包,添加 AutoCAD 依赖 DLL 引用(Copy Local=false)IExtensionApplication 实现类,添加 [assembly: ExtensionApplication] 和 [assembly: CommandClass] 特性[CommandMethod] 方法中编写业务逻辑:using var tr = new DBTrans() → 创建/修改实体 → tr.Commit()new DBTrans() 或 HostMgd 无界面打开 DWG 文件tr.CurrentSpace 中的实体,tr.GetObject<T>(id) 获取强类型对象tr.Commit() 保存,输出到新 DWGdb.UsingTrans() 在跨命令操作时使用Editor.Regen() 仅必要时调用BlockTableRecord.UpdateAnonymousBlocks 同步实例| 问题 | 解决 |
|---|---|
eNotInDatabase | 实体未加入 BlockTableRecord 即访问 Id |
| 修改后界面不刷新 | ent.RecordGraphicsModified(true) 或 Editor.Regen() |
引用 acdbmgd 报错 | 设置 Copy Local=false |
| 脱离 CAD 单元测试 | 用 HostMgd Mock 或 IFoxCAD 提供的测试基类 |
using var tr = new DBTrans() 是几乎所有操作的起点,自动管理 Database 和 Transaction。eNotInDatabase;② 引用 AutoCAD 依赖 DLL 时必须设置 Copy Local=false;③ 条件编译宏(IFOX_CAD2025/ZWCAD 等)用于多 CAD 兼容;④ 插件入口需实现 IExtensionApplication,在 Initialize() 中执行初始化、Terminate() 中执行清理,命令通过 [CommandMethod] 特性声明式注册。using var tr = new DBTrans() → tr.CurrentSpace.AddEntity(...) 或 tr.LayerTable.GetOrCreate("name") → tr.Commit()。选择集操作:ed.SelectAll(new SelectionFilter(...)) → tr.GetObject<T>(id) → 修改 → tr.Commit()。