今回は意外に奥の深い AutoCAD の[「コマンド」についてご紹介しましょう。
AutoCAD は汎用 CAD ソフトウェアとして、さまざまな業種で利用されています。これを可能にしているのが、業種や環境にあわせて AutoCAD をカスタマイズする API(Application Programming Interface) の存在です。
一般的な AutoCAD API 利用の目的は、AutoCAD の機能拡張モジュールであるアドイン(別名:アドオン、プラグイン) アプリケーションを作成して、独自のカスタム コマンドを作成することにあります。AutoCAD には、CAD ソフトウェアに必要な標準コマンドが数多く用意されていますが、あくまで汎用的な作図やモデリング、編集、集計、管理に必要なコマンド群になってしまいます。そこをカバーするのが、カスタム コマンドという訳です。
このカスタム コマンドですが、AutoCAD API の導入時期によって、大きく分けて 2 種類のタイプがあります。最も古い AutoLISP 方式で登録する AutoLISP コマンド(Defun コマンド)と、AuroCAD R13 で導入されたネイティブ コマンドです。「ネイティブ」と呼ばれるのは、現在、ほとんどの標準コマンドがネイティブ コマンドとして定義されているためです。
AutoCAD API でカスタム コマンドを定義出来るのは、ObjectARX、AutoCAD .NET API 、AutoLISP と JavaScript API の 4 API です。残念ながら、ActiveX オートメーション(COM API)ではカスタム コマンドを定義することは出来ません。VBA 環境で VBA マクロを定義するのみです。(VBA マクロの実行には VBARUN コマンド、または、-VBARUN コマンドの実行が必要です。)なお、AutoLISP では、当初、ネイティブ コマンドは定義することが出来ませんでしたが、現在ではそれも可能です。
AutoLISP コマンドも、ネイティブ コマンドも、定義したアドインが AutoCAD にロードされていれば、リボン ボタンやツールバー ボタンに割り当ててボタンをクリックして実行したり、プロンプト ウィンドウにコマンド名を入力して実行することが出来ます。
さらにネイティブ コマンドでは、標準コマンドと同じく、AutoCAD のよるコマンド スタックと呼ばれるメカニズムで管理されることになります。
コマンド スタックでは、最後にロードしたアドインの定義コマンドが上位になり、コマンドの実行時には、入力されたコマンド名をスタックの上位から検索、最初に見つかったコマンドを実行します。この場合、異なるアドインに同じコマンド名が定義されていると、下位のアドインの定義コマンドは実行出来なくなってしまう恐れがあります。
このような状況を極力避ける目的で、ネイティブ コマンドを定義する際には、コマンドにグループ名を同時に指定することが推奨されています。コマンド グループがわかっていれば、コマンド グループ名+ピリオド(.) +コマンド名のかたちでコマンドを入力することも可能です。
さて、ネイティブ コマンド タイプで定義したカスタム コマンドの利点は何でしょう?
答えは、多様なコマンドの振る舞いを指定出来る点です。ネイティブ コマンド定義では、コマンド フラグを指定することで、他のコマンドの実行中に ’(シングルクォーテーション)+コマンド名 の入力でコマンドを割り込ませる(別名:割り込みコマンド) Transparent フラグ や、レイアウト(ペーパー空間)がアクティブの時だけ実行出来る NoTileMode フラグ、コマンドの実行前に選択しておいたオブジェクト選択を利用する UsePickSet フラグなど、多彩な指定をおこなうことが出来ます。
また、AutoCAD の特性であるコマンド実行コンテキストの指定も、ネイティブ コマンド定義時にコマンド フラグで指定します。コマンド実行コンテキストは AutoCAD カスタマイズでは重要な要素なので、次のブログ記事で詳しくご紹介しています。
AutoCAD API が持つコマンド実行コンテキストの理解
ネイティブ コマンドも良い事づくめではありません。ネイティブ コマンドとして定義したカスタム コマンドの中で、別のネイティブ コマンドを呼び出す場合、コマンド呼び出しの深さ(ネスト)に制限がかかります。AutoLISP コマンドの利点(回避策として)も含め、次の Autodesk Knowledge Network 記事も確認してみてください。
「コマンドは 4 レベルより深くネストできません。」エラーについて
もちろん、AutoLISP コマンドの利点には AutoLISP 関数を定義出来る、という点もあります。(「コマンド」ではありませんが。)
By Toshiaki Isezaki
コメント