转载请复制以下信息:
原文链接: http://write.blog.youkuaiyun.com/postedit/7636666
作者: 叶雄进 , Autodesk ADN
日期:2012.6.6
在进行Revit二次开发过程中,调用Document.LoadFamily(String, Family) ,返回的Family对象为null. 原因是什么?
我个人觉得返回null是因为已经在Document对象中存在需要加载的对象了。那么如何根据文件路径,从Document中删除这个族对象。
回答:
Revit 提供了5个重载函数LoadFamily来加载族。他们用途各不相同。
1: LoadFamily(String)
2: LoadFamily(Document)
3: LoadFamily(String, Family)
4: LoadFamily(Document, IFamilyLoadOptions)
5: LoadFamily(String, IFamilyLoadOptions, Family)
第一个函数用于加载一个族文件(.rfa) 到模型中,指定族文件的完整文件名(含目录),返回Family对象。 但是这个函数无法处理当前模型中已经有这个族的问题,如果族已经存在,无法加载。
第二个函数用于加载一个在后台打开或者仍在编辑中打开的族到模型中。这个函数有点难理解,需要吧目标模型文件作为参数放在,调用的Document是族Document,而不是模型Document
第三个函数与第一个函数差不多,只不过把返回值作为参数的形式传出来。返回值是布尔型。也无法加载已经存在的族。
第四个函数与第二个函数在功能上有类似之处,但是有些差别。 这个函数可以实现如果需要加载的族已经在当前模型文件中,该如何处理。这个函数可以加载已经存在的族。 它的第二个参数是一个接口。你需要新建一个类从这个接口派生,然后实现其两个函数:OnFamilyFound 和OnSharedFamilyFound。 前面的OnFamilyFound的意思是当发现已经存在时,你该怎么办?
bool OnFamilyFound(
bool familyInUse,
out bool overwriteParameterValues
)
familyInUse参数会告诉你这个族是否已经有实例插入到模型中。True是说这个族已经使用了,False表明尚未插入到模型中。
overwriteParameterValues 参数是你要告诉Revit是否覆盖已有族的参数值。
第五个函数实现的是加载一个存储在盘中的族文件到模型文件中。他可以加载已经存在的族。IFamilyLoadOptions 类型的参数用法与第四个一样的。
请看下面示例,演示如何加载并覆盖已经存在的族。
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Autodesk.Revit .DB;
using Autodesk.Revit.UI;
using Autodesk.Revit .ApplicationServices;
using Autodesk.Revit.Attributes ;
[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class RevitCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
{
UIApplication app = commandData.Application;
Document doc = app.ActiveUIDocument.Document;
Transaction trans = new Transaction(doc, "ExComm");
trans.Start();
//create a mass family and load it.
Document familyDoc = app.Application.NewFamilyDocument(@"C:\ProgramData\Autodesk\RAC 2012\Family Templates\English\Metric Site.rft");
Transaction transFamily = new Transaction(familyDoc);
transFamily.Start("familyCreation");
//create element in it.
CurveArrArray curveArrArr = app.Application.Create .NewCurveArrArray();
CurveArray curveArr = app.Application.Create .NewCurveArray();
Curve curve1 = app.Application.Create .NewLineBound(new XYZ(0,0,0),new XYZ(1,0,0));
Curve curve2 = app.Application.Create .NewLineBound(new XYZ(1,0,0),new XYZ(1,1,0));
Curve curve3 = app.Application.Create .NewLineBound(new XYZ(1,1,0),new XYZ(0,0,0));
curveArr.Append(curve1);
curveArr.Append(curve2);
curveArr.Append(curve3);
curveArrArr.Append(curveArr);
Plane plane = app.Application.Create.NewPlane(new XYZ(0,0,1),new XYZ(0,0,0));
SketchPlane sp = familyDoc.FamilyCreate.NewSketchPlane(plane);
familyDoc.FamilyCreate.NewExtrusion(true, curveArrArr, sp, 10);
transFamily.Commit();
//familyDoc.SaveAs(@"c:\test\myfamily.rfa");
MyFamilyLoadOptions myOptions = new MyFamilyLoadOptions();
familyDoc.LoadFamily(doc,myOptions);
//doc.LoadFamily(@"c:\test\myfamily.rfa");
trans.Commit();
return Result.Succeeded ;
}
}
public class MyFamilyLoadOptions : IFamilyLoadOptions
{
public bool OnFamilyFound(
bool familyInUse,
ref bool overwriteParameterValues)
{
overwriteParameterValues = false;
return true;
}
public bool OnSharedFamilyFound(
Family sharedFamily,
bool familyInUse,
ref FamilySource source,
ref bool overwriteParameterValues
)
{
overwriteParameterValues = true;
return true;
}
}