您的位置:首页 > 其它

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

2018-01-05 21:33 1161 查看
族在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弹出一个提示框来与用户进行交互。

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



==================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: