Revit二次開發 Revit擴充套件儲存資料

2022-06-04 09:34:17 字數 3652 閱讀 8724

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 

public accesslevel readaccesslevel

public accesslevel writeaccesslevel

public

string vendorid

public

string schemaname

public field getfield(string

name);

public

bool writeaccessgranted();

entity物件的常用方法說明:

public fieldtype get(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)

field常用屬性定義如下:

public type valuetype 

public type keytype

public

string fieldname

public

bool isvalidobject

public schema schema

其基本如下:乙個element只能儲存乙個(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二次開發之路,走的非常的不順暢,走了非常多的彎路,經歷了很多艱苦的時刻,但是我沒有放棄,每個人也不一樣,相信你們很快的入門並且很快進步的,只要你們也和我一樣不放棄不...