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

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

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

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

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

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

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

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

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Зато можно реализовать что-то наподобие "контекстных toolbar". Например, выбраны полилинии - одни кнопки по работе с ними, выбраны сплайны - другие кнопки... Может быть даже весело. :)
http://bushman-andrey.blogspot.ru/2012/10/autocad.html

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

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

Консольный проект, .NET 4.6.1, AnyCPU.
Подключена AcCUI.dll (Copy Local = False).

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Customization;
  2. ...
  3. static void Main(string[] args) {
  4.     try {
  5.         string acCUIX = Environment.ExpandEnvironmentVariables(
  6.             @"%AppData%\Autodesk\AutoCAD 2016\R20.1\enu\Support\acad.CUIX");
  7.  
  8.         CustomizationSection csMain = new CustomizationSection(acCUIX);
  9.  
  10.         if (!File.Exists(acCUIX)) {
  11.             throw new FileNotFoundException(acCUIX);
  12.         }
  13.  
  14.         string extCUIX = Environment.ExpandEnvironmentVariables(
  15.             @"%ProgramFiles%\Autodesk\ApplicationPlugins\Bushman.ProxyTools.bundle" +
  16.             @"\Contents\Resources\Proxy_Tools_2010.cuix");
  17.  
  18.         if (!File.Exists(acCUIX)) {
  19.             throw new FileNotFoundException(extCUIX);
  20.         }
  21.  
  22.         csMain.AddPartialMenu(extCUIX);
  23.  
  24.         if (csMain.IsModified == true) {
  25.             // Save CUI\CUIX file all changes
  26.             csMain.Save();
  27.         }
  28.     }
  29.     catch (Exception ex) {
  30.         Console.WriteLine(ex.Message);
  31.     }
  32.     Console.WriteLine("Press any key for exit...");
  33.     Console.ReadKey();
  34. }

Полученный EXE закидываю в каталог %ProgramFiles%\Autodesk\AutoCAD 2016\.

Цитата: Консольный вывод
Не удалось загрузить файл или сборку "Acdbmgd, Version=20.1.0.0, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Была сделана попытка загрузить программу, имеющую неверный формат.
Press any key for exit...

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
А вот для AcCUI.dll от AutoCAD 2009 модифицированный вариант кода, во внешнем консольном приложении, отработал успешно:

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Customization;
  2. ...
  3. static void Main(string[] args) {
  4.     try {
  5.         string acCUI = Environment.ExpandEnvironmentVariables(
  6.             @"%AppData%\Autodesk\AutoCAD 2009\R17.2\enu\Support\acad.CUI");
  7.         CustomizationSection csMain = new CustomizationSection(acCUI);
  8.         if (!File.Exists(acCUI)) {
  9.             throw new FileNotFoundException(acCUI);
  10.         }
  11.  
  12.         string extCUI = Environment.ExpandEnvironmentVariables(
  13.             @"%ProgramFiles%\Autodesk\ApplicationPlugins\Bushman.ProxyTools.bundle" +
  14.             @"\Contents\Resources\Proxy_Tools_2009.cui");
  15.         if (!File.Exists(acCUI)) {
  16.             throw new FileNotFoundException(extCUI);
  17.         }
  18.         CustomizationSection csExt = new CustomizationSection(extCUI);
  19.         csMain.AddPartialMenu(csExt);
  20.  
  21.         if (csMain.IsModified == true) {
  22.             // Save CUI file all changes
  23.             csMain.Save();
  24.         }
  25.     }
  26.     catch (Exception ex) {
  27.         Console.WriteLine(ex.Message);
  28.     }
  29.     Console.WriteLine("Press any key for exit...");
  30.     Console.ReadKey();
  31. }

Но это было для CUI (не для CUIX). Попробую в 2010-м то же самое для CUIX провернуть.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Работает в 2009-2016. В первый раз я, видимо, с референсами накосячил.

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Была когда-то тонкость (или в 2006-ом или в 2007-ом) и мне о ней рассказал Tony Tanzillo, что для того чтобы эта сборка работала приложение должно находится в каталоге с acad.exe. Судя по твоему эксперименту это уже не актуально.
P.S.: Нашёл это обсуждение: https://forums.autodesk.com/t5/net/install-toolbar-cui-net-api/td-p/1748176
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Была когда-то тонкость (или в 2006-ом или в 2007-ом) и мне о ней рассказал Tony Tanzillo, что для того чтобы эта сборка работала приложение должно находится в каталоге с acad.exe. Судя по твоему эксперименту это уже не актуально.
P.S.: Нашёл это обсуждение: https://forums.autodesk.com/t5/net/install-toolbar-cui-net-api/td-p/1748176
Я тестировал оба варианта: сначала с размещением моего exe в каталоге акада, потом - с размещением в произвольном каталоге.

Во втором случае для разрешения конфликтов ссылок я воспользовался событием AppDomain.AssemblyResolve. Это позволило не размещать мои сборки в каталоге акада для использования AcCUI.dll.

Код - C# [Выбрать]
  1. static void Main(string[] args) {
  2.     try {
  3.         AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
  4.         // CUI\XUIX file edition are to be in the separate method.
  5.         EditCUI();
  6.     }
  7.     catch (Exception ex) {
  8.         Console.WriteLine(ex.Message);
  9.     }
  10.     Console.WriteLine("Press any key for exit...");
  11.     Console.ReadKey();
  12. }
  13.  
  14. static string acadRootDir = @"C:\Program Files\Autodesk\AutoCAD 2016";
  15.  
  16. static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
  17.     string path = Path.Combine(acadRootDir, args.Name.Split(',').First() + ".dll");
  18.     if (File.Exists(path)) {
  19.         Assembly asm = Assembly.LoadFile(path);
  20.         return asm;
  21.     }
  22.     else {
  23.         return null;
  24.     }
  25. }
Это означает, что в процессе деинсталляции можно программно проверять наличие установленных версий AutoCAD, и для обнаруженных версий выгружать файл Partial CUI\CUIX деинсталлируемого приложения, если оно было подгружено в основной CUI\CUIX (посредством использования AcCUI.dll соответствующей версии AutoCAD).

Кроме того, в процессе инсталляции для AutoCAD 2009-2011 (т.е. где нет обновлённого загрузчика пакетов) можно для обнаруженных версий AutoCAD 2009-2011 программно править основной CUI\CUIX, прописывая в нём подгрузку Partial CUI\CUIX инсталлируемого приложения и добавляя регистрацию в реестре на автозагрузку.

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Во втором случае для разрешения конфликтов ссылок я воспользовался событием AppDomain.AssemblyResolve. Это позволило не размещать мои сборки в каталоге акада для использования AcCUI.dll.
Ага. Т.е. проблема с разрешением ссылок для AcCui.dll сохранилась и в более новых версиях.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Т.е. проблема с разрешением ссылок для AcCui.dll сохранилась и в более новых версиях.
Это не проблема и соответствует поведению, по поиску ресурсов, свойственному любому .NET приложению. AppDomain.AssemblyResolve как раз и существует в качестве вспомогательного инструмента уже много лет. Использование обозначенного метода я демонстрировал ещё в 2011-м году, например, в этой песочнице.

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
AppDomain.AssemblyResolve как раз и существует в качестве вспомогательного инструмента уже много лет. Использование обозначенного метода я демонстрировал ещё в 2011-м году, например, в этой песочнице.
2011-ой это не 2007-ой, но ты прав. Я посмотрел, что это событие было даже в .NET 1.1 и соотвественно могло использоваться даже в AutoCAD 2006: https://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve%28v=vs.71%29.aspx
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В принципе, для того, чтобы подправить CUI\CUIX (добавить\удалить) запись об Partial CUI\CUIX, можно вполне обойтись и без AcCUI.dll (причём без каких-либо сложностей), но если уж возможность её использовать вне акада (но при обязательном установленном акаде - это ограничение), то выбор пути решения - это на усмотрение разработчика. Вообще, я не сторонник дополнительных зависимостей...

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Пытаюсь программно обойти баг, ранее обозначенный мною здесь. У меня имеется DLL, позволяющая выполнять конфигурирование AutoCAD извне (т.е. эта DLL предназначена для использования внешними по отношению к AutoCAD приложениями). В этой же DLL, помимо прочего, реализован функционал по подключению\отключению файлов частичной адаптации в CUI\CUIX (динамически подгружает в отдельный домен нужную версию AcCui.dll и использует её API, после чего домен выгружается).

Если после этого я запускаю AutoCAD, то в редакторе CUI вижу, что в состав частичных файлов основного файла меню был успешно подключен тот, который мне нужен (подключение выполнила указанная выше DLL). Однако в AutoCAD риббоны и туллбары подключенного файла не отображаются. В виду того, что библиотека не является плагином AutoCAD, то варианты с MenuGroups.Load() и _CUILOAD не подходят, т.к. код работает вне автокада.

 Какие изменения мне нужно выполнить (в реестре либо в файлах), чтобы при очередном старте AutoCAD корректно загрузил в т.ч. и файл частичного меню, который я программно указал в качестве подключенного в основном файле меню (например в acad.cuix)?

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

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