1

実行する文字列をMapに送信して、ユーザーがより簡単な方法で描画したオブジェクトを見つけることは可能ですか?私がやっていることはやりすぎだと感じます...

これはコマンドです:

    acad.DocumentManager.MdiActiveDocument.SendStringToExecute
("_MPOLYGON ", false, false, true);

今のところ、私がしていることは、オブジェクト追加イベントをサブスクライブし、コマンド終了イベントをサブスクライブしてから、sendStringToExecuteを呼び出し、そこからDBに入ってくるすべての新しいオブジェクトをチェックし、見つけたオブジェクトへの参照を保持しますユーザーが描画しました。

だから最初に:

    HostApplicationServices.WorkingDatabase.ObjectAppended += 
new ObjectEventHandler(activeDB_ObjectAppended);

    acad.DocumentManager.MdiActiveDocument.CommandEnded += 
new CommandEventHandler(MdiActiveDocument_CommandEnded);

コマンドの実行中:

void activeDB_ObjectAppended(object sender, ObjectEventArgs e)
        {
            polyDessinIds.Add(e.DBObject.Id);
        }

Autocadは、_MPOLYGONコマンドの実行中にオブジェクトをデータベースに追加するため、すべてのオブジェクトへの参照を保持します。Autocadは、ユーザーが描画しているときにデータベースに点と線を追加します。たとえば、行の1回目と2回目のクリックは、データベースに配置されているようです。また、ポリゴンが作業データベースに追加されても、それが最後のポリゴンであるとは限りません。最後に追加されたオブジェクトも、実際のオブジェクトであるとは限りません。

次に、コマンドが終了すると、正しいobjectIdを探します。描画されたポリゴンが多数ある場合でも、描画された1つまたは複数のポリゴンを参照する有効なobjectIdは1つだけです。

 foreach (ObjectId obj in polyDessinIds)
 {
            if (obj.IsErased == false && obj.ObjectClass.Name == "AcDbMPolygon")
            {
             mPolygons = obj;
             //there should be only one valid at this point
             break;
            }
 }

これを行うためのより良い、より信頼できる方法があるかどうか疑問に思っていますか?オブジェクトの選択を求めるプロンプトを表示すると、すべてのオブジェクトを含む選択セットが返されます。ユーザーがオブジェクトを描画すると、新しいオブジェクトを返すだけの「promptForPolygon」などの方法はありますか?

4

1 に答える 1

3

私はあなたがそのコードのすべてを必要とするとは思わない、遊んでみてください:

ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectLast()

これにより、最後に描画または使用されたエンティティが得られます。

ここでもう少し説明:

http://72.77.202.9/index.php?topic=20267.0

それが役に立てば幸い。

于 2012-11-27T14:06:28.937 に答える