Две тогл кнопки

Автор Тема: Две тогл кнопки  (Прочитано 4094 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Две тогл кнопки
« : 09-11-2019, 22:32:38 »
Кто-нибудь знает как реализовать работу двух RibbonToggleButtons? Задача заключается в том, что при нажатии на любую кнопку выделение с другой кнопки убирается. Я пробовал и через .CommandHandler и через .CheckStateChanged.

Вот такая конструкция работает частично - при повторном нажатии по кнопке она оставляет её активной, но если я нажимаю на неактивную кнопку, то с соседней кнопки выделение не снимается. Такое ощущение, что вторую кнопку не видно.

Код - C# [Выбрать]
  1. public class CommandHandler_lxRibbonButton_Single : ICommand
  2. {
  3.   public event EventHandler CanExecuteChanged;
  4.  
  5.   public void Execute(object parameter)
  6.   {
  7.     RibbonToggleButton lxRibbonButton_Single = parameter as RibbonToggleButton;
  8.     if (lxRibbonButton_Single.IsChecked == false)
  9.    {
  10.       Initialization lxIni = new Initialization();
  11.       lxIni.lxDocument.SetLispSymbol("lmxTypeMark", "Single");
  12.       lxRibbonButton_Single.IsChecked = true;
  13.       lxIni.lxRibbonButton_Double.IsChecked = false;
  14.     }
  15.     else
  16.     {
  17.       lxIni.lxDocument.SetLispSymbol("lmxTypeMark", "Single");
  18.       lxRibbonButton_Single.IsChecked = true;
  19.     }
  20.   }
  21.  
  22.   public bool CanExecute(object parameter)
  23.   {
  24.     return true;
  25.   }
  26. }

И кто может объяснить откуда берётся свойство .CommandHandler? В Object Browser пишет, что оно наследуется от ICommand, если я правильно понял описание, но в хелпе по C# ничего нет. Так же нет описания в хелпе AutoCAD ни в разделе "RibbonCommandItem" ни в "RibbonToggleButton".

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Две тогл кнопки
« Ответ #1 : 09-11-2019, 22:54:49 »
Lemieux,
Что-то я логики в этом коде не увидел. Если lxRibbonButton_Single.IsChecked == true; ты его снова устанавливаешь в true.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Две тогл кнопки
« Ответ #2 : 09-11-2019, 23:04:42 »
Initialization lxIni = new Initialization();
      lxIni.lxDocument.SetLispSymbol("lmxTypeMark", "Single");
Всё верно, это сделано для того, что бы при повторном нажатии, если кнопка активна, выделение не снималось. Ведь если щёлкать по тогл кнопке, то она будет просто включаться и выключаться.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Две тогл кнопки
« Ответ #3 : 09-11-2019, 23:19:12 »
А это что:
Код - C# [Выбрать]
  1. lxIni.lxRibbonButton_Double.IsChecked = false;
?
Ты должен найти реальный lxRibbonButton_Double и ему поменять свойство IsChecked.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Две тогл кнопки
« Ответ #4 : 09-11-2019, 23:27:28 »
А это что:
Код - C# [Выбрать]
  1. lxIni.lxRibbonButton_Double.IsChecked = false;
?
Ты должен найти реальный lxRibbonButton_Double и ему поменять свойство IsChecked.

Это указывает на то, что если первая кнопка не активна (lxRibbonButton_Single), то она становится активной, а вторая кнопка (lxRibbonButton_Double) становится не активной. Вот как раз на эту строчку AutoCAD не реагирует.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Две тогл кнопки
« Ответ #5 : 09-11-2019, 23:30:15 »
Вот как раз на эту строчку AutoCAD не реагирует.
А с какой стати он должен реагировать? Вообще это не код, а какой-то обрывок кода. Если нужна помощь - создавай тестовый проект (без ничего лишнего) и выкладывай его сюда.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Lemieux 10-11-2019, 09:40:57

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Две тогл кнопки
« Ответ #6 : 10-11-2019, 00:45:13 »
Сделал тестовый пример:

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.Windows;
  8.  
  9. // This line is not mandatory, but improves loading performances
  10. [assembly: CommandClass(typeof(RibbonToggleButtonsTest.MyCommands))]
  11.  
  12. namespace RibbonToggleButtonsTest
  13. {
  14.  
  15.   public class MyCommands
  16.   {
  17.     [CommandMethod("AddTab", CommandFlags.Modal)]
  18.     public void AddTab()
  19.     {
  20.       Document doc = Application.DocumentManager.MdiActiveDocument;
  21.       if (doc == null) return;
  22.       Editor ed = doc.Editor;
  23.       RibbonControl ribbonControl
  24.           = ComponentManager.Ribbon;
  25.       if (ribbonControl.FindTab("ID_TestRibbonTab") != null)
  26.         return;
  27.  
  28.       RibbonTab tab = new RibbonTab();
  29.       tab.Title = "Test Ribbon";
  30.       tab.Id = "ID_TestRibbonTab";
  31.       ribbonControl.Tabs.Add(tab);
  32.       RibbonPanelSource srcPanel
  33.           = new RibbonPanelSource();
  34.  
  35.       srcPanel.Title = "Panel1";
  36.       srcPanel.Id = "ID_SrcPanel";
  37.       RibbonPanel panel = new RibbonPanel();
  38.       panel.Source = srcPanel;
  39.       RibbonToggleButton button1 = new RibbonToggleButton
  40.       {
  41.         Text = "Button 1",
  42.         Id = "id_button1",
  43.         ShowText = true,
  44.         IsChecked = true,
  45.         CommandParameter = "",
  46.         CommandHandler = new ToggleButtonCmdHandler1()
  47.       };
  48.  
  49.       srcPanel.Items.Add(button1);
  50.  
  51.       RibbonToggleButton button2 = new RibbonToggleButton
  52.       {
  53.         Text = "Button 2",
  54.         Id = "id_button2",
  55.         ShowText = true,
  56.         IsChecked = false,
  57.         CommandParameter = "",
  58.         CommandHandler = new ToggleButtonCmdHandler2()
  59.       };
  60.  
  61.       srcPanel.Items.Add(button2);
  62.       tab.Panels.Add(panel);
  63.       tab.IsActive = true;
  64.     }
  65.   }
  66.   public class ToggleButtonCmdHandler1 : System.Windows.Input.ICommand
  67.   {
  68.     public bool CanExecute(object parameter)
  69.     {
  70.       return true;
  71.     }
  72.     public event EventHandler CanExecuteChanged;
  73.     public void Execute(object parameter)
  74.     {
  75.  
  76.       RibbonToggleButton button1 = parameter as RibbonToggleButton;
  77.       RibbonControl ribbonControl = ComponentManager.Ribbon;
  78.       RibbonToggleButton button2 = ribbonControl.FindItem("id_button2", true) as RibbonToggleButton;
  79.       if (button2 != null)
  80.       {
  81.         button2.IsChecked = !button1.IsChecked;
  82.       }
  83.     }
  84.   }
  85.   public class ToggleButtonCmdHandler2 : System.Windows.Input.ICommand
  86.   {
  87.     public bool CanExecute(object parameter)
  88.     {
  89.       return true;
  90.     }
  91.     public event EventHandler CanExecuteChanged;
  92.     public void Execute(object parameter)
  93.     {
  94.  
  95.       RibbonToggleButton button2 = parameter as RibbonToggleButton;
  96.       RibbonControl ribbonControl = ComponentManager.Ribbon;
  97.       RibbonToggleButton button1 = ribbonControl.FindItem("id_button1", true) as RibbonToggleButton;
  98.       if (button1 != null)
  99.       {
  100.         button1.IsChecked = !button2.IsChecked;
  101.       }
  102.     }
  103.   }
  104. }

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

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Две тогл кнопки
« Ответ #7 : 10-11-2019, 09:45:34 »
Спасибо Александр, Вы правильно поняли, что я хочу. И я понял свою ошибку - надо было получать доступ к кнопкам через .FindItem.

А Вы не знаете ответа на вторую часть моего вопроса?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Две тогл кнопки
« Ответ #8 : 10-11-2019, 14:11:35 »
В Object Browser пишет, что оно наследуется от ICommand, если я правильно понял описание, но в хелпе по C# ничего нет. Так же нет описания в хелпе AutoCAD ни в разделе "RibbonCommandItem" ни в "RibbonToggleButton".
И не должно быть, т.к. интерфейс ICommand не Autodesk'овский, а Microsoft'овский: https://docs.microsoft.com/en-us/dotnet/api/system.windows.input.icommand
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Две тогл кнопки
« Ответ #9 : 11-11-2019, 20:50:53 »
Александр Ривилис, а Вы не знаете как можно обойти критическую ошибку при загрузке lisp файла, который помещён в раздел "Lisp" надстройки CUI? AutoCAD вылетает на моменте когда инициализирует окружение "Ribbon".

В lisp файле есть строка, которая грузит .dll с созданием закладки и я думаю, что в этом вся проблема. Загружать lisp файл через создание файла acad.lsp не очень бы хотелось, так как я хотел бы сделать отдельный профиль (main cui), который бы, при загрузке AutoCAD, загружал бы нужные мне скрипты.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Две тогл кнопки
« Ответ #10 : 11-11-2019, 20:57:11 »
AutoCAD вылетает на моменте когда инициализирует окружение "Ribbon".
Думаю, что ты не контролируешь факт того, что Ribbon еще не инициализирован.
Посмотри эту тему: https://adn-cis.org/forum/index.php?topic=429.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Re: Две тогл кнопки
« Ответ #11 : 11-11-2019, 21:12:21 »
AutoCAD вылетает на моменте когда инициализирует окружение "Ribbon".
Думаю, что ты не контролируешь факт того, что Ribbon еще не инициализирован.
Посмотри эту тему: https://adn-cis.org/forum/index.php?topic=429.0
Круто, спасибо!  :)