BIMIT
Разработка плагинов

collision

Это интерфейс формирования списка коллизий (добавить/удалить в список). Доступен в плагинах типа «Коллизии» (COLLISION). Все коллизии, сформированные при работе плагина, шаблон сам отправляет на сохранение: возвращать что-либо из start() не нужно. В нем доступны следующие функции:

SKIP, OK, FAIL, collisionType - константы статусов проверки и вид правила

В плагине «Коллизии» доступны без объявления:

ИмяЗначениеСмысл
SKIP1проверка не проводилась
OK2проверка пройдена
FAIL3проверка не пройдена
collisionTypeBASE или VALIDATEвид правила, задаётся в настройках плагина
BASE«Коллизии»геометрический конфликт между элементами (или замечание к одному элементу)
VALIDATE«Проверки»проверка требований к модели: группа элементов и статус

Статусы передаются первым аргументом в перегрузки createCollision со статусом.

Пример использования:

if (collisionType == VALIDATE) {
    collision.createCollision(OK, elements, "Атрибут заполнен", elements.size())
} else {
    collision.createCollision(wallA, wallB, "Пересечение", "Стены пересекаются", "")
}
createCollision - создание записи о коллизии

Общие параметры перегрузок:

  • type - тип (краткое название) коллизии, по нему записи группируются в отчёте;
  • description - описание возникшей коллизии;
  • value - значение коллизии (например, «зазор 35 мм»);
  • figure - геометрия коллизии (GeometryObject, координаты в мм), отрисовывается на модели;
  • status - SKIP, OK или FAIL;
  • count - сколько элементов проверялось (для статистики проверки);
  • T - элемент API: ElementExternal или GeometryElement.
type, description, value должны быть строками: число передавайте как "" + x или String.valueOf(x). null первым аргументом (на месте элемента) даёт ошибку Ambiguous method overloading. Запись без привязки к элементам делается перегрузкой со статусом: collision.createCollision(FAIL, null, "Текст замечания").

Один элемент или модель (вид BASE)

  • collision.createCollision(T a, String type, String description, String value) - коллизия для элемента
  • collision.createCollision(T a, String type, String description, String value, GeometryObject figure) - то же с геометрией коллизии
  • collision.createCollision(UUID uuidA, String type, String description, String value) - коллизия для элемента по его идентификатору
  • collision.createCollision(UUID uuidA, String type, String description, String value, GeometryObject figure)
  • collision.createCollision(GeometryObject a, String type, String description, String value) - коллизия для элемента, заданного геометрией
  • collision.createCollision(GeometryObject a, String type, String description, String value, GeometryObject figure)
  • collision.createCollision(Element a, String type, String description, String value), collision.createCollision(Element a, String type, String description, String value, GeometryObject figure) - с внутренней моделью Element; в плагине передавайте элемент API, UUID или GeometryObject
  • collision.createCollision(String type, String description, String value, UUID model) - коллизия для модели целиком по идентификатору модели

Пара элементов (вид BASE)

  • collision.createCollision(T a, T b, String type, String description, String value)
  • collision.createCollision(T a, T b, String type, String description, String value, GeometryObject figure)
  • collision.createCollision(UUID a, UUID b, String type, String description, String value)
  • collision.createCollision(UUID a, UUID b, String type, String description, String value, GeometryObject figure)
  • collision.createCollision(GeometryObject a, GeometryObject b, String type, String description, String value)
  • collision.createCollision(GeometryObject a, GeometryObject b, String type, String description, String value, GeometryObject figure)
  • collision.createCollision(T a, GeometryObject b, String type, String description, String value)
  • collision.createCollision(T a, GeometryObject b, String type, String description, String value, GeometryObject figure)
  • collision.createCollision(GeometryObject a, T b, String type, String description, String value)
  • collision.createCollision(GeometryObject b, T a, String type, String description, String value, GeometryObject figure)
  • collision.createCollision(Element a, Element b, String type, String description, String value), collision.createCollision(Element a, Element b, String type, String description, String value, GeometryObject figure) - с внутренней моделью Element

Со статусом: один элемент или пара

  • collision.createCollision(int status, T a, String type, String description, String value)
  • collision.createCollision(int status, UUID uuidA, String type, String description, String value)
  • collision.createCollision(int status, GeometryElement element, String type, String description, String value) - результат проверки одного элемента
  • collision.createCollision(int status, T a, T b, String type, String description, String value)
  • collision.createCollision(int status, UUID a, UUID b, String type, String description, String value)
  • collision.createCollision(int status, UUID a, UUID b, String type, String description, String value, GeometryObject figure)

Группа элементов (вид VALIDATE)

В коллекции допустимы ElementExternal, GeometryElement, ElementAttribute, GeometryObject; прочие объекты молча отбрасываются. Перегрузки без status создают запись со статусом FAIL, перегрузки без count - с count = 1.

  • collision.createCollision(Collection<Object> elements, String type)
  • collision.createCollision(Object[] elements, String type)
  • collision.createCollision(Object[] elements, String type, int count)
  • collision.createCollision(int status, Collection<Object> elements, String type)
  • collision.createCollision(int status, Collection<Object> elements, String type, int count)
  • collision.createCollision(int status, Object[] elements, String type)
  • collision.createCollision(int status, Object[] elements, String type, int count)
  • collision.createCollision(int status, Object elements, String type) - один объект (или null - запись без элементов)
  • collision.createCollision(int status, Collection<Object> element, String type, String projectIndicator, String source, int count) - с показателем проекта и источником данных

Пример использования:

// пара элементов
collision.createCollision(wallA, wallB, "Пересечение", "Стены пересекаются", "")
// по идентификаторам элементов
collision.createCollision(wallA.uuid, wallB.uuid, "Пересечение", "Стены пересекаются", "")
// замечание к модели
collision.createCollision("Проверка длины", "Слишком короткая балка", length + " м", modelUuid)
// результат проверки группы элементов
collision.createCollision(FAIL, new ArrayList(badElements), "Не заполнен атрибут", elements.size())
// запись без элементов
collision.createCollision(FAIL, null, "В модели нет помещений")
createPluginRuleCollision - запуск встроенного правила проверки
  • collision.createPluginRuleCollision(Map<String, Object> params) - запускает встроенное правило по имени pluginName и сам превращает его результат в коллизии или результаты проверки

В params обязательно передаются pluginName и все параметры правила: отсутствие параметра приводит к ошибке IllegalArgumentException, лишние ключи игнорируются.

Неизвестное (ошибочное) значение pluginName не вызывает ошибку: правило молча не выполняется, и плагин возвращает пустой результат. Незаданное условие передавайте строкой "null", а не null. Единицы измерения параметров задаёт само правило.

Пример использования:

def start() {
    collision.createPluginRuleCollision([
        pluginName     : "221 Wall Distance",
        firstCondition : params.get("firstCondition") ?: "null",
        secondCondition: params.get("secondCondition") ?: "null",
        minDistance    : (params.get("minDistance") ?: "0") as double,
        maxDistance    : (params.get("maxDistance") ?: "0") as double,
        parentOption   : 0,
        parentElemUuids: null
    ])
}
boundsIntersect - проверка на пересечение границ 2 элементов.
  • collision.boundsIntersect(double gap, Bounds boundsA, Bounds boundsB) → boolean - проверка пересечения границ двух элементов с зазором: границы первого элемента расширяются на gap в каждую сторону
  • collision.boundsIntersect(Bounds boundsA, Bounds boundsB) → boolean - проверка пересечения границ двух элементов
  • collision.boundsIntersect(Vector3f minA, Vector3f maxA, Vector3f minB, Vector3f maxB) → boolean - проверка пересечения границ двух элементов, заданных минимальными и максимальными координатами

Границы формируют прямоугольный параллелепипед, в который вписана фигура, поэтому метод подходит для быстрого предварительного отсева пар (запросов к серверу он не делает). Точная проверка по геометрии - calc.intersect.

Единицы gap совпадают с единицами переданных границ: у GeometryObject.bounds - мм, у GeometryElement.bounds - единицы модели.

Пример использования:

if (collision.boundsIntersect(elementA.getBounds(), elementB.getBounds())) {
    // границы пересекаются
}
getCollisionEssences - получение сущности коллизии между элементами
  • collision.getCollisionEssences() → Map<String, Object> - все коллизии, созданные в текущем запуске
Метод вызывается шаблоном автоматически после start(): его результат и есть результат работы плагина. Вызывать его в плагине не нужно.

Пример использования:

def essences = collision.getCollisionEssences()
console.info("Создано записей: " + essences.size())
setCollisionEssences - присвоить коллизии
  • collision.setCollisionEssences(Map<String, Object> collisionEssences) - заменяет весь накопленный набор коллизий переданной картой

Пример использования:

collision.setCollisionEssences([:])   // сбросить всё, что было создано ранее
Copyright © 2026