%RoamableRootFolder%

Автор Тема: %RoamableRootFolder%  (Прочитано 7670 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
%RoamableRootFolder%
« : 04-07-2016, 17:52:29 »
В настройках профиля AutoCAD (в реестре) переменная RegisteredToolsPath имеет значение %RoamableRootFolder%\Support\RegisteredTools. Однако, проводник Windows такой переменной не знает. Насколько я понял, эта переменная специальным образом обрабатывается в AutoCAD и существует только в его контексте (указывает на %AppData%\Autodesk\AutoCAD <Year>\R<Major>.<Minor>\<Lang>\Support\RegisteredTools). Где можно ознакомиться с полным списком подобных переменных (возможно их более чем одна)?

Искал в гугле и хелпе, но без особого успеха.

Отмечено как Решение Андрей Бушман 04-07-2016, 20:16:12

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: %RoamableRootFolder%
« Ответ #1 : 04-07-2016, 19:37:26 »
Где можно ознакомиться с полным списком подобных переменных (возможно их более чем одна)?
Посмотри ветку реестра: HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:ZZZ
Там есть:
AllUsersFolder
AutodeskSharedFolder
RoamableRootFolder
LocalRootFolder
В разных версиях AutoCAD присутствуют не все переменные.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: %RoamableRootFolder%
« Ответ #2 : 04-07-2016, 20:51:26 »
А где можно почитать о том, в каких ключах реестра можно использовать эти переменные в составе значений? Например, обозначенный выше %RoamableRootFolder% используется в RegisteredToolsPath, но использовать его в переменной ACAD не получится, т.к. AutoCAD не понимает, что такое %RoamableRootFolder% в составе Support Files Search Path.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: %RoamableRootFolder%
« Ответ #3 : 04-07-2016, 20:52:53 »
А где можно почитать о том, в каких ключах реестра можно использовать эти переменные в составе значений?
Увы нигде. Это не документировано и для внутреннего использования.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: %RoamableRootFolder%
« Ответ #4 : 04-07-2016, 21:40:37 »
Увы нигде. Это не документировано и для внутреннего использования.
Ясно, спасибо.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: %RoamableRootFolder%
« Ответ #5 : 05-07-2016, 13:54:27 »
В разных версиях AutoCAD присутствуют не все переменные.

Получение информации, специфичной для версии AutoCAD, используемой в рамках текущей сессии:
Код - C# [Выбрать]
  1. string reg_subkey_name = AcadEnvironment
  2.     .GetAcadRegistrySubKeyName();
  3.  
  4. Dictionary<string, string> acad_spec_paths =
  5.     new Dictionary<string, string>();
  6.  
  7. using (RegistryKey reg_key = Registry
  8.     .CurrentUser.OpenSubKey(reg_subkey_name,
  9.     false)) {
  10.  
  11.     foreach (var item in reg_key.GetValueNames(
  12.         ).Where(n => reg_key.GetValueKind(n) ==
  13.             RegistryValueKind.String)) {
  14.  
  15.         string value = reg_key.GetValue(item)
  16.             as string;
  17.  
  18.         if (!string.IsNullOrEmpty(value)) {
  19.  
  20.             string str_value = value as string;
  21.  
  22.             if (Directory.Exists(str_value)) {
  23.  
  24.                 FileAttributes attr = File
  25.                     .GetAttributes(str_value);
  26.  
  27.                 if ((attr & FileAttributes
  28.                     .Directory) ==
  29.                     FileAttributes.Directory) {
  30.  
  31.                     acad_spec_paths.Add(item,
  32.                         str_value);
  33.                 }
  34.             }
  35.         }
  36.     }
  37.     reg_key.Close();
  38. }
  39.  
  40. foreach (var item in acad_spec_paths) {
  41.  
  42.     Environment.SetEnvironmentVariable(item.Key
  43.         , item.Value);
  44.  
  45.     doc.Editor.WriteMessage("\n%{0}% = '{1}'",
  46.         item.Key, item.Value);
  47. }

Конвертация в системные переменные позволяет программно расшифровывать контент и использовать его по мере необходимости.

В принципе код достаточно простой и понятный. Единственное пояснение касается метода AcadEnvironment.GetAcadRegistrySubKeyName() - он взят из моей библиотеки общего пользования. Метод был создан для совместимости кода между разными версиями AutoCAD:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Returns either the value of <c>SystemObjects
  3. /// .DynamicLinker.ProductKey</c>
  4. /// property for AutoCAD older than AutoCAD 2013 or the
  5. /// value of <c>HostApplicationServices.Current
  6. /// .UserRegistryProductRootKey</c> property for
  7. /// AutoCAD 2013 or newer.
  8. /// </summary>
  9. /// <returns>Returns the registry subkey name of the
  10. /// current AutoCAD.</returns>
  11. public static string GetAcadRegistrySubKeyName() {
  12.  
  13.     // Registry subkey name
  14.     String subkey_name = string.Empty;
  15.  
  16.     if (cad.Version >= Variables.acad_2013) {
  17.         subkey_name = (string) HostApplicationServices
  18.             .Current.GetType().InvokeMember(
  19.             "UserRegistryProductRootKey",
  20.             BindingFlags.Public | BindingFlags
  21.             .GetProperty | BindingFlags.Instance, null,
  22.             HostApplicationServices.Current, null);
  23.     }
  24.     else {
  25.         subkey_name = (string) SystemObjects
  26.             .DynamicLinker.GetType().InvokeMember(
  27.             "ProductKey", BindingFlags.Public |
  28.             BindingFlags.GetProperty |
  29.             BindingFlags.Instance, null,
  30.             SystemObjects.DynamicLinker, null);
  31.     }
  32.     return subkey_name;
  33. }

Во вложении - скрин результата для AutoCAD 2009.
« Последнее редактирование: 05-07-2016, 14:39:15 от Андрей Бушман »