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元素物件之中。
//schema物件的屬性定義:儲存實體物件到element之中
public
void
setentity(
entity entity)//
從element物件中獲取實體
public
entity getentity(
schema schema
)
public guid guidentity物件的常用方法說明:public accesslevel readaccesslevel
public accesslevel writeaccesslevel
public
string vendorid
public
string schemaname
public field getfield(string
name);
public
bool writeaccessgranted();
public fieldtype get(field field);field常用屬性定義如下:public fieldtype get(string
fieldname, displayunittype displayunits);
public fieldtype get(field field, displayunittype displayunits);
public fieldtype get(string
fieldname);
public
void set(string
fieldname, fieldtype value);
public
void set(field field, fieldtype value, displayunittype displayunits);
public
void set(string
fieldname, fieldtype value, displayunittype displayunits);
public
void set(field field, fieldtype value)
public type valuetype其基本如下:乙個element只能儲存乙個(schema框架)下面的實體,假如重複儲存則會覆蓋原來資料。public type keytype
public
string fieldname
public
bool isvalidobject
public schema schema
2、datastorage其實就是乙個element物件,其可以建立多個,我們不像將資料儲存在任何元素之上,則可以儲存在datastorage,好處就是他不隨著任何元素的刪除而被刪除。
3、我們可以通過兩個建立類,實現所有物件的定義,如schemabuilder和filedbuilder兩個類,其**例項如下:
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;
Revit二次開發 初學
前言 由於工作需要,近期開始學習revit二次開發知識。學習的同時將學習過程與小夥伴們一起分享,希望後來的小夥伴在看到我的學習筆記的時候有所幫助。說明由於revit的版本在不斷更新中,所以我在學習revit的時候選擇了從revit自帶的幫助檔案開始學習,不同版本的revit,就看相應的help檔案。...
Revit二次開發 分割族
如有不明白,請qq254033230詢問。其實在revit裡是不存在分割族的概念。對於基於線形的族,截面沿線都是一樣,要想達到分割的狀態,只需要把族基於線的那條線變短,然後再在分割點複製乙個新的族即可。過程是先獲得線的均分點,然後把族的線縮短,接著再複製族,即可變成均分的效果。主要方法見 priva...
Revit二次開發 管道打斷
早就想寫點東西和大家分享了,但是介於自己的水平有限,遲遲沒有發布技術文章和大家交流。進入正題之前給大家先奉上一碗心靈雞湯,我的revit二次開發之路,走的非常的不順暢,走了非常多的彎路,經歷了很多艱苦的時刻,但是我沒有放棄,每個人也不一樣,相信你們很快的入門並且很快進步的,只要你們也和我一樣不放棄不...