Роль переменных в AdminCAD

Дата создания: 07.03.2011
Дата редактирования: не редактировалась
Состояние: завершена

В конфигурационных настройках AdminCAD активно используются переменные. Это позволяет создавать единые правила "игры" для любых версий AutoCAD, и именно за счёт использования переменных, эти правила остаются актуальными и при добавлении новых версий AutoCAD. Рассмотрим работу переменных на примере конфигурирования задач по загрузке плагинов. Пишем тестовый код примера и затем рассмотрим то, что он нам выдаёт.

Код C# 3.5:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using Microsoft.Win32;
   6:  using System.Security.Cryptography;
   7:  using System.Xml.Linq;
   8:  using System.Text.RegularExpressions;
   9:  using System.IO;
  10:  using AdminCAD.Configuration;
  11:  using AdminCAD.Net.Mail;
  12:  using AdminCAD.DirectoryServices;
  13:  using AdminCAD.Autodesk.AutoCAD;
  14:  using AdminCAD.Security.Cryptography;
  15:  using AdminCAD.Configuration.Journaling;
  16:   
  17:  namespace AdminCAD.AcadLibsTest
  18:  {
  19:      class Program
  20:      {
  21:          static void Main(string[] args)
  22:          {
  23:              Console.WindowWidth = 150;
  24:              //Вектор инициализации
  25:              byte[] iv = new byte[] { 100, 149, 158, 255, 68, 25, 176, 203, 162, 203, 171, 160, 19, 74, 119, 34 };
  26:              //Ключ шифрования/дешифровки
  27:              byte[] key = XSecurity.GetBytesFromFile(@"D:\SERVER\AdminCAD\Settings\Key.key");
  28:              //Кодировка символов
  29:              Encoding encoding = Encoding.UTF8;
  30:              //Имя файла общих конфигурационных настроек уровня домена
  31:              string comSetFileName = @"D:\SERVER\AdminCAD\Settings\CommonSettings.set";
  32:              //Получаем объект общих настроек уровня домена
  33:              CommonSettings comSet = CommonSettings.Load(comSetFileName, key, iv, encoding);
  34:              //Версия AutoCAD, для которой хотим получить настройки
  35:              AcadVersion av = new AcadVersion("17.2");
  36:              //Создаём объект, который будет предоставлять нам информацию для той версии AutoCAD, которую мы ему указываем
  37:              CommonSettingsWrapper csw = new CommonSettingsWrapper(av, comSet, key, iv, encoding);
  38:              //Получаем значения всех переменных операционной системы + все переменные, определённые в составе общего конфигурационного файла уровня домена
  39:              Dictionary<string, string> dict = csw.GetVariables();
  40:              //Выводим на консоль все переменные, подсвечивая их имена зелёным цветом. При этом, если в значении переменной содержится имя другой переменной - вместо её имени автоматически подставляется нужное значение
  41:              ConsoleColor defaultColor = Console.ForegroundColor;
  42:              dict.All(n =>
  43:              {
  44:                  Console.ForegroundColor = ConsoleColor.Green; Console.Write("{0}:\t", n.Key);
  45:                  Console.ForegroundColor = defaultColor; Console.WriteLine("{0}", n.Value);
  46:                  return true;
  47:              });
  48:              Console.WriteLine();
  49:              Console.WriteLine(new string('*', 30));
  50:              Console.WriteLine();
  51:   
  52:              //Для наглядности выводим на консоль правила загрузок, прописанные в конфигурационном файле, не выполняя никакой автоматической подстановки.
  53:              Console.ForegroundColor = ConsoleColor.Red;
  54:              Console.WriteLine("Читаем правила загрузки из общего конфигурационного файла не выполняя преобразований под версию AutoCAD");
  55:              foreach (var item in csw.CommonSettings.LoadingTasks)
  56:              {
  57:                  Console.ForegroundColor = ConsoleColor.Yellow;
  58:                  Console.WriteLine("Группа загрузки: {0}", item.Key);
  59:                  Console.ForegroundColor = defaultColor;
  60:                  foreach (var item2 in item.Value)
  61:                  {
  62:                      Console.WriteLine(@"Каталог: '{0}'. Фильтр выборки: ""{1}"". Второй фильтр: ""{2}""", item2.Directory, csw.CommonSettings.RegexRules[item2.IncludeFilters], csw.CommonSettings.RegexRules[item2.ExcludeFilters]);
  63:                  }
  64:              }
  65:   
  66:              //А теперь выводим на консоль ту же самую информацию, но уже применительно для каждой из тех версий AutoCAD, которые разрешены к использованию в рамках Системы AdminCAD
  67:              Console.WriteLine();
  68:              Console.WriteLine(new string('*', 30));
  69:              Console.WriteLine();
  70:              Console.WriteLine("А теперь отображаем правила загрузки на каждую версию AutoCAD");
  71:              //В цикле перебираем все версии AutoCAD, разрешённые к использованию в AdminCAD
  72:              foreach (var item0 in csw.CommonSettings.AllowedAutoCADs)
  73:              {
  74:                  //Назначаем объекту CommonSettingsWrapper интересующую нас версию AutoCAD, для того, чтобы он мог выдавать информацию именно для этой версии
  75:                  csw.AcadVersion = item0;
  76:                  //Получаем перечень задач по загрузке плагинов для той версии AutoCAD, которую мы указали
  77:                  Dictionary<string, List<LoadingTask>> loadingTasks = csw.GetLoadingTasks();
  78:                  Console.ForegroundColor = ConsoleColor.Red;  
  79:                  //Указываем версию AutoCAD, для которой выводится информация на консоль
  80:                  Console.WriteLine("Задачи на загрузку библиотек для AutoCAD {0} {1}", item0.Version, item0.Platform);
  81:                  //В цикле перебираем все группы загрузок
  82:                  foreach (var item in loadingTasks)
  83:                  {
  84:                      Console.ForegroundColor = ConsoleColor.Yellow;
  85:                      Console.WriteLine("Группа загрузки: {0}", item.Key);
  86:                      Console.ForegroundColor = defaultColor;
  87:                      //В цикле перебираем все задачи на загрузку, прописанные в составе группы загрузок
  88:                      foreach (var item2 in item.Value)
  89:                      {
  90:                          Console.WriteLine(@"Каталог: '{0}'. Фильтр выборки: ""{1}"". Второй фильтр: ""{2}""", item2.Directory, csw.GetRegexRules()[item2.IncludeFilters], csw.GetRegexRules()[item2.ExcludeFilters]);
  91:                      }
  92:                  }
  93:              }
  94:              Console.Read();
  95:          }
  96:      }
  97:  }

В строках 39-47, мы вводим на консоль список переменных и их значения. В этот список входят переменный операционной системы (уровня машины, пользователя и процесса), а так же те переменные, которые нами определены в общем конфигурационном файле уровня домена. Переменных очень много, ниже представлена часть того, что выводится на консоль - на скрине в основном показан блок тех переменных, которые определены в наших настройках  (щёлкните мышью по рисунку, чтобы увеличить его):


Зелёным цветом подсвечены имена переменных, а белым - их значения. Обратите внимание на то, что значения переменных представлены в полностью развёрнутом виде, т.е. не содержат в своём составе имён других переменных. Например, переменной XmlPath.Arx в настройках определено значение %XmlPath.LocalCommonDir%\Dependent\%Xml.AcadVersion%\bin\%Xml.Platform%\ARX, но поскольку мы указали, что желаем получить значения переменных которые будем использовать для AutoCAD 2009 (в строке 35 кода), не указав при этом целевой платформы (x86 или x64), то платформа вычисляется автоматически (та, что на локальной машине) и производится рекурсивная обработка значений переменных, в процессе которой вычисляется правильное значение. Давайте сравним (для примера) значение всё той же переменной XmlPath.Arx, взятое из файла настроек и то значение, мы получили при указании целевой версии AutoCAD:

В общем конфигурационном файле:         %XmlPath.LocalCommonDir%\Dependent\%Xml.AcadVersion%\bin\%Xml.Platform%\ARX
Преобразовано для AutoCAD 2009 x64:    D:\AdminCAD\Dependent\17.2\bin\x64\ARX

Одинаковыми цветами выделены имена переменных и значения, на которые эти имена в результате были заменены. 

Если мы строку 35 кода заменим на такую строку:

   35:  AcadVersion av = new AcadVersion("18.1", Platform.x86);

То значение переменной XmlPath.Arx было бы следующим:  D:\AdminCAD\Dependent\18.1\bin\x86\ARX  

Т.о. мы видим, что благодаря использованию переменных, присутствует возможность гибкого конфигурирования системы. Переменные используются нами при построении правил регулярных выражений, при формировании задач синхронизации каталогов, при формировании задач на загрузку плагинов и т.п.

Строки кода 52-64 выводят на консоль информацию о том, какие задачи по загрузкам плагинов установлены администратором CAD (прописаны в общем конфигурационном файле уровня домена). В результате на консоль выводится следующая информация (щёлкните мышью по рисунку, чтобы увеличить его):


Мы видим, что в именах каталогов и в фильтрах в большом количестве присутствуют имена различных переменных. А теперь давайте посмотрим, как эти правила будут трансформированы под конкретные версии AutoCAD - эту информацию выводит на консоль строки 66-93 кода (в цикле подставляются все те версии AutoCAD, которые прописаны в конфигурационном файле как разрешённые к использованию в рамках Системы). Поскольку информации на консоль выводится много - у нас не получится показать её на скрине сразу всю, но это и не обязательно - для наглядности достаточно и её части. Итак, смотрим скрин - фрагмент результата работы строк 66-93 кода (щёлкните мышью по рисунку, чтобы увеличить его):


Сравните содержимое этого скрина с тем, который был показан перед этим - мы видим, что все имена переменных как в именах каталогов, так и в правилах фильтрации заменены на их значения с учётом версии AutoCAD и версии платформы.

Использование переменных не ограничено правилами загрузки и правилами фильтрации. Переменные используются и в задачах синхронизации каталогов, и при настройке пользовательского интерфейса. Их можно использовать почти везде где это может потребоваться.

Comments