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

ADN Club => AutoCAD .NET API => Тема начата: SatanaXIII от 13-11-2018, 11:50:42

Название: Добавление кнопки в панель быстрого доступа Autocad Electrical
Отправлено: SatanaXIII от 13-11-2018, 11:50:42
Господа, разбираюсь с темой добавления собственной кнопки в интерфейс автокада.
Если с полнофункциональным созданием своей панели с кучей кнопок и прочего все понятно (пример здесь (https://habr.com/post/263373/)), то с добавлением кнопки побыстрому возникли вопросики.
А именно интересно добавление кнопки в панель быстрого доступа.
Добавляю так:
Код - 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, непонятно.
Будьте любезны, подскажите в каком направлении копать.
Название: Re: Добавление кнопки в панель быстрого доступа Autocad Electrical
Отправлено: Александр Ривилис от 13-11-2018, 11:59:43
Все работает. Но мне не дает покоя избыточность конструкции.
Оно может и выглядит избыточно, но именно так и работает. Так что копать ничего не нужно.
Полноценный пример здесь:
Adding to AutoCADs Application Menu and Quick Access Toolbar (http://keanw.com/2010/04/adding-to-autocads-application-menu-and-quick-access-toolbar-using-net.html)
Autodesk.AutoCAD.Customization
Это вообще из другой оперы - это работа с CUIX-файлом, а не динамическое добавление кнопки на QuickAccessToolBar.


Название: Re: Добавление кнопки в панель быстрого доступа Autocad Electrical
Отправлено: SatanaXIII от 15-11-2018, 14:49:37
Так что копать ничего не нужно
Про то, что все работает беру свои слова назад. Так что чуток копнуть все же нужно.
Спасибо за полноценный пример, но он имеет те же недостатки, что и в моем случае.
это работа с 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-файлах, нигде. И если после добавления этой кнопки добавить на панель еще какой-нибудь разделитель, то кнопка исчезнет.
(https://i.postimg.cc/w7ymc4Z0/Auto-CAD-Quick-Tool-Visible-Button.png) (https://postimg.cc/w7ymc4Z0)

Если же использовать методы пространства имен из 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();
Но такая кнопка не появляется на панели:
(https://i.postimg.cc/5jkzzW7X/Auto-CAD-Quick-Tool-Not-Visible-Button.png) (https://postimg.cc/5jkzzW7X)

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


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

Название: Re: Добавление кнопки в панель быстрого доступа Autocad Electrical
Отправлено: Александр Ривилис от 15-11-2018, 15:27:06
Возможно я не до конца понимаю как все устроено, но мне кажется добавление кнопки на QuickAccessToolBar это и есть работа с cuix-файлом.
Нет. Есть динамическое создание кнопок, панелей и т.д. (пространство имён Autodesk.Windows), а есть работа с cuix-файлом (пространство имён Autodesk.AutoCAD.Customization). Причем cuix-файл (т.е. CustomizationSection) следует сохранить и потом загрузить в AutoCAD.
Название: Re: Добавление кнопки в панель быстрого доступа Autocad Electrical
Отправлено: Александр Ривилис от 15-11-2018, 15:27:55
Но такая кнопка не появляется на панели:
И не появится, пока ты не перезагрузишь меню. Например, Application.LoadPartialMenu или Application.ReloadAllMenus