属性

属性

Revit API では、ExternalCommand と ExternalApplication の動作を設定するためにいくつかの属性が用意されています。

TransactionAttribute

外部コマンドのトランザクション動作をコントロールするには、カスタム属性 Autodesk.Revit.Attributes.TransactionMode を IExternalCommand インタフェースの実装クラスに適用する必要があります。このオプションには既定はありません。このモードでは、コマンドの呼び出し時に使用するトランザクションを API フレームワークがどのように要求するかをコントロールできます。サポートする値は次のとおりです。

  • TransactionMode.Automatic - Revit は外部コマンドが実行される前に、アクティブなドキュメントにトランザクションを作成し、トランザクションはコマンドが完了した後に、(ExternalCommand コールバックの戻り値に基づいて)コミットまたはロールバックされます。コマンドは自身の Transaction を作成、開始することはできませんが、SubTransaction を作成できます。このコマンドは、Result 戻り値とともに成功または失敗ステータスを報告します。
  • TransactionMode.Manual - Revit はトランザクションを作成しません(ただし、外部コマンドが失敗を返したときにすべての変更をロールバックするための外部トランザクション グループを作成します)。代わりに、必要に応じて Transaction、SubTransactions、TransactionGroup を組み合わせて使用することもできます。トランザクションおよび関連するクラスの使用に関するすべての規則に従う必要があります。[元に戻す]メニュー内に表示されるトランザクション名を指定する必要があります。Revit は、外部コマンドから戻ったときに、すべてのトランザクション(グループとサブトランザクションも同様に)が適切に終了することを確認します。適切に終了しない場合は、Revit はモデルに加えられたすべての変更を破棄します。
  • TransactionMode.ReadOnly - トランザクション(およびグループ)は作成されず、また、コマンドのライフタイム中はトランザクションは作成されません。外部コマンドはモデルから読み込んだメソッドのみを使用します。コマンドがトランザクション(またはグループ)を開始しようとしたり、モデルへの書き込みを行おうとすると、例外が発生します。

3 つすべてのモードで、TransactionMode はアクティブなドキュメントにのみに適用されます。コマンドの実行中に他のドキュメントを開くことができ、これらの開いたドキュメントで Transaction、SubTransaction、TransactionGroup の作成や使用を完全にコントロールできます(ReadOnly モードでも)。

たとえば、外部コマンドが自動トランザクション モードを使用するように設定するには、次の手順を実行します。

コード領域 3-18: TransactionAttribute

[Transaction(TransactionMode.Automatic)]
public class Command : IExternalCommand
{
        public Autodesk.Revit.IExternalCommand.Result Execute(
                Autodesk.Revit.ExternalCommandData commandData,
                ref string message, Autodesk.Revit.DB.ElementSet elements)
        {
                // Command implementation, which modifies the active document directly 
                // and no need to start/commit transaction.
        }
}

詳細は、「トランザクション」を参照してください。

JournalingAttribute

外部コマンド実行時のジャーナル作成動作をコントロールするために、カスタム属性 Autodesk.Revit.Attributes.JournalingAttribute を必要に応じて IExternalCommand インタフェースの実装クラスに適用することができます。ジャーナル作成には次の 2 つのオプションがあります。

  • JournalMode.NoCommandData - ExternalCommandData.JournalData マップのコンテンツは Revit ジャーナルに書き込まれません。このオプションを使用すると、Revit API 呼び出しが必要に応じてジャーナルに書き込みを行うことができます。このオプションを使用すると、選択やタスク ダイアログへの応答のための Revit UI を呼び出すコマンドを正しく実行できます。
  • JournalMode.UsingCommandData - コマンド データ内で提供される IDictionary<String, String> を使用します。これは、外部コマンドを呼び出しと IDictionary<String, String< エントリ間のすべての Revit ジャーナル エントリを非表示にします。選択やタスク ダイアログへの応答のための Revit UI を呼び出すコマンドが正しく実行されない場合があります。JournalingAttribute が指定されていない場合、これが既定になります。

コード領域 3-19: JournalingAttribute

[Journaling(JournalingMode.UsingCommandData)]
public class Command : IExternalCommand
{
        public Autodesk.Revit.IExternalCommand.Result Execute(
                Autodesk.Revit.ExternalCommandData commandData, 
                ref string message, Autodesk.Revit.DB.ElementSet elements)
        {
                return Autodesk.Revit.UI.Result.Succeeded;
        }
}