AutoCAD 組込の [ERASE] コマンドは、図面上でエンティティが選択されている状態でコマンドが発行されると、そのエンティティが即座に削除されます。この動作を実現するためにはカスタムコマンドで図面上の選択セットを取得する必要がありますが、これにはちょっとした作法があります。

そこで本稿では、カスタムコマンドで図面上の選択状態を取得する方法についてご紹介したいと思います。

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

カスタムコマンドで図面上の選択状態を取得するサンプル

Editor.SelectImplied() メソッドは図面上の選択状態を取得するためのメソッドですが、単純にこのメソッドを発行するだけでは想定通りに動作しません。これはコマンド発行時に選択状態がキャンセルされてしまうためです。これを回避するには、CommandMethod 属性の第二引数で CommandFlags.UsePickSet フラグを立ててやる必要があります。

まずは下記のサンプルコードをビルドし、その成果物を [NETLOAD] してください。次に図面上でエンティティを選択した状態で [SELSET_SAMPLE] コマンドを発行すると、選択状態にあるエンティティのオブジェクトIDがコマンドラインウィンドウに表示されます。

サンプルコード

// コマンドフラグを設定
[CommandMethod( "SELSET_SAMPLE", CommandFlags.UsePickSet )]
public void SelsetSampel()
{
    Editor edit = Application.DocumentManager.MdiActiveDocument.Editor;

    // 図面上で選択中の選択セットを取得する
    PromptSelectionResult sel_res = edit.SelectImplied();
    if( sel_res.Status != PromptStatus.OK )
    {
        return;
    }

    foreach( ObjectId sel_objid in sel_res.Value.GetObjectIds() )
    {
        edit.WriteMessage( "ObjectId: {0}\n", sel_objid );
    }
}

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

実行結果

ObjectId: (2130300464)
ObjectId: (2130298448)
ObjectId: (2130297728)
ObjectId: (2130297464)

サンプルコード解説

コマンドフラグ

CommandMethod 属性の第二引数にはコマンドフラグを指定することができ、これを使ってカスタムコマンドの挙動を制御することができます。コマンドフラグは CommandFlags 列挙型を用いますが、その値を "|(論理和)" で結合することで、複数のコマンドフラグを同時に設定(*1)することができます。

CommandFlags.UsePickSet

通常、カスタムコマンドを発行すると図面上での選択状態はクリアされ、コマンドメソッド内でその選択セットを取得することはできません。しかしコマンドフラグに CommandFlags.UsePickSet を指定すると、 Editor.SelectImplied() メソッドを使用することでこれが可能になります。

図面上で選択状態にある場合、戻り値の PromptSelectionResult.Status プロパティには PromptStatus.OK が設定され、Value プロパティにはその選択セットが設定されます。このとき、グリップを取得することはできませんので気をつけてください。
また図面上での選択状態がない場合、Status プロパティには PromptStatus.Error が設定されますので、これで状況を判定することができます。

CommandFlags 列挙型の値

列挙型の値 整数値
Modal 0x00000000
Transparent 0x00000001
UsePickSet 0x00000002
Redraw 0x00000004
NoPerspective 0x00000008
NoMultiple 0x00000010
NoTileMode 0x00000020
NoPaperSpace 0x00000040
PlotOnly 0x00000080
NoOem 0x00000100
Undefined 0x00000200
InProgress 0x00000400
Defun 0x00000800
NoNewStack 0x00010000
NoInternalLock 0x00020000
DocReadLock 0x00080000
DocExclusiveLock 0x00100000
Session 0x00200000
Interruptible 0x00400000
NoHistory 0x00800000
NoUndoMarker 0x01000000
NoBlockEditor 0x02000000
(MINERVA 深津貴成)
  1. ^ すべての値は各ビットが重ならないように設定されていますので、どのような組み合わせでも設定可能です。しかしよく使うのは、UsePickSetSession ぐらいではないでしょうか。