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;
        }
    }
}
相关推荐
bu_shuo2 小时前
鼠标拖不动桌面的文件与文件夹可能的解决方案
windows·桌面
小曹要微笑2 小时前
C#中什么是类
开发语言·c#·面向对象·
爱喝可乐的老王2 小时前
LangGraph初认识
windows
小钻风33662 小时前
Collections 和 CollectionUtils 详解
windows
Singe.Chen3 小时前
C# 配置文件加密解密:最简便的实现方案
开发语言·网络协议·c#·信息与通信
bugcome_com3 小时前
C# 委托(Delegate)详解:从入门到高级用法
c#
广州服务器托管3 小时前
WIN11中将控制面板固定到开始菜单的方法
运维·开发语言·windows·计算机网络·可信计算技术
啦啦啦~~~7543 小时前
文档压缩工具,支持支持PPT、Word、Doc、png图片等格式压缩!无限使用次数!优化效果达到85%杠杠的
服务器·windows·阿里云·电脑
k7Cx7e3 小时前
Debian安装 curl 时提示插入 DVD 光盘
运维·windows·debian