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

ADN Club => AutoCAD .NET API => Тема начата: zavor от 22-04-2016, 07:40:23

Название: Пропадание вкладок плагина в Ribbon
Отправлено: zavor от 22-04-2016, 07:40:23
Всем здравствуйте. У меня возникла следующая проблема.Имеется есть два плагина. Вкладка первого плагина  добавляется в Ribbon через cuix файл, а вкладка второго плагина подгружается динамически в коде. Когда загружается плагин через cuix, а затем подгружается плагин второй плагин, то все вкладки на месте и ни одна из них не исчезает из ribbon. А когда сначала происходит загрузка  динамически подгружаемого плагина, а затем cuix плагина, тогда динамический плагин исчезает. При дебаге кода я увидел, что динамический плагин удаляется из табов после загрузки cuix плагина. Скажите, как можно загружать cuix плагин так, чтобы не удалялся динамический плагин? Одно из решений было запоминать вкладку дин. плагина переде загрузкой cuix, а после загрузки добавлять вкладку в ribbon. Но что если у меня много cuix плагинов, как тогда быть ? И в какой очередности акад загружает плагины, может ему можно как-нибудь "сказать" какие плагины загружать первыми.

C# код загрузки динамического плагина (ARM Топограф)
Код - C# [Выбрать]
  1. internal static void InitRibbonPanel(HandlerPressedButton delegateBtn)
  2. {
  3.         var ribbonControl = ComponentManager.Ribbon;
  4.         if (ribbonControl == null)
  5.         {
  6.                 return;
  7.         }
  8.  
  9.         var ribbonTab = ribbonControl.FindTab(Constants.UIIndentificators.InternalTabId);
  10.         if (ribbonTab == null)
  11.         {
  12.                 ribbonTab = new RibbonTab
  13.                                                 {
  14.                                                                         Title = ProductConstants.ProductName,
  15.                                                                         Id = Constants.UIIndentificators.InternalTabId,
  16.                                                                         IsContextualTab = false
  17.                                                 };
  18.                 ribbonControl.Tabs.Add(ribbonTab);
  19.         }
  20.  
  21.         InitRibbonPanel(delegateBtn, ribbonTab);
  22. }
  23.  


C# код загрузки плагина cuix (Полотно+ Дороги)
Код - C# [Выбрать]
  1. public static AcadMenuGroup LoadCUIX()
  2. {
  3.         var fullPath = GetFileFullName(Constants.Interface.CUIX_NAME);
  4.  
  5.         UnloadMenuGroups(Constants.Interface.CUIX_NAME);
  6.  
  7.         var loaded = Application.LoadPartialMenu(fullPath);
  8.         return FindMenuGroup(Constants.Interface.CUIX_NAME);
  9. }
  10.  


Привожу еще изображения в момент дебага, когда динамический плагин уже подгружен, но не загружен cuix
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fadn-cis.org%2Fforum%2Findex.php%3Faction%3Ddlattach%3Btopic%3D7048.0%3Battach%3D1453%3Bimage&hash=9c2ffd02afd0352aaacb358ed47fecbf)
На рисунке видно что количество табов 189



После загрузки cuix количество табов уменьшилось на 1
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fadn-cis.org%2Fforum%2Findex.php%3Faction%3Ddlattach%3Btopic%3D7048.0%3Battach%3D1455%3Bimage&hash=e295517dc6c53515070abfee6dd1b5d2)




Прочитай правило форматирования кода на форуме и не забывай следовать ему. /* Александр Ривилис */
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Александр Ривилис от 22-04-2016, 11:18:34
И в какой очередности акад загружает плагины, может ему можно как-нибудь "сказать" какие плагины загружать первыми.
Нет. Да и это тебе не помогло бы.
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Александр Ривилис от 22-04-2016, 11:21:13
Попробуй это: Как оставить видимыми элементы Ленты во время выполнения? (http://adn-cis.org/kak-ostavit-vidimyimi-elementyi-lentyi-vo-vremya-vyipolneniya.html)
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: zavor от 25-04-2016, 08:18:36
Ваш метод не помог мне. Скажите, а существует ли событие, которое реагирует на завершение загрузки плагина?
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Александр Ривилис от 25-04-2016, 11:26:11
Ваш метод не помог мне.
Думаю, что ты его или неправильно понял или неправильно использовал.
Скажите, а существует ли событие, которое реагирует на завершение загрузки плагина?
Нет. Такого события нет.
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Андрей Бушман от 25-04-2016, 17:05:12
Скажите, а существует ли событие, которое реагирует на завершение загрузки плагина?
https://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload%28v=vs.110%29.aspx
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Александр Ривилис от 25-04-2016, 17:26:22
Скажите, а существует ли событие, которое реагирует на завершение загрузки плагина?
https://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload%28v=vs.110%29.aspx
Не уверен, что это то, что zavor ищет. Хотя...
Я могу предложить другой вариант. Мне кажется, что он должен в данном случае сработать. Здесь мы подписываемся на события, которые приводят к изменению Ленты при загрузке cuix-файла и переключении рабочего пространства (workspace). Этими событиями и следует воспользоваться для того, чтобы динамически изменить Ленту. Но делать это следует не в этом событии, а тогда, когда AutoCAD свободен, т.е. или в событии Application.Idle или Editor.EnteringQuiescentState
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Internal.Reactors;
  8.  
  9. [assembly: ExtensionApplication(typeof(CuiEvents.MyPlugin))]
  10.  
  11. namespace CuiEvents
  12. {
  13.   public class MyPlugin : IExtensionApplication
  14.   {
  15.     void IExtensionApplication.Initialize()
  16.     {
  17.       try
  18.       {
  19.         CuiEventManager cuiMng = CuiEventManager.Instance();
  20.         cuiMng.LoadRibbon += cuiMng_LoadRibbon;
  21.         cuiMng.WorkspaceRibbonSave += cuiMng_WorkspaceRibbonSave;
  22.         cuiMng.WorkspaceRestore += cuiMng_WorkspaceRestore;
  23.       }
  24.       catch { }
  25.     }
  26.  
  27.     //////////////////////////////////////////////////////////////////////////
  28.     // Во всех следующих событиях можно себе отметить, что следует пересоздать
  29.     // свою Ленту, созданную динамически. Само пересоздание можно выполнить
  30.     // в любом другом событии. Например, Application.Idle или
  31.     // Editor.EnteringQuiescentState
  32.     //////////////////////////////////////////////////////////////////////////
  33.  
  34.     void cuiMng_WorkspaceRestore(object sender, WorkspaceEventArgs e)
  35.     {
  36.       Application.ShowAlertDialog("Восстанавливается рабочее пространство <"
  37.         + e.Name + "> Id=" + e.Id);
  38.     }
  39.  
  40.     void cuiMng_WorkspaceRibbonSave(object sender, WorkspaceEventArgs e)
  41.     {
  42.       Application.ShowAlertDialog("Сохраняется рабочее пространство <"
  43.         + e.Name + "> Id=" + e.Id);
  44.     }
  45.  
  46.     void cuiMng_LoadRibbon(object sender, CuiLoadEventArgs e)
  47.     {
  48.       Application.ShowAlertDialog("Загружается Лента в рабочее пространство: <"
  49.          + e.CurrentWorkspaceName + ">"
  50.          + e.CurrentWorkspaceId);
  51.     }
  52.     void IExtensionApplication.Terminate()
  53.     {
  54.     }
  55.   }
  56. }

Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Андрей Бушман от 25-04-2016, 17:29:37
Проблема топикстартера в том, что он мешает мух с котлетами. Либо CUIX, либо программно. А он всё в одну кучу сваливает.
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Александр Ривилис от 25-04-2016, 17:38:04
Проблема топикстартера в том, что он мешает мух с котлетами. Либо CUIX, либо программно. А он всё в одну кучу сваливает.
Да. Но возможна ситуация, когда кроме его приложения, которое работает с Лентой программно, есть еще приложения, которые грузят Ленту из одного или нескольких CUIX и/или меняют рабочие пространства. При этом эго Лента, созданная программно, исчезает. Конфигурация и порядок загрузки этих сторонних плагинов непредсказуем. Так что его цель - "защитить" свою Ленту в любой конфигурации и в случае необходимости её пересоздать.
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Андрей Бушман от 25-04-2016, 17:42:19
Вообще, управлять тем, стоит ли отображать ту или иную ленту или туллбар - это прерогатива конечного пользователя, который настраивает интерфейс под себя. Пользователь знает, что такое CUIX, как их подгружать и выгружать. Т.е. "родной" механизм настроек автокада ему знаком и привычен.

Если же какой-то плагин будет самостоятельно по своему усмотрению каждый раз включать риббоны (при очередной загрузке) не смотря на то, что в прошлом сеансе пользователь их отключил (т.е. попросту посылая пользователя с его предпочтениями идти гулять лесом), то это, мягко говоря, плохое решение.
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Александр Ривилис от 25-04-2016, 17:45:56
...Если каждый плагин будет самостоятельно по своему усмотрению каждый раз включать риббоны не смотря на то, что в прошлом сеансе пользователь их отключил, то это, мягко говоря, плохое решение...
И здесь я с тобой согласен. Но это если пользоваться только Лентой из CUIX. С программной Лентой так не получится. Или потребуются достаточно приличные усилия для сохранения/восстановления её состояния.
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Андрей Бушман от 25-04-2016, 17:48:25
С программной Лентой так не получится. Или потребуются достаточно приличные усилия для сохранения/восстановления её состояния.
Не понял вас. Не получится что именно?
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Александр Ривилис от 25-04-2016, 17:56:10
С программной Лентой так не получится. Или потребуются достаточно приличные усилия для сохранения/восстановления её состояния.
Не понял вас. Не получится что именно?
Пользователь закрыл программно созданные вкладки Ленты. Нужно где-то это помнить и при следующем запуске не создавать свою вкладку.
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Андрей Бушман от 25-04-2016, 18:03:54
Пользователь закрыл программно созданные вкладки Ленты. Нужно где-то это помнить и при следующем запуске не создавать свою вкладку.
Теперь понял. Ну так это уж головная боль того, кто использует программное создание ленты. На мой взгляд, использовать файлы partial CUIX - самый рациональный путь. Пользовательские предпочтения следует учитывать. Объективных причин программного создания палитр вместо использования CUIX в составе BUNDLE-пакетов (настроенных соответствующим образом) я не вижу.
Название: Re: Пропадание вкладок плагина в Ribbon
Отправлено: Александр Ривилис от 25-04-2016, 18:21:46
Объективных причин программного создания палитр вместо использования CUIX в составе BUNDLE-пакетов (настроенных соответствующим образом) я не вижу.
Возможно единственная причина использования программной Ленты - создание собственных элементов управления на Ленте.