您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > phil-让你的插件更Revit-扩展存储和模型动态更新DMU
©2013Autodesk让你的插件更Revit!-扩展存储ES和模型动态更新DMU夏晓飞技术主管开发者训练营2013©2013Autodesk什么样的插件很Revit门窗表的故事扩展存储ExtensibleStorage模型动态更新DynamicModelUpdater日程©2013Autodesk什么样的插件很Revit©2013Autodesk故事:编辑增强器(门窗表)Revit门明细表Revit符合中国建筑规范门窗明细表©2013Autodesk故事:编辑增强器Revit2011Revit2014©2013Autodesk故事:编辑增强器Revit2011Revit2014©2013Autodesk扩展存储ExtensibleStorage©2013Autodesk什么是扩展存储ESImagecourtesyofJayShuster可以通过编程的方式在Revit文档中存储任意数据支持简单数据类型,例如整形integer,双精度double,字符串string,elementid支持复合类型,例如lists和dictionaries可以替换原来利用共享参数来存储数据的老技术可以限制数据的读写操作©2013Autodesk扩展存储ES的特点ImagecourtesyofJayShuster使用方便面向对象的设计模式,Class类似的结构元数据可以根据VendorId和AppId来限制数据的读写内建支持ElementId,UV和XYZ点或者向量可以存储数据到任何elementSchema的定义就是一系列的fieldEntity里存放真正的数据,最终插入到Element里©2013Autodesk扩展存储ES和共享参数的比较ImagecourtesyofJayShuster单位高级自定义类型Element对象删除和工作集中Id的重映射。选择性的隐藏或者暴露数据。©2013Autodesk扩展存储ES:基础ImagecourtesyofJayShuster数据结构定义Schema和field面向对象的类型定义,或者数据表数据容器实例Entity面向对象的类型实例,或者数据行Autodesk.Revit.DB.ExtensibleStoragenamespace类型Schema,SchemaBuilder,Field,FieldBuilder,Entity©2013Autodesk扩展存储ES:数据类型ImagecourtesyofJayShusterbool,short,int,float,doubleStringGuidElementIdAutodesk.Revit.DB.UVAutodesk.Revit.DB.XYZArray–System.Collections.Generic.IListTMap–System.Collections.Generic.IDictionaryTKey,TValue,noreal-valuedkeyAutodesk.Revit.DB.ExtensibleStorage.Entity–aSchemainstanceorSubSchema©2013Autodesk扩展存储ES:Schema的定义ImagecourtesyofJayShusterSchemaBuilder的三个方法AddSimpleField(stringname,Type)AddArrayField(stringname,Type)AddMapField(stringname,TypekeyType,TypevalueType)返回一个FieldBuilder的实例FieldBuilder提供更多的方法来修饰一个FieldDocumentationUnits©2013Autodesk扩展存储ES:单位ImagecourtesyofJayShuster浮点类型的fields需要一个单位描述float,double,XYZ,UV和这些值的容器类型长度,温度,等内部支持单位转换例子:通过FieldBuilder.SetUnitType指定单位为长度UT_Length真正通过Entity.Set和Entity.Get函数设置或者获取数据时,可以指定单位为英尺DUT_DECIMAL_FEET©2013Autodesk扩展存储ES例子:XYZ点ImagecourtesyofJayShuster创建数据结构的定义,也就是创建schema和它的fields创建数据实例的容器也就是entity设置数据到实例的容器entity将数据注入到一个element里©2013Autodesk扩展存储ES例子:XYZ点ImagecourtesyofJayShuster©2013Autodesk列举所有的schemaImagecourtesyofJayShusterSchema类型的静态成员函数ListSchemas所有内存中注册了的schema都会被返回如果有以前的文档(即使现在关闭了)中的schema也会被包含其中只有schema本身被返回,具体应用到哪个文档,或者与文档相关的信息是没有包含的©2013Autodesk模型文档中的ESImagecourtesyofJayShuster检查给定的element是否包含了一个schema遍历所有的element,检查每个element是否包含一个schemaentity?示例代码:©2013Autodesk扩展存储ES例子:复杂数据ImagecourtesyofJayShuster使用SchemaBuilder的AddArrayField和AddMapField函数使用.NET类库中的泛型容器类型Array:IListTMap:IDictionaryTKey,TValue用对应容器生成具体的数据设置entity的值示例代码:©2013Autodesk移除模型中的扩展存储数据ImagecourtesyofJayShuster单个的entity:Element.DeleteEntityExampleusageinUpgradeSchema所有文档中整个schema:Schema.EraseSchemaAndAllEntities参数包括schema和overrideWriteAccessWithUserPermission©2013Autodesk在Revit的element中存一个文件ImagecourtesyofJayShuster定义一个schema,保存一个byte的数fieldBuilder=schemaBuilder.AddArrayField(Data,typeof(byte));将文件数据转化为byte流byte[]data=File.ReadAllBytes(filename);entity.SetIListbyte(schema.GetField(Data),data);©2013Autodesk从Revit的element中取出一个文件ImagecourtesyofJayShuster从schema的entity中取出byte流将byte流还原成文件Entityent=e.GetEntity(schema);stringfilepath=Path.Combine(ent.Getstring(schema.GetField(Folder)),ent.Getstring(schema.GetField(Filename)));byte[]data=ent.GetIListbyte(schema.GetField(Data)).ToArraybyte();File.WriteAllBytes(filepath,data);©2013Autodesk扩展存储element(2013)ImagecourtesyofJayShuster专门用于扩展存储的element在单独的element里有逻辑的组织ES的entities在共享工作集里,可以单独的更新数据而不需要锁住其他的elements©2013Autodesk写入DataStorageElementImagecourtesyofJayShuster创建DataStorage对象静态的创建函数创建entity设置数据代码示例:DataStoragemyElement=DataStorage.Create(doc);Entityentity=newEntity(mySchema);entity.Set(...);myElement.SetEntity(entity);©2013Autodesk读取DataStorageElementImagecourtesyofJayShuster从模型文档中取出DataStorageelement从DataStorageelement中取出entity从entity中取出数据ElementmyElement=newFilteredElementCollector(doc).OfClass(typeof(DataStorage)).FirstElement();Entityent=myElement.GetEntity(mySchema);varx=ent.Get...(...);©2013Autodesk识别你的DataStorageelementImagecourtesyofJayShuster你可以使用DataStorageelement单件其他插件的DataStorageelements利用DataStorageelement的UniqueId属性?利用schema的GUID属性?创建辅助标识的schema?©2013Autodesk模型动态更新DMU©2013Autodesk什么是动态模型更新DMUImagecourtesyofJayShuster它提供了在Revit外部利用插件扩展模型生成的技术它是在一个事务transaction提交前执行的Updaters不会在undone和redone的事务里执行不允许在Updater执行时调用注册和注销UpdaterUpdaters可以是非强制性的,没有也不会报错(所有的Updaters默认是强制性的)Revit会解决发生冲突的updaters,一般会移除一个,或多个Updaters提供了一些被修改的elements的信息添加,删除,和修改的element的id©2013Autodesk注册一个DMUImagecourtesyofJayShuster实现一个IUpdater接口的类型VoidExecute(UpdaterDatadata)UpdaterIdGetUpdaterId()StringGetUpdaterName()StringGetAdditionalInformation()ChangePriorityGetChangePriority()注册UpdaterApplication级别和Document级别设置触发器代码示例:©2013Autodesk在DMU中被禁止的操作ImagecourtesyofJayShuster禁止调用或者修改:需要一个transaction的方法(Export/Import),或者必须在transaction外部调用的方法(Save&SaveAs)UI的方法(Picking,selections,etc)不能使用TransactionGroups,但是sub-transaction可以相互依赖的对象(可能导致
本文标题:phil-让你的插件更Revit-扩展存储和模型动态更新DMU
链接地址:https://www.777doc.com/doc-6659148 .html