FAQ: Revit マクロ

このセクションでは、Revit マクロについてよくある質問について回答します。

質問 回答
新しく作成したマクロがマクロ マネージャの分類リストに表示されるものと期待しましたが、表示されません。なぜでしょうか。 新しいマクロがマクロ マネージャに表示されるには、Revit マクロ IDE でマクロ プロジェクトが正しくビルドされている必要があります([ビルド]メニューを使用)。
新しいマクロを作成するときに RevitAPI.dll および RevitAPIUI.dll を参照として追加する必要がありますか。 いいえ、この手順は完了しているため、RevitAPI.dll ファイルと RevitAPIUI ファイルを参照する必要はありません。Revit マクロ プロジェクトでは、どちらも必要な参照として使用されます。次のように、IDE でこれらの参照を削除すると、Revit のマクロは実行されません。

RevitAPI.dll および RevitAPIUI.dll を復元する」を参照してください。

Revit.ini ファイルを編集する必要がありますか。 いいえ。Revit マクロは、システムを修正しなくても、マクロ マネージャに表示されるよう自動的に登録されます。
Revit マクロ IDE で、This*.cs ファイルまたは This*.vb ファイル内で対応するメソッドを削除してマクロを削除しました。しかし、マクロ マネージャの分類リストを再度開くと、削除したマクロの名前がまだ表示されます。この名前をリストから消すにはどうすればよいでしょうか。 マクロ マネージャが削除を認識する前に、編集したプロジェクトを正しくビルドしておく必要があります。
アプリケーションレベル マクロとドキュメントレベル マクロの違いは何ですか。 アプリケーションレベル マクロは、Revit アプリケーションの単一インスタンス内のすべての開かれている Revit プロジェクトで実行できます。ドキュメントレベル マクロ プロジェクトは、RVT ファイル内に格納されています。現在のアクティブなドキュメント内からロードでき、そのドキュメント上で実行できます。
Application オブジェクトまたは相当する externalCommandData にアクセスするにはどうすればよいですか。 すべてのアプリケーションレベル マクロが、UIApplication オブジェクトに関連付けられています。アプリケーションレベル マクロでは、C# および VB.NET の Application キーワード ポインタが API Application オブジェクトを返します。

ドキュメントレベル マクロでは、Document キーワードが API Document オブジェクトを返します。ドキュメントレベル マクロから UIApplication オブジェクトにアクセスするには、this.Application を使用してください。

スタートアップおよびシャットダウン メソッド(Module_Startup および Module_Shutdown)には何を含める必要がありますか。

Module_Startup メソッドはモジュールのロード時に呼び出され、Module_Shutdown はモジュールのアンロード時に呼び出されます。

アプリケーションレベル マクロ モジュールの場合、Revit の起動時に Module_Startup が呼び出され、Revit のシャットダウン時に Module_Shutdown が呼び出されます。

ドキュメントレベル マクロ モジュールの場合、Revit プロジェクトを開いたときに Module Startup が呼び出され、プロジェクト ドキュメントを閉じたときに Module_Shutdown が呼び出されます。

Module_Startup および Module_Shutdown は、マクロ プロジェクトの再ビルド時にも呼び出されます。

Module_Startup メソッドにはコードの初期化を追加し、Module_Shutdown メソッドではクリーンアップ作業を実行できます。 たとえば、起動時にイベント ハンドラを登録し、シャットダウン時に登録を解除することができます(この方法をお勧めします)。

Revit イベント ハンドラを登録および登録解除する方法およびその理由について教えてください。 前述のとおり、Revit IDE でこれを行う場合は、*_Startup メソッドでイベント ハンドラを登録し、*_Shutdown メソッドで登録を解除する方法をお勧めします。すべてのマクロが、動的にロードされてロード解除されます。マクロをデバッグするときに、イベント ハンドラが正しく登録解除されていないと、Revit によって、間違ったメソッド(おそらくは無効なメモリ アドレス)が呼び出される可能性があります。Revit IDE ではこうした状況で Revit がクラッシュすることを防ぎますが、正しく登録解除されていないイベント ハンドラがあると、それによって現在の Revit セッション中にパフォーマンスの問題が発生する場合があります。
正しく動作していないように見え、Revit で問題を引き起こしているダイアログがあります。 実行中の API コールバックの範囲外で動作するモードレス ダイアログは、問題を引き起こす可能性があります。Revit が不安定な状態になるのを避けるために、このようなコールバックは使用しないことをお勧めします。
Startup および Shutdown メソッドとイベント ハンドラを試してみたいと思います。何か例はありますでしょうか。 次のサンプル コードに、新しい Revit プロジェクトが作成されたときにメッセージ ボックスを自動的に起動する OnDocumentNewed イベント ハンドラを登録する方法が示されています。 注: Revit SDK に付属するマクロ サンプルの 1 つに、ドキュメントレベル イベント ハンドラのスタートアップとシャットダウンの例を示すものがあります。この FAQ に示す例は、アプリケーションレベル イベント ハンドラです。

すべての API イベントは、2011 の Revit IDE からアクセスできる点に注意してください。2011 より前のイベントは削除されています。次の例は、新しいイベントを示しています。

Python で作成したマクロが動作しなくなったのはなぜですか? Python のマクロには .NET Framework 3.5 が必要です。これは、既定ではインストールされません。Python マクロを実行するには、.NET Framework 3.5 を手動でインストールします。

C# アプリケーションレベルの例:

private void Module_Startup(object sender, EventArgs e)
{
   this.Application.DocumentOpened
      += new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(Application_DocumentOpened);
}

private void Module_Shutdown(object sender, EventArgs e)
{
   this.Application.DocumentOpened
      -= new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(Application_DocumentOpened); 
}

void Application_DocumentOpened(object sender, Autodesk.Revit.DB.Events.DocumentOpenedEventArgs e)
{ 
   System.Windows.Forms.MessageBox.Show("message here");
}

VB.NET アプリケーションレベルの例:

Private
Sub Module_Startup(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Startup
AddHandler Me.OnDocumentNewed,
AddressOf Me.ThisApplication_OnDocumentNewed
End SubPrivate Sub Module_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown
RemoveHandler Me.OnDocumentNewed,
AddressOf Me.ThisApplication_OnDocumentNewed
End SubPrivate Sub ThisApplication_OnDocumentNewed(ByVal document As Autodesk.Revit.Document)
System.Windows.Forms.MessageBox.Show("VB.NET
Application event OnDocumentNewed")
End Sub