【2025 ODA teigha .NET系列开发教程 第五章】给CAD实体添加附属数据XDATA,包括源码
系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
2025 ODA teigha .NET系列开发教程
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位整数
最佳实践
- 🔑 始终先注册应用程序名称
- 📝 使用有意义的键名存储XRecord
- 🔄 及时释放资源(使用using语句)
- ⚡ 选择合适的存储方式:
- 全局数据使用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)!