Revit二次開發之編輯族並載入到項目文檔裏

族在Revit中是個很重要的概念。族是一種元素,它分爲系統族、內建族 和構建族
·系統族是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彈出一個提示框來與用戶進行交互。


=========【更多高級應用請關注公衆號】========


==================================


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章