完善主體資料,免費贈送VIP會員!
* 主體類型
* 企業(yè)名稱
* 信用代碼
* 所在行業(yè)
* 企業(yè)規(guī)模
* 所在職位
* 姓名
* 所在行業(yè)
* 學歷
* 工作性質
請先選擇行業(yè)
您還可以選擇以下福利:
行業(yè)福利,領完即止!

下載app免費領取會員

NULL

ad.jpg

Revit技巧 | Revit批量改名的方法:Revit二次開發(fā)之批量修改族名稱及族類型名稱

發(fā)布于:2024-09-30 11:02:33

BIM中文網(wǎng)

更多

    文章來源:CSDN博客

    昨天是參加工作整一年的好日子,在這一年中逐步開始接觸C#和Revit二次開發(fā),困擾和BUG伴隨著整個學習過程。由于Revit二次開發(fā)的資料和課程不多,很多情況下都是依靠博客、技術貼和QQ群里的大神等方法度過難關。在此開始撰寫博客,一是總結歸納開發(fā)過程中的所感所得,二是回報大眾,共同進步。 

image.png

    大量的重復性工作會嚴重地影響效率和工作心情,這里就突出了批量修改的重要作用(請忽略logo的丑,大汗)。為了找到解決辦法,咨詢了不少大神,這里想要感謝一下“站樓頂望天空”,謝謝大神給予的提示和幫助。批量修改包含的方面有族名稱、族類型名稱、族參數(shù)、族材質等,今天只總結一下族名稱和族類型名稱的批量修改。修改的思路很簡單,就是類似于word中的查找和替換,如圖2所示,只要輸入替換和被替換的內(nèi)容,選擇相應的族實例即可。

image.png

    修改族名稱在Revit中有兩種思路,一種是在項目中修改,一種是在族編輯器中修改。在項目中修改需要獲取項目文檔,而在族編輯器中修改一般需要獲取項目文檔和族文檔(族編輯器為FamilyManager)。

    所有對族的修改必須要在相應的事務中進行。要在事件響應中修改文檔,必須顯式地啟動一個事務,在該事務中修改文檔。如果是在事件中打開事務,則事務必須在該事件響應結束前被關閉(提交或者撤銷),否則在該事務中的所做的所有的修改都會被丟棄(本段摘自《二次開發(fā)基礎教程》P27 同濟大學出版社,給本書點個贊,真的是小白必備)。

    1、族名稱批量修改


        /// <summary>

        /// 族名稱批量替換修改

        /// </summary>

        /// <param name="app"></param>

        public void ReplaceFamilyName(UIApplication app)

        {

            UIDocument uidoc = app.ActiveUIDocument; //取得文檔

            Document doc = uidoc.Document;


            //取得選擇的元素

            ion sel = app.ActiveUIDocument.ion;

            try

            {

                var ref1 = sel.PickObjects(ObjectType.Element, "請選擇模型構件");

                if (0 == ref1.Count)

                {

                    TaskDialog.Show("Revit", "你沒有選任何元素.");

                }

                else

                {

                    //調用文本框中的值

                    string contentValue = MessageForm.contentValue;

                    string replaceValue = MessageForm.replaceValue;


                    //修改選中的族實例

                    foreach (var reference in ref1)

                    {

                        Element elem = doc.GetElement(reference);

                        if (elem != null)

                        {

                            //獲得族實例

                            FamilyInstance familyInstance = elem as FamilyInstance;

                            FamilySymbol symbol = familyInstance.Symbol;

                            Family family = symbol.Family;

                            //在事務中修改文檔

                            Transaction trans = new Transaction(doc);

                            trans.Start("changeFamilyName");

                            family.Name = family.Name.Replace(contentValue, replaceValue);

                            symbol.Name = symbol.Name.Replace(contentValue, replaceValue);

                            trans.Commit();

                        }

                    }

                }


            }

            catch (Exception ex)

            {

                TaskDialog.Show("info", ex.ToString());

            }

        }


    族類型名稱的修改和族名稱大同小異,但是需要注意的是每個族實例對應的只有一個族名稱,但是卻可能會存在多個族類型。因此首先需要得到一個已加載的族類型(FamilySymbol)的組,這里再次強調下修改族類型可以在項目中和族管理器中進行,兩者分別是依據(jù)FamilySymbol類和FamilyType類,需要注意區(qū)分。而想要得到族類型組,最好的方法就是通過元素過濾器取得(參考書P148)。另外需要注意的是修改后的族類型名稱有可能和現(xiàn)有的族類型名稱沖突,需要加以判斷。不沖突的話可以使用復制方法(Duplicate),沖突的話直接切換成已有的族類型名稱即可(ChangeTypeId)。目前經(jīng)過我的嘗試,改變族類型的方法只有通過ChangeTypeId,依據(jù)族類型的ID方可進行修改。

2、族類型名稱批量修改


        /// <summary>

        /// 族類型名稱批量替換修改

        /// </summary>

        /// <param name="app"></param>

        public void ReplaceSymbolName(UIApplication app)

        {

            UIDocument uidoc = app.ActiveUIDocument; //取得文檔

            Document doc = uidoc.Document;


            //取得選擇的元素

            ion sel = app.ActiveUIDocument.ion;

            try

            {

                var ref1 = sel.PickObjects(ObjectType.Element, "請選擇模型構件");

                if (0 == ref1.Count)

                {

                    TaskDialog.Show("Revit", "你沒有選任何元素.");

                }

                else

                {

                    //調用文本框中的值

                    string contentSymbolValue = MessageForm.contentSymbolValue;

                    string replaceSymbolValue = MessageForm.replaceSymbolValue;


                    //修改選中的族實例

                    foreach (var reference in ref1)

                    {

                        Element elem2 = doc.GetElement(reference);

                        if (elem2 != null)

                        {

                            //獲得族實例

                            FamilyInstance familyInstance2 = elem2 as FamilyInstance;

                            FamilySymbol symbol = familyInstance2.Symbol;

                            Family family = symbol.Family;

                            Transaction trans = new Transaction(doc);


                            trans.Start("changeFamilyName");

                            if (symbol.Name.Contains(contentSymbolValue))

                            {

                                string changedSymbolName = symbol.Name.Replace(contentSymbolValue, replaceSymbolValue);

                                ElementType familySymbol = null;    //新建的族類型

                                ElementId elementId = null;


                                //得到一個已加載的族類型(FamilySymbol)的組

                                FilteredElementCollector collectorSymbol = new FilteredElementCollector(doc);

                                IList<Element> symbols = collectorSymbol.OfClass(typeof(FamilySymbol)).ToElements();

                                bool symbolExist = false;

                                foreach (var item in collectorSymbol)

                                {

                                    if (item.Name == changedSymbolName)

                                    {

                                        symbolExist = true;

                                        elementId = item.Id;

                                    }

                                }


                                //判斷替換后的族類型名稱是否已經(jīng)存在,分別處理

                                if (symbolExist)

                                {

                                    familyInstance2.ChangeTypeId(elementId);      //依據(jù)ID改變族類型

                                }

                                else

                                {

                                    familySymbol = symbol.Duplicate(changedSymbolName);     //復制生成新的族類型

                                    elementId = familySymbol.Id;     //獲取新的族類型的ID

                                    familyInstance2.ChangeTypeId(elementId);      //依據(jù)ID改變族類型

                                }


                            }

                            trans.Commit();

                        }

                    }

                }


            } 

            catch (Exception ex)

            {

                TaskDialog.Show("info", ex.ToString());

            }

        }

    新手之作,有錯誤或者改進之處歡迎大家指正,當然有不懂的地方大家也可以一起交流,努力!

————————————————

版權聲明:本文為CSDN博主「藏風聚氣得水為上」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/weixin_42605872/java/article/details/94590316

本文版權歸腿腿教學網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權,謝絕轉載。

未標題-1.jpg

上一篇:CAD教程 | 如何在CAD中設置捕捉對象的快捷鍵

下一篇:CAD教程 | 如何將2021 CAD 背景設置為黑色?

60acb4e0ef112.png