Как правильно вызывать регенерацию Workspace?

Автор Тема: Как правильно вызывать регенерацию Workspace?  (Прочитано 25386 раз)

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

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

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Возможно я ошибся и Load загружает только Toolbars но не Ribbons:

Код - C# [Выбрать]
  1. CustomizationSection csMain = new CustomizationSection(mainCuiFile);
  2.  
  3. if (!csMain.PartialCuiFiles.Contains(extensionMenuFullName))
  4. {
  5.         var mg = cad.MenuGroups.GetType().InvokeMember("Load",
  6.                         BindingFlags.Public | BindingFlags.InvokeMethod |
  7.                         BindingFlags.Instance, null, cad.MenuGroups, new object[] { extensionMenuFullName });
  8.                        
  9. #if AUTOCAD_2009
  10.         Autodesk.Windows.RibbonControl rc = RibbonServices.RibbonPaletteSet.RibbonControl;
  11.         RibbonTab tab = rc.FindTab("PROXY_TOOLS.UIDU_0003");
  12.         // tab is null
  13.         if (tab != null) tab.IsVisible = !tab.IsVisible;
  14.        
  15.         StringBuilder sb = new StringBuilder();
  16.         sb.AppendLine();
  17.  
  18.         // My ribbon tab is not exist here.
  19.         foreach (var item in rc.Tabs)
  20.         {
  21.                 sb.AppendLine(item.Name);
  22.         }
  23.         cad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(sb.ToString());
  24. #endif
  25. ...

Хотя тогда непонятно, почему переключение Workspace приводит к появлению моих риббонов.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В общем случае для AutoCAD 2009-2011 загрузка и отображение Toolbars и Ribbons из файлов CUI\CUIX может быть выполнена так:
Код - C# [Выбрать]
  1. // Menu loading displays Toolbars
  2. var mg = cad.MenuGroups.GetType().InvokeMember("Load",
  3.         BindingFlags.Public | BindingFlags.InvokeMethod |
  4.         BindingFlags.Instance, null, cad.MenuGroups, new object[] { extensionMenuFullName });
  5.  
  6. // Workspace switching displays ribbons
  7. string ws = (string)cad.GetSystemVariable("WSCURRENT");
  8. cad.SetSystemVariable("WSCURRENT", ws);
Мне не нравится, что приходится переключать рабочее пространство, дабы риббоны появились. Если так будет поступать каждое расширение, то тормоза неизбежны...

В более новых версиях акада все эти танцы с бубном берёт на себя загрузчик пакетов.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Фактически это только обертка над xml. Более того, насколько я помню AcCui.dll единственная из AutoCAD'овских .NET-сборок, которая может использоваться не только в dll-приложении для AutoCAD, но и в любых внешних приложениях. Во всяком случае так было раньше. В последних версиях я не проверял.
Полезная информация!

На данный момент времени я в методе Terminate() произвожу выгрузку своих меню, дабы в случае деинсталляции (через установку\удаление программ Windows) расширения не оставалось "хвостов". Однако если есть возможность пользоваться AcCui.dll из внешних приложений, то можно выгрузку перенести из Terminate() в процесс деинсталляции самого MSI-пакета (WiX), посредством AcCui.dll произведя выгрузку (если она требуется)...

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Мне не нравится, что приходится переключать рабочее пространство, дабы риббоны появились. Если так будет поступать каждое расширение, то тормоза неизбежны...
А ты что это делаешь при каждом запуске AutoCAD или только тогда, когда твоё меню не загружено? Если однократно, то я не вижу проблем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Иконки при таком подходе хранишь в виде набора отдельных файлов? Ведь ресурсный DLL сопоставляется с существующим CUI\CUIX.
Нет иконки храню в ресурсах, которые разворачиваю в %TEMP% и загружаю через COM SetBitmaps.

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Дима_
А как хранишь местоположение, количество строк, Docking/Floating-состояние? Используешь ли Ленту?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Ленту не использую (точнее проектный отдел не использует - и мне соотв. не надо). Про состояние я уже писал - вначале проверяю есть ли такой  toolbars - если он есть (а соответственно есть и где он лежит,как виден и пр.) - то просто добавляю кнопки на него, если нету создаю свой новый.
з.ы. У меня все, включая исполнятемые dll хранится в СУБД, автокад при старте только запускает "загрузчик" из нее. Соответственно все кнопки, команды в соотв. с уровнем доступа выдаются при старте, наверно для "статичных" приложений такой подход избыточный.

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Про состояние я уже писал - вначале проверяю есть ли такой  toolbars - если он есть (а соответственно есть и где он лежит,как виден и пр.) - то просто добавляю кнопки на него, если нету создаю свой новый.
Вот тут то собака и зарыта. Если добавляешь свои кнопки в один из стандартных toolbar AutoCAD, то за свойствами этого toolbar следит AutoCAD и сохраняет его между сеансами работы. А вот если тебе приходится создавать на лету свой toolbar, то всё становится крайне неприятным. Если ты не будешь запоминать положение этого toolbar, то пользователя это будет раздражать. Ему придётся при каждом запуске его куда-то перетаскивать или вообще закрывать toolbar, если он не нужен. cui(x) берут это на себя запоминание положений toolbar'ов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Если добавляешь свои кнопки в один из стандартных toolbar AutoCAD, то за свойствами этого toolbar следит AutoCAD и сохраняет его между сеансами работы. А вот если тебе приходится создавать на лету свой toolbar, то всё становится крайне неприятным. Если ты не будешь запоминать положение этого toolbar, то пользователя это будет раздражать. Ему придётся при каждом запуске его куда-то перетаскивать или вообще закрывать toolbar, если он не нужен. cui(x) берут это на себя запоминание положений toolbar'ов.
Это основная причина по которой я всегда был и есть против программного создания менюшек в акаде.

Если ты не будешь запоминать положение этого toolbar, то пользователя это будет раздражать. Ему придётся при каждом запуске его куда-то перетаскивать или вообще закрывать toolbar, если он не нужен. cui(x) берут это на себя запоминание положений toolbar'ов.
Неоднократно присутствовал при таких ситуациях (у некоторых юзеров понакачено из инета). Преимущественно от пользователя в этот мометн слышался мат и недоумение о том, почему "оно" не может запомнить "своё" место.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Вот тут то собака и зарыта. Если добавляешь свои кнопки в один из стандартных toolbar AutoCAD, то за свойствами этого toolbar следит AutoCAD и сохраняет его между сеансами работы. А вот если тебе приходится создавать на лету свой toolbar...
Еще раз - он создается если с таким именем его нет. Если пользователю надо чтоб он оставался там где ему надо - он создает свой пустой и ставит куда нужно.  Настолько "одаренных" юзеров которые не могут по фразе команда "_cui" во вкладке панели -> добавить панель - не могут этого сделать - у нас не держат ибо основная их работа требует более интеллектуальных навыков.
Создание нового - требуется если в доступе или в функционале юзера, что-то изменилось и у него появилась новая панель со своими кнопками.

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

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Значит тебе очень повезло.
Тут вообще отдельная тема - не имеющая никакого отношения к программированию, но тем не менее крайне важная для "нашего брата" - уверяю что нет такого пользователя автокада, который в нем должен работать и не может разобраться (хотя-бы под запись) в чем-то типа добавления в меню. Есть либо упертые, либо зазнавшиеся или очень важные персоны - которые считают, что это им кто-то все должен. Ему можно просто отключить кнопки - и дать список команд. У меня к последней "системе" вообще никто "насильно" подключен не был - не хочешь "руби руками" пока не дозреешь до коллег, которые пол дня кофе пьют и в теннис играют - но больше (и лучше) тебя работы делают - если есть обоснованные претензии (пожелания) к функционалу - всегда рассматриваем вопрос как их реализовать - всем все равно не угодить - частично по этому и допуск разный.

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Если пользователю надо чтоб он оставался там где ему надо - он создает свой пустой и ставит куда нужно.
Для этой цели пользователь как минимум должен знать имя этого toolbar. Т.е. имя должно быть зарезервировано. В противном случае даже если ты добавишь к какому-то toolbar'у свою кнопку, то как об этом догадается пользователь если у него этих toolbar'ов пару десятков на экране? Это (описать как следует назвать toolbar'ы для твоих приложений) можно сделать в своей организации, но для коммерческого продукта - это плохой стиль (IMHO).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Если пользователю надо чтоб он оставался там где ему надо - он создает свой пустой и ставит куда нужно.
ИМХО - это лишнее телодвижение для пользователя, которое можно было бы легко избежать в случае использования CUI\CUIX.