collision
Это интерфейс формирования списка коллизий (добавить/удалить в список).
Доступен в плагинах типа «Коллизии» (COLLISION). Все коллизии, сформированные при работе плагина, шаблон сам отправляет на сохранение: возвращать что-либо из start() не нужно.
В нем доступны следующие функции:
- SKIP, OK, FAIL, collisionType - константы статусов проверки и вид правила
- createCollision - создание записи о коллизии
- createPluginRuleCollision - запуск встроенного правила проверки
- boundsIntersect - проверка на пересечение границ 2 элементов
- getCollisionEssences - получение сущности коллизии между элементами
- setCollisionEssences - присвоить коллизии
В плагине «Коллизии» доступны без объявления:
| Имя | Значение | Смысл |
|---|---|---|
SKIP | 1 | проверка не проводилась |
OK | 2 | проверка пройдена |
FAIL | 3 | проверка не пройдена |
collisionType | BASE или VALIDATE | вид правила, задаётся в настройках плагина |
BASE | «Коллизии» | геометрический конфликт между элементами (или замечание к одному элементу) |
VALIDATE | «Проверки» | проверка требований к модели: группа элементов и статус |
Статусы передаются первым аргументом в перегрузки createCollision со статусом.
Пример использования:
if (collisionType == VALIDATE) {
collision.createCollision(OK, elements, "Атрибут заполнен", elements.size())
} else {
collision.createCollision(wallA, wallB, "Пересечение", "Стены пересекаются", "")
}
Общие параметры перегрузок:
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, "В модели нет помещений")
- 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
])
}
- 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())) {
// границы пересекаются
}
- collision.getCollisionEssences() →
Map<String, Object>- все коллизии, созданные в текущем запуске
start(): его результат и есть результат работы плагина. Вызывать его в плагине не нужно.Пример использования:
def essences = collision.getCollisionEssences()
console.info("Создано записей: " + essences.size())
- collision.setCollisionEssences(Map<String, Object> collisionEssences) - заменяет весь накопленный набор коллизий переданной картой
Пример использования:
collision.setCollisionEssences([:]) // сбросить всё, что было создано ранее

