C# Cad2016二次开发获取XData信息(二)

该代码段是一个AutoCAD的命令方法(由[CommandMethod]特性标记),用于从选择的实体中获取XData信息。

一、主要步骤如下:

1、获取当前活动的文档并赋值给变量'doc'。

2、获取文档的数据库并赋值给变量'db'。

3、获取文档的编辑器并赋值给变量'ed'。

  //1获取当前激活的文档(活动文档)并将其赋给doc变量。
        Document doc = Application.DocumentManager.MdiActiveDocument; 
        //2 将doc文档的数据库(Database)赋给db变量。
        Database db = doc.Database;
        //3 将doc文档的编辑器(Editor)赋给ed变量。
        Editor ed = doc.Editor;

4、使用PromptEntityOptions类创建实体选择的选项,提示用户选择实体。

5、使用编辑器的GetEntity方法,将选项传递给该方法,并将结果赋给变量'per'

         //4 使用PromptEntityOptions类创建实体选择的选项,提示用户选择实体
        PromptEntityOptions peo = new PromptEntityOptions("\n请选择实体");
        //5 使用编辑器的GetEntity方法,将选项传递给该方法,并将结果赋给变量'per'
        PromptEntityResult per = ed.GetEntity(peo);

6、检查实体选择结果的状态是否为PromptStatus.OK,如果是则表示用户已经成功选择了一个实体。

 if (per.Status == PromptStatus.OK)
{

}

 7、事务处理

using (Transaction tr = db.TransactionManager.StartTransaction())
{

}

这行代码是在AutoCAD中使用事务对数据库进行操作的常见语法。

事务在数据库操作中用于将一系列操作组合成一个单独的执行单元,以确保数据的一致性和完整性。当需要对数据库进行修改时,应该在事务中执行这些操作,以便在出现错误或异常情况时可以回滚(撤销)操作。

具体到这行代码,在AutoCAD中,通过Database对象的TransactionManager属性的StartTransaction()方法创建一个新的事务,并将其赋值给变量'tr'。然后,使用此事务对数据库进行操作,包括查询、修改、添加等操作。在事务结束后,应该使用Commit()方法将更改保存到数据库中,或者使用Abort()方法放弃所有更改并回滚事务。

使用using语句结构可以确保在事务结束后自动释放资源,即使在处理过程中发生异常也可以正常回滚事务。

8、在一个事务中打开实体,将实体对象赋给变量'ent'。

                // 在一个事务中打开实体,将实体对象赋给变量'ent'。
                Entity ent = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Entity;

9、检查实体是否有XData。

 // 检查实体是否有XData
if (ent != null && ent.XData != null)
{

}

10、如果实体有XData,使用ResultBuffer类将其获取到,并将结果赋给变量'rb'。

 ResultBuffer rb = ent.XData;

11、将ResultBuffer的内容转换为TypedValue数组,并将其赋给变量'values'。

//将ResultBuffer的内容转换为TypedValue数组,并将其赋给变量'values'
TypedValue[] values = rb.AsArray();

12、遍历XData中的数据,对于每个数据,在编辑器中打印出其值。

// 遍历XData中的数据
foreach (TypedValue value in values)
{                      
    ed.WriteMessage("\nXData value: " + value.Value.ToString());
}

13、打印出XData的数量。

ed.WriteMessage("\n数量: " + values.Length.ToString());

14、表示提交事务。在执行一系列的数据库操作后,调用此方法将应用所有的修改并保存到数据库中。如果事务中的操作都成功完成,调用 Commit() 方法将永久性地保存更改。如果在事务过程中发生了错误或异常,可以使用 Abort() 方法回滚事务,并放弃所有的修改。
 

tr.Commit();

以上代码的目的是从用户所选择的实体中获取XData,并将其打印出来。

二、以下完整代码

public class Class1
{


    [CommandMethod("GetXData")]
    public void GetXData()
    {
        //获取当前激活的文档(活动文档)并将其赋给doc变量。
        Document doc = Application.DocumentManager.MdiActiveDocument; 
        //将doc文档的数据库(Database)赋给db变量。
        Database db = doc.Database;
        //将doc文档的编辑器(Editor)赋给ed变量。
        Editor ed = doc.Editor;

        // 提示用户选择实体
        PromptEntityOptions peo = new PromptEntityOptions("\n请选择实体");
        //PromptEntityResult类是用于存储实体选择的结果
        PromptEntityResult per = ed.GetEntity(peo);
        //检查实体选择结果的状态是否为PromptStatus.OK,如果是则表示用户已经成功选择了一个实体。
        if (per.Status == PromptStatus.OK)
        {
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                // 在一个事务中打开实体,将实体对象赋给变量'ent'。
                Entity ent = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Entity;

                // 检查实体是否有XData
                if (ent != null && ent.XData != null)
                {
                    // 如果实体有XData,使用ResultBuffer类将其获取到,并将结果赋给变量'rb'。
                    ResultBuffer rb = ent.XData;
                    //将ResultBuffer的内容转换为TypedValue数组,并将其赋给变量'values'
                    TypedValue[] values = rb.AsArray();

                    // 遍历XData中的数据,对于每个数据,在编辑器中打印出其值。
                    foreach (TypedValue value in values)
                    {
                        ed.WriteMessage("\nXData value: " + value.Value.ToString());
                    }
                    ed.WriteMessage("\n数量: " + values.Length.ToString());
                }

                tr.Commit();
            }
        }

    }
}

 三、总结

这个代码中的GetxData方法是一个CommandMethod,用于从选择的实体中获取XData,并打印出XData的值。代码的主要逻辑如下:

  1. 获取当前激活的文档,数据库和编辑器。
  2. 提示用户选择实体,并获取选择的结果。
  3. 如果选择结果状态为OK,表示用户成功选择了一个实体,进入下一步。
  4. 开始一个数据库事务。
  5. 打开选择的实体,并将实体对象赋给变量'ent'。
  6. 检查实体是否有XData。
  7. 如果有XData,使用ResultBuffer类将XData获取到,并将结果赋给变量'rb'。
  8. 将ResultBuffer的内容转换为TypedValue数组,并将其赋给变量'values'。
  9. 遍历XData中的数据,对于每个数据,在编辑器中打印出其值。
  10. 打印出XData数据的数量。
  11. 提交事务。

这段代码使用了AutoCAD的API来访问和操作实体的XData,可以用于在AutoCAD中获取和处理XData。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值