AutoCAD アプリケーションを作成する場合、ユーザーからの入力を受け取る状況が発生します。
本稿ではエンティティの選択を例にして、各種のユーザー入力についてご紹介します。

なおサンプルコードは VisualStudio2005 の C# で作成し、 AutoCAD2007 / 2008 / 2009 で動作確認を行いました。

ユーザー入力のサンプル

ユーザー入力関数にはさまざまな種類がありますが、ここではエンティティの選択関数を使用するサンプルコードを掲載します。その他のユーザー入力系関数でもほぼ同等の手順です。サンプルプロジェクトにはその他のユーザー入力系関数のコードも書きましたので、そちらも合わせてご覧ください。

サンプルコード

[CommandMethod( "GET_ENTITY_TEST" )]
public void GetEntityTest()
{
    // 1.エディタを取得
    Document active_doc = Application.DocumentManager.MdiActiveDocument;
    Editor edit = active_doc.Editor;

    // 2.プロンプトオプションを作成
    PromptEntityOptions option = new PromptEntityOptions( "エンティティを選択" );

    // 3.ユーザー入力を受け取る
    PromptEntityResult res = edit.GetEntity( option );
    if( res.Status != PromptStatus.OK )
    {
        return;
    }

    edit.WriteMessage( "\n{0}", res.ObjectId );
}

サンプルプロジェクト (7 KB)

環境によっては、コンパイル時に "この参照を解決できませんでした" という警告が出ます。この場合 "acdbmgd.dll" と "acmgd.dll" を削除し、 AutoCAD のインストールディレクトリから参照しなおしてください。

サンプルコード解説

エディタを取得

コマンドラインウィンドウやプロンプトからの入力など、ユーザー入出力に関する機能をまとめたものがエディタクラスです。そしてこのクラスのインスタンスは図面ごとに生成されますので、エディタを取得する図面を指定しなければなりません。
今回は最前面(アクティブ)の図面のエディタを利用しますので、ドキュメントマネージャーの MdiActiveDocument プロパティでドキュメントを取得し、そこからエディタを取得ました。

プロンプトオプションを作成

ユーザー入力を制御するためのプロンプトオプション(*1)を生成します。
プロンプトオプションではプロンプトメッセージのほか、たとえば入力値をフィルタリングしたり初期値を決めるなどといった細かい指定をすることができます。

プロンプトオプションはユーザー入力関数ごとに専用のものが用意されていますので注意してください。

ユーザー入力を受け取る

ユーザー入力に成功すると、戻り値の Status プロパティには PromptStatus.OK が設定されます。まずは Status のチェックをして、それからユーザーが指定した値を取得するようにすればいいでしょう。

ユーザー入力関数の結果の型は関数ごとに異なりますので注意してください。

ユーザー入力系関数一覧

.NET API で用意されているユーザー入力系関数(*2)を以下にまとめました。

関数 オプション 戻り値 概要
GetAngle PromptAngleOptions PromptDoubleResult 角度(ラジアン)を取得する
GetCorner PromptCornerOptions PromptPointResult 矩形のコーナーを取得する
GetDistance PromptDistanceOptions PromptDoubleResult 距離を取得する
GetDouble PromptDoubleOptions PromptDoubleResult 実数値を取得する
GetEntity PromptEntityOptions PromptEntityResult エンティティを選択する
GetInteger PromptIntegerOptions PromptIntegerResult 整数値を取得する
GetKeywords PromptKeywordOptions PromptResult キーワードを取得する(*3)
GetNestedEntity PromptNestedEntityOptions PromptNestedEntityResult 従属エンティティを取得する
GetPoint PromptPointOptions PromptPointResult 点を取得する
GetSelection PromptSelectionOptions PromptSelectionResult 選択セットを取得する
GetString PromptStringOptions PromptResult 文字列を取得する
(MINERVA 深津貴成)
  1. ^ メッセージを設定するだけでしたら必ずしもプロンプトオプションを使用する必要はありません。ほぼすべてのユーザー入力系関数は、引数に文字列を指定するだけでも使用することができます。この場合、プロンプトオプションはデフォルト値が使用されます。
  2. ^ ユーザー入力を受け取る関数には、この表以外にも DoPrompt(), Drag() があります。DoPrompt() は与えるプロンプトオプションによってユーザー入力の挙動を切り替えることができる関数です。Drag() は自作のジグを使ってユーザー入力を得ることができますが、取り扱いの難しい関数ですので項を改めて取り上げたいと思います。
  3. ^ GetKeywords() でなくとも、どの関数でもオプションの設定しだいでキーワードを使用することができます。ユーザーがキーワードを選択した場合、戻り値の Status プロパティには PromptStatus.Keyword が設定されます。またユーザーが選択したキーワードを取得するには、StringResult プロパティを参照してください。