Найти тему

Работа с параметрами через Revit API

Оглавление

Работа с параметрами — одна из важнейших частей работы в Revit. Это очень важный момент, параметры есть у всех элементов, видов и типов. Они отражаются в спецификациях и могут выводится в марки. Параметры могут иметь множество числовых единиц измерения. В общем, много нюансов, есть где разгуляться. Давайте разбираться по порядку.

1. Типы параметров

Тут всё довольно просто, примерно как и при работе в Revit без программирования. Параметры бывают 4 типов:

  • Параметр семейства
  • Встроенный параметр
  • Общий параметр
  • Параметр проекта

В чём же тут разница в контексте API? Любой параметр элемента мы можем взять с помощью метода LookupParameter(string name), передав ему имя параметра. Я не рекомендую использовать этот метод по 2 причинам:

1. Встроенные параметры могут изменить имя в зависимости от языка Revit. Плагин не найдёт параметр и вернёт null. Параметр семейства же может быть переименован, и плагин опять же не найдёт его.

2. У элемента может быть несколько параметров с одним и тем же именем. Нет никакой проблемы создать общий параметр "Уровень", параметр проекта "Уровень", да ещё и в семействе такой же создать. А есть ещё и встроенный. И всем можем задать разный тип данных и единицу измерения — почему бы и нет. А какой параметр получит плагин? А тот, который первым будет найден по указанному имени в коллекции Parameters — это свойство класса Element.

Таких проблем не возникнет, если использовать метод get_Parameter (не описанный в API):

Как найти метод get_Parameter на www.revitapidocs.com
Как найти метод get_Parameter на www.revitapidocs.com

У него есть 2 перегрузки: в первую передаётся Guid общего параметра, во вторую — значение из списка встроенных параметров BuiltInParameter. Узнать и то, и другое проще всего через Revit Lookup:

Находим GUID общего параметра
Находим GUID общего параметра
Находим BuiltInParameter для системного параметра
Находим BuiltInParameter для системного параметра

Синтаксис для получений параметров, соответственно, такой:

-4

Далее с этими параметрами можно вести работу.

2. Типы данных параметров

Несмотря на обилие единиц измерения в Revit, все они могут храниться только в 4 видах данных:

  • Строка
  • Целое число (int)
  • Действительное число (double)
  • ElementId

Вот 5 методов из API, которые возвращают эти виды данных:

-5

В данном случае, метод AsValueString() вернёт строку для строковых параметров, а для остальных — то значение, которое мы видим в панели свойств.

У каждого параметра есть свойство StorageType, которое и показывает, как правильно брать его значение. Впрочем, можно попробовать взять и другим способом, это может быть и не дать ошибку в плагине, но результат вы получите, скорее всего, не тот. Особенно важно это учитывать, если вы собираетесь переписывать значения из одного параметра в другой (и проверять значения заранее в Revit Lookup).

Ну и отмечу такой момент: параметры типа ElementId со стороны кажутся строковыми (свойствах же строку видим: Базовый уровень: Уровень 1), но, конечно же, нельзя записать в него строку "Уровень 2". Нужно найти этот уровень и передать его Id, только тогда запись будет успешной.

3. Единицы измерения параметров

У вас, наверное, возник вопрос, а как Ревит понимает, что вот тут у нас эта 1000 — это длина, 1000 мм, а вот та 1000 — это расход воздуха, 1000 м³/ч, если и то и то — double.

Это очень интересная тема. Первое: для Revit ни то, ни то — не 1000. Внутри Revit — британская система измерений. Да-да, вот та самая, с дюймами, которую вам предлагают выбрать при создании файла без шаблона:

-6

Поэтому для Ревита 1000 мм будет 3,28083989501312 (AsDouble), а 1000 м³/ч — 9,80962964485794 (AsDouble). И что нам с этим делать?
Для начала ответим на вопрос, а что нам нужно? Мы хоти перенести значение из одного параметра в другой? Отлично, просто переносим и ничего не делаем — отобразится оно в тех единицах, которые выбраны в проекте

Но довольно часто задачи другие. Например, пользователь вводит число, а мы должны с таким шагом сделать что-либо. Пользователь ввёл 1000 мм, а Revit получил 1000 футов.

3.1 Простое (и порою правильное) решение

Мы можем поделить значение на коэффициент 304,8. Миллиметры превратятся в футы с абсолютно точно. В обратную сторону тоже сработает. Можно подобрать коэффициент для квадратных и кубических метров (возвести в квадрат/куб 304,8, перевести секунды в часы при необходимости, и получить нужный результат

И если честно, я до недавнего времени именно так и делал, потому что мне было лень разбираться, как это всё работает изнутри, а связанное с единицами измерения API меняется довольно часто. Работает? Работает. Правильно работает? Правильно. Зачем выдумывать что-то ещё.

3.2 Правильное решение

Вообще, в основном я пишу про Revit 2023, но в данном случае напишу чуть подробнее.

В Revit API есть статический класс UnitUtils (2020), который преобразует единицы измерения. В Revit 2020 и ранее есть enumeration DisplayUnitType. Ну и нас интересуют 2 метода этого класса: ConvertFromInternalUnits и ConvertToInternalUnits. Первый превращает значение во внутренних единицах Ревита в выбранное нами значение, а второй — значение в указанных единицах превращает во внутренние единицы Ревита.

Синтаксис тут будет такой:

Не обращайте внимание на подчёркивание красным — у меня нет Revit 2020, а 2023 такого не знает.
Не обращайте внимание на подчёркивание красным — у меня нет Revit 2020, а 2023 такого не знает.

Что интересно, в 2021 и старше будет почти тоже самое:

  • Статический класс UnitUtils (2023)
  • Методы с теми же именами ConvertFromInternalUnits и ConvertToInternalUnits.
  • Только другой enum: UnitTypeId

Ну и синтаксис тут будет такой (выбирайте нужную вам единицу измерения):

Тут VS ругается, ведь подключена ссылка на Revit API 2023
Тут VS ругается, ведь подключена ссылка на Revit API 2023

А на сегодня про параметры всё. Надеюсь, эта статья будет для вас полезной и интересной.

Мой телеграм-канал. Подписывайтесь, задавайте вопросы в комментариях — буду рад вашей обратной связи.

-9