bim
Основной интерфейс для получения и работы с данными проекта: модели, элементы и их геометрия, этажи, коллизии, задачи, пользователи. В данном интерфейсе доступны следующие методы:
Проект и модели
- getProject - взятие проекта, на котором выполняется плагин
- getGeometryProject - взятие данных о проекте с данными по геометрии: границы и размеры границ по осям OX, OY, OZ
- getProjectHashSum - взятие хэша сборки проекта
- getProjectXmlFile - получение ТЭП XML-файла, привязанного к проекту
- getProjectModels - взятие всех активных моделей проекта
- getModels - получение моделей из структуры проекта
- getModelsGeometry - получение моделей с данными по геометрии
- getGeometryModel - взятие данных о модели по её идентификатору с данными по геометрии
- getModelRevisions - взятие всех ревизий модели
- getModelNamesTree - получение дерева моделей по элементу
- setUsedRevision - установка ревизий, из которых будут браться элементы
- getLogicGroupsFromProject - получение логических групп текущего проекта
Условия поиска
- createCondition - функция создания условия поиска элементов
- testElements - проверка, существуют ли элементы, соответствующие условию
- getCondition - добавление к строке IFCQL условия по списку моделей
Элементы
- getElements - функция получения списка элементов с полной информацией
- getElement - функция получения полной информации об элементе
- getAllElementsByListUuidAndProjectUuid - взятие данных об элементах по списку их идентификаторов
- getUuidsElementsByProjectUuid - взятие всех идентификаторов элементов проекта
- getElementsByModelUuid - получение списка элементов модели
- getElementByClassNamesAndModel - получение элементов модели по именам IFC-классов
- getElementByParentAndElementClassName - получение элементов по родителю и имени IFC-класса
- findAncestor - получение предка (родителя) элемента
- findDescendants - получение наследников элемента
- getSuspectElements - получение списка подозрительных элементов проекта
Элементы с геометрией
- getGeometryElements - функция получения списка элементов с полной информацией и параметрами геометрии
- getGeometryElement - функция получения полной информации об элементе и параметров геометрии
- getGeometryElementA - элемент стороны А для расчёта коллизий
- getGeometryElementB - элемент стороны B для расчёта коллизий
- getGeometryElementByClassNamesAndModel - элементы модели с геометрией по именам IFC-классов
- getGeometryElementByParentAndElementClassName - элементы с геометрией по родителю и имени IFC-класса
- getGeometryElementsByModelsAndClassNames - элементы с геометрией по набору моделей и именам IFC-классов
- getGeometryElementsByModelAndFloors - элементы с геометрией по модели и этажам
- getGeometryElementsByModelAndFloorsAndClassNames - элементы с геометрией по модели, этажам и именам IFC-классов
- getGeometryElementsByModelAndParentsAndClassNames - элементы с геометрией по модели, родителям и именам IFC-классов
- getGeometryElementsByRevision - элементы с геометрией по ревизии модели
Точная геометрия (сетки треугольников)
- getGeometryObject - функция получения координат элемента для формирования объёмной модели или отрисовки на экране
- getGeometryObjects - функция получения списка координат элементов для формирования объёмной модели или отрисовки на экране
- getGeometryObjectsMap - то же, что getGeometryObjects, но в виде карты «UUID элемента → геометрия»
- getOrientedBoundingBoxes - получение ориентированных ограничивающих боксов (OBB) элементов по условию
- getElementPolygonsCountByUuid - получение количества полигонов элемента
Атрибуты
- getAttributeValueByElementsAndNames - значение атрибута элемента по имени набора и имени атрибута
- getGeometryElementAttributeValue - значение атрибута элемента по имени (поиск по всему дереву атрибутов)
- getElementAttributeChildValue - значение атрибута элемента по имени (рекурсивный поиск)
- getElementPSetValue - набор атрибутов элемента по имени
- addAttribute - добавление атрибутов для списка элементов
Этажи
- getFloors - возвращает все этажи проекта
- getFloor - возвращает этаж конкретного элемента
- getBuildingStoreysFloors - возвращает этажи по идентификаторам элементов IfcBuildingStorey
- getElementFloor - определение этажа элемента из заданного списка этажей
- testSameFloor - проверка, находятся ли два элемента на одном этаже
- extractFloorNameNumber - извлечение номера этажа из его названия
Отображение на модели
- showElements - функция отображения на экране списка элементов (выбор/подсветка на модели)
- createGroupElements - создание (объединение) элементов в группы с указанием цвета в формате HEX
- showGroupElements - функция отображения/подсветки на экране ранее созданных групп элементов
3D-виды и чертежи
- getDrawingOnModels - получение списка 3D-видов
- getDrawingOnModelTags - получение списка тегов 3D-видов
- getDrawingOnModelTagsByDrawingOnModelUuid - получение тегов конкретного 3D-вида
- getDrawingNameAndPage - получение имени чертежа и номера листа
Коллизии и правила проверки
- getProjectCollisions - функция получения списка коллизий проекта
- getModelCollisions - функция получения списка коллизий модели
- getCollisionsForReport - функция получения списка коллизий для отчёта
- getCollisionInfo - получение объекта CollisionInfo для коллизии, назначенной к задаче
- filterGeometryElementsToCheck - отбор элементов для проверки с учётом родительского правила (цепочки проверок)
- filterGeometryObjectToCheck - то же для геометрических объектов
- setRuleParam - заполнение параметров встроенного правила (RuleParam)
Задачи
- getProjectTasks - получение списка всех задач проекта
- getTask - получение задачи по её идентификатору
- getTasks - получение списка задач
- getTasksTree - получение дерева задач проекта
- getWorkSpacesCurrentProject - получение идентификаторов рабочих пространств проекта
- getTasksCurrentWorkSpace - получение списка задач рабочего пространства
- getTasksTreeCurrentWorkspace - получение дерева задач рабочего пространства
- getLateTasks - получение списка всех просроченных задач, либо задач на эскалации
- getFirstEscalationTasks - получение списка просроченных задач (первая эскалация)
- getSecondEscalationTasks - получение списка задач второй эскалации
- saveTask - создание и/или сохранение задачи
- getLinkToTask - получение ссылки на проект с параметрами для открытия конкретной задачи
- getTaskComments - получение списка всех комментариев задачи
- getTaskAttachments - получение списка всех вложений задачи
- getCommentFromTaskAttachment - получение текста комментария из sourceData вложения
- getTaskForm - получение списка данных формы задачи
- getTaskWorkers - получение списка профилей исполнителей задачи
- getFilesDownloadLinks - получение списка ссылок на скачивание файлов, вложенных в задачи проекта
- editTokenExpiredDate - изменение срока действия токена для скачивания файлов
Пользовательские статусы и параметры задач
- registerProcessStatuses - регистрация списка пользовательских статусов задач
- initPluginTaskStatus - инициализация пользовательских статусов в проекте
- getProcessStatuses - получение списка пользовательских статусов для активного рабочего пространства
- setPluginStatusToTask - изменение пользовательского статуса задачи
- saveParamsToTask - сохранение пользовательских параметров задачи
- getParamsToTask - получение списка параметров задачи
- getTaskParams - получение списка параметров всех задач рабочего пространства
- editParam - редактирование параметра задачи
- deleteParam - удаление параметра задачи
- deleteParams - удаление параметров
Пользователи и группы организации
- getProfile - получение данных о пользователе по его идентификатору
- getProfiles - получение данных о пользователях по их идентификаторам
- getOrgGroups - получение списка групп организации
- getOrgGroup - получение группы организации
- setGroupResponderToTask - назначение группы организации ответственным за задачу
- setGroupWorkersToTask - назначение групп организации исполнителями задачи
- deleteDutyShift - удаление назначенной к задаче группы, название которой содержит указанную строку
Техническое обслуживание (ТО)
- getProjectMaintenanceTasks - получение списка всех задач ТО проекта
- getMaintenanceTasks - получение списка задач ТО по списку идентификаторов
- getOrCreateTaskFromMaintenance - создание или получение задачи на запланированное ТО
- calculateDuty - получение номера дежурной группы
Даты и вспомогательные методы
- getStartDate - получение даты на начало следующего дня
- getEndDate - получение даты на конец следующего дня
- getAmountDate - получение даты через указанное количество дней
- getDate - получение даты из строки
- getDateTime - получение даты и времени из строки
- getRuDate - получение даты в RU-формате
- parseOptionValueToList - преобразование значения поля мультивыбора формы в список
- convertStringUuidToUUID - конвертация строковых идентификаторов в UUID
Справочники
getElement, getFloor и т.п. Наборы (Set) в результатах не упорядочены — для сортировки используйте, например, elements.sort { it.name }.Проект и модели
- bim.getProject() →
Project- метод возвращает следующую структуру:
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| uuid | UUID | идентификатор проекта | getUuid() |
| alias | String | уникальное название английское | getAlias() |
| title | String | заголовок | getTitle() |
| description | String | описание | getDescription() |
| color | String | цвет метки проекта | getColor() |
| preview | String | ссылка на картинку превью проекта | getPreview() |
| createDate | Instant | дата создания | getCreateDate() |
| editDate | Instant | дата последнего редактирования | getEditDate() |
| profileUuid | UUID | идентификатор пользователя автора проекта | getProfileUuid() |
Пример использования:
def project = bim.getProject()
def editProjectDate = project.getEditDate()
console.info(editProjectDate.toString())
// -> "INFO: 2022-01-01T01:01:12.567Z"
- bim.getGeometryProject() →
GeometryProject- содержит все поля getProject и дополнительно:
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| boundSizeX | double | длина проектной модели вдоль оси ОХ | getBoundSizeX() |
| boundSizeY | double | длина проектной модели вдоль оси ОY | getBoundSizeY() |
| boundSizeZ | double | длина проектной модели вдоль оси ОZ | getBoundSizeZ() |
| bounds | Bounds | структура границы проектной модели (см. getGeometryElement) | getBounds() |
Пример использования:
def geometryProject = bim.getGeometryProject()
def bounds = geometryProject.getBounds()
console.info("Размер по X: " + geometryProject.getBoundSizeX())
- bim.getProjectHashSum() →
String- хэш меняется при изменении состава моделей проекта; его можно сохранить и сравнивать при следующих запусках, чтобы понять, менялся ли проект
Пример использования:
def hash = bim.getProjectHashSum()
console.info("Хэш сборки проекта: " + hash)
- bim.getProjectXmlFile() →
String- содержимое XML-файла в base64; разбирается вспомогательным классомXMLParser
Пример использования:
def xml = bim.getProjectXmlFile()
if (xml) {
def errors = XMLParser.validateXML(xml)
def xmlMap = XMLParser.parseXMLBase64ToMap(xml)
}
- bim.getProjectModels() →
List<Model>
model (getModel()) каждой модели — их нужно обходить рекурсивно. Встроенные правила проверок сопоставляют модели по title.Пример использования:
def flattenModels(def model, List acc = []) {
acc.add(model)
model.model?.each { flattenModels(it, acc) }
return acc
}
def start() {
def listModels = bim.getProjectModels()
def allModels = listModels.collectMany { flattenModels(it) }
for (Model model : allModels) {
console.info(model.getUuid().toString() + " " + model.getTitle())
// -> "INFO: 4e733308-7ddd-11ec-90d6-0242ac120003 АР"
}
}
- bim.getModels() →
List<Model>- выполняет тот же запрос, что и getProjectModels, результат одинаковый (только модели верхнего уровня)
Пример использования:
def models = bim.getModels()
models.each { m -> console.info(m.title) }
- bim.getModelsGeometry() →
List<GeometryModel>- модели с полями getGeometryModel (границы и размеры границ)
Пример использования:
def models = bim.getModelsGeometry()
models.each { m -> console.info(m.title + ": " + m.boundSizeX + " x " + m.boundSizeY + " x " + m.boundSizeZ) }
- bim.getGeometryModel(UUID modelUuid) →
GeometryModel
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| uuid | UUID | идентификатор модели | getUuid() |
| name | String | наименование модели | getName() |
| title | String | заголовок модели | getTitle() |
| archived | boolean | признак нахождения модели в архиве | isArchived() |
| offsetX | double | смещение модели по оси X | getOffsetX() |
| offsetY | double | смещение модели по оси Y | getOffsetY() |
| offsetZ | double | смещение модели по оси Z | getOffsetZ() |
| eulerX | double | Эйлеровский поворот модели вокруг оси OX | getEulerX() |
| eulerY | double | Эйлеровский поворот модели вокруг оси OY | getEulerY() |
| eulerZ | double | Эйлеровский поворот модели вокруг оси OZ | getEulerZ() |
| sortOrder | int | порядок сортировки модели в своем уровне | getSortOrder() |
| realOffsetX | double | смещение модели по оси X с учетом родительского смещения | getRealOffsetX() |
| realOffsetY | double | смещение модели по оси Y с учетом родительского смещения | getRealOffsetY() |
| realOffsetZ | double | смещение модели по оси Z с учетом родительского смещения | getRealOffsetZ() |
| realEulerX | double | Эйлеровский поворот модели вокруг оси OX с учетом родительского поворота | getRealEulerX() |
| realEulerY | double | Эйлеровский поворот модели вокруг оси OY с учетом родительского поворота | getRealEulerY() |
| realEulerZ | double | Эйлеровский поворот модели вокруг оси OZ с учетом родительского поворота | getRealEulerZ() |
| model | List<Model> | подмодели | getModel() |
| boundSizeX | double | длина модели вдоль оси ОХ | getBoundSizeX() |
| boundSizeY | double | длина модели вдоль оси ОY | getBoundSizeY() |
| boundSizeZ | double | длина модели вдоль оси ОZ | getBoundSizeZ() |
| bounds | Bounds | структура границы модели (см. getGeometryElement) | getBounds() |
Пример использования:
def geometryModel = bim.getGeometryModel(UUID.fromString("ac178efe-7e8d-11ec-90d6-0242ac120003"))
def bounds = geometryModel.getBounds()
- bim.getModelRevisions(UUID modelUuid) →
List<ModelRevision>
Пример использования:
def listModelRevisions = bim.getModelRevisions(UUID.fromString("4e733308-7ddd-11ec-90d6-0242ac120003"))
for (ModelRevision modelRevision : listModelRevisions) {
def modelRevisionUuid = modelRevision.getUuid()
console.info(modelRevisionUuid.toString() + " v" + modelRevision.getVersion())
// -> "INFO: 697ba2b6-7ddd-11ec-90d6-0242ac120003 v1"
}
- bim.getModelNamesTree(UUID elementUuid) →
String- строка с именами моделей, к которым относится элемент - bim.getModelNamesTree(String elementUuid) →
String- то же по строковому идентификатору; строка, не являющаяся UUID, вызывает исключение
Пример использования:
def task = bim.getTask(UUID.fromString("c73df7aa-7ddd-11ec-90d6-0242ac120003"))
def modelName = task.entityId ? bim.getModelNamesTree(task.entityId) : ""
- bim.setUsedRevision(Collection<UUID> uuids) - задаёт ревизии моделей, из которых берутся элементы в
getElements,getGeometryElements,showElementsиcreateGroupElements(по условию). Если ревизии не заданы (или передан пустой список), используются последние ревизии
bim.setUsedRevision([]).Пример использования:
def model = bim.getProjectModels()[0]
def firstRevision = bim.getModelRevisions(model.uuid).min { it.version }
bim.setUsedRevision([firstRevision.uuid])
def oldWalls = bim.getElements('entity = "IfcWall"')
bim.setUsedRevision([])
def newWalls = bim.getElements('entity = "IfcWall"')
console.info("Стен было: " + oldWalls.size() + ", стало: " + newWalls.size())
- bim.getLogicGroupsFromProject() →
Set<LogicGroup>- логические группы (условия поиска) проекта; их можно передавать в методы выборки
Пример использования:
def groups = bim.getLogicGroupsFromProject()
for (def lg : groups) {
console.info(ifcql.createIfcqlFromLogicGroup(lg) + " -> " + bim.getElements(lg).size())
}
Условия поиска
- bim.createCondition(String axis, String operator, String axisValue) →
LogicGroup- по параметру поиска, оператору сравнения и значению для поиска - bim.createCondition(String axis, String attrName, String operator, String attrValue) →
LogicGroup- по параметру поиска по атрибуту, наименованию атрибута, оператору сравнения и значению атрибута - bim.createCondition(String axis, String attrGrpName, String attrName, String operator, String attrValue) →
LogicGroup- по параметру поиска по атрибуту, наименованию группы атрибутов (набора), наименованию атрибута, оператору сравнения и значению атрибута - bim.createCondition(String axis, String operators) →
LogicGroup- сокращённая форма: оператор записывается символом внутри строки, например"OverallHeight>=1000"или"=Этаж 1"(символьные операторы — см. Операторы сравнения)
Условия объединяются операторами & (И) и | (ИЛИ). Вместо условия во все методы выборки можно передать строку IFCQL (см. ifcql).
bim.createCondition("attribute", "Width", "gt", 1000) вызовет ошибку, число нужно передавать как "1000" (или "" + value). Неизвестный параметр поиска (например, опечатка) молча превращается в class, неизвестный оператор — в eq.class поиск идёт по именам IFC-классов, найденным в проекте; если ничего не найдено, вернётся пустое условие. В моделях IFC2x3 стены часто имеют класс IfcWallStandardCase — для надёжности используйте bim.createCondition("class", "cont", "IfcWall").Примеры использования:
def conditionWall = bim.createCondition("class", "eq", "IfcWall")
def conditionDoor = bim.createCondition("class", "eq", "IfcDoor")
bim.showElements(conditionWall | conditionDoor)
def elementCondition = bim.createCondition("attribute", "width", "gt", "1000")
bim.showElements(elementCondition)
def elementCondition = bim.createCondition("attribute", "BaseQuantities", "width", "gt", "1000")
bim.showElements(elementCondition)
def high = bim.createCondition("attribute", "OverallHeight>=1000")
def floor1 = bim.createCondition("floor", "=Этаж 1")
def elements = bim.getElements(high & floor1)
- bim.testElements(LogicGroup lg) →
boolean- по условию поиска - bim.testElements(String expression) →
boolean- по выражению IFCQL
Пример использования:
if (!bim.testElements('entity = "IfcSpace"')) {
console.info("В проекте нет помещений")
}
- bim.getCondition(String baseCondition, Set<String> modelNames) →
String- возвращает строкуbaseCondition + " and " + modelNames[0] + " or " + modelNames[1] ...; элементыmodelNames, кроме первого, уже содержащиеся вbaseCondition, пропускаются. Если список пуст, возвращаетсяbaseCondition
modelNames должны быть готовыми фрагментами IFCQL (например, model = "АР"), а при нескольких моделях приоритет and/or может дать не ту выборку. Надёжнее собрать выражение самостоятельно со скобками.Пример использования:
def condition = bim.getCondition('entity = "IfcWall"', ['model = "АР"'] as Set)
// -> 'entity = "IfcWall" and model = "АР"'
def walls = bim.getElements(condition)
Элементы
- bim.getElements(LogicGroup logicGroup) →
Set<ElementExternal>- по условию поиска (в том числе сложному) - bim.getElements(String expression) →
Set<ElementExternal>- по выражению IFCQL - bim.getElements(Collection<Object> elements) →
Set<ElementExternal>- по списку идентификаторов: UUID, строк-UUID или IFC GlobalId
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| uuid | UUID | идентификатор элемента | getUuid() |
| globalId | String | глобальный идентификатор элемента (IFC GlobalId) | getGlobalId() |
| name | String | наименование элемента | getName() |
| longName | String | полное наименование элемента | getLongName() |
| description | String | описание элемента | getDescription() |
| elementClass | UUID | идентификатор класса элемента | getElementClass() |
| elementClassName | String | наименование класса элемента ifc | getElementClassName() |
| elementClassTitle | String | наименование класса элемента | getElementClassTitle() |
| stringValue | String | значение элемента для атрибутных элементов в строковом виде | getStringValue() |
| doubleValue | double | значение элемента для атрибутных элементов в численном виде, если преобразование возможно, иначе будет 0 | getDoubleValue() |
| project | UUID | идентификатор проекта | getProject() |
| model | UUID | идентификатор модели | getModel() |
| modelRevision | UUID | идентификатор ревизии модели | getModelRevision() |
| buildingStorey | UUID | идентификатор элемента этажа (IfcBuildingStorey) | getBuildingStorey() |
| parent | UUID | идентификатор родительского элемента | getParent() |
| children | Set | дочерние элементы: атрибуты и группы атрибутов | getChildren() |
Значение атрибута: element.getAttribute("Набор/Свойство") (никогда не возвращает null: при отсутствии атрибута имя пустое, stringValue — "", doubleValue — 0), несколько значений сразу — element.getAttributes("Свойство1", "Набор/Свойство2") → Map.
Примеры использования:
def conditionWall = bim.createCondition("class", "eq", "IfcWall")
def listWalls = bim.getElements(conditionWall)
for (ElementExternal element : listWalls) {
def globalId = element.getGlobalId()
console.info(globalId)
// -> "INFO: 0Dtdg2chjBhhgnQ7zCqZkk"
}
def doors = bim.getElements('entity = "IfcDoor" and floor like "1"')
doors.each { d -> console.info(d.name + ": " + d.getAttribute("Pset_DoorCommon/FireRating").stringValue) }
def elements = new HashSet<Object>()
elements.add(UUID.fromString("e5a114d0-7de1-11ec-90d6-0242ac120003"))
elements.add("0Dtdg2chjBhhgnQ7zCqZkk")
def listElements = bim.getElements(elements)
for (ElementExternal element : listElements) {
console.info(element.getGlobalId())
}
- bim.getElement(UUID elementUuid) →
ElementExternal - bim.getElement(String elementStrUuid) →
ElementExternal- для строки, не являющейся UUID, возвращаетnull
Примеры использования:
def element = bim.getElement(UUID.fromString("e5a114d0-7de1-11ec-90d6-0242ac120003"))
def globalId = element.getGlobalId()
// console.info(globalId) -> "INFO: 0Dtdg2chjBhhgnQ7zCqZkk"
def element = bim.getElement("e5a114d0-7de1-11ec-90d6-0242ac120003")
def globalId = element.getGlobalId()
// console.info(globalId) -> "INFO: 0Dtdg2chjBhhgnQ7zCqZkk"
- bim.getAllElementsByListUuidAndProjectUuid(Collection<UUID> listUuidElements) →
Set<ElementExternal>
Пример использования:
def uuids = bim.getUuidsElementsByProjectUuid().take(100)
def elements = bim.getAllElementsByListUuidAndProjectUuid(uuids)
- bim.getUuidsElementsByProjectUuid() →
Set<UUID>
Пример использования:
def elemUuidsByProj = bim.getUuidsElementsByProjectUuid()
console.info("Элементов в проекте: " + elemUuidsByProj.size())
- bim.getElementsByModelUuid(UUID modelUuid) →
Set<ElementExternal>
Пример использования:
def model = bim.getProjectModels()[0]
def elements = bim.getElementsByModelUuid(model.uuid)
console.info(model.title + ": " + elements.size())
- bim.getElementByClassNamesAndModel(UUID model, Set<String> elementClassNames) →
Set<ElementExternal>
Пример использования:
def model = bim.getProjectModels()[0]
def elements = bim.getElementByClassNamesAndModel(model.uuid, ["IfcDoor", "IfcWindow"] as Set)
- bim.getElementByParentAndElementClassName(UUID parent, String elementClassName) →
Set<ElementExternal>
Пример использования:
def storey = bim.getElements('entity = "IfcBuildingStorey"').find { it.name == "Этаж 1" }
def walls = bim.getElementByParentAndElementClassName(storey.uuid, "IfcWall")
- bim.findAncestor(ElementExternal element) →
ElementExternal- то же, чтоbim.getElement(element.parent)
Пример использования:
def door = bim.getElements('entity = "IfcDoor"')[0]
def parent = bim.findAncestor(door)
console.info(parent?.elementClassName + " " + parent?.name)
- bim.findDescendants(ElementExternal element) →
Set<ElementExternal>
Пример использования:
def storey = bim.getElements('entity = "IfcBuildingStorey"')[0]
def descendants = bim.findDescendants(storey)
console.info(storey.name + ": " + descendants.size())
- bim.getSuspectElements() →
Set<ElementExternal>- по всему проекту - bim.getSuspectElements(UUID modelUuid) →
Set<ElementExternal>
modelUuid игнорируется: обе перегрузки возвращают подозрительные элементы всего проекта. Для одной модели отфильтруйте результат по element.model.Пример использования:
def model = bim.getProjectModels()[0]
def suspects = bim.getSuspectElements().findAll { it.model == model.uuid }
return bim.showElements(new ArrayList(suspects))
Элементы с геометрией
- bim.getGeometryElements(LogicGroup logicGroup) →
Set<GeometryElement>- по условию поиска (в том числе сложному) - bim.getGeometryElements(String expression) →
Set<GeometryElement>- по выражению IFCQL - bim.getGeometryElements(Collection<Object> elements) →
Set<GeometryElement>- по списку UUID или строк-UUID
elements*.uuid.Примеры использования:
def conditionWall = bim.createCondition("class", "eq", "IfcWall")
def listWalls = bim.getGeometryElements(conditionWall)
for (GeometryElement geometryElement : listWalls) {
def globalId = geometryElement.getGlobalId()
// console.info(globalId) -> "INFO: 0Dtdg2chjBhhgnQ7zCqZkk"
def volumeElement = geometryElement.getVolume()
// console.info(volumeElement.toString()) -> "INFO: 0.1"
}
def windows = bim.getGeometryElements('entity = "IfcWindow"').findAll { it.area > 2 }
def doors = bim.getElements('entity = "IfcDoor"')
def listElements = bim.getGeometryElements(new ArrayList(doors*.uuid))
for (GeometryElement geometryElement : listElements) {
console.info(geometryElement.getName() + ": " + geometryElement.getVolume())
}
- bim.getGeometryElement(UUID elementUuid) →
GeometryElement - bim.getGeometryElement(String elementStrUuid) →
GeometryElement- для строки, не являющейся UUID, возвращаетnull
GeometryElement содержит все поля getElements и дополнительно:
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| area | double | площадь поверхности элемента | getArea() |
| volume | double | объем элемента | getVolume() |
| areaX | double | площадь элемента вдоль оси OX | getAreaX() |
| areaY | double | площадь элемента вдоль оси OY | getAreaY() |
| areaZ | double | площадь элемента вдоль оси OZ (проекция на план) | getAreaZ() |
| largeArea | double | максимальная площадь элемента из осей | getLargeArea() |
| largeDirect | String | направление максимальной поверхности | getLargeDirect() |
| boundSizeX | double | расстояние границ вдоль оси OX | getBoundSizeX() |
| boundSizeY | double | расстояние границ вдоль оси OY | getBoundSizeY() |
| boundSizeZ | double | расстояние границ вдоль оси OZ | getBoundSizeZ() |
| obbX, obbY, obbZ | double | размеры ориентированного бокса (OBB) по его осям | getObbX(), getObbY(), getObbZ() |
| obbMax | double | максимальный габарит элемента по OBB | getObbMax() |
| bounds | Bounds | структура границ | getBounds() |
Структура границ Bounds:
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| min | Vector3f | вектор координат x, y, z минимальной точки границы | getMin() |
| max | Vector3f | вектор координат x, y, z максимальной точки границы | getMax() |
| double[ ] | центр границ | getCenter() | |
| double[ ] | размеры границ по осям | getLength() |
area, volume и габаритов задаёт модель (обычно м², м³, м). Какая из сторон OBB является «длиной» линейного элемента, не гарантируется — для длины используйте obbMax или атрибут длины из модели.Пример использования:
def geometryElement = bim.getGeometryElement(UUID.fromString("e5a114d0-7de1-11ec-90d6-0242ac120003"))
def globalId = geometryElement.getGlobalId()
// console.info(globalId) -> "INFO: 0Dtdg2chjBhhgnQ7zCqZkk"
def volumeElement = geometryElement.getVolume()
// console.info(volumeElement.toString()) -> "INFO: 0.1"
- bim.getGeometryElementA() →
GeometryElement- элемент, идентификатор которого передан в параметреelementa; если параметра нет, возвращаетnull
Пример использования:
def geometryElement = bim.getGeometryElementA()
if (geometryElement != null) {
def globalId = geometryElement.getGlobalId()
// console.info(globalId) -> "INFO: 16BLvbdfv9tvbtZs9KMly$"
def volumeElement = geometryElement.getVolume()
// console.info(volumeElement.toString()) -> "INFO: 1.34"
}
- bim.getGeometryElementB() →
GeometryElement- элемент, идентификатор которого передан в параметреelementb; если параметра нет, возвращаетnull
Пример использования:
def geometryElement = bim.getGeometryElementB()
if (geometryElement != null) {
def globalId = geometryElement.getGlobalId()
// console.info(globalId) -> "INFO: 16BLvbdfv9tvbtZs9KMly$"
def volumeElement = geometryElement.getVolume()
// console.info(volumeElement.toString()) -> "INFO: 1.01"
}
- bim.getGeometryElementByClassNamesAndModel(UUID model, Set<String> elementClassNames) →
Set<GeometryElement>
Пример использования:
def model = bim.getProjectModels()[0]
def slabs = bim.getGeometryElementByClassNamesAndModel(model.uuid, ["IfcSlab"] as Set)
- bim.getGeometryElementByParentAndElementClassName(UUID parent, String elementClassName) →
Set<GeometryElement>
Пример использования:
def storey = bim.getElements('entity = "IfcBuildingStorey"').find { it.name == "Этаж 1" }
def spaces = bim.getGeometryElementByParentAndElementClassName(storey.uuid, "IfcSpace")
- bim.getGeometryElementsByModelsAndClassNames(Set<UUID> models, Set<String> ifcNames) →
Set<GeometryElement>
Пример использования:
def modelUuids = bim.getProjectModels().findAll { it.title in ["АР", "КР"] }*.uuid as Set
def walls = bim.getGeometryElementsByModelsAndClassNames(modelUuids, ["IfcWall", "IfcWallStandardCase"] as Set)
- bim.getGeometryElementsByModelAndFloors(UUID model, Set<UUID> parentUuids) →
Set<GeometryElement>-parentUuids— идентификаторы элементов этажей (IfcBuildingStorey), как в полеbuildingStoreyэлемента
Пример использования:
def spaces = bim.getGeometryElements('entity = "IfcSpace"')
def space = spaces[0]
def sameFloor = bim.getGeometryElementsByModelAndFloors(space.model, [space.buildingStorey] as Set)
- bim.getGeometryElementsByModelAndFloorsAndClassNames(UUID model, Set<UUID> buildStoreys, Set<String> elementClassNames) →
Set<GeometryElement>-buildStoreys— идентификаторы элементов этажей (IfcBuildingStorey)
Пример использования:
def storeys = bim.getElements('entity = "IfcBuildingStorey"')
def model = bim.getProjectModels()[0]
def storeyUuids = storeys.findAll { it.model == model.uuid }*.uuid as Set
def doors = bim.getGeometryElementsByModelAndFloorsAndClassNames(model.uuid, storeyUuids, ["IfcDoor"] as Set)
- bim.getGeometryElementsByModelAndParentsAndClassNames(UUID model, Set<UUID> parentUuids, Set<String> elementClassNames) →
Set<GeometryElement>
Пример использования:
def wall = bim.getGeometryElements('entity = "IfcWall"')[0]
def openings = bim.getGeometryElementsByModelAndParentsAndClassNames(wall.model, [wall.uuid] as Set, ["IfcOpeningElement"] as Set)
- bim.getGeometryElementsByRevision(UUID revisionUuid) →
Set<GeometryElement>
Пример использования:
def model = bim.getProjectModels()[0]
def lastRevision = bim.getModelRevisions(model.uuid).max { it.version }
def elements = bim.getGeometryElementsByRevision(lastRevision.uuid)
Точная геометрия (сетки треугольников)
GeometryObject возвращается в миллиметрах, в отличие от полей GeometryElement, единицы которых задаёт модель.- bim.getGeometryObject(UUID elementUuid) →
GeometryObject- результат кэшируется на время запуска плагина
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| uuid | UUID | идентификатор элемента | getUuid() |
| name | String | наименование элемента | getName() |
| indices | int[ ] | геометрические индексы, указывающие на позицию координат точки в массиве вершин (координаты вершин треугольника идут тройками: 1,2,3 вершина и т.д) | getIndices() |
| vertices | double[ ] | массив координат вершин (координаты идут тройками подряд X,Y,Z,X,Y,Z,...) | getVertices() |
| normals | float[ ] | массив нормалей вершин | getNormals() |
| colorsQuantized | int[ ] | индексы цветовой раскраски триангулированной геометрии | getColorsQuantized() |
| colors | float[ ] | массив цветов | getColors() |
| koeff | double | коэффициент трансформации координат (м в мм) | getKoeff() |
| bounds | Bounds | структура границ | getBounds() |
| int | метод получения длины массива индексов | getLength() | |
| long | метод получения количества треугольников геометрии | getTrianglesCount() |
Пример использования:
def geometryObject = bim.getGeometryObject(UUID.fromString("e5a114d0-7de1-11ec-90d6-0242ac120003"))
console.info("Треугольников: " + geometryObject.getTrianglesCount())
- bim.getGeometryObjects(LogicGroup logicGroup) →
Set<GeometryObject>- по условию поиска (в том числе сложному) - bim.getGeometryObjects(String expression) →
Set<GeometryObject>- по выражению IFCQL - bim.getGeometryObjects(Collection<Object> elements) →
Set<GeometryObject>- по списку UUID или строк-UUID - bim.getGeometryObjects(LogicGroup logicGroup, boolean needCache) →
Set<GeometryObject> - bim.getGeometryObjects(String expression, boolean needCache) →
Set<GeometryObject> - bim.getGeometryObjects(Collection<Object> elements, boolean needCache) →
Set<GeometryObject>
При needCache = true полученная геометрия сохраняется в кэш, и последующие вызовы getGeometryObject для этих элементов не обращаются к серверу.
elements*.uuid.Пример использования:
def condition = bim.createCondition("class", "eq", "IfcWall")
def geometryObjects = bim.getGeometryObjects(condition)
def pipes = bim.getGeometryElements('entity like "IfcPipe"')
def meshes = bim.getGeometryObjects(new ArrayList(pipes*.uuid), true)
- bim.getGeometryObjectsMap(Collection<Object> elements) →
Map<UUID, GeometryObject>- по списку UUID или строк-UUID; один запрос вместо вызова getGeometryObject для каждого элемента
Пример использования:
def pipes = bim.getGeometryElements('entity like "IfcPipe"')
def objMap = bim.getGeometryObjectsMap(new ArrayList(pipes*.uuid))
pipes.each { p ->
def mesh = objMap[p.uuid]
if (mesh == null) return // у элемента нет геометрии
console.info(p.name + ": " + mesh.getTrianglesCount())
}
- bim.getOrientedBoundingBoxes(String expression) →
Set<GeometryObject>- по выражению IFCQL; каждый OBB возвращается какGeometryObject(мм)
Пример использования:
def boxes = bim.getOrientedBoundingBoxes('entity = "IfcBeam"')
boxes.each { b -> console.info(b.uuid.toString() + ": " + b.getVertices().length / 3 + " вершин") }
- bim.getElementPolygonsCountByUuid(UUID elementUuid) →
Long
Пример использования:
def count = bim.getElementPolygonsCountByUuid(UUID.fromString("e5a114d0-7de1-11ec-90d6-0242ac120003"))
console.info("Полигонов: " + count)
Атрибуты
- bim.getAttributeValueByElementsAndNames(ElementExternal elementExternal, String pSetName, String attrName) →
String- строковое значение атрибутаpSetName/attrName;null, если набора или атрибута нет
Пример использования:
def walls = bim.getElements('entity = "IfcWall"')
walls.each { w ->
def fireRating = bim.getAttributeValueByElementsAndNames(w, "Pset_WallCommon", "FireRating")
console.info(w.name + ": " + (fireRating ?: "не задано"))
}
- bim.getGeometryElementAttributeValue(GeometryElement geometryElement, String propName) →
String- ищет атрибут по имени по всему дереву атрибутов (в ширину); пустые значения, а такжеNOTDEFINED,Unknown,отсутствуетсчитаются отсутствующими — тогда возвращаетсяnull
Пример использования:
def doors = bim.getGeometryElements('entity = "IfcDoor"')
doors.each { d -> console.info(d.name + ": " + bim.getGeometryElementAttributeValue(d, "OverallHeight")) }
- bim.getElementAttributeChildValue(ElementExternal elementExternal, String propName) →
String- рекурсивный поиск атрибута по имени; пустые значения,NOTDEFINED,Unknown,отсутствуетсчитаются отсутствующими — тогда возвращаетсяnull
NullPointerException на атрибутах без дочерних элементов. Надёжнее использовать element.getAttribute("Набор/Свойство") или getGeometryElementAttributeValue.Пример использования:
def element = bim.getElement(UUID.fromString("e5a114d0-7de1-11ec-90d6-0242ac120003"))
def tag = bim.getElementAttributeChildValue(element, "Tag") ?: ""
- bim.getElementPSetValue(ElementExternal elementExternal, String psetName) →
ElementAttribute- набор атрибутов верхнего уровня с указанным именем илиnull
Пример использования:
def element = bim.getElements('entity = "IfcWall"')[0]
def pset = bim.getElementPSetValue(element, "Pset_WallCommon")
pset?.children?.each { a -> console.info(a.name + " = " + a.stringValue) }
- bim.addAttribute(Collection<Object> elements, String groupName, String attributeName, Object value, String unit, String power) →
boolean-elements— элементы, UUID, строки-UUID или IFC GlobalId;groupName— имя набора атрибутов;unit— имя из справочника UnitType,power— имя из справочника PowerType
Пример использования:
def walls = bim.getElements('entity = "IfcWall"')
bim.addAttribute(new ArrayList(walls), "Проверки", "Проверено", "да", "USERDEFINED", "NULL")
Этажи
- bim.getFloors() →
List<Floor>
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| floorUuid | UUID | идентификатор этажа | getFloorUuid() |
| name | String | имя этажа | getName() |
| elevation | double | отметка (высота) этажа | getElevation() |
| absElevation | double | абсолютная отметка этажа | getAbsElevation() |
| elements | Set<UUID> | идентификаторы элементов IfcBuildingStorey, входящих в этаж | getElements() |
Floor.elements — это не элементы этажа, а идентификаторы элементов IfcBuildingStorey (один этаж проекта объединяет одноимённые уровни разных моделей). Связь элемента с этажом — через поле элемента buildingStorey.Пример использования:
def floors = bim.getFloors()
for (def floor : floors) {
console.info(floor.getName())
console.info(floor.getElevation())
console.info(floor.getAbsElevation())
}
def storeyToFloor = [:]
bim.getFloors().each { f -> f.elements?.each { storeyToFloor[it] = f } }
def doors = bim.getElements('entity = "IfcDoor"')
doors.each { d -> console.info(d.name + ": " + storeyToFloor[d.buildingStorey]?.name) }
- bim.getFloor(UUID elementUuid) →
Floor- по идентификатору элемента - bim.getFloor(ElementExternal element) →
Floor- по самому элементу
element.buildingStorey (или используйте getElementFloor).Пример использования:
def conditionModel = bim.createCondition("model", "eq", "АР")
def elements = bim.getGeometryElements(conditionModel)
for (def element : elements) {
def floor = bim.getFloor(element)
double offset = floor.getElevation() + 18.5
}
- bim.getBuildingStoreysFloors(Set<UUID> buildingStoreyUuids) →
Set<Floor>
Пример использования:
def spaces = bim.getElements('entity = "IfcSpace"')
def floors = bim.getBuildingStoreysFloors(spaces*.buildingStorey.findAll { it != null } as Set)
floors.each { f -> console.info(f.name) }
- bim.getElementFloor(GeometryElement geometryElement, List<Floor> floors) →
Floor- этаж, вelementsкоторого входитbuildingStoreyэлемента, илиnull; выполняется без запроса к серверу
Пример использования:
def floors = bim.getFloors()
def spaces = bim.getGeometryElements('entity = "IfcSpace"')
spaces.each { s -> console.info(s.name + ": " + bim.getElementFloor(s, floors)?.name) }
- bim.testSameFloor(Floor floor, GeometryElement geometryElement1, GeometryElement geometryElement2) →
boolean-true, еслиbuildingStoreyобоих элементов входит в указанный этаж
Пример использования:
def floors = bim.getFloors()
def door = bim.getGeometryElements('entity = "IfcDoor"')[0]
def space = bim.getGeometryElements('entity = "IfcSpace"')[0]
def floor = bim.getElementFloor(door, floors)
if (floor != null && bim.testSameFloor(floor, door, space)) {
console.info("Дверь и помещение на одном этаже: " + floor.name)
}
- bim.extractFloorNameNumber(String storeyName) →
Integer- первое целое число в названии после удаления отметок с дробной частью (+3.300,-0,150);0, если числа нет;-Integer.MAX_VALUEдля пустого названия
Пример использования:
bim.extractFloorNameNumber("Этаж 3 (+6.600)") // 3
bim.extractFloorNameNumber("-1 этаж") // -1
def sorted = bim.getFloors().sort { bim.extractFloorNameNumber(it.name) }
Отображение на модели
start(), — результат bim.showElements(...) или bim.showGroupElements().- bim.showElements(LogicGroup logicGroup) →
Set<String>- по условию поиска (в том числе сложному) - bim.showElements(String expression) →
Set<String>- по выражению IFCQL - bim.showElements(Collection<Object> elements) →
Set<String>- по списку элементов (ElementExternal/GeometryElement), UUID, строк-UUID или IFC GlobalId; допускаетсяSet - bim.showElements(ElementExternal... elements) →
Set<String>- по одному или нескольким элементам, перечисленным через запятую - bim.showElement(ElementExternal element) →
Set<String>- показ одного элемента
Примеры использования:
def conditionWall = bim.createCondition("class", "eq", "IfcWall")
def conditionDoor = bim.createCondition("class", "eq", "IfcDoor")
return bim.showElements(conditionWall | conditionDoor)
return bim.showElements('entity = "IfcDoor" and floor like "1"')
return bim.showElements(["dhb487dbcsndb", "salndhkjfnjkenkjsd", "sdfsdfadsdfsad"])
return bim.showElements([UUID.fromString("ac178efe-7e8d-11ec-90d6-0242ac120003"), UUID.fromString("e5a114d0-7de1-11ec-90d6-0242ac120003")])
def elementCondition = bim.createCondition("attribute", "width", "gt", "1000")
def elements = bim.getElements(elementCondition)
return bim.showElements(elements)
- bim.createGroupElements(String color, LogicGroup logicGroup) - цвет, условие поиска
- bim.createGroupElements(String color, List<ElementExternal> elements) - цвет, список элементов
- bim.createGroupElements(String color, Set<String> elements) - цвет, набор идентификаторов элементов (строки)
Цвет задаётся в формате #RRGGBB. Созданные группы отображаются методом showGroupElements.
Set) элементов передавать нельзя — он попадёт в перегрузку с идентификаторами и вызовет ошибку. Элементы оборачивайте в список: new ArrayList(set). Список строк-идентификаторов, наоборот, передавайте набором: ids as Set.Примеры использования:
def conditionDoor = bim.createCondition("class", "eq", "IfcDoor")
bim.createGroupElements("#FF9933", conditionDoor)
return bim.showGroupElements()
def conditionDoor = bim.createCondition("class", "eq", "IfcDoor")
def elements = bim.getElements(conditionDoor)
bim.createGroupElements("#FF9933", new ArrayList(elements))
return bim.showGroupElements()
bim.createGroupElements("#FF9933", ["dhb487dbcsndb", "salndhkjfnjkenkjsd", "sdfsdfadsdfsad"] as Set)
return bim.showGroupElements()
- bim.showGroupElements() →
List<GroupElements>- группы, созданные методом createGroupElements
Пример использования:
def start() {
bim.createGroupElements("#FF0000", bim.createCondition("class", "eq", "IfcDoor"))
def big = bim.getGeometryElements('entity = "IfcWindow"').findAll { it.area > 2 }
bim.createGroupElements("#00AA00", new ArrayList(big))
return bim.showGroupElements()
}
3D-виды и чертежи
- bim.getDrawingOnModels() →
List<DrawingOnModel>- основные поля:uuid,title,modelUuid,drawingPageUuid,parentUuid,isFolder,baseElevation
Пример использования:
def views = bim.getDrawingOnModels()
views.findAll { !it.isFolder() }.each { v -> console.info(v.title) }
- bim.getDrawingOnModelTags() →
List<DrawingOnModelTag>- поля:drawingOnModelUuid,name,value,projectUuid
Пример использования:
def showOnlyLayers = bim.getDrawingOnModelTags().findAll { it.name == "Этаж" }.size() > 0
- bim.getDrawingOnModelTagsByDrawingOnModelUuid(UUID drawingOnModelUuid) →
List<DrawingOnModelTag>
Пример использования:
def view = bim.getDrawingOnModels()[0]
def tags = bim.getDrawingOnModelTagsByDrawingOnModelUuid(view.uuid)
tags.each { t -> console.info(t.name + " = " + t.value) }
- bim.getDrawingNameAndPage(UUID drawingPage) →
String
Пример использования:
def view = bim.getDrawingOnModels().find { it.drawingPageUuid != null }
if (view) {
console.info(bim.getDrawingNameAndPage(view.drawingPageUuid))
}
Коллизии и правила проверки
- bim.getProjectCollisions() →
List<Collision> - bim.getProjectCollisions(String key) →
List<Collision>- с указанием нужного статуса коллизий
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| uuid | UUID | идентификатор коллизии | getUuid() |
| status | CollisionStatus: NEW, WORK, SOLVED, ALLOWED | статус коллизии | getStatus() |
| elementAUuid | UUID | идентификатор элемента стороны 1, если есть | getElementAUuid() |
| elementBUuid | UUID | идентификатор элемента стороны 2, если есть | getElementBUuid() |
| modelAUuid | UUID | идентификатор модели стороны 1, если есть | getModelAUuid() |
| modelBUuid | UUID | идентификатор модели стороны 2, если есть | getModelBUuid() |
| globalIdA | String | глобальный идентификатор элемента стороны 1, если есть | getGlobalIdA() |
| globalIdB | String | глобальный идентификатор элемента стороны 2, если есть | getGlobalIdB() |
| createDate | Instant | дата формирования коллизии | getCreateDate() |
| shortDescription | String | краткое описание коллизии | getShortDescription() |
| description | String | описание коллизии | getDescription() |
| finder | String | идентификатор расчетного механизма, по которому получена коллизия | getFinder() |
| type | String | тип коллизии | getType() |
| value | String | значение коллизии | getValue() |
| note | String | заметка по коллизии | getNote() |
| lastUpdateDate | Instant | дата последнего изменения по коллизии | getLastUpdateDate() |
| isAcceptable | Boolean | флаг приемлемости коллизии | getIsAcceptable() |
Примеры использования:
def listCollisions = bim.getProjectCollisions()
for (def c : listCollisions) {
def globalIdA = c.getGlobalIdA()
// console.info(globalIdA) -> "INFO: 0Dtdg2chjBhhgnQ7zCqZkk"
def globalIdB = c.getGlobalIdB()
// console.info(globalIdB) -> "INFO: js89njhsihd9ffsd3kmll9hln0"
}
def listCollisions = bim.getProjectCollisions("NEW")
for (def c : listCollisions) {
console.info(c.getGlobalIdA() + " / " + c.getGlobalIdB())
}
- bim.getModelCollisions(UUID modelUuid) →
List<Collision>- по идентификатору модели - bim.getModelCollisions(UUID modelUuid, String key) →
List<Collision>- по идентификатору модели и статусу коллизий
Примеры использования:
def listCollisions = bim.getModelCollisions(UUID.fromString("ac178efe-7e8d-11ec-90d6-0242ac120003"))
for (def c : listCollisions) {
console.info(c.getGlobalIdA() + " / " + c.getGlobalIdB())
}
def listCollisions = bim.getModelCollisions(UUID.fromString("ac178efe-7e8d-11ec-90d6-0242ac120003"), "NEW")
for (def c : listCollisions) {
console.info(c.getGlobalIdA() + " / " + c.getGlobalIdB())
}
- bim.getCollisionsForReport() →
CollisionsReport- коллизии для отчёта текущего пользователя:collisions— список коллизий,tableSettings— настройки колонок таблицы. Результат передаётся в file.collisionsToPdf
Пример использования:
def collisionList = bim.getCollisionsForReport()
def param = [:]
param.put("pageSize", "3")
param.put("fontSize", "12")
file.collisionsToPdf(template, collisionList, param)
- bim.getCollisionInfo(UUID collisionUuid) →
CollisionInfo- поля:uuid,collisionUuid,description
Пример использования:
def attachments = bim.getTaskAttachments(task.uuid)
for (def attachment : attachments) {
if (attachment.collision != null) {
def collisionInfo = bim.getCollisionInfo(attachment.collision)
console.info(collisionInfo.description)
}
}
- bim.filterGeometryElementsToCheck(int parentOption, Set<Object> parentElemUUids, Set<GeometryElement> ruleElements) →
Set<GeometryElement>
Используется в правилах проверки с цепочкой проверок: parentOption и список parentElements приходят в params. Если parentElemUUids пуст или null, возвращаются ruleElements. При parentOption = 1, 2 или 3 возвращаются элементы родительского правила, входящие в ruleElements; при 0 — ruleElements.
parentOption приходит числом либо строкой "-1" — разбирайте через строку: Integer.parseInt((params.get("parentOption") ?: "-1").toString()). Фильтруйте этим методом только проверяемый набор: вспомогательные выборки (мебель, окружающие стены) фильтровать не нужно.Пример использования:
int parentOption = Integer.parseInt((params.get("parentOption") ?: "-1").toString())
def parentRaw = params.get("parentElements")
Set parentElemUuids = (parentRaw instanceof Collection) ? (parentRaw as Set) : null
def ruleElements = bim.getGeometryElements(params.get("spaceCondition"))
def elements = bim.filterGeometryElementsToCheck(parentOption, parentElemUuids, ruleElements)
- bim.filterGeometryObjectToCheck(int parentOption, Set<Object> parentElemUUids, Set<GeometryObject> ruleElements) →
Set<GeometryObject>- аналог filterGeometryElementsToCheck дляGeometryObject
Пример использования:
int parentOption = Integer.parseInt((params.get("parentOption") ?: "-1").toString())
def parentRaw = params.get("parentElements")
Set parentElemUuids = (parentRaw instanceof Collection) ? (parentRaw as Set) : null
def meshes = bim.getGeometryObjects('entity = "IfcSpace"')
def toCheck = bim.filterGeometryObjectToCheck(parentOption, parentElemUuids, meshes)
- bim.setRuleParam(String condition, Map<String, Object> paramsMap) →
RuleParam-conditionзаписывается вmainCondition(если неnull),paramsMap— вparams(если не пуст)
Используется при подготовке параметров встроенного правила Element Wall Validation Rule: метод вызывается для каждой строки настроек, ключи в paramsMap — с индексом строки (startOption0, operator0 …), а результаты собираются в карту paramsMap правила.
Пример использования:
def ruleParams = [:] // параметры встроенного правила
def paramsMap = [:] as LinkedHashMap
for (int i = 0; i < 12; i++) {
if (!params.get("startOption" + i)) continue
def map = [:] as LinkedHashMap
map.put("startOption" + i, params.get("startOption" + i))
map.put("endOption" + i, params.get("endOption" + i))
map.put("directionOption" + i, params.get("directionOption" + i))
map.put("operator" + i, params.get("operator" + i))
map.put("distanceValue" + i, Double.parseDouble((params.get("distanceValue" + i) ?: "0").toString()))
paramsMap.put("ruleParams" + i, bim.setRuleParam("Default_Condition", map))
}
ruleParams.put("paramsMap", paramsMap)
Задачи
- bim.getProjectTasks() →
List<Task>- каждая задача представляет из себя следующую структуру:
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| uuid | UUID | идентификатор задачи | getUuid() |
| title | String | заголовок задачи | getTitle() |
| name | String | наименование задачи | getName() |
| description | String | описание задачи | getDescription() |
| responderUuid | UUID | идентификатор пользователя, на которого назначена задача | getResponderUuid() |
| creatorUuid | UUID | идентификатор пользователя, создавшего задачу | getCreatorUuid() |
| priority | PriorityType: LOW, NORMAL, HIGH | приоритет задачи | getPriority() |
| taskType | TaskType: TASK, BUG, IMPROVEMENT | тип задачи | getTaskType() |
| createDate | Instant | дата создания задачи | getCreateDate() |
| completeStatus | CompleteStatusType: NEW, DISCUSS, PROGRESS, READY, CLOSED | статус задачи | getCompleteStatus() |
| pluginStatus | String | пользовательский статус задачи | getPluginStatus() |
| startDate | Instant | дата начала задачи | getStartDate() |
| stopDate | Instant | дата окончания задачи | getStopDate() |
| escalationDate | Instant | дата эскалации | getEscalationDate() |
| worldX | double | координаты метки, привязанной к задаче | getWorldX() |
| worldY | double | координаты метки, привязанной к задаче | getWorldY() |
| worldZ | double | координаты метки, привязанной к задаче | getWorldZ() |
| entityId | String | идентификатор элемента, если есть | getEntityId() |
| responder | Profile | ответственный за задачу | getResponder() |
| workers | List<Profile> | исполнители | getWorkers() |
| groupResponder | OrgGroupFullDTO | ответственная группа | getGroupResponder() |
| groupWorkers | List<OrgGroupFullDTO> | группы исполнителей | getGroupWorkers() |
| children | List<Task> | подзадачи | getChildren() |
Пример использования:
def listTasks = bim.getProjectTasks()
for (Task task : listTasks) {
def taskUuid = task.getUuid()
// console.info(taskUuid.toString()) -> "INFO: c73df7aa-7ddd-11ec-90d6-0242ac120003"
}
- bim.getTask(UUID taskUuid) →
Task
Пример использования:
def task = bim.getTask(mainTask.taskUuid)
- bim.getTasks(List<UUID> taskUuids) →
List<Task>- по списку идентификаторов - bim.getTasks(String startDate, String endDate) →
List<Task>- все задачи за заданный период; даты принимаются в форматахdd.MM.yyyy,yyyy-MM-ddили ISO-8601 (2026-09-01T00:00:00Z)
Пример использования:
def tasks = bim.getTasks(taskUuidsList)
def tasks = bim.getTasks("01.09.2026", "30.09.2026")
children)- bim.getTasksTree() →
List<Task>
Пример использования:
def tasksTree = bim.getTasksTree()
tasksTree.each { t -> console.info(t.title + ": подзадач " + (t.children?.size() ?: 0)) }
- bim.getWorkSpacesCurrentProject() →
List<UUID>
Пример использования:
def workSpaceUuids = bim.getWorkSpacesCurrentProject()
- bim.getTasksCurrentWorkSpace(UUID workSpaceUuid) →
List<Task>
Пример использования:
def workSpaceUuid = bim.getWorkSpacesCurrentProject()[0]
def tasks = bim.getTasksCurrentWorkSpace(workSpaceUuid)
- bim.getTasksTreeCurrentWorkspace(UUID workSpaceUuid) →
List<Task>
Пример использования:
def workSpaceUuid = bim.getWorkSpacesCurrentProject()[0]
def currentTasksTree = bim.getTasksTreeCurrentWorkspace(workSpaceUuid)
- bim.getLateTasks() →
List<Task>
Пример использования:
def taskList = bim.getLateTasks()
- bim.getFirstEscalationTasks() →
List<Task>
Пример использования:
def firstEscalationTasks = bim.getFirstEscalationTasks()
- bim.getSecondEscalationTasks() →
List<Task>
Пример использования:
def secondEscalationTasks = bim.getSecondEscalationTasks()
- bim.saveTask(Task task) →
Task- создаёт новую задачу или изменяет существующую; дальше работайте с возвращённым объектом
Пример использования:
def task = new Task()
task.title = "Проверить узел"
task.startDate = bim.getStartDate()
task.stopDate = bim.getEndDate()
task = bim.saveTask(task)
- bim.getLinkToTask(UUID taskUuid) →
String
Пример использования:
def url = bim.getLinkToTask(task.uuid)
- bim.getTaskComments(UUID taskUuid) →
List<Comment>
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| uuid | UUID | идентификатор комментария | getUuid() |
| createDate | Instant | дата создания комментария | getCreateDate() |
| text | String | комментарий | getText() |
| authorUuid | UUID | автор комментария | getAuthorUuid() |
Пример использования:
def listComments = bim.getTaskComments(UUID.fromString("c73df7aa-7ddd-11ec-90d6-0242ac120003"))
for (Comment comment : listComments) {
def authorUuid = comment.getAuthorUuid()
console.info(authorUuid.toString() + ": " + comment.getText())
}
- bim.getTaskAttachments(UUID taskUuid) →
List<Attachment>
| Поле | Тип данных поля | Описание поля | Метод взятия данных поля |
|---|---|---|---|
| uuid | UUID | идентификатор вложения | getUuid() |
| file | String | ссылка на файл вложения | getFile() |
| name | String | наименование вложения | getName() |
| sourceData | String | информация о вложении (JSON) | getSourceData() |
| sourceType | SourceType: VIEW, FILE, DRAWINGCOMMENT, IMAGE | тип вложения | getSourceType() |
| createDate | Instant | дата создания вложения | getCreateDate() |
| contentType | String | тип контента | getContentType() |
| creatorUuid | UUID | идентификатор автора вложения | getCreatorUuid() |
| collision | UUID | идентификатор коллизии, если вложение связано с коллизией | getCollision() |
Пример использования:
def listAttachments = bim.getTaskAttachments(UUID.fromString("c73df7aa-7ddd-11ec-90d6-0242ac120003"))
for (Attachment attachment : listAttachments) {
def createDate = attachment.getCreateDate()
console.info(createDate.toString())
// -> "INFO: 2022-01-21T10:01:12.567Z"
}
- bim.getCommentFromTaskAttachment(String sourceData) →
String- значение поляcommentиз JSONsourceData; пустая строка, если его нет или JSON некорректен
Пример использования:
def info = bim.getCommentFromTaskAttachment(attachment.sourceData)
- bim.getTaskForm(UUID taskUuid) →
List<FormData>- основные поля:uuid,form,fields(значения полей формы),createdDate,modifiedDate
Пример использования:
def taskForm = bim.getTaskForm(UUID.fromString("94e8e236-510b-4325-8b3a-15e317924bb2"))
- bim.getTaskWorkers(UUID taskUuid) →
List<Profile>
Пример использования:
def taskWorkers = bim.getTaskWorkers(UUID.fromString("94e8e236-510b-4325-8b3a-15e317924bb2"))
taskWorkers.each { p -> console.info(p.name + " " + p.email) }
- bim.getFilesDownloadLinks(List<UUID> attachmentsUuid) →
List<String>- ссылки на скачивание файлов по идентификаторам вложений задач. Ссылка действительна в течение одного дня; изменить срок можно методом editTokenExpiredDate. Метод рекомендуется использовать при формировании отчетов
<p><a href=" + адрес. Чтобы получить адрес, уберите префикс: link.replace('<p><a href="', '').Пример использования:
def tasks = bim.getProjectTasks()
def uuids = []
for (def task : tasks) {
for (def attachment : bim.getTaskAttachments(task.uuid)) {
if (attachment != null)
uuids.add(attachment.uuid)
}
}
def downloadLinks = bim.getFilesDownloadLinks(uuids)
def urls = downloadLinks.collect { it.replace('<p><a href="', '') }
console.info(urls.toString())
- bim.editTokenExpiredDate(UUID tokenUuid, int day) →
UUID
Пример использования:
UUID uuid = UUID.fromString("94e8e236-510b-4325-8b3a-15e317924bb2")
bim.editTokenExpiredDate(uuid, 2)
Пользовательские статусы и параметры задач
- bim.registerProcessStatuses(List<PluginTaskStatus> statusList) →
List<Object>- список статусов передаётся списком карт[name: …, title: …]:name— системное имя статуса,title— отображаемое название
name статуса после внедрения плагина не меняйте — на него ссылаются задачи; title можно менять свободно.Пример использования:
def start() {
bim.registerProcessStatuses([
[name: "new", title: "Открыта"],
[name: "check", title: "На проверке"],
[name: "complete", title: "Выполнена"]
])
bim.initPluginTaskStatus()
}
- bim.initPluginTaskStatus()
Пример использования:
bim.initPluginTaskStatus()
- bim.getProcessStatuses() →
List<Object>
Пример использования:
def listProcessStatuses = bim.getProcessStatuses()
- bim.setPluginStatusToTask(UUID taskUuid, String status) →
Task-status—nameзарегистрированного статуса
Пример использования:
task = bim.setPluginStatusToTask(task.uuid, "check")
- bim.saveParamsToTask(UUID taskUuid, Map<String, Object> params, boolean showInTask) →
List<PluginTaskParam>- сохранение списка пользовательских параметров к задаче: идентификатор задачи, параметры, показ в карточке задачи - bim.saveParamsToTask(UUID taskUuid, String name, Object value, boolean showInTask) →
List<PluginTaskParam>- сохранение одного пользовательского параметра: идентификатор задачи, имя параметра, значение, показ в карточке задачи
Пример использования:
bim.saveParamsToTask(task.uuid, "isLate", true, true)
bim.saveParamsToTask(task.uuid, [checked: true, checkDate: bim.getRuDate(Instant.now())], false)
- bim.getParamsToTask(UUID taskUuid) →
List<PluginTaskParam>- поля параметра:uuid,taskUuid,name,value,showInTask
Пример использования:
def taskParams = bim.getParamsToTask(task.uuid)
def isLate = taskParams.find { it.name == "isLate" }?.value
- bim.getTaskParams() →
List<PluginTaskParam>
Пример использования:
def taskParams = bim.getTaskParams()
- bim.editParam(UUID paramUuid, String name, Object param) →
PluginTaskParam
Пример использования:
def param = bim.getParamsToTask(task.uuid).find { it.name == "isLate" }
bim.editParam(param.uuid, "isLate", false)
- bim.deleteParam(UUID paramUuid)
Пример использования:
bim.deleteParam(paramUuid)
- bim.deleteParams(UUID taskUuid) - удаление всех параметров задачи по идентификатору задачи
- bim.deleteParams(List<PluginTaskParam> params) - удаление списка параметров
Пример использования:
bim.deleteParams(task.uuid)
def params = bim.getParamsToTask(task.uuid).findAll { it.name.startsWith("tmp") }
bim.deleteParams(params)
Пользователи и группы организации
- bim.getProfile(UUID profileUuid) →
Profile- основные поля:uuid,name,email,phone,archive
Пример использования:
def profile = bim.getProfile(UUID.fromString("ef952aa8-7ddc-11ec-90d6-0242ac120003"))
def profileUuid = profile.getUuid()
// console.info(profileUuid.toString()) -> "INFO: ef952aa8-7ddc-11ec-90d6-0242ac120003"
- bim.getProfiles(List<UUID> profilesUuid) →
List<Profile>
Пример использования:
def listProfilesData = bim.getProfiles(profilesUuid)
- bim.getOrgGroups() →
List<OrgGroupFullDTO>- все группы организации - bim.getOrgGroups(List<UUID> orgGroups) →
List<OrgGroupFullDTO>- группы по идентификаторам - bim.getOrgGroups(String groupName) →
List<OrgGroupFullDTO>- группы с одинаковым или схожим названием
Поля группы: uuid, title, organization, profiles (идентификаторы пользователей группы).
Пример использования:
def groups = bim.getOrgGroups("Дежурная смена")
- bim.getOrgGroup(UUID orgGroup) →
OrgGroupFullDTO- получение группы организации по её идентификатору - bim.getOrgGroup(String groupName) →
OrgGroupFullDTO- получение группы организации по её названию
Если группа не найдена, возвращается null.
Пример использования:
def headEngineer = bim.getOrgGroup("Главный инженер")
if (headEngineer != null) {
console.info("Пользователей в группе: " + headEngineer.profiles.size())
}
- bim.setGroupResponderToTask(UUID taskUuid, String groupName) →
Task
Пример использования:
task = bim.setGroupResponderToTask(task.uuid, "Главный инженер")
- bim.setGroupWorkersToTask(UUID taskUuid, List<String> titles) →
Task
Пример использования:
task = bim.setGroupWorkersToTask(task.uuid, [bim.calculateDuty()])
- bim.deleteDutyShift(Task task, String groupName) →
Task
Пример использования:
def task = bim.getTask(mainTask.taskUuid)
task = bim.deleteDutyShift(task, "Дежурная смена")
Техническое обслуживание (ТО)
- bim.getProjectMaintenanceTasks() →
List<MaintenanceTask>- поля:uuid,title,maintenanceDate,maintenanceDoneDate,equipment,status,taskUuid,dutyNum
Пример использования:
def mTasks = bim.getProjectMaintenanceTasks()
- bim.getMaintenanceTasks(List<UUID> taskUuids) →
List<MaintenanceTask>
Пример использования:
def taskList = bim.getMaintenanceTasks(taskUuids)
- bim.getOrCreateTaskFromMaintenance(UUID maintenanceTask) →
Task
Пример использования:
def onStartMaintenanceTask(def mTasks) {
mTasks.each { mTask ->
def task = bim.getOrCreateTaskFromMaintenance(mTask.uuid)
}
}
- bim.calculateDuty() →
String- номер дежурной группы на следующий день («Дежурная смена N») - bim.calculateDuty(String groupName) →
String- номер группы на следующий день по имени группы («groupName N») - bim.calculateDuty(MaintenanceTask mTask) →
String- номер дежурной группы на дату проведения ТО по задаче обслуживания - bim.calculateDuty(String groupName, MaintenanceTask mTask) →
String- номер группы на дату проведения ТО по имени группы и задаче обслуживания
Пример использования:
def numberGroup = bim.calculateDuty("Дежурная смена", mTask)
// -> "Дежурная смена 2"
Даты и вспомогательные методы
Instant (момент времени в UTC). «Следующий день» и «через N дней» отсчитываются по дате UTC.- bim.getStartDate() →
Instant
Пример использования:
task.startDate = bim.getStartDate()
- bim.getEndDate() →
Instant
Пример использования:
task.stopDate = bim.getEndDate()
- bim.getAmountDate(int day) →
Instant
Пример использования:
task.escalationDate = bim.getAmountDate(2)
- bim.getDate(String dateStr) →
Instant- получение даты из строки форматаdd.MM.yyyy - bim.getDate(String dateStr, String formatStr) →
Instant- получение даты из строки по заданному формату
Если строку не удалось разобрать, возвращается null.
Пример использования:
def date = bim.getDate("31.12.2026")
def isoDate = bim.getDate("2026-12-31", "yyyy-MM-dd")
- bim.getDateTime(String dateStr) →
Instant- строка форматаdd.MM.yyyy HH:mm;null, если строку не удалось разобрать
Пример использования:
def date = bim.getDateTime("31.12.2026 18:00")
- bim.getRuDate(Instant date) →
String- дата в форматеdd.MM.yyyy HH:mmпо московскому времени; дляnull— текущие дата и время
Пример использования:
console.info("Задача создана " + bim.getRuDate(task.createDate))
- bim.parseOptionValueToList(String optionValue) →
List<String>- извлекает все значения в двойных кавычках; дляnullили пустой строки возвращает пустой список
form.addSelectModel, addSelectFloor, addSelectSystem, addSelectMaterial) приходит в params не списком, а строкой вида ["АР","КР"] — декодируйте её этим методом.Пример использования:
List modelNames = bim.parseOptionValueToList((params.get("models") ?: "").toString())
// "[\"АР\",\"КР\"]" -> ["АР", "КР"]
- bim.convertStringUuidToUUID(Collection<String> stringUuidElements) →
Set<UUID>- строка, не являющаяся UUID, вызывает исключение
Пример использования:
def uuids = bim.convertStringUuidToUUID(["e5a114d0-7de1-11ec-90d6-0242ac120003", "ac178efe-7e8d-11ec-90d6-0242ac120003"])
def elements = bim.getAllElementsByListUuidAndProjectUuid(uuids)
Справочники
Операторы сравнения
Используются в createCondition. Регистр не важен; неизвестный оператор молча заменяется на eq. Символьные обозначения применяются в том числе в сокращённой форме createCondition(axis, "ИмяОператорЗначение").
| Оператор | Символ | Описание |
|---|---|---|
| eq | = | Равно |
| noteq | != | Не равно |
| cont | @ | Содержит |
| notcont | !@ | Не содержит |
| gt | > | Больше |
| gteq | >= | Больше или равно |
| lt | < | Меньше |
| lteq | <= | Меньше или равно |
| ex | % | Имеет значение |
| notex | !% | Не имеет значения |
| in | # | Элемент из набора |
Параметры поиска
Первый аргумент createCondition. Регистр не важен; любая другая строка молча превращается в class.
| Параметр | Описание |
|---|---|
| model | поиск по названию модели в структуре проекта |
| floor | поиск по названию этажа |
| class | поиск по названию ifc класса (ifc тип) |
| zone | поиск по названию зоны, объединяющей элементы |
| layer | поиск по названию слоя, объединяющего элементы |
| group | поиск по группировке |
| classificator | поиск по классификатору |
| attribute | поиск по значению атрибута |
| userprop | поиск по пользовательским свойствам |
| mask | поиск по маске |
| idprop | поиск по идентификации |
| geometry | поиск по значению рассчитанной геометрии: площадь (ключ атрибута area) и объем (ключ атрибута volume) |
Для attribute, userprop и mask используются формы с именем атрибута (4 или 5 аргументов), для model, floor, zone, layer, group, classificator, class — форма «параметр, оператор, значение».
Статусы коллизий
Значения CollisionStatus для getProjectCollisions и getModelCollisions.
| Статус | Описание |
|---|---|
| NEW | новые коллизии |
| WORK | коллизии в работе |
| SOLVED | решенные коллизии |
| ALLOWED | допустимые (разрешённые) коллизии |
PowerType
Множитель (приставка) единицы измерения для параметра power метода addAttribute.
| Имя | Множитель |
|---|---|
| NULL | 1 (без приставки) |
| EXA | 1.0e18 |
| PETA | 1.0e15 |
| TERA | 1.0e12 |
| GIGA | 1.0e9 |
| MEGA | 1.0e6 |
| KILO | 1.0e3 |
| HECTO | 1.0e2 |
| DECA | 1.0e1 |
| DECI | 1.0e-1 |
| CENTI | 1.0e-2 |
| MILLI | 1.0e-3 |
| MICRO | 1.0e-6 |
| NANO | 1.0e-9 |
| PICO | 1.0e-12 |
| FEMTO | 1.0e-15 |
| ATTO | 1.0e-18 |
UnitType
Тип единицы измерения для параметра unit метода addAttribute.
"THERMODYNAMICTEMPERATUREUNIT_K". Сервер ищет единицу по имени константы, поэтому "THERMODYNAMICTEMPERATUREUNIT" — это градусы Цельсия, а не Кельвины. Пустая строка или null дают NULLUNIT, а строка "NULL" приводит к ошибке. Для power пустое значение даёт NULL.| Имя | Единица |
|---|---|
| NULLUNIT | без единицы |
| ABSORBEDDOSEUNIT | gray |
| AMOUNTOFSUBSTANCEUNIT | mole |
| AREAUNIT | square_metre |
| DOSEEQUIVALENTUNIT | sievert |
| ELECTRICCAPACITANCEUNIT | farad |
| ELECTRICCHARGEUNIT | coulomb |
| ELECTRICCONDUCTANCEUNIT | siemens |
| ELECTRICCURRENTUNIT | ampere |
| ELECTRICRESISTANCEUNIT | ohm |
| ELECTRICVOLTAGEUNIT | volt |
| ENERGYUNIT | joule |
| FORCEUNIT | newton |
| FREQUENCYUNIT | hertz |
| ILLUMINANCEUNIT | lux |
| INDUCTANCEUNIT | henry |
| LENGTHUNIT | metre |
| LUMINOUSFLUXUNIT | lumen |
| LUMINOUSINTENSITYUNIT | candela |
| MAGNETICFLUXDENSITYUNIT | tesla |
| MAGNETICFLUXUNIT | weber |
| MASSUNIT | gram |
| PLANEANGLEUNIT | radian |
| POWERUNIT | watt |
| PRESSUREUNIT | pascal |
| RADIOACTIVITYUNIT | becquerel |
| SOLIDANGLEUNIT | steradian |
| THERMODYNAMICTEMPERATUREUNIT | degree_celsius |
| THERMODYNAMICTEMPERATUREUNIT_K | kelvin |
| TIMEUNIT | second |
| VOLUMEUNIT | cubic_metre |
| USERDEFINED | userdefined |

