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

相关推荐
jerryinwuhan5 小时前
RDD第二次练习
开发语言·c#
aini_lovee8 小时前
C# 快速搜索磁盘文件解决方案
开发语言·c#
派葛穆10 小时前
汇川PLC-Unity3d与汇川easy521plc进行Modbustcp通讯
unity·c#
游乐码10 小时前
C#List
开发语言·c#·list
Paine Zeng13 小时前
C# + SolidWorks 二次开发 -监听退出草图事件并自动执行逻辑
c#·solidworks二次开发·solidworks api
游乐码13 小时前
C#Dicitionary
算法·c#
SunnyDays101113 小时前
C# 实战:如何高效地将 HTML 转换为可编辑 Word 文档
c#·html转word
用户37215742613513 小时前
C# 实战:如何高效地将 HTML 转换为可编辑 Word 文档
c#
鱼干~14 小时前
【全栈知识点】全栈开发知识点
前端·人工智能·c#
yu859395815 小时前
WinForm 嵌入 WordExcel 实现方案
开发语言·microsoft·c#