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;