2013-07-10 1 views
1

Как я могу получить все выбранные объекты на активном чертеже Autocad в моем подключаемом приложении C# для Autocad?Получить все выбранные объекты в acitve Документ Autocad

Я попытался получить набор выбор следующим образом:

SelectionSet Selection = AcadApp.DocumentManager.MdiActiveDocument.Editor.SelectImplied().Value; 

foreach (SelectedObject Instance in Selection) ... 

Кажется, что я могу получить выбранные объекты, если у меня есть такой набор выбора. Проблема заключается в том, что я получаю нулевое ссылочное исключение в строке:

AcadApp.DocumentManager.MdiActiveDocument.Editor.SelectImplied().Value 
+0

Вы что-нибудь пробовали? –

+0

Я отредактировал вопрос, чтобы описать, что я сделал до сих пор. – Demir

ответ

1

Я получил он решение.

AcadApp.DocumentManager.MdiActiveDocument.Editor.SelectImplied().Value 

Этот код дает выделенные объекты, но, как я отметил в вопросе, я получаю исключение для ссылки на null. Это было потому, что я пытался o получить объекты в фоновом потоке. http://adndevblog.typepad.com/autocad/2012/06/use-thread-for-background-processing.html упоминает эту проблему.

Проблема решена, когда я вызываю MdiActiveDocument в основном потоке, а затем отправляю результат o мой фоновый поток для обработки.

+0

хорошо сделка. Я рад, что вы все разобрались. Поскольку вы работаете в потоковой передаче, проверьте изменчивый модификатор. –

2

Я думаю, что это то, что вы ищете. Я записал это без IDE, поэтому проверьте его.

using AcApp = Autodesk.Autocad.ApplicationServices.Application; 


public class yourclass 
{ 
    public Document AcDoc { 
     get { return AcApp.DocumentManager.MdiActiveDocument;} 
    }  
    public static void getSelectionSet() 
    { 
    var _editor = AcDoc.Editor; 
    var _selAll = ed.SelectAll(); 
    var _SelectionSet = _selAll.Value; 

    using(var trans = AcDoc.TransactionManager.StartTransaction()){ 
     foreach(var ObjId in _SelectionSet.GetObjectIds()){ 
     // apply logic 
     } 
     trans.Commit(); 
    } 
    } 

или если вы хотите, чтобы вернуть SelectionSet

public class yourclass 
{ 
public Document AcDoc { 
    get { return AcApp.DocumentManager.MdiActiveDocument;} 
} 

    public static SelectionSet getSelectionSet() 
    { 
     var _editor = AcDoc.Editor; 
     var _selAll = ed.SelectAll(); 
     return _selAll.Value; 
    } 
} 

простить форматирование, я не могу заставить его работать прямо на стеке

+0

Большое спасибо за ваше предложение. Моя проблема была на самом деле из-за нулевой ссылки, когда я пытаюсь получить доступ к MdiActiveDocument в фоновом потоке. Я опубликовал ссылку, которая дала мне его решение в моем ответе. – Demir

+1

Очень поздний ответ, но я наткнулся на это, ища ответ на этот вопрос. Этот ответ неверен. SelectAll() получает * все *, указывает на чертеже не выбранные объекты, которые были исходным вопросом. – mohnston

+0

Я исправлю это завтра утром с лучшим ответом. Этот дерьмовый код. –