Как определить имя группы команд для библиотеки AecUtilities?

Автор Тема: Как определить имя группы команд для библиотеки AecUtilities?  (Прочитано 3255 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Тема - продолжение этого обсуждения: http://adn-cis.org/forum/index.php?topic=8311.0
В зависимости от версии Civil 3D имя группы команд может быть разным:
2014-2017:
Команда: ARX
Задайте параметр [Файлы/Группы/Команды/кЛассы/Службы/Загрузить/Выгрузить]: К
Какие команды вывести <*>: AecObjectViewer
Команды, зарегистрированные модулями ARX:
Группа команд 'AecUtilities70'
    AECOBJECTVIEWER, OBJECTVIEWER
Конец списка.
2018:
ARX
Задайте параметр [Файлы/Группы/Команды/кЛассы/Службы/Загрузить/Выгрузить]: К
Какие команды вывести <*>: AecObjectViewer
Команды, зарегистрированные модулями ARX:
Группа команд 'AecUtilities80'
    AECOBJECTVIEWER, OBJECTVIEWER
Конец списка.
В свойствах файла подходящей информации (70 или 80) нет:

Не хочется прописывать жёстко в коде "если версия такая-то - то группа команд такая". Возможно, откуда-то можно достать информацию об имени группы?

Отмечено как Решение Дмитрий Загорулькин 20-02-2018, 16:19:22

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть два варианта:
1. Лезть в реестр.
2. Воспользоваться возможностями ObjectARX.
Через .NET не получится. Я когда-то пытался, но не вышло.
Но с учетом всего нескольких версий C3D лучше их явно указать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати обрати внимание на версию файла в свойствах файла.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Но с учетом всего нескольких версий C3D лучше их явно указать.
Не, так слишком легко :)
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Получение названия группы команд для AecUtilites
  3. /// </summary>
  4. /// <example>
  5. /// Например, для Civil 3D 2016. Раздел реестра:
  6. /// HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R20.1\ACAD-F000:419
  7. /// \AEC\7.8\General\Tools\{E04B3676-CBB7-454c-9CDB-A55ACA81C41F}
  8. /// Название параметра: AppName
  9. /// Значение параметра: AecUtilities70
  10. /// Метод вернёт строку: "AecUtilities70"
  11. /// </example>  
  12. /// <returns></returns>
  13. static string GetCmdGroupName()
  14. {
  15.     // Открываем раздел
  16.     // HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-XXXX:419\AEC
  17.     Win32.RegistryKey aecRoot = Win32.Registry.CurrentUser.OpenSubKey
  18.         (Path.Combine(HostApplicationServices.Current.MachineRegistryProductRootKey, "AEC"));
  19.  
  20.     if (aecRoot != null)
  21.     {
  22.         // В этом разделе внутри разделы с названиями в виде номера версии,
  23.         // в одном из них есть вложенный раздел General. Ищем его.
  24.         string[] aecSubKeyNames = aecRoot.GetSubKeyNames();
  25.         foreach (string aecSubKeyName in aecSubKeyNames)
  26.         {
  27.             Win32.RegistryKey aecSubKey = aecRoot.OpenSubKey(aecSubKeyName);
  28.             // Если нашли
  29.             if (aecSubKey.GetSubKeyNames().Contains("General"))
  30.             {
  31.                 // Получаем раздел
  32.                 // HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\
  33.                 // RXX.X\ACAD-XXXX:419\AEC\X.X\General\Tools
  34.                 Win32.RegistryKey tools
  35.                     = aecSubKey.OpenSubKey(Path.Combine("General", "Tools"));
  36.                 // В нём - только один раздел с названием в виде GUID.
  37.                 // Получаем его
  38.                 string guidKeyName = tools.GetSubKeyNames()[0];
  39.                 Win32.RegistryKey guidKey = tools.OpenSubKey(guidKeyName);
  40.  
  41.                 // Читаем значение AppName
  42.                 return guidKey.GetValue("AppName").ToString();
  43.             }
  44.         }
  45.     }
  46.     return null;
  47. }
  48.  

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я имел в виду не эту ветку реестра, а там где команды.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Хм, да, действительно, есть и такое:
HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R19.1\ACAD-D000\Applications\AecUtilities70\GroupsСогласен, это будет правильнее

Хотя, там, конечно, "масло масляное": разделе ... AecUtilities70\Groups есть параметр AecUtilities70 у которого значение - угадайте какое ;)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
По имени команды ищем ветку реестра и из неё берём имя группы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Не получается "по-правильному" сделать такой же универсальный метод. Почему-то с 2016 версии изменили расположение описаний для AecUtilities. Вместо ACAD-X000 в последних версиях используется ACAD-X004:
HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R19.1\ACAD-D000\Applications\AecUtilities70
HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R20.0\ACAD-E000\Applications\AecUtilities70
HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R20.1\ACAD-F004\Applications\AecUtilities70
HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R21.0\ACAD-0004\Applications\AecUtilities70
HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R22.0\ACAD-1004\Applications\AecUtilities80
Не факт, что и в будущем не изменят что-нибудь...
В общем, оставлю пока "неправильный вариант".

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А по версии файла не пробовал?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
По версии файла тоже получится.
7.5 - 2014
7.7 - 2015
7.8 - 2016
7.9 - 2017
8.0 - 2018
Т.е. там, где основной номер 7 - AecUtilities70, там где 8 - AecUtilities80.
Но я не вижу никакого преимущества такого способа перед "неправильным реестровым".