ADN Open CIS
Сообщество программистов Autodesk в СНГ

04/03/2015

Получение информации обо всех системных переменных

В AutoCAD 2015 появилось новое API - AcEdSysVarIterator.

Класс “AcEdSysVarIterator” обеспечивает возможность пройтись по всем доступным системным переменным и получить их имена, типы данных, диапазоны (если доступны), значение «только для чтения» и где они хранятся.

Внимание: системные переменные, которые имеют флаг скрытости (т.е. "*" в качестве первого символа в имени) пропускаются этим итератором. В настоящее время мы можем получить всю информацию при помощи утилиты "SYSVDLG", включая скрытые системные переменные. Это API может пригодиться тем, кто хочет автоматизировать работу с системными переменными в клиентском приложении.

Дополнительная информация есть в документации.

Код - C++: [Выделить]
  1. static void SysVarInfo()
  2. {
  3.   /* Перебираем все системные переменные */
  4.   AcEdSysVarIterator* pIterator = new AcEdSysVarIterator();
  5.  
  6.   while (pIterator->done() != true)
  7.   {
  8.     const AcRxVariable* rxvar = pIterator->getSysVar();
  9.     acutPrintf(_T("\n******** Информация о системной переменной *************"));
  10.  
  11.     const AcString name = rxvar->name();
  12.     acutPrintf(_T("\nИмя: %s"), name.kACharPtr());
  13.  
  14.     short pt = rxvar->primaryType();
  15.     acutPrintf(_T("\nОсновной тип: %d"),pt);
  16.  
  17.     AcRxVariable::SecondaryType secondaryType = rxvar->secondaryType();
  18.     acutPrintf(_T("\nДополнительный тип: %s"),  getSecondaryType(secondaryType).kACharPtr());
  19.  
  20.     short tf = rxvar->typeFlags();
  21.  
  22.     acutPrintf(_T("\nФлаги: %d"),tf);
  23.  
  24.     AcRxVariable::StorageType storageType = rxvar->storageType();
  25.  
  26.     acutPrintf(_T("\nВид хранения: %s"),  getStorageType(storageType).kACharPtr());
  27.  
  28.     const AcRxVariable::Range* range = rxvar->range();
  29.  
  30.     int lowerBound=-1,upperBound=-1;
  31.  
  32.     if(range != nullptr)
  33.     {
  34.       lowerBound = range->lowerBound;
  35.       upperBound = range->upperBound;
  36.     }
  37.  
  38.     acutPrintf(_T("\nДиапазон значений: от %d до %d"), lowerBound,upperBound);
  39.  
  40.     bool isRO = rxvar->isReadOnly();
  41.     AcString readwrite = isRO ? _T("Только для чтения") : _T("Для чтение и записи");
  42.     acutPrintf(_T("\nСистемная переменная: %s"),readwrite.kACharPtr());
  43.  
  44.     acutPrintf(_T("\n-----------------------"));
  45.  
  46.     pIterator->step();
  47.   }
  48.  
  49.   /* Устанавливаем указатель на первую системную переменную */
  50.  
  51.   pIterator->reset();
  52.   delete pIterator;
  53. }
  54.  
  55. /* Вспомогательные функции */
  56.  
  57. const static AcString getStorageType(AcRxVariable::StorageType storageType)
  58. {
  59.   AcString storageInfo = "";
  60.  
  61.   switch(storageType)
  62.   {
  63.   case 0:
  64.     storageInfo = _T("Приложение, не сохраняется");
  65.     break;
  66.   case 1:
  67.     storageInfo = _T("Приложение, хранится отдельно для каждого пользователя");
  68.     break;
  69.   case 2:
  70.     storageInfo = _T("Приложение, хранится в каждом профиле AutoCAD");
  71.     break;
  72.   case 3:
  73.     storageInfo = _T("Документ, хранится в чертеже");
  74.     break;
  75.   case 4:
  76.     storageInfo = _T("Вид (AcDbViewport или AcDbViewportTableRecord), хранится в чертеже.");
  77.     break;
  78.   default:
  79.     break;
  80.   }
  81.   return storageInfo;
  82. }
  83. const static AcString getSecondaryType(AcRxVariable::SecondaryType secondaryType)
  84. {
  85.  
  86.   AcString secondaryInfo = _T("");
  87.   switch(secondaryType)
  88.   {
  89.  
  90.   case 0:
  91.     secondaryInfo = _T("Вторичный тип неопределен");
  92.     break;
  93.   case 1:
  94.     secondaryInfo = _T("Двоичная переменная. Действительна только при primaryDataType==RTSHORT");
  95.     break;
  96.   case 2:
  97.     secondaryInfo = _T("Переменная - символ RealDWG. Действительна только при primaryDataType==RTSTR");
  98.     break;
  99.   case 3:
  100.     secondaryInfo = _T("Переменная представляет площадь. Действительна только при primaryDataType==RTREAL");
  101.   case 4:
  102.     secondaryInfo = _T("Переменная представляет расстояние. Действительна только при primaryDataType==RTREAL");
  103.     break;
  104.   case 5:
  105.     secondaryInfo = _T("Переменная представляет угол. Действительна только при primaryDataType==RTREAL");
  106.     break;
  107.   case 6:
  108.     if(secondaryType == AcRxVariable::kSecondaryTypeUnitlessReal)
  109.       secondaryInfo = _T("Переменная представляет безразмерное значение. Действительна только при primaryDataType==RTREAL");
  110.     else
  111.       secondaryInfo = _T("Отмечает последнее значение в перечислении");
  112.     break;
  113.   default:
  114.     break;
  115.   }
  116.   return secondaryInfo;
  117. }

 

Информация о системных переменных в командной строке:

 

Источник: http://adndevblog.typepad.com/autocad/2015/02/iterating-and-retrieving-system-variable-information.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=1912

Опубликовано 04.03.2015