プログラムローダーファイル(Revit 2102)



転載は以下の情報をコピーしてください。原文のリンク:http://write.blog.csdn.net/postedit/7636666
作者:  葉雄進、Autodesk ADN
日付:202.6
 
Revitの二次開発を行う過程で、Dcument.LoadFamily(String,Family)を呼び出して、戻ってくるFamilyオブジェクトはnullです。原因は何ですか?個人的にはnullに戻るのはDcumentの対象にロードする対象が既に存在しているからだと思います。ファイルのパスによって、この族のオブジェクトをDcumentから削除するにはどうすればいいですか?
回答:
 
Revitは5つのリロード関数LoadFamilyを提供して家族をローディングします。彼らは用途がそれぞれ違う。
1:LoadFamily(Stering)2:LoadFamily(Document)3:LoadFamily(Stering,Family)4:LoadFamily(Document,IFFadOptions)5:LoadFamily(String,ImilyLoadOptions,Family)
 
最初の関数は一つの族ファイル(.rfa)をモデルにロードするために使用されます。指定された族ファイルの完全なファイル名(ディレクトリを含む)は、Familyオブジェクトに戻ります。しかし、この関数は現在のモデルにすでにこの族が存在している問題を解決できません。族が既に存在する場合は、ロードできません。
 
二つ目の関数はバックグラウンドで開くか、それとも編集中に開いている族からモデルに読み込むために使われます。この関数はちょっと分かりにくいです。必要なモデルファイルをパラメータとして置いてください。呼び出したDcumentはモデルDcumentではなく、Dcumentです。
 
3番目の関数は最初の関数と同じです。戻り値をパラメータとして伝えるだけです。戻り値はブール型です。既存の族をロードすることもできません。
 
第四の関数は、第二の関数と機能的に似ていますが、違いがあります。この関数は、現在のモデルファイルにロードが必要な民族がいたら、どう処理しますか?この関数は既に存在している族をロードすることができます。  二つ目のパラメータはインターフェースです。このインターフェースから派生した新しいクラスを作成して、その二つの関数を実現してください。OnFamilyFound OnSharedFamilyFoundという意味です。前のOnFamilyFoundはすでに存在していることを発見したらどうすればいいですか?
book OnFamilyFound(book familyInUse,out book overwriteParameterValues)
familyInUseパラメータはこの族が既にモデルに挿入されているかどうかを教えます。Trueはこの族がすでに使っていると言っています。Falseはまだモデルに挿入されていないことを示しています。
overwriteParameterValuesパラメータは、Revitが既存の族のパラメータ値を上書きするかどうかを教えます。
 
5番目の関数は、ディスクに格納されたファイルをモデルファイルにロードすることです。彼は既に存在している族をロードすることができます。IFmilyLoadOptionsタイプのパラメータの使い方は4番目と同じです。
 
次の例を見てください。既存の族をロードして上書きする方法を示します。
 
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;
    }


  }