Господа, разбираюсь с темой добавления собственной кнопки в интерфейс автокада.
Если с полнофункциональным созданием своей панели с кучей кнопок и прочего все понятно (пример
здесь), то с добавлением кнопки побыстрому возникли вопросики.
А именно интересно добавление кнопки в панель быстрого доступа.
Добавляю так:
public class PackageCreation : IExtensionApplication
{
[CommandMethod("SomeCommand", CommandFlags.Session)] // RButton.CommandParameter
public void Test()
{
SomeWindow SomeForm = new SomeWindow();
Autodesk.AutoCAD.ApplicationServices.Application.ShowModalWindow(SomeForm);
}
public void Initialize()
{
Autodesk.Windows.ToolBars.QuickAccessToolBarSource QuickPanel = Autodesk.Windows.ComponentManager.QuickAccessToolBar; // Панель быстрого доступа
Autodesk.Windows.RibbonButton RButton = new Autodesk.Windows.RibbonButton();
RButton.Name = "SomeNameButton";
RButton.Description = "Some Description";
RButton.Id = "SomeId";
RButton.Text = "SomeText";
RButton.CommandParameter = "SomeCommand";
RButton.CommandHandler = new QuickButtonCommandHandler();
System.Windows.Media.Imaging.BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
Properties.Resources.SomePng.GetHbitmap(), // Картинка в ресурсах проекта
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
RButton.Image = bs;
if (!QuickPanel.Items.Select(s => s.Name).Contains(RButton.Name))
QuickPanel.AddStandardItem(RButton);
}
public void Terminate()
{}
public class QuickButtonCommandHandler : System.Windows.Input.ICommand
{
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
var Btn = parameter as Autodesk.Windows.RibbonButton;
if (Btn != null)
{
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute(Btn.CommandParameter + " ", true, false, false);
}
}
}
}
Все работает. Но мне не дает покоя избыточность конструкции.
Задействовать
CommandHandler кнопки в данном случае не имеет смысла - городить целый класс для вызова одной функции автокада.
И к тому же, при таком создании кнопки, она не появляется в списке команд (Панель быстрого доступа->Другие команды).
Существует такой замечательный класс кнопок как
RibbonCommandButton. Он содержит текстовый параметр
Macro - макрос, который как раз будет запущен при нажатии кнопки.
Но он хочет при создании передать себе в конструктор параметр - ссылку на родителя, да при чем такого, который обитает в пространстве имен
Autodesk.AutoCAD.Customization. И как это все связать с панелью быстрого доступа, которая на самом деле еще и не панель, а ToolBar, непонятно.
Будьте любезны, подскажите в каком направлении копать.