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

相关推荐
宝桥南山8 小时前
GitHub Models - 尝试一下使用GitHub Models
microsoft·ai·微软·c#·github·.netcore
hixiong12311 小时前
C# OpenvinoSharp部署INSID3
开发语言·人工智能·ai·c#·openvinosharp
星辰徐哥12 小时前
Unity C#入门:变量的定义与访问权限(public/private)
unity·c#·lucene
leoufung12 小时前
LeetCode 30:Substring with Concatenation of All Words 题解(含 C 语言 uthash 实现)
c语言·leetcode·c#
hacker70712 小时前
Visual Studio安装教程(C#开发版)
ide·c#·visual studio
SKY -dada13 小时前
Understand 使用教程
开发语言·c#·流程图·软件构建·敏捷流程·代码复审·源代码管理
William_cl15 小时前
【C#/.NET 进阶】ASP.NET 架构与最佳实践:DI 依赖注入(IoC 核心)从入门到避坑
c#·asp.net·.net
武藤一雄15 小时前
WPF:MessageBox系统消息框
前端·microsoft·c#·.net·wpf
武藤一雄15 小时前
WPF进阶:万字详解WPF如何性能优化
windows·性能优化·c#·.net·wpf·.netcore·鲁棒性
xiaogutou11211 天前
2026年历史课件PPT模板选购指南:教师备课效率与精度的平衡方案
开发语言·c#