AutoCAD アドオン開発者のための Revit API 入門 ~ マクロ

今回は、アドイン に続いて、Revit API を使うもう一つのカスタマイズ形態である マクロ についてご紹介します。マクロは Revit 製品に組み込まれてインストールされる  SharpDevelop を開発環境として利用します。マクロの開発環境は、Revit 2012 まで Microsoft 社の VSTA(Visual Studio Tools For Applications)を利用していましたが、Revit 自身が利用する .NET Framework に追従するために、Revit 2013 から SharpDevelop に変更されました。どちらの開発環境も、.NET Framework をベースにした開発プラットフォームで、アプリケーション埋め込みのマクロを作成する機能を提供します。

マクロを開発するには、Revit の [管理] タブにある  [マクロ] リボンパネル にある [マクロ マネージャ] ボタンから SharpDevelop にアクセスします。[マクロ] リボンパネルには、この他にも [マクロ セキュリティ] ボタンが用意されています。

Revitの管理タブにあるマクロリボンパネルのスクリーンショット

SharpDevelop の開発画面を表示するには、作成しようとするマクロを、どのレベルで利用するものとするか決定しなければなりません。選択肢は、アプリケーション レベル マクロドキュメント レベル マクロ の 2 つです。マクロ タイプについては、後で説明することにします。SharpDevelop の画面ですが、残念ながら英語版での提供になります。SharpDevelop 自体はオープン ソースであるため、有志の方々によって日本語化されていますが、Revit 上での使用は製品と一緒にインストールされた英語版のみとなりますので、注意が必要です。

SharpDevelop の画面構成は Visual Studio に似ているので、Visual Studio の使用経験をお持ちであれば、さほど迷うことはないように思えます。

SharpDevelopの開発画面のスクリーンショット。左側にプロジェクトウィンドウ、中央にコードウィンドウ、右側にプロパティウィンドウが表示されている。

さて、マクロというと VBA と勘違いされる方もいらっしゃると思いますので、念のため違いもご紹介しておきましょう。VBA は Microsoft  社がオートデスクにライセンスて提供して、AutoCAD や Inventor に組み込んで提供しています。VBA が利用するテクノロジは COM なので、Revit API がベースとしている .NET Framework とは自ずと異なります。簡単にまとめると、次のようになります。

VBAとSharpDevelopの比較表。左側にVBAの特徴、右側にSharpDevelopの特徴が記載されている。

最も大きな違いは、SharpDevelop で作成したマクロの実行前には、事前にプログラムをビルド(コンパイル)しておく必要がある、という点です。Revit API が .NET Framework ベースであることに起因するものですが、ビルド時に表示されるエラーはすべて修正しておく必要があるので、VBA に比べるとあまり「気軽」ではないかも知れません。 VBA の場合には、インタプリタ言語の特性から、実行時にプログラムを解釈するため、事前ビルドの必要性がありません。

ドキュメント レベル マクロ

ドキュメント レベル マクロは、Revit プロジェクト(.rvt)ファイルや ファミリ ドキュメント ファイル(.rfa)ファイル内でのみ利用できるマクロで、保存場所は各ドキュメント ファイルとなります。つまり、作成したマクロは、ドキュメントに埋め込まれるようになります。マクロが実行できるのは、マクロが埋め込まれたドキュメントを Revit で開いているときのみです。逆に、ドキュメントを関連業者などに渡すことで、相手先の Revit でドキュメントを開いて、埋め込まれたマクロを実行することが出来ます。 

Revit 上でマクロが埋め込まれたドキュメント ファイルを 開こうとすると、次のような警告メッセージが表示されます。悪意のある不正なマクロ プログラムが実行されないように、マクロの存在を事前に把握していない場合には、マクロを無効にすることも出来ます。

Revitのマクロセキュリティ警告メッセージが表示されているウィンドウ。マクロが含まれている文書に関する注意を促し、マクロを無効または有効にする選択肢を提供している。

ドキュメント レベル マクロを作成すると、次のようなスケルトン コードが自動的に生成されます。あとは、指定したマクロ箇所に、処理したい内容のプログラムを書き込んでデバッグ、ビルドをしていくことになります。

namespace CSharp_Doc_Macro
{
    [Autodesk.Revit.Attributes.Transaction(
      Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.DB.Macros.AddInId(
      "D0796EDE-E8E4-493B-9157-A8C639F045CF")]
    public partial class ThisDocument
    {
        private void Module_Startup(object sender, EventArgs e)
        {

        }

        private void Module_Shutdown(object sender, EventArgs e)
        {

        }

        #region Revit Macros generated code
        private void InternalStartup()
        {
            this.Startup +=
              new System.EventHandler(Module_Startup);
            this.Shutdown +=
              new System.EventHandler(Module_Shutdown);
        }
        #endregion

        public void HelloWorld()
        {
        }
    }
}

アプリケーション レベル マクロ

アプリケーション レベル マクロは、Revit がインストールされたコンピュータでドキュメントに依存せるに利用できるマクロです。作成したマクロは、C:\ProgramData\Autodesk\Revit\Macros\2014\Revit\AppHookup フォルダ直下に、作成したマクロ モジュール名ごとにフォルダが用意されて保存されています。 この場所にマクロが保存されていれば、Revit がマクロを認識して [マクロ マネージャ] ダイアログに表示されます。

アプリケーション レベル マクロを作成した場合も、ドキュメント レベル マクロようなにスケルトン コードが自動的に生成されます。  次の例は、HelloWorld マクロ名を指定して生成されたスケルトン コードです。

namespace CSharp_App_Macro
{
    [Autodesk.Revit.Attributes.Transaction(
      Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.DB.Macros.AddInId(
      "72F8ED34-B252-449B-A725-8B8FA9F32BAF")]
    public partial class ThisApplication
    {
        private void Module_Startup(object sender, EventArgs e)
        {

        }

        private void Module_Shutdown(object sender, EventArgs e)
        {

        }

        #region Revit Macros generated code
        private void InternalStartup()
        {
            this.Startup +=
              new System.EventHandler(Module_Startup);
            this.Shutdown +=
              new System.EventHandler(Module_Shutdown);
        }
        #endregion

        public void HelloWorld()
        {
        }
    }
}

開発手順

具体的な開発の手順と画面遷移は、次のとおりです。

1. [管理] タブの [マクロ マネージャ] を起動します。

Revitの管理タブにあるマクロとマクロマネージャのボタンを示した画像。

2. アプリケーション レベル マクロ と ドキュメント レベル マクロのいずれかを選択します。

Revitのマクロマネージャーダイアログが表示されており、アプリケーションレベルとドキュメントレベルのタブが強調表示されている。

3. [マクロ マネージャ] ダイアログ上で開発言語を選択してモジュールを作成します。

Revitのマクロマネージャ画面で新しいモジュール名を決定する様子を示す画像。左側にマクロの選択肢、右側に選択した言語を表示するウィンドウが描かれている。

4. [マクロ マネージャ] ダイアログ上でモジュール内にマクロを定義します。

Revitのマクロマネージャ画面でマクロを選び、マクロ名を決定する手順を示した画像。

5. プログラム コードの編集画面へ移動します(SharpDevelop 画面の表示)。

SharpDevelopのコーディング画面で、Revitマクロの名前を見つける様子を示す画像。

6. プログラム コードを編集画面へ入力します。

7. プログラムをビルドして、表示されるエラーを順次修正していきます。

SharpDevelopでのエラーメッセージ表示画面。エラー行をクリックするとコードの該当行に移動できる機能を示す。

8. Revit 画面に戻り、[マクロ マネージャ] ダイアログ上で [実行] ボタンからマクロを実行します。

Revitのマクロマネージャダイアログのスクリーンショット。アプリケーションレベルとプロジェクトレベルのマクロが一覧表示され、実行ボタンや編集ボタンが見える。

マクロ タイプの違いによる留意点

ドキュメント レベル マクロやアプリケーション レベル マクロには、物理的なプログラム上にも留意すべき差があります。クラス定義された主体となるオブジェクトの違いで、Revit API を利用する際に重要となる Application、UIApplication、Document、UIDocument オブジェクトの取得方法が変わってくる点です。コード上では、ThisDocument クラス名と ThisApplication のクラス名で、クラスが表しているオブジェクトを判断できます。

ドキュメント レベルとアプリケーション レベルのマクロのコードサンプルを示した画像。コードの説明には、UIApplicationとUIDocumentの取得方法の違いが記載されている。

マクロ セキュリティ

ドキュメント レベル マクロやアプリケーション レベル マクロも、Revit のセキュリティ設定で振る舞いを指定しておくことが出来ます。

Revitのオプション設定画面で、マクロのセキュリティ設定に関する情報を表示しています。アプリケーションレベルとドキュメントレベルのマクロ設定の選択肢があります。

マクロとアドインの違い

アドインもマクロも .NET Framework ベース の Revit API を利用するので、プログラム上の内容差はあまりありません。ただ、差別化はされています。次の図は、それらを比較して説明するものです。 

表形式でマクロとアドインの開発環境や拡張単位、リボンカスタマイズの違いをまとめた画像

アドイン マニフェストを作成する手間が省けるので、マクロは簡単に Revit API を評価したり、設計上の反復操作を自動化するのには適していると言えます。ただし、リボン インタフェースへのボタン登録には対応できないので、毎回、マクロ マネージャを起動して実行する必要があります。

また、マクロで有用なツールを作成しても、Autodesk Exchange Apps ストアへのアプリケーション提出・公開が出来ません。

By Toshiaki Isezaki 

 

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading