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

25/07/2013

Как получить список всех единиц измерения для заданной категории

Вопрос: В своей надстройке мне необходимо создать список всех Единиц измерения (DisplayUnitTypes), например, миллиметры, метры, футы и т.д. (DUT_MILLIMETERS, DUT_METERS, DUT_DECIMAL_FEET), для заданной категории единиц (UnitType), например, длина (UT_LENGTH)

Примечание переводчика. Чтобы нагляднее понять, что такое UnitType и DisplayUnitType ниже представлены скриншоты интерфейса. В интерфейсе используется одно и то же слово, для этих понятий, как в русской, так и в английской версии Revit. (Единицы и Units соответственно)

 

Единственный способ, который я смог найти, как мне достичь этого – попытаться присвоить каждую единицу измерения (DisplayUnitType) из DisplayUnitType enumeration к свойству FormatOptions.Units для заданной категории единиц измерения (UnitType). В случае, если единица измерения не соответствует заданной категории, то выбрасывается исключение, таким образом, остаются только корректные единицы измерения.

Поскольку такая операция является довольно трудоемкой и медленной, я закэшировал результат для всех категорий единиц измерения.

В Revit 2014 появилось новое свойство FormatOptions.DisplayUnits. Подсказки в Visual Studio говорят, что при обращении к данному свойству может возникать исключения:  ArgumentException, ArgumentOutOfRangeException и InvalidOperationException.

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

Мне известно, что в плане работы с единицами измерения были проделаны значительные изменения.

Так есть ли более простой встроенный в API способ получить все единицы измерения (DisplayUnitType) для заданной категории (UnitType)?

Ответ: Метод работает так, как и запланировано: FormatOptions.DisplayUnits отвергает только неверные единицы измерения. Документация ссылается на метод GetValidDisplayUnits класса UnitUtils, в которой говорится: «Единица измерения считается валидной, если это фактически существующая единица измерения, такие как метры или футы. Устаревшие, или специальные значение единицы измерения, как DUT_CUSTOM или DUT_UNDEFINED не являются валидными.»

Таким образом не стоит пытаться получить список единиц измерения с помощью FormatOptions.

Обратите внимание, что SetFormatOptions выбрасывает исключение, в случае неверной комбинации Единицы измерения и категории единицы измерения, так что можно использовать вот такой код для проверки:

Код - C#: [Выделить]
  1. oFormatOption.DisplayUnits = eDisplayUnitType;
  2.  
  3.   using (Transaction t = new Transaction(doc))
  4.   {
  5.     t.Start("Set options");
  6.     units.SetFormatOptions(unitType, oFormatOption);
  7.     t.Commit();
  8.   }

С другой стороны, есть еще более легкий способ: просто вызовите метод UnitUtils.GetValidDisplayUnits(UnitType), результатом которого будет являться список всех единиц измерения для заданной категории.

Источник: http://thebuildingcoder.typepad.com/blog/2013/07/curve-length-idling-units-and-revitpythonshell.html#4

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

 

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