你好,游客 登录
背景:
阅读新闻

Revit 2013里面用程序新建族然后加载到模型中 - 我爱Revit —— 应用与二次开发专栏

[日期:2013-03-21] 来源:  作者: [字体: ]


我之前写了一篇文章谈到如何编程新建一个族,并加载到模型文件中。

编程加载族文件(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加载本地硬盘上的那个族文件,可以顺利加载起来。


我们也会及时与研发部门联系,讨论存在的这个问题。






收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻