Динамическая загрузка Ribbon tab при загрузке Autocad

Автор Тема: Динамическая загрузка Ribbon tab при загрузке Autocad  (Прочитано 7589 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн EseАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 2
Всем, добрый день!

Как сделать чтобы при загрузке сборки автоматически подгружалась закладка 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. }

Отмечено как Решение Ese 26-10-2020, 15:33:39

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Код - 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.         }
« Последнее редактирование: 26-10-2020, 17:50:11 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ese,
А воспользоваться поиском по форуму? Как отловить событие включения ленты?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн EseАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 2
Ese,
А воспользоваться поиском по форуму? Как отловить событие включения ленты?

Виноват, не нашел сразу.

Оффлайн EseАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 2
EventHandlerRibbonItemEventArgs
Только у меня почему то подчеркнуто - EventHandlerRibbonItemEventArgs.  Какое пространство имен надо подключить?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Autodesk.Windows.ComponentManager.ItemInitialized += new EventHandler(ComponentManager_ItemInitialized);
Напишите просто так:
Код - C# [Выбрать]
  1. Autodesk.Windows.ComponentManager.ItemInitialized += ComponentManager_ItemInitialized;

Оффлайн EseАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 2
Autodesk.Windows.ComponentManager.ItemInitialized += new EventHandler(ComponentManager_ItemInitialized);
Напишите просто так:
Код - C# [Выбрать]
  1. Autodesk.Windows.ComponentManager.ItemInitialized += ComponentManager_ItemInitialized;

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


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Как быть?
Ну дык логично, что при отписке от события надо написать аналогично
Код - C# [Выбрать]
  1. Autodesk.Windows.ComponentManager.ItemInitialized -= ComponentManager_ItemInitialized;

Оффлайн EseАвтор темы

  • ADN OPEN
  • Сообщений: 22
  • Карма: 2
что при отписке от события надо написать аналогично
Спасибо, просто с событиями не знаком. Сегодня почитаю.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
EventHandlerRibbonItemEventArgs
Только у меня почему то подчеркнуто - EventHandlerRibbonItemEventArgs.  Какое пространство имен надо подключить?

Опечатка у Александр Пекшев aka Modis, которую я исправил. Вместо EventHandlerRibbonItemEventArgs должно быть EventHandler<RibbonItemEventArgs>
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение