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

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 748|回复: 3
打印 上一主题 下一主题

了解Revit扩展存储数据(Extensible Storage)

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

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

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-15 14:09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


从Revit2012开始引入了扩展存储这个新技术,就是可以把一些数据存储到Revit中的某一个对象上。扩展数据只能通过编程的方式添加到对象上,通过Revit软件的界面无法添加。这是编程的一个大优势。你可以把任何的数据保存在Revit中的任何一个对象上。你自己的扩展数据始终跟着这个Rvt文件走,不会丢失。 而且存储的数据可以设置访问权限。对于保密数据可以只能是你自己的程序读取,或只有具有特殊的开发者代号的程序才能访问。对于数据的保密性非常有帮助。

创建共享参数步骤:


创建并命名新的数据架构(Schema)
设置数据架构(Schema)读写访问权限
向数据架构增加字段(一个或多个)
基于数据架构创建一个数据对象(Entity)
给数据对象Entity中的字段赋值
关联数据对象Entity和Revit模型中的对象

下面时段代码演示:

  1. [csharp] view plaincopy
  2. public Result Execute(  
  3.   ExternalCommandData commandData,  
  4.   ref string message,  
  5.   ElementSet elements)  
  6. {  
  7.   UIDocument uiDoc = commandData.Application.ActiveUIDocument;  
  8.   Document doc = uiDoc.Document;  
  9.   
  10.   // Create transaction for working with schema  
  11.   
  12.   Transaction trans = new Transaction(doc, "Extensible Storage");  
  13.   trans.Start();  
  14.   
  15.   // Select a wall element  
  16.   
  17.   Wall wall = null;  
  18.   
  19.   try  
  20.   {  
  21.     Reference r = uiDoc.Selection.PickObject(ObjectType.Element,  
  22.       new WallSelectionFilter());  
  23.   
  24.     wall = doc.GetElement(r) as Wall;  
  25.   }  
  26.   catch (Autodesk.Revit.Exceptions.OperationCanceledException)  
  27.   {  
  28.     message = "Nothing selected; please select a wall to attach extensible data to.";  
  29.     return Result.Failed;  
  30.   }  
  31.   
  32.   Debug.Assert(null != wall, "expected a wall to be selected");  
  33.   
  34.   if (null == wall)  
  35.   {  
  36.     message = "Please select a wall to attach extensible data to.";  
  37.     return Result.Failed;  
  38.   }  
  39.   
  40.   // Create a schema builder  
  41.   
  42.   SchemaBuilder builder = new SchemaBuilder(_guid);  
  43.   
  44.   // Set read and write access levels  
  45.   
  46.   builder.SetReadAccessLevel(AccessLevel.Public);  
  47.   builder.SetWriteAccessLevel(AccessLevel.Public);  
  48.   
  49.   // Note: if this was set as vendor or application access,   
  50.   // we would have been additionally required to use SetVendorId  
  51.   
  52.   // Set name to this schema builder  
  53.   
  54.   builder.SetSchemaName("WallSocketLocation");  
  55.   builder.SetDocumentation("Data store for socket related info in a wall");  
  56.   
  57.   // Create field1  
  58.   
  59.   FieldBuilder fieldBuilder1 =  
  60.     builder.AddSimpleField("SocketLocation", typeof(XYZ));  
  61.   
  62.   // Set unit type  
  63.   
  64.   fieldBuilder1.SetUnitType(UnitType.UT_Length);  
  65.   
  66.   // Add documentation (optional)  
  67.   
  68.   // Create field2  
  69.   
  70.   FieldBuilder fieldBuilder2 =  
  71.     builder.AddSimpleField("SocketNumber", typeof(string));  
  72.   
  73.   //fieldBuilder2.SetUnitType(UnitType.UT_Custom);  
  74.   
  75.   // Register the schema object  
  76.   
  77.   Schema schema = builder.Finish();  
  78.   
  79.   // Create an entity (object) for this schema (class)  
  80.   
  81.   Entity ent = new Entity(schema);  
  82.   Field socketLocation = schema.GetField("SocketLocation");  
  83.   ent.Set<XYZ>(socketLocation, new XYZ(2, 0, 0), DisplayUnitType.DUT_METERS);  
  84.   
  85.   Field socketNumber = schema.GetField("SocketNumber");  
  86.   ent.Set<string>(socketNumber, "200");  
  87.   
  88.   wall.SetEntity(ent);  
  89.   
  90.   // Now create another entity (object) for this schema (class)  
  91.   
  92.   Entity ent2 = new Entity(schema);  
  93.   Field socketNumber1 = schema.GetField("SocketNumber");  
  94.   ent2.Set<String>(socketNumber1, "400");  
  95.   wall.SetEntity(ent2);  
  96.   
  97.   // Note: this will replace the previous entity on the wall   
  98.   
  99.   // List all schemas in the document  
  100.   
  101.   string s = string.Empty;  
  102.   IList<Schema> schemas = Schema.ListSchemas();  
  103.   foreach (Schema sch in schemas)  
  104.   {  
  105.     s += "\r\nSchema Name: " + sch.SchemaName;  
  106.   }  
  107.   TaskDialog.Show("Schema details", s);  
  108.   
  109.   // List all Fields for our schema  
  110.   
  111.   s = string.Empty;  
  112.   Schema ourSchema = Schema.Lookup(_guid);  
  113.   IList<Field> fields = ourSchema.ListFields();  
  114.   foreach (Field fld in fields)  
  115.   {  
  116.     s += "\r\nField Name: " + fld.FieldName;  
  117.   }  
  118.   TaskDialog.Show("Field details", s);  
  119.   
  120.   // Extract the value for the field we created  
  121.   
  122.   Entity wallSchemaEnt = wall.GetEntity(Schema.Lookup(_guid));  
  123.   
  124.   XYZ wallSocketPos = wallSchemaEnt.Get<XYZ>(  
  125.     Schema.Lookup(_guid).GetField("SocketLocation"),  
  126.     DisplayUnitType.DUT_METERS);  
  127.   
  128.   s = "SocketLocation: " + Format.PointString(wallSocketPos);  
  129.   
  130.   string wallSocketNumber = wallSchemaEnt.Get<String>(  
  131.     Schema.Lookup(_guid).GetField("SocketNumber"));  
  132.   
  133.   s += "\r\nSocketNumber: " + wallSocketNumber;  
  134.   
  135.   TaskDialog.Show("Field values", s);  
  136.   
  137.   trans.Commit();  
  138.   
  139.   return Result.Succeeded;  
  140. }  
复制代码
转载请复制以下信息:原文链接: http://blog.csdn.net/joexiongjin/article/details/7776552作者:  叶雄进 , Autodesk ADN

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

本版积分规则

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

GMT+8, 2024-11-16 19:06

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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