Расскажу про операторы в фильтрах. Операторы — это «равно», «содержит» и так далее. То есть операторы, которыми мы формируем условия в фильтрах. Разберёмся, какие бывают операторы и в каких случаях какой подходит оптимальнее.

Скриншот для обложки статьи

Будет хорошо сначала ознакомиться с базовой статьёй про фильтры вида.

Перечень операторов

Буду показывать на примере Ревита 2025, так как иногда в фильтры добавляются новые операторы, а Ревит 2025 — самое свежее, что есть на момент выхода статьи.

Итак, в Ревите есть следующие операторы, парные буду указывать вместе:

  • параметр существует;
  • равно / не равно;
  • больше / меньше;
  • больше или равно / меньше или равно;
  • содержит / не содержит;
  • начинается с / не начинается с
  • заканчивается на / не заканчивается на;
  • имеет значение / без значения.

Для некоторых параметров могут быть специфические операторы, например для уровней:

  • равно / не равно;
  • выше / ниже;
  • ровно или выше / ровно или ниже;
  • имеет значение / без значения.

«Равно» и «не равно» анализируют имя уровня, а остальные операторы работают с отметкой уровня.

Таким образом перечень доступных операторов меняется от параметра к параметру. Больше всего операторов у текстовых параметров, меньше всего — у числовых. Это если брать самые часто применяемые в работе параметры. Всегда есть параметры, у которых может быть чуть больше или меньше операторов, например у «Важнейшая траектория» есть ещё операторы «связано с» и «не связано с». В работе он вам, скорее всего, никогда не пригодится, поэтому и фиг бы с ним.

Операторы для текстового параметра в фильтре вида
Операторы для параметра «Уровень» в фильтре вида

В спецификации операторы у фильтров те же.

Теперь давайте разбираться с логикой операторов.

Логика операторов

Давайте разбираться на примере текстового параметра.

Будем рассматривать эти операторы

Я возьму каждую пару операторов и расскажу о них. Очевидно, что оператор «не равно» работает так же, как «равно», но наоборот, поэтому на этом останавливаться не буду.

Параметр существует

Оператор проверяет, существует ли указанный параметр у элемента.

На самом деле, у меня не получилось придумать фильтра вида, чтобы проиллюстрировать этот оператор. Потому что, если у категории нет какого-то параметра, то и в фильтр параметр вывести нельзя. А вот в спецификацию по нескольким категориям можно, если параметр, как правило речь про общий параметр, существует хотя бы у пары элементов в разных категориях.

Возможно, в фильтрах вида и в фильтрах спецификаций один интерфейс, поэтому оператор есть и там, и там. Но вот для фильтров вида я применения этому оператору не нашёл.

Равно / не равно

Я называю такие операторы «строгими». Строгие операторы требуют полного вхождения значения, то есть нам нужно вписать текст, что у нас есть в параметре, абсолютно точно так же, как он написан в параметре.

Абстрактный пример: вам нужно вписать имя и фамилию в форму при регистрации, чтобы вас потом могли найти поиском. И вот этот поиск может работать либо по полному вхождению, либо по неполному.

Если он работает по полному вхождению, то в поиск нужно вбить ваши имя и фамилию абсолютно точно так же, как вы это делали при регистрации. Если написали там «Супер Ревитчик», то при поиске надо писать точно так же. Если написать «Ревитчик», «супер ревитчик», «Супкр Ревитчик», то всё это не сработает, вас не найдут в базе данных.

Соответственно, «равно / не равно» работают по полному вхождению, вам нужно вписать целиком значение параметра, чтобы «равно» выдало равенство и корректно отфильтровало элементы.

Но вписывать ничего и не нужно. Для этих операторов, а также для «больше / меньше», «больше или равно / меньше или равно» можно не вписывать значение, а выбрать из выпадающего списка, который предложит Ревит.

Это удобно, кроме того, я пользуюсь этим приёмом, чтобы в принципе посмотреть, а какие вообще у меня есть доступные значения в этом параметре, даже если по логике фильтра мне нужен другой оператор.

Эти операторы хороши, когда у вас есть одно одинаковое значение во всех элементах, которые надо фильтровать. Например, если у вас в проекте нет оборудования и сантехники, подключённых к разным системам, и семейства без общих вложенных. Такое может случиться в канальной вентиляции, когда у нас приток и вытяжка в разных системах. Но как только добавляются приточно-вытяжные установки, то всё становится сложнее.

Что делать в таких ситуациях, читайте в отдельных статьях про фильтрацию вентиляционных и трубопроводных систем, ссылки дам в конце материала.

Больше / меньше / больше или равно / меньше или равно

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

То есть буква Б будет «больше», чем буква «А», а буква «Д» — больше, чем «Б» и «А». Если используем буквенно-цифровое выражение, то цифры тоже обрабатываются, таким образом «Б2» будет больше, чем «Б1» или «А4».

В своей практике я редко пользовался этими операторами, так как решал задачи другими. Но чисто в теории с их помощью можно выделить какой-то диапазон систем внутри одного типа. Например, взять все системы, выходящие из одного коллектора, при условии, что у этих систем идут по порядку номера в имени.

Хотя есть один случай, когда этот оператор пригодится, об этом ниже.

Содержит / не содержит

В отличие от «равно / не равно» это нестрогие операторы. То есть вы можете написать «Ревитчик» и фильтр найдёт это вхождение в «Супер Ревитчик».

Этими операторами мы часто пользуемся при работе, потому что в инженерных системах есть оборудование и сантехника, они обычно подключаются к разным системам. Поэтому у них в имени системы будет значение через запятую — всё, что к ним подключено, например «В1,К1,Т3» для мойки или «П1,В1,П1» для приточно-вытяжной установки. Ревит ещё любит приписывать повторные имена систем вроде «П1,В1,П1». Ребята из компании «ВЕЗА» нашли способ, как это обходить, но рассказать они никому этот секрет не хотят.

Ребята, расскажите, это будет полезно сообществу, никакого конкурентного преимущества это вам не даёт, честное слово. Ваше оборудование закладывают точно не из-за этого.

Когда в системе есть такое оборудование, а нам нужно выделить и оставить на виде только одну систему, идеально подходит оператор «Не содержит». Если нужно оставить только систему В1, то делаем условие «не содержит В1» и всё — все элементы, кроме элементов систем В1, скроются. При этом оборудование в этой системе тоже останется, поскольку оно содержит не только другие имена систем, но и В1 тоже.

То есть нестрогий оператор может «поймать» значение в любом месте строки, ему неважно, это полное значение параметра или только его часть, будет там просто В1 или ПВ1. Но регистр важен, для компьютера «в1» и «В1» — разный набор символов.

Начинается с / Не начинается с

Это тоже нестрогий оператор, который работает, как «содержит», но поиск делает всегда с начала строки, условно идёт слева направо по буквам в тексте.

Строго говоря, для вас что «содержит», что «начинается с» даёт один и тот же результат, за исключением случаев, когда у вас в значении параметр какой-то текст может повторяться. Например «ШИНШИЛЛА» и «МАШИНА», здесь встречается «ШИ», в первом слове два раза в начале и в середине, во втором — один раз в середине. Не знаю, зачем я это поясняю, вы и так видите, где эти буквы тут.

Соответственно, если нужно выбрать только те элементы, у которых слог «ШИ» в начале, то вам нужен оператор «начинается с», потому что «содержит» недостаточно избирателен. Он ищет вхождение в любом месте текста, а «начинается с» обязательно проверяет, чтобы буквы шли с начала текста, а не в его середине.

«Начинается с» выбирает только одну трубу
А «содержит» выбирает все

Если вы программируете или работали со строками в Динамо, то явно заметили, что в программировании и Динамо есть операторы и ноды «startswith» — это вот оно.

Заканчивается на / Не заканчивается на

Ну чё, на, оператор «заканчивается на», на. Готовы, на?

Тут всё то же самое, что с «начинается с», но поиск идёт строго с конца строки. Если взять «МАШИНА» и «ГАМАШИ», то поиск по «заканчивается на «ШИ» вернёт нам «ГАМАШИ», слоги из середины слов не проходят. Вот так мы останемся с подштанниками и без машины. Ну ладно.

Имеет значение / Без значения

Это простые операторы, но они коварны. Если формально, то «имеет значение» проверяет параметр, если в нём есть любое значение, то возвращает нам «истину», независимо от того, какое там значение.

Коварство же заключается в том, что значение может быть для нас пустым, а для Ревита — нет. Когда речь про числовые параметры, то тут всё просто: числовой параметр в Ревите всегда имеет значение, если он добавлен в семейство. Там не бывает какой-то неопределённости. Числовой параметр не имеет значение, только если его по факту в семействе нет.

Например, параметр «ADSK_Масса». Если его добавить в семейство, у него либо 0, либо иное число. Если не добавлять, то его вообще нет. И вот в этом случае параметр не будет иметь значения. На скриншоте ниже есть обратный клапан, шаровой кран, фильтр и счётчик. Фильтр красит те элементы, у которых в семействе есть параметр «ADSK_Масса».

Есть только одна загвоздка — у счётчика этот параметр тоже есть. Но они не окрашиваются. Как будто Ревит не видит у элемента этот параметр. Меняю оператор на «без значения», и он тоже не красится. Почему? Не знаю, это выбивается из логики. Это первое коварство (ну или моя глупость).

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

Параметр добавился ко всем элементам, но он неактивен, он серый
В итоге фильтр не окрашивает эти элементы по «имеет значение»
А по «без значения» красит, то он фильтр не видит этот параметр активным

По факту этот параметр есть, но он неактивный. Пока вы явным образом не нажмёте на галочку и не сделаете её черной, либо не отключите её, то для Ревита тут значения как бы и нет. Будьте внимательны с этой коварной особенностью параметров.

То же самое может случиться с текстовыми параметрами, особенно теми, что мы добавляем через параметры проекта. Тут то же самое, просто визуально человеку ничего не понятно: ну пусто и пусто, значения нет. Но на деле для Ревита есть разница между текстом, состоящим из пустой строки "", и текстовым параметром, который как бы объявлен у элемента, но ещё ни разу не заполнялся.

Из-за этого возникают в том числе проблемы при сортировке в спецификации, когда у трубопроводов из сшитого полиэтилена и отводов-имитации гнутой трубы «ADSK_Группирование» разделяет эти элементы, даже если они в одной системе и с одним именем. Потому что у трубы параметр есть, но он неактивный, а у фитинга он есть и он активен, так как его добавляли в редакторе семейства. Просто у фитинга там пустая строка "", а у трубы — неактивная строка.

Создаю фильтр и не трогаю параметры трубы
Теперь вписываю значение в ADSK_Группирование, а потом тут же стираю его бэкспейсом, получаю пустую строку, но труба окрашивается, как будто значение какое-то есть. Для компьютера — да, для нас — нет
Вот параметр трубы, труба окрашивается, будто имеет значение

Вот это и коварство этих операторов, вернее, не их самих, а параметров в Ревите.

Так что же делать с тем счётчиком и трубой, как их обработать фильтром? Для этого надёжнее взять оператор «больше» и указать значение 0 для числовых параметров и оставить поле пустым для текстовых. В этом случае элементы окрасятся, как и должны были.

Когда проверяем не существование параметра, а его значение, то всё стабильнее и предсказуемее
Труба даже с пустой строкой не окрашивается, так как пустая строка не больше пустой строки, понимайте как хотите

Думаю, достаточно подробно объяснил про операторы в фильтрах. Пишите вопросы в комментарии, а лучше в чат блога, ссылка на картинке ниже.

Как и обещал в тексте выше, даю ссылки на статьи по фильтрации систем: