明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1060|回复: 0

【转载】C# CAD-Xdata数据添加,修改,清除,删除

[复制链接]
发表于 2024-9-6 09:31:02 | 显示全部楼层 |阅读模式
本帖最后由 qq1254582201 于 2024-9-6 11:11 编辑

一、XData(扩展数据)特定代码值
XData(扩展数据)特定代码值 XData通过一系列DXF组码(DxfCode)存储不同类型的数据,包括但不限于ASCII字符串、已注册应用程序名称、控制字符串、图层信息、二进制数据块、坐标值、方向向量、实数、距离、比例和整数等。


  1. ExtendedDataAsciiString=1000:表示一个ASCII格式的字符串。
  2. ExtendedDataRegAppName=1001:指向已注册应用程序的名称,用于识别或解释相关联的XData。
  3. ExtendedDataControlString = 1002:控制字符串,通常用作分隔符或其他特殊标记用途。
  4. ExtendedDataLayerName = 1003:图层名称信息。
  5. ExtendedDataBinaryChunk = 1004:二进制数据块,用于存储非文本格式数据。
  6. ExtendedDataHandle=1005:句柄,指向数据库中的其他对象。

  7. 坐标相关:
  8. ExtendedDataXCoordinate =1010
  9. ExtendedDataYCoordinate = 1020
  10. ExtendedDataZCoordinate=1030:分别表示笛卡尔坐标系下的X、Y、Z坐标值。
  11. ExtendedDataWorldXCoordinate=1011, ExtendedDataWorldYCoordinate =1021, ExtendedDataWorldZCoordinate =1031:世界坐标系下的绝对坐标X、Y、Z。
  12. ExtendedDataWorldXDisp, ExtendedDataWorldYDisp, ExtendedDataWorldZDisp:世界坐标系下的位移量。
  13. ExtendedDataWorldXDir, ExtendedDataWorldYDir, ExtendedDataWorldZDir:世界坐标系下的方向向量。

  14. 其他数值类型:
  15. ExtendedDataReal=1040:实数类型的数值。
  16. ExtendedDataDist =1041:距离数值,精确的距离测量结果。
  17. ExtendedDataScale=1042:比例数值,例如缩放因子。

  18. 整数类型:
  19. ExtendedDataInteger16= 1070:16位整数。
  20. ExtendedDataInteger32=1071:32位整数。
  21. ExtendedDataLong=1072:有时也用于表示32位整数,具体取决于上下文。
复制代码

还有更多其它组码用来表示颜色、点样式、线型等图形属性以及各种布尔值、角度、日期时间等数据类型。
二、新建注册应用程序的名称
当使用XData(扩展数据)存储自定义信息时,包含一个DXF组码为ExtendedDataRegAppName=1001的数据,确保其他软件组件能够根据这个标识来解析相应的数据格式。

  1. public static void CreateRegApp(this Document doc, string appName)
  2. {
  3.      try
  4.      {
  5.          using (var documentLock = doc.LockDocument())
  6.          {
  7.              using (Transaction trans = doc.Database.TransactionManager.StartTransaction())
  8.              {
  9.                  RegAppTable table = (RegAppTable)trans.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);
  10.                  if (!table.Has(appName))
  11.                  {
  12.                      RegAppTableRecord regAppRec = new RegAppTableRecord();
  13.                      regAppRec.Name = appName;
  14.                      table.Add(regAppRec);
  15.                      trans.AddNewlyCreatedDBObject(regAppRec, true);
  16.                  }
  17.                  trans.Commit();
  18.              }

  19.          }
  20.      }
  21.      catch (Exception ex)
  22.      {
  23.          throw ex;
  24.      }
  25. }


三、向选定实体添加扩展数据(XData)
选定的AutoCAD实体上添加包含已注册应用程序标识以及特定ASCII文本信息的扩展数据。

  1. using (Transaction transaction = db.TransactionManager.StartTransaction())
  2. {
  3.      Entity ent01 = transaction.GetObject(outerId, OpenMode.ForWrite) as Entity;
  4.      ResultBuffer rb = new ResultBuffer();
  5.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, "ACAD"));
  6.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "作者:John Doe"));

  7.      ent01.XData = rb;
  8.      // 构造 ResultBuffer 对象来存储扩展数据

  9.      transaction.Commit();
  10.      ed.WriteMessage("\n成功向选中实体添加了 XData。");
  11. }


四、检查是否成功添加了扩展数据(XData)

编写代码检查: 您可以再次通过.NET API读取刚刚设置过XData的实体,并查看其XData属性来验证数据是否已成功添加。

  1. using (Transaction transaction = db.TransactionManager.StartTransaction())
  2. {
  3.      Entity ent01 = transaction.GetObject(outerId, OpenMode.ForRead) as Entity;

  4.      // 检查实体是否存在扩展数据
  5.      if (ent01.XData != null)
  6.      {
  7.          ResultBuffer rb = ent01.XData; // 获取实体的扩展数据

  8.          // 遍历ResultBuffer以查看数据
  9.          foreach (TypedValue tv in rb)
  10.          {
  11.              switch ((DxfCode)tv.TypeCode)
  12.              {
  13.                  case DxfCode.ExtendedDataRegAppName:
  14.                      string regAppName = tv.ToString();
  15.                      break;
  16.                  case DxfCode.ExtendedDataAsciiString:
  17.                      string asciiData = tv.ToString();
  18.                      ed.WriteMessage("\n找到的ASCII字符串: " + asciiData);
  19.                      break;
  20.                      // 其他类型的DXF组码...
  21.              }
  22.          }
  23.      }
  24.      else
  25.      {
  26.          ed.WriteMessage("\n实体没有扩展数据!");
  27.      }

  28.      // 无需在这里提交事务,因为我们只是读取数据
  29. }


五、修改Xdata数据
其实添加修改都是一样的方法,没有就是添加,有就是修改。

  1. // 遍历ResultBuffer以查看数据
  2. using (Transaction transaction = db.TransactionManager.StartTransaction())
  3. {

  4.      Entity ent01 = transaction.GetObject(outerId, OpenMode.ForWrite) as Entity;
  5.      RegAppTable table = (RegAppTable)transaction.GetObject(doc.Database.RegAppTableId, OpenMode.ForWrite, false);
  6.      //注册应用程序的名称
  7.      //预编号 YBDJH
  8.      ResultBuffer rb = new ResultBuffer();
  9.      string appName = "YBDJH";
  10.      if (!table.Has(appName))
  11.      {
  12.          RegAppTableRecord regAppRec = new RegAppTableRecord();
  13.          regAppRec.Name = appName;
  14.          table.Add(regAppRec);
  15.          transaction.AddNewlyCreatedDBObject(regAppRec, true);
  16.      }
  17.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  18.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, ybh));
  19.      appName = "SOUTH";
  20.      if (!table.Has(appName))
  21.      {
  22.          RegAppTableRecord regAppRec = new RegAppTableRecord();
  23.          regAppRec.Name = appName;
  24.          table.Add(regAppRec);
  25.          transaction.AddNewlyCreatedDBObject(regAppRec, true);
  26.      }
  27.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  28.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "300000"));
  29.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "JC"+ybh));
  30.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString,  qlr));
  31.      rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, "0710"));

  32.      ent01.XData = rb;

  33.      transaction.Commit();
  34.      ed.WriteMessage("\n 修改XData。");
  35. }


六、清除Xdata数据,删除
获得实体 ent.XData = new ResultBuffer();赋值空值就完成清除Xdata数据,删除数据就是赋值空值

  1. using (Transaction tr = db.TransactionManager.StartTransaction())// 开始事务处理以确保数据一致性
  2. {
  3.     foreach (ObjectId outerId in outerSelRes.Value.GetObjectIds())// 遍历所有被选中的外部多段线
  4.     {
  5.         using (Polyline outerPolyline = (Polyline)tr.GetObject(outerId, OpenMode.ForRead))// 读取所选多段线
  6.         {
  7.             Entity ent = tr.GetObject(outerId, OpenMode.ForWrite) as Entity;
  8.             ent.XData = new ResultBuffer();
  9.             ed.WriteMessage("\nXData 清除成功.");
  10.         }
  11.     }
  12.     tr.Commit();
  13. }



七、总结:
一、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


您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-22 20:03 , Processed in 0.187599 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表