Revit二次开发之编辑族并载入到项目文档里

时间:2021-08-27 05:41:15
族在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弹出一个提示框来与用户进行交互。


=========【更多高级应用请关注公众号】========

Revit二次开发之编辑族并载入到项目文档里

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