Revit二次开发之批量修改族名称及族类型名称

昨天是参加工作整一年的好日子,在这一年中逐步开始接触C#和Revit二次开发,困扰和BUG伴随着整个学习过程。由于Revit二次开发的资料和课程不多,很多情况下都是依靠博客、技术贴和QQ群里的大神等方法度过难关。在此开始撰写博客,一是总结归纳开发过程中的所感所得,二是回报大众,共同进步。 Revit二次开发之批量修改族名称及族类型名称_第1张图片
大量的重复性工作会严重地影响效率和工作心情,这里就突出了批量修改的重要作用(请忽略logo的丑,大汗)。为了找到解决办法,咨询了不少大神,这里想要感谢一下“站楼顶望天空”,谢谢大神给予的提示和帮助。批量修改包含的方面有族名称、族类型名称、族参数、族材质等,今天只总结一下族名称和族类型名称的批量修改。修改的思路很简单,就是类似于word中的查找和替换,如图2所示,只要输入替换和被替换的内容,选择相应的族实例即可。
Revit二次开发之批量修改族名称及族类型名称_第2张图片
修改族名称在Revit中有两种思路,一种是在项目中修改,一种是在族编辑器中修改。在项目中修改需要获取项目文档,而在族编辑器中修改一般需要获取项目文档和族文档(族编辑器为FamilyManager)。
所有对族的修改必须要在相应的事务中进行。要在事件响应中修改文档,必须显式地启动一个事务,在该事务中修改文档。如果是在事件中打开事务,则事务必须在该事件响应结束前被关闭(提交或者撤销),否则在该事务中的所做的所有的修改都会被丢弃(本段摘自《二次开发基础教程》P27 同济大学出版社,给本书点个赞,真的是小白必备)。
1、族名称批量修改

        /// 
        /// 族名称批量替换修改
        /// 
        /// 
        public void ReplaceFamilyName(UIApplication app)
        {
     
            UIDocument uidoc = app.ActiveUIDocument; //取得文档
            Document doc = uidoc.Document;

            //取得选择的元素
            Selection sel = app.ActiveUIDocument.Selection;
            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)的组,这里再次强调下修改族类型可以在项目中和族管理器中进行,两者分别是依据FamilySymbol类和FamilyType类,需要注意区分。而想要得到族类型组,最好的方法就是通过元素过滤器取得(参考书P148)。另外需要注意的是修改后的族类型名称有可能和现有的族类型名称冲突,需要加以判断。不冲突的话可以使用复制方法(Duplicate),冲突的话直接切换成已有的族类型名称即可(ChangeTypeId)。目前经过我的尝试,改变族类型的方法只有通过ChangeTypeId,依据族类型的ID方可进行修改。
2、族类型名称批量修改

        /// 
        /// 族类型名称批量替换修改
        /// 
        /// 
        public void ReplaceSymbolName(UIApplication app)
        {
     
            UIDocument uidoc = app.ActiveUIDocument; //取得文档
            Document doc = uidoc.Document;

            //取得选择的元素
            Selection sel = app.ActiveUIDocument.Selection;
            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;
                                    }
                                }

                                //判断替换后的族类型名称是否已经存在,分别处理
                                if (symbolExist)
                                {
     
                                    familyInstance2.ChangeTypeId(elementId);      //依据ID改变族类型
                                }
                                else
                                {
     
                                    familySymbol = symbol.Duplicate(changedSymbolName);     //复制生成新的族类型
                                    elementId = familySymbol.Id;     //获取新的族类型的ID
                                    familyInstance2.ChangeTypeId(elementId);      //依据ID改变族类型
                                }

                            }
                            trans.Commit();
                        }
                    }
                }

            } 
            catch (Exception ex)
            {
     
                TaskDialog.Show("info", ex.ToString());
            }
        }

新手之作,有错误或者改进之处欢迎大家指正,当然有不懂的地方大家也可以一起交流,努力!

你可能感兴趣的:(Revit二次开发,Revit二次开发,族名称,族类型,批量修改)