自学内容网 自学内容网

【2025 ODA teigha .NET系列开发教程 第五章】给CAD实体添加附属数据XDATA,包括源码

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


AutoCAD XData扩展数据开发指南

什么是XData?

XData(扩展数据)是AutoCAD中一种特殊的数据存储机制,允许开发者为图形对象附加自定义数据。这些数据不会影响对象的几何特性,但可以用来存储额外的信息。

XData的两种存储方式

1. 全局字典存储 (XRecord)

XRecord是一种可以存储在图形数据库字典中的对象,适合存储全局性的数据。

csharp
// 创建并存储XRecord示例
using (DBDictionary namedDict = (DBDictionary)db.NamedObjectsDictionaryId.GetObject(OpenMode.ForWrite))
{
using (Xrecord pXRec = new Xrecord())
{
ResultBuffer resbuf = new ResultBuffer();
resbuf.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "This is some text."));
pXRec.Data = resbuf;
namedDict.SetAt("The record with our values", pXRec);
}
}

2. 实体附加存储

直接将XData附加到AutoCAD实体对象上,如圆、线等。

步骤1:注册应用程序名
csharp
using (RegAppTable regappTable = (RegAppTable)db.RegAppTableId.GetObject(OpenMode.ForWrite))
{
using (RegAppTableRecord regAppRecord = new RegAppTableRecord())
{
regAppRecord.Name = "Here is application name";
regappTable.Add(regAppRecord);
tr.AddNewlyCreatedDBObject(regAppRecord, true);
}
}
步骤2:创建实体并附加XData
csharp
// 创建圆并附加XData
using (Circle circleWithXData = new Circle(Point3d.Origin, Vector3d.ZAxis, 1))
{
circleWithXData.SetDatabaseDefaults(db);
circleId = btr.AppendEntity(circleWithXData);
}
using (DBObject circle = circleId.GetObject(OpenMode.ForWrite))
{
using (ResultBuffer rb = new ResultBuffer(
new TypedValue(1001, "Here is application name"),
new TypedValue(1000, "Extended Data for ODA app"),
new TypedValue(1000, "Write the data here"))
)
{
circle.XData = rb;
}
}

XData的数据类型

XData支持多种数据类型,常用的包括:

  • 1001: 应用程序名称(必须首先出现)
  • 1000: ASCII字符串
  • 1040: 实数
  • 1070: 16位整数
  • 1071: 32位整数

最佳实践

  1. 🔑 始终先注册应用程序名称
  2. 📝 使用有意义的键名存储XRecord
  3. 🔄 及时释放资源(使用using语句)
  4. ⚡ 选择合适的存储方式:
    • 全局数据使用XRecord
    • 实体相关数据直接附加到实体

注意事项

⚠️ 警告:

  • XData的大小限制为16KB
  • 应用程序名称必须先注册
  • XData的第一个值必须是应用程序名称(1001)

总结

XData提供了一种灵活的方式来扩展AutoCAD对象的数据存储能力。通过合理使用XData,我们可以为CAD应用程序添加丰富的自定义数据支持。

完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Teigha.DatabaseServices;

namespace CDevGuideExamplesProject.XDataEx
{
  public class XDataEx
  {
    /// <summary>
    /// 本示例演示如何使用XData(扩展数据)
    /// 有两种方式存储XData:
    /// 1. 将XData附加到特定对象
    /// 2. 将XData存储在XRecord中并放入全局字典
    /// 这里展示第二种方式
    /// </summary>
    /// <param name="path">文件保存路径</param>
    public XDataEx(String path)
    {
      // 创建新的数据库实例
      using (Database db = new Database(true, true))
      {
        // 获取事务管理器
        TransactionManager tm = db.TransactionManager;
        using (Transaction tr = tm.StartTransaction())
        {
          // 获取当前空间的块表记录
          using (BlockTableRecord btr = (BlockTableRecord)db.CurrentSpaceId.GetObject(OpenMode.ForWrite))
          {
            // *******************************************
            // 第一部分:将数据作为XRecord存储到全局字典中
            // *******************************************

            // 打开命名对象字典(这是一个全局字典,可以存储整个文档的值)
            using (DBDictionary namedDict = (DBDictionary)db.NamedObjectsDictionaryId.GetObject(OpenMode.ForWrite))
            {
              // 创建XRecord对象(这是一个可以存储XData的数据库对象)
              // 如果需要创建更复杂的结构,可以添加另一个DBDictionary,然后在其中添加更多XRecord
              using (Xrecord pXRec = new Xrecord())
              {
                // 创建结果缓冲区并添加类型化的值
                ResultBuffer resbuf = new ResultBuffer();
                resbuf.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "This is some text."));

                // 将结果缓冲区添加到XRecord中
                pXRec.Data = resbuf;

                // 将XRecord添加到全局命名对象字典中
                namedDict.SetAt("The record with our values", pXRec);
              }

              // 读取并在控制台显示数据
              Xrecord readBackXrecord = namedDict.GetAt("The record with our values").GetObject(OpenMode.ForRead) as Xrecord;
              ResultBuffer readBackResBuf = readBackXrecord.Data;
              Console.WriteLine("XData:");
              // 遍历结果缓冲区链
              foreach (TypedValue typVal in readBackResBuf)
              {
                Console.WriteLine(typVal.TypeCode.ToString());
                Console.WriteLine(typVal.Value.ToString());
              }
            }

            // *******************************************
            // 第二部分:将XData附加到圆上
            // *******************************************

            // 在数据库中注册应用程序名称(这是写入XData的必要步骤)
            using (RegAppTable regappTable = (RegAppTable)db.RegAppTableId.GetObject(OpenMode.ForWrite))
            {
              using (RegAppTableRecord regAppRecord = new RegAppTableRecord())
              {
                regAppRecord.Name = "Here is application name";
                regappTable.Add(regAppRecord);
                tr.AddNewlyCreatedDBObject(regAppRecord, true);
              }
            }

            // 创建一个圆
            ObjectId circleId;
            using (Circle circleWithXData = new Circle(Teigha.Geometry.Point3d.Origin, Teigha.Geometry.Vector3d.ZAxis, 1))
            {
              circleWithXData.SetDatabaseDefaults(db);
              circleId = btr.AppendEntity(circleWithXData);
            }

            // 为圆附加XData
            using (DBObject circle = circleId.GetObject(OpenMode.ForWrite))
            {
              using (ResultBuffer rb = new ResultBuffer(
                new TypedValue(1001, "Here is application name"), // XData必须以应用程序名称开始,与注册的名称相同
                new TypedValue(1000, "Extended Data for ODA app"),
                new TypedValue(1000, "Write the data here"))
              )
              {
                // 使用另一种方式添加值
                rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "One more value added using another way."));
                circle.XData = rb;
              }
            }
          }
          // 提交事务
          tr.Commit();
        }
        // 保存文件
        db.SaveAs(path + "XDataEx.dwg", DwgVersion.Current);
      }
    }
  }
}

原文地址:https://blog.csdn.net/weixin_43118159/article/details/145279569

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!