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

相关推荐
八苦14 小时前
如何用c# 做 mcp/ChatGPT app
c#·mcp
人工智能AI技术16 小时前
DeskClaw Windows上线|C#开发AI桌面助手,轻量内核源码解析
人工智能·c#
似水明俊德16 小时前
04-C#.Net-委托和事件-面试题
java·开发语言·面试·c#·.net
程序员老乔19 小时前
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(二):Valhalla落地,值类型如何让电商DTO内存占用暴跌
java·spring boot·c#
祝大家百事可乐19 小时前
嵌入式——02 数据结构
c++·c#·硬件工程
我是唐青枫20 小时前
深入理解 C#.NET TaskScheduler:为什么大量使用 Work-Stealing
c#·.net
唯情于酒1 天前
net core web api 使用log4net
c#·.net core
SunnyDays10111 天前
C# 实战:快速查找并高亮 Word 文档中的文字(普通查找 + 正则表达式)
开发语言·c#
人工智能AI技术1 天前
Qwen3.5-Plus登顶|C#集成通义千问,高并发服务实战优化
人工智能·c#
SunnyDays10111 天前
如何使用 C# 在 Word 文档中插入超链接 (含文本与图片链接)
开发语言·c#