04_Язык IFCQL
IFCQL - внедрение языка в BIMIT
Общее описание
IFCQL - это язык запросов к объектной модели здания, представленной в формате IFC
Формат представления логического выражения соответствует подмножеству спецификации JPQL (язык запросов к объектной базе данных)
https://openjpa.apache.org/builds/3.2.2/apache-openjpa/docs/index.html#jpa_langref_cond
Семантика операндов максимально приближена к формату IDS
Имена переменных и их значения
имена переменных могут содержать символы А-Я, а-я, A-Z, a-z, _,-,(,),#, $, ‘,’, ‘ ‘, [,],|, ,\
имена переменных (и их частей) в строке выражения должны быть взяты в символ двойные кавычки (при наличии в них символа пробела, точки, слеша скобок, или одинарной кавычки ), например:
property."Размеры"."Ширина ступени (в мм. или ‘ ) / ширина марша" > 200.23
Если внутри имени содержится двойная кавычка, то ее необходимо маскировать левым слешем - \”
значения переменных могут содержать символы А-Я, а-я, A-Z, a-z, _,-,(,),#, $, ‘,’, ‘ ‘, \ [,],|, ;, δ,Ø
значения переменных в строке выражения должны быть взяты в символ двойные кавычки, если переменная строковая:
"200 (мм.)"
Если внутри имени содержится двойная кавычка, то ее необходимо маскировать левым слешем - \”
Операторы выражения
!= | |
| |
| || |
Операнды выражения
| |||
| |||
| |||
- Parent – элемент, находящийся на один уровень выше по дереву элементов.
- Child – элемент, находящийся на один уровень ниже по дереву элементов.
- Ancestor – элемент, который находится выше по дереву элементов.
- Descendant – элемент, который находится ниже по дереву элементов.

Для элемента BuildingStorey элементы Site и Building являются Ancestors, при этом Building выступает в роли Parent.
Элементы Beam, Column и WallStandartCase являются Descendants, при этом Beam и Column являются Childs.

Происходит поиск родственника с указанным IFC-классом, содержащим конкретный атрибут.
Имена переменных (и их частей) в строке выражения должны быть взяты в символ двойные кавычки (при наличии в них символа пробела, точки, слеша скобок, или одинарной кавычки ), например:
property."Размеры"."Ширина ступени (в мм. или ‘ ) / ширина марша" > 200.23
Пример IFCQL
| Параметр | Выбор сравнения | Пример ifcql |
| Модель | Любая | model is any |
| Равно | model = "АР-АР" | |
| Не равно | model != "КР" | |
| Содержит | model like "АР" | |
| Не содержит | model not like "КР" | |
Этаж
| Равно | floor = 'Этаж 2' |
| Не равно | floor != 'Этаж 3' | |
| Содержит | floor like '2' | |
| Не содержит | floor not like '3' | |
IFC-тип
| Равно | entity = 'IfcWindow' |
| Не равно | entity != 'IfcWindow' | |
| Содержит | entity like 'window' | |
| Не содержит | entity not like 'pile' | |
Зона
| Равно | zone = '318' |
| Не равно | zone != 1111 | |
| Содержит | zone like 31 | |
| Не содержит | zone not like 4 | |
Слои
| Равно | layer = 'A-GLAZ-____-OTLN' |
| Не равно | layer != 'glaz' | |
| Содержит | layer like 'glaz' | |
| Не содержит | layer not like 'door' | |
| Атрибут | Равно | property."IFC_0_Идентификация_Несколько категорий"."8. Категория" = 'Окна' |
| Не равно | property."IFC_0_Идентификация_Несколько категорий"."8. Категория" != 'Дверь' | |
| Больше | property.OverallWidth > 590 | |
| Меньше | property.OverallWidth < 3000 | |
| Больше или равно | property.OverallWidth >= 600 | |
| Меньше или равно | property.OverallWidth <=2740 | |
| Содержит | property.OverallWidth like 0 or property.OverallWidth like 5 | |
| Не содержит | property.OverallWidth not like "string" | |
| Имеет значение | property.OverallWidth not null | |
| Не имеет значения | property."IFC_0_Идентификация_Несколько категорий"."Атрибут" is null | |
| Значение из набора | property.OverallWidth in ("2740", "2220", "1960", "1180", "1000", "975", "600") | |
| Строка | typeOf(property."IFC_0_Идентификация_Несколько категорий"."1. Семейство и типоразмер", string) | |
| Число | typeOf(property.OverallWidth, double, mm) | |
| Диапазон | typeOf(property.OverallWidth, range, 600, 3000) | |
| Классификатор | classification = "Классификатор/1-1" | |
Геометрия
| Равно | geom.TotalSurfaceArea = 11.5888045433455 |
| Не равно | geom.TotalSurfaceArea != 9999 | |
| Больше | geom.TotalSurfaceArea > 1 | |
| Меньше | geom.TotalSurfaceArea < 42 | |
| Больше или равно | geom.TotalSurfaceArea >= 1.3808 | |
| Меньше или равно | geom.TotalSurfaceArea <= 42 | |
| Содержит | geom.TotalSurfaceArea not null | |
| Не содержит | geom.TotalSurfaceArea is null | |
| Идентификация | ||
| Идентификатор элемента IFC | Равно | identification.propIfcId = '1frPR7$Cv8DvigHLricagB' |
| Не равно | identification.propIfcId != '1frPR7$Cv8DvigHLricagB' | |
| Содержит | identification.propIfcId like 'cagB' | |
| Не содержит | identification.propIfcId not like 'true' | |
| Элемент из набора | identification.propIfcId in ("1iEabr5VfAtezMZlBWDYPn", "1iEabr5VfAtezMZlBWDYyZ", "1iEabr5VfAtezMZlBWDYPs") | |
| Идентификатор элемента ревизии | Равно | identification.propId = "8cab2777-d21e-4544-b4e8-d1dfaf63292e" |
| Не равно | identification.propId != "857b6c89-8141-4c30-9735-94f679eac2a2" | |
| Содержит | identification.propId like "292e" | |
| Не содержит | identification.PropId not like "true" | |
| Название элемента | Равно | identification.propName = "Воздуховод прямоугольного сечения:ADSK_Без огнезащиты_Врезки_ГОСТ 14918-80:1636934" |
| Не равно | identification.propName != "Воздуховод" | |
| Содержит | identification.propName like "Воздуховод" | |
| Не содержит | identification.propName not like "Дверь" | |
| Группировка | Равно | group = "Окна" |
| Не равно | group != "Окна" | |
| Содержит | group like "Окна" | |
| Не содержит | group not like "Окна" | |
| Материалы | Равно | material = "ADSK_Изоляция_Минеральная_KNAUF INSULATION ПРОФ TS 0,34" and material = "ADSK_Изоляция_Воздух" |
| Не равно | material != "Базовая стена:ADSK_Наружная_Кирпич640_Гляссе:612459" | |
| Содержит | material like "Изоляция" | |
| Не содержит | material not like "Бетон" | |
| Система | Равно | system = "B1" |
| Не равно | system != "B12" | |
| Содержит | system like "B1" | |
| Не содержит | system not like "B12" | |
| Дисциплины | Равно | discipline = "АР" |
| Не равно | discipline != "КР" | |
| Содержит | discipline like "АР" | |
| Не содержит | discipline not like "КР" | |
| Комплексные примеры | Выборка: Поиск всех окон на 1 этаже. Условие: Проверка, что их высота > 1000 мм и ширина < 800 мм | entity = "IfcWindow" and floor = "Этаж 1" attribute.OverallHeight > 1000 and attribute.OverallWidth < 800 |
| Пример написания формулы | ((property."МОГЭ_Геометрические параметры".Периметр / 100) / (100 / 3)) + 2 > 5.62 | |
| Пример написания child | child.IfcMaterialLayer.property."Название элемента" like "Изоляция" | |
| child.IfcMaterialLayer.property.Name like "Изоляция" | ||
| Пример написания ancestor | ancestor.ifcBuilding.property.Name like "школа" |