28 мая 2019 г.

Revit Семейство и Формулы

Создавая Revit Семейства, зачастую мы используем формулы, которыми описываем те или иные параметры объекта. Формулы могут быть полезны при создании Семейств, в которых необходимо установить соотношения между его параметрами или зафиксировать их определенные значения. Условные выражения дают дополнительную гибкость при проектировании. Однако, Семейства Revit в этом случае получаются более сложными и емкими, поэтому условные выражения следует использовать только при необходимости. Использование формул и создание сложных Семейств – не для слыбохарактерных. Хотя это и не ракетостроение, поработать со своим левым полушарием иногда тоже полезно).

Оказывается, не все хорошо разбираются в формулах Revit. Недавно мне задали вопрос о том, каким образом ограничить значение длины в Семействе. Этот вопрос побудил меня написать небольшой урок. Я постараюсь продемонстрировать основную концепцию. В дебри Семейства забираться не будем. Покажу лишь поверхностные принципы из возможных, а вот с функциями постараюсь поподробнее... Урок пройдет в 3 этапа. Сначала мы создадим Семейство, затем загрузим его в проект, а потом отредактируем его, используя формулы. Если вам приходилось работать в Excel или программировать что-либо, формулы не должны вызвать сложностей, так как в целом, здесь и там все очень похоже. Для тех, кто не сталкивался с этим, думаю, упражнение будет отправной точкой).

Для тех, кто не совсем понимает формулы, было бы неплохо иметь при себе список с примерами их использования для лучшей наглядности. Главное один раз понять суть. Именно с этого я и хотел бы начать. Продолжение ждите следом. Итак, поехали....
Формулы в Autodesk Revit
Функция IF.
Имеет следующий синтаксис: IF (<условие>, <результат если ИСТИНА>, <результат если ЛОЖЬ>)
Т.е., если <условие> (логическое выражение) выполняется, то значением параметра будет ИСТИНА и, наоборот, если <условие>не выполняется, параметр примет последнее значение - ЛОЖЬ.   
  • Обычное IF-условие
= IF (Длина < 300 мм, 200 мм, 40 мм)
Если значение "Длина" меньше, чем 300 мм, то значение параметра будет равным 200 мм
Если "Длина" больше, чем 300 мм, параметру будет присвоено значение 40 мм
  • IF со строковым (часто просто текстовым) параметром
= IF (Высота > 3000 мм, “Эта вещь высокая”, “Эта вещь - низкая”),    
Если параметр «Высота» больше, чем 3000 мм, параметру присвоится значение «Эта вещь высокая»
Если параметр «Высота» будет меньше чем 3000 мм, значение параметра будет «Эта вещь – низкая»

  • Вложенные операторы IF
= IF (Длина < 100 мм, 200 мм, IF (Длина < 150 мм, 250 мм, IF (Длина < 300 мм, 500 мм, 600 мм)))
Если Длина будет меньше, чем 100 мм, то у этого параметра будет значение 200 мм
Если Длина будет между 100 мм и 150 мм, то у этого параметра будет значение 250 мм
Если Длина будет между 150 мм и 300 мм, то у этого параметра будет значение 500 мм
Если Длина будет больше, чем 300 мм, то у этого параметра будет значение 600 мм
  • IF с условием типа Да / Нет
= Длина > 1000
Если Длина больше 1000, то оператор – ИСТИНА,  флажок Да/Нет выбран
Если Длина 1000 или еще меньше, то оператор – ЛОЖЬ, флажок Да/Нет НЕ отмечен
Например, случай, когда, Metal (металл) не может быть использован (не является Истиной) потому как, использован материал древесины Wood (Истина). Пользователем может быть выбран только один из этих двух материалов. Одновременно, один и второй выбраны быть не могут…

Рисунок 1.
Есть хороший пример у Ильи Глуханюк на блоге revitilution.blogspot.com:
Дано: А=Да, Б=Да, В=Да
Попробуем посчитать сумму для этих параметров... Если значение А, Б и В = Да, значит флажок на этих параметрах поставлен, а следовательно, они принимают значение ИСТИНА, которое в данном примере равняется 1. Имеем:
Сумма = IF(А, 1, 0) + IF(Б, 1, 0) + IF(В, 1, 0) = 1 + 1 + 1 = 3
Дано: А=Да, Б=Да, В=Нет
Здесь два параметра принимают значение 1 (Истина), а один параметр значение 0 (Ложь). Соответственно,
Сумма = IF(А, 1, 0) + IF(Б, 1, 0) + IF(В, 1, 0) = 1 + 1 + 0 = 2
  • IF и логический оператор OR (ИЛИ)
= IF (OR (А = 1, В = 3), 10, 5)
 Если А = 1 или B = 3, у этих параметров будет значение 10
 Если A не равно = 1, или B не равно 3, то у этих параметров будет значение 5
Достаточно выполнить одно из условий
  • IF и логический оператор AND (И)
= IF (AND (x = 1, y = 2), 8, 3)   
Если x = 1 и y = 2, у этих параметра будет значение 8
Если x не равно 1, и y не равен 2, то у этих параметров будет значение 3
Выполняться должны оба условия
Дополнительно
  • Выборка Одного Из…

Рисунок 2.
Здесь condition number (номер условия) позволит только одному параметру быть Истиной в списке.  Ассоциировав с Типом, вы можете управлять множеством вещей, просто выбирая правильный Тип.
  • «Не изменяйте меня»
Если вам нужен какой-то текст, значение которого вы по каким-либо причинам не хотите давать пользователю на легкое редактирование, поместите его в колонку Формулы, разместив в кавычках после знака равно (= «Do Not Change»). В столбце значений он отобразится серым.

Рисунок 3.

Сложение + (= a + b)
Вычитание – (= a - b)
Умножение * (= a * b)
Деление / (= a / b)
Возведение в степень ^ (= x^y - число x возводится в степень y))
Логарифм log (= log(a))
Корень квадратный sqrt (= sqrt(36) - квадратный корень от 36)
Синус sin (= sin(значение угла))
Косинус cos (= cos(a))
Тангенс tan (= tan(a))
Арксинус asin (= asin(a))
Арккосинус acos (= acos(a))
Арктангенс atan (= atan(a))
Экспонирование exp (возведение числа e (= 2,71) в степень x)
Абсолютное значение (модуль числа) abs (= abs(b/a))

> - больше
< - меньше
= - равно
Not – Логическое Не
На текущий момент не поддерживаются операторы "<=" и ">=". Однако, эти операторы может заменить логический оператор "NOT". Например, неравенство a<=b можно записать как NOT(a > b).
  • Для значений в формулах можно использовать функцию округления
round(x) Функция round возвращает значение, округленное до ближайшего целого числа. При этом не учитывается направление округления.
round(3.1) = 3
round(3,5) = 4
round(-3.7) = -4
roundup(x) Функция roundup возвращает значение, округленное до максимального целого значения, большего или равного•х.
roundup(3) = 3
roundup(3.1) = 4
roundup(-3.7) = -3
rounddown(x) Функция rounddown возвращает значение, округленное до минимального встроенного значения, меньшего или равного х.
rounddown(3) = 3
rounddown(3.7) = 3
rounddown(-3.7) = -4
Примеры использования условных выражений
Чаще всего условные выражения в формулах используются для вычисления количественных показателей (длина, площадь, объем…), а также для управления видимостью элементов в зависимости от значений параметров. Например, с помощью условных выражений можно:
•    Исключить снижение значения меньше 2.
В Revit, количество элементов массива должно быть целым числом, большим или равным 2.
В определенных ситуациях удобно применить формулу с условным выражением, которое сохраняет значение параметра, равное 2, даже если в результате вычислений этот параметр принимает значение 1 или 0. Если вычисленное значение параметра равняется 2 и более, то оно сохраняется. Если же вычисленное значение равно 1 или 0, то формула преобразует его в 2.
Формула: Кол-во_элементов_массива = IF (Параметр_массива < 2, 2, Параметр_массива)
•    Включить видимость средников окна только если количество створок больше 1.
Например, имеется параметр "Количество_створок", от значения которого будет зависеть видимость средников.
В этом случае можно создать параметр типа "Да/Нет", который можно назвать, например,
"Видимость_средников". Затем в диалоговом окне "Свойства элемента" для геометрии средника этот параметр нужно назначить параметру "Видимо". Поскольку параметр "Видимость_средников" выполняет логическую операцию "Да/Нет", в формуле записываются условие (IF) и результаты. Если условие выполняется, то флажок
(параметр) "Видимость_средников" устанавливается, а геометрия средников становится видимой. Если условие не выполняется, то флажок (параметр) "Видимость_средников" снимается, а видимость геометрии средников отключается.
Формула: Видимость_средников = Количество_створок > 1


Надеюсь, с формулами все понятно. Давайте теперь закончим правилами, которые применяются к формулам.
Правила в формулах Revit
1)    Между каждым параметром и математическим действием должен быть пробел. Например, Параметр = А + В, а не =А+В.
2)    Имя параметра чувствительно к правильному написанию. Заполняйте его точно. В противном случае, это будут разные, независимые друг от друга, параметры
3)    Если вы создаете формулу, чтобы заблокировать значение параметра, как, например, из примера, показанного ниже на рисунке 4 (параметр Awning Panel Width = 900 mm), это значение будет заблокировано для ВСЕХ Типов в пределах этого Семейства. Применять такую практику хорошо к значениям, которые должны соответствовать всем Типам. Например, вы создаете комплект окон и хотите, чтобы во всем наборе в каждом окне была одинаковая глубина рамы.
 4)    Опирайтесь на стандартные математические правила. Заключайте различные друг от друга арифметические действия в скобки. Например, как на том же рисунке 4: (Width – 2 * Awning Panel Width) / 3
5)    Параметры экземпляра не могут быть включены в формулу для определения значения Параметра, который является параметром Типа.

Вроде бы ничего не забыл...
Теперь давайте перейдем непосредственно к созданию и редактированию Семейства, используя формулы... Читайте следующий пост.

Источник: revitmep.livejournal.com