Как скрыть все элементы уже выгруженных меню?

Автор Тема: Как скрыть все элементы уже выгруженных меню?  (Прочитано 9859 раз)

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
AutoCAD 2009 x64 SP3 Enu.

Через COM API в итерации по всем элементам, хранящимся в MenuGroups вызываю для каждого из них экземплярный метод MenuGroup.Unload(), тем самым выгружая все файлы меню,  подгруженные в AutoCAD (в т.ч. и основной). После этой операции ожидаю, что все элементы, определённые в составе выгруженных файлов меню, автоматически исчезнут с экрана. Однако по факту исчезает не всё (см. скрины во вложении)...

Чтобы получить ожидаемый результат, я делаю принудительную перерисовку основного окна приложения, посредством вызова соответствующей функции WinAPI:

Код - C# [Выбрать]
  1. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  2. ...
  3. [DllImport("user32.dll")]
  4. public static extern bool UpdateWindow(IntPtr hWnd);
  5. ...
  6. UpdateWindow(cad.MainWindow.Handle); // I do it after unloading all MenuGroup items.

Однако это не помогает. Похоже, что метод MenuGroup.Unload() не выгружает из памяти риббоны выгружаемого меню... На мой взгляд, это неправильно. Я хочу, чтобы по выгрузке всех меню, соответственно и все их элементы исчезли с экрана (т.е. получить результат, идентичный тому, который показан на третьем скрине). Как этого добиться?
« Последнее редактирование: 01-07-2016, 13:43:44 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Если даже добавить код, принудительно выгружающий панели риббонов, то результат всё равно не до конца соответствует ожидаемому (см. скрин во вложении):

Код - C# [Выбрать]
  1. int count = Autodesk.AutoCAD.Ribbon.RibbonServices
  2.     .RibbonPaletteSet.Count;
  3.  
  4. for (int i = 0; i < count; i++) {
  5.     Autodesk.AutoCAD.Ribbon.RibbonServices
  6.         .RibbonPaletteSet.Remove(i);
  7. }
А ежели попытаться выполнить Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSet.Close(), то и вовсе вылезет Fatall Error.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Если просто изменить видимость, то риббоны исчезнут, но "левый" Toolbar, появившийся после выгрузки всех меню и обрезанный вариант менюшки по прежнему остаётся (см. скрин во вложении):
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSet.Visible = false;

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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю, что это тупиковый путь по нескольким причинам:
1. AutoCAD 2009 - это первая версия AutoCAD, в которой появилась Лента. После того менялось и API работы с Лентой и исправлялись какие-то ошибки...
2. AutoCAD не предназначен для работы вообще без меню и без Ленты (имеется в виду какое-либо загруженное cui/cuix-меню).
Кроме того я не могу понять зачем это вообще нужно. Просто для удовлетворения эстетического чувства? :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Кроме того я не могу понять зачем это вообще нужно. Просто для удовлетворения эстетического чувства? :)
Нет. Просто я опасаюсь, чтобы выгрузка одних меню и загрузка вместо них других, не оставляла после выгруженных меню подобного рода артефактов, оставшихся от уже выгруженного меню.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В противном случае нет возможности открыть чертеж, получить доступ к командной строке, загрузить меню, выполнить проверку и/или восстановление чертежа и т.д.
Это, конечно же, не так. Доступ к командной строке имеется в полном объёме, Открыть чертёж через командную строку по прежнему можно. Загрузить меню или выполнить проверку чертежа так же по прежнему можно. В т.ч. и после перезапуска автокада.

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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Считай, что то, что остаются несколько пунктов в MenuBar даже когда cui/cuix-файлы выгружены - это классическое поведение AutoCAD. Так было начиная как минимум с AutoCAD 2000 и вряд ли будет меняться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Считай, что то, что остаются несколько пунктов в MenuBar даже когда cui/cuix-файлы выгружены - это классическое поведение AutoCAD. Так было начиная как минимум с AutoCAD 2000 и вряд ли будет меняться.
Меня более беспокоит наличие "висячих" палитр риббонов. Если выполняется выгрузка всех меню, то простой итерацией программно можно удалить и все без разбора риббоны, как я показал в коде выше. Однако, если выгружаются выборочные меню (т.е. не всё подряд), то и риббоны программно следовало бы удалять только те, которые были определены в составе подлежащих выгрузке меню. Как в подобном случае идентифицировать принадлежность риббона тому или иному меню, дабы не удалить лишнего?

В AutoCAD 2009 я вызываю регенерацию воркспейса, дабы риббоны выгруженных меню исчезли (туллбары исчезают и без этого). Однако сама вкладка выгруженных риббонов остаётся живой (хотя и пустой). Исчезает только после перезагрузки акада. В новых версиях акада такой проблемы нет.


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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Как в подобном случае идентифицировать принадлежность риббона тому или иному меню, дабы не удалить лишнего?
Думаю, что это невозможно, так как они могут вообще создаваться динамически и никак с меню (cui/cuix) не быть связаны.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Думаю, что это невозможно, так как они могут вообще создаваться динамически и никак с меню (cui/cuix) не быть связаны.
Я надеялся, что существует некий маркер, по которому это можно было бы определить для тех элементов, которые создавались на основе меню.

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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Маркера как такового нет. Но вот здесь есть интересный момент: http://adn-cis.org/modifikacziya-lentyi.html
RibbonControl.FindTab ищет по полному имени, в котором присутствует имя MenuGroup.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13891
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот как-то так:

Код - 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.AutoCAD.Windows;
  8. using Autodesk.Windows;
  9.  
  10. // This line is not mandatory, but improves loading performances
  11. [assembly: CommandClass(typeof(Rivilis.RibbonTest))]
  12.  
  13. namespace Rivilis
  14. {
  15.  
  16.   public class RibbonTest
  17.   {
  18.     [CommandMethod("RLIST")]
  19.     public void RLIST()
  20.     {
  21.       Document doc = Application.DocumentManager.MdiActiveDocument;
  22.       if (doc == null) return;
  23.       Editor ed = doc.Editor;
  24.       RibbonControl rc = Autodesk.Windows.ComponentManager.Ribbon;
  25.       RibbonTabCollection tabs = rc.Tabs;
  26.       foreach (RibbonTab tab in tabs)
  27.       {
  28.         string menugroup = "";
  29.         string id = tab.Id;
  30.         if (tab.Id.Contains(".")) {
  31.           menugroup = tab.Id.Substring(0, tab.Id.IndexOf("."));
  32.           id = tab.Id.Substring(tab.Id.IndexOf(".") + 1);
  33.         }
  34.         ed.WriteMessage("\nMenuGroup:{0} Id={1}", menugroup, id);
  35.       }
  36.     }
  37.   }
  38. }

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