Добавление кнопки в панель быстрого доступа Autocad Electrical

Автор Тема: Добавление кнопки в панель быстрого доступа Autocad Electrical  (Прочитано 6548 раз)

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

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 2
Господа, разбираюсь с темой добавления собственной кнопки в интерфейс автокада.
Если с полнофункциональным созданием своей панели с кучей кнопок и прочего все понятно (пример здесь), то с добавлением кнопки побыстрому возникли вопросики.
А именно интересно добавление кнопки в панель быстрого доступа.
Добавляю так:
Код - C# [Выбрать]
  1. public class PackageCreation : IExtensionApplication
  2.     {
  3.         [CommandMethod("SomeCommand", CommandFlags.Session)] //  RButton.CommandParameter
  4.         public void Test()
  5.         {
  6.             SomeWindow SomeForm = new SomeWindow();
  7.             Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow(SomeForm);
  8.         }
  9.  
  10.         public void Initialize()
  11.         {
  12.             Autodesk.Windows.ToolBars.QuickAccessToolBarSource QuickPanel = Autodesk.Windows.ComponentManager.QuickAccessToolBar; // Панель быстрого доступа
  13.  
  14.             Autodesk.Windows.RibbonButton RButton = new Autodesk.Windows.RibbonButton();
  15.             RButton.Name        = "SomeNameButton";
  16.             RButton.Description = "Some Description";
  17.             RButton.Id          = "SomeId";
  18.             RButton.Text        = "SomeText";
  19.  
  20.             RButton.CommandParameter = "SomeCommand";
  21.             RButton.CommandHandler = new QuickButtonCommandHandler();
  22.  
  23.            
  24.             System.Windows.Media.Imaging.BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
  25.                                                                             Properties.Resources.SomePng.GetHbitmap(), // Картинка в ресурсах проекта
  26.                                                                             IntPtr.Zero,
  27.                                                                             System.Windows.Int32Rect.Empty,
  28.                                                                             System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
  29.             RButton.Image = bs;
  30.  
  31.             if (!QuickPanel.Items.Select(s => s.Name).Contains(RButton.Name))
  32.                 QuickPanel.AddStandardItem(RButton);
  33.         }
  34.  
  35.         public void Terminate()
  36.         {}
  37.  
  38.  
  39.         public class QuickButtonCommandHandler : System.Windows.Input.ICommand
  40.         {
  41.             public bool CanExecute(object parameter)
  42.             {
  43.                 return true;
  44.             }
  45.  
  46.             public event EventHandler CanExecuteChanged;
  47.  
  48.             public void Execute(object parameter)
  49.             {
  50.                 var Btn = parameter as Autodesk.Windows.RibbonButton;
  51.                 if (Btn != null)
  52.                 {
  53.                     Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute(Btn.CommandParameter + " ", true, false, false);
  54.                 }
  55.             }
  56.         }
  57. }
Все работает. Но мне не дает покоя избыточность конструкции.
Задействовать CommandHandler кнопки в данном случае не имеет смысла - городить целый класс для вызова одной функции автокада.
И к тому же, при таком создании кнопки, она не появляется в списке команд (Панель быстрого доступа->Другие команды).

Существует такой замечательный класс кнопок как RibbonCommandButton. Он содержит текстовый параметр Macro - макрос, который как раз будет запущен при нажатии кнопки.
Но он хочет при создании передать себе в конструктор параметр - ссылку на родителя, да при чем такого, который обитает в пространстве имен Autodesk.AutoCAD.Customization. И как это все связать с панелью быстрого доступа, которая на самом деле еще и не панель, а ToolBar, непонятно.
Будьте любезны, подскажите в каком направлении копать.
Бензопила пилит тело, а виолончель душу.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Все работает. Но мне не дает покоя избыточность конструкции.
Оно может и выглядит избыточно, но именно так и работает. Так что копать ничего не нужно.
Полноценный пример здесь:
Adding to AutoCADs Application Menu and Quick Access Toolbar
Autodesk.AutoCAD.Customization
Это вообще из другой оперы - это работа с CUIX-файлом, а не динамическое добавление кнопки на QuickAccessToolBar.


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 2
Так что копать ничего не нужно
Про то, что все работает беру свои слова назад. Так что чуток копнуть все же нужно.
Спасибо за полноценный пример, но он имеет те же недостатки, что и в моем случае.
это работа с CUIX-файлом, а не динамическое добавление кнопки на QuickAccessToolBar
Возможно я не до конца понимаю как все устроено, но мне кажется добавление кнопки на QuickAccessToolBar это и есть работа с cuix-файлом.

Еще раз что я имею и что мне в этом не нравится.
Вот код, создающий работоспособную кнопку на панели:
Код - C# [Выбрать]
  1. Autodesk.Windows.ToolBars.QuickAccessToolBarSource QuickPanel = Autodesk.Windows.ComponentManager.QuickAccessToolBar;
  2. //Autodesk.AutoCAD.Ribbon.RibbonCommandButton CreatedButton = (Autodesk.AutoCAD.Ribbon.RibbonCommandButton)QuickPanel.Items[12]; Заранее известен номер кнопки, созданной через интерфейс автокада
  3.  
  4. string MacroGroupName = "ELECTRICALMacros";//"User";
  5. MacroGroup SomeMacGroup = null;
  6. if (!cs.MenuGroup.MacroGroups.Contains(MacroGroupName))
  7.     SomeMacGroup = new MacroGroup(MacroGroupName, cs.MenuGroup);
  8. else
  9.     SomeMacGroup = cs.MenuGroup.MacroGroups.Cast<MacroGroup>().Single(s => s.Name.Equals(MacroGroupName));
  10.  
  11. string MacroName = "XXX Some Tag";
  12. MenuMacro SomeMenuMacro = null;
  13. if (SomeMacGroup.MenuMacros.IndexOf(MacroName) >= 0)
  14.     SomeMenuMacro =SomeMacGroup.MenuMacros[SomeMacGroup.MenuMacros.IndexOf(MacroName)];
  15. else
  16.     SomeMenuMacro = SomeMacGroup.CreateMenuMacro(
  17.         "XXX SomeName",
  18.         "^C^C_Line ",
  19.         MacroName,
  20.         "XXX Some help",
  21.         MacroType.Legacy,
  22.         "RCDATA_16_ARX",
  23.         "RCDATA_16_ARX",
  24.         "XXX Some Label");
  25.  
  26.  
  27. Autodesk.AutoCAD.Ribbon.RibbonCommandButton RRCbutton = new Autodesk.AutoCAD.Ribbon.RibbonCommandButton(SomeMenuMacro.macro.Name, SomeMenuMacro.ElementID);
  28.  
  29. RRCbutton.Id = "FastReplicationButton";
  30. RRCbutton.Name = "FastReplication";
  31. RRCbutton.Text = "FastReplication";
  32. RRCbutton.Description = "Package creation dwg";
  33. RRCbutton.MenuMacroId = MacroName;
  34.  
  35. //RRCbutton.CommandParameter = "FastReplication";
  36. //RRCbutton.CommandHandler = new QuickButtonCommandHandler();
  37.  
  38. System.Windows.Media.Imaging.BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
  39.                                                                 Properties.Resources.Fr.GetHbitmap(),
  40.                                                                 IntPtr.Zero,
  41.                                                                 System.Windows.Int32Rect.Empty,
  42.                                                                 System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
  43. RRCbutton.Image = bs;
  44.  
  45. QuickPanel.AddStandardItem(RRCbutton);
Но этой кнопки нет на самом деле. Нет ни в cuix-файлах, нигде. И если после добавления этой кнопки добавить на панель еще какой-нибудь разделитель, то кнопка исчезнет.


Если же использовать методы пространства имен из Customization, то кнопка добавляется в cuix-файл:
Извините, вам запрещён просмотр содержимого спойлеров.

Код - C# [Выбрать]
  1. CustomizationSection cs = new CustomizationSection((string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("MENUNAME"));
  2. var QuickAccessToolbar = cs.MenuGroup.QuickAccessToolbars[0];
  3.  
  4. string MacroGroupName = "ELECTRICALMacros";//"User";
  5. MacroGroup SomeMacGroup = null;
  6. if (!cs.MenuGroup.MacroGroups.Contains(MacroGroupName))
  7.     SomeMacGroup = new MacroGroup(MacroGroupName, cs.MenuGroup);
  8. else
  9.     SomeMacGroup = cs.MenuGroup.MacroGroups.Cast<MacroGroup>().Single(s => s.Name.Equals(MacroGroupName));
  10.  
  11. string MacroName = "XXX Some Tag";
  12. MenuMacro SomeMenuMacro = null;
  13. if (SomeMacGroup.MenuMacros.IndexOf(MacroName) >= 0)
  14.     SomeMenuMacro =SomeMacGroup.MenuMacros[SomeMacGroup.MenuMacros.IndexOf(MacroName)];
  15. else
  16.     SomeMenuMacro = SomeMacGroup.CreateMenuMacro(
  17.         "XXX SomeName",
  18.         "^C^C_Line ",
  19.         MacroName,
  20.         "XXX Some help",
  21.         MacroType.Legacy,
  22.         "RCDATA_16_ARX",
  23.         "RCDATA_16_ARX",
  24.         "XXX Some Label");
  25.  
  26.  
  27. //RibbonRow row = new RibbonRow();
  28. RibbonCommandButton rcb = new RibbonCommandButton(QuickAccessToolbar); //(row);
  29. rcb.Id = "XXXID";
  30. rcb.ElementID = "XXXElId";
  31. rcb.Text = "XXXButton";
  32. rcb.KeyTip = "XXX key tip";
  33. rcb.TooltipTitle = "XXX Tooltip";
  34. rcb.ButtonStyle = RibbonButtonStyle.SmallWithoutText;
  35. rcb.MacroID = SomeMenuMacro.ElementID;
  36. rcb.GroupName = MacroGroupName;
  37. string fn = rcb.CustomizationSection.CUIFileName;
  38. //row.Items.Add(rcb);
  39. QuickAccessToolbar.RibbonItems.Add(rcb);//(row);
  40. cs.Save();
Но такая кнопка не появляется на панели:


И если в первом случае происходит работа с Autodesk.Windows.ComponentManager.QuickAccessToolBar, то во втором с Autodesk.AutoCAD.Customization.MenuGroup.ItemsCollection.QuickAccessToobars, и кажется что первое это отображение второго, и при добавлении кнопки во второе не хватает какого-то обновления панелей или всего отображения.


Вопрос остается прежним: как сделать нормальную кнопку в панели быстрого доступа?

Бензопила пилит тело, а виолончель душу.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Возможно я не до конца понимаю как все устроено, но мне кажется добавление кнопки на QuickAccessToolBar это и есть работа с cuix-файлом.
Нет. Есть динамическое создание кнопок, панелей и т.д. (пространство имён Autodesk.Windows), а есть работа с cuix-файлом (пространство имён Autodesk.AutoCAD.Customization). Причем cuix-файл (т.е. CustomizationSection) следует сохранить и потом загрузить в AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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