·系统族是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弹出一个提示框来与用户进行交互。
=========【更多高级应用请关注公众号】========
==================================