EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 561|回复: 0
打印 上一主题 下一主题

[实体对象] 添加扩展数据XDATA

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12408

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 15:03:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用ResultBuffer类  
        在ObjectARX中,resbuf结构给AutoCAD专门数据提供了一个灵活的存储器。在托管API中,这个结构被映射在Autodesk.AutoCAD.DatabaseServices.ResultBuffer类中。
     一个ResultBuffer类对象使用的方法与resbuf数据链相同。你要定义一个ResultBuffer并使它产生一系列的数据对。每一对数据由一个数据类型描述和一个值组成。在托管API中,
        这些数据对是Autodesk.AutoCAD.DatabaseServices.TypedValue类的实例。这个类实现的功能与resbuf结构的restype和resval成员一样。  
     TypedValue.TypeCode属性是一个16位的整数值,它表示TypedValue.Value属性的数据类型。可以使用的TypeCode值取决于ResultBuffer实例的具体使用情况。
        例如,适合于xrecord定义的TypeCode的值就不一定适用于xdata。Autodesk.AutoCAD.DatabaseServices.DxfCode枚举定义的代码精确地描述了所有可能的ResultBuffer数据类型的范围。
    因为TypedValue.Value属性与System.Object的一个实例相对应,所以它可以包含任何数据类型。但是,Value数据必须与TypeCode所表示的类一致,以保证结果的可用性。
    你可以通过给ResultBuffer的构造函数传递一个TypedValue对象数组来提前产生一个ResultBuffer,或者可以先构造一个空的ResultBuffer,
        然后通过调用ResultBuffer.Add()方法来加入新的TypedValue对象。
#region 添加扩展数据XDATA
  1. /// <summary>
  2.         /// 添加扩展数据xdata
  3.         /// </summary>
  4.         /// <param name="ent">被填充的实体</param>
  5.         /// <param name="obj">填充的数据</param>
  6.         /// <param name="regapptablename">regapptabl名称</param>
  7.         /// <returns></returns>
  8.         public Autodesk.AutoCAD.DatabaseServices.Entity AddXData(Autodesk.AutoCAD.DatabaseServices.Entity ent,Object obj,string regapptablename)
  9.         {
  10.             
  11.             Autodesk.AutoCAD.DatabaseServices.ObjectId objId = ent.ObjectId;
  12.             Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
  13.              Autodesk.AutoCAD.DatabaseServices.Entity retEntity ;
  14.             using (Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction())
  15.             {
  16.                 retEntity = trans.GetObject(ent.ObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite) as Autodesk.AutoCAD.DatabaseServices.Entity;
  17.                  
  18.                 Autodesk.AutoCAD.DatabaseServices.RegAppTable appTbl = trans.GetObject(db.RegAppTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite) as Autodesk.AutoCAD.DatabaseServices.RegAppTable;
  19.                 if (!appTbl.Has(regapptablename))
  20.                 {
  21.                     Autodesk.AutoCAD.DatabaseServices.RegAppTableRecord appTblRcd = new Autodesk.AutoCAD.DatabaseServices.RegAppTableRecord();
  22.                     appTblRcd.Name = regapptablename;
  23.                     appTbl.Add(appTblRcd);
  24.                     trans.AddNewlyCreatedDBObject(appTblRcd, true);
  25.                 }
  26.                 Autodesk.AutoCAD.DatabaseServices.ResultBuffer resBuf = new Autodesk.AutoCAD.DatabaseServices.ResultBuffer();
  27.                  
  28.                 // 先必须要将注册表添加到buffer里
  29.                 resBuf.Add(new Autodesk.AutoCAD.DatabaseServices.TypedValue((int)Autodesk.AutoCAD.DatabaseServices.DxfCode.ExtendedDataRegAppName, regapptablename));
  30.                 // 再将数据或对象加到buffer里 注意typecode 要是1000-1071里
  31.                 resBuf.Add(new Autodesk.AutoCAD.DatabaseServices.TypedValue((int)Autodesk.AutoCAD.DatabaseServices.DxfCode.ExtendedDataAsciiString, obj));//将某个对象添加到扩展数据中
  32.                 ent.XData = resBuf;
  33.                 trans.Commit();
  34.             }
  35.             return retEntity;
  36.         }
  37.         #endregion
  38.         #region 获取扩展数据
  39.         /// <summary>
  40.         /// 获取扩展数据集合
  41.         /// </summary>
  42.         /// <param name="ent">实体</param>
  43.         /// <returns>返回System.Collections.IEnumerator</returns>
  44.         public System.Collections.IEnumerator GetXData(Autodesk.AutoCAD.DatabaseServices.Entity ent)
  45.         {
  46.             Autodesk.AutoCAD.EditorInput.Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  47.             System.Collections.IEnumerator itor;
  48.             Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
  49.             using (Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction())
  50.             {
  51.                 ent = (Autodesk.AutoCAD.DatabaseServices.Entity)trans.GetObject(ent.ObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
  52.                 Autodesk.AutoCAD.DatabaseServices.ResultBuffer resBuf = ent.XData;
  53.                 if (resBuf != null)
  54.                 {
  55.                     //获取IEnumerator
  56.                     itor = resBuf.GetEnumerator();
  57.                 }
  58.                 else
  59.                     itor = null;
  60.             }
  61.             return itor;
  62.         }
  63.         /// <summary>
  64.         /// 获取实体的扩展数据
  65.         /// </summary>
  66.         /// <param name="ent">实体</param>
  67.         /// <returns>返回泛型的对象集</returns>
  68.         public List<System.Object> GetXDataList(Autodesk.AutoCAD.DatabaseServices.Entity ent)
  69.         {
  70.             Autodesk.AutoCAD.EditorInput.Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  71.             List<System.Object> objs = new List<System.Object>();
  72.             Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
  73.             using (Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction())
  74.             {
  75.                ent = (Autodesk.AutoCAD.DatabaseServices.Entity)trans.GetObject(ent.ObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
  76.                
  77.                 Autodesk.AutoCAD.DatabaseServices.ResultBuffer resBuf = ent.XData;
  78.                 if (resBuf != null)
  79.                 {                    
  80.                     System.Collections.IEnumerator itor = resBuf.GetEnumerator();
  81.                     while (itor.MoveNext())
  82.                     {
  83.                         Autodesk.AutoCAD.DatabaseServices.TypedValue tmpVal = (Autodesk.AutoCAD.DatabaseServices.TypedValue)itor.Current;
  84.                         objs.Add(tmpVal.Value);
  85.                     }
  86.                 }
  87.                 trans.Commit();
  88.             }
  89.             return objs;
  90.         }
  91.         #endregion
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-30 19:54

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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