·系統族是Revit內置的族,不可以自由編輯它的模型、類型和參數。
·內建族和構建族允許編輯和創建自定義的模型、類型和參數,區別是內建族只能存儲在當前的項目文檔裏,不能被其他文檔使用。
編輯族(EditFamily)和載入族(LoadFamily)的方法:
在當前文檔中,如果加載了一些構建族,並創建了這些族的族實例,那麼,對某個族進行EditFamily操作,將會進入到族編輯的文檔中,可以對族進行修改。
使用這個方法將在內存中新創建一個獨立的拷貝文檔,修改這份文檔之後,如果要之前的工程應用這些修改,那麼需要使用帶有IFamiiyLoadOptions接口參數的LoadFamily重載方法重新載入族並覆蓋應用到使用中的族實例中。
Autodesk.Revit.DB.IFamilyLoadOptions是提供族載入選項的接口類,它有兩個接口函數,可以根據需要實現這兩個接口函數,在LoadFamily中就可以實現想要的功能,如下表。
方法 |
描述 |
bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues) |
當族實例在目標文檔中被找到時,將被觸發執行的回 調函數 |
bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues) |
當共享族實例在目標文檔中被找到時,將被觸發執行 的回調函數 |
繼承IFamilyLoadOptions例子:
class projectFamLoadOption : IFamilyLoadOptions
{
bool IFamilyLoadOptions.OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = true;
return true;
}
bool IFamilyLoadOptions.OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
{
source = FamilySource.Project;
overwriteParameterValues = true;
return true;
}
};
其中,overwriteParameterValues設爲true時,在重新載入族的時候會覆蓋舊的參數和參數值。
然後在當前工程文檔中編輯一個構建族,如門、窗、桌子等。在族文檔中加入一個新的文字類型的參數,名字爲“MyParam”。修改後將編輯的族重新載入到工程文檔,這樣該族所有的族實例都會有一個名字爲“MyPamm”的新參數。
可以使用以下方法:
void EditAndLoadFamilyToDocument(Autodesk.Revit.DB.Document projectDoc, Autodesk.Revit.DB.Document RevitDoc, Element element)
{
// 這裏是自定義族實例,比如門,窗,桌子…
FamilyInstance famInst = element as FamilyInstance;
// 編輯族,拿到族文檔
Autodesk.Revit.DB.Document familyDoc = projectDoc.EditFamily(famInst.Symbol.Family);
// 在族文檔中添加一個新的參數
using (Transaction tran = new Transaction(projectDoc, "Edit family Document."))
{
tran.Start();
string paramName = "MyParam ";
familyDoc.FamilyManager.AddParameter(paramName, BuiltInParameterGroup.PG_TEXT, ParameterType.Text, false);
tran.Commit();
}
// 將這些修改重新載入到工程文檔中
Family loadedFamily = familyDoc.LoadFamily(RevitDoc, new projectFamLoadOption());
}
在編輯族和載入族的時候,需要注意下面幾點:
① 如果當前文檔正在被修改中(有打開但沒有關掉的事務)或者處在只讀的狀態, EditFamily方法不能被調用。可以使用IsModifiable和IsReadOnly屬性來判斷和檢査文檔的狀態。
② EditFamily方法也不能在動態更新機制(Dynamic Updates)中使用。
③ 在LoadFamily方法,可以用RevitUIFamilyLoadOptions彈出一個提示框來與用戶進行交互。
=========【更多高級應用請關注公衆號】========
==================================