我之前写了一篇文章谈到如何编程新建一个族,并加载到模型文件中。 编程加载族文件(Revit2012)http://blog.csdn.net/joexiongjin/article/details/7636666
在Revit2013里面,用LoadFamily方法加载族文件到模型中时,发生了一个变化。 那就是LoadFamily()函数的调用必须在主模型Document的事务没有打开的时候进行。但是在Revit2012里面,主模型Document的事务可以处于打开状态,然后加载族,这个可以从上面的那篇文章看出来。
在Revit2013里面下面的代码无法加载Revit里面(考虑到上面说到的Revit2013的无需事务) - <font color="#333333"><font face="Arial">[csharp] view plaincopy
- [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;
- }
- } </font></font>
复制代码 但是在用这个代码是,Revit会发生错误,导致需要关闭当前文档。
解决办法: 经过一些测试,发现问题问题是因为采用了revit 2013 里面自带的族模板创建族。 在Revit2013里面如果使用Revit2012所带的族模板rft文件放入上面的代码中,则可以顺利加载进来。Revit2013和Revit2012 里面的模板族应该差别不大,所以可以通过使用Revit2012里面的族模板来解决这个问题。
[csharp] view plaincopy
- C:\ProgramData\Autodesk\RAC <span style="color:#ff6666;">2012</span>\Family Templates\English\Metric Generic Model.rft
另一个解决方案是还是使用Revit2013里面的族模板,创建族后,把族保存到本地,然后用LoadFamily加载本地硬盘上的那个族文件,可以顺利加载起来。
转载请复制以下信息:
原文链接: http://blog.csdn.net/joexiongjin/article/details/8702258
作者: 叶雄进 , Autodesk ADN |