C#如何获取CAD的对象并修改

活不多说,直接上代码!!!

1、获取所有对象

csharp 复制代码
public class EntityGetter
{
    public static void GetAllEntities()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        Editor ed = doc.Editor;

        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            try
            {
                // 获取模型空间
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], 
                    OpenMode.ForRead) as BlockTableRecord;

                // 遍历所有实体
                foreach (ObjectId objId in btr)
                {
                    Entity ent = trans.GetObject(objId, OpenMode.ForRead) as Entity;
                    if (ent is Circle)
                    {
                        Circle circle = ent as Circle;
                        ed.WriteMessage($"\n找到圆: 半径 = {circle.Radius}");
                    }
                    else if (ent is Line)
                    {
                        Line line = ent as Line;
                        ed.WriteMessage($"\n找到直线: 长度 = {line.Length}");
                    }
                }
            }
            catch (Exception ex)
            {
                ed.WriteMessage($"\n错误: {ex.Message}");
            }
            trans.Commit();
        }
    }
}

2、获取特定类型的对象

csharp 复制代码
public class EntitySelector
{
    // 获取圆形对象
    public static List<Circle> GetCircles()
    {
        List<Circle> circles = new List<Circle>();
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        Editor ed = doc.Editor;

        // 创建类型过滤器
        TypedValue[] filterList = new TypedValue[]
        {
            new TypedValue((int)DxfCode.Start, "CIRCLE")
        };

        SelectionFilter filter = new SelectionFilter(filterList);
        PromptSelectionResult selRes = ed.SelectAll(filter);

        if (selRes.Status == PromptStatus.OK)
        {
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                SelectionSet ss = selRes.Value;
                foreach (SelectedObject selObj in ss)
                {
                    Circle circle = trans.GetObject(selObj.ObjectId, 
                        OpenMode.ForRead) as Circle;
                    if (circle != null)
                    {
                        circles.Add(circle);
                    }
                }
                trans.Commit();
            }
        }

        return circles;
    }

    // 获取直线对象
    public static List<Line> GetLines()
    {
        List<Line> lines = new List<Line>();
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        Editor ed = doc.Editor;

        TypedValue[] filterList = new TypedValue[]
        {
            new TypedValue((int)DxfCode.Start, "LINE")
        };

        SelectionFilter filter = new SelectionFilter(filterList);
        PromptSelectionResult selRes = ed.SelectAll(filter);

        if (selRes.Status == PromptStatus.OK)
        {
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                SelectionSet ss = selRes.Value;
                foreach (SelectedObject selObj in ss)
                {
                    Line line = trans.GetObject(selObj.ObjectId, 
                        OpenMode.ForRead) as Line;
                    if (line != null)
                    {
                        lines.Add(line);
                    }
                }
                trans.Commit();
            }
        }

        return lines;
    }
}

3、获取对象属性

csharp 复制代码
public class EntityProperties
{
    public static void GetCircleProperties(Circle circle)
    {
        // 基本属性
        Point3d center = circle.Center;
        double radius = circle.Radius;
        double area = circle.Area;
        double circumference = circle.Circumference;

        // 图层信息
        string layer = circle.Layer;
        
        // 颜色信息
        Color color = circle.Color;
        
        // 线型信息
        string lineType = circle.Linetype;
        
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        
        ed.WriteMessage($"\n圆的属性:");
        ed.WriteMessage($"\n中心点: X={center.X}, Y={center.Y}, Z={center.Z}");
        ed.WriteMessage($"\n半径: {radius}");
        ed.WriteMessage($"\n面积: {area}");
        ed.WriteMessage($"\n周长: {circumference}");
        ed.WriteMessage($"\n图层: {layer}");
        ed.WriteMessage($"\n颜色: {color.ToString()}");
        ed.WriteMessage($"\n线型: {lineType}");
    }

    public static void GetLineProperties(Line line)
    {
        // 基本属性
        Point3d startPoint = line.StartPoint;
        Point3d endPoint = line.EndPoint;
        double length = line.Length;
        Vector3d direction = line.Delta;
        
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Editor ed = doc.Editor;
        
        ed.WriteMessage($"\n直线的属性:");
        ed.WriteMessage($"\n起点: X={startPoint.X}, Y={startPoint.Y}, Z={startPoint.Z}");
        ed.WriteMessage($"\n终点: X={endPoint.X}, Y={endPoint.Y}, Z={endPoint.Z}");
        ed.WriteMessage($"\n长度: {length}");
        ed.WriteMessage($"\n方向: X={direction.X}, Y={direction.Y}, Z={direction.Z}");
    }
}

4、修改对象属性

csharp 复制代码
public class EntityModifier
{
    public static void ModifyCircle(Circle circle)
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;

        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            try
            {
                // 打开对象进行写操作
                Circle circleToModify = trans.GetObject(circle.ObjectId, 
                    OpenMode.ForWrite) as Circle;
                
                // 修改属性
                circleToModify.Radius *= 2;  // 双倍半径
                circleToModify.ColorIndex = 1;  // 改变颜色
                
                trans.Commit();
            }
            catch (Exception ex)
            {
                doc.Editor.WriteMessage($"\n错误: {ex.Message}");
                trans.Abort();
            }
        }
    }

    public static void ModifyLine(Line line)
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;

        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            try
            {
                Line lineToModify = trans.GetObject(line.ObjectId, 
                    OpenMode.ForWrite) as Line;
                
                // 延长直线
                lineToModify.EndPoint = new Point3d(
                    lineToModify.EndPoint.X * 2,
                    lineToModify.EndPoint.Y * 2,
                    lineToModify.EndPoint.Z
                );
                
                trans.Commit();
            }
            catch (Exception ex)
            {
                doc.Editor.WriteMessage($"\n错误: {ex.Message}");
                trans.Abort();
            }
        }
    }
}

5、CAD基本对象

csharp 复制代码
public class BasicEntities
{
    // 2D基本图形
    public static readonly string[] Basic2D = {
        "Line",         // 直线
        "Circle",       // 圆
        "Arc",          // 圆弧
        "Polyline",     // 多段线
        "Ellipse",      // 椭圆
        "Spline",       // 样条曲线
        "Point",        // 点
        "Ray",          // 射线
        "XLine",        // 构造线
        "Text",         // 文字
        "MText",        // 多行文字
        "Rectangle",    // 矩形
        "Hatch",        // 填充
        "Region"        // 面域
    };

    // 3D基本图形
    public static readonly string[] Basic3D = {
        "Solid",        // 3D实体
        "Surface",      // 曲面
        "Mesh",         // 网格
        "Body",         // 体
        "Face",         // 3D面
        "PolyFaceMesh", // 多面网格
        "SubDMesh"      // 细分网格
    };
}

6、CAD标注类对象

csharp 复制代码
public class DimensionEntities
{
    public static readonly string[] Dimensions = {
        "AlignedDimension",     // 对齐标注
        "RotatedDimension",     // 旋转标注
        "DiametricDimension",   // 直径标注
        "RadialDimension",      // 半径标注
        "Angular2LineDimension",// 角度标注
        "Angular3PointDimension",// 三点角度标注
        "OrdinateDimension",    // 坐标标注
        "ArcDimension",         // 弧长标注
        "Leader",               // 引线
        "MLeader",             // 多重引线
        "Tolerance"            // 公差
    };
}

7、块和参照

csharp 复制代码
public class ReferenceEntities
{
    public static readonly string[] References = {
        "BlockReference",      // 块参照
        "MInsertBlock",       // 阵列块
        "ExternalReference",   // 外部参照
        "RasterImage",        // 光栅图像
        "OLE2Frame",          // OLE对象
        "Viewport",           // 视口
        "UnderlayReference"   // 底图参照
    };
}

8、表格和布局对象

csharp 复制代码
public class TableEntities
{
    public static readonly string[] Tables = {
        "Table",              // 表格
        "Layout",             // 布局
        "PlotSettings",       // 打印设置
        "Group",              // 组
        "Dictionary",         // 字典
        "Layer",              // 图层
        "LayerFilter",        // 图层过滤器
        "LayerGroup",         // 图层组
        "PlotStyleName",      // 打印样式
        "View",               // 视图
        "UCS",               // 用户坐标系
        "Section"            // 剖面
    };
}

9、注释对象

csharp 复制代码
public class AnnotationEntities
{
    public static readonly string[] Annotations = {
        "MText",              // 多行文字
        "Text",               // 单行文字
        "AttributeDefinition",// 属性定义
        "Attribute",          // 属性
        "DBPoint",           // 数据库点
        "Wipeout",           // 遮罩
        "Shape",             // 形状
        "Mline",             // 多线
        "Trace",             // 痕迹线
        "Arc_Dimension",     // 弧度标注
        "Leader",            // 引线
        "Tolerance"          // 公差
    };
}

10、特殊对象

csharp 复制代码
public class SpecialEntities
{
    public static readonly string[] Special = {
        "Light",              // 灯光
        "Camera",             // 相机
        "Material",           // 材质
        "Sun",                // 太阳
        "GeoMap",             // 地理位置
        "Section",            // 剖面
        "SectionSettings",    // 剖面设置
        "DetailViewStyle",    // 详图视图样式
        "SectionViewStyle",   // 剖面视图样式
        "TableStyle",         // 表格样式
        "MLeaderStyle",       // 多重引线样式
        "DimStyle",           // 标注样式
        "TextStyle",          // 文字样式
        "UCSTableRecord",     // UCS表记录
        "ViewportTableRecord" // 视口表记录
    };
}

11、获取对象示例

csharp 复制代码
public class EntityHelper
{
    public static Entity GetEntity(ObjectId id)
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            Entity ent = trans.GetObject(id, OpenMode.ForRead) as Entity;
            if (ent != null)
            {
                // 根据对象类型进行处理
                if (ent is Line)
                {
                    Line line = ent as Line;
                    // 处理直线
                }
                else if (ent is Circle)
                {
                    Circle circle = ent as Circle;
                    // 处理圆
                }
                else if (ent is Polyline)
                {
                    Polyline pline = ent as Polyline;
                    // 处理多段线
                }
                // ... 其他类型的处理
            }
            trans.Commit();
            return ent;
        }
    }
}
相关推荐
江畔柳前堤6 小时前
HBM:大语言模型时代的「算力血液」——从内存墙到带宽革命的深度拆解
服务器·人工智能·windows·目标检测·语言模型·自然语言处理·软件工程
天天进步201511 小时前
UI-TARS 源码解析 #22:二次开发实战:用 UI-TARS 做一个简单的 Windows 自动操作 Agent
windows·ui
北域码匠11 小时前
PID 控制算法完整详解(C# 原生实现,无第三方库)
c#·pid控制·工控开发·闭环控制·自动控制算法·数字pid·增量式pid
啊哈一半醒11 小时前
Windows 虚拟机搭建 CentOS 全过程(2026 最新版 + 踩坑解决)
linux·windows·centos
离陌在学C#11 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
new_zhou11 小时前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
asdzx6714 小时前
Java 实战:基于 Spire.Doc 高效提取 Word 文档文本与图片
java·c#·word
爬楼的猪14 小时前
跟着AI Agent学powershell
windows·ai编程
笨鸟先飞,勤能补拙14 小时前
网络安全等级保护 2.0:从定级备案、建设整改到持续合规的系统指南
网络·人工智能·windows·安全·web安全·网络安全·github
小金子会发光15 小时前
C# WinForms 基于 Socket 手搓 Modbus TCP 调试助手(支持 01/02/03/04/05/06/0F/10)
c#·socket·plc·modbus tcp·工业通信