Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : LocalToleranceTool.cpp
3 : : //
4 : : // Purpose : The tool used to calculate local tolerance at RefEntities (Vert, Curve, Surface, Volume)
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : William Roshan Quadros
9 : : //
10 : : // Creation Date : 11/16/2010
11 : : //
12 : : //-------------------------------------------------------------------------
13 : :
14 : : #include <string.h>
15 : : #include <assert.h>
16 : : #include <stdlib.h>
17 : : #include <math.h>
18 : : #include <sstream>
19 : : #include <iostream>
20 : :
21 : : #include "LocalToleranceTool.hpp"
22 : :
23 : : #include "CubitDefines.h"
24 : : #include "GeometryDefines.h"
25 : : #include "GeometryQueryTool.hpp"
26 : : #include "MergeTool.hpp"
27 : :
28 : : #include "RefEntityFactory.hpp"
29 : : #include "BodySM.hpp"
30 : : #include "BasicTopologyEntity.hpp"
31 : :
32 : : #include "RefEntity.hpp"
33 : : #include "RefVertex.hpp"
34 : : #include "RefEdge.hpp"
35 : : #include "RefFace.hpp"
36 : : #include "RefVolume.hpp"
37 : :
38 : :
39 : : // Instance of static members
40 : : LocalToleranceTool* LocalToleranceTool::instance_ = 0;
41 : :
42 : : //===================================================================================
43 : : // Description: constructor
44 : : // Notes:
45 : : // Author: roshan
46 : : // Date: 11/16/2010
47 : : //===================================================================================
48 : 0 : LocalToleranceTool::LocalToleranceTool()
49 : : {
50 : :
51 : 0 : }
52 : :
53 : : //===================================================================================
54 : : // Description: destructor
55 : : // Notes:
56 : : // Author: roshan
57 : : // Date: 11/16/2010
58 : : //===================================================================================
59 : 0 : LocalToleranceTool::~LocalToleranceTool()
60 : : {
61 : :
62 : 0 : }
63 : :
64 : : //-------------------------------------------------------------------------
65 : : // Purpose : Controls access and creation of the sole instance of this
66 : : // class.
67 : : //
68 : : // Special Notes :
69 : : //
70 : : // Creator : William Roshan Quadros
71 : : //
72 : : // Creation Date : 11/16/2010
73 : : //-------------------------------------------------------------------------
74 : :
75 : 0 : LocalToleranceTool* LocalToleranceTool::instance(void)
76 : : {
77 : : // Check to see if we have created an instance of the class
78 : : // If not, proceed to create one.
79 : :
80 : : //if (LocalToleranceTool::instance_ == 0)
81 : : // {
82 : : // LocalToleranceTool::instance_ = new LocalToleranceTool() ;
83 : :
84 : : //
85 : : // }
86 : :
87 : : // Return the a pointer to the instance of the class.
88 : 0 : return NULL; //LocalToleranceTool::instance_ ;
89 : : }
90 : :
91 : : //-------------------------------------------------------------------------
92 : : // Purpose : Deletes instance variable
93 : : //
94 : : // Special Notes :
95 : : //
96 : : // Creator : William Roshan Quadros
97 : : //
98 : : // Creation Date : 11/16/2010
99 : : //-------------------------------------------------------------------------
100 : 0 : void LocalToleranceTool::delete_instance()
101 : : {
102 [ # # ]: 0 : if( NULL != instance_ )
103 : : {
104 [ # # ]: 0 : delete instance_;
105 : 0 : instance_ = NULL;
106 : : }
107 : 0 : }
108 : :
109 : : //-------------------------------------------------------------------------
110 : : // Purpose : calculates the local tolerances at all ref_entities of input bodies
111 : : //
112 : : // Special Notes :
113 : : //
114 : : // Creator : William Roshan Quadros
115 : : //
116 : : // Creation Date : 11/16/2010
117 : : //-------------------------------------------------------------------------
118 : 0 : bool LocalToleranceTool::calculate_local_tolerances( DLIList<BodySM*> body_sm_list )
119 : : {
120 : 0 : bool rv = true;
121 : 0 : const double default_vert_local_tol = 0.001;
122 : 0 : const double default_edge_local_tol = 0.01;
123 : 0 : const double default_face_local_tol = 0.02;
124 : 0 : const double default_vol_local_tol = 0.03;
125 : : int i;
126 : :
127 : : // get all bodies
128 [ # # ]: 0 : DLIList<Body *> bodies;
129 [ # # ][ # # ]: 0 : RefEntityFactory::instance()->bodies( bodies );
130 : :
131 : : // find all ref_vert in the bodies
132 [ # # ][ # # ]: 0 : DLIList<RefVertex *> ref_verts;
133 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->ref_vertices( ref_verts );
134 : :
135 : : // for now set default value in all ref_vert
136 : : RefVertex *ref_vert;
137 [ # # ][ # # ]: 0 : for( i = 0; i < ref_verts.size(); i++ )
138 : : {
139 [ # # ]: 0 : ref_vert = ref_verts.get_and_step();
140 [ # # ]: 0 : ref_vert->local_tolerance( default_vert_local_tol );
141 : : }
142 : :
143 : : // find all ref_edge in the bodies
144 [ # # ][ # # ]: 0 : DLIList<RefEdge *> ref_edges;
145 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->ref_edges( ref_edges );
146 : :
147 : : // for now set default value in all ref_edges
148 : : RefEdge *ref_edge;
149 [ # # ][ # # ]: 0 : for( i = 0; i < ref_edges.size(); i++ )
150 : : {
151 [ # # ]: 0 : ref_edge = ref_edges.get_and_step();
152 [ # # ]: 0 : ref_edge->local_tolerance( default_edge_local_tol );
153 : : }
154 : :
155 : : // find all ref_face in the bodies
156 [ # # ][ # # ]: 0 : DLIList<RefFace *> ref_faces;
157 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->ref_faces( ref_faces );
158 : :
159 : : // for now set default value in all ref_faces
160 : : RefFace *ref_face;
161 [ # # ][ # # ]: 0 : for( i = 0; i < ref_faces.size(); i++ )
162 : : {
163 [ # # ]: 0 : ref_face = ref_faces.get_and_step();
164 [ # # ]: 0 : ref_face->local_tolerance( default_face_local_tol );
165 : : }
166 : :
167 : : // find all ref_vol in the bodies
168 [ # # ][ # # ]: 0 : DLIList<RefVolume *> ref_vols;
169 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->ref_volumes( ref_vols );
170 : :
171 : : // for now set default value in all ref_vols
172 : : RefVolume *ref_vol;
173 [ # # ][ # # ]: 0 : for( i = 0; i < ref_vols.size(); i++ )
174 : : {
175 [ # # ]: 0 : ref_vol = ref_vols.get_and_step();
176 [ # # ]: 0 : ref_vol->local_tolerance( default_vol_local_tol );
177 : : }
178 : :
179 [ # # ]: 0 : return rv;
180 : : }
181 : :
182 : : //-------------------------------------------------------------------------
183 : : // Purpose : calculates the local tolerances automatically at all the ref_entities of input bodies
184 : : //
185 : : // Special Notes :
186 : : //
187 : : // Creator : William Roshan Quadros
188 : : //
189 : : // Creation Date : 11/16/2010
190 : : //-------------------------------------------------------------------------
191 : 0 : bool LocalToleranceTool::calculate_local_tolerances_automatically( DLIList<BodySM*> body_sm_list )
192 : : {
193 : 0 : bool rv = true;
194 : :
195 : : // find mergable surfaces
196 [ # # ]: 0 : double geom_factor = GeometryQueryTool::get_geometry_factor();
197 : 0 : double merge_tolerance = geom_factor*GEOMETRY_RESABS;
198 [ # # ]: 0 : DLIList< DLIList<Surface*>*> lists_of_mergeable_surfaces;
199 [ # # ][ # # ]: 0 : MergeTool::instance()->find_only_mergeable_surfaces ( body_sm_list, lists_of_mergeable_surfaces, merge_tolerance );
200 : :
201 : :
202 : : /* Pseudocode for future use
203 : : // Map holding overlapping surface pairs
204 : : overlapping_surfs_map;
205 : : // Add all surfs to spatial tree
206 : : SpatialTree.add(all_surfs);
207 : : // Create array of all surfs sorted by surface area (smallest to largest)
208 : : all_surf_array.sort();
209 : : // Loop through progressively larger merge tolerances
210 : : for(cur_tol=.00001; cur_tol < .1; cur_tol *= 10.0)
211 : : {
212 : : // Each time array size may change because surfs have been removed.
213 : : int num_surfs = all_surf_array.size(), i;
214 : : for(i=0; i<num_surfs; i++)
215 : : {
216 : : cur_surf = all_surf_array[i];
217 : : // Get surfs that are close to the current surf.
218 : : close_surfs = SpatialTree.get_close_surfs(cur_surf);
219 : : // Keep a running total of overlap area so we know when current surf
220 : : // is overlapping completely with other surfs.
221 : : double overlap_area = 0.0;
222 : : int j;
223 : : // Loop over all of the close surfs and look for overlaps.
224 : : for(j=close_surfs.size(); j>0; j--)
225 : : {
226 : : cur_close_surf = close_surfs.get_and_step();
227 : : // If there is already a map entry between these two surfs don't check them again.
228 : : if(!overlapping_surfs_map.entry_exists(cur_surf, cur_close_surf))
229 : : {
230 : : // Measure overlap for these two surfs at current tolerance
231 : : cur_overlap = measure_overlap(cur_surf, cur_close_surf, cur_tol);
232 : : if(cur_overlap > 0.0)
233 : : {
234 : : // add entry for these two surfs (at the current tol)
235 : : overlapping_surfs_map.add_entry(cur_surf, cur_close_surf, cur_tol);
236 : : // Update the overlapping area for cur_surf
237 : : overlap_area += cur_overlap;
238 : : // If overlapping area for cur_surf is all of cur_surf then we are done processing it.
239 : : if(overlap_area == cur_surf.surface_area())
240 : : {
241 : : // Remove cur_surf from all_surf_array
242 : : // Remove cur_surf from SpatialTree (if this helps with efficiency)
243 : : // jump out of processing of cur_surf
244 : : j=0;
245 : : }
246 : : }
247 : : }
248 : : }
249 : : }
250 : : }
251 : : */
252 [ # # ]: 0 : return rv;
253 : : }
254 : :
255 : : //-------------------------------------------------------------------------
256 : : // Purpose : debugging function to print local tolerances at all ref_entities of the input bodies
257 : : //
258 : : // Special Notes :
259 : : //
260 : : // Creator : William Roshan Quadros
261 : : //
262 : : // Creation Date : 11/16/2010
263 : : //-------------------------------------------------------------------------
264 : 0 : bool LocalToleranceTool::print_local_tolerances( DLIList<BodySM*> body_sm_list )
265 : : {
266 : 0 : bool rv = true;
267 : : int i;
268 : :
269 : : // get all bodies
270 [ # # ]: 0 : DLIList<Body *> bodies;
271 [ # # ][ # # ]: 0 : RefEntityFactory::instance()->bodies( bodies );
272 : :
273 : : // find all ref_vert in the bodies
274 [ # # ][ # # ]: 0 : DLIList<RefVertex *> ref_verts;
275 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->ref_vertices( ref_verts );
276 : :
277 : : // for now set default value in all ref_vert
278 : : RefVertex *ref_vert;
279 [ # # ][ # # ]: 0 : for( i = 0; i < ref_verts.size(); i++ )
280 : : {
281 [ # # ]: 0 : ref_vert = ref_verts.get_and_step();
282 [ # # ][ # # ]: 0 : PRINT_INFO( " vert id %d, local_tol %f \n", ref_vert->id(), ref_vert->local_tolerance() );
[ # # ][ # # ]
[ # # ][ # # ]
283 : : }
284 : :
285 : : // find all ref_edge in the bodies
286 [ # # ][ # # ]: 0 : DLIList<RefEdge *> ref_edges;
287 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->ref_edges( ref_edges );
288 : :
289 : : // for now set default value in all ref_edges
290 : : RefEdge *ref_edge;
291 [ # # ][ # # ]: 0 : for( i = 0; i < ref_edges.size(); i++ )
292 : : {
293 [ # # ]: 0 : ref_edge = ref_edges.get_and_step();
294 [ # # ][ # # ]: 0 : PRINT_INFO( " edge id %d, local_tol %f \n", ref_edge->id(), ref_edge->local_tolerance() );
[ # # ][ # # ]
[ # # ][ # # ]
295 : : }
296 : :
297 : : // find all ref_face in the bodies
298 [ # # ][ # # ]: 0 : DLIList<RefFace *> ref_faces;
299 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->ref_faces( ref_faces );
300 : :
301 : : // for now set default value in all ref_faces
302 : : RefFace *ref_face;
303 [ # # ][ # # ]: 0 : for( i = 0; i < ref_faces.size(); i++ )
304 : : {
305 [ # # ]: 0 : ref_face = ref_faces.get_and_step();
306 [ # # ][ # # ]: 0 : PRINT_INFO( " face id %d, local_tol %f \n", ref_face->id(), ref_face->local_tolerance() );
[ # # ][ # # ]
[ # # ][ # # ]
307 : : }
308 : :
309 : : // find all ref_vol in the bodies
310 [ # # ][ # # ]: 0 : DLIList<RefVolume *> ref_vols;
311 [ # # ][ # # ]: 0 : GeometryQueryTool::instance()->ref_volumes( ref_vols );
312 : :
313 : : // for now set default value in all ref_vols
314 : : RefVolume *ref_vol;
315 [ # # ][ # # ]: 0 : for( i = 0; i < ref_vols.size(); i++ )
316 : : {
317 [ # # ]: 0 : ref_vol = ref_vols.get_and_step();
318 [ # # ][ # # ]: 0 : PRINT_INFO( " vol id %d, local_tol %f \n", ref_vol->id(), ref_vol->local_tolerance() );
[ # # ][ # # ]
[ # # ][ # # ]
319 : : }
320 : :
321 [ # # ]: 0 : return rv;
322 [ + - ][ + - ]: 6540 : }
323 : :
|