ドキュメントとファイル管理

ドキュメントとファイル管理

ドキュメントとファイル管理により、ドキュメントの作成と検索が簡単になります。

ドキュメントの取得

Application クラスはすべてのドキュメントを保持します。前述のとおり、セッション内では、複数のドキュメントを開くことができます。アクティブなドキュメントは、UIApplication クラス プロパティである ActiveUIDocument を使用して取得します。

Application クラス Documents プロパティを使用しアクティブなドキュメントを含むすべての開いているドキュメントを取得します。このプロパティは、Revit セッションで開いているすべてのドキュメントを含むセットを返します。

ドキュメント ファイル情報

Document クラスには、対応する各ファイルに PathName と Title の 2 つのプロパティがあります。

  • PathName はドキュメントの完全修飾ファイル パスを返します。プロジェクトを作成してから保存していない場合は、PathName は空の文字列を返します。
  • Title はプロジェクト タイトルであり、通常はプロジェクトのファイル名から生成されます。返される値は、ご使用のシステム設定によって異なります。

ドキュメントを開く

Application クラスは、既存のプロジェクト ファイルを開くためのオーバーロードされたメソッドを備えています。

表 3: API でドキュメントを開く

メソッド

イベント

Document OpenDocumentFile(string filename )
Document OpenDocumentFile(ModelPath modelPath, OpenOptions openOptions)
DocumentOpened

完全修飾ファイル パスで文字列を指定すると、Revit はファイルを開いて Document インスタンスを作成します。ファイルの汎用命名規則(UNC)の名前をこのメソッドに割り当てることで、このメソッドを使用して他のコンピュータのファイルを開きます。

対象となるファイルは、拡張子 .rvt の付いたプロジェクト ファイル、拡張子 .rfa の付いたファミリ ファイル、拡張子 .rte の付いたテンプレート ファイルです。

2 番目のオーバーロードはモデルへのパスを文字列ではなく ModelPath として取得し、OpenOptions パラメータにはファイルを開くためのオプション(中央から開いたドキュメントのアタッチを解除するなど)や、ワークシェアリングに関するオプションがあります。ワークシェアリングされたドキュメントを開く方法については、「ワークシェアリングされているドキュメントを開く」を参照してください。

これらのメソッドはエラーの発生時に特定のドキュメント化された例外をスローします。例外は主に次の 4 つのカテゴリに分類されます。

表 4: スローされる例外のタイプ

タイプ

ディスク エラー ファイルが存在しないか、バージョンが無効
リソース エラー ファイルを開くためのメモリまたはディスク スペース不足
中央モデル ファイルのエラー ファイルがロックされているか壊れている
中央モデル/サーバ エラー サーバとのネットワーク通信エラー

ドキュメントを正常に開くと、DocumentOpened イベントが発生します。

ドキュメントを作成する

次の表では、Application メソッドを使用して新しいドキュメントを作成します。

表 5: API でドキュメントを作成

メソッド

イベント

Document NewProjectDocument(string templateFileName);
DocumentCreated
Document NewFamilyDocument(string templateFileName);
DocumentCreated
Document NewProjectTemplateDocument(string templateFilename);
DocumentCreated

それぞれのメソッドには、パラメータとしてテンプレート ファイル名が必要です。テンプレート ファイルに基づいて、作成されたドキュメントが返されます。

ドキュメントを保存して閉じる

Document クラスにはインスタンスを保存、閉じるメソッドが用意されています。

表 6: API でドキュメントを保存して閉じる

メソッド

イベント

Save() DocumentSaved
SaveAs() DocumentSavedAs
Close() DocumentClosed

Save()には 2 つのオーバーロードがあり(1 つは引数なし、もう 1 つは SaveOptions 引数とともに使用)、ディスク上のファイルから無効なデータをすべて削除するよう OS に強制するかどうかを指定できます。ファイルがまだ保存されていない場合は、代わりに SaveAs()を呼び出す必要があります。

SaveAs()には 3 つのオーバーロードがあります。1 つのオーバーロードはファイル名のみを引数として使用し、特定のファイル名を持つ別のファイルがある場合は、例外が発生します。他の 2 つのオーバーロードはファイル名を引数として使用する他(この場合は ModelPath の形式で)、2 番目の SaveAsOptions として使用し、既存のファイルがある場合に上書きするかどうかを指定します。また、SaveAsOptions を使用すると、ファイルに関連するディスク上の無効なデータを削除するかどうかといった他の関連オプションやワークシェアリング オプションを指定することができます。

Save()や SaveAs()は、ドキュメントを開くときと同じ 4 つのカテゴリでドキュメント化された例外をスローします(上記の表 4 に記載)。

Close()には 2 つのオーバーロードがあります。1 つは、閉じる前にファイルを保存するかどうかを示すブール値の引数を取ります。2 番目のオーバーロードは引数を取らず、ドキュメントが変更された場合、閉じる前にファイルを保存するかどうかをユーザに尋ねます。ドキュメントのパス名がまだ設定されていない場合、または保存するファイルが読み取り専用の場合、このメソッドは例外をスローします。

注: 外部アプリケーションがドキュメントを使用しているため、Close()メソッドがアクティブなドキュメントに影響したり、DocumentClosed イベントを発生させることはありません。このメソッドは非アクティブなドキュメントだけに呼び出すことができます。

UIDocument クラスにもインスタンスを保存して閉じるメソッドがあります。

表 7: API で UIDocument を保存して閉じる

メソッド

イベント

SaveAndClose() DocumentSaved、DocumentClosed
SaveAs() DocumentSavedAs

SaveAndClose()は保存後にドキュメントを閉じます。ドキュメントのパス名を設定していない場合、名前と場所を設定するよう、[名前を付けて保存]ダイアログが Revit ユーザに表示されます。

SaveAs()メソッドは、Revit ユーザが[名前を付けて保存]ダイアログから入力したファイル名とパスにドキュメントを保存します。

ドキュメントのプレビュー

DocumentPreviewSettings クラス はドキュメントから取得でき、特定のドキュメントのプレビュー イメージの保存に関連する設定を含みます。

コード領域: ドキュメントのプレビュー

public void SaveActiveViewWithPreview(UIApplication application)
{
    // Get the handle of current document.
    Autodesk.Revit.DB.Document document = application.ActiveUIDocument.Document;

    // Get the document's preview settings
    DocumentPreviewSettings settings = document.GetDocumentPreviewSettings();

    // Find a candidate 3D view
    FilteredElementCollector collector = new FilteredElementCollector(document);
    collector.OfClass(typeof(View3D));

    Func<View3D, bool> isValidForPreview = v => settings.IsViewIdValidForPreview(v.Id);

    View3D viewForPreview = collector.OfType<View3D>().First<View3D>(isValidForPreview);

    // Set the preview settings
    using (Transaction setTransaction = new Transaction(document, "Set preview view id"))
    {
        setTransaction.Start();
        settings.PreviewViewId = viewForPreview.Id;
        setTransaction.Commit();
    }

    // Save the document
    document.Save();

}

ファミリをロードする

Document クラスには、ファミリ全体とそのすべての記号をプロジェクトにロードする機能があります。ファミリ全体のロードには時間がかかり、大量のメモリを必要とするため、Document クラスには特定の記号のみをロードする LoadFamilySymbol()という同様のメソッドも用意されています。

詳細は、「ファミリをロードする」を参照してください。