Общие сведения
Зачем нужны формулы?
Данные формулы позволяют расширить возможности Revit.
Огромное количество задач требуют соединение данных элементов, которые не имеют прямой взаимосвязи в Revit.
Почему бы не решать такие задачи с помощью классического программирования?
Если задача простая, то создавать приложение нецелесообразно.
Большинство задач в Revit - это передача информации из одних элементов в другие.
Создать очень быстро простую формулу и произвести расчет - вот основная цель создания данных формул.
Также есть возможность обновлять результаты расчета при сохранении файла (Использовать перед формулой директиву {save}: или динамически рассчитывать формулу, используя директиву {auto}:.
Синтаксис очень прост и доступен для пользователя не знакомого с программированием.
С помощью формул вы сможете очень быстро создать эти взаимосвязи и передать необходимую информацию.
Формулы не зависят от версии Revit и работают одинаково. Не нужно их обновлять и адаптировать для новой версии.
Также существует возможность обращаться к функциям динамических библиотек (dll). По сути решать даже самые сложные задачи
Вы сможете создать свое приложение для Revit и использовать в нем формулы расчета
С помощью формул вы сможете:
- Передавать информацию между связанными элементами
- Находить взаимосвязи между элементами модели и передавать значения из одних элементов в другие
- Осуществлять объединение различных данных в одном параметре
Соединяем для текущего элемента параметр 'Маркировка типоразмера' и марку элемента
[type:Mark].[Mark]
Из стены извлечь Марку, если текущий элемент проем
Host:Mark
Host:[Марка]
Найти стены, которые пересекают текущий элемент и извлечь для каждой стены параметр типоразмера 'Mark' и соединить марки через запятую
GetElementsBy(Solid):Category(Walls):[type:Mark]:ListTo(,)
GetElementsBy(Solid) - Определяем все элементы модели, которые пересекаются с текущим элементом
:Category(Walls) - выбираем из полученных только стены
:[type:Mark] - извлекаем маркировку типоразмера
:ListTo(,) - список марок записываем через запятую
Результат: Марка1•Марка2
переменная 'a' вычисляет марку основы. Переменная 'b' вычисляет из элемента 34956 значение параметра 'Mark' и Format соединяет эти два выражение в одну строку с точкой в качестве разделителя
<var a Host:Mark>:<var b Id(34956):[Mark]>:Format({a}.{b})
<var a Host:Mark> - определим переменную 'a'
где Host:Mark - определяем элемент-основу (например для окна - это стена) и извлекаем марку из стены
<var b Id(34956):[Mark]> - определим переменную 'b'
из элемента 34956 - получаем марку
:Format({a}.{b}) - соединяем через точку переменную 'a' и 'b'
Результат: Ст01.Марка1
Вычисляем марку основы и марку элемента 34956 и соединяем их символом '-'
Host:Mark:&:Id(34956):[Mark]:Format({0}-{1})
Host- определяем элемент-основу (Например для арматуры - плита\колонна\балка)
:Mark - получаем марку элемента-основы
:&: - разделитель расчета. Т.е. первая формула сохраняется, в памяти
Id(34956):[Mark]: - у элемента 34956 находим марку.
:Format({0}-{1}) - соединим расчет формулы #1 и #2
Результат: Ст01-01
Создание параметра
Для создания расчетной формулы надо выполнить три простых действия:
-
Выбор параметра
Выберите параметр, в который будем производить запись вычисленной формулы
Например: Марка -
Создать параметр-формулу
Создайте параметр с таким же именем, начинающийся с символа &Марка
Ответный параметр (Марка) может быть текстовый или числовой, в зависимости от того, какая информация будет расчитываться
Параметр-формула может быть создана для экземпляра, типоразмера или в семействе.
Приступим к созданию простого параметра-формулы. Вам также может пригодиться RevitLookUp »
Если параметр для записи является системным, то рекомендуется создавать параметр-формулу используя конструкцию
BuiltInParameter.ALL_MODEL_MARK
Иначе имя параметра-формулы на другом языке Revit не будет работать, т.к. параметр будет иметь имя 'Mark', а параметр-формула '&Марка'
В этом случае Параметр-формула не будет находить нужный ответный параметр для сохранения результата расчета.
Подробнее о получении имени системного параметра см RevitLookUp » -
Создайте формулу
Создайте параметр, в который будет записываться расчетное значение. Параметр может быть текстовым или числовым
Создайте параметр-формулу. Он может быть создан для экземпляра или типоразмера. А также его можно создать внутри семейства.
Также можно использовать глобальные параметры, чтобы централизовано корректировать формулыВ параметре-формуле '&Тип_основы' укажите расчетную формулу
Также разработан механизм создания формул с помощью редактора Revitools. Для этого необходимо установить Revitools Base
Выберите элемент модели, для создания формулы
Вы можете создавть формулу на выбранный параметр
Или редактировать ранее созданные формулы
При создании параметра вам будет предложено выбрать параметр
выберите из списка параметр, куда необходимо записывать вычисляемое значение. Для этого можно воспользоваться поиском. И затем нажмите 'Создать'. Будет создан параметр в типоразмере элемента (В экземпляре, если типоразмера нет)
Далее выберите его в списке и нажмите 'Изменить'
Перед вами редактор формул
В этом поле будем создавать формулу для расчета
Инструменты создания формул.
В любое время вы можете просчитать формулу и увидеть результат расчета для текущего элемента
Сохраняем данные в ранее созданную формулу.
Подробнее о создании формул, используя редактор см. раздел Редактор формул»
Обновление
Для того, чтобы формулы обновлялись, необходимо установить приложение

Revitools Base
Скачайте приложение для нужной версии Revit и установите


Зайдите в закладку Revitools и установленное приложение будет доступно


и обновите параметры-формулы для выбранных элементов.


Также вы можете обновлять формулы при сохранении файла для всех элементов модели. Для этого необходимо указать директиву {save}: перед формулой.


При сохранении файла, будут обновлены все формулы с директивой {save}:
Извлечение параметров
Из любого элемента текущей или связанной модели Revit вы можете извлекать значения параметров и использовать их в вычислениях.
Для текущего элемента укажите параметр в квадратных скобках (например [Имя_параметра])
Соединим для арматуры его диаметр, класс и длину. Извлекаем 'Name' и 'Длина стержня'.
С помощью RevitLookup в типоразмере арматурного стержня находим нужный параметр или свойство.
В данном примере 'Name' - это свойство
и извлекать свойства нужно с помощью конструкции <Name> (в треугольных скобках)
Подробнее об извлечении свойств см. раздел 'Извлечение свойств'
Для упрощения формул у некоторых свойств предусмотрен альтернативный вариант записи [*Имя_свойства*]
Свойства, которые часто используются в расчетах (Name,Mark,MarkType,Comments,CommentsType, DescriptionType,ModelType и др.)
Перечень свойств, которые могут применяться в упрощенном виде см. раздел 'Простые свойства'
Запись <Name> и [*Name*] - эквивалентны
[*Name*] L=[Длина стержня]
или вот так
Name:&:[Длина стержня]:Format({0} L={1})
или вот так
<Name> L=[Длина стержня]
дадут идентичный результат
Разберем подробнее этот пример.
Все три формулы возвращают идентичный результат. (∅10 A500С L=500 мм)
Во втором варианте появляется разделитель вычислений &.
Т.е. амперсанд, указанный внутри формул, является разделителем и каждая формула будет вычисляться независимо
И далее оба значения собираются в Format, где {0} - первая вычисленная формула, {1} - вторая
По умолчанию все параметры извлекаются в виде текста
Однако вы можете явно указывать тип данных, которые извлекаем
Для этого после имени параметра, через двоеточие указываем тип значения
Форму записи вы сможете увидеть в RevitLookup
L=[Длина стержня:AsDouble]
В этом случае будет возвращено значение
Если параметр является параметром типоразмера, то извлекать его необходимо следующим образом [type:...]
L=[type:Диаметр стержня:AsDouble]
Т.к. параметр 'Диаметр стержня' является системным, то рекомендуется использовать его системное имя 'REBAR_BAR_DIAMETER'
Это позволит использовать формулу, если Revit будет открыт на другом языке.
Определить системное имя параметра можно с помощью RevitLookup

Выбираем стержень арматуры и используем функцию Snoop Current Selection. Далее ищем GetTypeId - это типоразмер арматуры

Заходим в 'ParameterSet' и ищем необходимое имя системного параметра

Далее заходим в 'InternalDefinition'

И копируем полученное системное имя параметра. Теперь, используя системное имя, формула будет работать на всех языках
[type:BuiltInParameter.REBAR_BAR_DIAMETER]
Вы можете явно не указывать [type: тогда программа сама найден параметр
Т.к. в экземпляре такого параметра нет, то программа будет искать в типе.
Однако желательно явно указывать, где расположен параметр.
Это сократит время поиска, сделает код более читаемым и гарантирует, что в экземпляре не будет конфликта, если там будет параметр с таким же именем
Теперь рассмотрим пример извлечение свойств из текущего элемента и любого другого
Определяем Id нужного элемента
и записываем следующую формулу
Id(1959800):[Марка]
Из указанного элемента извлекаем параметр 'Марка'. Каждая инструкция должна быть разделена двоеточием
Id(1959800) - определяет Id.
Далее необходимо установить двоеточие и затем указать следующую инструкцию
В данном примере извлечь параметр [Марка]
Далее вы можете например соединить данные элемента 1959800 и данные текущего элемента
Id(1959800):[Марка]:&:[Марка]
В этой формуле будут вычислена марка элемента 1959800 и марка текущего элемента
Теперь в формуле появился амперсанд, который говорит о том, что необходимо вычислять независимо 2 формулы
Дело в том, что если его не указывать Id(1959800):[Марка]:[Марка],
то Id(1959800):[Марка]=Марке элемента, и
если дальше делать инструкцию, то получается, что мы пытаемся извлечь из марки параметр [Марка].
Мы не получаем требуемого результата.
Поэтому необходимо разделить расчет на 2 части. После указания амперсанда программа запоминает результат первого вычисления
и начинает новое вычисление.
Id(1959800):[Марка]:&:[Марка]:Format({0}.{1})
Используя функцию форматирования мы выбираем первую вычисленную формулу {0}=Id(1959800):[Марка] затем указываем вне фигурных кавычек любые текстовые данные, и далее указываем вторую формулу {1}=[Марка]
В базе данных Revit большинство объектов являются элементами и имеют уникальный идентификатор.
Однако не все элементы можно выбрать в модели, но их можно найти используя RevitLookup

Например 'Информация о проекте' также является элементом Revit и имеет идентификатор. Находим Id 'ProjectInfo'

Заходим в 'ParameterSet' и ищем параметр 'Адрес проекта'. Далее заходим в 'InternalDefinition' и находим системное имя параметра, чтобы формулы на разных языках работали
Id(1056):[BuiltInParameter.PROJECT_ADDRESS]
В результате получаем адрес проекта для текущего элемента
Извлечение свойств
С помощью параметров-формул вы можете извлекать не только параметры элементов, но и их свойства.
Из стены извлекаем ее толщину
<Width>:ToMm
Функция ToMm, указанная после двоеточия, преобразует числовое значение в миллиметры. Т.к. Revit использует для вычислений империческую систему необходимо преобразовывать результат
Для двери извлекаем толщину стены
Host:<Width>:ToMm
Форматирование Format
Если необходимо создавать несколько расчетов в одном параметре-формуле, а полученные результаты объединять, то необходимо использовать функцию Format.
Переменная var
Вы можете создавать переменные в формуле и использовать их в других формулах
Рассмотрим пример
<var a NestedElements:Category(Doors)>:{a}:[Марка]:Distinct:OrderBy:ListTo(,):&:{a}:[Площадь:AsDouble]:Sum:ToM2:Format(Марки:{0} Общая площадь={1})
В данном примере используется ключевое слово var, заключенное в угловые скобки. Это говорит о том, что программа вычислит выражение 'NestedElements:Category(Doors)' и сохранит в переменную 'a'. Имя переменной указывается после слова var и разделяется пробелами. После переменной указывается формула.
Результат этой переменной можно использовать многократно в других вычислениях.
Чтобы обратиться к значению переменной необходимо указать ее в фигурных скобках {a} а затем задавать инструкции
{a}:[Марка]:Distinct:OrderBy:ListTo(,)
Здесь из переменной 'a' берется вычисленное значение это вложенные элементы. Затем определяются значения марок, далее исключаем все повторяющиеся марки
Distinct.
Затем сортируем марки по возрастанию OrderBy и преобразовываем полученный список марок в значения через запятую ListTo(,)
Также есть другое вычисление
{a}:[Площадь:AsDouble]:Sum:ToM2
В данной формуле выбираются элементы из переменной 'a' и далее вычисляется площадь из параметра 'Площадь'
Значения параметра извлекаем не как текст, а как числовые данные в футах ':AsDouble]' и определяем сумму значений 'Sum'. Полученное значение переводим в квадратные метры 'ToM2'.
Использование переменных позволяет вычислять формулу 'NestedElements:Category(Doors)' всего один раз и затем использовать ее результат многократно.
В завершении мы форматируем данные двух вычислений
Format(Марки:{0} Общая площадь={1})
Вы можете создавать несколько переменных
<var a NestedElements:Category(Doors)>:<var b Host:Mark>:{a}:[Марка]:Distinct:OrderBy:ListTo(,):&:{b}:Format(Марки:{a} Марка основы={b})
При форматировании можно использовать внутри фигурных скобок не номера вычислений,а имена переменных
Format(Марки:{a} Марка основы={b})
Еще один пример. Найдем для помещения длину плинтуса.
<var width NestedElements:Category(Doors):[type:BuiltInParameter.FURNITURE_WIDTH:AsDouble]:Sum>:Math([BuiltInParameter.ROOM_PERIMETER:AsDouble]-{width}):ToMm
<var width - в переменную 'width' будем сохранять ширину всех дверей.
NestedElements:Category(Doors) - находим все двери для помещения
:[type:BuiltInParameter.FURNITURE_WIDTH:AsDouble] - извлекаем ширину двери и результат получаем в футах
:Sum - полученные значения суммируем. Не забываем закрыть скобочку '>'
:Math([BuiltInParameter.ROOM_PERIMETER:AsDouble]-{width}) - Вычитаем из периметра помещения сумму длин проемов.
Внутри функции Math(...) - вычисляется математическая формула.
[BuiltInParameter.ROOM_PERIMETER:AsDouble] - периметр помещения.
{width} - вычисляем переменную width и используем полученное значение.
Разделитель списка {separator}
В формулах, в качестве разделителя списка используется символ '•'
Если необходимо соединять данные в список можно также использовать слово {separator} в фигурных скобках. Например:
Id(27545):{separator}:Id(94759)