Как сохранить программно созданную ленту в файл *.cuix?

Автор Тема: Как сохранить программно созданную ленту в файл *.cuix?  (Прочитано 5430 раз)

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

Оффлайн Андрей НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 2
  • Энтузиаст-одиночка
Добрый день!
Для своего плагина создал ленту (ribbon) программным способом, который уже неоднократно описывался, например,  вот здесь: https://adn-cis.org/forum/index.php?topic=8214.0
Теперь есть необходимость сохранить её в файл cuix, как это сделать?
Библиотеки для создания ленты (acwindows.dll, adwindows.dll) и для работы с cuix файлами (accui.dll) разные, лента, созданная программно, в окне адаптации интерфейса нигде не появляется. Как её сохранить в файл частичной адаптации?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Как её сохранить в файл частичной адаптации?
Никак. Только через использование Autodesk.AutoCAD.Customization. Всё что делается через acwindows.dll, adwindows.dll - никак не может быть связано с cui(x).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 2
  • Энтузиаст-одиночка
Спасибо!
Тем не менее, это очень странно. Ведь обратный путь есть - я вижу вкладки ленты, загруженные через основной и частичный cuix-ы.
Тогда может быть, какой нибудь кривоватый путь попробовать - типа выгрузить RibbonPanelSource в xml и попробовать вручную запихать в RibbonRoot.cui моего файла частичной адаптации? Как вообще рекомендуется создавать cuix файлы? Только через окно адаптации интерфейса? Или в accui.dll есть способ создать свой собственный RibbonPanelSource (не считывая готовый из файла)?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Как вообще рекомендуется создавать cuix файлы? Только через окно адаптации интерфейса?
Да.
Или в accui.dll есть способ создать свой собственный RibbonPanelSource (не считывая готовый из файла)?
Есть и такая возможность. И есть примеры в интернете. Например: https://spiderinnet1.typepad.com/blog/2012/05/autocad-cui-ribbon-net-create-ribbon-tab-and-panel.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 2
  • Энтузиаст-одиночка
Спасибо, пошёл изучать пример. Очень не хочется делать двойную работу (через окно интерфейса делать ленту повторно). Обязательно отпишусь, что получилось.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Тем не менее, это очень странно. Ведь обратный путь есть - я вижу вкладки ленты, загруженные через основной и частичный cuix-ы.
Связь односторонняя. Фактически AutoCAD на основе cui(x) формирует Ленту (Ribbon). Ну и не только. Menu/Toolbar и т.д. Но обратной связи нет. Когда-то до AutoCAD 2006 была обратная связь для меню (т.е. можно было сохранить созданное на лету меню в mnu/mns-файл) , но потом ее убрали. Видимо слишком она была сложной, а потом появилась еще и Лента и это еще на порядок усложнило ситуацию.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 2
  • Энтузиаст-одиночка
Добрый день!

Наконец-то разобрался с лентой, делюсь своими соображениями на эту тему.

Во-первых, о том, что мне необходимо было получить. У меня есть готовый работающий плагин (>70 команд), работоспособный и на AutoCAD и на платформе nanoCAD. До этого у плагина была была система выпадающего меню, в AutoCAD написанная в файле *.MNS, а для в nanoCAD - в файле *.CFG. Было необходимо создать в дополнение к меню ленту, работоспособную и на той и на другой платформе. nanoCAD понимает описание ленты, созданное в AutoCAD и задача сводилась к созданию файла *.CUIX, в которой было бы описание ленты.

Я изначально не хотел создавать ленту с помощью окна настройки интерфейса, то есть хотел создать ленту программно. Причины этого я не буду описывать, но изначально условие было именно таким. В nanoCAD нет программного механизма создания ленты, соответственно, ленту я собирался создавать с помощью библиотек AutoCAD.

И вот тут я допустил ошибку. Я набрал запрос "создание ленты в AutoCAD", прошел по ссылкам, которые я приводил выше и создал ленту с помощью библиотек классов Autodesk.Windows и Autodesk.AutoCAD.Ribbon. Как потом выяснилось, созданная таким способом лента не может быть сохранена в *.CUIX файл, и вообще, окно настройки интерфейса не видит такую ленту, то есть пользователь не может ее настроить, выключить и вообще ничего не может с ней сделать, только пользоваться. Это было ударом... Вся проделанная работа была бесполезной.

Если перед вами стоит задача создания, именно создания ленты, я бы не рекомендовал вам делать это с помощью библиотек классов Autodesk.Windows и Autodesk.AutoCAD.Ribbon, они созданы для манипуляции на лету уже имеющимися составными частями ленты, например, я могу предположить, что с их помощью можно реализовать примерно такой трюк - при выделении каких-нибудь "интеллектуальных" объектов создавать на лету и делать активной панель с командами редактирования этих объектов.

В итоге, я занялся созданием ленты с помощью библиотеки классов Autodesk.AutoCAD.Customization фактически с нуля. Логика там у меня была такая - создать первоначальный *.CUIX файл с помощью окна настройки интерфейсов (подгрузка файла *.MNS). Затем чтение получившегося файла *.CUIX, создание своей закладки, панелей на ней, команд на панелях и сохранение этого файла *.CUIX. Этот же файл используется и в nanoCAD. В итого, в этот раз получилось все как надо.

Оффлайн Андрей НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 2
  • Энтузиаст-одиночка
Вот как выглядит мой код для создания одной закладки и одной панели в ней с тремя кнопками.
Код - C# [Выбрать]
  1.             // читаем файл частичной адаптации
  2.             CustomizationSection csPartial = new CustomizationSection("SurveyTools.CUIX");
  3.             // получаем ленту, описанную в нем. В нашем случае она пустая
  4.             RibbonRoot ribbonRoot = csPartial.MenuGroup.RibbonRoot;
  5.             // коллекция панелей для CUIX файла
  6.             Autodesk.AutoCAD.Customization.RibbonTabSourceCollection tabCollection = ribbonRoot.RibbonTabSources;
  7.             Autodesk.AutoCAD.Customization.RibbonPanelSourceCollection panelCollection = ribbonRoot.RibbonPanelSources;
  8.  
  9.             // создаем источник данных для нашей закладки - она у нас одна будет
  10.             RibbonTabSource rtsSurveyTools = new RibbonTabSource(ribbonRoot);
  11.             rtsSurveyTools.Name = "SurveyTools";
  12.             rtsSurveyTools.Text = "SurveyTools";
  13.             rtsSurveyTools.Id = "SurveyTools_ID";
  14.             rtsSurveyTools.ElementID = "SurveyTools_ID";
  15.  
  16.             // создаем источник данных для панели
  17.             Autodesk.AutoCAD.Customization.RibbonPanelSource rpsInfo = new Autodesk.AutoCAD.Customization.RibbonPanelSource(ribbonRoot);
  18.             rpsInfo.Name = rpsInfo.Text = "Информация";
  19.             rpsInfo.Id = rpsInfo.ElementID = "ID_SurveyTools_RibbonPanel_Info";
  20.  
  21.             // строка для кнопок
  22.             Autodesk.AutoCAD.Customization.RibbonRow rrInfo1 = new RibbonRow(rpsInfo);
  23.  
  24.             // кнопка ID_SurveyTools_RequestLicenseKey
  25.             Autodesk.AutoCAD.Customization.RibbonCommandButton rcbRequestLicenseKey = new Autodesk.AutoCAD.Customization.RibbonCommandButton(rrInfo1);
  26.             rcbRequestLicenseKey.Text = "Ключ\rлицензии";
  27.             rcbRequestLicenseKey.ButtonStyle = RibbonButtonStyle.LargeWithText;
  28.             rcbRequestLicenseKey.MacroID = "ID_SurveyTools_RequestLicenseKey";
  29.             rcbRequestLicenseKey.TooltipTitle = "Запрос ключа лицензии";
  30.  
  31.             // панель для маленьких кнопок
  32.             Autodesk.AutoCAD.Customization.RibbonRowPanel rrpInfo1 = new Autodesk.AutoCAD.Customization.RibbonRowPanel(rrInfo1);
  33.            
  34.             // строка для маленьких кнопок
  35.             Autodesk.AutoCAD.Customization.RibbonRow rrInfo2 = new RibbonRow(rrpInfo1);
  36.  
  37.             // кнопка ID_SurveyTools_Help
  38.             Autodesk.AutoCAD.Customization.RibbonCommandButton rcbHelp = new Autodesk.AutoCAD.Customization.RibbonCommandButton(rrInfo2);
  39.             rcbHelp.Text = "Справочная информация";
  40.             rcbHelp.ButtonStyle = RibbonButtonStyle.SmallWithoutText;
  41.             rcbHelp.MacroID = "ID_SurveyTools_Help";
  42.             rcbHelp.TooltipTitle = "Справочная информация";
  43.  
  44.             // строка для маленьких кнопок
  45.             Autodesk.AutoCAD.Customization.RibbonRow rrInfo3 = new RibbonRow(rrpInfo1);
  46.  
  47.             // кнопка ID_SurveyTools_AssemblyInfo
  48.             Autodesk.AutoCAD.Customization.RibbonCommandButton rcbAssemblyInfo = new Autodesk.AutoCAD.Customization.RibbonCommandButton(rrInfo3);
  49.             rcbAssemblyInfo.Text = "О программе...";
  50.             rcbAssemblyInfo.ButtonStyle = RibbonButtonStyle.SmallWithoutText;
  51.             rcbAssemblyInfo.MacroID = "ID_SurveyTools_AssemblyInfo";
  52.             rcbAssemblyInfo.TooltipTitle = "О программе...";
  53.  
  54.             // вставляем в строку для кнопок кнопку ID_SurveyTools_RequestLicenseKey
  55.             rrInfo1.Items.Add(rcbRequestLicenseKey);
  56.             rrInfo3.Items.Add(rcbAssemblyInfo);
  57.             rrInfo2.Items.Add(rcbHelp);
  58.             rrpInfo1.Items.Add(rrInfo2);
  59.             rrpInfo1.Items.Add(rrInfo3);
  60.             rrInfo1.Items.Add(rrpInfo1);
  61.  
  62.             // вставляем в источник данных для панели строку (которая уже содержит кнопку)
  63.             rpsInfo.Items.Add(rrInfo1);
  64.  
  65.             // добавляем в коллекцию панелей наши созданные панели
  66.             panelCollection.Add(rpsInfo);
  67.  
  68.             // создаем ссылку для панели Info
  69.             RibbonPanelSourceReference rpsRefInfo = new RibbonPanelSourceReference(rtsSurveyTools);
  70.             rpsRefInfo.PanelId = rpsInfo.ElementID;
  71.             // добавляем эту ссылку в список элементов закладки
  72.             rtsSurveyTools.Items.Add(rpsRefInfo);
  73.  
  74.             tabCollection.Insert(0, rtsSurveyTools);
  75.  
  76.             csPartial.Save();
  77.  

Оффлайн Андрей НикифоровАвтор темы

  • ADN OPEN
  • Сообщений: 6
  • Карма: 2
  • Энтузиаст-одиночка
А вот как выглядит эта закладка и панель на экране:



Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Вот как выглядит мой код для создания одной закладки и одной панели в ней с тремя кнопками.
Отличная работа! Спасибо!