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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM