- 积分
- 4400
- 明经币
- 个
- 注册时间
- 2015-1-16
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 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
|
|