【AutoCad 2025】【C#】零基础教程(三)——获取选中的 Entity 插件 =》 初识 Entity 派生类

文章目录

  • 相关教程
  • 相关文献
  • 前言
  • [✅ 示例:获取当前选择集(Selection Set)](#✅ 示例:获取当前选择集(Selection Set))
  • [🔍 关键点说明](#🔍 关键点说明)
  • [🎯 进阶:添加选择过滤器(只选圆或线)](#🎯 进阶:添加选择过滤器(只选圆或线))
  • [Entity 派生类](#Entity 派生类)

作者:小猪快跑

基础数学&计算数学,从事优化领域8年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法

笔者也是从零开始学习并使用 c# & Python 二次开发 AutoCad 2025。本系列教程会从最基础的项目构建开始,到最终完成复杂插件开发。

如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!------@小猪快跑

相关教程

C#

Python

ObjectARX

相关文献

前言

在 AutoCAD 的 .NET API(适用于 AutoCAD 2025 + .NET 8 或传统 .NET Framework)中,获取用户当前在图形窗口中选择的对象,是一个在编写插件中非常实用的一个操作,通常通过 Editor 类的 GetSelection() 方法实现。

下面是一个完整、可运行的 C# 示例,展示如何:

  1. 提示用户选择对象
  2. 获取选中的实体(Entity)
  3. 遍历并输出每个对象的类型或句柄

✅ 示例:获取当前选择集(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 版本更新,可能会引入新的派生类。因此,建议参考最新的官方文档来获取最完整和准确的信息。

相关推荐
A_nanda4 小时前
c# MOdbus rto读写串口,如何不相互影响
算法·c#·多线程
码云数智-园园6 小时前
使用 C# 将 PowerPoint 演示文稿高效转换为 PDF 格式
c#
PfCoder7 小时前
WinForm真入门(23)---PictureBox 控件详细用法
开发语言·windows·c#·winform
gc_229910 小时前
C#学习调用OpenMcdf模块解析ole数据的基本用法(1)
c#·ole·openmcdf
MM_MS14 小时前
Halcon图像点运算、获取直方图、直方图均衡化
图像处理·人工智能·算法·目标检测·计算机视觉·c#·视觉检测
老骥伏枥~15 小时前
C# 控制台:Console.ReadLine / WriteLine
开发语言·c#
PfCoder1 天前
C#中定时器之System.Timers.Timer
c#·.net·visual studio·winform
人工智能AI技术1 天前
【C#程序员入门AI】本地大模型落地:用Ollama+C#在本地运行Llama 3/Phi-3,无需云端
人工智能·c#
MyBFuture2 天前
C#数组详解:一维二维与交错数组
开发语言·windows·c#·visual studio·vision pro