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

calc

Интерфейс строительного калькулятора предоставляет базовые функции расчета В нем доступны следующий функции:

  • area - подсчет площади прямоугольной фигуры, заданной длинами сторон
  • volume - подсчет объема параллелепипеда, заданной длинами сторон (ДЛИНАxШИРИНАxВЫСОТА)
  • areaBox - подсчет площади поверхности стен прямоугольной комнаты, заданной длинами сторон и высотой
  • volumeBox - подсчет объема стен коробки, заданной длинами сторон (по внешней стороне), высотой и толщиной стен
  • located - метод определения вхождения одного элемента в область другого (GeometryElement space, GeometryElement obj)
  • intersect - метод определения пересечения области одного элемента в область другого (GeometryElement space, GeometryElement obj)
  • distance - определение расстояния между двумя элементами
  • distanceFast - определение расстояния между двумя элементами
  • getElementBounds - получение граничного бокса по элементу и по списку вершин
  • length - получение расстояния между двумя точками в пространстве
  • getOrientedBoundingBox - получение ориентированного, минимального, граничного бокса элемента
  • getElementConvexHull - получение геометрии выпуклой оболочки элемента
  • trunc - округление значение
  • manhattanDistance - расчет расстояния Манхэттена между двумя геометрическими элементами
  • deepInclusion - точная проверка того, что один элемент включен в другой элемент
  • createOrientedBox - создание OBB на основе заданного элемента и в заданном направлении
  • distance2D - расчёт двумерного расстояния между элементами в плоскости XY, 0 если пересекаются
  • distance2DHorizontal - расчёт минимального двумерного расстояния между элементами в плоскости XY
  • distance2DWithOffSet - расчет двумерного расстояния между элементами со смещением элементов
  • isExtendedAABBIntersectNeighbours - проверка пересечения aabb элемента с его соседями + с учетом допустимого пространства length, width, height по направлению dir
  • isValveBelongToPipe - проверка принадлежности одного элемента другому
  • getOBBLongestAxis - возвращает индекс самой длинной стороны obb(X=1, Y=2, Z=3)
area - подсчет площади прямоугольной фигуры, заданной длинами сторон
  • calc.area(double length, double width)

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

// area
def area = calc.area(6,6)

// console.info(area) -> “INFO: 36.0”
volume - подсчет объема параллелепипеда, заданной длинами сторон (ДЛИНАxШИРИНАxВЫСОТА)
  • calc.volume(double length, double width, double height)

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

// volume
def vol= calc.volume(6,0.5,3)

// console.info(vol) -> “INFO: 9.0”
areaBox - подсчет площади поверхности стен прямоугольной комнаты, заданной длинами сторон и высотой
  • calc.areaBox(double length, double width, double height)

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

// areaBox
def area = calc.areaBox(6,6,3)

// console.info(area) -> “INFO: 72.0”
volumeBox - подсчет объема стен коробки, заданной длинами сторон (по внешней стороне), высотой и толщиной стен
  • calc.volumeBox(double length, double width, double height, double widthWall)

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

// volumeBox
def vol= calc.volumeBox(6,6,3,0.5)

// console.info(vol) -> “INFO: 33.0”
located - метод определения вхождения одного элемента в область другого
  • calc.located(GeometryElement space, GeometryElement obj) - метод определения вхождения одного элемента в область другого

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

if (calc.located(space, elem)) {}
intersect - метод определения пересечения области одного элемента в область другого
  • calc.intersect(Bounds bounds1, Bounds bounds2) - определение пересечения 2 боксов по границам 1 и 2 бокса
  • calc.intersect(double gap, Bounds bounds1, Bounds bounds2) - определение пересечения 2 боксов по границам 1 и 2 бокса с увеличением границ одного из элементов
  • calc.intersect(double gapX, double gapY, double gapZ, Bounds bounds1, Bounds bounds2) - определение пересечения 2 боксов по границам 1 и 2 бокса с увеличением границ одного из элементов отдельно по осям
  • calc.intersect(GeometryElement element1, GeometryElement element2) - метод определения пересечения 2 элементов через их граничных боксов
  • calc.intersect(double gapX, double gapY, double gapZ, GeometryElement element1, GeometryElement element2) - определение пересечения 2 элементов через их граничных боксов
  • calc.intersect(double gap, GeometryElement element1, GeometryElement element2) - определение пересечения 2 элементов через их граничных боксов
  • calc.intersect(GeometryObject element1, GeometryObject element2) - определение пересечения 2 элементов

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

if (calc.intersect(gapX, gapY, gapZ, element, slab)) {}
distance - определение расстояния между двумя элементами
  • calc.distance(GeometryObject data1, GeometryObject data2)

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

def len = calc.distance(el1, el2)
distanceFast - определение расстояния между двумя элементами
  • calc.distanceFast(GeometryObject data1, GeometryObject data2)

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

if (calc.distanceFast(el1, el2) <= 400) {}
getElementBounds - получение граничного бокса по элементу и по списку вершин
  • calc.getElementBounds(GeometryObject geometry) - получение граничного бокса по элементу
  • calc.getElementBounds(double vertices[]) - получение граничного бокса по списку вершин

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

def elem = calc.getElementBounds(geometry)
length - получение расстояния между двумя точками в пространстве
  • calc.length(Vector3f p1, Vector3f p2)

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

double lengthX = calc.length(point3, point6)
getOrientedBoundingBox - получение ориентированного, минимального, граничного бокса элемента
  • calc.getOrientedBoundingBox(UUID elementUuid) - получение ориентированного, минимального, граничного бокса элемента по его идентификатору
  • calc.getOrientedBoundingBox(GeometryElement element) - получение ориентированного, минимального, граничного бокса элемента по элементу
  • calc.getOrientedBoundingBox(Element element) - получение ориентированного, минимального, граничного бокса элемента по элементу

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

def listPoints = new ArrayList<Vector3f>()
        def orientedBox = calc.getOrientedBoundingBox(Uuid элемента())
//console.error(""+orientedBox)
        // Превращаем бокс в набор вершин
        def koeff = 1
        koeff = orientedBox.getKoeff();
console.info("Коэффициент длины: "+koeff)
        for (int i = 0; i < orientedBox.getVertices().length; i += 3) {
   def corner = new Vector3f(orientedBox.getVertices()[i], orientedBox.getVertices()[i+1], orientedBox.getVertices()[i+2]);
   listPoints.add(corner);
        }

        def point0 = listPoints.get(0)
        def point3 = listPoints.get(3)
        def point4 = listPoints.get(4)
        def point5 = listPoints.get(5)
        def point6 = listPoints.get(6)

        // Вычисляем, какая сторона по x или по y длиннее
        double lengthX = calc.trunc(calc.length(point3, point6))
        double lengthY = calc.trunc(calc.length(point3, point5))
        double lengthZ = calc.trunc(calc.length(point0, point3))

Обратите внимание!

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

getElementConvexHull - получение геометрии выпуклой оболочки элемента
  • calc.getElementConvexHull(UUID elementUuid) - получение геометрии выпуклой оболочки элемента по идентификатору
  • calc.getElementConvexHull(GeometryElement element) - получение геометрии выпуклой оболочки элемента по элементу
  • calc.getElementConvexHull(Element element) - получение геометрии выпуклой оболочки элемента по элементу

Данный метод возвращает объект GeometryObject - триангулированная геометрия элемента.

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

def convexHull = calc.getElementConvexHull(elemUuid)
trunc - округление значение
  • calc.trunc(double value, int length) - округление значение
  • calc.trunc(double value) - округление значение до 3го знака после запятой

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

double ratio = calc.trunc(windowAreas / spaceArea, 3);
manhattanDistance - расчет расстояния Манхэттена между двумя геометрическими элементами
  • calc.manhattanDistance(GeometryObject data1, GeometryObject data2) - расчет расстояния Манхэттена между двумя геометрическими элементами

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

def manhattanDist = calc.manhattanDistance(data1, data2)
deepInclusion - точная проверка того, что один элемент включен в другой элемент
  • calc.deepInclusion(GeometryElement elementContent, GeometryElement elementContainer) - точная проверка того, что один элемент включен в другой элемент

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

calc.deepInclusion(elementContent, elementContainer)
createOrientedBox - создание OBB на основе заданного элемента и в заданном направлении
  • calc.createOrientedBox(Vector3f center, Vector3f direction, double width, double depth, double height) - создание OBB на основе заданного элемента и в заданном направлении

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

def oBB = calc.createOrientedBox(center, direction, width, depth, height)
distance2D - расчёт двумерного расстояния между элементами в плоскости XY, 0 если пересекаются
  • calc.distance2D(GeometryObject data1, GeometryObject data2) - расчёт двумерного расстояния между элементами в плоскости XY, 0 если пересекаются

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

def distance = calc.distance2D(data1, data2)
distance2DHorizontal - расчёт минимального двумерного расстояния между элементами в плоскости XY
  • calc.distance2DHorizontal(GeometryObject data1, GeometryObject data2) - расчёт минимального двумерного расстояния между элементами в плоскости XY

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

def min = calc.distance2DHorizontal(data1, data2)
distance2DWithOffSet - расчёт двумерного расстояния между элементами со смещением элементов
  • calc.distance2DWithOffSet(GeometryObject data1, GeometryObject data2, double offSetValue) - расчёт двумерного расстояния между элементами со смещением элементов

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

def distance = calc.distance2DWithOffSet(data1, data2, offSetValue)
isExtendedAABBIntersectNeighbours - проверка пересечения aabb элемента с его соседями + с учетом допустимого пространства length, width, height по направлению dir
  • calc.isExtendedAABBIntersectNeighbours(GeometryElement element, Set<GeometryElement> neighbours, double[] dir, final double length, final double width, final double height) - проверка пересечения aabb элемента с его соседями + с учетом допустимого пространства length, width, height по направлению dir

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

def element = calc.isExtendedAABBIntersectNeighbours(valve, allElements, dir, length, width, height)
isValveBelongToPipe - проверка принадлежности одного элемента другому
  • calc.isValveBelongToPipe(GeometryElement valve, GeometryElement pipe) - проверка принадлежности одного элемента другому

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

if(calc.isValveBelongToPipe(valve, pipe)){}
getOBBLongestAxis - возвращает индекс самой длинной стороны obb(X=1, Y=2, Z=3)
  • calc.getOBBLongestAxis(GeometryElement element) - возвращает индекс самой длинной стороны obb(X=1, Y=2, Z=3)

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

int axis = calc.getOBBLongestAxis(pipe)
Copyright © 2026