Как определить что запущен именно Civil?

Автор Тема: Как определить что запущен именно Civil?  (Прочитано 14641 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Добрый день!

Можно ли определить из какого приложения мы работаем: Autocad или Civil?

Спасибо!

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Если проверять из приложения, загруженного в AutoCAD/Civil 3D, то можно так:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Является ли запущенный AutoCAD Civil'ом
  3. /// </summary>
  4. public static bool IsCivilApplication(bool msg)
  5. {
  6.     string rootKeyNumber = null;
  7.     Version ver = Application.Version;
  8.     bool ret;
  9.  
  10.     if (ver.Major == 19 && ver.Minor == 1)
  11.         rootKeyNumber = "D000";
  12.     else if (ver.Major == 20 && ver.Minor == 0)
  13.         rootKeyNumber = "E000";
  14.     else if (ver.Major == 20 && ver.Minor == 1)
  15.         rootKeyNumber = "F000";
  16.     else if (ver.Major == 21)
  17.         rootKeyNumber = "0000";
  18.     else if (ver.Major == 22 && ver.Minor == 0)
  19.         rootKeyNumber = "1000";
  20.     else if (ver.Major == 23 && ver.Minor == 0)
  21.         rootKeyNumber = "2000";
  22.  
  23.     if (string.IsNullOrEmpty(rootKeyNumber))
  24.     {
  25.         ret = false;
  26.         if (msg)
  27.             Application.ShowAlertDialog
  28.                 (string.Format("Not supported version: {0}", ver));
  29.     }
  30.     else
  31.     {
  32.         ret = HostApplicationServices.Current
  33.             .MachineRegistryProductRootKey.Contains(rootKeyNumber);
  34.         if (!ret && msg)
  35.         {
  36.             Application.ShowAlertDialog("It is not Civil 3D!");
  37.         }
  38.     }
  39.  
  40.     return ret;
  41. }
  42.  
Метод далеко не идеален, но работает. Подойдёт для версий 2014-2019. Когда выйдет новая версия, его надо будет изменять.
Если же из внешнего приложения: http://adn-cis.org/eto-ekzemplyar-prilozheniya-civil-3d.html
Ещё один момент: если запущен Civil3D as AutoCAD, то проверка будет считать, что это Civil 3D. Но и как показывает практика, с работой сивильных приложений в таком автокаде нет проблем.

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Нужно чтоб отличал Civil as Autocad от Civil(
может можно узнать путь запущенного файла? если автокад то в пути будет "AutoCad" светиться
 _____________
хотя у них же один запускаемый файл(

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Нужно чтоб отличал Civil as Autocad от Civil
Хо-хо...
может можно узнать путь запущенного файла? если автокад то в пути будет "AutoCad" светиться
Да они с одного файла запускаются...
Civil:
"D:\Programs\Autodesk\AutoCAD 2019\acad.exe" /ld "D:\Programs\Autodesk\AutoCAD 2019\\AecBase.dbx" /p "<<C3D_Metric>>" /product "C3D" /language "ru-RU"Civil as AutoCAD:
"D:\Programs\Autodesk\AutoCAD 2019\acad.exe"  /P AutoCAD /Product "C3D" /Language "ru-RU"То есть, разница только в том, что в AutoCAD не грузится AecBase.dbx и файл профиля другой загружается.

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

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

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Плохо дело. Ладно придется обойтись без этого метода.
Спасибо за ответы!

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
То есть, разница только в том, что в AutoCAD не грузится AecBase.dbx и файл профиля другой загружается.
Он может загрузится позднее при открытии чертежа, содержащего соответствующие объекты. Можно проверить загружен он или нет. И при необходимости загрузить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
а если проверить название ленты? или как это называется..
В Civil она так и называется же.. или 3D моделирование.
не очень надежно конечно.. если пользовательские то не срабоатет

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Вот интересно... Поведение Civil 3D и Civil 3D as AutoCAD всё-таки различается. Второй не создаёт в чертеже объектов Civil 3D по умолчанию, т.е. ведёт себя по сути как AutoCAD с Civil 3D Object Enabler. Значит, какая-то разница между ними всё-таки есть? Понять бы, в чём она

Отмечено как Решение simson43 17-12-2018, 13:40:20

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
если проверить название ленты? или как это называется..
Название основного файла адаптации. В принципе - рабочий вариант. У Civil 3D это будет C3D.cuix, у Civil 3D as AutoCAD - acad.cuix.
Если что - это переменная MENUNAME.

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
дак такой вариант уже неплох)
у Civil называется в моем случае civil этот файл.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
у Civil называется в моем случае civil этот файл.
Странно:
Команда: MENUNAME
MENUNAME = "C:\Users\<MyUserName>\AppData\Roaming\Autodesk\C3D 2019\rus\support\C3D" (только чтение)

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
по тому пути лежит и файл с именем "c3d"
поэтому я проверяю наличие в названии файла или civil или 3d

Оффлайн simson43Автор темы

  • ADN OPEN
  • ****
  • Сообщений: 411
  • Карма: 9
Может кому то будет полезно
Код - C# [Выбрать]
  1. public static bool IsCivil3D()
  2.         {
  3.             string nameCUIX = Path.GetFileName(Application.TryGetSystemVariable("MENUNAME") as string);
  4.  
  5.             return (nameCUIX.IndexOf("civil", StringComparison.OrdinalIgnoreCase) > 0 ||
  6.                 nameCUIX.IndexOf("3d", StringComparison.OrdinalIgnoreCase) > 0);
  7.         }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Мой вариант:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Является ли запущенный AutoCAD Civil'ом
  3. /// </summary>
  4. public static bool IsCivilApplication(bool checkForCuix)
  5. {
  6.     bool checkApp() => Regex
  7.             .Match
  8.                 (HostApplicationServices.Current.MachineRegistryProductRootKey,
  9.                 @"ACAD-\w000:\d{3}$",
  10.                 RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)
  11.             .Success;
  12.  
  13.     bool checkCuix() =>
  14.          !checkForCuix
  15.          || Regex
  16.              .Match
  17.                  ((string)Application.GetSystemVariable("menuname"),
  18.                  "(c3d|civil)$",
  19.                  RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)
  20.              .Success;
  21.  
  22.     return checkApp() && checkCuix();
  23. }
  24.  
  25.  

P.S. Немного исправил, чтобы не было проверки Cuix, если не прошла проверка ключа приложения