我之前写了一篇文章谈到如何编程新建一个族,并加载到模型文件中。
编程加载族文件(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 2013 里面自带的族模板创建族。 在Revit2013里面如果使用Revit2012所带的族模板rft文件放入上面的代码中,则可以顺利加载进来。Revit2013和Revit2012 里面的模板族应该差别不大,所以可以通过使用Revit2012里面的族模板来解决这个问题。
C:\ProgramData\Autodesk\RAC 2012\Family Templates\English\Metric Generic Model.rft
另一个解决方案是还是使用Revit2013里面的族模板,创建族后,把族保存到本地,然后用LoadFamily加载本地硬盘上的那个族文件,可以顺利加载起来。