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;
        }
    }
}
相关推荐
十八旬1 天前
快速安装ClaudeCode完整指南
开发语言·windows·python·claude
谁的小耳朵1 天前
一次小米电脑管家安装失败排查:官网安装包闪退,最后发现是埋点接口异常
windows
祀爱1 天前
Asp.net core+ Layui 项目中编辑按钮传递数据的方法
前端·c#·asp.net·layui
x***r1511 天前
DLL错误专修工具_TBI3264安装步骤详解(附DLL缺失一键修复与运行库安装教程)
windows
阿萨德528号1 天前
Windows RabbitMQ 启动完整指南(附启动报错解决、如何以服务方式后台运行)
windows·rabbitmq·ruby
私人珍藏库1 天前
[吾爱大神原创工具] 鼠标轨迹美化工具
windows·工具·鼠标·软件·win·多功能
小小测试开发1 天前
AI Agent 重构单体应用实战:1Password 经验与避坑指南
人工智能·windows·重构
您^_^1 天前
专家(一):Claude Code 微服务实战——6 个服务从拆分到 K8s 部署,$0.45 全套 YAML 照抄
人工智能·windows·微服务·架构·kubernetes·个人开发·claude code
TE-茶叶蛋1 天前
Java 8 引入的Stream API-stream()
java·windows·python