文章目录
- 相关教程
- 相关文献
- 前言
- [✅ 示例:获取当前选择集(Selection Set)](#✅ 示例:获取当前选择集(Selection Set))
- [🔍 关键点说明](#🔍 关键点说明)
- [🎯 进阶:添加选择过滤器(只选圆或线)](#🎯 进阶:添加选择过滤器(只选圆或线))
- [Entity 派生类](#Entity 派生类)
作者:小猪快跑
基础数学&计算数学,从事优化领域8年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法
笔者也是从零开始学习并使用 c# & Python 二次开发 AutoCad 2025。本系列教程会从最基础的项目构建开始,到最终完成复杂插件开发。
如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!------@小猪快跑
相关教程
C#
- 【AutoCad 2025】【C#】零基础教程(一)------Rider 构建 HELLO 插件-CSDN博客
- 【AutoCad 2025】【C#】零基础教程(二)------遍历 Entity 插件 =》 AutoCAD 核心对象层级结构-CSDN博客
- 【AutoCad 2025】【C#】零基础教程(三)------获取选中的 Entity 插件 =》 初识 Entity 派生类-CSDN博客
Python
ObjectARX
相关文献
- AutoCAD 2025 .NET Developer's Guide:
Help > Developer Documentationin AutoCAD - ObjectARX SDK for AutoCAD 2025:
https://www.autodesk.com/developer-network/platform-technologies/autocad/objectarx - AutoCAD API | Autodesk Platform Services (APS)
- My First AutoCAD Plug-in Overview
- AutoCAD样例文件
- AutoCAD ObjectARX SDK downloads | Autodesk Platform Services
前言
在 AutoCAD 的 .NET API(适用于 AutoCAD 2025 + .NET 8 或传统 .NET Framework)中,获取用户当前在图形窗口中选择的对象,是一个在编写插件中非常实用的一个操作,通常通过 Editor 类的 GetSelection() 方法实现。
下面是一个完整、可运行的 C# 示例,展示如何:
- 提示用户选择对象
- 获取选中的实体(Entity)
- 遍历并输出每个对象的类型或句柄
✅ 示例:获取当前选择集(Selection Set)
csharp
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application;
[assembly: CommandClass(typeof(MyAutoCAD2025Plugin.SelectionDemo))]
namespace MyAutoCAD2025Plugin
{
public class SelectionDemo
{
[CommandMethod("GETSEL")]
public static void GetSelectedObjects()
{
// 获取当前文档和编辑器
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
// 提示用户选择对象
var opts = new PromptSelectionOptions
{
MessageForAdding = "\n请选择要处理的对象: ",
AllowDuplicates = false
};
var res = ed.GetSelection(opts);
// 检查用户是否选择了对象
if (res.Status != PromptStatus.OK)
{
ed.WriteMessage("\n未选择任何对象。");
return;
}
var ss = res.Value;
ed.WriteMessage($"\n共选择了 {ss.Count} 个对象。");
// 在事务中打开对象以读取数据(推荐方式)
using var tr = db.TransactionManager.StartTransaction();
foreach (var id in ss.GetObjectIds())
{
// 以只读方式打开实体
var ent = tr.GetObject(id, OpenMode.ForRead) as Entity;
if (ent == null) continue;
// 输出对象类型和句柄
ed.WriteMessage($"\n类型: {ent.GetType().Name}, 句柄: {id.Handle}");
// 示例:如果是圆,输出圆心
if (ent is Circle circle)
{
ed.WriteMessage($" | 圆心: ({circle.Center.X:F2}, {circle.Center.Y:F2})");
}
}
tr.Commit(); // 虽然只读,但良好习惯
}
}
}

🔍 关键点说明
| 功能 | 说明 |
|---|---|
Editor.GetSelection() |
弹出选择提示,返回 PromptSelectionResult |
PromptSelectionOptions |
可定制选择行为(如过滤、窗口选择、消息等) |
SelectionSet.GetObjectIds() |
获取所有被选中对象的 ObjectId 数组 |
Transaction |
必须使用事务来安全地访问数据库对象(即使只读) |
OpenMode.ForRead |
以只读方式打开,避免锁定或修改 |
🎯 进阶:添加选择过滤器(只选圆或线)
csharp
// 仅选择 Line 和 Circle
TypedValue[] filterList = {
new TypedValue((int)DxfCode.Start, "LINE"),
new TypedValue((int)DxfCode.Start, "CIRCLE")
};
SelectionFilter filter = new SelectionFilter(filterList);
PromptSelectionResult res = ed.GetSelection(opts, filter);
⚠️ 注意:DXF 组码
"LINE"对应Line实体,"CIRCLE"对应Circle。
Entity 派生类
AutoCAD 中的 Entity 类作为所有图形对象的基础类,有许多直接或间接派生自它的子类。以下是一些常见的 Entity 派生类,以表格形式展示:
| Entity 派生类 | 描述 |
|---|---|
| Arc | 表示圆弧图形对象 |
| Circle | 表示圆形图形对象 |
| DBText | 表示单行文本 |
| MText | 表示多行文本 |
| Ellipse | 表示椭圆图形对象 |
| Hatch | 表示填充图案(阴影线或渐变色) |
| Image | 表示插入到图纸中的图像 |
| Leader | 表示指引线 |
| Line | 表示直线图形对象 |
| Polyline | 表示多段线图形对象 |
| LWPolyline | 表示轻量级多段线,与Polyline类似但更高效 |
| Point | 表示点对象 |
| PolygonMesh | 表示多边形网格 |
| PolyFaceMesh | 表示多面体网格 |
| Region | 表示二维区域对象 |
| Solid | 表示实体填充图形对象 |
| Spline | 表示样条曲线 |
| Underlay | 表示底图(如DWF、DGN或PDF格式的底图) |
| Wipeout | 表示擦除对象,用于遮挡其他图形对象 |
| BlockReference | 表示块引用,用于重复使用一组对象 |
| AttributeDefinition | 表示属性定义,通常与块关联 |
| Attribute | 表示块属性的实际值 |
请注意,这个列表并不全面,AutoCAD 的 .NET API 还包括其他一些派生自 Entity 的类,这些类可能特定于某些类型的对象或者功能。此外,随着 AutoCAD 版本更新,可能会引入新的派生类。因此,建议参考最新的官方文档来获取最完整和准确的信息。