Добавить в корзинуПозвонить
Найти в Дзене

Единицы измерения в Revit и ForgeTypeId

Если вы начинали свой путь в программировании под Ревит с Dynamo, то, наверное, помните магическое число 304,8 (или 0,3048). Это коэффициент, который используется для перевода из внутренних единиц Ревита (футов) в миллиметры. Но вообще, внутренние единицы Ревита это не только футы. Площади, объёмы, массовые расходы, сила тока, напряжение, может измеряться под капотом в чём угодно. Давайте попробуем разобраться, как с максимальной точностью переходить от внутренних единиц к понятным нам единицам, и что такое ForgeTypeId. Эта система появилась в Revit в 2021 году, как часть унификации единиц измерения между разными продуктами Autodesk. До этого в качестве обозначения единиц использовались различные enum, теперь для этого появился единый класс, и для каждого ForgeTypeId появился строковый идентификатор
В Revit Lookup можно посмотреть все используемые ForgeTypeId, их строковую идентификацию, и eye-friendly (оку товарищеское) написание:
Dashboard - Units - Forge Schema ForgeTypeId может при
Оглавление

Если вы начинали свой путь в программировании под Ревит с Dynamo, то, наверное, помните магическое число 304,8 (или 0,3048). Это коэффициент, который используется для перевода из внутренних единиц Ревита (футов) в миллиметры. Но вообще, внутренние единицы Ревита это не только футы. Площади, объёмы, массовые расходы, сила тока, напряжение, может измеряться под капотом в чём угодно. Давайте попробуем разобраться, как с максимальной точностью переходить от внутренних единиц к понятным нам единицам, и что такое ForgeTypeId.

ForgeTypeId

Эта система появилась в Revit в 2021 году, как часть унификации единиц измерения между разными продуктами Autodesk. До этого в качестве обозначения единиц использовались различные enum, теперь для этого появился единый класс, и для каждого ForgeTypeId появился строковый идентификатор
В Revit Lookup можно посмотреть все используемые
ForgeTypeId, их строковую идентификацию, и eye-friendly (оку товарищеское) написание:
Dashboard - Units - Forge Schema

ForgeTypeId может принадлежать к разным подгруппам:

  • SpecTypeId — тип данных (просто число, длина, сила тока и т.д)
  • UnitTypeId — единица измерения (Метр, сантиметр, ампер, килоампер)
  • SymbolTypeId — как отображаем единицу измерения (на скрине выше пример)
  • ParameterTypeId — тип данных параметра
  • DisciplineTypeId — дисциплина Ревит
  • GroupTypeId — группа параметров

Нас интересуют только первые 3, тут важно понять структуру:

  • SpecTypeId — что меряем (длина). Её можем мерить разными единицами (UnitTypeId) — фут, дюйм, метр. И каждую единицу мы можем обозначить тоже по-разному (SymbolTypeId) — метр и м, например.

Практика

Давайте решим вот такую задачу: возьмём какой-нибудь числовой параметр, получим его значение методом AsDouble(), и превратим его в строку, используя операции с ForgeTypeId.

А зачем? Можно же сразу получить как строку?
А затем, что можно получить как число, провести вычисления, а потом форматировать в нужный нам формат, вот зачем

Для управления форматированием нам нужен класс Units, получаемый методом GetUnits у всего документа (один раз).
Дальше для преобразования нам нужна вот такая функция:

-2

Всё, задача решена. Число 100 (в футах) превратилось в "30480 мм".
Буквально мы написали следующее:


1. Получи, какой тип данных у этого параметра (
SpecTypeId — длина, сила тока и т.д)

2. Преобразуй его в соответствии с тем, как это указано в единицах измерения в документе.

Однако, класс UnitFormatUtils позволяет нам в том числе и менять формат отображения через другую перегрузку метода Format. Вот как это делается:

-3

В данном случае, мы получили FormatOptions у конкретного SpecTypeId. Это по сути те параметры, которые мы можем менять в окне управления единиц измерения:

-4

Или в коде:

-5

В коде выше я сделал округление до 4 знаков в данном конкретном случае, и получил значение, округлённое до 4х знаков.

Выводы

Не бойтесь ForgeTypeId. Не умножайте свои результаты на 304,8 всегда, когда не понимаете, что происходит с цифрами. Для преобразования единиц используйте класс Units и конкретный SpecTypeId от нужного параметра. И возможно (но только возможно) никаких проблем у вас не будет.

Баг Ревита

Почему в абзаце выше я сделал пометку "возможно"?
А потому что я нашёл интересный баг с силой тока:

1. Настраиваем силу тока с округлением до целых

2. Создаём электрическую цепь так, чтобы у неё был не целый ток

3. В интерфейсе Revit мы видим число с округлением до 2 знаков, в методе AsValueString() и при форматировании без модификации FormatOptions — другое:

-6

Почему так — я не знаю. Если найдёте, как починить, пишите в комментарии, всегда рад узнать что-то новое. Может быть и статью модифицирую потом.

На сегодня всё! Без исходного кода, потому что, несмотря на кажущуюся сложность темы, код тут довольно лёгкий и понятный. Не забывайте подписываться на мой телеграм-канал о Revit API и до новых встреч!

-7