ウォークスルー: Hello World

ウォークスルー: Hello World

示された手順を使用して Hello World プログラムを作成するには、Revit プラットフォーム API および C# を使用します。VB.NET を使用したアドイン アプリケーションの作成方法については、「VB.NET の Hello World」を参照してください。

Hello World ウォークスルーは、次のトピックを取り扱います。

このセクションのすべての操作およびコードは、Visual Studio 2012 を使用して作成されました。

新しいプロジェクトを作成する

Visual Studio で C# プログラムを作成するには、まずプロジェクト タイプを選択し、新しいクラス ライブラリを作成します。

  1. [ファイル] メニューから、[新規作成] [プロジェクト]を選択します。
  2. [インストールされたテンプレート]フレームで、[Visual C#]をクリックします。
  3. 右側のフレームで、[クラス ライブラリ](図 1: 下の[新規プロジェクトの追加]を参照)をクリックします。このウォークスルーは、プロジェクトの場所が D:¥Sample であることを前提としています。
  4. [名前]フィールドに、プロジェクトの名前として「HelloWorld」と入力します。
  5. [OK]をクリックします。

図 1: 新規プロジェクトを追加

参照の追加

  1. RevitAPI 参照を追加するには:
    • [ソリューション エクスプローラ]ウィンドウが開いていない場合は、[表示]メニューから[ソリューション エクスプローラ]を選択します。
    • [ソリューション エクスプローラ]で、[参照]を右クリックして[コンテキスト]メニューを表示します。
    • [コンテキスト]メニューから、[参照の追加]をクリックします。[参照の追加]ダイアログ ボックスが表示されます。
    • [参照の追加]ダイアログ ボックスで、[参照]タブをクリックします。Revit がインストールされているフォルダを指定し、RevitAPI.dll をクリックします。たとえば、インストール フォルダの場所は、通常は C:¥Program Files¥Autodesk¥Revit 2015¥RevitAPI.dll です。
    • [OK]をクリックして .dll を選択して、ダイアログ ボックスを閉じます。RevitAPI が[ソリューション エクスプローラ]の参照ツリーに表示されます。

    • 注: 新しいプロジェクトの場合は、RevitAPI.dll の[ローカル コピー]プロパティを常に false に設定する必要があります。これでディスク容量を節約でき、Visual Studio デバッガが DLL のコピーを使用して不整合が発生することを防ぎます。RevitAPI.dll を右クリックし、[プロパティ]を選択し、[ローカル コピー]設定を true (既定)から false に変更します。
  2. RevitAPIUI.dll に対して上記の手順を繰り返します。

コードを追加

アドインを作成するには、次のコードを追加します。

コード領域 2-1: スタートアップ

using System;

using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
namespace HelloWorld
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
        {
                public Autodesk.Revit.UI.Result Execute(ExternalCommandData revit,
                        ref string message, ElementSet elements)
                {
                        TaskDialog.Show("Revit", "Hello World");
                        return Autodesk.Revit.UI.Result.Succeeded;
                }
        }
}
ヒント Visual Studio IntelliSense 機能を使用して、インタフェースのスケルトン実装を作成できます。これによりスタブをすべての必要なメソッドに追加します。上記の例では Class1 の後に「IExternaCommand」を追加後、Intellisense メニューから「Implement IExternalCommand」を選択してコードを取得できます。

図 2: Intellisense を使用してインタフェースを実装

すべての Revit アドイン アプリケーションには、IExternalCommand インタフェースを実装するエントリ ポイント クラスが必要です。 また、Execute()メソッドを実装する必要があります。Execute()メソッドは、他のプログラムの Main()メソッドに似たアドイン アプリケーションのエントリ ポイントです。アドイン エントリ ポイントクラス定義がアセンブリに含まれています。詳細は、「アドインの統合」を参照してください。

プログラムをビルドする

コードを作成した後、ファイルをビルドする必要があります。[ビルド]メニューから、[ソリューションのビルド]をクリックします。ビルドの出力が出力ウィンドウに表示され、エラーなしでプロジェクトがコンパイルされたことを表します。

.addin マニフェスト ファイルを作成する

HelloWorld.dll プロジェクトの出力ディレクトリに表示されます。Revit でアプリケーションを呼び出す場合は、Revit に登録するマニフェスト ファイルを作成します。

  1. マニフェスト ファイルを作成するには、メモ帳で新しいテキスト ファイルを作成します。
  2. 次の文字を追加します。
     

    コード領域 2-2: 外部コマンドの .addin マニフェスト ファイルを作成

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <RevitAddIns>
            <AddIn Type="Command">
                    <Assembly>D:\Sample\HelloWorld\bin\Debug\HelloWorld.dll</Assembly>
                    <AddInId>239BD853-36E4-461f-9171-C5ACEDA4E721</AddInId>
                    <FullClassName>HelloWorld.Class1</FullClassName>
                    <Text>HelloWorld</Text> 
                    <VendorId>ADSK</VendorId>
                    <VendorDescription>Autodesk, www.autodesk.com</VendorDescription> 
            </AddIn>
    </RevitAddIns>
  3. HelloWorld.addin という名前でファイルを保存して、次の場所に置きます。
    • C:¥ProgramData¥Autodesk¥Revit¥Addins¥2015¥
    • アプリケーションのアセンブリ dll が、ネットワーク共有にあって、ローカル ハード ドライブにない場合、ローカル コンピュータ以外の .NET アセンブリのロードを許可するには、Revit.exe.config を修正する必要があります。Revit.exe.config の「runtime」ノードに、下の図のように要素 <loadFromRemoteSources enabled="true"/> " を追加します。
      <runtime>
              <generatePublisherEvidence enabled="false" />
              <loadFromRemoteSources enabled="true"/> 
      </runtime>

マニフェスト ファイルの使用の詳細は、「アドインの統合」を参照してください。

アドインをデバッグする

デバッグ モードでプログラムを実行する場合、変数やオブジェクトの状態を調べるためにプログラムを一時停止するには、ブレークポイントを使用します。エラーがある場合は、プログラムを実行して変数を確認することで、予期しない値が発生する原因を推定することができます。

  1. [ソリューション エクスプローラ] ウィンドウで、HelloWorld プロジェクトを右クリックすると、コンテキスト メニューが表示されます。
  2. [コンテキスト]メニューから、[プロパティ]をクリックします。[プロパティ]ウィンドウが表示されます。
  3. [デバッグ]タブをクリックします。
  4. [アクションを開始]セクションで、[外部プログラムを開始]をクリックし、Revit.exe ファイルを参照します。既定では、ファイルは次のパス: C:¥Program Files¥Autodesk¥Revit 2015¥Revit.exe に格納されます。

    図 3: デバッグ環境を設定

  5. [デバッグ]メニューから、[ブレークポイントを切り替え]を選択し(または [F9]を押す)、次の行にブレークポイントを設定します。
    TaskDialog.Show("Revit", "Hello World");
  6. デバッグ手順を開始するには、[F5] を押します。

テスト デバッグ:

  • [アドイン]タブで、[外部ツール]メニューボタンに HelloWorld が表示されます。

    図 4: HelloWorld 外部ツール コマンド

  • [HelloWorld]をクリックするとプログラムが実行され、ブレークポイントが有効になります。
  • プログラムの実行を続行するには、[F5] を押します。次のシステム メッセージが表示されます。

    図 5: TaskDialog メッセージ

トラブルシューティング

Q: 自分のアドイン アプリケーションがコンパイルできません。

A: サンプル コードをコンパイルするとエラーが表示される場合は、アドインのコンパイルに使用された RevitAPI のバージョンが問題である場合があります。古い RevitAPI 参照を削除して、新しい RevitAPI 参照をロードします。詳細は、「参照の追加」を参照してください。

Q: [アドイン]タブがない、または自分のアドイン アプリケーションが[外部ツール]の下に表示されないのはなぜですか?

A: 多くの場合、アドイン アプリケーションのロードに失敗すると、Revit はエラーについての情報に関するエラー ダイアログを起動時に表示します。たとえば、マニフェスト ファイルの指定した場所にアドイン DLL が見つからない場合は、次のようなメッセージが表示されます。

図 6: 外部ツール エラー メッセージ

FullClassName で指定されたクラス名が見つからない、または IExternalCommand から継承されない場合も、エラー メッセージが表示されます。

ただし、場合によっては、アドイン アプリケーションがメッセージなしでロードに失敗する場合があります。考えられる原因には、次が含まれます。

  • アドイン アプリケーションが、異なる RevitAPI バージョンでコンパイルされている
  • マニフェスト ファイルが見つからない
  • .addin マニフェスト ファイルのフォーマット エラー

Q: 自分のアドイン アプリケーションが動作しないのはなぜですか?

A: アドイン アプリケーションが外部ツールの下にある場合でも、動作しない場合があります。多くの場合、コードの例外が原因です。

次に例を示します。

コード領域 2-3: Execute()の例外

Command: IExternalCommand
{
        A a = new A();//line x
        public IExternalCommand.Result Execute ()
        {
                //…
        }
}   
Class A 
{
        //…
}

次の 2 つの例外が、明確に問題を識別します。

  • 行 X のエラー
  • 例外は、Execute()メソッドでスローされます。

Revit は、コマンドが失敗したときに捕捉されなかった例外についての情報を含むエラー ダイアログを表示します。

図 7: 外部コマンドで処理できない例外

これはコマンドのデバッグの支援を目的としており、ユーザに展開されたコマンドは、例のエントリ メソッドで Try Catch Finally を使用して、Revit によって例外が捕捉されるのを防ぐ必要があります。次に例を示します。

コード領域 2-4: 実行文で Try Catch を使用:

public IExternalCommand.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
        ExternalCommandData cdata = commandData;
        Autodesk.Revit.ApplicationServices.Application app = cdata.Application;

        try
        {
                // Do some stuff
        }
        
        catch (Exception ex)
        {
                message = ex.Message;
                return Autodesk.Revit.UI.Result.Failed;
        }
                return Autodesk.Revit.UI.Result.Succeeded;   
}