我之前写了一篇文章谈到如何编程新建一个族,并加载到模型文件中。
编程加载族文件(Revit2012)
http://blog.csdn.net/joexiongjin/article/details/7636666
在Revit2013里面,用LoadFamily方法加载族文件到模型中时,发生了一个变化。 那就是LoadFamily()函数的调用必须在主模型Document的事务没有打开的时候进行。但是在Revit2012里面,主模型Document的事务可以处于打开状态,然后加载族,这个可以从上面的那篇文章看出来。
在Revit2013里面下面的代码无法加载Revit里面(考虑到上面说到的Revit2013的无需事务)
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
public class RevitCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
{
UIApplication app = commandData.Application;
Autodesk.Revit.DB.Document familyDoc = app.Application.NewFamilyDocument(@"C:\ProgramData\Autodesk\RAC 2013\Family Templates\English\Metric Generic Model.rft");
Transaction transFamily = new Transaction(familyDoc);
transFamily.Start("familyCreation");
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();
SaveAsOptions op1 = new SaveAsOptions();
op1.OverwriteExistingFile = true;
bool re = familyDoc.SaveAs(@"c:\myfamily1.rfa", op1);
Autodesk.Revit.DB.Document doc = app.ActiveUIDocument.Document;
try
{
MyFamilyLoadOptions myOptions = new MyFamilyLoadOptions();
familyDoc.LoadFamily(doc, myOptions); //***报错!!
}
catch (Exception e)
{
TaskDialog.Show("load error",e.Message);
}
familyDoc.Close();
return Result.Succeeded;
}
}
class MyFamilyLoadOptions : IFamilyLoadOptions
{
public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = true;
return true;
}
public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
{
source = FamilySource.Project;
overwriteParameterValues = true;
return true;
}
}
但是在用这个代码是,Revit会发生错误,导致需要关闭当前文档。
解决办法:
经过一些测试,发现问题问题是因为采用了revit 2013 里面自带的族模板创建族。 在Revit2013里面如果使用Revit2012所带的族模板rft文件放入上面的代码中,则可以顺利加载进来。Revit2013和Revit2012 里面的模板族应该差别不大,所以可以通过使用Revit2012里面的族模板来解决这个问题。
C:\ProgramData\Autodesk\RAC 2012\Family Templates\English\Metric Generic Model.rft
另一个解决方案是还是使用Revit2013里面的族模板,创建族后,把族保存到本地,然后用LoadFamily加载本地硬盘上的那个族文件,可以顺利加载起来。
原文链接: http://blog.csdn.net/joexiongjin/article/details/8702258
作者: 叶雄进 , Autodesk ADN