Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Alex от 02-01-2014, 12:44:52

Название: Порядок автозагрузки плагинов
Отправлено: Alex от 02-01-2014, 12:44:52
Добрый день.
С наступившим всех!)
...
Насколько я понял, автозагрузка плагинов осуществляется через соответвующую запись в реестре (http://through-the-interface.typepad.com/through_the_interface/2006/09/automatic_loadi.html (http://through-the-interface.typepad.com/through_the_interface/2006/09/automatic_loadi.html)). При этом есть два варианта: либо чтобы плагин загружался сразу, либо чтобы он загружался при первом вызове какой-либо оформленной в нем команды. Меня интересует первый вариант.
При загрузке плагина мне нужно добавить на ленту новую вкладку с кнопками. Соответственно у меня получается такой код:

Код - C# [Выбрать]
  1. public class Commands : IExtensionApplication
  2. {
  3.   public void Initialize()
  4.   {
  5.      ...
  6.      addTab();
  7.      ...
  8.   }
  9. }
  10.  

Однако вкладка на ленту не добавляется. При этом сама процедура инициализации выполняется полностью.
Насколько я понял, плагины загружаются практически сразу после начала загрузки самого AutoCAD'а. И пока плагин не загрузится, AutoCAD тоже дальше загружаться не будет (например, если в функции Initialize() вызвать Windows.MessageBox(), то AutoCAD не будет дальше загружаться, пока не закроешь окно MessageBox'а).
Причем в момент загрузки плагина сама лента (объект RibbonControl) еще не создана, из-за чего добавить вкладку не получается.
...
Собственно, вопрос: можно ли как-то сделать так, чтобы плагин загружался не ДО, а ПОСЛЕ того, как AutoCAD инициализирует пользовательский интерфейс?
...
P.S. Понятно, что можно создать еще одну команду AutoCAD, назвать ее addRibbon и заставить пользователя вводить ее каждый раз... Но это как-то неудобно.(
Название: Re: Порядок автозагрузки плагинов
Отправлено: Александр Ривилис от 02-01-2014, 18:14:54
Изменить порядок загрузки плагинов ты не можешь. Впрочем это и не нужно. В качестве решения этой проблемы могу предложить два варианта, которые есть в блоге Kean Walmsley:
1) http://through-the-interface.typepad.com/through_the_interface/2013/01/displaying-a-dialog-on-autocad-startup-using-net.html
2) http://through-the-interface.typepad.com/through_the_interface/2006/08/calling_command.html
Третий вариант - это объединить два первых. Точнее создать команду addRibbon и запускать её из события Application.Idle одним из способов, указанных во второй ссылке. 
Название: Re: Порядок автозагрузки плагинов
Отправлено: Alex от 03-01-2014, 16:33:39
Спасибо за наводку.
С ходу применить Application.Idle не удалось: это событие все-таки происходит еще до загрузки пользовательского интерфейса.
В итоге все свелось к примерно такому коду:
Код - C# [Выбрать]
  1. public class Commands : IExtensionApplication
  2. {
  3.   public void Initialize()
  4.   {
  5.      /// ...
  6.      Autodesk.AutoCAD.ApplicationServices.Application.Idle += new EventHandler(on_ApplicationIdle);
  7.      /// ...
  8.   }
  9.  
  10.   public void on_ApplicationIdle(object sender, EventArgs e)
  11.   {
  12.      /// ...
  13.      addRibbonTab();
  14.      /// ...
  15.   }
  16.  
  17.   public void addRibbonTab()
  18.   {
  19.      /// ...
  20.      RibbonControl rbCtrl = ComponentManager.Ribbon;
  21.      if (rbCtrl != null)
  22.      {
  23.         // добавление вкладки
  24.         // ...
  25.         Autodesk.AutoCAD.ApplicationServices.Application.Idle -= on_ApplicationIdle;
  26.      }
  27.   }
  28. }
  29.  
Название: Re: Порядок автозагрузки плагинов
Отправлено: Александр Ривилис от 03-01-2014, 16:43:35
Я не уловил разницы между тем, что я предложил и тем кодом, который ты показал.
Название: Re: Порядок автозагрузки плагинов
Отправлено: Alex от 03-01-2014, 17:04:01
Принципиальной и нет.)
Просто в блоге Kean'а удаление привязки обработчика к событию происходит безусловно, а мне еще нужно проверять, успел ли создаться объект RibbonControl.
А так - да, метод  абсолютно тот же.
Название: Re: Порядок автозагрузки плагинов
Отправлено: Александр Ривилис от 03-01-2014, 17:10:57
Т.е. ты имеешь в виду, что реальное добавление RibbonControl происходит необязательно в первом событии Application.Idle? Тогда понятно.
Название: Re: Порядок автозагрузки плагинов
Отправлено: Alex от 03-01-2014, 17:17:38
Да, как-то так.