Revit二次开发 Revit扩展存储数据
Revit二次开发过程中,需要将相关信息存储到RVT文件中,再次打开RVT的时候,可以通过读取这些信息,知道当前构件的基本状态,或者将一个特殊的信息存储到RVT文件中,从Revit2012开始引入了扩展存储这个新技术,就是可以把一些数据存储在Revit中的某一个对象上。且这个存储操作,只能通过编程实现,无法通过Revit的软件操作实现。这个大大增加了我们数据存储的优势,可以把任何的数据保存在Revit中的任何一个对象上,数据始终跟着这个Rvt文件走,不会丢失。 而且存储的数据可以设置访问权限。对于保密数据可以只能是你自己的程序读取,或只有具有特殊的开发者代号的程序才能访问,对于数据的保密性非常有帮助。
1、要实现Revit的数据存储,需了解几个常用的类Schema(框架)、Entity(实体)、Field(字段)、DataStorage(存储对象) 等。其之间的关系如下图所示:
画图理解为:
Schema用于定义架构和身份,就像造手机,贴个品牌,建一个外壳和内部架构,然后Entity则通过架构填充自己需要的内容,最后存储到Element中去。每个Element只允许存储一个带同一个Schema的Entity,如果再次写入就覆盖,这个很好理解。
对于Revit对象来说,只要继承自Element对象的子类,就具有SetEntity方法,可以将一个Entity实体对象存储到Element元素对象之中。
//存储实体对象到Element之中 public void SetEntity( Entity entity ) //从Element对象中获取实体 public Entity GetEntity( Schema schema )
Schema对象的属性定义:
public Guid GUID { get; } public AccessLevel ReadAccessLevel { get; } public AccessLevel WriteAccessLevel { get; } public string VendorId { get; } public string SchemaName { get; } public Field GetField(string name); public bool WriteAccessGranted();
Entity对象的常用方法说明:
public FieldType Get<FieldType>(Field field); public FieldType Get<FieldType>(string fieldName, DisplayUnitType displayUnits); public FieldType Get<FieldType>(Field field, DisplayUnitType displayUnits); public FieldType Get<FieldType>(string fieldName); public void Set<FieldType>(string fieldName, FieldType value); public void Set<FieldType>(Field field, FieldType value, DisplayUnitType displayUnits); public void Set<FieldType>(string fieldName, FieldType value, DisplayUnitType displayUnits); public void Set<FieldType>(Field field, FieldType value)
Field常用属性定义如下:
public Type ValueType { get; } public Type KeyType { get; } public string FieldName { get; } public bool IsValidObject { get; }
public Schema Schema { get; }
其基本如下:一个Element只能保存一个(Schema框架)下面的实体,假如重复保存则会覆盖原来数据。
2、DataStorage其实就是一个Element对象,其可以创建多个,我们不像将数据保存在任何元素之上,则可以存储在DataStorage,好处就是他不随着任何元素的删除而被删除。
3、我们可以通过两个创建类,实现所有对象的定义,如SchemaBuilder和FiledBuilder两个类,其代码实例如下:
UIApplication uiapp = commandData.Application; UIDocument uidoc = commandData.Application.ActiveUIDocument; Document doc = uidoc.Document; Autodesk.Revit.DB.View view = doc.ActiveView; Transaction tran = new Transaction(doc, "存储"); tran.Start(); DataStorage store = DataStorage.Create(doc); SchemaBuilder schemabulder = new SchemaBuilder(new Guid(System.Guid.NewGuid().ToString("D"))); schemabulder.SetReadAccessLevel(AccessLevel.Public); schemabulder.SetWriteAccessLevel(AccessLevel.Public); schemabulder.SetSchemaName("LeiFile"); schemabulder.SetDocumentation("DataStorageFile"); FieldBuilder fiedBuilder = schemabulder.AddArrayField("data", typeof(byte)); fiedBuilder.SetDocumentation("Store file data"); Schema schema = schemabulder.Finish(); string data="存储的数据"; Entity entity = new Entity(schema); Field field = schema.GetField("data"); entity.Set(IList(byte))(field, data); store.SetEntity(entity); tran.Commit(); DataStorage storage = new FilteredElementCollector(doc).OfClass(typeof(DataStorage)).Cast(DataStorage)().First(); Schema sch = Schema.ListSchemas().Where(o => o.SchemaName == "LeiFile").First(); return Result.Succeeded;