これは、(Interop ライブラリの代わりに) 他の Autocad .NET ライブラリを使用して可能です。しかし幸いなことに、一方が他方を排除するわけではありません。
次の名前空間を含むライブラリを参照する必要があります。
using Autodesk.Autocad.ApplicationServices
using Autodesk.Autocad.EditorInput
using Autodesk.Autocad.DatabaseServices
(Autodesk から Object Arx ライブラリを無料でダウンロードできます):
Editor
autocad からにアクセスする必要がありますDocument
。あなたが示したコードでは、おそらくAcadDocument
ドキュメントを扱っているでしょう。したがって、 を に変換するAcadDocument
には、次のDocument
ようにします。
//These are extension methods and must be in a static class
//Will only work if Doc is saved at least once (has full name) - if document is new, the name will be
public static Document GetAsAppServicesDoc(this IAcadDocument Doc)
{
return Application.DocumentManager.OfType<Document>().First(D => D.Name == Doc.FullOrNewName());
}
public static string FullOrNewName(this IAcadDocument Doc)
{
if (Doc.FullName == "")
return Doc.Name;
else
return Doc.FullName;
}
を取得したらDocument
、Editor
、および を取得します。GetSelection(Options, Filter)
Options には、プロパティSingleOnly
とSinglePickInSpace
. それを設定すると、true
あなたが望むことができます。(両方を試して、どちらがうまく機能するかを確認してください)
//Seleciton options, with single selection
PromptSelectionOptions Options = new PromptSelectionOptions();
Options.SingleOnly = true;
Options.SinglePickInSpace = true;
//This is the filter for blockreferences
SelectionFilter Filter = new SelectionFilter(new TypedValue[] { new TypedValue(0, "INSERT") });
//calls the user selection
PromptSelectionResult Selection = Document.Editor.GetSelection(Options, Filter);
if (Selection.Status == PromptStatus.OK)
{
using (Transaction Trans = Document.Database.TransactionManager.StartTransaction())
{
//This line returns the selected items
AcadBlockReference SelectedRef = (AcadBlockReference)(Trans.GetObject(Selection.Value.OfType<SelectedObject>().First().ObjectId, OpenMode.ForRead).AcadObject);
}
}