Branch data Line data Source code
1 : : //- Class: BoundingBoxTool
2 : : //- Description: Class for bounding boxes (primarily for "tight" bounding boxes)
3 : : //- Owner: Steve Storm
4 : : //- Created: 06-October-2000
5 : :
6 : : #include "CubitBox.hpp"
7 : : #include "Body.hpp"
8 : : #include "RefVolume.hpp"
9 : : #include "RefFace.hpp"
10 : : #include "RefEdge.hpp"
11 : : #include "RefVertex.hpp"
12 : : #include "RefGroup.hpp"
13 : :
14 : : #include "BoundingBoxTool.hpp"
15 : : #include "AnalyticGeometryTool.hpp"
16 : : #include "GMem.hpp"
17 : :
18 : : #include "GeometryQueryEngine.hpp"
19 : :
20 : : #include "DLIList.hpp"
21 : :
22 : : #include "SettingHandler.hpp"
23 : :
24 : : CubitBoolean BoundingBoxTool::useTriangles = CUBIT_TRUE;
25 : : CubitBoolean BoundingBoxTool::useCurves = CUBIT_FALSE;
26 : : CubitBoolean BoundingBoxTool::useVertices = CUBIT_FALSE;
27 : :
28 : 0 : BoundingBoxTool::BoundingBoxTool()
29 : 0 : {}
30 : :
31 : : // Destructor
32 : 0 : BoundingBoxTool::~BoundingBoxTool()
33 : 0 : {}
34 : :
35 : : CubitStatus
36 : 0 : BoundingBoxTool::get_tight_bounding_box( DLIList<RefEntity*> &ref_entity_list,
37 : : CubitVector ¢er,
38 : : CubitVector axes[3],
39 : : CubitVector &extension,
40 : : double ang_facet_tol,
41 : : double abs_facet_tol )
42 : : {
43 [ # # ]: 0 : DLIList<CubitVector*> vec_list;
44 : :
45 : : // Expand out groups in the list
46 [ # # ][ # # ]: 0 : DLIList<RefEntity*> ref_entity_list_expanded = ref_entity_list;
47 [ # # ]: 0 : expand_groups_in_list( ref_entity_list_expanded );
48 : :
49 : : // Get the facet points from all the objects in the list
50 [ # # ]: 0 : append_ref_entity_points( ref_entity_list_expanded, vec_list, ang_facet_tol, abs_facet_tol );
51 : :
52 : : // Get the smallest box that fits around the points making up the facetted geometry
53 : : AnalyticGeometryTool::instance()->get_tight_bounding_box( vec_list, center,
54 [ # # ][ # # ]: 0 : axes, extension );
55 : :
56 : : // Free memory
57 [ # # ][ # # ]: 0 : for( int i=0; i<vec_list.size(); i++ )
58 : : {
59 : : CubitVector* cubit_vector_ptr =
60 [ # # ]: 0 : vec_list.get_and_step();
61 : 0 : delete cubit_vector_ptr;
62 : : }
63 : :
64 [ # # ]: 0 : return CUBIT_SUCCESS;
65 : : }
66 : :
67 : : CubitStatus
68 : 0 : BoundingBoxTool::get_axis_bounding_box( DLIList<RefEntity*> &ref_entity_list,
69 : : CubitVector ¢er,
70 : : CubitVector axes[3],
71 : : CubitVector &extension )
72 : : {
73 : 0 : CubitBoolean bounding_box_found = CUBIT_FALSE;
74 [ # # ]: 0 : CubitBox bounding_box;
75 : :
76 : : // Expand out groups in the list
77 [ # # ][ # # ]: 0 : DLIList<RefEntity*> ref_entity_list_expanded = ref_entity_list;
78 [ # # ]: 0 : expand_groups_in_list( ref_entity_list_expanded );
79 : :
80 [ # # ]: 0 : ref_entity_list_expanded.reset();
81 [ # # ][ # # ]: 0 : for( int i = ref_entity_list_expanded.size(); i>0; i-- )
82 : : {
83 [ # # ]: 0 : RefEntity* ref_entity_ptr = ref_entity_list_expanded.get_and_step();
84 [ # # ]: 0 : if( bounding_box_found == CUBIT_FALSE )
85 : : {
86 [ # # ][ # # ]: 0 : bounding_box = ref_entity_ptr->bounding_box();
[ # # ]
87 : 0 : bounding_box_found = CUBIT_TRUE;
88 : : }
89 : : else {
90 [ # # ][ # # ]: 0 : bounding_box |= ref_entity_ptr->bounding_box();
[ # # ]
91 : : }
92 : : }
93 : :
94 [ # # ]: 0 : axes[0].set( 1.0, 0.0, 0.0 );
95 [ # # ]: 0 : axes[1].set( 0.0, 1.0, 0.0 );
96 [ # # ]: 0 : axes[2].set( 0.0, 0.0, 1.0 );
97 : :
98 [ # # ]: 0 : if( bounding_box_found )
99 : : {
100 [ # # ][ # # ]: 0 : extension.set( bounding_box.x_range()/2.0, bounding_box.y_range()/2.0,
101 [ # # ][ # # ]: 0 : bounding_box.z_range()/2.0 );
102 [ # # ][ # # ]: 0 : center = bounding_box.center();
103 : : }
104 : : else
105 : : {
106 [ # # ]: 0 : extension.set( 0.0, 0.0, 0.0 );
107 [ # # ]: 0 : center.set( 0.0, 0.0, 0.0 );
108 : : }
109 : :
110 [ # # ]: 0 : return CUBIT_SUCCESS;
111 : : }
112 : :
113 : : CubitStatus
114 : 0 : BoundingBoxTool::append_ref_entity_points( DLIList<RefEntity*> &ref_entity_list,
115 : : DLIList<CubitVector*> &vec_list,
116 : : double ang_facet_tol, double abs_facet_tol )
117 : : {
118 [ # # ]: 0 : DLIList<Body*> body_list;
119 [ # # ][ # # ]: 0 : CAST_LIST( ref_entity_list, body_list, Body );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
120 [ # # ][ # # ]: 0 : if( body_list.size() )
121 [ # # ]: 0 : append_body_points( body_list, vec_list, ang_facet_tol, abs_facet_tol );
122 : :
123 [ # # ][ # # ]: 0 : DLIList<RefVolume*> vol_list;
124 [ # # ][ # # ]: 0 : CAST_LIST( ref_entity_list, vol_list, RefVolume );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
125 [ # # ][ # # ]: 0 : if( vol_list.size() )
126 [ # # ]: 0 : append_volume_points( vol_list, vec_list, ang_facet_tol, abs_facet_tol );
127 : :
128 [ # # ][ # # ]: 0 : DLIList<RefFace*> surface_list;
129 [ # # ][ # # ]: 0 : CAST_LIST( ref_entity_list, surface_list, RefFace );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
130 [ # # ][ # # ]: 0 : if( surface_list.size() )
131 [ # # ]: 0 : append_surface_points( surface_list, vec_list, ang_facet_tol, abs_facet_tol );
132 : :
133 [ # # ][ # # ]: 0 : DLIList<RefEdge*> curve_list;
134 [ # # ][ # # ]: 0 : CAST_LIST( ref_entity_list, curve_list, RefEdge );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
135 [ # # ][ # # ]: 0 : if( curve_list.size() )
136 [ # # ]: 0 : append_curve_points( curve_list, vec_list );
137 : :
138 [ # # ][ # # ]: 0 : DLIList<RefVertex*> vertex_list;
139 [ # # ][ # # ]: 0 : CAST_LIST( ref_entity_list, vertex_list, RefVertex );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
140 [ # # ][ # # ]: 0 : if( vertex_list.size() )
141 [ # # ]: 0 : append_vertex_points( vertex_list, vec_list );
142 : :
143 [ # # ]: 0 : return CUBIT_SUCCESS;
144 : : }
145 : :
146 : : CubitStatus
147 : 0 : BoundingBoxTool::append_body_points( DLIList<Body*> &body_list,
148 : : DLIList<CubitVector*> &vec_list,
149 : : double ang_tol, double abs_tol )
150 : : {
151 : : int i;
152 : : Body *body_ptr;
153 [ # # ]: 0 : DLIList<RefFace*> ref_face_list;
154 : :
155 [ # # ]: 0 : body_list.reset();
156 [ # # ][ # # ]: 0 : for( i=0; i<body_list.size(); i++ )
157 : : {
158 [ # # ]: 0 : body_ptr = body_list.get_and_step();
159 : :
160 [ # # ]: 0 : DLIList<RefFace*> ref_face_list_tmp;
161 [ # # ]: 0 : body_ptr->ref_faces( ref_face_list_tmp );
162 : :
163 [ # # ]: 0 : ref_face_list.merge_unique( ref_face_list_tmp );
164 [ # # ]: 0 : }
165 : :
166 [ # # ]: 0 : append_surface_points( ref_face_list, vec_list, ang_tol, abs_tol);
167 : :
168 [ # # ]: 0 : return CUBIT_SUCCESS;
169 : : }
170 : :
171 : : CubitStatus
172 : 0 : BoundingBoxTool::append_volume_points( DLIList<RefVolume*> &vol_list,
173 : : DLIList<CubitVector*> &vec_list,
174 : : double ang_tol, double abs_tol )
175 : : {
176 : : int i;
177 : : RefVolume *vol_ptr;
178 [ # # ]: 0 : DLIList<RefFace*> ref_face_list;
179 : :
180 [ # # ]: 0 : vol_list.reset();
181 [ # # ][ # # ]: 0 : for( i=0; i<vol_list.size(); i++ )
182 : : {
183 [ # # ]: 0 : vol_ptr = vol_list.get_and_step();
184 : :
185 [ # # ]: 0 : DLIList<RefFace*> ref_face_list_tmp;
186 [ # # ]: 0 : vol_ptr->ref_faces( ref_face_list_tmp );
187 : :
188 [ # # ]: 0 : ref_face_list.merge_unique( ref_face_list_tmp );
189 [ # # ]: 0 : }
190 : :
191 [ # # ]: 0 : append_surface_points( ref_face_list, vec_list, ang_tol, abs_tol);
192 : :
193 [ # # ]: 0 : return CUBIT_SUCCESS;
194 : : }
195 : :
196 : : CubitStatus
197 : 0 : BoundingBoxTool::append_surface_points( DLIList<RefFace*> &ref_face_list,
198 : : DLIList<CubitVector*> &vec_list,
199 : : double ang_tol, double abs_tol)
200 : : {
201 : : int i;
202 : : RefFace *ref_face_ptr;
203 [ # # ]: 0 : DLIList<RefEdge*> ref_edge_list;
204 [ # # ][ # # ]: 0 : DLIList<RefVertex*> ref_vertex_list;
205 : :
206 [ # # ]: 0 : ref_face_list.reset();
207 [ # # ][ # # ]: 0 : for( i=0; i<ref_face_list.size(); i++ )
208 : : {
209 [ # # ]: 0 : ref_face_ptr = ref_face_list.get_and_step();
210 : :
211 [ # # ]: 0 : if( useTriangles == CUBIT_TRUE )
212 : : {
213 : : int num_pnt;
214 [ # # ][ # # ]: 0 : GMem *g_mem = new GMem;
215 : :
216 [ # # ]: 0 : ref_face_ptr->get_graphics( *g_mem, (int)ang_tol, abs_tol );
217 : 0 : num_pnt = g_mem->pointListCount;
218 : :
219 [ # # ]: 0 : GPoint* point_list = g_mem->point_list();
220 : : //int num_pnts = g_mem->point_list_size();
221 : : int y;
222 [ # # ]: 0 : for( y=0; y<num_pnt; y++ )
223 : : {
224 : : CubitVector* cubit_vector_ptr = new CubitVector(
225 [ # # ][ # # ]: 0 : point_list[y].x, point_list[y].y, point_list[y].z );
226 [ # # ]: 0 : vec_list.append( cubit_vector_ptr );
227 : : }
228 [ # # ][ # # ]: 0 : delete g_mem;
229 : : }
230 : :
231 [ # # ]: 0 : if( useCurves == CUBIT_TRUE )
232 : : {
233 : : // Grab the curves from the surface
234 [ # # ]: 0 : DLIList<RefEdge*> ref_edge_list_tmp;
235 [ # # ]: 0 : ref_face_ptr->ref_edges( ref_edge_list_tmp );
236 [ # # ][ # # ]: 0 : ref_edge_list.merge_unique( ref_edge_list_tmp );
237 : : }
238 : :
239 : : // Only need vertices if both surfaces and curves are false
240 [ # # ][ # # ]: 0 : if( useTriangles == CUBIT_FALSE && useCurves == CUBIT_FALSE &&
[ # # ]
241 : 0 : useVertices == CUBIT_TRUE )
242 : : {
243 : : // Grab the vertices from the surface
244 [ # # ]: 0 : DLIList<RefVertex*> ref_vertex_list_tmp;
245 [ # # ]: 0 : ref_face_ptr->ref_vertices( ref_vertex_list_tmp );
246 [ # # ][ # # ]: 0 : ref_vertex_list.merge_unique( ref_vertex_list_tmp );
247 : : }
248 : : }
249 : :
250 [ # # ]: 0 : if( useCurves == CUBIT_TRUE )
251 [ # # ]: 0 : append_curve_points( ref_edge_list, vec_list );
252 : :
253 [ # # ][ # # ]: 0 : if( useTriangles == CUBIT_FALSE && useCurves == CUBIT_FALSE &&
[ # # ]
254 : 0 : useVertices == CUBIT_TRUE )
255 [ # # ]: 0 : append_vertex_points( ref_vertex_list, vec_list );
256 : :
257 [ # # ]: 0 : return CUBIT_SUCCESS;
258 : : }
259 : :
260 : : CubitStatus
261 : 0 : BoundingBoxTool::append_curve_points( DLIList<RefEdge*> &ref_edge_list,
262 : : DLIList<CubitVector*> &vec_list )
263 : : {
264 : : // First grab all the vertices and append their coordinates to vec_list.
265 : : // Then do the curves, but just put inside points in. This avoids duplicate
266 : : // points at the vertices.
267 : :
268 : : int i;
269 : : RefEdge *ref_edge_ptr;
270 [ # # ]: 0 : DLIList<RefVertex*> ref_vertex_list;
271 [ # # ]: 0 : ref_edge_list.reset();
272 [ # # ][ # # ]: 0 : for( i=0; i<ref_edge_list.size(); i++ )
273 : : {
274 [ # # ]: 0 : ref_edge_ptr = ref_edge_list.get_and_step();
275 [ # # ]: 0 : DLIList<RefVertex*> ref_vertex_list_temp;
276 [ # # ]: 0 : ref_edge_ptr->ref_vertices( ref_vertex_list_temp );
277 [ # # ]: 0 : ref_vertex_list.merge_unique( ref_vertex_list_temp );
278 [ # # ]: 0 : }
279 [ # # ]: 0 : append_vertex_points( ref_vertex_list, vec_list );
280 : :
281 : : // Now add the *inside* curve points
282 : :
283 : : int j, num_pnts;
284 [ # # ]: 0 : ref_edge_list.reset();
285 [ # # ][ # # ]: 0 : for( i=0; i<ref_edge_list.size(); i++ )
286 : : {
287 [ # # ]: 0 : ref_edge_ptr = ref_edge_list.get_and_step();
288 [ # # ][ # # ]: 0 : GMem *g_mem = new GMem;
289 : :
290 [ # # ]: 0 : ref_edge_ptr->get_graphics( *g_mem );
291 : 0 : num_pnts = g_mem->pointListCount;
292 : :
293 [ # # ]: 0 : GPoint* point_list = g_mem->point_list();
294 : :
295 [ # # ]: 0 : for( j=1; j<num_pnts-1; j++ )
296 : : {
297 : : CubitVector* cubit_vector_ptr = new CubitVector(
298 [ # # ][ # # ]: 0 : point_list[j].x, point_list[j].y, point_list[j].z );
299 [ # # ]: 0 : vec_list.append( cubit_vector_ptr );
300 : : }
301 [ # # ][ # # ]: 0 : delete g_mem;
302 : : }
303 : :
304 [ # # ]: 0 : return CUBIT_SUCCESS;
305 : : }
306 : :
307 : : CubitStatus
308 : 0 : BoundingBoxTool::append_vertex_points( DLIList<RefVertex*> &ref_vertex_list,
309 : : DLIList<CubitVector*> &vec_list )
310 : : {
311 : : int i;
312 : : RefVertex *ref_vertex_ptr;
313 : 0 : ref_vertex_list.reset();
314 [ # # ]: 0 : for( i=0; i<ref_vertex_list.size(); i++ )
315 : : {
316 [ # # ]: 0 : ref_vertex_ptr = ref_vertex_list.get_and_step();
317 [ # # ]: 0 : CubitVector coords = ref_vertex_ptr->coordinates();
318 [ # # ][ # # ]: 0 : CubitVector* cubit_vector_ptr = new CubitVector( coords );
319 [ # # ]: 0 : vec_list.append( cubit_vector_ptr );
320 : : }
321 : 0 : return CUBIT_SUCCESS;
322 : : }
323 : :
324 : :
325 : : CubitStatus
326 : 0 : BoundingBoxTool::get_corner_points( CubitVector ¢er,
327 : : CubitVector axes[3],
328 : : CubitVector &extension,
329 : : CubitVector& p1, CubitVector& p2,
330 : : CubitVector& p3, CubitVector& p4,
331 : : CubitVector& p5, CubitVector& p6,
332 : : CubitVector& p7, CubitVector& p8)
333 : : {
334 : 0 : double x = extension.x(); double y = extension.y(); double z = extension.z();
335 : :
336 : : // Front, Bottom, Left
337 [ # # ][ # # ]: 0 : center.next_point( -axes[0], x, p1 ); p1.next_point( -axes[1], y, p1 );
338 : 0 : p1.next_point( axes[2], z, p1 );
339 : :
340 : : // Front, Top, Left
341 [ # # ]: 0 : center.next_point( -axes[0], x, p2 ); p2.next_point( axes[1], y, p2 );
342 : 0 : p2.next_point( axes[2], z, p2 );
343 : :
344 : : // Front, Top, Right
345 : 0 : center.next_point( axes[0], x, p3 ); p3.next_point( axes[1], y, p3 );
346 : 0 : p3.next_point( axes[2], z, p3 );
347 : :
348 : : // Front, Bottom, Right
349 [ # # ]: 0 : center.next_point( axes[0], x, p4 ); p4.next_point( -axes[1], y, p4 );
350 : 0 : p4.next_point( axes[2], z, p4 );
351 : :
352 : : // Back, Bottom, Left
353 [ # # ][ # # ]: 0 : center.next_point( -axes[0], x, p5 ); p5.next_point( -axes[1], y, p5 );
354 [ # # ]: 0 : p5.next_point( -axes[2], z, p5 );
355 : :
356 : : // Back, Top, Left
357 [ # # ]: 0 : center.next_point( -axes[0], x, p6 ); p6.next_point( axes[1], y, p6 );
358 [ # # ]: 0 : p6.next_point( -axes[2], z, p6 );
359 : :
360 : : // Back, Top, Right
361 : 0 : center.next_point( axes[0], x, p7 ); p7.next_point( axes[1], y, p7 );
362 [ # # ]: 0 : p7.next_point( -axes[2], z, p7 );
363 : :
364 : : // Back, Bottom, Right
365 [ # # ]: 0 : center.next_point( axes[0], x, p8 ); p8.next_point( -axes[1], y, p8 );
366 [ # # ]: 0 : p8.next_point( -axes[2], z, p8 );
367 : :
368 : 0 : return CUBIT_SUCCESS;
369 : : }
370 : :
371 : :
372 : : //Initialize all settings in this class
373 : 874 : void BoundingBoxTool::initialize_settings()
374 : : {
375 : :
376 : : SettingHandler::instance()->add_setting("Tight Surface",
377 : : BoundingBoxTool::set_use_triangles_setting,
378 : 874 : BoundingBoxTool::get_use_triangles_setting );
379 : :
380 : : SettingHandler::instance()->add_setting("Tight Curve",
381 : : BoundingBoxTool::set_use_curves_setting,
382 : 874 : BoundingBoxTool::get_use_curves_setting);
383 : :
384 : : SettingHandler::instance()->add_setting("Tight Vertex",
385 : : BoundingBoxTool::set_use_vertices_setting,
386 : 874 : BoundingBoxTool::get_use_vertices_setting);
387 : :
388 : :
389 : 874 : }
390 : :
391 : :
392 : :
393 : : CubitBoolean
394 : 0 : BoundingBoxTool::expand_groups_in_list( DLIList<RefEntity*> &ref_entity_list )
395 : : {
396 : 0 : CubitBoolean group_found = CUBIT_FALSE;
397 : : // just have to step through original entity_list, not the expanded list
398 [ # # ]: 0 : for (int i = ref_entity_list.size(); i>0; i--)
399 : : {
400 : 0 : RefEntity *entity = ref_entity_list.get();
401 [ # # ]: 0 : RefGroup *group = CAST_TO( entity, RefGroup );
402 [ # # ]: 0 : if ( group )
403 : : {
404 : 0 : ref_entity_list.remove();
405 : 0 : group->expand_group( ref_entity_list );
406 : 0 : group_found = CUBIT_TRUE;
407 : : }
408 : : else
409 : 0 : ref_entity_list.step();
410 : : }
411 : 0 : return group_found;
412 : : }
413 : :
414 : :
415 : 0 : int BoundingBoxTool::get_use_triangles_setting()
416 : 0 : {return useTriangles;}
417 : :
418 : 0 : void BoundingBoxTool::set_use_triangles_setting( int val )
419 [ # # ]: 0 : {useTriangles = (val) ? CUBIT_TRUE : CUBIT_FALSE;}
420 : :
421 : 0 : int BoundingBoxTool::get_use_curves_setting()
422 : 0 : {return useCurves;}
423 : :
424 : 0 : void BoundingBoxTool::set_use_curves_setting( int val )
425 [ # # ]: 0 : {useCurves = (val) ? CUBIT_TRUE : CUBIT_FALSE;}
426 : :
427 : 0 : int BoundingBoxTool::get_use_vertices_setting()
428 : 0 : {return useVertices;}
429 : :
430 : 0 : void BoundingBoxTool::set_use_vertices_setting( int val )
431 [ # # ]: 0 : {useVertices = (val) ? CUBIT_TRUE : CUBIT_FALSE;}
432 : :
433 : :
434 : 0 : CubitBoolean BoundingBoxTool::get_use_triangles()
435 : 0 : {return useTriangles;}
436 : :
437 : 0 : void BoundingBoxTool::set_use_triangles( CubitBoolean val )
438 : 0 : {useTriangles=val;}
439 : :
440 : 0 : CubitBoolean BoundingBoxTool::get_use_curves()
441 : 0 : {return useCurves;}
442 : :
443 : 0 : void BoundingBoxTool::set_use_curves( CubitBoolean val )
444 : 0 : {useCurves=val;}
445 : :
446 : 0 : CubitBoolean BoundingBoxTool::get_use_vertices()
447 : 0 : {return useVertices;}
448 : :
449 : 0 : void BoundingBoxTool::set_use_vertices( CubitBoolean val )
450 [ + - ][ + - ]: 6540 : {useVertices=val;}
451 : :
452 : :
|