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

相关推荐
程序员敲代码吗3 小时前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
缺点内向5 小时前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
喵叔哟5 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
2501_930707786 小时前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
初级代码游戏6 小时前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
大空大地20267 小时前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
kylezhao20199 小时前
C#序列化与反序列化详细讲解与应用
c#
JQLvopkk9 小时前
C# 实践AI :Visual Studio + VSCode 组合方案
人工智能·c#·visual studio
故事不长丨9 小时前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
kingwebo'sZone9 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word