Как получить список всех единиц измерения для заданной категории
Вопрос: В своей надстройке мне необходимо создать список всех Единиц измерения (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 выбрасывает исключение, в случае неверной комбинации Единицы измерения и категории единицы измерения, так что можно использовать вот такой код для проверки:
- oFormatOption.DisplayUnits = eDisplayUnitType;
- using (Transaction t = new Transaction(doc))
- {
- t.Start("Set options");
- units.SetFormatOptions(unitType, oFormatOption);
- t.Commit();
- }
С другой стороны, есть еще более легкий способ: просто вызовите метод UnitUtils.GetValidDisplayUnits(UnitType), результатом которого будет являться список всех единиц измерения для заданной категории.
Обсуждение: http://adn-cis.org/forum/index.php?topic=121.0