C#CAD获取选择数据

本文详细描述了如何使用C#和AutoCADAPI进行二次开发,包括获取用户选择的对象数据,处理不同类型的图形元素如BlockReference、DBText、MText等,并对特定对象执行操作,如添加文本数据到图纸中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 采用C#+CAD进行二次开发,首先需要获取数据,此处是获取选择数据的方法

db = HostApplicationServices.WorkingDatabase;
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
TypedValue[] values = new TypedValue[]
{
    // new TypedValue((int)DxfCode.Start,"INSERT"),
    //new TypedValue((int)DxfCode.LayerName,"ssd")
};
SelectionFilter filter = new SelectionFilter(values);
PromptSelectionResult psr = ed.GetSelection(filter);
if (psr.Status == PromptStatus.OK)
{
    ids = psr.Value.GetObjectIds();
    object drawing = comboBox1.SelectedValue;
    drawingCode = Convert.ToString(drawing);
    startButton.Enabled = false;
    using (Transaction trasn = db.TransactionManager.StartTransaction())
    {
        for (int i = 0; i < ids.Length; i++)
        {

            Entity br = (Entity)ids[i].GetObject(OpenMode.ForRead);

            if (br is BlockReference)
            {

                BlockTable bt = (BlockTable)trasn.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockReference br1 = (BlockReference)ids[i].GetObject(OpenMode.ForRead);

                string blkname = br1.Name;
                //电源电路环线及零层端子配线图
                if (blkname.Trim().Equals("JD73"))
                {
                    TextData d = new TextData();
                    d.text = "JD73";
                    d.X = br1.Position.X;
                    d.Y = br1.Position.Y;
                    texts.Add(d);
                }
                //组合排列表
                if (blkname.Trim().Equals("plb4"))
                {
                    ObjectId blockRecordId = bt[blkname];
                    BlockTableRecord blockRecord = (BlockTableRecord)blockRecordId.GetObject(OpenMode.ForRead);
                    foreach (ObjectId entID in blockRecord)
                    {
                        Entity entity = (Entity)trasn.GetObject(entID, OpenMode.ForRead);
                        if (entity is DBText)
                        {

                            DBText textEntity = entity as DBText;
                            if (textEntity.Position.X > 0)
                            {
                                TextData d = new TextData();
                                d.text = textEntity.TextString;
                                d.X = textEntity.Position.X + br1.Position.X;
                                d.Y = textEntity.Position.Y + br1.Position.Y;
                                texts.Add(d);
                            }
                        }
                        else if (entity is MText)
                        {

                            MText textEntity = entity as MText;
                            if (textEntity.Location.X > 0)
                            {
                                TextData d = new TextData();
                                d.text = textEntity.Contents;
                                d.X = textEntity.Location.X + br1.Position.X;
                                d.Y = textEntity.Location.Y + br1.Position.Y;
                                texts.Add(d);
                            }
                        }
                        else if (entity is Polyline)
                        {

                            Polyline l = entity as Polyline;
                            LineData line = new LineData();
                            char[] separators = { '.' };
                            String startX = l.StartPoint.X.ToString().Split(separators)[0];
                            String startY = l.StartPoint.Y.ToString().Split(separators)[0];
                            String endX = l.EndPoint.X.ToString().Split(separators)[0];
                            String endY = l.EndPoint.Y.ToString().Split(separators)[0];

                            line.polyLine = l;
                            if (startY.Equals(endY) && !startX.Equals(endX))
                            {

                                //横线
                                if (l.StartPoint.X > l.EndPoint.X)
                                {
                                    line.startX = l.EndPoint.X + br1.Position.X;
                                    line.startY = l.EndPoint.Y + br1.Position.Y;
                                    line.endX = l.StartPoint.X + br1.Position.X;
                                    line.endY = l.StartPoint.Y + br1.Position.Y;

                                }
                                else
                                {
                                    line.startX = l.StartPoint.X + br1.Position.X;
                                    line.startY = l.StartPoint.Y + br1.Position.Y;
                                    line.endX = l.EndPoint.X + br1.Position.X;
                                    line.endY = l.EndPoint.Y + br1.Position.Y;

                                }
                                line.angle = 0;
                                lines.Add(line);
                            }
                            else if (startX.Equals(endX) && !startY.Equals(endY))
                            {

                                //竖线
                                if (l.StartPoint.Y > l.EndPoint.Y)
                                {
                                    line.startX = l.StartPoint.X + br1.Position.X;
                                    line.startY = l.StartPoint.Y + br1.Position.Y;
                                    line.endX = l.EndPoint.X + br1.Position.X;
                                    line.endY = l.EndPoint.Y + br1.Position.Y;


                                }
                                else
                                {
                                    line.startX = l.EndPoint.X + br1.Position.X;
                                    line.startY = l.EndPoint.Y + br1.Position.Y;
                                    line.endX = l.StartPoint.X + br1.Position.X;
                                    line.endY = l.StartPoint.Y + br1.Position.Y;

                                }
                                line.angle = 1;
                                lines.Add(line);
                            }



                        }
                        else if (entity is Line)
                        {
                            Line l = entity as Line;
                            LineData line = new LineData();
                            line.line = l;
                            char[] separators = { '.' };
                            String startX = l.StartPoint.X.ToString().Split(separators)[0];
                            String startY = l.StartPoint.Y.ToString().Split(separators)[0];
                            String endX = l.EndPoint.X.ToString().Split(separators)[0];
                            String endY = l.EndPoint.Y.ToString().Split(separators)[0];
                            if (startY.Equals(endY) && !startX.Equals(endX))
                            {
                                //横线
                                if (l.StartPoint.X > l.EndPoint.X)
                                {
                                    line.startX = l.EndPoint.X + br1.Position.X;
                                    line.startY = l.EndPoint.Y + br1.Position.Y;
                                    line.endX = l.StartPoint.X + br1.Position.X;
                                    line.endY = l.StartPoint.Y + br1.Position.Y;

                                }
                                else
                                {
                                    line.startX = l.StartPoint.X + br1.Position.X;
                                    line.startY = l.StartPoint.Y + br1.Position.Y;
                                    line.endX = l.EndPoint.X + br1.Position.X;
                                    line.endY = l.EndPoint.Y + br1.Position.Y;

                                }
                                line.angle = 0;
                                lines.Add(line);
                            }
                            else if (!startY.Equals(endY) && startX.Equals(endX))
                            {

                                if (l.StartPoint.X > 4349)
                                {
                                    line.line = l;
                                }
                                //竖线
                                if (l.StartPoint.Y > l.EndPoint.Y)
                                {
                                    line.startX = l.StartPoint.X + br1.Position.X;
                                    line.startY = l.StartPoint.Y + br1.Position.Y;
                                    line.endX = l.EndPoint.X + br1.Position.X;
                                    line.endY = l.EndPoint.Y + br1.Position.Y;


                                }
                                else
                                {
                                    line.startX = l.EndPoint.X + br1.Position.X;
                                    line.startY = l.EndPoint.Y + br1.Position.Y;
                                    line.endX = l.StartPoint.X + br1.Position.X;
                                    line.endY = l.StartPoint.Y + br1.Position.Y;

                                }
                                line.angle = 1;
                                lines.Add(line);
                            }

                        }

                    }
                }
                //综合柜零层配线图
                if (blkname.Trim().Equals("F"))
                {
                    TextData d = new TextData();
                    d.text = "※";
                    d.X = br1.Position.X;
                    d.Y = br1.Position.Y;
                    texts.Add(d);
                }
                if (blkname.Trim().Equals("CONTI_1"))
                {
                    TextData d = new TextData();
                    d.text = "△";
                    d.X = br1.Position.X;
                    d.Y = br1.Position.Y;
                    texts.Add(d);
                }
            }
            else if (br is DBText)
            {

                DBText textEntity = br as DBText;
                //if (textEntity.Position.X > 0)
                //{
                TextData d = new TextData();
                d.text = textEntity.TextString;
                d.X = textEntity.Position.X+0.3;
                d.Y = textEntity.Position.Y;
                texts.Add(d);
                //}
            }
            else if (br is MText)
            {

                MText textEntity = br as MText;
                //if (textEntity.Location.X > 0)
                //{
                TextData d = new TextData();
                d.text = textEntity.Contents;
                d.X = textEntity.Location.X;
                d.Y = textEntity.Location.Y;
                texts.Add(d);
                //}
            }
            else if (br is Polyline)
            {
                Polyline l = br as Polyline;
                int count = l.NumberOfVertices;
                for (int j = 0; j < count - 1; j++)
                {
                    Point3d pt1 = l.GetPoint3dAt(j);
                    Point3d pt2 = l.GetPoint3dAt(j + 1);
                    char[] separators1 = { '.' };
                    String startX = pt1.X.ToString().Split(separators1)[0];
                    String startY = pt1.Y.ToString().Split(separators1)[0];
                    String endX = pt2.X.ToString().Split(separators1)[0];
                    String endY = pt2.Y.ToString().Split(separators1)[0];
                    LineData line = new LineData();
                    if (startY.Equals(endY) && !startX.Equals(endX))
                    {

                        //横线
                        if (l.StartPoint.X > l.EndPoint.X)
                        {
                            line.startX = l.EndPoint.X;
                            line.startY = l.EndPoint.Y;
                            line.endX = l.StartPoint.X;
                            line.endY = l.StartPoint.Y;

                        }
                        else
                        {
                            line.startX = l.StartPoint.X;
                            line.startY = l.StartPoint.Y;
                            line.endX = l.EndPoint.X;
                            line.endY = l.EndPoint.Y;

                        }
                        line.angle = 0;
                        lines.Add(line);
                    }
                    else if (startX.Equals(endX) && !startY.Equals(endY))
                    {

                        //竖线
                        if (l.StartPoint.Y > l.EndPoint.Y)
                        {
                            line.startX = l.StartPoint.X;
                            line.startY = l.StartPoint.Y;
                            line.endX = l.EndPoint.X;
                            line.endY = l.EndPoint.Y;


                        }
                        else
                        {
                            line.startX = l.EndPoint.X;
                            line.startY = l.EndPoint.Y;
                            line.endX = l.StartPoint.X;
                            line.endY = l.StartPoint.Y;

                        }
                        line.angle = 1;
                        lines.Add(line);
                    }

                }
            }
            else if (br is Line)
            {
                Line l = br as Line;
                LineData line = new LineData();
                line.line = l;
                char[] separators = { '.' };
                String startX = l.StartPoint.X.ToString().Split(separators)[0];
                String startY = l.StartPoint.Y.ToString().Split(separators)[0];
                String endX = l.EndPoint.X.ToString().Split(separators)[0];
                String endY = l.EndPoint.Y.ToString().Split(separators)[0];
                if (startY.Equals(endY) && !startX.Equals(endX))
                {
                    //横线
                    if (l.StartPoint.X > l.EndPoint.X)
                    {
                        line.startX = l.EndPoint.X;
                        line.startY = l.EndPoint.Y;
                        line.endX = l.StartPoint.X;
                        line.endY = l.StartPoint.Y;

                    }
                    else
                    {
                        line.startX = l.StartPoint.X;
                        line.startY = l.StartPoint.Y;
                        line.endX = l.EndPoint.X;
                        line.endY = l.EndPoint.Y;

                    }
                    line.angle = 0;
                    lines.Add(line);
                }
                else if (!startY.Equals(endY) && startX.Equals(endX))
                {

                    if (l.StartPoint.X > 4349)
                    {
                        line.line = l;
                    }
                    //竖线
                    if (l.StartPoint.Y > l.EndPoint.Y)
                    {
                        line.startX = l.StartPoint.X;
                        line.startY = l.StartPoint.Y;
                        line.endX = l.EndPoint.X;
                        line.endY = l.EndPoint.Y;


                    }
                    else
                    {
                        line.startX = l.EndPoint.X;
                        line.startY = l.EndPoint.Y;
                        line.endX = l.StartPoint.X;
                        line.endY = l.StartPoint.Y;

                    }
                    line.angle = 1;
                    lines.Add(line);
                }
            }else if(br is Circle)
            {
                Circle r1 = br as Circle;
                TextData d = new TextData();
                d.text = "○";
                d.X = r1.StartPoint.X;
                d.Y = r1.StartPoint.Y;
                texts.Add(d);
            }
        }
    }
    Thread t = new Thread(detection);
    t.Start();

}

<think>好的,我现在要解决用户的问题:如何在C#中使用AutoCAD API获取动态块的块表数据集合。用户需要具体的方法或代码示例。首先,我需要回忆一下AutoCAD的.NET API相关部分,特别是处理块和动态块的部分。 首先,动态块在AutoCAD中是一种特殊的块,包含参数和动作,允许用户调整块的几何形状。要获取块表数据集合,可能需要访问块定义中的属性或参数信息。根据之前的知识,块表(BlockTable)是存储所有块定义的数据库对象,每个块定义在块表中有对应的记录。动态块可能包含自定义的特性或参数,需要特定的方法来访问。 接下来,用户提到了块表数据集合,这可能指的是块定义中的实体集合,或者是动态块特有的参数和动作信息。需要明确如何从块引用中获取这些数据。通常的步骤可能包括: 1. 获取当前数据库和事务,因为AutoCAD的操作通常需要在事务内进行。 2. 打开块表进行读取。 3. 获取特定的块定义,特别是动态块的定义。 4. 遍历块定义中的实体,或者访问动态块的自定义属性。 另外,动态块可能涉及BlockReference对象的扩展数据或动态属性。可能需要使用像GetDynamicBlockProperties这样的方法来获取动态参数。不过,具体的API方法可能需要查阅文档,比如BlockReference的DynamicBlockReferencePropertyCollection属性,这可能包含动态块的参数信息。 在之前的引用中,用户提供的示例代码是关于选择线段的部分,这可能与当前问题无关,但需要注意是否有其他相关的引用。不过根据用户的问题,重点在于动态块和块表数据,所以可能需要参考AutoCAD .NET API中处理块和动态块的部分。 可能的步骤分解: - 获取当前文档和数据库。 - 开始事务。 - 获取块表。 - 获取目标块定义(比如动态块的名称)。 - 遍历块定义中的实体,或者获取动态块参数。 - 处理收集到的数据。 需要确保代码示例正确使用事务和正确释放资源。例如,使用using语句来管理事务,确保在事务完成后正确提交或回滚。 可能的代码结构: using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; public void GetDynamicBlockData() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { try { // 打开块表 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // 假设用户选择了一个块引用 PromptEntityOptions opts = new PromptEntityOptions("选择一个动态块"); opts.SetRejectMessage("请选择块引用。"); opts.AddAllowedClass(typeof(BlockReference), false); PromptEntityResult res = ed.GetEntity(opts); if (res.Status != PromptStatus.OK) return; BlockReference bref = tr.GetObject(res.ObjectId, OpenMode.ForRead) as BlockReference; if (bref.IsDynamicBlock) { // 获取动态块属性 DynamicBlockReferencePropertyCollection props = bref.DynamicBlockReferencePropertyCollection; foreach (DynamicBlockReferenceProperty prop in props) { ed.WriteMessage($"\n属性名: {prop.PropertyName}, 值: {prop.Value}"); } // 获取块定义 BlockTableRecord btr = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId id in btr) { Entity ent = tr.GetObject(id, OpenMode.ForRead) as Entity; // 处理块定义中的实体... } } tr.Commit(); } catch (Exception ex) { ed.WriteMessage($"错误: {ex.Message}"); tr.Abort(); } } } 需要注意的地方: - 用户需要选择的是动态块引用,因此代码中应该验证BlockReference是否为动态块(IsDynamicBlock属性)。 - 动态块的参数通过DynamicBlockReferencePropertyCollection访问,每个属性包含名称和当前值。 - 如果需要访问块定义中的实体(块表记录中的图形对象),需要打开对应的BlockTableRecord并遍历其中的ObjectId。 - 事务管理非常重要,确保在发生异常时回滚事务。 用户可能需要进一步的信息,例如如何过滤只选择动态块,或者如何处理获取到的参数数据。此外,可能需要解释代码中的关键部分,比如如何获取块表,如何访问动态块属性等。 相关问题部分需要根据当前问题生成,比如如何修改动态块的属性,如何遍历块表中的所有块定义,或者动态块与普通块的区别等。</think>### 获取动态块块表数据集合的C#实现方法 #### 核心步骤 1. **获取块引用对象** 通过用户选择或程序指定获取`BlockReference`对象,并验证是否为动态块。 2. **访问动态属性集合** 通过`DynamicBlockReferencePropertyCollection`获取动态块参数列表,包含属性名和当前值。 3. **提取块表数据** 从块定义(`BlockTableRecord`)中遍历所有实体,获取几何数据或扩展属性。 #### 完整代码示例 ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; public class DynamicBlockUtils { [CommandMethod("GetDynamicBlockData")] public static void GetDynamicBlockData() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { try { // 提示用户选择块引用 PromptEntityOptions opts = new PromptEntityOptions("\n选择动态块:"); opts.SetRejectMessage("\n必须选择块引用"); opts.AddAllowedClass(typeof(BlockReference), true); PromptEntityResult res = ed.GetEntity(opts); if (res.Status != PromptStatus.OK) return; // 获取块引用并验证是否为动态块 BlockReference bref = tr.GetObject(res.ObjectId, OpenMode.ForRead) as BlockReference; if (!bref.IsDynamicBlock) { ed.WriteMessage("\n所选块不是动态块!"); return; } // 输出动态属性 DynamicBlockReferencePropertyCollection dynProps = bref.DynamicBlockReferencePropertyCollection; ed.WriteMessage("\n动态块参数:"); foreach (DynamicBlockReferenceProperty prop in dynProps) { ed.WriteMessage($"\n名称: {prop.PropertyName}, 值: {prop.Value}, 类型: {prop.UnitsType}"); } // 获取块定义实体集合 BlockTableRecord btr = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord; ed.WriteMessage("\n\n块表记录实体数量: " + btr.Count); foreach (ObjectId entId in btr) { Entity ent = tr.GetObject(entId, OpenMode.ForRead) as Entity; ed.WriteMessage($"\n实体类型: {ent.GetType().Name}"); } tr.Commit(); } catch (Exception ex) { ed.WriteMessage("\n错误: " + ex.Message); tr.Abort(); } } } } ``` #### 关键代码说明 - **动态属性遍历** 通过`DynamicBlockReferencePropertyCollection`遍历所有动态参数,输出参数名称、值和单位类型[^1]。 - **块表数据访问** 通过`bref.DynamicBlockTableRecord`获取动态块对应的块表记录(`BlockTableRecord`),遍历其中所有实体获取几何数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值