アプリケーションは、キーワードを使用して、ユーザに選択方法を指定するように求めるプロンプトを表示してから、実際に選択セットを作成することができます。
キーワードは、PromptSelectionOptions オブジェクトのインスタンスを作成することによって、オブジェクトの選択操作に割り当てることができます。PromptSelectionOptions オブジェクトを作成したら、SetKeywords メソッドを使用して、ユーザがコマンのプロンプトに対して入力できる個々のキーワードを割り当てます。キーワードを PromptSelectionOptions オブジェクトに割り当てたら、今度は PromptSelectionOptions オブジェクトをエディタの GetSelection メソッドに渡す必要があります。
ユーザが Select objects: (「オブジェクトを選択」)というプロンプトに対して入力できるキーワードの実装は、PromptSelectionOptions.KeywordInput イベントハンドラで処理されます。この結果表示されたプロンプトにユーザがキーワードを入力すると、KeywordInput イベントが発生し、アプリケーションのハンドラが呼び出されます。
KeywordInput ハンドラは、入力と出力の両方として機能する SelectionTextInputEventArgs 引数を受け取ります。SelectionTextInputEventArgs 引数の Input プロパティは、選択されたキーワードを示します。典型的なハンドラは、このキーワードをアプリケーションのキーワード リストのキーワードと比較して、適切な選択方法を呼び出します。選択方法によって図形が返されると、アプリケーションはこれらの図形を SelectionTextInputEventArgs.AddObjects メソッドを使用して SelectionTextInputEventArgs 引数に追加します。元の GetSelection 呼び出しは、戻るときにキーワード リストを設定したメソッドに、選択された図形を提供します。
次の例では、5 つのキーワードを定義し、ユーザが選択したキーワードをサポートするためにハンドラを追加します。
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
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);
}