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

ADN Club => AutoCAD .NET API => Тема начата: Ese от 26-10-2020, 14:38:06

Название: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Ese от 26-10-2020, 14:38:06
Всем, добрый день!

Как сделать чтобы при загрузке сборки автоматически подгружалась закладка Ribbon? Если я помещаю метод создания Ribbon  в Initialize(), то при загрузке сборки команд нет (видимо сборка не грузится). Надо подписываться на события? (С событиями я пока мало знаком).
Привожу пример:

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.ApplicationServices.Core;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.DatabaseServices;
  6. using Microsoft.Win32;
  7. using System.Reflection;
  8. using Autodesk.Windows;
  9.  
  10. namespace AcadUtils
  11. {
  12.  
  13.     public partial class Main : IExtensionApplication
  14.     {
  15.         [CommandMethod("TestCommand")]
  16.         public void MyCommand()
  17.         {
  18.             // создаем выпадающий список
  19.             Autodesk.Windows.RibbonCombo comboBox1 = new RibbonCombo();
  20.             comboBox1.Id = "_combobox1";
  21.  
  22.             // создаем кнопку
  23.             Autodesk.Windows.RibbonButton button1 = new Autodesk.Windows.RibbonButton();
  24.             button1.Id = "_button1";
  25.  
  26.             // создаем контейнер для элементов
  27.             Autodesk.Windows.RibbonPanelSource rbPanelSource = new Autodesk.Windows.RibbonPanelSource();
  28.             rbPanelSource.Title = "Новая панель элементов";
  29.             // добавляем в контейнер элементы управления
  30.             rbPanelSource.Items.Add(comboBox1);
  31.             rbPanelSource.Items.Add(new RibbonSeparator());
  32.             rbPanelSource.Items.Add(button1);
  33.  
  34.             // создаем панель
  35.             RibbonPanel rbPanel = new RibbonPanel();
  36.             // добавляем на панель контейнер для элементов
  37.             rbPanel.Source = rbPanelSource;
  38.  
  39.             // создаем вкладку
  40.             RibbonTab rbTab = new RibbonTab();
  41.             rbTab.Title = "Новая вкладка";
  42.             rbTab.Id = "HabrRibbon";
  43.             // добавляем на вкладку панель
  44.             rbTab.Panels.Add(rbPanel);
  45.  
  46.             // получаем указатель на ленту AutoCAD
  47.             Autodesk.Windows.RibbonControl rbCtrl = ComponentManager.Ribbon;
  48.             // добавляем на ленту вкладку
  49.             rbCtrl.Tabs.Add(rbTab);
  50.             // делаем созданную вкладку активной ("выбранной")
  51.             rbTab.IsActive = true;
  52.         }
  53.  
  54.  
  55.         [CommandMethod("AutocadUtils_Register")]
  56.         public void RegisterMyApp()
  57.         {
  58.             // Get the AutoCAD Applications key
  59.             string sProdKey = HostApplicationServices.Current.UserRegistryProductRootKey;
  60.             string sAppName = "ArmTools_1.0";
  61.  
  62.             Microsoft.Win32.RegistryKey regAcadProdKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(sProdKey);
  63.             Microsoft.Win32.RegistryKey regAcadAppKey = regAcadProdKey.OpenSubKey("Applications", true);
  64.  
  65.             // Check to see if the "MyApp" key exists
  66.             string[] subKeys = regAcadAppKey.GetSubKeyNames();
  67.             foreach (string subKey in subKeys)
  68.             {
  69.                 // If the application is already registered, exit
  70.                 if (subKey.Equals(sAppName))
  71.                 {
  72.                     regAcadAppKey.Close();
  73.                     return;
  74.                 }
  75.             }
  76.  
  77.             // Get the location of this module
  78.             string sAssemblyPath = Assembly.GetExecutingAssembly().Location;
  79.  
  80.             // Register the application
  81.             Microsoft.Win32.RegistryKey regAppAddInKey = regAcadAppKey.CreateSubKey(sAppName);
  82.             regAppAddInKey.SetValue("DESCRIPTION", sAppName, RegistryValueKind.String);
  83.             regAppAddInKey.SetValue("LOADCTRLS", 14, RegistryValueKind.DWord);
  84.             regAppAddInKey.SetValue("LOADER", sAssemblyPath, RegistryValueKind.String);
  85.             regAppAddInKey.SetValue("MANAGED", 1, RegistryValueKind.DWord);
  86.  
  87.             regAcadAppKey.Close();
  88.         }
  89.  
  90.  
  91.  
  92.  
  93.  
  94.         [CommandMethod("AutocadUtils_Unregister")]
  95.         public void UnregisterMyApp()
  96.         {
  97.             // Get the AutoCAD Applications key
  98.             string sProdKey = HostApplicationServices.Current.UserRegistryProductRootKey;
  99.             string sAppName = "ArmTools_1.0";
  100.  
  101.             Microsoft.Win32.RegistryKey regAcadProdKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(sProdKey);
  102.             Microsoft.Win32.RegistryKey regAcadAppKey = regAcadProdKey.OpenSubKey("Applications", true);
  103.  
  104.             // Delete the key for the application
  105.             regAcadAppKey.DeleteSubKeyTree(sAppName);
  106.             regAcadAppKey.Close();
  107.         }
  108.  
  109.  
  110.  
  111.         public void Initialize()
  112.         {
  113.             Editor editor = Application.DocumentManager.MdiActiveDocument.Editor;
  114.             editor.WriteMessage("\nПакет утилит.\n");
  115.             RegisterMyApp();
  116.                         MyCommand(); // Тут проблема
  117.         }
  118.  
  119.         public void Terminate()
  120.         {
  121.          
  122.         }
  123.     }
  124. }
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Александр Пекшев aka Modis от 26-10-2020, 14:40:44
Код - C# [Выбрать]
  1. public void Initialize()
  2.         {
  3.             /* ленту грузим с помощью обработчика событий:
  4.              * Этот вариант нужно использовать, если ваш плагин
  5.              * стоит в автозагрузке, т.к. он (плагин) инициализируется
  6.              * до построения ленты
  7.              */
  8.             Autodesk.Windows.ComponentManager.ItemInitialized += new EventHandler(ComponentManager_ItemInitialized);
  9.         }
  10.  
  11.         /* Обработчик события
  12.          * Следит за событиями изменения окна автокада.
  13.          * Используем его для того, чтобы "поймать" момент построения ленты,
  14.          * учитывая, что наш плагин уже инициализировался
  15.          */
  16.         void ComponentManager_ItemInitialized(object sender, Autodesk.Windows.RibbonItemEventArgs e)
  17.         {
  18.             // Проверяем, что лента загружена
  19.             if (Autodesk.Windows.ComponentManager.Ribbon != null)
  20.             {
  21.                 // Строим нашу вкладку
  22.                 BuildRibbonTab();
  23.                
  24.                 //и раз уж лента запустилась, то отключаем обработчик событий
  25.                 Autodesk.Windows.ComponentManager.ItemInitialized -=
  26.                     new EventHandler<RibbonItemEventArgs>(ComponentManager_ItemInitialized);
  27.             }
  28.         }
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Александр Ривилис от 26-10-2020, 14:42:39
Ese,
А воспользоваться поиском по форуму? Как отловить событие включения ленты? (https://adn-cis.org/forum/index.php?topic=7912.0)
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Ese от 26-10-2020, 15:34:54
Ese,
А воспользоваться поиском по форуму? Как отловить событие включения ленты? (https://adn-cis.org/forum/index.php?topic=7912.0)

Виноват, не нашел сразу.
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Ese от 26-10-2020, 15:42:06
EventHandlerRibbonItemEventArgs
Только у меня почему то подчеркнуто - EventHandlerRibbonItemEventArgs.  Какое пространство имен надо подключить?
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Александр Пекшев aka Modis от 26-10-2020, 15:45:53
Autodesk.Windows.ComponentManager.ItemInitialized += new EventHandler(ComponentManager_ItemInitialized);
Напишите просто так:
Код - C# [Выбрать]
  1. Autodesk.Windows.ComponentManager.ItemInitialized += ComponentManager_ItemInitialized;
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Ese от 26-10-2020, 16:03:27
Autodesk.Windows.ComponentManager.ItemInitialized += new EventHandler(ComponentManager_ItemInitialized);
Напишите просто так:
Код - C# [Выбрать]
  1. Autodesk.Windows.ComponentManager.ItemInitialized += ComponentManager_ItemInitialized;

Я поменял, ошибка осталась. Если закоментировать  строку с EventHandlerRibbonItemEventArgs, то автокад зависает. Как быть?

(https://i.ibb.co/rkRZ8n2/1.png) (https://ibb.co/F6LBZG4)
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Александр Пекшев aka Modis от 26-10-2020, 16:06:05
Как быть?
Ну дык логично, что при отписке от события надо написать аналогично
Код - C# [Выбрать]
  1. Autodesk.Windows.ComponentManager.ItemInitialized -= ComponentManager_ItemInitialized;
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Ese от 26-10-2020, 16:09:31
что при отписке от события надо написать аналогично
Спасибо, просто с событиями не знаком. Сегодня почитаю.
Название: Re: Динамическая загрузка Ribbon tab при загрузке Autocad
Отправлено: Александр Ривилис от 26-10-2020, 17:51:57
EventHandlerRibbonItemEventArgs
Только у меня почему то подчеркнуто - EventHandlerRibbonItemEventArgs.  Какое пространство имен надо подключить?

Опечатка у Александр Пекшев aka Modis, которую я исправил. Вместо EventHandlerRibbonItemEventArgs должно быть EventHandler<RibbonItemEventArgs>