【转载】C# CAD-Xdata数据添加,修改,清除,删除
本帖最后由 qq1254582201 于 2024-9-6 11:11 编辑一、XData(扩展数据)特定代码值
XData(扩展数据)特定代码值 XData通过一系列DXF组码(DxfCode)存储不同类型的数据,包括但不限于ASCII字符串、已注册应用程序名称、控制字符串、图层信息、二进制数据块、坐标值、方向向量、实数、距离、比例和整数等。
ExtendedDataAsciiString=1000:表示一个ASCII格式的字符串。
ExtendedDataRegAppName=1001:指向已注册应用程序的名称,用于识别或解释相关联的XData。
ExtendedDataControlString = 1002:控制字符串,通常用作分隔符或其他特殊标记用途。
ExtendedDataLayerName = 1003:图层名称信息。
ExtendedDataBinaryChunk = 1004:二进制数据块,用于存储非文本格式数据。
ExtendedDataHandle=1005:句柄,指向数据库中的其他对象。
坐标相关:
ExtendedDataXCoordinate =1010
ExtendedDataYCoordinate = 1020
ExtendedDataZCoordinate=1030:分别表示笛卡尔坐标系下的X、Y、Z坐标值。
ExtendedDataWorldXCoordinate=1011, ExtendedDataWorldYCoordinate =1021, ExtendedDataWorldZCoordinate =1031:世界坐标系下的绝对坐标X、Y、Z。
ExtendedDataWorldXDisp, ExtendedDataWorldYDisp, ExtendedDataWorldZDisp:世界坐标系下的位移量。
ExtendedDataWorldXDir, ExtendedDataWorldYDir, ExtendedDataWorldZDir:世界坐标系下的方向向量。
其他数值类型:
ExtendedDataReal=1040:实数类型的数值。
ExtendedDataDist =1041:距离数值,精确的距离测量结果。
ExtendedDataScale=1042:比例数值,例如缩放因子。
整数类型:
ExtendedDataInteger16= 1070:16位整数。
ExtendedDataInteger32=1071:32位整数。
ExtendedDataLong=1072:有时也用于表示32位整数,具体取决于上下文。
还有更多其它组码用来表示颜色、点样式、线型等图形属性以及各种布尔值、角度、日期时间等数据类型。
二、新建注册应用程序的名称
当使用XData(扩展数据)存储自定义信息时,包含一个DXF组码为ExtendedDataRegAppName=1001的数据,确保其他软件组件能够根据这个标识来解析相应的数据格式。
public static void CreateRegApp(this Document doc, string appName)
{
try
{
using (var documentLock = doc.LockDocument())
{
using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
{
RegAppTable table = (RegAppTable)trans.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);
if (!table.Has(appName))
{
RegAppTableRecord regAppRec = new RegAppTableRecord();
regAppRec.Name = appName;
table.Add(regAppRec);
trans.AddNewlyCreatedDBObject(regAppRec, true);
}
trans.Commit();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
三、向选定实体添加扩展数据(XData)
选定的AutoCAD实体上添加包含已注册应用程序标识以及特定ASCII文本信息的扩展数据。
using (Transaction transaction = db.TransactionManager.StartTransaction())
{
Entity ent01 = transaction.GetObject(outerId, OpenMode.ForWrite) as Entity;
ResultBuffer rb = new ResultBuffer();
rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, "ACAD"));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "作者:John Doe"));
ent01.XData = rb;
// 构造 ResultBuffer 对象来存储扩展数据
transaction.Commit();
ed.WriteMessage("\n成功向选中实体添加了 XData。");
}
四、检查是否成功添加了扩展数据(XData)
编写代码检查: 您可以再次通过.NET API读取刚刚设置过XData的实体,并查看其XData属性来验证数据是否已成功添加。
using (Transaction transaction = db.TransactionManager.StartTransaction())
{
Entity ent01 = transaction.GetObject(outerId, OpenMode.ForRead) as Entity;
// 检查实体是否存在扩展数据
if (ent01.XData != null)
{
ResultBuffer rb = ent01.XData; // 获取实体的扩展数据
// 遍历ResultBuffer以查看数据
foreach (TypedValue tv in rb)
{
switch ((DxfCode)tv.TypeCode)
{
case DxfCode.ExtendedDataRegAppName:
string regAppName = tv.ToString();
break;
case DxfCode.ExtendedDataAsciiString:
string asciiData = tv.ToString();
ed.WriteMessage("\n找到的ASCII字符串: " + asciiData);
break;
// 其他类型的DXF组码...
}
}
}
else
{
ed.WriteMessage("\n实体没有扩展数据!");
}
// 无需在这里提交事务,因为我们只是读取数据
}
五、修改Xdata数据
其实添加修改都是一样的方法,没有就是添加,有就是修改。
// 遍历ResultBuffer以查看数据
using (Transaction transaction = db.TransactionManager.StartTransaction())
{
Entity ent01 = transaction.GetObject(outerId, OpenMode.ForWrite) as Entity;
RegAppTable table = (RegAppTable)transaction.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);
//注册应用程序的名称
//预编号 YBDJH
ResultBuffer rb = new ResultBuffer();
string appName = "YBDJH";
if (!table.Has(appName))
{
RegAppTableRecord regAppRec = new RegAppTableRecord();
regAppRec.Name = appName;
table.Add(regAppRec);
transaction.AddNewlyCreatedDBObject(regAppRec, true);
}
rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, ybh));
appName = "SOUTH";
if (!table.Has(appName))
{
RegAppTableRecord regAppRec = new RegAppTableRecord();
regAppRec.Name = appName;
table.Add(regAppRec);
transaction.AddNewlyCreatedDBObject(regAppRec, true);
}
rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "300000"));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "JC"+ybh));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString,qlr));
rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "0710"));
ent01.XData = rb;
transaction.Commit();
ed.WriteMessage("\n 修改XData。");
}
六、清除Xdata数据,删除
获得实体 ent.XData = new ResultBuffer();赋值空值就完成清除Xdata数据,删除数据就是赋值空值
using (Transaction tr = db.TransactionManager.StartTransaction())// 开始事务处理以确保数据一致性
{
foreach (ObjectId outerId in outerSelRes.Value.GetObjectIds())// 遍历所有被选中的外部多段线
{
using (Polyline outerPolyline = (Polyline)tr.GetObject(outerId, OpenMode.ForRead))// 读取所选多段线
{
Entity ent = tr.GetObject(outerId, OpenMode.ForWrite) as Entity;
ent.XData = new ResultBuffer();
ed.WriteMessage("\nXData 清除成功.");
}
}
tr.Commit();
}
七、总结:
一、XData(扩展数据)特定代码值 XData通过一系列DXF组码(DxfCode)存储不同类型的数据,包括但不限于ASCII字符串、已注册应用程序名称、控制字符串、图层信息、二进制数据块、坐标值、方向向量、实数、距离、比例和整数等。
二、新建注册应用程序的名称 为了使其他软件组件能够识别并解析自定义的XData格式,可以创建一个已注册的应用程序。提供的C#方法CreateRegApp会检查文档中的RegAppTable是否存在指定名称的应用程序,如果不存在,则创建新的RegAppTableRecord并添加到表中。
三、向选定实体添加扩展数据(XData) 通过.NET API,可以为选定的AutoCAD实体添加包含已注册应用程序标识和特定ASCII文本信息的XData。示例代码中创建了一个ResultBuffer对象,并向其中添加了指向“ACAD”注册应用程序和一个ASCII字符串的TypedValue,然后将该ResultBuffer设置为实体的XData属性。
四、检查是否成功添加了扩展数据(XData) 验证是否成功添加XData的方法是再次读取实体的XData属性。如果实体具有非空的XData属性,则遍历其内容并根据DXF组码解析出已添加的数据,例如在示例中输出找到的ASCII字符串。由于只是读取数据,因此无需提交事务。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/hb_ljj/article/details/136131306
页:
[1]