Wiki source code of 03_calc

Version 11.24 by Bimit Administrator on 12.05.2026, 14:15

Show last authors
1 Интерфейс строительного калькулятора предоставляет базовые функции расчета
2 В нем доступны следующий функции:
3
4 * [[area>>path:#_Toc1]] - подсчет площади прямоугольной фигуры, заданной длинами сторон
5 * [[volume>>path:#_Toc2]] - подсчет объема параллелепипеда, заданной длинами сторон (ДЛИНАxШИРИНАxВЫСОТА)
6 * [[areaBox>>path:#_Toc3]] - подсчет площади поверхности стен прямоугольной комнаты, заданной длинами сторон и высотой
7 * [[volumeBox>>path:#_Toc4]] - подсчет объема стен коробки, заданной длинами сторон (по внешней стороне), высотой и толщиной стен
8 * [[located>>path:#_Toc5]] - метод определения вхождения одного элемента в область другого ([[GeometryElement>>https://wiki.bimit.ru/bin/view/API/%D0%9F%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%20API/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%20bim/#_Toc10]] space, [[GeometryElement>>https://wiki.bimit.ru/bin/view/API/%D0%9F%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%20API/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%20bim/#_Toc10GeometryElement]] obj)
9 * [[intersect>>path:#_Toc6]] - метод определения пересечения области одного элемента в область другого ([[GeometryElement>>GeometryElhttps://wiki.bimit.ru/bin/view/API/%D0%9F%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%20API/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%20bim/#_Toc10ement]] space, [[GeometryElement>>GeometryElementhttps://wiki.bimit.ru/bin/view/API/%D0%9F%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%20API/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%20bim/#_Toc10]] obj)
10 * [[distance>>path:#_Toc7]] - определение расстояния между двумя элементами
11 * [[distanceFast>>path:#_Toc12]] - определение расстояния между двумя элементами
12 * [[getElementBounds>>path:#_Toc8]] - получение граничного бокса по элементу и по списку вершин
13 * [[length>>path:#_Toc9]] - получение расстояния между двумя точками в пространстве
14 * [[getOrientedBoundingBox>>path:#_Toc10]] - получение ориентированного, минимального, граничного бокса элемента
15 * [[getElementConvexHull>>path:#_Toc11]] - получение геометрии выпуклой оболочки элемента
16 * [[trunc>>path:#_Toc13]] - округление значение
17 * [[manhattanDistance>>path:#_Toc14]] - расчет расстояния Манхэттена между двумя геометрическими элементами
18 * [[deepInclusion>>path:#_Toc15]] - точная проверка того, что один элемент включен в другой элемент
19 * [[createOrientedBox>>path:#_Toc16]] - создание OBB на основе заданного элемента и в заданном направлении
20 * [[distance2D>>path:#_Toc17]] - расчёт двумерного расстояния между элементами в плоскости XY, 0 если пересекаются
21 * [[distance2DHorizontal>>path:#_Toc18]] - расчёт минимального двумерного расстояния между элементами в плоскости XY
22 * [[distance2DWithOffSet>>path:#_Toc19]] - расчет двумерного расстояния между элементами со смещением элементов
23 * [[isExtendedAABBIntersectNeighbours>>path:#_Toc20]] - проверка пересечения aabb элемента с его соседями + с учетом допустимого пространства length, width, height по направлению dir
24 * [[isValveBelongToPipe>>path:#_Toc21]] - проверка принадлежности одного элемента другому
25 * [[getOBBLongestAxis>>path:#_Toc22]] - возвращает индекс самой длинной стороны obb(X=1, Y=2, Z=3)
26
27 (% class="box infomessage" %)
28 (((
29 **{{id name="_Toc1"/}}area** - подсчет площади прямоугольной фигуры, заданной длинами сторон
30 )))
31
32 * **calc.area(double length, double width) **
33
34 **Пример использования:**
35
36 {{code language="java"}}
37 // area
38 def area = calc.area(6,6)
39
40 // console.info(area) -> “INFO: 36.0”
41 {{/code}}
42
43 (% class="box infomessage" %)
44 (((
45 **{{id name="_Toc2"/}}volume** - подсчет объема параллелепипеда, заданной длинами сторон (ДЛИНАxШИРИНАxВЫСОТА)
46 )))
47
48 * **calc.volume(double length, double width, double height) **
49
50 **Пример использования:**
51
52 {{code language="java"}}
53 // volume
54 def vol= calc.volume(6,0.5,3)
55
56 // console.info(vol) -> “INFO: 9.0”
57 {{/code}}
58
59 (% class="box infomessage" %)
60 (((
61 **{{id name="_Toc3"/}}areaBox** - подсчет площади поверхности стен прямоугольной комнаты, заданной длинами сторон и высотой
62 )))
63
64 * **calc.areaBox(double length, double width, double height) **
65
66 **Пример использования:**
67
68 {{code language="java"}}
69 // areaBox
70 def area = calc.areaBox(6,6,3)
71
72 // console.info(area) -> “INFO: 72.0”
73 {{/code}}
74
75 (% class="box infomessage" %)
76 (((
77 **{{id name="_Toc4"/}}volumeBox** - подсчет объема стен коробки, заданной длинами сторон (по внешней стороне), высотой и толщиной стен
78 )))
79
80 * **calc.volumeBox(double length, double width, double height, double widthWall) **
81
82 **Пример использования:**
83
84 {{code language="java"}}
85 // volumeBox
86 def vol= calc.volumeBox(6,6,3,0.5)
87
88 // console.info(vol) -> “INFO: 33.0”
89 {{/code}}
90
91 (% class="box infomessage" %)
92 (((
93 **{{id name="_Toc5"/}}located** - метод определения вхождения одного элемента в область другого
94 )))
95
96 * **calc.located(GeometryElement space, GeometryElement obj) ** - метод определения вхождения одного элемента в область другого
97
98 **Пример использования:**
99
100 {{code language="java"}}{{/code}}
101
102 (% class="box infomessage" %)
103 (((
104 **{{id name="_Toc6"/}}intersect** - метод определения пересечения области одного элемента в область другого
105 )))
106
107 * **calc.intersect(Bounds bounds1, Bounds bounds2) ** - определение пересечения 2 боксов по границам 1 и 2 бокса
108 * **calc.intersect(double gap, Bounds bounds1, Bounds bounds2) ** - определение пересечения 2 боксов по границам 1 и 2 бокса с увеличением границ одного из элементов
109 * **calc.intersect(double gapX, double gapY, double gapZ, Bounds bounds1, Bounds bounds2) ** - определение пересечения 2 боксов по границам 1 и 2 бокса с увеличением границ одного из элементов отдельно по осям
110 * **calc.intersect(GeometryElement element1, GeometryElement element2) ** - метод определения пересечения 2 элементов через их граничных боксов
111 * **calc.intersect(double gapX, double gapY, double gapZ, GeometryElement element1, GeometryElement element2) ** - определение пересечения 2 элементов через их граничных боксов
112 * **calc.intersect(double gap, GeometryElement element1, GeometryElement element2) ** - определение пересечения 2 элементов через их граничных боксов
113 * **calc.intersect(GeometryObject element1, GeometryObject element2) ** - определение пересечения 2 элементов
114
115 **Пример использования:**
116
117 {{code language="java"}}{{/code}}
118
119 (% class="box infomessage" %)
120 (((
121 **{{id name="_Toc7"/}}distance** - определение расстояния между двумя элементами
122 )))
123
124 * **calc.distance(GeometryObject data1, GeometryObject data2) **
125
126 **Пример использования:**
127
128 {{code language="java"}}{{/code}}
129
130 (% class="box infomessage" %)
131 (((
132 **{{id name="_Toc12"/}}distanceFast** - определение расстояния между двумя элементами
133 )))
134
135 * **calc.distanceFast(GeometryObject data1, GeometryObject data2) **
136
137 **Пример использования:**
138
139 {{code language="java"}}{{/code}}
140
141 (% class="box infomessage" %)
142 (((
143 **{{id name="_Toc8"/}}getElementBounds** - получение граничного бокса по элементу и по списку вершин
144 )))
145
146 * **calc.getElementBounds(GeometryObject geometry) ** - получение граничного бокса по элементу
147 * **calc.getElementBounds(double vertices[]) ** - получение граничного бокса по списку вершин
148
149 **Пример использования:**
150
151 {{code language="java"}}{{/code}}
152
153 (% class="box infomessage" %)
154 (((
155 **{{id name="_Toc9"/}}length** - получение расстояния между двумя точками в пространстве
156 )))
157
158 * **calc.length(Vector3f p1, Vector3f p2) **
159
160 **Пример использования:**
161
162 {{code language="java"}}{{/code}}
163
164 (% class="box infomessage" %)
165 (((
166 **{{id name="_Toc10"/}}getOrientedBoundingBox** - получение ориентированного, минимального, граничного бокса элемента
167 )))
168
169 * **calc.getOrientedBoundingBox(UUID elementUuid) ** - получение ориентированного, минимального, граничного бокса элемента по его идентификатору
170 * **calc.getOrientedBoundingBox(GeometryElement element) ** - получение ориентированного, минимального, граничного бокса элемента по элементу
171 * **calc.getOrientedBoundingBox(Element element) ** - получение ориентированного, минимального, граничного бокса элемента по элементу
172
173 **Пример использования:**
174
175 {{code language="java"}}
176 def listPoints = new ArrayList<Vector3f>()
177 def orientedBox = calc.getOrientedBoundingBox(stair.getUuid())
178 //console.error(""+orientedBox)
179 // Превращаем бокс в набор вершин
180 def koeff = 1
181 koeff = orientedBox.getKoeff();
182 console.info("Коэффициент длины: "+koeff)
183 for (int i = 0; i < orientedBox.getVertices().length; i += 3) {
184 def corner = new Vector3f(orientedBox.getVertices()[i], orientedBox.getVertices()[i+1], orientedBox.getVertices()[i+2]);
185 listPoints.add(corner);
186 }
187
188 def point0 = listPoints.get(0)
189 def point3 = listPoints.get(3)
190 def point4 = listPoints.get(4)
191 def point5 = listPoints.get(5)
192 def point6 = listPoints.get(6)
193
194 // Вычисляем, какая сторона по x или по y длиннее
195 double lengthX = calc.trunc(calc.length(point3, point6))
196 double lengthY = calc.trunc(calc.length(point3, point5))
197 double lengthZ = calc.trunc(calc.length(point0, point3))
198 {{/code}}
199
200 [[image:1778581793377-813.png||data-xwiki-image-style-border="true"]]
201
202 **Обратите внимание!**
203
204 На примере представлен приблизительный алгоритм получения длины, высоты, ширины.
205 Не гарантируется, какая сторона будет являться длиной, высотой или шириной.
206 Необходима проверка по точкам.
207
208 (% class="box infomessage" %)
209 (((
210 **{{id name="_Toc11"/}}getElementConvexHull** - получение геометрии выпуклой оболочки элемента
211 )))
212
213 * **calc.getElementConvexHull(UUID elementUuid) ** - получение геометрии выпуклой оболочки элемента по идентификатору
214 * **calc.getElementConvexHull(GeometryElement element) ** - получение геометрии выпуклой оболочки элемента по элементу
215 * **calc.getElementConvexHull(Element element) ** - получение геометрии выпуклой оболочки элемента по элементу
216
217 |(((
218 **Поле**
219 )))|(((
220 **Тип данных поля**
221 )))|(((
222 **Описание поля**
223 )))|(((
224 **Метод взятия данных поля**
225 )))
226 |(((
227 uuid
228 )))|(((
229 uuid
230 )))|(((
231 идентификатор элемента
232 )))|(((
233 getUuid()
234 )))
235 |(((
236 name
237 )))|(((
238 string
239 )))|(((
240 наименование элемента
241 )))|(((
242 getName()
243 )))
244 |indices|int[ ]|геометрические индексы, указывающие на позицию координат точки в массиве вершин (координаты вершин треугольника идут тройками: 1,2,3 вершина и т.д)|getIndices()
245 |vertices|double[ ]|массив координат вершин (координаты идут тройками подряд X,Y,Z,X,Y,Z,...)|getVertices()
246 |normals|float[ ]|массив нормалей вершин|getNormals()
247 |colorsQuantized|int[ ]|индексы цветовой раскраски триангулированной геометрии|getColorsQuantized()
248 |colors|float[ ]|массив цветов|getColors()
249 |koeff|double|коэффициент трансформации координат (м в мм)|getKoeff()
250 | | |метод получения длины массива индексов|getLength()
251 | | |метод получения количества треугольников геометрии|getTrianglesCount()
252
253
254
255 (% class="box infomessage" %)
256 (((
257 **{{id name="_Toc13"/}}trunc** - округление значение
258 )))
259
260 * **calc.trunc(double value, int length) ** - округление значение
261 * **calc.trunc(double value) ** - округление значение до 3го знака после запятой
262
263 **Пример использования:**
264
265 {{code language="java"}}{{/code}}
266
267 (% class="box infomessage" %)
268 (((
269 **{{id name="_Toc14"/}}manhattanDistance** - расчет расстояния Манхэттена между двумя геометрическими элементами
270 )))
271
272 * **calc.manhattanDistance(GeometryObject data1, GeometryObject data2) ** - расчет расстояния Манхэттена между двумя геометрическими элементами
273
274 **Пример использования:**
275
276 {{code language="java"}}{{/code}}
277
278 (% class="box infomessage" %)
279 (((
280 **{{id name="_Toc15"/}}deepInclusion** - точная проверка того, что один элемент включен в другой элемент
281 )))
282
283 * **calc.deepInclusion(GeometryElement elementContent, GeometryElement elementContainer) ** - точная проверка того, что один элемент включен в другой элемент
284
285 **Пример использования:**
286
287 {{code language="java"}}{{/code}}
288
289 (% class="box infomessage" %)
290 (((
291 **{{id name="_Toc16"/}}createOrientedBox** - создание OBB на основе заданного элемента и в заданном направлении
292 )))
293
294 * **calc.createOrientedBox(Vector3f center, Vector3f direction, double width, double depth, double height) ** - создание OBB на основе заданного элемента и в заданном направлении
295
296 **Пример использования:**
297
298 {{code language="java"}}{{/code}}
299
300 (% class="box infomessage" %)
301 (((
302 **{{id name="_Toc17"/}}distance2D** - расчёт двумерного расстояния между элементами в плоскости XY, 0 если пересекаются
303 )))
304
305 * **calc.distance2D(GeometryObject data1, GeometryObject data2) ** - расчёт двумерного расстояния между элементами в плоскости XY, 0 если пересекаются
306
307 **Пример использования:**
308
309 {{code language="java"}}{{/code}}
310
311 (% class="box infomessage" %)
312 (((
313 **{{id name="_Toc18"/}}distance2DHorizontal** - расчёт минимального двумерного расстояния между элементами в плоскости XY
314 )))
315
316 * **calc.distance2DHorizontal(GeometryObject data1, GeometryObject data2) ** - расчёт минимального двумерного расстояния между элементами в плоскости XY
317
318 **Пример использования:**
319
320 {{code language="java"}}{{/code}}
321
322 (% class="box infomessage" %)
323 (((
324 **{{id name="_Toc19"/}}distance2DWithOffSet** - расчёт двумерного расстояния между элементами со смещением элементов
325 )))
326
327 * **calc.distance2DWithOffSet(GeometryObject data1, GeometryObject data2, double offSetValue) ** - расчёт двумерного расстояния между элементами со смещением элементов
328
329 **Пример использования:**
330
331 {{code language="java"}}{{/code}}
332
333 (% class="box infomessage" %)
334 (((
335 **{{id name="_Toc20"/}}isExtendedAABBIntersectNeighbours** - проверка пересечения aabb элемента с его соседями + с учетом допустимого пространства length, width, height по направлению dir
336 )))
337
338 * **calc.isExtendedAABBIntersectNeighbours(GeometryElement element, Set<GeometryElement> neighbours, double[] dir, final double length, final double width, final double height) ** - проверка пересечения aabb элемента с его соседями + с учетом допустимого пространства length, width, height по направлению dir
339
340 **Пример использования:**
341
342 {{code language="java"}}{{/code}}
343
344 (% class="box infomessage" %)
345 (((
346 **{{id name="_Toc21"/}}isValveBelongToPipe** - проверка принадлежности одного элемента другому
347 )))
348
349 * **calc.isValveBelongToPipe(GeometryElement valve, GeometryElement pipe) ** - проверка принадлежности одного элемента другому
350
351 **Пример использования:**
352
353 {{code language="java"}}{{/code}}
354
355 (% class="box infomessage" %)
356 (((
357 **{{id name="_Toc22"/}}getOBBLongestAxis** - возвращает индекс самой длинной стороны obb(X=1, Y=2, Z=3)
358 )))
359
360 * **calc.getOBBLongestAxis(GeometryElement element) ** - возвращает индекс самой длинной стороны obb(X=1, Y=2, Z=3)
361
362 **Пример использования:**
363
364 {{code language="java"}}{{/code}}