ObjectARX で AutoCAD のコマンドを作成するには、ウィザードのサポートがなければとても作れたものではありませんでした。しかし .NET API ではこの操作が非常に簡略化されましたので、手軽に AutoCAD コマンドを自作することができます。

本稿ではおなじみの "Hello, World!" プログラムを使って、.NET API でのコマンドの作り方を解説したいと思います。なお AutoCAD 2007 / 2008 / 2009 のいずれのバージョンでも、Visual Studio 2005 で作成したアプリケーションが動作することを確認しています。

コマンド作成手順

  1. "クラスライブラリ" でプロジェクトを作成する。
  2. ソリューション エクスプローラーの "参照設定" を右クリックし、"参照の追加" から "acdbmgd.dll" と "acmgd.dll" を選択する。どちらも、AutoCAD のインストールディレクトリにある。
  3. 同じく "参照設定" に追加された "acdbmgd" "acmgd.dll" を右クリックし、"プロパティ" を開いて [ローカルコピー] を "False"(*1) にする。
  4. プロジェクトのプロパティを開き、[デバッグ] タブの [開始動作] で "外部プログラムの開始" を選択する。値は AutoCAD のインストールディレクトリにある "acad.exe" を設定する。
  5. 下記のソースコードをビルドし、成果物を AutoCAD から [NETLOAD] して [HELLO] コマンドを発行する。

ソースコード

using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;

namespace HelloWorld
{
    public class Command
    {
        [CommandMethod( "HELLO" )]
        public static void Hello()
        {
            Editor edit = Application.DocumentManager.MdiActiveDocument.Editor;
            edit.WriteMessage( "\nHello, World!" );
        }
    }
}

出力結果

Hello, World!

ソースコードの解説

コマンドメソッド

自作コマンドを作成する場合のキモは、CommandMethodAttribute 属性です。AutoCAD はこの属性が設定されたメソッドをコマンドメソッドとして認識します。ただし、コマンドメソッドは以下の条件を満たさなければなりません(*2)

逆に言えば、上記さえ満たせばどのようなメソッドもコマンドメソッドとして使用することができます。たとえば同じ DLL 中の複数のクラスに CommandMethodAttribute が設定されたメソッドがあったとしても、それぞれがコマンドとして正しく動作します。

CommandMethodAttribute

CommandMethodAttribute 属性の引数に文字列を設定すると、その文字列はグローバルコマンド名になります。もちろん AutoCAD のコマンドですから、大文字と小文字を区別しません。たとえば "Hello" と "HELLO" は同じコマンドです。

その他、CommandMethodAttribute 属性は引数の与え方によってコマンドグループやローカルコマンド名を設定するなどもできますが、本稿では割愛します。

(MINERVA 深津貴成)
  1. ^ [ローカルコピー] の値が "True" の場合、デバッグ実行時に自作のコマンドを発行することができません。この問題は AutoCAD 2007 / 2008 / 2009 のいずれのバージョンでも発生します。ただし AutoCAD を単体で起動すれば、例え成果物がデバッグビルドであっても問題なくコマンドを発行することができます。
  2. ^ サンプルコードではメモリ効率を考えて static 修飾子を付けましたが、コマンドメソッドは必ずしも静的メンバである必要はありません。コマンドクラスのインスタンスは図面ごとに生成されますので、たとえば MDI を強く意識したアプリケーションなどでは、静的でないコマンドメソッドも検討する価値があるでしょう。
  3. ^ アクセスレベルが protected あるいは private でもコンパイルエラーにはなりませんので注意してください。public でないコマンドを発行すると、 AutoCAD は "そのようなコマンドはありません" というエラーを発します。