選択セットのキーワード(.NET)

アプリケーションは、キーワードを使用して、ユーザに選択方法を指定するように求めるプロンプトを表示してから、実際に選択セットを作成することができます。

キーワードは、PromptSelectionOptions オブジェクトのインスタンスを作成することによって、オブジェクトの選択操作に割り当てることができます。PromptSelectionOptions オブジェクトを作成したら、SetKeywords メソッドを使用して、ユーザがコマンのプロンプトに対して入力できる個々のキーワードを割り当てます。キーワードを PromptSelectionOptions オブジェクトに割り当てたら、今度は PromptSelectionOptions オブジェクトをエディタの GetSelection メソッドに渡す必要があります。

ユーザが Select objects: (「オブジェクトを選択」)というプロンプトに対して入力できるキーワードの実装は、PromptSelectionOptions.KeywordInput イベントハンドラで処理されます。この結果表示されたプロンプトにユーザがキーワードを入力すると、KeywordInput イベントが発生し、アプリケーションのハンドラが呼び出されます。

KeywordInput ハンドラは、入力と出力の両方として機能する SelectionTextInputEventArgs 引数を受け取ります。SelectionTextInputEventArgs 引数の Input プロパティは、選択されたキーワードを示します。典型的なハンドラは、このキーワードをアプリケーションのキーワード リストのキーワードと比較して、適切な選択方法を呼び出します。選択方法によって図形が返されると、アプリケーションはこれらの図形を SelectionTextInputEventArgs.AddObjects メソッドを使用して SelectionTextInputEventArgs 引数に追加します。元の GetSelection 呼び出しは、戻るときにキーワード リストを設定したメソッドに、選択された図形を提供します。

次の例では、5 つのキーワードを定義し、ユーザが選択したキーワードをサポートするためにハンドラを追加します。

VB.NET

Private Shared Sub SelectionKeywordInputHandler(ByVal sender As Object, ByVal eSelectionInput As SelectionTextInputEventArgs)
    '' Gets the current document editor and define other variables for the current scope
    Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
    Dim acSSPrompt As PromptSelectionResult = Nothing

    '' See if the user choose the myFence keyword
    Select Case eSelectionInput.Input
        Case "myFence"
            '' Uses the four points to define a fence selection
            Dim ptsFence As New Point3dCollection()
            ptsFence.Add(New Point3d(5.0, 5.0, 0.0))
            ptsFence.Add(New Point3d(13.0, 15.0, 0.0))
            ptsFence.Add(New Point3d(12.0, 9.0, 0.0))
            ptsFence.Add(New Point3d(5.0, 5.0, 0.0))

            acSSPrompt = acDocEd.SelectFence(ptsFence)
        Case "myWindow"
            '' Defines a rectangular window selection
            acSSPrompt = acDocEd.SelectWindow(New Point3d(1.0, 1.0, 0.0), _
                                              New Point3d(30.0, 20.0, 0.0))
        Case "myWPoly"
            '' Uses the four points to define a polygon window selection
            Dim ptsPolygon As New Point3dCollection()
            ptsPolygon.Add(New Point3d(5.0, 5.0, 0.0))
            ptsPolygon.Add(New Point3d(13.0, 15.0, 0.0))
            ptsPolygon.Add(New Point3d(12.0, 9.0, 0.0))
            ptsPolygon.Add(New Point3d(5.0, 5.0, 0.0))

            acSSPrompt = acDocEd.SelectWindowPolygon(ptsPolygon)
        Case "myLastSel"
            '' Gets the last object created
            acSSPrompt = acDocEd.SelectLast()
        Case "myPrevSel"
            '' Gets the previous object selection set
            acSSPrompt = acDocEd.SelectPrevious()
    End Select

    '' If the prompt status is OK, objects were selected
    If Not acSSPrompt Is Nothing Then
        If acSSPrompt.Status = PromptStatus.OK Then
            '' Objects were selected, so add them to the current selection
            Dim acSSet As SelectionSet = acSSPrompt.Value
            Dim acObjIds As ObjectId() = acSSet.GetObjectIds()
            eSelectionInput.AddObjects(acObjIds)
        Else
            Return
        End If
    End If
End Sub

<CommandMethod("SelectionKeywordInput")> _
Public Sub SelectionKeywordInput()
    '' Gets the current document editor
    Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor

    '' Setups the keyword options
    Dim acKeywordOpts As New PromptSelectionOptions()
    acKeywordOpts.Keywords.Add("myFence")
    acKeywordOpts.Keywords.Add("myWindow")
    acKeywordOpts.Keywords.Add("myWPoly")
    acKeywordOpts.Keywords.Add("myLastSel")
    acKeywordOpts.Keywords.Add("myPrevSel")

    '' Adds the event handler for keyword input
    AddHandler acKeywordOpts.KeywordInput, AddressOf SelectionKeywordInputHandler

    '' Prompts the user for a selection set
    Dim acSSPrompt As PromptSelectionResult = acDocEd.GetSelection(acKeywordOpts)

    '' If the prompt status is OK, objects were selected
    If acSSPrompt.Status = PromptStatus.OK Then
        '' Gets the selection set
        Dim acSSet As SelectionSet = acSSPrompt.Value

        '' Gets the objects from the selection set
        Dim acObjIds As ObjectId() = acSSet.GetObjectIds()
        Dim acCurDb As Database = Application.DocumentManager.MdiActiveDocument.Database

        '' Starts a transaction
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Try
                '' Gets information about each object
                For Each acObjId As ObjectId In acObjIds
                    Dim acEnt As Entity = acTrans.GetObject(acObjId, OpenMode.ForWrite, True)
                    acDocEd.WriteMessage(vbLf + "Object selected: " + acEnt.GetType().FullName)
                Next acObjId
            Finally
                acTrans.Dispose()
            End Try
        End Using
    End If

    '' Removes the event handler for keyword input
    RemoveHandler acKeywordOpts.KeywordInput, AddressOf SelectionKeywordInputHandler
End Sub

C#

private static void SelectionKeywordInputHandler(object sender, SelectionTextInputEventArgs eSelectionInput)
{
			 // Gets the current document editor and define other variables for the current scope
			 Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
    PromptSelectionResult acSSPrompt = null;
    SelectionSet acSSet = null;
    ObjectId[] acObjIds = null;

	   // See if the user choose the myFence keyword
	   switch (eSelectionInput.Input) {
        case "myFence":
			         // Uses the four points to define a fence selection
            Point3dCollection ptsFence = new Point3dCollection();
            ptsFence.Add(new Point3d(5.0, 5.0, 0.0));
            ptsFence.Add(new Point3d(13.0, 15.0, 0.0));
            ptsFence.Add(new Point3d(12.0, 9.0, 0.0));
            ptsFence.Add(new Point3d(5.0, 5.0, 0.0));

            acSSPrompt = acDocEd.SelectFence(ptsFence);
			         break;
        case "myWindow":
			         // Defines a rectangular window selection
            acSSPrompt = acDocEd.SelectWindow(new Point3d(1.0, 1.0, 0.0), new Point3d(30.0, 20.0, 0.0));
			         break;
        case "myWPoly":
			         // Uses the four points to define a polygon window selection
            Point3dCollection ptsPolygon = new Point3dCollection();
            ptsPolygon.Add(new Point3d(5.0, 5.0, 0.0));
            ptsPolygon.Add(new Point3d(13.0, 15.0, 0.0));
            ptsPolygon.Add(new Point3d(12.0, 9.0, 0.0));
            ptsPolygon.Add(new Point3d(5.0, 5.0, 0.0));

            acSSPrompt = acDocEd.SelectWindowPolygon(ptsPolygon);
			         break;
		      case "myLastSel":
			        // Gets the last object created
			        acSSPrompt = acDocEd.SelectLast();
			        break;
		      case "myPrevSel":
			        // Gets the previous object selection set
			        acSSPrompt = acDocEd.SelectPrevious();
			        break;
	   }

    // If the prompt status is OK, objects were selected and return
    if (acSSPrompt != null)
    {
        if (acSSPrompt.Status == PromptStatus.OK)
        {
            // Objects were selected, so add them to the current selection
            acSSet = acSSPrompt.Value;
            acObjIds = acSSet.GetObjectIds();
            eSelectionInput.AddObjects(acObjIds);
        }
    }
}

[CommandMethod("SelectionKeywordInput")]
public static void SelectionKeywordInput()
{
    // Gets the current document editor
    Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;

    // Setups the keyword options
    PromptSelectionOptions acKeywordOpts = new PromptSelectionOptions();
    acKeywordOpts.Keywords.Add("myFence");
    acKeywordOpts.Keywords.Add("myWindow");
    acKeywordOpts.Keywords.Add("myWPoly");
    acKeywordOpts.Keywords.Add("myLastSel");
    acKeywordOpts.Keywords.Add("myPrevSel");

    // Adds the event handler for keyword input
    acKeywordOpts.KeywordInput += new SelectionTextInputEventHandler(SelectionKeywordInputHandler);

    // Prompts the user for a selection set
    PromptSelectionResult acSSPrompt = acDocEd.GetSelection(acKeywordOpts);

    // If the prompt status is OK, objects were selected
    if (acSSPrompt.Status == PromptStatus.OK)
    {
        // Gets the selection set
        SelectionSet acSSet = acSSPrompt.Value;

        // Gets the objects from the selection set
        ObjectId[] acObjIds = acSSet.GetObjectIds();
        Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database;

        // Starts a transaction
        using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
        {
            try
            {
                // Gets information about each object
                foreach (ObjectId acObjId in acObjIds)
                {
                    Entity acEnt = (Entity)acTrans.GetObject(acObjId, OpenMode.ForWrite, true);
                    acDocEd.WriteMessage("\nObject selected: " + acEnt.GetType().FullName);

                }
            }
            finally
            {
                acTrans.Dispose();
            }
        }
    }

    // Removes the event handler for keyword input
    acKeywordOpts.KeywordInput -= new SelectionTextInputEventHandler(SelectionKeywordInputHandler);
}