C# CAD-Xdata数据添加与修改

 运行环境Visual Studio 2022 c# cad2016

一、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(扩展数据)特定代码值 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字符串。由于只是读取数据,因此无需提交事务。 

//祝大家好运

//感谢大家的点赞,收藏,转发,关注  

你可能感兴趣的:(CAD二次开发,算法)