手撕hot100之矩阵!看完这篇就AC~(下)
2026/5/7 1:22:31
基础数学&计算数学,从事优化领域8年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法
笔者也是从零开始学习并使用 c# & Python 二次开发 AutoCad 2025。本系列教程会从最基础的项目构建开始,到最终完成复杂插件开发。
如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!——@小猪快跑
Help > Developer Documentationin AutoCADusingSystem.Diagnostics;usingAutodesk.AutoCAD.DatabaseServices;usingAutodesk.AutoCAD.Runtime;usingApplication=Autodesk.AutoCAD.ApplicationServices.Core.Application;// 注册命令类[assembly:CommandClass(typeof(AutoCad_CSharp.CountEntities))]namespaceAutoCad_CSharp{publicclassCountEntities{[CommandMethod("CountAllEntities")]publicvoidCountAllEntitiesInModelSpace(){// 获取当前文档和数据库vardoc=Application.DocumentManager.MdiActiveDocument;vardb=doc.Database;vared=doc.Editor;varentityCount=0;// 启动事务using(vartr=db.TransactionManager.StartTransaction()){// 打开 BlockTablevarbt=tr.GetObject(db.BlockTableId,OpenMode.ForRead)asBlockTable;// 打开 ModelSpace(通常用于绘图)varmodelSpace=tr.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForRead)asBlockTableRecord;// 遍历 ModelSpace 中的所有对象foreach(varidinmodelSpace){// 检查是否为 Entity(图形实体,如 Line、Circle 等)if(id.ObjectClass.IsDerivedFrom(RXObject.GetClass(typeof(Entity)))){entityCount++;}}tr.Commit();}// 输出结果到命令行ed.WriteMessage($"\n模型空间中共有{entityCount}个实体。\n");}}}于是我们载入插件,在 AutoCad 中运行
BlockTableRecord.PaperSpace或其他布局对应的BlockTableRecord。Entity是所有图形对象(Line、Circle、Polyline 等)的基类,但不包括非图形对象(如 Layer、TextStyle 等)。你可以遍历所有BlockTableRecord:
foreach(ObjectIdbtrIdinbt){BlockTableRecordbtr=tr.GetObject(btrId,OpenMode.ForRead)asBlockTableRecord;foreach(ObjectIdidinbtr){if(id.ObjectClass.IsDerivedFrom(RXObject.GetClass(typeof(Entity)))){totalCount++;}}}但注意:这会包含所有块定义中的实体,可能远多于用户看到的图形数量。
Application │ └── Document (当前打开的 DWG 文件) │ ├── Database ← 所有图形数据的容器(核心!) │ │ │ ├── BlockTable ← 块表(存储所有 BlockTableRecord) │ │ │ │ │ ├── BlockTableRecord (ModelSpace) ← 模型空间 → 包含 Entity 对象 │ │ │ │ │ │ │ ├── Line ← Entity │ │ │ ├── Circle ← Entity │ │ │ ├── Polyline ← Entity │ │ │ └── ... ← 所有图形实体都继承自 Entity │ │ │ │ │ ├── BlockTableRecord (PaperSpace) ← 图纸空间 │ │ │ │ │ └── BlockTableRecord ("MyBlock") ← 自定义块定义(也包含 Entity) │ │ │ ├── LayerTable ← 图层表(LayerTableRecord) │ ├── LinetypeTable ← 线型表 │ ├── TextStyleTable ← 文字样式表 │ └── ... ← 其他命名对象表 │ └── Editor ← 用于用户交互(如提示输入、写消息)Autodesk.AutoCAD.ApplicationServices.Application访问。Application.DocumentManager.表示一个打开的.dwg文件(即一个绘图窗口)。
每个Document有一个唯一的Database。
获取方式:
Documentdoc=Application.DocumentManager.MdiActiveDocument;Database中。Document,而是属于Database中的BlockTableRecord(如 ModelSpace)。✅纠正误区:
❌ “Document 下面有 Entity” →不准确
✅ “Document → Database → BlockTable → BlockTableRecord (ModelSpace) → Entity”
Line,Circle,Polyline,Text,MText,Dimension等。Entity都必须位于某个BlockTableRecord中(通常是 ModelSpace 或 PaperSpace)。BlockTable:数据库中的“块表”,类似目录。BlockTableRecord:代表一个具体的“空间”或“块定义”。BlockTableRecord.ModelSpace:模型空间(主绘图区)BlockTableRecord.PaperSpace:图纸空间(布局)每个
BlockTableRecord内部是一个ObjectId 集合,每个ObjectId指向一个数据库对象(可能是 Entity,也可能是其他对象如 DimensionStyle,但通常我们只关心 Entity)。
acdbmgd.dll)| AutoCAD 概念 | .NET 类名 |
|---|---|
| Application | Autodesk.AutoCAD.ApplicationServices.Application |
| Document | Autodesk.AutoCAD.ApplicationServices.Document |
| Database | Autodesk.AutoCAD.DatabaseServices.Database |
| BlockTable | Autodesk.AutoCAD.DatabaseServices.BlockTable |
| BlockTableRecord | Autodesk.AutoCAD.DatabaseServices.BlockTableRecord |
| Entity(基类) | Autodesk.AutoCAD.DatabaseServices.Entity |
| Line / Circle 等 | Line,Circle等(均继承自Entity) |
AutoCAD 中的所有图形实体(Entity)都存储在 Database 的 BlockTableRecord(如 ModelSpace)中,而 Document 是用户界面与 Database 之间的桥梁。