Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : FacetQueryEngine.cpp
3 : : //
4 : : // Purpose : Implementation of the FacetQueryEngine class.
5 : : // This class provides facet-based implementations
6 : : // of various virtual functions in the GeometryQueryEngine
7 : : // hierarchy.
8 : : //
9 : : // Special Notes :
10 : : //
11 : : // Creator : David R. White
12 : : //
13 : : // Creation Date : 7/17/00
14 : : //
15 : : //-------------------------------------------------------------------------
16 : : #include "FacetQueryEngine.hpp"
17 : : #include "FacetModifyEngine.hpp"
18 : : #include "FacetboolInterface.hpp"
19 : : #include "TopologyEntity.hpp"
20 : : #include "TopologyBridge.hpp"
21 : : #include "RefEntity.hpp"
22 : : #include "Body.hpp"
23 : : #include "Shell.hpp"
24 : : #include "Loop.hpp"
25 : : #include "Chain.hpp"
26 : : #include "CoEdge.hpp"
27 : : #include "CoFace.hpp"
28 : : #include "RefVolume.hpp"
29 : : #include "RefFace.hpp"
30 : : #include "RefEdge.hpp"
31 : : #include "RefVertex.hpp"
32 : : #include "GeometryEntity.hpp"
33 : : #include "DLIList.hpp"
34 : : #include "CubitBox.hpp"
35 : : #include "CubitString.hpp"
36 : : #include "FacetPoint.hpp"
37 : : #include "FacetCurve.hpp"
38 : : #include "FacetCoEdge.hpp"
39 : : #include "FacetLoop.hpp"
40 : : #include "FacetSurface.hpp"
41 : : #include "FacetShell.hpp"
42 : : #include "FacetLump.hpp"
43 : : #include "FacetBody.hpp"
44 : : #include "CubitFacetEdge.hpp"
45 : : #include "CubitFacetEdgeData.hpp"
46 : : #include "CubitFacet.hpp"
47 : : #include "CubitFacetData.hpp"
48 : : #include "CubitQuadFacet.hpp"
49 : : #include "CubitQuadFacetData.hpp"
50 : : #include "CubitPoint.hpp"
51 : : #include "GMem.hpp"
52 : : #include "FacetEvalTool.hpp"
53 : : #include "CurveFacetEvalTool.hpp"
54 : : #include "CubitPointData.hpp"
55 : : #include "GeometryQueryTool.hpp"
56 : : #include "ChollaDebug.hpp"
57 : : #include "CubitObserver.hpp"
58 : : #include "ChollaEngine.hpp"
59 : : #include "ChollaSurface.hpp"
60 : : #include "ChollaCurve.hpp"
61 : : #include "ChollaPoint.hpp"
62 : : #include "Cholla.h"
63 : : #include "CubitFileIOWrapper.hpp"
64 : : #include "CCubitFile.hpp"
65 : : #include "TDFacetBoundaryPoint.hpp"
66 : : #include "GfxDebug.hpp"
67 : : #include "KDDTree.hpp"
68 : : #include "RTree.hpp"
69 : : #include "FacetDataUtil.hpp"
70 : : #include "GridSearchTree.hpp"
71 : : #include <stdio.h>
72 : : #include <errno.h>
73 : : #include "GeometryModifyTool.hpp"
74 : : #include "BodySM.hpp"
75 : : #include "AppUtil.hpp"
76 : : #include "ProgressTool.hpp"
77 : : #include "CubitOctreeGeneratorVolumes.hpp"
78 : : #include "GfxDebug.hpp"
79 : :
80 : : using namespace NCubitFile;
81 : :
82 : : FacetQueryEngine* FacetQueryEngine::instance_ = NULL;
83 : : int FacetQueryEngine::hashPointSize = 0;
84 : : DLIList<CubitPoint*> *FacetQueryEngine::hashPointArray = NULL;
85 : :
86 : : const int FacetQueryEngine::FQE_MAJOR_VERSION = 10;
87 : : const int FacetQueryEngine::FQE_MINOR_VERSION = 0;
88 : : const int FacetQueryEngine::FQE_SUBMINOR_VERSION = 0;
89 : :
90 : : struct ContainmentPoint
91 : : {
92 : : CubitVector *pt_coordinates;
93 : : int index;
94 : 0 : CubitBox bounding_box() { return CubitBox( *pt_coordinates); }
95 : : };
96 : :
97 : : //================================================================================
98 : : // Description:
99 : : // Author :
100 : : // Date :
101 : : //================================================================================
102 : 918 : FacetQueryEngine* FacetQueryEngine::instance()
103 : : {
104 [ + + ]: 918 : if (instance_ == NULL ) {
105 [ + - ]: 874 : instance_ = new FacetQueryEngine;
106 : : }
107 : 918 : return instance_;
108 : : }
109 : :
110 : : //================================================================================
111 : : // Description: default constructor
112 : : // Author :
113 : : // Date :
114 : : //================================================================================
115 : 1748 : FacetQueryEngine::FacetQueryEngine()
116 : : {
117 [ + - ][ + - ]: 874 : GeometryQueryTool::instance()->add_gqe( this );
118 : 874 : }
119 : :
120 : : //================================================================================
121 : : // Description: destructor
122 : : // Author :
123 : : // Date :
124 : : //================================================================================
125 : 813 : FacetQueryEngine::~FacetQueryEngine()
126 : : {
127 : 271 : instance_ = NULL;
128 [ - + ]: 542 : }
129 : :
130 : 0 : void FacetQueryEngine::delete_instance()
131 : : {
132 [ # # ]: 0 : if( NULL != instance_ )
133 : : {
134 [ # # ]: 0 : delete instance_;
135 : 0 : instance_ = NULL;
136 : : }
137 : 0 : }
138 : :
139 : :
140 : :
141 : : //================================================================================
142 : : // Description: can_delete_bodies
143 : : // Author : sjowen
144 : : // Date : 4/25/02
145 : : //================================================================================
146 : 0 : CubitBoolean FacetQueryEngine::can_delete_bodies(DLIList<Body*>body_list)
147 : : {
148 : 0 : CubitBoolean delete_ok = CUBIT_TRUE;
149 : : int ii;
150 [ # # ][ # # ]: 0 : for (ii=0; ii<body_list.size() && delete_ok; ii++)
[ # # ]
151 : : {
152 : 0 : Body *body_ptr = body_list.get_and_step();
153 : : // Extract the BODY from Body
154 [ # # ]: 0 : FacetBody* fbody_ptr = CAST_TO(body_ptr->get_body_sm_ptr(), FacetBody);
155 [ # # ]: 0 : if (fbody_ptr)
156 : : {
157 : 0 : delete_ok = fbody_ptr->can_be_deleted(body_list);
158 : : }
159 : : }
160 : 0 : return delete_ok;
161 : : }
162 : :
163 : 22 : int FacetQueryEngine::get_major_version()
164 : : {
165 : 22 : return FQE_MAJOR_VERSION;
166 : : }
167 : :
168 : 22 : int FacetQueryEngine::get_minor_version()
169 : : {
170 : 22 : return FQE_MINOR_VERSION;
171 : : }
172 : :
173 : 22 : int FacetQueryEngine::get_subminor_version()
174 : : {
175 : 22 : return FQE_SUBMINOR_VERSION;
176 : : }
177 : :
178 : 22 : CubitString FacetQueryEngine::get_engine_version_string()
179 : : {
180 : 22 : CubitString version_string = "Facet Geometry Engine version ";
181 [ + - ][ + - ]: 22 : version_string += CubitString::number(get_major_version());
[ + - ][ + - ]
182 [ + - ][ + - ]: 22 : version_string += CubitString(".");
[ + - ]
183 [ + - ][ + - ]: 22 : version_string += CubitString::number(get_minor_version());
[ + - ][ + - ]
184 [ + - ][ + - ]: 22 : version_string += CubitString(".");
[ + - ]
185 [ + - ][ + - ]: 22 : version_string += CubitString::number(get_subminor_version());
[ + - ][ + - ]
186 : :
187 : 22 : return version_string;
188 : : }
189 : :
190 : : //================================================================================
191 : : // Description:
192 : : // Author :
193 : : // Date :
194 : : //================================================================================
195 : 0 : const std::type_info& FacetQueryEngine::entity_type_info() const
196 : : {
197 : 0 : return typeid(*this);
198 : : }
199 : :
200 : : //================================================================================
201 : : // Description:
202 : : // Author :
203 : : // Date :
204 : : //================================================================================
205 : 0 : TBPoint* FacetQueryEngine::make_Point( GeometryType ,
206 : : CubitVector const& ) const
207 : : {
208 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
209 : 0 : return (TBPoint*) NULL;
210 : : }
211 : :
212 : : //================================================================================
213 : : // Description:
214 : : // Author :
215 : : // Date :
216 : : //================================================================================
217 : 0 : Curve* FacetQueryEngine::make_Curve(Curve *) const
218 : : {
219 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
220 : 0 : return (Curve*) NULL;
221 : : }
222 : :
223 : : //================================================================================
224 : : // Description:
225 : : // Author :
226 : : // Date :
227 : : //================================================================================
228 : 0 : Curve* FacetQueryEngine::make_Curve( TBPoint const* ,
229 : : TBPoint const* ,
230 : : RefFace* ,
231 : : CubitVector * ) const
232 : : {
233 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
234 : 0 : return (Curve*) NULL;
235 : : }
236 : :
237 : : //================================================================================
238 : : // Description:
239 : : // Author :
240 : : // Date :
241 : : //================================================================================
242 : 0 : Curve* FacetQueryEngine::make_Curve( GeometryType ,
243 : : TBPoint const* ,
244 : : TBPoint const* ,
245 : : DLIList<CubitVector*>& ,
246 : : RefFace* ) const
247 : : {
248 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
249 : 0 : return (Curve*) NULL;
250 : : }
251 : :
252 : : //================================================================================
253 : : // Description:
254 : : // Author :
255 : : // Date :
256 : : //================================================================================
257 : 0 : Curve* FacetQueryEngine::make_Curve( GeometryType ,
258 : : TBPoint const* ,
259 : : TBPoint const* ,
260 : : CubitVector const* ,
261 : : CubitSense ) const
262 : : {
263 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
264 : 0 : return (Curve*) NULL;
265 : : }
266 : :
267 : : //================================================================================
268 : : // Description:
269 : : // Author :
270 : : // Date :
271 : : //================================================================================
272 : 0 : Surface* FacetQueryEngine::make_Surface( Surface *,
273 : : DLIList<Loop*> &,
274 : : CubitBoolean ) const
275 : : {
276 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
277 : 0 : return (Surface*) NULL;
278 : : }
279 : :
280 : : //================================================================================
281 : : // Description:
282 : : // Author :
283 : : // Date :
284 : : //================================================================================
285 : 0 : Surface* FacetQueryEngine::make_Surface( GeometryType ,
286 : : DLIList<Curve*>& ,
287 : : DLIList<Loop*> &,
288 : : Surface *) const
289 : : {
290 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
291 : 0 : return (Surface*) NULL;
292 : : }
293 : :
294 : : //================================================================================
295 : : // Description:
296 : : // Author :
297 : : // Date :
298 : : //================================================================================
299 : 0 : Lump* FacetQueryEngine::make_Lump( GeometryType ,
300 : : DLIList<Surface*>& ) const
301 : : {
302 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
303 : 0 : return (Lump*) NULL;
304 : : }
305 : :
306 : : //================================================================================
307 : : // Description:
308 : : // Author :
309 : : // Date :
310 : : //================================================================================
311 : 0 : BodySM* FacetQueryEngine::make_BodySM( Surface * ) const
312 : : {
313 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
314 : 0 : return (BodySM*) NULL;
315 : : }
316 : :
317 : : //================================================================================
318 : : // Description:
319 : : // Author :
320 : : // Date :
321 : : //================================================================================
322 : 0 : BodySM* FacetQueryEngine::make_BodySM( DLIList<Lump*>& ) const
323 : : {
324 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
325 : 0 : return (BodySM*) NULL;
326 : : }
327 : :
328 : : //================================================================================
329 : : // Description: create a new body by copying
330 : : // Author : sjowen
331 : : // Date : 9/7/01
332 : : //================================================================================
333 : 0 : Body* FacetQueryEngine::copy_body( Body *body_ptr )
334 : : {
335 [ # # ]: 0 : BodySM* bodysm_ptr = body_ptr->get_body_sm_ptr();
336 [ # # ]: 0 : FacetBody *facet_body_ptr = CAST_TO(bodysm_ptr, FacetBody);
337 [ # # ]: 0 : if (!facet_body_ptr)
338 : : {
339 [ # # ][ # # ]: 0 : PRINT_ERROR("Attempt to copy mesh-based geometry Body. This body is not MBG.");
[ # # ][ # # ]
340 : 0 : return (Body*)NULL;
341 : : }
342 : :
343 : : TopologyBridge *top_bridge;
344 [ # # ][ # # ]: 0 : GeometryModifyTool::instance()->prepare_for_copy( body_ptr, top_bridge );
[ # # ]
345 : :
346 [ # # ]: 0 : BodySM* osme_body_ptr = (BodySM*)facet_body_ptr->copy();
347 [ # # ]: 0 : if (!osme_body_ptr)
348 : : {
349 [ # # ][ # # ]: 0 : GeometryModifyTool::instance()->clean_up_from_copy_failure( top_bridge );
350 [ # # ][ # # ]: 0 : PRINT_ERROR("Failed to copy mesh-based geometry Body");
[ # # ][ # # ]
351 : 0 : return (Body*)NULL;
352 : : }
353 : :
354 : 0 : TopologyBridge *tb = (TopologyBridge*)osme_body_ptr;
355 [ # # ][ # # ]: 0 : GeometryModifyTool::instance()->finish_copy( tb, bodysm_ptr );
356 : :
357 [ # # ][ # # ]: 0 : Body *new_body_ptr = GeometryQueryTool::instance()->make_Body( osme_body_ptr );
358 : 0 : return new_body_ptr;
359 : : }
360 : :
361 : : //================================================================================
362 : : // Description: reflect body about an axis
363 : : // Author : sjowen
364 : : // Date : 9/7/01
365 : : //================================================================================
366 : 0 : CubitStatus FacetQueryEngine::reflect( BodySM *bodysm,
367 : : const CubitVector& axis)
368 : : {
369 [ # # ]: 0 : FacetBody *fbody = CAST_TO(bodysm, FacetBody);
370 [ # # ]: 0 : if (!fbody)
371 : : {
372 [ # # ][ # # ]: 0 : PRINT_ERROR("Attempt to reflect mesh-based geometry Body. This body is not MBG.");
373 : 0 : return CUBIT_FAILURE;
374 : : }
375 : :
376 : 0 : fbody->reflect( axis.x(), axis.y(), axis.z() );
377 : :
378 : 0 : return CUBIT_SUCCESS;
379 : : }
380 : :
381 : 0 : CubitStatus FacetQueryEngine::get_connected_patch(
382 : : DLIList<FacetSurface*>& remaining_surfs,
383 : : DLIList<FacetSurface*>& output_patch )
384 : : {
385 [ # # ][ # # ]: 0 : DLIList<FacetSurface*> stack, curve_surfs;
[ # # ]
386 [ # # ][ # # ]: 0 : std::set<FacetSurface*> marked;
387 [ # # ][ # # ]: 0 : DLIList<FacetCurve*> curves;
388 : 0 : int debug_this = 0;
389 [ # # ]: 0 : if(debug_this){
390 [ # # ]: 0 : GfxDebug::clear();
391 : : }
392 : : int i;
393 [ # # ][ # # ]: 0 : for (i = remaining_surfs.size(); i--; )
394 [ # # ][ # # ]: 0 : marked.insert( remaining_surfs.get_and_step() );
395 : :
396 : : // Choose one surface to start with
397 [ # # ]: 0 : FacetSurface* surf = remaining_surfs.pop();
398 [ # # ]: 0 : marked.erase( surf );
399 [ # # ]: 0 : stack.append( surf );
400 : :
401 : : // Get all connected surfaces
402 [ # # ][ # # ]: 0 : while( stack.size() )
403 : : {
404 [ # # ]: 0 : surf = stack.pop();
405 [ # # ]: 0 : if(debug_this){
406 [ # # ][ # # ]: 0 : surf->get_eval_tool()->debug_draw_facets(CUBIT_BLUE_INDEX);
407 [ # # ]: 0 : GfxDebug::mouse_xforms();
408 : : }
409 [ # # ]: 0 : output_patch.append( surf );
410 : :
411 [ # # ]: 0 : surf->get_curves( curves );
412 [ # # ][ # # ]: 0 : while (curves.size())
413 : : {
414 [ # # ]: 0 : FacetCurve* curve = curves.pop();
415 [ # # ]: 0 : curve->get_surfaces( curve_surfs );
416 [ # # ][ # # ]: 0 : if(debug_this && curve_surfs.size() < 2){
[ # # ][ # # ]
417 [ # # ][ # # ]: 0 : PRINT_INFO("Curve is not connected to 2 surfaces.\n");
[ # # ][ # # ]
418 [ # # ][ # # ]: 0 : curve->get_eval_tool()->debug_draw_facet_edges(CUBIT_MAGENTA_INDEX);
419 : : }
420 : :
421 : :
422 [ # # ][ # # ]: 0 : while (curve_surfs.size())
423 : : {
424 [ # # ]: 0 : FacetSurface* curve_surf = curve_surfs.pop();
425 [ # # ][ # # ]: 0 : if (marked.erase(curve_surf))
426 [ # # ]: 0 : stack.append( curve_surf );
427 : : }
428 : : }
429 : : }
430 : :
431 : : // Remove output surfaces from input list
432 : : // At this point, "marked" contains all the surfaces not in "ouput_patch"
433 [ # # ]: 0 : remaining_surfs.last();
434 [ # # ][ # # ]: 0 : for (i = remaining_surfs.size(); i--; )
435 [ # # ][ # # ]: 0 : if (marked.find(remaining_surfs.step_and_get()) == marked.end())
[ # # ][ # # ]
[ # # ]
436 [ # # ]: 0 : remaining_surfs.change_to( 0 );
437 [ # # ]: 0 : remaining_surfs.remove_all_with_value( 0 );
438 : :
439 [ # # ]: 0 : return CUBIT_SUCCESS;
440 : :
441 : : }
442 : :
443 : 0 : CubitStatus FacetQueryEngine::get_graphics( BodySM *bodysm, GMem* g_mem,
444 : : std::vector<Surface*> &surface_to_facets_vector,
445 : : std::vector<TopologyBridge*> &vertex_edge_to_point_vector,
446 : : std::vector<std::pair<TopologyBridge*, std::pair<int,int> > > &facet_edges_on_curves,
447 : : unsigned short normal_tolerance,
448 : : double distance_tolerance, double max_edge_length ) const
449 : : {
450 [ # # ]: 0 : FacetBody *facet_body = CAST_TO(bodysm, FacetBody );
451 [ # # ]: 0 : if( NULL == facet_body )
452 : 0 : return CUBIT_FAILURE;
453 : :
454 [ # # ]: 0 : DLIList<Surface*> surfaces;
455 [ # # ]: 0 : bodysm->surfaces( surfaces );
456 : :
457 : : //unmark all the points
458 [ # # ][ # # ]: 0 : for( int i=surfaces.size(); i--; )
459 : : {
460 [ # # ]: 0 : Surface *tmp_surf = surfaces.get_and_step();
461 [ # # ]: 0 : FacetSurface *facet_surface = CAST_TO( tmp_surf, FacetSurface );
462 : :
463 [ # # ]: 0 : DLIList<CubitPoint*> surface_points;
464 [ # # ]: 0 : facet_surface->get_my_points( surface_points );
465 : :
466 [ # # ][ # # ]: 0 : for( int k=surface_points.size(); k--; )
467 [ # # ][ # # ]: 0 : surface_points.get_and_step()->marked(0);
468 [ # # ]: 0 : }
469 : :
470 [ # # ][ # # ]: 0 : DLIList<CubitFacet*> all_facets;
471 : 0 : int point_index = 0;
472 [ # # ][ # # ]: 0 : std::vector<CubitPoint*> all_points;
473 [ # # ][ # # ]: 0 : for( int i=surfaces.size(); i--; )
474 : : {
475 [ # # ]: 0 : Surface *tmp_surf = surfaces.get_and_step();
476 [ # # ]: 0 : FacetSurface *facet_surface = CAST_TO( tmp_surf, FacetSurface );
477 : :
478 [ # # ]: 0 : DLIList<CubitFacet*> surface_facets;
479 [ # # ][ # # ]: 0 : DLIList<CubitPoint*> surface_points;
480 [ # # ]: 0 : facet_surface->get_my_facets(surface_facets, surface_points);
481 : :
482 [ # # ]: 0 : surface_facets.reset();
483 [ # # ]: 0 : all_facets += surface_facets;
484 : :
485 [ # # ][ # # ]: 0 : for( int k=surface_points.size(); k--; )
486 : : {
487 [ # # ]: 0 : CubitPoint *tmp_pt = surface_points.get_and_step();
488 [ # # ][ # # ]: 0 : if( tmp_pt->marked() == 0 )
489 : : {
490 [ # # ]: 0 : all_points.push_back( tmp_pt );
491 : 0 : point_index++;
492 [ # # ]: 0 : tmp_pt->marked( point_index );
493 [ # # ]: 0 : vertex_edge_to_point_vector.push_back( tmp_surf );
494 : : }
495 : : }
496 : :
497 [ # # ]: 0 : surface_facets.reset();
498 [ # # ][ # # ]: 0 : for( int k=surface_facets.size(); k--; )
499 [ # # ]: 0 : surface_to_facets_vector.push_back( tmp_surf );
500 [ # # ]: 0 : }
501 : :
502 : : //now stuff them into the g_mem
503 [ # # ][ # # ]: 0 : g_mem->allocate_tri( all_facets.size() );
504 [ # # ]: 0 : g_mem->fListCount = all_facets.size() * 4;
505 [ # # ]: 0 : g_mem->pointListCount = all_points.size();
506 : :
507 [ # # ]: 0 : GPoint* pt_itor = g_mem->point_list();
508 [ # # ][ # # ]: 0 : for ( size_t i = 0; i < all_points.size(); i++ )
509 : : {
510 [ # # ]: 0 : CubitPoint* point = all_points[i];
511 [ # # ]: 0 : pt_itor->x = (float)point->x();
512 [ # # ]: 0 : pt_itor->y = (float)point->y();
513 [ # # ]: 0 : pt_itor->z = (float)point->z();
514 : 0 : pt_itor++;
515 : : }
516 : :
517 : : // Copy facets to Gmem
518 [ # # ]: 0 : all_facets.reset();
519 [ # # ]: 0 : int* f_itor = g_mem->facet_list();
520 [ # # ][ # # ]: 0 : for ( int i = 0; i < all_facets.size(); i++ )
521 : : {
522 : 0 : *(f_itor++) = 3;
523 [ # # ]: 0 : CubitFacet* facet = all_facets.get_and_step();
524 [ # # ]: 0 : for ( int j = 0; j < 3; j++ )
525 : : {
526 [ # # ][ # # ]: 0 : *(f_itor++) = facet->point(j)->marked() - 1; //go back to zero-based
527 : : }
528 : : }
529 : :
530 : : //get all the curves
531 [ # # ][ # # ]: 0 : DLIList<Curve*> curves;
532 [ # # ]: 0 : bodysm->curves( curves );
533 [ # # ][ # # ]: 0 : for( int i=curves.size(); i--; )
534 : : {
535 [ # # ]: 0 : Curve *tmp_curve = curves.get_and_step();
536 [ # # ]: 0 : FacetCurve *facet_curve = CAST_TO( tmp_curve, FacetCurve );
537 : :
538 : : //get all the curves
539 [ # # ]: 0 : DLIList<CubitFacetEdge*> curve_facets;
540 [ # # ]: 0 : facet_curve->get_facets(curve_facets);
541 [ # # ][ # # ]: 0 : DLIList<CubitPoint*> curve_points;
542 [ # # ]: 0 : facet_curve->get_points(curve_points);
543 [ # # ]: 0 : curve_points.reset();
544 [ # # ]: 0 : curve_facets.reset();
545 : :
546 [ # # ][ # # ]: 0 : for( int k=0; k<curve_points.size(); k++ )
547 : : {
548 [ # # ]: 0 : CubitPoint *tmp_pt = curve_points.get_and_step();
549 [ # # ][ # # ]: 0 : assert( tmp_pt->marked() );
550 : :
551 [ # # ][ # # ]: 0 : if( k == curve_points.size() - 1 )
552 : 0 : break;
553 : :
554 [ # # ]: 0 : int index1 = tmp_pt->marked();
555 [ # # ][ # # ]: 0 : int index2 = curve_points.get()->marked();
556 : :
557 [ # # ]: 0 : vertex_edge_to_point_vector[index1-1] = tmp_curve;
558 [ # # ][ # # ]: 0 : facet_edges_on_curves.push_back( std::make_pair( tmp_curve, std::make_pair( index1-1, index2-1) ) );
[ # # ][ # # ]
559 : : }
560 [ # # ]: 0 : }
561 : :
562 : : //get all the vertices
563 [ # # ][ # # ]: 0 : DLIList<TBPoint*> points;
564 [ # # ]: 0 : bodysm->points( points );
565 : :
566 [ # # ][ # # ]: 0 : for( int i=points.size(); i--; )
567 : : {
568 [ # # ]: 0 : TBPoint *tmp_pt = points.get_and_step();
569 [ # # ]: 0 : FacetPoint *facet_point = CAST_TO( tmp_pt, FacetPoint );
570 [ # # ]: 0 : CubitPoint *cubit_pt = facet_point->get_cubit_point();
571 [ # # ][ # # ]: 0 : assert( cubit_pt->marked() );
572 [ # # ][ # # ]: 0 : vertex_edge_to_point_vector[cubit_pt->marked()-1] = tmp_pt;
573 : : }
574 : :
575 : :
576 : : //reset the marks back to zero
577 [ # # ][ # # ]: 0 : for ( unsigned int i = 0; i < all_points.size(); i++ )
578 [ # # ][ # # ]: 0 : all_points[i]->marked(0);
579 : :
580 : :
581 [ # # ]: 0 : return CUBIT_SUCCESS;
582 : : }
583 : :
584 : : //================================================================================
585 : : // Description:
586 : : // Author :
587 : : // Date :
588 : : //================================================================================
589 : 0 : CubitStatus FacetQueryEngine::get_graphics( Surface* surface_ptr,
590 : : GMem* gMem,
591 : : unsigned short ,
592 : : double, double ) const
593 : : {
594 [ # # ]: 0 : if( !gMem )
595 : 0 : return CUBIT_FAILURE;
596 : :
597 : : // get the FacetSurface.
598 : : int i;
599 [ # # ]: 0 : FacetSurface *facet_surf_ptr = CAST_TO(surface_ptr,FacetSurface);
600 [ # # ]: 0 : if( ! facet_surf_ptr )
601 : 0 : return CUBIT_FAILURE;
602 : :
603 : : // get the facets for the surface
604 [ # # ]: 0 : DLIList<CubitFacet*> surface_facets;
605 [ # # ][ # # ]: 0 : DLIList<CubitPoint*> surface_points;
606 [ # # ]: 0 : facet_surf_ptr->get_my_facets(surface_facets, surface_points);
607 : :
608 : : // set return values, and if GMem is NULL return
609 : : // (caller just wanted to know the counts.)
610 [ # # ]: 0 : int number_points = surface_points.size();
611 [ # # ]: 0 : int number_triangles = surface_facets.size();
612 : :
613 : :
614 : : // Allocate space in GMem
615 [ # # ]: 0 : gMem->allocate_tri(number_triangles);
616 [ # # ]: 0 : gMem->fListCount = surface_facets.size() * 4;
617 : 0 : gMem->pointListCount = number_points;
618 : :
619 : : // Copy points to GMem
620 [ # # ]: 0 : surface_points.reset();
621 [ # # ]: 0 : GPoint* pt_itor = gMem->point_list();
622 [ # # ]: 0 : for ( i = 0; i < number_points; i++ )
623 : : {
624 [ # # ]: 0 : CubitPoint* point = surface_points.get_and_step();
625 [ # # ]: 0 : pt_itor->x = (float)point->x();
626 [ # # ]: 0 : pt_itor->y = (float)point->y();
627 [ # # ]: 0 : pt_itor->z = (float)point->z();
628 [ # # ]: 0 : point->marked(i);
629 : 0 : pt_itor++;
630 : : }
631 : :
632 : : // Copy facets to Gmem
633 [ # # ]: 0 : surface_facets.reset();
634 [ # # ]: 0 : int* f_itor = gMem->facet_list();
635 [ # # ]: 0 : for ( i = 0; i < number_triangles; i++ )
636 : : {
637 : 0 : *(f_itor++) = 3;
638 [ # # ]: 0 : CubitFacet* facet = surface_facets.get_and_step();
639 [ # # ]: 0 : for ( int j = 0; j < 3; j++ )
640 [ # # ][ # # ]: 0 : *(f_itor++) = facet->point(j)->marked();
641 : : }
642 : :
643 : : // cleanup
644 [ # # ][ # # ]: 0 : while( surface_points.size() )
645 [ # # ][ # # ]: 0 : surface_points.pop()->marked(0);
646 : :
647 [ # # ]: 0 : return CUBIT_SUCCESS;
648 : : }
649 : :
650 : : //================================================================================
651 : : // Description:
652 : : // Author :
653 : : // Date :
654 : : //================================================================================
655 : 0 : CubitStatus FacetQueryEngine::get_graphics( Curve* curve_ptr,
656 : : GMem* gMem,
657 : : double /*angle_tolerance*/,
658 : : double /*distance_tolerance*/,
659 : : double /*max_edge_length*/ ) const
660 : : {
661 : : // get the FacetCurve.
662 [ # # ]: 0 : FacetCurve *facet_curv_ptr = CAST_TO(curve_ptr,FacetCurve);
663 : :
664 [ # # ]: 0 : DLIList<CubitFacetEdge*> curve_facets;
665 [ # # ]: 0 : facet_curv_ptr->get_facets(curve_facets);
666 [ # # ]: 0 : int number_facets = curve_facets.size();
667 [ # # ][ # # ]: 0 : DLIList<CubitPoint*> curve_points;
668 [ # # ]: 0 : facet_curv_ptr->get_points(curve_points);
669 [ # # ]: 0 : curve_points.reset();
670 [ # # ]: 0 : curve_facets.reset();
671 [ # # ]: 0 : int num_points = curve_points.size();
672 [ # # ][ # # ]: 0 : GPoint *new_point_list = new GPoint[num_points];
673 [ # # ][ # # ]: 0 : int *new_facet_list = new int [number_facets*3];
674 : : int ii;
675 : : CubitPoint *cur_pnt;
676 [ # # ]: 0 : for ( ii = 0; ii < num_points; ii++ )
677 : : {
678 [ # # ]: 0 : cur_pnt = curve_points.get();
679 [ # # ]: 0 : new_point_list[ii].x = cur_pnt->x();
680 [ # # ]: 0 : new_point_list[ii].y = cur_pnt->y();
681 [ # # ]: 0 : new_point_list[ii].z = cur_pnt->z();
682 : : //mark the point with the index into the point list.
683 : : //This is very important to make sure we can index these
684 : : //points when we do the facet array.
685 [ # # ][ # # ]: 0 : curve_points.get_and_step()->marked(ii);
686 : : }
687 [ # # ]: 0 : for ( ii = 0; ii < number_facets; ii++ )
688 : : {
689 : : //All our facets are segments. So the first value is 2.
690 : 0 : int index_count = 3*ii;
691 : 0 : new_facet_list[index_count] = 2;
692 : 0 : int jj = index_count + 1;
693 : : int ll, kk;
694 [ # # ]: 0 : CubitFacetEdge *facet_ptr = curve_facets.get_and_step();
695 : : CubitPoint *temp_point;
696 [ # # ]: 0 : for ( kk = jj, ll = 0; kk < jj+2; kk++, ll++)
697 : : {
698 [ # # ]: 0 : temp_point = facet_ptr->point(ll);
699 [ # # ]: 0 : int index_to_point = temp_point->marked();
700 [ # # ][ # # ]: 0 : if ( index_to_point < 0 || index_to_point > num_points )
701 : : {
702 [ # # ][ # # ]: 0 : PRINT_ERROR("Bad logic in converting edge facets to drawing facets.\n");
[ # # ][ # # ]
703 [ # # ]: 0 : delete[] new_point_list;
704 [ # # ]: 0 : delete[] new_facet_list;
705 : 0 : return CUBIT_FAILURE;
706 : : }
707 : 0 : new_facet_list[kk] = index_to_point;
708 : : }
709 : : }
710 [ # # ]: 0 : gMem->replace_point_list(new_point_list, num_points, num_points);
711 [ # # ]: 0 : gMem->replace_facet_list(new_facet_list, number_facets*3, number_facets*3);
712 [ # # ]: 0 : gMem->points_consolidated(CUBIT_TRUE);
713 : :
714 [ # # ]: 0 : return CUBIT_SUCCESS;
715 : : }
716 : :
717 : : //================================================================================
718 : : // Description:
719 : : // Author :
720 : : // Date :
721 : : //================================================================================
722 : 0 : CubitStatus FacetQueryEngine::get_isoparametric_points(Surface* ,
723 : : int &nu, int &nv,
724 : : GMem*&) const
725 : : {
726 : 0 : nu = nv = 0;
727 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
728 : 0 : return CUBIT_FAILURE;
729 : : }
730 : :
731 : 0 : CubitStatus FacetQueryEngine::get_u_isoparametric_points(Surface* ,
732 : : double, int&,
733 : : GMem*&) const
734 : : {
735 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
736 : 0 : return CUBIT_FAILURE;
737 : : }
738 : :
739 : 0 : CubitStatus FacetQueryEngine::get_v_isoparametric_points(Surface* ,
740 : : double, int&,
741 : : GMem*&) const
742 : : {
743 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
744 : 0 : return CUBIT_FAILURE;
745 : : }
746 : :
747 : : //================================================================================
748 : : // Description:
749 : : // Author :
750 : : // Date :
751 : : //================================================================================
752 : 0 : CubitStatus FacetQueryEngine::transform_vec_position( CubitVector const& ,
753 : : BodySM *,
754 : : CubitVector & ) const
755 : : {
756 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
757 : 0 : return CUBIT_FAILURE;
758 : : }
759 : :
760 : : //================================================================================
761 : : // Description:
762 : : // Author :
763 : : // Date :
764 : : //================================================================================
765 : 0 : CubitStatus FacetQueryEngine::get_intersections( Curve* , CubitVector& ,
766 : : CubitVector&,
767 : : DLIList<CubitVector>& ,
768 : : CubitBoolean,
769 : : CubitBoolean )
770 : : {
771 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
772 : 0 : return CUBIT_FAILURE;
773 : : }
774 : :
775 : 0 : CubitStatus FacetQueryEngine::get_intersections( Curve* , Curve* ,
776 : : DLIList<CubitVector>& ,
777 : : CubitBoolean,
778 : : CubitBoolean )
779 : : {
780 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
781 : 0 : return CUBIT_FAILURE;
782 : : }
783 : 0 : CubitStatus FacetQueryEngine::get_intersections( Curve*,
784 : : Curve*,
785 : : DLIList<CubitVector>&,
786 : : double, CubitBoolean )
787 : : {
788 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
789 : 0 : return CUBIT_FAILURE;
790 : : }
791 : :
792 : : CubitStatus
793 : 0 : FacetQueryEngine::get_intersections( Curve* /*ref_edge*/, Surface* /*ref_face*/,
794 : : DLIList<CubitVector>& ,
795 : : CubitBoolean )
796 : : {
797 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
798 : 0 : return CUBIT_FAILURE;
799 : : }
800 : :
801 : : //================================================================================
802 : : // Description: Find extrema position on an entity list
803 : : // Author :
804 : : // Date :
805 : : //================================================================================
806 : : CubitStatus
807 : 0 : FacetQueryEngine::entity_extrema( DLIList<GeometryEntity*> &,
808 : : const CubitVector *,
809 : : const CubitVector *,
810 : : const CubitVector *,
811 : : CubitVector &,
812 : : GeometryEntity *& )
813 : : {
814 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
815 : 0 : return CUBIT_FAILURE;
816 : : }
817 : :
818 : : //================================================================================
819 : : // Description: Find distance between two entities and closest positions.
820 : : // Author :
821 : : // Date :
822 : : //================================================================================
823 : : CubitStatus
824 : 0 : FacetQueryEngine::entity_entity_distance( GeometryEntity *,
825 : : GeometryEntity *,
826 : : CubitVector &, CubitVector &,
827 : : double & )
828 : : {
829 [ # # ][ # # ]: 0 : PRINT_ERROR("Option not supported for mesh based geometry.\n");
830 : 0 : return CUBIT_FAILURE;
831 : : }
832 : :
833 : : //===========================================================================
834 : : //Function Name: save_temp_geom_file
835 : : //Member Type: PUBLIC
836 : : //Description: function called for save/restore to save temporary FACET file
837 : : // If file is created, CubitString 'created_file' and
838 : : // 'create_file_type' are set
839 : : //Author: Corey Ernst
840 : : //Date: 1/18/2003
841 : : //===========================================================================
842 : :
843 : 0 : CubitStatus FacetQueryEngine::save_temp_geom_file( DLIList<TopologyBridge*>& ref_entity_list,
844 : : const char *file_name,
845 : : const CubitString &cubit_version,
846 : : CubitString &created_file,
847 : : CubitString &created_file_type)
848 : : {
849 [ # # ]: 0 : int size_before = ref_entity_list.size();
850 [ # # ]: 0 : CubitString temp_filename(file_name);
851 [ # # ][ # # ]: 0 : temp_filename += ".mbg";
[ # # ]
852 : :
853 [ # # ][ # # ]: 0 : ModelExportOptions export_options;
854 : :
855 [ # # ]: 0 : if( export_solid_model( ref_entity_list, temp_filename.c_str(), FACET_TYPE,
856 [ # # ][ # # ]: 0 : cubit_version, export_options ) == CUBIT_FAILURE )
857 : : {
858 [ # # ][ # # ]: 0 : PRINT_ERROR( "Error occured while trying to save temporary MESH_BASED_GEOMETRY file\n");
[ # # ][ # # ]
859 : 0 : return CUBIT_FAILURE;
860 : : }
861 : :
862 [ # # ]: 0 : int size_after = ref_entity_list.size();
863 : :
864 [ # # ]: 0 : if( size_before > size_after )
865 : : {
866 [ # # ]: 0 : created_file += temp_filename;
867 [ # # ][ # # ]: 0 : created_file_type += "FACET";
[ # # ]
868 : : }
869 [ # # ]: 0 : return CUBIT_SUCCESS;
870 : : }
871 : :
872 : : //===========================================================================
873 : : //Function Name:export_solid_model
874 : : //Member Type: PUBLIC
875 : : //Description: function called for save/restore to save temporary FACET file
876 : : //Author: Corey Ernst
877 : : //Date: 1/18/2003
878 : : //===========================================================================
879 : :
880 : 55 : CubitStatus FacetQueryEngine::export_solid_model( DLIList<TopologyBridge*>& ref_entity_list,
881 : : const char* file_name,
882 : : Model_File_Type file_type,
883 : : const CubitString &,
884 : : ModelExportOptions & )
885 : : {
886 [ - + ]: 55 : if( file_type != FACET_TYPE )
887 : 0 : return CUBIT_SUCCESS;
888 : :
889 [ + - ]: 55 : DLIList<FacetBody*> facet_bodies;
890 [ + - ][ + - ]: 110 : DLIList<FacetLump*> facet_lumps;
891 [ + - ][ + - ]: 110 : DLIList<FacetShell*> facet_shells;
892 [ + - ][ + - ]: 110 : DLIList<FacetSurface*> facet_surfaces;
893 [ + - ][ + - ]: 110 : DLIList<FacetLoop*> facet_loops;
894 [ + - ][ + - ]: 110 : DLIList<FacetCoEdge*> facet_coedges;
895 [ + - ][ + - ]: 110 : DLIList<FacetCurve*> facet_curves;
896 [ + - ][ + - ]: 110 : DLIList<FacetPoint*> facet_points;
897 : :
898 [ + - ][ + - ]: 110 : DLIList<TopologyBridge*> ref_entities_handled;
899 : :
900 : : int i;
901 : : //Collect all free entities (bodies, curves, vertices )
902 [ + - ]: 55 : ref_entity_list.reset();
903 [ + - ][ + + ]: 121 : for(i=ref_entity_list.size(); i>0; i--)
904 : : {
905 [ + - ]: 66 : TopologyBridge* ref_entity_ptr = ref_entity_list.get();
906 : 66 : CubitBoolean handled = CUBIT_TRUE;
907 : :
908 : : //if it is a Vertex
909 [ - + ][ - + ]: 66 : if( FacetPoint* pt = CAST_TO( ref_entity_ptr, FacetPoint) )
910 [ # # ]: 0 : facet_points.append( pt );
911 : : //if it is a Curve
912 [ - + ][ - + ]: 66 : else if( FacetCurve* curve = CAST_TO( ref_entity_ptr, FacetCurve) )
913 [ # # ]: 0 : facet_curves.append( curve );
914 : : /*
915 : : //if it is a Surface -- I don't think you can ever have a free surface
916 : : //without it being a Body
917 : : else if( FacetSurface* surf = CAST_TO( ref_entity_ptr, FacetSurface) )
918 : : facet_surfaces.append( surf );
919 : : */
920 : : //if it is a Body
921 [ - + ][ + - ]: 66 : else if( FacetBody* body = CAST_TO( ref_entity_ptr, FacetBody ) )
922 [ + - ]: 66 : facet_bodies.append( body );
923 : : else
924 : 66 : handled = CUBIT_FALSE;
925 : :
926 [ + - ]: 66 : if( handled == CUBIT_TRUE )
927 : : {
928 [ + - ]: 66 : ref_entities_handled.append( ref_entity_ptr );
929 [ + - ]: 66 : ref_entity_list.change_to(NULL);
930 : : }
931 : :
932 [ + - ]: 66 : ref_entity_list.step();
933 : : }
934 : :
935 [ + - ]: 55 : ref_entity_list.remove_all_with_value(NULL);
936 : :
937 [ + - ]: 55 : int free_body_count = facet_bodies.size();
938 [ + - ]: 55 : int free_curve_count = facet_curves.size();
939 [ + - ]: 55 : int free_point_count = facet_points.size();
940 : :
941 : : //if nothing to write out...return
942 [ - + ][ # # ]: 55 : if( free_body_count == 0 && free_curve_count == 0 && free_point_count == 0)
[ # # ]
943 : 0 : return CUBIT_SUCCESS;
944 : :
945 : : //get file pointer
946 [ + - ]: 55 : FILE *file_ptr = fopen( file_name, "wb" );
947 : :
948 : : //get all child entities from the bodies, curves, & vertices
949 : : gather_all_facet_entities( facet_bodies, facet_lumps,
950 : : facet_shells, facet_surfaces,
951 : : facet_loops, facet_coedges,
952 [ + - ]: 55 : facet_curves, facet_points );
953 : :
954 : : //create a wrapper object for writing
955 [ + - ][ + - ]: 110 : CIOWrapper file_writer( file_ptr );
956 : :
957 : : // write out file type "MESHED_BASED_GEOMETRY"
958 [ + - ]: 55 : file_writer.BeginWriteBlock(0);
959 [ + - ]: 55 : file_writer.Write( "MESH_BASED_GEOMETRY", 19 );
960 : :
961 : : // write out Endian value
962 : 55 : UnsignedInt32 endian_value = CCubitFile::mintNativeEndian;
963 [ + - ]: 55 : file_writer.Write( &endian_value, 1 );
964 : :
965 : : // write out version #
966 : 55 : UnsignedInt32 version = 1;
967 [ + - ]: 55 : file_writer.Write( &version, 1 );
968 : :
969 : :
970 : : //save the facets (geometry info )
971 : : CubitStatus status;
972 [ + - ][ + - ]: 55 : status = save_facets( file_ptr, facet_surfaces, facet_curves, facet_points );
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
973 [ - + ]: 55 : if( status == CUBIT_FAILURE ) return CUBIT_FAILURE;
974 : :
975 : : //write out topology and attributes
976 : : status = write_topology( file_ptr,
977 : : facet_bodies, facet_lumps,
978 : : facet_shells, facet_surfaces,
979 : : facet_loops, facet_coedges,
980 [ + - ]: 55 : facet_curves, facet_points );
981 [ - + ]: 55 : if( status == CUBIT_FAILURE ) return CUBIT_FAILURE;
982 : :
983 [ - + ][ # # ]: 55 : if( free_body_count || free_curve_count || free_point_count )
[ # # ]
984 [ + - ][ + - ]: 55 : PRINT_INFO( "\nExported:" );
[ + - ][ + - ]
985 : :
986 : 55 : int flg = 0;
987 : :
988 [ + - ]: 55 : if( free_body_count )
989 : : {
990 [ - + ][ # # ]: 55 : if( flg )PRINT_INFO( " " );else flg=1;
[ # # ][ # # ]
[ # # ]
991 [ + - ][ + - ]: 55 : if( DEBUG_FLAG( 153 ) )
[ - + ]
992 : : {
993 [ # # ]: 0 : if( free_body_count == 1 )
994 [ # # ][ # # ]: 0 : PRINT_INFO( "%4d Facet Body\n", free_body_count );
[ # # ][ # # ]
995 : : else
996 [ # # ][ # # ]: 0 : PRINT_INFO( "%4d Facet Bodies\n", free_body_count );
[ # # ][ # # ]
997 : : }
998 : :
999 [ + - ][ + + ]: 55 : if( facet_lumps.size() == 1 )
1000 [ + - ][ + - ]: 44 : PRINT_INFO( "%4d Facet Volume\n", facet_lumps.size() );
[ + - ][ + - ]
[ + - ]
1001 : : else
1002 [ + - ][ + - ]: 55 : PRINT_INFO( "%4d Facet Volumes\n", facet_lumps.size() );
[ + - ][ + - ]
[ + - ]
1003 : : }
1004 [ - + ]: 55 : if( free_curve_count )
1005 : : {
1006 [ # # ][ # # ]: 0 : if( flg )PRINT_INFO( " " );else flg=1;
[ # # ][ # # ]
[ # # ]
1007 [ # # ]: 0 : if( free_curve_count == 1 )
1008 [ # # ][ # # ]: 0 : PRINT_INFO( "%4d Facet Curve\n", free_curve_count );
[ # # ][ # # ]
1009 : : else
1010 [ # # ][ # # ]: 0 : PRINT_INFO( "%4d Facet Curves\n", free_curve_count );
[ # # ][ # # ]
1011 : : }
1012 [ - + ]: 55 : if( free_point_count )
1013 : : {
1014 [ # # ][ # # ]: 0 : if( flg )PRINT_INFO( " " );else flg=1;
[ # # ][ # # ]
[ # # ]
1015 [ # # ]: 0 : if( free_point_count == 1 )
1016 [ # # ][ # # ]: 0 : PRINT_INFO( "%4d Facet Point\n", free_point_count );
[ # # ][ # # ]
1017 : : else
1018 [ # # ][ # # ]: 0 : PRINT_INFO( "%4d Facet Points\n", free_point_count );
[ # # ][ # # ]
1019 : : }
1020 [ + - ][ + - ]: 55 : PRINT_INFO( "\n" );
[ + - ][ + - ]
1021 : :
1022 : :
1023 : :
1024 [ + - ]: 55 : fclose( file_ptr );
1025 : :
1026 [ + - ]: 110 : return CUBIT_SUCCESS;
1027 : : }
1028 : :
1029 : : CubitStatus
1030 : 55 : FacetQueryEngine::gather_all_facet_entities( DLIList<FacetBody*> &facet_bodies,
1031 : : DLIList<FacetLump*> &facet_lumps,
1032 : : DLIList<FacetShell*> &facet_shells,
1033 : : DLIList<FacetSurface*> &facet_surfaces,
1034 : : DLIList<FacetLoop*> &facet_loops,
1035 : : DLIList<FacetCoEdge*> &facet_coedges,
1036 : : DLIList<FacetCurve*> &facet_curves,
1037 : : DLIList<FacetPoint*> &facet_points )
1038 : : {
1039 : : int i;
1040 : :
1041 : :
1042 : : //Collect FacetLumps from FacetBody
1043 [ + + ]: 121 : for(i=0; i<facet_bodies.size(); i++)
1044 : : {
1045 : 66 : FacetBody *facet_body = facet_bodies.get_and_step();
1046 : 66 : facet_body->get_lumps( facet_lumps );
1047 : : }
1048 : :
1049 : :
1050 : : //Collect FacetShells from FacetLumps
1051 [ + + ]: 121 : for(i=0; i<facet_lumps.size(); i++)
1052 : : {
1053 : 66 : FacetLump *facet_lump = facet_lumps.get_and_step();
1054 : 66 : facet_lump->get_shells( facet_shells );
1055 : : }
1056 : :
1057 : :
1058 : : //Collect FacetSurfaces from FacetShells
1059 [ + + ]: 121 : for(i=0; i<facet_shells.size(); i++)
1060 : : {
1061 : 66 : FacetShell *facet_shell = facet_shells.get_and_step();
1062 : 66 : facet_shell->get_surfaces( facet_surfaces );
1063 : : }
1064 : 55 : facet_surfaces.uniquify_ordered();
1065 : :
1066 : :
1067 : : //Collect FacetLoops from FacetSurfaces
1068 [ + + ]: 330 : for(i=0; i<facet_surfaces.size(); i++)
1069 : : {
1070 : 275 : FacetSurface *facet_surface = facet_surfaces.get_and_step();
1071 : 275 : facet_surface->get_loops( facet_loops );
1072 : : }
1073 : :
1074 : : //Collect FacetCoEdges from FacetLoops
1075 [ + + ]: 319 : for(i=0; i<facet_loops.size(); i++)
1076 : : {
1077 : 264 : FacetLoop *facet_loop = facet_loops.get_and_step();
1078 : 264 : facet_loop->get_coedges( facet_coedges );
1079 : : }
1080 : :
1081 : :
1082 : : //Collect FacetCurves from FacetCoEdges
1083 [ + + ]: 913 : for( i=0; i<facet_coedges.size(); i++)
1084 : : {
1085 : 858 : FacetCoEdge *facet_coedge = facet_coedges.get_and_step();
1086 : 858 : facet_coedge->get_curves( facet_curves );
1087 : : }
1088 : 55 : facet_curves.uniquify_ordered();
1089 : :
1090 : :
1091 : : //Collect FacetPoints from FacetCurves
1092 [ + + ]: 517 : for( i=0; i<facet_curves.size(); i++)
1093 : : {
1094 : 462 : FacetCurve *facet_curve = facet_curves.get_and_step();
1095 : 462 : facet_curve->get_points( facet_points );
1096 : : }
1097 : :
1098 : : //uniquify lists
1099 : 55 : facet_points.uniquify_ordered();
1100 : :
1101 : :
1102 : 55 : return CUBIT_SUCCESS;
1103 : :
1104 : : }
1105 : :
1106 : :
1107 : : CubitStatus
1108 : 55 : FacetQueryEngine::write_topology( FILE *file_ptr,
1109 : : DLIList<FacetBody*> &facet_bodies,
1110 : : DLIList<FacetLump*> &facet_lumps,
1111 : : DLIList<FacetShell*> &facet_shells,
1112 : : DLIList<FacetSurface*> &facet_surfaces,
1113 : : DLIList<FacetLoop*> &facet_loops,
1114 : : DLIList<FacetCoEdge*> &facet_coedges,
1115 : : DLIList<FacetCurve*> &facet_curves,
1116 : : DLIList<FacetPoint*> &facet_points )
1117 : : {
1118 : :
1119 : : int i;
1120 : :
1121 : : //create a wrapper object for writing
1122 [ + - ]: 55 : CIOWrapper file_writer( file_ptr );
1123 : :
1124 : : //-----------------write FacetPoints--------------
1125 [ + - ]: 55 : UnsignedInt32 size = facet_points.size();
1126 : : //write out number of FacetPoints
1127 [ + - ]: 55 : file_writer.Write( &size, 1 );
1128 [ + - ]: 55 : facet_points.reset();
1129 [ + - ][ + + ]: 385 : for( i=0; i<facet_points.size(); i++)
1130 : : {
1131 [ + - ]: 330 : FacetPoint *curr_point = facet_points.get_and_step();
1132 [ + - ][ + - ]: 330 : int id = curr_point->get_cubit_point()->id();
1133 : :
1134 [ + - ]: 330 : file_writer.Write( reinterpret_cast<UnsignedInt32*>(&id), 1 );
1135 [ + - ][ - + ]: 330 : if( curr_point->save_attribs(file_ptr) == CUBIT_FAILURE )
1136 : 0 : return CUBIT_FAILURE;
1137 : : }
1138 : :
1139 : : //-----------------write FacetCurves--------------
1140 [ + - ]: 55 : size = facet_curves.size();
1141 : : //write out number of FacetCurves
1142 [ + - ]: 55 : file_writer.Write( &size, 1 );
1143 [ + - ]: 55 : facet_curves.reset();
1144 [ + - ][ + + ]: 517 : for( i=0; i<facet_curves.size(); i++)
1145 : : {
1146 [ + - ]: 462 : FacetCurve *curr_curve = facet_curves.get_and_step();
1147 : : TBPoint *s_point, *e_point;
1148 [ + - ]: 462 : s_point = curr_curve->start_point();
1149 [ + - ]: 462 : e_point = curr_curve->end_point();
1150 : :
1151 : : int data_to_write[4];
1152 : :
1153 : : // get start&end points implicit ids
1154 : 462 : FacetPoint *temp_point = NULL;
1155 [ - + ]: 462 : temp_point = CAST_TO( s_point, FacetPoint );
1156 [ - + ]: 462 : if( !temp_point ) assert(0);
1157 : : int found;
1158 [ + - ]: 462 : found = facet_points.where_is_item( temp_point );
1159 [ - + ]: 462 : if( found == -1)
1160 : 0 : assert(0);
1161 : 462 : data_to_write[0] = found;
1162 : :
1163 [ - + ]: 462 : temp_point = CAST_TO( e_point, FacetPoint );
1164 [ - + ]: 462 : if( !temp_point ) assert(0);
1165 [ + - ]: 462 : found = facet_points.where_is_item( temp_point );
1166 [ - + ]: 462 : if( found == -1)
1167 [ # # ][ # # ]: 0 : PRINT_ERROR("Problem saving Facet Curves\n");
[ # # ][ # # ]
1168 : 462 : data_to_write[1] = found;
1169 : :
1170 : : //convert Sense info to integer
1171 [ + - ][ - + ]: 462 : if( curr_curve->get_sense() == CUBIT_UNKNOWN )
1172 : 0 : data_to_write[2] = -1;
1173 : : else
1174 [ + - ][ - + ]: 462 : data_to_write[2] = (curr_curve->get_sense() == CUBIT_REVERSED) ? 1 : 0;
1175 : :
1176 [ + - ][ + - ]: 462 : data_to_write[3] = curr_curve->get_eval_tool()->get_output_id();
1177 : :
1178 : : //write the data
1179 [ + - ]: 462 : file_writer.Write( reinterpret_cast<UnsignedInt32*>(data_to_write), 4 );
1180 : :
1181 [ + - ][ - + ]: 462 : if( curr_curve->save_attribs(file_ptr) == CUBIT_FAILURE )
1182 : 0 : return CUBIT_FAILURE;
1183 : : }
1184 : :
1185 : : //-----------------write FacetCoedges--------------
1186 [ + - ]: 55 : size = facet_coedges.size();
1187 : : // write out number of FacetCurves
1188 [ + - ]: 55 : file_writer.Write( &size, 1 );
1189 [ + - ]: 55 : facet_coedges.reset();
1190 [ + - ][ + + ]: 913 : for( i=0; i<facet_coedges.size(); i++)
1191 : : {
1192 [ + - ]: 858 : FacetCoEdge *curr_coedge = facet_coedges.get_and_step();
1193 : : Curve *curve_sm;
1194 [ + - ]: 858 : curve_sm = curr_coedge->curve();
1195 : :
1196 : 858 : FacetCurve *temp_curve = NULL;
1197 [ - + ]: 858 : temp_curve = CAST_TO( curve_sm, FacetCurve );
1198 : :
1199 : : int data_to_write[2];
1200 : :
1201 : : // get implicit id of this curve
1202 : : int found;
1203 [ + - ]: 858 : found = facet_curves.where_is_item( temp_curve );
1204 [ - + ]: 858 : if( found == -1)
1205 [ # # ][ # # ]: 0 : PRINT_ERROR("Problem saving Facet CoEdges\n");
[ # # ][ # # ]
1206 : 858 : data_to_write[0] = found;
1207 : :
1208 : : // convert sense info to integer
1209 [ + - ][ - + ]: 858 : if( curr_coedge->get_sense() == CUBIT_UNKNOWN )
1210 : 0 : data_to_write[1] = -1;
1211 : : else
1212 [ + - ][ + + ]: 858 : data_to_write[1] = (curr_coedge->get_sense() == CUBIT_REVERSED) ? 1 : 0;
1213 : :
1214 : : // write out the data
1215 [ + - ]: 858 : file_writer.Write( reinterpret_cast<UnsignedInt32*>(data_to_write), 2 );
1216 : :
1217 : : }
1218 : :
1219 : : //-----------------write FacetLoops--------------
1220 [ + - ]: 55 : size = facet_loops.size();
1221 : : // write out number of FacetLoops
1222 [ + - ]: 55 : file_writer.Write( &size, 1 );
1223 [ + - ]: 55 : facet_loops.reset();
1224 [ + - ][ + + ]: 319 : for( i=0; i<facet_loops.size(); i++)
1225 : : {
1226 [ + - ]: 264 : FacetLoop *curr_loop = facet_loops.get_and_step();
1227 [ + - ]: 264 : DLIList<FacetCoEdge*> coedge_list;
1228 [ + - ]: 264 : curr_loop->get_coedges( coedge_list );
1229 : :
1230 : : // get number of coedges in this loop
1231 : : UnsignedInt32 *data_to_write;
1232 [ + - ]: 264 : size = coedge_list.size();
1233 [ + - ][ + - ]: 264 : data_to_write = new UnsignedInt32[ size + 1 ];
1234 : 264 : data_to_write[0] = size;
1235 : :
1236 : : UnsignedInt32 j;
1237 : : // get implicit ids of coedges
1238 [ + - ]: 264 : coedge_list.reset();
1239 [ + + ]: 1122 : for( j=1; j<size+1; j++)
1240 : : {
1241 [ + - ]: 858 : FacetCoEdge *temp_coedge = coedge_list.get_and_step();
1242 : : int found;
1243 [ + - ]: 858 : found = facet_coedges.where_is_item( temp_coedge );
1244 [ - + ]: 858 : if( found == -1)
1245 [ # # ][ # # ]: 0 : PRINT_ERROR("Problem saving Facet Loops\n");
[ # # ][ # # ]
1246 : 858 : data_to_write[j] = found;
1247 : : }
1248 : :
1249 : : // write out the data
1250 [ + - ]: 264 : file_writer.Write( data_to_write, size + 1);
1251 [ + - ]: 264 : delete [] data_to_write;
1252 [ + - ]: 264 : }
1253 : :
1254 : : //-----------------write FacetSurfaces--------------
1255 [ + - ]: 55 : size = facet_surfaces.size();
1256 : : // write out number of FacetSurfaces
1257 [ + - ]: 55 : file_writer.Write( &size, 1 );
1258 [ + - ]: 55 : facet_surfaces.reset();
1259 [ + - ][ + + ]: 330 : for( i=0; i<facet_surfaces.size(); i++)
1260 : : {
1261 [ + - ]: 275 : FacetSurface *curr_surface = facet_surfaces.get_and_step();
1262 : :
1263 [ + - ]: 275 : DLIList<FacetLoop*> loop_list;
1264 [ + - ]: 275 : curr_surface->get_loops( loop_list );
1265 : :
1266 [ + - ]: 275 : int num_loops = loop_list.size();
1267 : : int data_to_write[6];
1268 : :
1269 : : // convert sense info to integer
1270 : : // if( curr_surface->get_relative_surface_sense() == CUBIT_UNKNOWN )
1271 : : // data_to_write[0] = -1;
1272 : : // else
1273 : : // data_to_write[0] = (curr_surface->get_relative_surface_sense() == CUBIT_REVERSED) ? 1 : 0;
1274 : 275 : data_to_write[0]=0;
1275 : : // get "useFacets"
1276 : 275 : data_to_write[1] = 1;
1277 : :
1278 : : // get output id of FacetEvalTool
1279 [ + - ][ + - ]: 275 : data_to_write[2] = curr_surface->get_eval_tool()->get_output_id();
1280 : :
1281 : : // get Shell Sense stuff
1282 : : CubitSense sense0;
1283 : :
1284 [ + - ]: 275 : curr_surface->get_shell_sense( sense0 );
1285 [ + + ]: 275 : if( sense0 == CUBIT_UNKNOWN )
1286 : 77 : data_to_write[3] = -1;
1287 : : else
1288 [ - + ]: 198 : data_to_write[3] = (sense0 == CUBIT_REVERSED) ? 1 : 0;
1289 : :
1290 : : // if( sense1 == CUBIT_UNKNOWN )
1291 : 275 : data_to_write[4] = -1;
1292 : : // else
1293 : : // data_to_write[4] = (sense1 == CUBIT_REVERSED) ? 1 : 0;
1294 : :
1295 : : // get number of loops
1296 : 275 : data_to_write[5] = num_loops;
1297 : :
1298 [ + - ]: 275 : file_writer.Write( reinterpret_cast<UnsignedInt32*>(data_to_write), 6 );
1299 : :
1300 : : // get implicit ids of loops
1301 [ + + ]: 275 : if( num_loops > 0 )
1302 : : {
1303 [ + - ][ + - ]: 264 : int *loop_ids = new int[num_loops];
1304 : : int j;
1305 [ + - ]: 264 : loop_list.reset();
1306 [ + + ]: 528 : for( j=0; j<num_loops; j++)
1307 : : {
1308 [ + - ]: 264 : FacetLoop *temp_loop = loop_list.get_and_step();
1309 : : int found;
1310 [ + - ]: 264 : found = facet_loops.where_is_item( temp_loop );
1311 [ - + ]: 264 : if( found == -1 )
1312 [ # # ][ # # ]: 0 : PRINT_ERROR("Problem saving Facet Surfaces\n");
[ # # ][ # # ]
1313 : 264 : loop_ids[j] = found;
1314 : : }
1315 : :
1316 : : // write out data
1317 [ + - ]: 264 : file_writer.Write( reinterpret_cast<UnsignedInt32*>(loop_ids), num_loops );
1318 [ + - ]: 264 : delete [] loop_ids;
1319 : : }
1320 : :
1321 [ + - ][ - + ]: 275 : if( curr_surface->save_attribs(file_ptr) == CUBIT_FAILURE )
1322 [ + - ][ + - ]: 275 : return CUBIT_FAILURE;
1323 : 275 : }
1324 : :
1325 : : //-----------------write FacetShells--------------
1326 [ + - ]: 55 : size = facet_shells.size();
1327 : : // write out number of FacetShells
1328 [ + - ]: 55 : file_writer.Write( &size, 1 );
1329 [ + - ]: 55 : facet_shells.reset();
1330 [ + - ][ + + ]: 121 : for( i=0; i<facet_shells.size(); i++)
1331 : : {
1332 [ + - ]: 66 : FacetShell *curr_shell= facet_shells.get_and_step(); //number of surfaces
1333 [ + - ]: 66 : DLIList<FacetSurface*> temp_facet_surf_list;
1334 [ + - ]: 66 : curr_shell->get_surfaces( temp_facet_surf_list );
1335 : :
1336 : : // get number of surfaces in this shell
1337 : : UnsignedInt32 *data_to_write;
1338 [ + - ]: 66 : int num_surfs = temp_facet_surf_list.size();
1339 [ + - ][ + - ]: 66 : data_to_write = new UnsignedInt32[ num_surfs + 1];
1340 : 66 : data_to_write[0] = num_surfs;
1341 : :
1342 : : // get implicit ids of surfaces
1343 : : int j;
1344 [ + - ]: 66 : temp_facet_surf_list.reset();
1345 [ + + ]: 341 : for( j=1; j<num_surfs+1; j++)
1346 : : {
1347 [ + - ]: 275 : FacetSurface *temp_facet_surface = temp_facet_surf_list.get_and_step();
1348 : : int found;
1349 [ + - ]: 275 : found = facet_surfaces.where_is_item( temp_facet_surface );
1350 [ - + ]: 275 : if( found == -1 )
1351 [ # # ][ # # ]: 0 : PRINT_ERROR("Problem saving Facet Shells\n");
[ # # ][ # # ]
1352 : 275 : data_to_write[j] = found;
1353 : : }
1354 : :
1355 : : // write the data
1356 [ + - ]: 66 : file_writer.Write( data_to_write, num_surfs + 1 );
1357 [ + - ]: 66 : delete [] data_to_write;
1358 [ + - ]: 66 : }
1359 : :
1360 : : //-----------------write FacetLumps--------------
1361 [ + - ]: 55 : size = facet_lumps.size();
1362 : : // write out number of FacetLumps
1363 [ + - ]: 55 : file_writer.Write( &size, 1 );
1364 [ + - ]: 55 : facet_lumps.reset();
1365 [ + - ][ + + ]: 121 : for( i=0; i<facet_lumps.size(); i++)
1366 : : {
1367 [ + - ]: 66 : FacetLump *curr_lump = facet_lumps.get_and_step();
1368 : :
1369 [ + - ]: 66 : DLIList<FacetShell*> temp_facet_shell_list;
1370 [ + - ]: 66 : curr_lump->get_shells( temp_facet_shell_list );
1371 : :
1372 : : // get number of shells in this lump
1373 : : UnsignedInt32 *data_to_write;
1374 [ + - ]: 66 : int num_shells= temp_facet_shell_list.size();
1375 [ + - ][ + - ]: 66 : data_to_write = new UnsignedInt32[ num_shells+ 1];
1376 : 66 : data_to_write[0] = num_shells;
1377 : :
1378 : : //get implicit ides of the lumps in this shell
1379 : : int j;
1380 [ + - ]: 66 : temp_facet_shell_list.reset();
1381 [ + + ]: 132 : for( j=1; j<num_shells+1; j++)
1382 : : {
1383 [ + - ]: 66 : FacetShell *temp_facet_shell = temp_facet_shell_list.get_and_step();
1384 : : int found;
1385 [ + - ]: 66 : found = facet_shells.where_is_item( temp_facet_shell );
1386 [ - + ]: 66 : if( found == -1 )
1387 [ # # ][ # # ]: 0 : PRINT_ERROR("Problem saving Facet Lumps\n");
[ # # ][ # # ]
1388 : 66 : data_to_write[j] = found;
1389 : : }
1390 : :
1391 : : //write the data
1392 [ + - ]: 66 : file_writer.Write( data_to_write, num_shells + 1 );
1393 [ + - ]: 66 : delete [] data_to_write;
1394 [ + - ][ - + ]: 66 : if( curr_lump->save_attribs(file_ptr) == CUBIT_FAILURE )
1395 [ + - ][ + - ]: 66 : return CUBIT_FAILURE;
1396 : 66 : }
1397 : :
1398 : : //-----------------write FacetBodies--------------
1399 [ + - ]: 55 : size = facet_bodies.size();
1400 : : // write out number of FacetBodies
1401 [ + - ]: 55 : file_writer.Write( &size, 1 );
1402 [ + - ]: 55 : facet_bodies.reset();
1403 [ + - ][ + + ]: 121 : for( i=0; i<facet_bodies.size(); i++)
1404 : : {
1405 [ + - ]: 66 : FacetBody *curr_body = facet_bodies.get_and_step();
1406 : :
1407 [ + - ]: 66 : DLIList<FacetLump*> temp_facet_lump_list;
1408 [ + - ]: 66 : curr_body->get_lumps( temp_facet_lump_list );
1409 : :
1410 : : // get the number of lumps in this body
1411 : : UnsignedInt32 *data_to_write;
1412 [ + - ]: 66 : int num_lumps = temp_facet_lump_list.size();
1413 [ + - ][ + - ]: 66 : data_to_write = new UnsignedInt32[ num_lumps + 1];
1414 : 66 : data_to_write[0] = num_lumps;
1415 : :
1416 : : // get the implicit ids of the lumps in this body
1417 : : int j;
1418 [ + - ]: 66 : temp_facet_lump_list.reset();
1419 [ + + ]: 132 : for( j=1; j<num_lumps+1; j++)
1420 : : {
1421 [ + - ]: 66 : FacetLump *temp_facet_lump = temp_facet_lump_list.get_and_step();
1422 : : int found;
1423 [ + - ]: 66 : found = facet_lumps.where_is_item( temp_facet_lump );
1424 [ - + ]: 66 : if( found == -1 )
1425 [ # # ][ # # ]: 0 : PRINT_ERROR("Problem saving Facet Bodies\n");
[ # # ][ # # ]
1426 : 66 : data_to_write[j] = found;
1427 : : }
1428 : :
1429 : : // write the data
1430 [ + - ]: 66 : file_writer.Write( data_to_write, num_lumps + 1 );
1431 [ + - ]: 66 : delete [] data_to_write;
1432 : :
1433 : : // write the transformation matrix of this body
1434 [ + - ][ + - ]: 132 : CubitTransformMatrix trans_matrix;
[ + - ]
1435 [ + - ]: 66 : curr_body->get_transforms( trans_matrix );
1436 : :
1437 [ + - ]: 66 : UnsignedInt32 num_rows = trans_matrix.num_rows();
1438 [ + - ]: 66 : UnsignedInt32 num_cols = trans_matrix.num_cols();
1439 : : UnsignedInt32 rows_and_cols[2];
1440 : 66 : rows_and_cols[0] = num_rows;
1441 : 66 : rows_and_cols[1] = num_cols;
1442 : :
1443 [ + - ]: 66 : file_writer.Write( rows_and_cols, 2 );
1444 : :
1445 : : double *trans_matrix_array;
1446 [ + - ][ + - ]: 66 : trans_matrix_array = new double[ num_rows*num_cols ];
1447 : :
1448 : : //fill up the array row-by-row
1449 : 66 : unsigned u, k = 0;
1450 [ + + ]: 330 : for(u=0; u<num_rows; u++)
1451 : : {
1452 [ + + ]: 1320 : for(k=0; k<num_cols; k++)
1453 [ + - ]: 1056 : trans_matrix_array[(u*num_cols)+k] = trans_matrix.get(u,k);
1454 : : }
1455 : :
1456 [ + - ]: 66 : file_writer.Write( trans_matrix_array, u*k );
1457 [ + - ]: 66 : delete [] trans_matrix_array;
1458 [ + - ][ - + ]: 66 : if( curr_body->save_attribs(file_ptr) == CUBIT_FAILURE )
1459 [ + - ][ + - ]: 66 : return CUBIT_FAILURE;
1460 : 66 : }
1461 : :
1462 [ + - ]: 55 : return CUBIT_SUCCESS;
1463 : : }
1464 : :
1465 : :
1466 : : CubitStatus
1467 : 11 : FacetQueryEngine::restore_topology( FILE *file_ptr,
1468 : : unsigned int endian,
1469 : : int num_points,
1470 : : CubitPoint **points_array,
1471 : : int num_cfet,
1472 : : CurveFacetEvalTool** cfev_array,
1473 : : int num_fet,
1474 : : FacetEvalTool** fev_array,
1475 : : DLIList<TopologyBridge*> &imported_entities )
1476 : : {
1477 : :
1478 : : //get file pointer
1479 : : unsigned int size;
1480 : : unsigned int i, j;
1481 : : int id, k;
1482 : :
1483 : : FacetPoint **facet_points;
1484 : : FacetCurve **facet_curves;
1485 : : FacetCoEdge **facet_coedges;
1486 : : FacetLoop **facet_loops;
1487 : : FacetSurface **facet_surfaces;
1488 : : FacetShell **facet_shells;
1489 : : FacetLump **facet_lumps;
1490 : : FacetBody **facet_bodies;
1491 : :
1492 : : FacetPoint *tmp_point;
1493 : : FacetCurve *tmp_curve;
1494 : : FacetCoEdge *tmp_coedge;
1495 : : FacetLoop *tmp_loop;
1496 : : FacetSurface *tmp_surf;
1497 : : FacetShell *tmp_shell;
1498 : : FacetLump *tmp_lump;
1499 : : FacetBody*tmp_body;
1500 : :
1501 : 11 : int num_facet_points = 0;
1502 : 11 : int num_facet_curves = 0;
1503 : 11 : int num_facet_coedges = 0;
1504 : 11 : int num_facet_loops = 0;
1505 : 11 : int num_facet_surfaces = 0;
1506 : 11 : int num_facet_shells = 0;
1507 : 11 : int num_facet_lumps = 0;
1508 : 11 : int num_facet_bodies = 0;
1509 : :
1510 : : //create a wrapper object for writing
1511 [ + - ]: 11 : CIOWrapper file_reader( endian, file_ptr );
1512 : :
1513 : : //-----------------Read FacetPoints------------------
1514 : : // Read number of FacetPoints
1515 [ + - ]: 11 : file_reader.Read( &size, 1 );
1516 : : // Allocate memory for FacetPoints
1517 [ + - ][ + - ]: 11 : facet_points = new FacetPoint*[size];
1518 [ + + ]: 187 : for(i=0; i<size; i++)
1519 : : {
1520 [ + - ]: 176 : file_reader.Read( reinterpret_cast<UnsignedInt32*>(&id), 1 );
1521 [ + - ][ - + ]: 176 : if( id >= num_points || id < 0 )
1522 : : {
1523 [ # # ]: 0 : delete [] facet_points;
1524 : 0 : return CUBIT_FAILURE;
1525 : : }
1526 : :
1527 [ + - ][ + - ]: 176 : tmp_point = new FacetPoint( points_array[ id ] );
1528 [ - + ]: 176 : if( tmp_point == NULL )
1529 : 0 : return CUBIT_FAILURE;
1530 : :
1531 : 176 : num_facet_points++;
1532 : 176 : facet_points[i] = tmp_point;
1533 [ + - ]: 176 : tmp_point->restore_attribs( file_ptr, endian );
1534 : : }
1535 : :
1536 : : //-----------------Read FacetCurves------------------
1537 : : //Read number of FacetCurves
1538 [ + - ]: 11 : file_reader.Read( &size, 1 );
1539 : : // Allocate memory for FacetCurves
1540 [ + - ][ + - ]: 11 : facet_curves = new FacetCurve*[size];
1541 [ + + ]: 275 : for(i=0; i<size; i++)
1542 : : {
1543 : : int data[4];
1544 [ + - ]: 264 : file_reader.Read( reinterpret_cast<UnsignedInt32*>(data), 4 );
1545 [ + - ][ + - ]: 264 : if( data[0] >= num_facet_points || data[0] < 0 ||
[ + - ]
1546 [ + - ][ + - ]: 264 : data[1] >= num_facet_points || data[1] < 0 ||
1547 [ - + ]: 264 : data[3] >= num_cfet || data[3] < 0 )
1548 : : {
1549 [ # # ]: 0 : delete [] facet_curves;
1550 : 0 : return CUBIT_FAILURE;
1551 : : }
1552 : :
1553 : : CubitSense sense;
1554 [ - + ]: 264 : if (data[2] == -1 )
1555 : 0 : sense = CUBIT_UNKNOWN;
1556 : : else
1557 [ - + ]: 264 : sense = data[2] ? CUBIT_REVERSED : CUBIT_FORWARD;
1558 : :
1559 : 528 : tmp_curve = new FacetCurve( cfev_array[ data[3] ], facet_points[ data[0] ],
1560 [ + - ][ + - ]: 264 : facet_points[ data[1] ], sense );
1561 [ - + ]: 264 : if( tmp_curve == NULL )
1562 : 0 : return CUBIT_FAILURE;
1563 : :
1564 : : // Add curve to FacetPoints
1565 [ + - ]: 264 : facet_points[data[0]]->add_curve( tmp_curve );
1566 [ + - ]: 264 : facet_points[data[1]]->add_curve( tmp_curve );
1567 : :
1568 : 264 : num_facet_curves++;
1569 : 264 : facet_curves[i] = tmp_curve;
1570 [ + - ]: 264 : tmp_curve->restore_attribs( file_ptr, endian );
1571 : : }
1572 : :
1573 : : //-----------------Read FacetCoEdges------------------
1574 : : //Read number of FacetCoEdges
1575 [ + - ]: 11 : file_reader.Read( &size, 1 );
1576 [ + - ][ + - ]: 11 : facet_coedges = new FacetCoEdge*[ size ];
1577 [ + + ]: 539 : for(i=0; i<size; i++)
1578 : : {
1579 : : int data[2];
1580 [ + - ]: 528 : file_reader.Read( reinterpret_cast<unsigned int*>(data), 2 );
1581 : :
1582 [ + - ][ - + ]: 528 : if( data[0] >= num_facet_curves || data[0] < 0 )
1583 : : {
1584 [ # # ]: 0 : delete [] facet_coedges;
1585 : 0 : return CUBIT_FAILURE;
1586 : : }
1587 : :
1588 : : CubitSense sense;
1589 [ - + ]: 528 : if (data[1] == -1 )
1590 : 0 : sense = CUBIT_UNKNOWN;
1591 : : else
1592 [ + + ]: 528 : sense = data[1] ? CUBIT_REVERSED : CUBIT_FORWARD;
1593 : :
1594 [ + - ][ + - ]: 528 : tmp_coedge = new FacetCoEdge( facet_curves[ data[0] ], sense );
1595 [ - + ]: 528 : if( tmp_coedge == NULL )
1596 : 0 : return CUBIT_FAILURE;
1597 : :
1598 : 528 : facet_coedges[i] = tmp_coedge;
1599 : 528 : num_facet_coedges++;
1600 : :
1601 : : // Add FacetCoEdge to FacetCurve
1602 [ + - ]: 528 : facet_curves[ data[0] ]->add_coedge( tmp_coedge );
1603 : : }
1604 : :
1605 : : //-----------------Read FacetLoops------------------
1606 : : //Read number of FacetLoops
1607 [ + - ]: 11 : file_reader.Read( &size, 1 );
1608 [ + - ][ + - ]: 22 : DLIList<CoEdgeSM*> temp_coedge_list;
1609 [ + - ][ + - ]: 11 : facet_loops = new FacetLoop*[ size ];
1610 [ + + ]: 143 : for(i=0; i<size; i++)
1611 : : {
1612 [ + - ]: 132 : temp_coedge_list.clean_out();
1613 : :
1614 : 132 : unsigned int num_coedges = 0;
1615 [ + - ]: 132 : file_reader.Read( &num_coedges, 1);
1616 : :
1617 [ + - ][ + - ]: 132 : int* coedge_ids = new int[ num_coedges];
1618 [ + - ]: 132 : file_reader.Read( (unsigned*)coedge_ids, num_coedges );
1619 : :
1620 [ + + ]: 660 : for( j=0; j<num_coedges; j++)
1621 : : {
1622 [ + - ][ - + ]: 528 : if( coedge_ids[j] >= num_facet_coedges || coedge_ids[j] < 0 )
1623 : : {
1624 [ # # ]: 0 : delete [] facet_loops;
1625 : 0 : return CUBIT_FAILURE;
1626 : : }
1627 [ + - ]: 528 : temp_coedge_list.append( facet_coedges[ coedge_ids[j] ] );
1628 : : }
1629 : :
1630 [ + - ][ + - ]: 132 : tmp_loop = new FacetLoop( temp_coedge_list );
1631 [ - + ]: 132 : if( tmp_loop == NULL)
1632 : 0 : return CUBIT_FAILURE;
1633 : :
1634 : 132 : num_facet_loops++;
1635 : 132 : facet_loops[i] = tmp_loop;
1636 : :
1637 [ + + ]: 660 : for( j=0; j<num_coedges; j++)
1638 [ + - ]: 528 : facet_coedges[ coedge_ids[j] ]->add_loop( tmp_loop );
1639 : :
1640 [ + - ]: 132 : delete [] coedge_ids;
1641 : : }
1642 : :
1643 : : //-----------------Read FacetSurfaces------------------
1644 : : //Read number of FacetSurfaces
1645 [ + - ]: 11 : file_reader.Read( &size, 1 );
1646 [ + - ][ + - ]: 11 : facet_surfaces = new FacetSurface*[size];
1647 [ + - ][ + - ]: 22 : DLIList<LoopSM*> temp_loops;
1648 [ + + ]: 143 : for(i=0; i<size; i++)
1649 : : {
1650 [ + - ]: 132 : temp_loops.clean_out();
1651 : : int data[6];
1652 [ + - ]: 132 : file_reader.Read( (unsigned int*)data, 6);
1653 : :
1654 : : CubitSense sense, sense0;
1655 [ - + ]: 132 : if (data[0] == -1 )
1656 : 0 : sense = CUBIT_UNKNOWN;
1657 : : else
1658 [ - + ]: 132 : sense = data[0] ? CUBIT_REVERSED : CUBIT_FORWARD;
1659 : :
1660 : : CubitBoolean useFacets;
1661 [ + - ]: 132 : useFacets = data[1] ? CUBIT_TRUE : CUBIT_FALSE;
1662 : :
1663 : : // make sure FacetEvalTool ID is in range
1664 [ + - ][ - + ]: 132 : if( data[2] >= num_fet || data[2] < 0 )
1665 : : {
1666 [ # # ]: 0 : delete [] facet_surfaces;
1667 : 0 : return CUBIT_FAILURE;
1668 : : }
1669 : :
1670 [ - + ]: 132 : if (data[3] == -1 )
1671 : 0 : sense0 = CUBIT_UNKNOWN;
1672 : : else
1673 [ - + ]: 132 : sense0 = data[3] ? CUBIT_REVERSED : CUBIT_FORWARD;
1674 : :
1675 : 132 : int num_loops = data[5];
1676 [ + - ][ + - ]: 132 : int* loop_ids = new int[ num_loops ];
1677 [ + - ]: 132 : file_reader.Read( (unsigned*)loop_ids, num_loops );
1678 : :
1679 [ + + ]: 264 : for( k=0; k<num_loops; k++)
1680 : : {
1681 [ + - ][ - + ]: 132 : if( loop_ids[k] >= num_facet_loops ||
1682 : 132 : loop_ids[k] < 0 )
1683 : : {
1684 [ # # ]: 0 : delete [] loop_ids;
1685 : 0 : return CUBIT_FAILURE;
1686 : : }
1687 [ + - ]: 132 : temp_loops.append( facet_loops[ loop_ids[k] ] );
1688 : : }
1689 : 132 : tmp_surf = new FacetSurface( fev_array[ data[2] ],
1690 : : sense, sense0,
1691 [ + - ][ + - ]: 132 : useFacets, temp_loops );
1692 [ - + ]: 132 : if( tmp_surf == NULL)
1693 : 0 : return CUBIT_FAILURE;
1694 : :
1695 : 132 : facet_surfaces[i] = tmp_surf;
1696 : 132 : num_facet_surfaces++;
1697 : :
1698 : : // Add FacetSurface to FacetLoops
1699 [ + + ]: 264 : for( k=0; k<num_loops; k++)
1700 [ + - ]: 132 : facet_loops[ loop_ids[k] ]->add_surface( tmp_surf );
1701 : :
1702 [ + - ]: 132 : delete [] loop_ids;
1703 [ + - ]: 132 : tmp_surf->restore_attribs( file_ptr, endian );
1704 : : }
1705 : :
1706 : : //-----------------Read FacetShells------------------
1707 : : //Read number of FacetShells
1708 [ + - ]: 11 : file_reader.Read( &size, 1 );
1709 [ + - ][ + - ]: 11 : facet_shells = new FacetShell*[size];
1710 [ + - ][ + - ]: 22 : DLIList<Surface*> temp_surfs;
1711 [ + + ]: 33 : for(i=0; i<size; i++)
1712 : : {
1713 [ + - ]: 22 : temp_surfs.clean_out();
1714 : 22 : unsigned int num_surfs = 0;
1715 [ + - ]: 22 : file_reader.Read( &num_surfs, 1 );
1716 : :
1717 [ + - ][ + - ]: 22 : int* surface_ids = new int[ num_surfs ];
1718 [ + - ]: 22 : file_reader.Read( (unsigned*)surface_ids, num_surfs );
1719 : :
1720 [ + + ]: 154 : for( j=0; j<num_surfs; j++)
1721 : : {
1722 [ + - ][ - + ]: 132 : if( surface_ids[j] >= num_facet_surfaces ||
1723 : 132 : surface_ids[j] < 0 )
1724 : : {
1725 [ # # ]: 0 : delete [] facet_shells;
1726 : 0 : return CUBIT_FAILURE;
1727 : : }
1728 : :
1729 [ + - ]: 132 : temp_surfs.append( facet_surfaces[ surface_ids[j] ] );
1730 : : }
1731 : :
1732 [ + - ][ + - ]: 22 : tmp_shell = new FacetShell( temp_surfs );
1733 : 22 : facet_shells[i] = tmp_shell;
1734 : 22 : num_facet_shells++;
1735 : :
1736 : : // Add this shell to surfaces
1737 [ + + ]: 154 : for( j=0; j<num_surfs; j++)
1738 [ + - ]: 132 : facet_surfaces[ surface_ids[j] ]->add_shell( tmp_shell );
1739 : :
1740 [ + - ]: 22 : delete [] surface_ids;
1741 : : }
1742 : :
1743 : : //-----------------Read FacetLumps------------------
1744 : : //Read number of FacetLumps
1745 [ + - ]: 11 : file_reader.Read( &size, 1 );
1746 [ + - ][ + - ]: 11 : facet_lumps = new FacetLump*[size];
1747 [ + - ][ + - ]: 22 : DLIList<ShellSM*> temp_shells;
1748 [ + + ]: 33 : for(i=0; i<size; i++)
1749 : : {
1750 [ + - ]: 22 : temp_shells.clean_out();
1751 : :
1752 : 22 : unsigned int num_shells = 0;
1753 [ + - ]: 22 : file_reader.Read( &num_shells, 1 );
1754 : :
1755 [ + - ][ + - ]: 22 : int* shell_ids = new int[ num_shells ];
1756 [ + - ]: 22 : file_reader.Read( (unsigned*)shell_ids, num_shells );
1757 : :
1758 [ + + ]: 44 : for( j=0; j<num_shells; j++)
1759 : : {
1760 [ - + ]: 22 : if( shell_ids[j] >= num_facet_shells )
1761 : : {
1762 [ # # ]: 0 : delete [] facet_lumps;
1763 : 0 : return CUBIT_FAILURE;
1764 : : }
1765 [ + - ]: 22 : temp_shells.append( facet_shells[ shell_ids[j] ] );
1766 : : }
1767 : :
1768 [ + - ][ + - ]: 22 : tmp_lump = new FacetLump( temp_shells );
1769 [ - + ]: 22 : if( tmp_lump == NULL )
1770 : 0 : return CUBIT_FAILURE;
1771 : :
1772 : 22 : facet_lumps[i] = tmp_lump;
1773 : 22 : num_facet_lumps++;
1774 : :
1775 [ + + ]: 44 : for( j=0; j<num_shells; j++)
1776 [ + - ]: 22 : facet_shells[ shell_ids[j] ]->add_lump( tmp_lump );
1777 : :
1778 [ + - ]: 22 : delete [] shell_ids;
1779 [ + - ]: 22 : tmp_lump->restore_attribs( file_ptr, endian );
1780 : : }
1781 : :
1782 : : //-----------------Read FacetBodies ------------------
1783 : : //Read number of FacetBodies
1784 [ + - ]: 11 : file_reader.Read( &size, 1 );
1785 [ + - ][ + - ]: 11 : facet_bodies = new FacetBody*[size];
1786 [ + - ][ + - ]: 22 : DLIList<Lump*> temp_lumps;
1787 [ + + ]: 33 : for(i=0; i<size; i++)
1788 : : {
1789 [ + - ]: 22 : temp_lumps.clean_out();
1790 : :
1791 : 22 : unsigned int num_lumps= 0;
1792 [ + - ]: 22 : file_reader.Read( &num_lumps, 1 );
1793 : :
1794 [ + - ][ + - ]: 22 : int* lump_ids = new int[ num_lumps ];
1795 [ + - ]: 22 : file_reader.Read( (unsigned*)lump_ids, num_lumps );
1796 : :
1797 [ + + ]: 44 : for( j=0; j<num_lumps; j++)
1798 : : {
1799 [ - + ]: 22 : if( lump_ids[j] >= num_facet_lumps )
1800 : : {
1801 [ # # ]: 0 : delete [] facet_bodies;
1802 : 0 : return CUBIT_FAILURE;
1803 : : }
1804 [ + - ]: 22 : temp_lumps.append( facet_lumps[ lump_ids[j] ] );
1805 : : }
1806 : :
1807 [ + - ][ + - ]: 22 : tmp_body = new FacetBody( temp_lumps );
1808 [ - + ]: 22 : if( tmp_body == NULL )
1809 : 0 : return CUBIT_FAILURE;
1810 : :
1811 : 22 : facet_bodies[i] = tmp_body;
1812 : 22 : num_facet_bodies++;
1813 : :
1814 : : // Add this FacetBody to FacetLumps
1815 [ + + ]: 44 : for( j=0; j<num_lumps; j++)
1816 [ + - ]: 22 : facet_lumps[ lump_ids[j] ]->add_body( tmp_body );
1817 : :
1818 [ + - ]: 22 : delete [] lump_ids;
1819 : :
1820 : : //read in trans matrix
1821 : : unsigned int rows_and_cols[2];
1822 [ + - ]: 22 : file_reader.Read( rows_and_cols, 2 );
1823 : :
1824 : 22 : unsigned int num_rows = rows_and_cols[0];
1825 : 22 : unsigned int num_cols = rows_and_cols[1];
1826 : :
1827 [ - + ][ # # ]: 22 : if( num_rows || num_cols)
1828 : : {
1829 [ + - ]: 22 : CubitTransformMatrix trans_matrix;
1830 : :
1831 : : double *trans_matrix_array;
1832 [ + - ][ + - ]: 22 : trans_matrix_array = new double[ num_rows*num_cols ];
1833 [ + - ]: 22 : file_reader.Read( trans_matrix_array, num_rows*num_cols );
1834 : :
1835 : : unsigned c;
1836 [ + + ]: 110 : for(j=0; j<num_rows; j++ )
1837 : : {
1838 [ + + ]: 440 : for(c=0; c<num_cols; c++)
1839 [ + - ]: 352 : trans_matrix.add(j,c, trans_matrix_array[(j*num_cols)+c] );
1840 : : }
1841 [ + - ][ + - ]: 22 : tmp_body->set_transforms( trans_matrix );
[ + - ]
1842 [ + - ][ + - ]: 22 : delete [] trans_matrix_array;
1843 : : }
1844 [ + - ]: 22 : tmp_body->restore_attribs( file_ptr, endian );
1845 : : }
1846 : :
1847 : : // Here is where we determine if the entites are free or not
1848 : : // bodies, all bodies are free
1849 [ + + ]: 33 : for(k=0; k<num_facet_bodies; k++)
1850 [ + - ]: 22 : imported_entities.append( facet_bodies[k] );
1851 : :
1852 : : // surfaces are free if they are not in a shell
1853 [ + - ][ + - ]: 22 : DLIList<FacetShell*> shell_list;
1854 [ + + ]: 143 : for(k=0; k<num_facet_surfaces; k++)
1855 : : {
1856 [ + - ]: 132 : shell_list.clean_out();
1857 [ + - ]: 132 : facet_surfaces[k]->get_shells( shell_list );
1858 [ + - ][ - + ]: 132 : if( shell_list.size() == 0 )
1859 [ # # ]: 0 : imported_entities.append( facet_surfaces[k] );
1860 : : }
1861 : :
1862 : : // curves are free if they are not associate with a coedge
1863 [ + - ][ + - ]: 22 : DLIList<FacetCoEdge*> coedge_list;
1864 [ + + ]: 275 : for(k=0; k<num_facet_curves; k++)
1865 : : {
1866 [ + - ]: 264 : coedge_list.clean_out();
1867 [ + - ]: 264 : facet_curves[k]->get_coedges( coedge_list );
1868 [ + - ][ - + ]: 264 : if( coedge_list.size() == 0 )
1869 [ # # ]: 0 : imported_entities.append( facet_curves[k] );
1870 : : }
1871 : :
1872 : : // points are free if they are not associate with a curve
1873 [ + - ][ + - ]: 22 : DLIList<FacetCurve*> curve_list;
1874 [ + + ]: 187 : for(k=0; k<num_facet_points; k++)
1875 : : {
1876 [ + - ]: 176 : curve_list.clean_out();
1877 [ + - ]: 176 : facet_points[k]->get_curves( curve_list );
1878 [ + - ][ - + ]: 176 : if( curve_list.size() == 0 )
1879 [ # # ]: 0 : imported_entities.append( facet_points[k] );
1880 : : }
1881 : :
1882 : : // clean up
1883 [ + - ]: 11 : delete [] facet_points;
1884 [ + - ]: 11 : delete [] facet_curves;
1885 [ + - ]: 11 : delete [] facet_coedges;
1886 [ + - ]: 11 : delete [] facet_loops;
1887 [ + - ]: 11 : delete [] facet_surfaces;
1888 [ + - ]: 11 : delete [] facet_shells;
1889 [ + - ]: 11 : delete [] facet_lumps;
1890 [ + - ]: 11 : delete [] facet_bodies;
1891 : :
1892 [ + - ]: 11 : return CUBIT_SUCCESS;
1893 : : }
1894 : :
1895 : 11 : CubitStatus FacetQueryEngine::import_solid_model( const char* file_name ,
1896 : : Model_File_Type file_type,
1897 : : DLIList<TopologyBridge*> &imported_entities,
1898 : : ModelImportOptions &import_options )
1899 : : {
1900 : 11 : errno = 0;
1901 : 11 : FILE *file_ptr = fopen(file_name, "rb");
1902 [ - + ]: 11 : if (!file_ptr)
1903 : : {
1904 [ # # ][ # # ]: 0 : PRINT_ERROR("Cannot open file: %s (%s)\n", file_name, strerror(errno) );
1905 : 0 : return CUBIT_FAILURE;
1906 : : }
1907 : :
1908 : 11 : CubitStatus status = import_solid_model(file_ptr, imported_entities );
1909 : :
1910 : 11 : fclose(file_ptr);
1911 : 11 : return status;
1912 : : }
1913 : :
1914 : 11 : CubitStatus FacetQueryEngine::import_solid_model(FILE *file_ptr,
1915 : : DLIList<TopologyBridge*> &imported_entities )
1916 : :
1917 : : {
1918 : 11 : CubitPoint **points_array = NULL;
1919 : 11 : CurveFacetEvalTool **cfet_array = NULL;
1920 : 11 : FacetEvalTool **fet_array = NULL;
1921 : :
1922 : : int num_points, num_edges, num_facets;
1923 : : int num_cfet, num_fet;
1924 : :
1925 : : // read in the file type "MESHED_BASED_GEOMETRY"
1926 : 11 : char fileType[19] = {0};
1927 : :
1928 [ + - ][ - + ]: 11 : if( fread( fileType, 1, 19, file_ptr) != 19 )
1929 : : {
1930 [ # # ][ # # ]: 0 : PRINT_ERROR("Trouble reading in file type for MBG\n");
[ # # ][ # # ]
1931 : 0 : return CUBIT_FAILURE;
1932 : : }
1933 : :
1934 [ - + ]: 11 : if( strncmp( fileType, "MESH_BASED_GEOMETRY", 19 ) )
1935 : : {
1936 [ # # ][ # # ]: 0 : PRINT_ERROR("Not MESH_BASED_GEOMETRY file type\n");
[ # # ][ # # ]
1937 : 0 : return CUBIT_FAILURE;
1938 : : }
1939 : :
1940 : : // read in the endian value
1941 [ + - ]: 11 : NCubitFile::CIOWrapper file_reader(file_ptr, 19, 0);
1942 : :
1943 : : // read in version #
1944 : : UnsignedInt32 version;
1945 [ + - ]: 11 : file_reader.Read( &version, 1 );
1946 : :
1947 : : //Read in points/edges/facets
1948 : : CubitStatus status;
1949 : : status = restore_facets( file_ptr, file_reader.get_endian(),
1950 : : num_points, num_edges,
1951 : : num_facets, points_array, num_cfet,
1952 [ + - ][ + - ]: 11 : num_fet, cfet_array, fet_array );
1953 [ - + ]: 11 : if( status == CUBIT_FAILURE)
1954 : : {
1955 [ # # ][ # # ]: 0 : PRINT_ERROR("Problems restore facets\n");
[ # # ][ # # ]
1956 : 0 : return CUBIT_FAILURE;
1957 : : }
1958 : :
1959 : : //Restore Topology
1960 : : status = restore_topology( file_ptr, file_reader.get_endian(),
1961 : : num_points, points_array,
1962 : : num_cfet, cfet_array, num_fet,
1963 [ + - ][ + - ]: 11 : fet_array, imported_entities);
1964 [ - + ]: 11 : if( status == CUBIT_FAILURE)
1965 : : {
1966 [ # # ][ # # ]: 0 : PRINT_ERROR("Problems restore MDB topology\n");
[ # # ][ # # ]
1967 : 0 : return CUBIT_FAILURE;
1968 : : }
1969 : :
1970 : :
1971 [ + - ]: 11 : if(cfet_array != NULL)
1972 [ + - ]: 11 : delete [] cfet_array;
1973 [ + - ]: 11 : if(fet_array != NULL)
1974 [ + - ]: 11 : delete [] fet_array;
1975 [ + - ]: 11 : if(points_array != NULL)
1976 [ + - ]: 11 : delete [] points_array;
1977 : :
1978 [ + - ]: 11 : return CUBIT_SUCCESS;
1979 : : }
1980 : :
1981 : :
1982 : : //===============================================================================
1983 : : // Function : restore_facets
1984 : : // Member Type: PUBLIC
1985 : : // Description: restore facets and eval tools onto the list of entities
1986 : : // Author : sjowen
1987 : : // Date : 1/26/03
1988 : : //===============================================================================
1989 : 11 : CubitStatus FacetQueryEngine::restore_facets(
1990 : : FILE *fp, // CUB file we are currently reading
1991 : : unsigned int endian,
1992 : : int &num_points,
1993 : : int &num_edges,
1994 : : int &num_facets,
1995 : : CubitPoint **&points,
1996 : : int &num_cfet,
1997 : : int &num_fet,
1998 : : CurveFacetEvalTool **&cfet_array,
1999 : : FacetEvalTool **&fet_array)
2000 : : {
2001 : 11 : CubitStatus rv = CUBIT_SUCCESS;
2002 : :
2003 : 11 : CubitFacet **facets = NULL;
2004 : 11 : CubitFacetEdge **edges = NULL;
2005 : :
2006 : : // read facets from the file and build arrays of facet entities
2007 : :
2008 : : rv = read_facets( fp, endian,
2009 : : num_facets, num_edges, num_points,
2010 [ + - ]: 11 : facets, edges, points );
2011 : :
2012 : : // create the CurveFacetEvalTools and FacetEval Tools
2013 : :
2014 [ + - ]: 11 : if (rv != CUBIT_FAILURE )
2015 : : {
2016 : : rv = restore_eval_tools( fp, endian,
2017 : : num_facets, num_edges, num_points,
2018 : : facets, edges, points,
2019 : : num_cfet, num_fet,
2020 [ + - ]: 11 : cfet_array, fet_array );
2021 : : }
2022 : :
2023 [ + - ]: 11 : if (facets != NULL)
2024 [ + - ]: 11 : delete [] facets;
2025 [ + - ]: 11 : if(edges != NULL)
2026 [ + - ]: 11 : delete [] edges;
2027 : 11 : return rv;
2028 : :
2029 : : }
2030 : :
2031 : :
2032 : : //===============================================================================
2033 : : // Function : read_facets
2034 : : // Member Type: PUBLIC
2035 : : // Description: read facets from the file and create facet entities
2036 : : // Author : sjowen
2037 : : // Date : 1/26/03
2038 : : //===============================================================================
2039 : 11 : CubitStatus FacetQueryEngine::read_facets(
2040 : : FILE *fp,
2041 : : unsigned int endian,
2042 : : int &num_facets,
2043 : : int &num_edges,
2044 : : int &num_points,
2045 : : CubitFacet **&facets,
2046 : : CubitFacetEdge **&edges,
2047 : : CubitPoint **&points )
2048 : : {
2049 : :
2050 [ + - ]: 11 : NCubitFile::CIOWrapper cio(endian, fp );
2051 : : int ii;
2052 : :
2053 : : // read points
2054 : : UnsignedInt32 npoints;
2055 : : double uu,vv,ss;
2056 [ + - ]: 11 : cio.Read(&npoints, 1);
2057 : 11 : num_points = (int)npoints;
2058 [ + - ]: 11 : if (num_points > 0)
2059 : : {
2060 [ + - ][ + - ]: 11 : double* coord_array = new double [num_points * 3];
2061 [ + - ][ + - ]: 11 : double* uvs_array = new double [num_points * 3];
2062 [ + - ]: 11 : cio.Read(coord_array, npoints*3);
2063 [ + - ]: 11 : cio.Read(uvs_array, npoints*3);
2064 : :
2065 : : // create CubitPoints
2066 : : CubitPoint *point_ptr;
2067 : : //CubitVector normal;
2068 [ + - ][ + - ]: 11 : points = new CubitPoint * [num_points];
2069 [ + + ]: 319 : for(ii=0; ii<num_points; ii++)
2070 : : {
2071 : 308 : point_ptr = (CubitPoint *) new CubitPointData( coord_array[ii*3],
2072 : 308 : coord_array[ii*3+1],
2073 [ + - ][ + - ]: 308 : coord_array[ii*3+2] );
2074 : 308 : points[ii] = point_ptr;
2075 : 308 : uu = uvs_array[ii*3];
2076 : 308 : vv = uvs_array[ii*3+1];
2077 : 308 : ss = uvs_array[ii*3+2];
2078 [ + - ]: 308 : point_ptr->set_uvs(uu, vv, ss);
2079 : : }
2080 : :
2081 : : //Clean up
2082 [ + - ]: 11 : delete [] coord_array;
2083 [ + - ]: 11 : delete [] uvs_array;
2084 : : }
2085 : :
2086 : :
2087 : : //Read in Normals
2088 : : int nnormals;
2089 [ + - ]: 11 : cio.Read(reinterpret_cast<UnsignedInt32*>(&nnormals), 1);
2090 [ - + ]: 11 : if( nnormals > 0 )
2091 : : {
2092 [ # # ][ # # ]: 0 : double* normal_array = new double [nnormals * 3];
2093 [ # # ][ # # ]: 0 : int* normal_ids = new int[nnormals * 3];
2094 [ # # ]: 0 : cio.Read(normal_array, nnormals * 3);
2095 [ # # ]: 0 : cio.Read(reinterpret_cast<UnsignedInt32*>(normal_ids), nnormals);
2096 [ # # ]: 0 : CubitVector normal;
2097 [ # # ]: 0 : for(ii=0; ii<nnormals; ii++)
2098 : : {
2099 [ # # ]: 0 : normal.x( normal_array[ii*3] );
2100 [ # # ]: 0 : normal.y( normal_array[ii*3+1] );
2101 [ # # ]: 0 : normal.z( normal_array[ii*3+2] );
2102 [ # # ]: 0 : points[ normal_ids[ii] ]->normal( normal );
2103 : : }
2104 : :
2105 : : //Clean up
2106 [ # # ]: 0 : delete [] normal_array;
2107 [ # # ]: 0 : delete [] normal_ids;
2108 : : }
2109 : :
2110 : :
2111 : : // read edges and edge control points
2112 : :
2113 : : UnsignedInt32 nedges;
2114 [ + - ]: 11 : cio.Read(&nedges, 1);
2115 : 11 : num_edges = (int)nedges;
2116 [ + - ]: 11 : if (num_edges > 0)
2117 : : {
2118 [ + - ][ + - ]: 11 : UnsignedInt32 *edge_vert_array = new UnsignedInt32 [nedges*2];
2119 [ + - ]: 11 : cio.Read(edge_vert_array, nedges*2);
2120 : : UnsignedInt32 nctrl_pts;
2121 [ + - ]: 11 : cio.Read(&nctrl_pts, 1);
2122 : 11 : double *control_points = NULL;
2123 [ + - ]: 11 : if (nctrl_pts > 0)
2124 : : {
2125 [ + - ][ + - ]: 11 : control_points = new double [nctrl_pts*3];
2126 [ + - ]: 11 : cio.Read(control_points, nctrl_pts*3);
2127 : : }
2128 : :
2129 : : unsigned id0, id1, ii;
2130 [ + - ][ + - ]: 11 : edges = new CubitFacetEdge * [num_edges];
2131 : : CubitFacetEdge *edge_ptr;
2132 [ + + ]: 803 : for(ii=0; ii<nedges; ii++)
2133 : : {
2134 : 792 : id0 = edge_vert_array[ii*2];
2135 : 792 : id1 = edge_vert_array[ii*2+1];
2136 : :
2137 [ + - ][ + - ]: 792 : edge_ptr = (CubitFacetEdge *) new CubitFacetEdgeData( points[id0], points[id1] );
2138 : 792 : edges[ii] = edge_ptr;
2139 [ + - ]: 792 : if (nctrl_pts > 0)
2140 : : {
2141 [ + - ]: 792 : edge_ptr->set_control_points(&control_points[ii*NUM_EDGE_CPTS*3]);
2142 : : }
2143 : : }
2144 : :
2145 : : //Clean up
2146 [ + - ]: 11 : delete [] edge_vert_array;
2147 [ + - ]: 11 : delete [] control_points;
2148 : 11 : edge_vert_array = NULL;
2149 : 11 : control_points = NULL;
2150 : : }
2151 : :
2152 : : // read the facets and the facet control points
2153 : :
2154 : : UnsignedInt32 nfacets;
2155 [ + - ]: 11 : cio.Read(&nfacets, 1);
2156 : 11 : num_facets = (int)nfacets;
2157 [ + - ]: 11 : if(num_facets > 0)
2158 : : {
2159 [ + - ][ + - ]: 11 : UnsignedInt32 *facet_edge_array = new UnsignedInt32 [nfacets*3];
2160 [ + - ]: 11 : cio.Read(facet_edge_array, nfacets*3);
2161 [ + - ][ + - ]: 11 : int *int_data = new int [nfacets*2];
2162 [ + - ]: 11 : cio.Read(reinterpret_cast<UnsignedInt32*>(int_data), nfacets*2);
2163 : :
2164 : : UnsignedInt32 nctrl_pts;
2165 [ + - ]: 11 : cio.Read(&nctrl_pts, 1);
2166 : 11 : double *control_points = NULL;
2167 [ - + ]: 11 : if (nctrl_pts > 0)
2168 : : {
2169 [ # # ][ # # ]: 0 : control_points = new double [nctrl_pts*3];
2170 [ # # ]: 0 : cio.Read(control_points, nctrl_pts*3);
2171 : : }
2172 : :
2173 : : unsigned id0, id1, id2, ii;
2174 : : CubitFacet *facet_ptr;
2175 [ + - ][ + - ]: 11 : facets = new CubitFacet * [num_facets];
2176 [ + + ]: 539 : for (ii=0; ii<nfacets; ii++)
2177 : : {
2178 : 528 : id0 = facet_edge_array[ii*3];
2179 : 528 : id1 = facet_edge_array[ii*3+1];
2180 : 528 : id2 = facet_edge_array[ii*3+2];
2181 [ + - ][ + - ]: 528 : facet_ptr = (CubitFacet *) new CubitFacetData(edges[id0], edges[id1], edges[id2]);
2182 : 528 : facets[ii] = facet_ptr;
2183 [ + - ]: 528 : facet_ptr->is_flat( int_data[ii*2] );
2184 [ + - ]: 528 : facet_ptr->is_backwards( int_data[ii*2+1] );
2185 : :
2186 [ - + ]: 528 : if(nctrl_pts > 0)
2187 : : {
2188 [ # # ]: 0 : facet_ptr->set_control_points(&control_points[ii*NUM_TRI_CPTS*3]);
2189 : : }
2190 : : }
2191 : :
2192 : : //Clean up
2193 [ + - ]: 11 : delete [] facet_edge_array;
2194 [ - + ]: 11 : delete [] control_points;
2195 [ + - ]: 11 : delete [] int_data;
2196 : 11 : facet_edge_array = NULL;
2197 : 11 : control_points = NULL;
2198 : 11 : int_data = NULL;
2199 : : }
2200 : :
2201 : : // read the extra info at the surface boundaries
2202 : :
2203 : 11 : UnsignedInt32 num_c_zero_points = 0;
2204 [ + - ]: 11 : cio.Read(&num_c_zero_points, 1);
2205 [ + - ]: 11 : if (num_c_zero_points > 0)
2206 : : {
2207 : : UnsignedInt32 c_zero_int_data_size;
2208 : :
2209 [ + - ]: 11 : cio.Read(&c_zero_int_data_size, 1);
2210 [ - + ]: 11 : if (c_zero_int_data_size <= 0)
2211 : 0 : return CUBIT_FAILURE;
2212 [ + - ][ + - ]: 11 : UnsignedInt32 *c_zero_int32_data = new UnsignedInt32 [c_zero_int_data_size];
2213 [ + - ]: 11 : cio.Read(c_zero_int32_data, c_zero_int_data_size);
2214 [ + - ][ + - ]: 11 : int *c_zero_int_data = new int [c_zero_int_data_size];
2215 : : unsigned int jj;
2216 [ + + ]: 2475 : for (jj=0; jj<c_zero_int_data_size; jj++)
2217 : 2464 : c_zero_int_data[jj] = (int) c_zero_int32_data[jj];
2218 : :
2219 : : UnsignedInt32 c_zero_double_data_size;
2220 : :
2221 [ + - ]: 11 : cio.Read(&c_zero_double_data_size, 1);
2222 [ - + ]: 11 : if (c_zero_double_data_size <= 0) {
2223 [ # # ]: 0 : delete [] c_zero_int_data;
2224 [ # # ]: 0 : delete [] c_zero_int32_data;
2225 : 0 : return CUBIT_FAILURE;
2226 : : }
2227 [ + - ][ + - ]: 11 : double *c_zero_double_data = new double [c_zero_double_data_size];
2228 [ + - ]: 11 : cio.Read(c_zero_double_data, c_zero_double_data_size);
2229 : :
2230 : : // create the facet boundary tool datas and assign to points
2231 : :
2232 : 11 : int didx = 0;
2233 : 11 : int iidx = 0;
2234 : : UnsignedInt32 zz;
2235 [ + + ]: 187 : for (zz=0; zz<num_c_zero_points; zz++)
2236 : : {
2237 [ + - ][ - + ]: 176 : if (didx >= (int)c_zero_double_data_size ||
2238 : 176 : iidx >= (int)c_zero_int_data_size)
2239 : 0 : return CUBIT_FAILURE;
2240 : : TDFacetBoundaryPoint::new_facet_boundary_point( points, facets,
2241 [ + - ]: 176 : iidx, didx, c_zero_int_data, c_zero_double_data );
2242 : : }
2243 : :
2244 : : //Clean up
2245 [ + - ]: 11 : delete [] c_zero_int_data;
2246 [ + - ]: 11 : delete [] c_zero_int32_data;
2247 [ + - ]: 11 : delete [] c_zero_double_data;
2248 : : }
2249 : :
2250 [ + - ]: 11 : return CUBIT_SUCCESS;
2251 : : }
2252 : :
2253 : :
2254 : :
2255 : :
2256 : : //-------------------------------------------------------------------------
2257 : : // Purpose : Deletes all solid model entities associated with the
2258 : : // Bodies in the input list.
2259 : : //
2260 : : // Special Notes :
2261 : : //
2262 : : // Creator : Steve Owen
2263 : : //
2264 : : // Creation Date : 4/23/01
2265 : : //-------------------------------------------------------------------------
2266 : 0 : void FacetQueryEngine::delete_solid_model_entities(DLIList<BodySM*>&BodyList) const
2267 : : {
2268 : 0 : BodySM* BodyPtr = NULL;
2269 [ # # ]: 0 : for (int i = 0; i < BodyList.size(); i++ )
2270 : : {
2271 : 0 : BodyPtr = BodyList.get_and_step();
2272 : 0 : this->delete_solid_model_entities(BodyPtr);
2273 : : }
2274 : :
2275 : 0 : return;
2276 : : }
2277 : :
2278 : : //-------------------------------------------------------------------------
2279 : : // Purpose : Delete a FacetBody and child entities.
2280 : : //
2281 : : // Special Notes :
2282 : : //
2283 : : // Creator : Jason Kraftcheck
2284 : : //
2285 : : // Creation Date : 09/29/03
2286 : : //-------------------------------------------------------------------------
2287 : : CubitStatus
2288 : 0 : FacetQueryEngine::delete_solid_model_entities( BodySM* bodysm ) const
2289 : : {
2290 [ # # ]: 0 : FacetBody* fbody = dynamic_cast<FacetBody*>(bodysm);
2291 [ # # ]: 0 : if (!fbody)
2292 : 0 : return CUBIT_FAILURE;
2293 : :
2294 [ # # ]: 0 : DLIList<FacetLump*> lumps;
2295 [ # # ][ # # ]: 0 : DLIList<FacetShell*> shells;
2296 [ # # ][ # # ]: 0 : DLIList<FacetSurface*> surfaces;
2297 : :
2298 [ # # ]: 0 : fbody->get_lumps(lumps);
2299 [ # # ]: 0 : fbody->disconnect_all_lumps();
2300 [ # # ][ # # ]: 0 : delete fbody;
2301 : :
2302 [ # # ][ # # ]: 0 : for (int i = lumps.size(); i--; )
2303 : : {
2304 [ # # ]: 0 : FacetLump* lump = lumps.get_and_step();
2305 : :
2306 [ # # ]: 0 : shells.clean_out();
2307 [ # # ]: 0 : lump->get_shells(shells);
2308 [ # # ]: 0 : lump->disconnect_all_shells();
2309 [ # # ][ # # ]: 0 : delete lump;
2310 : :
2311 [ # # ][ # # ]: 0 : for (int j = shells.size(); j--; )
2312 : : {
2313 [ # # ]: 0 : FacetShell* shell = shells.get_and_step();
2314 : :
2315 [ # # ]: 0 : surfaces.clean_out();
2316 [ # # ]: 0 : shell->get_surfaces(surfaces);
2317 [ # # ]: 0 : shell->disconnect_all_surfaces();
2318 [ # # ][ # # ]: 0 : delete shell;
2319 : :
2320 [ # # ][ # # ]: 0 : for (int k = surfaces.size(); k--; )
2321 : : {
2322 [ # # ]: 0 : FacetSurface* surface = surfaces.get_and_step();
2323 [ # # ][ # # ]: 0 : if (!surface->has_parent_shell())
2324 [ # # ]: 0 : delete_solid_model_entities(surface);
2325 : : }
2326 : : }
2327 : : }
2328 : :
2329 [ # # ]: 0 : return CUBIT_SUCCESS;
2330 : : }
2331 : :
2332 : : //-------------------------------------------------------------------------
2333 : : // Purpose : Delete a FacetSurface and child entities.
2334 : : //
2335 : : // Special Notes :
2336 : : //
2337 : : // Creator : Jason Kraftcheck
2338 : : //
2339 : : // Creation Date : 09/29/03
2340 : : //-------------------------------------------------------------------------
2341 : : CubitStatus
2342 : 0 : FacetQueryEngine::delete_solid_model_entities( Surface* surface ) const
2343 : : {
2344 [ # # ]: 0 : FacetSurface* fsurf = dynamic_cast<FacetSurface*>(surface);
2345 [ # # ][ # # ]: 0 : if (!fsurf || fsurf->has_parent_shell())
[ # # ][ # # ]
2346 : 0 : return CUBIT_FAILURE;
2347 : :
2348 [ # # ]: 0 : DLIList<FacetLoop*> loops;
2349 [ # # ][ # # ]: 0 : DLIList<FacetCoEdge*> coedges;
2350 : :
2351 [ # # ]: 0 : fsurf->get_loops(loops);
2352 [ # # ]: 0 : fsurf->disconnect_all_loops();
2353 [ # # ][ # # ]: 0 : delete fsurf;
2354 : :
2355 [ # # ][ # # ]: 0 : for (int i = loops.size(); i--; )
2356 : : {
2357 [ # # ]: 0 : FacetLoop* loop = loops.get_and_step();
2358 : :
2359 [ # # ]: 0 : coedges.clean_out();
2360 [ # # ]: 0 : loop->get_coedges(coedges);
2361 [ # # ]: 0 : loop->disconnect_all_coedges();
2362 [ # # ][ # # ]: 0 : delete loop;
2363 : :
2364 [ # # ][ # # ]: 0 : for (int j = coedges.size(); j--; )
2365 : : {
2366 [ # # ]: 0 : FacetCoEdge* coedge = coedges.get_and_step();
2367 [ # # ][ # # ]: 0 : FacetCurve* curve = dynamic_cast<FacetCurve*>(coedge->curve());
2368 [ # # ]: 0 : if (curve)
2369 : : {
2370 [ # # ]: 0 : curve->disconnect_coedge(coedge);
2371 [ # # ][ # # ]: 0 : if (!curve->has_parent_coedge())
2372 [ # # ]: 0 : delete_solid_model_entities(curve);
2373 : : }
2374 : :
2375 [ # # ][ # # ]: 0 : delete coedge;
2376 : : }
2377 : : }
2378 : :
2379 [ # # ]: 0 : return CUBIT_SUCCESS;
2380 : : }
2381 : :
2382 : : //-------------------------------------------------------------------------
2383 : : // Purpose : Delete a FacetCurve and child entities.
2384 : : //
2385 : : // Special Notes :
2386 : : //
2387 : : // Creator : Jason Kraftcheck
2388 : : //
2389 : : // Creation Date : 09/29/03
2390 : : //-------------------------------------------------------------------------
2391 : : CubitStatus
2392 : 0 : FacetQueryEngine::delete_solid_model_entities( Curve* curve ) const
2393 : : {
2394 [ # # ]: 0 : FacetCurve* fcurve = dynamic_cast<FacetCurve*>(curve);
2395 [ # # ][ # # ]: 0 : if (!fcurve || fcurve->has_parent_coedge())
[ # # ]
2396 : 0 : return CUBIT_FAILURE;
2397 : :
2398 [ # # ]: 0 : FacetPoint* start = dynamic_cast<FacetPoint*>(fcurve->start_point());
2399 [ # # ]: 0 : FacetPoint* end = dynamic_cast<FacetPoint*>(fcurve->end_point() );
2400 : :
2401 [ # # ]: 0 : if (start == end )
2402 : 0 : end = NULL;
2403 : :
2404 [ # # ]: 0 : if (start)
2405 : : {
2406 : 0 : start->disconnect_curve(fcurve);
2407 [ # # ]: 0 : if (!start->has_parent_curve())
2408 : 0 : delete_solid_model_entities(start);
2409 : : }
2410 : :
2411 [ # # ]: 0 : if (end)
2412 : : {
2413 : 0 : end->disconnect_curve(fcurve);
2414 [ # # ]: 0 : if (!end->has_parent_curve())
2415 : 0 : delete_solid_model_entities(end);
2416 : : }
2417 : :
2418 [ # # ]: 0 : delete curve;
2419 : 0 : return CUBIT_SUCCESS;
2420 : : }
2421 : :
2422 : : //-------------------------------------------------------------------------
2423 : : // Purpose : Delete a FacetPoint and child entities.
2424 : : //
2425 : : // Special Notes :
2426 : : //
2427 : : // Creator : Jason Kraftcheck
2428 : : //
2429 : : // Creation Date : 09/29/03
2430 : : //-------------------------------------------------------------------------
2431 : : CubitStatus
2432 : 0 : FacetQueryEngine::delete_solid_model_entities( TBPoint* point ) const
2433 : : {
2434 [ # # ]: 0 : FacetPoint* fpoint = dynamic_cast<FacetPoint*>(point);
2435 [ # # ][ # # ]: 0 : if (!fpoint || fpoint->has_parent_curve())
[ # # ]
2436 : 0 : return CUBIT_FAILURE;
2437 : :
2438 [ # # ]: 0 : delete point;
2439 : 0 : return CUBIT_SUCCESS;
2440 : : }
2441 : :
2442 : 0 : CubitStatus FacetQueryEngine::fire_ray( CubitVector &origin,
2443 : : CubitVector &direction,
2444 : : DLIList<TopologyBridge*> &at_entity_list,
2445 : : DLIList<double> &ray_params,
2446 : : int max_hits,
2447 : : double ray_radius,
2448 : : DLIList<TopologyBridge*> *hit_entity_list) const
2449 : : {
2450 : :
2451 : : TopologyBridge *bridge_ptr;
2452 : : int i, j;
2453 : 0 : bool hit = false;
2454 : :
2455 [ # # ]: 0 : DLIList<double> tmp_ray_params;
2456 [ # # ][ # # ]: 0 : DLIList<FacetSurface*> at_surface_list;
2457 [ # # ][ # # ]: 0 : DLIList<FacetCurve*> at_curve_list;
2458 [ # # ][ # # ]: 0 : DLIList<FacetPoint*> at_point_list;
2459 : :
2460 [ # # ]: 0 : if( ray_radius == 0.0 )
2461 [ # # ]: 0 : ray_radius = get_sme_resabs_tolerance();
2462 : :
2463 [ # # ]: 0 : at_entity_list.reset();
2464 [ # # ][ # # ]: 0 : for (i=0; i<at_entity_list.size(); i++)
2465 : : {
2466 : 0 : hit = false;
2467 [ # # ]: 0 : bridge_ptr = at_entity_list.get_and_step();
2468 : :
2469 : : //determine which type of geometry we have. body, lump, face, curve?
2470 [ # # ][ # # ]: 0 : if (CAST_TO(bridge_ptr, FacetBody))
[ # # ]
2471 : : {
2472 [ # # ]: 0 : FacetBody* f_body = CAST_TO(bridge_ptr, FacetBody);
2473 [ # # ]: 0 : DLIList<Surface*> surface_list;
2474 [ # # ][ # # ]: 0 : f_body->surfaces(surface_list);
2475 : : }
2476 [ # # ][ # # ]: 0 : else if (CAST_TO(bridge_ptr, FacetLump))
[ # # ]
2477 : : {
2478 [ # # ]: 0 : FacetLump* f_lump = CAST_TO(bridge_ptr, FacetLump);
2479 [ # # ][ # # ]: 0 : PRINT_INFO("Found FacetLump.\n");
[ # # ][ # # ]
2480 [ # # ]: 0 : DLIList<FacetSurface*> f_surface_list;
2481 [ # # ]: 0 : f_lump->get_surfaces(f_surface_list);
2482 [ # # ][ # # ]: 0 : at_surface_list.merge_unique(f_surface_list);
2483 : : }
2484 [ # # ][ # # ]: 0 : else if (CAST_TO(bridge_ptr, Surface))
[ # # ]
2485 : : {
2486 [ # # ]: 0 : FacetSurface* f_surface = CAST_TO(bridge_ptr, FacetSurface);
2487 : :
2488 [ # # ]: 0 : DLIList<CubitFacet*> facet_list;
2489 [ # # ][ # # ]: 0 : DLIList<CubitPoint*> point_list;
2490 [ # # ]: 0 : f_surface->get_my_facets(facet_list, point_list);
2491 : :
2492 : : //PRINT_INFO("There are %d facets.\n", facet_list.size());
2493 : :
2494 : : //RTree<CubitFacet*> rtree(ray_radius);
2495 : : //for (j=0; j<facet_list.size(); j++)
2496 : : // rtree.add(facet_list.get_and_step();
2497 : :
2498 : : //DLIList<CubitFacet*> facet_list1;
2499 : : //CubitBox range_box();
2500 : : //make range box for the ray
2501 : : //rtree.find(range_box, facet_list1);
2502 : :
2503 [ # # ][ # # ]: 0 : CubitVector* intersection_pt = new CubitVector();
2504 : : double distance;
2505 : :
2506 [ # # ][ # # ]: 0 : for (j=0; j<facet_list.size(); j++)
2507 : : {
2508 [ # # ]: 0 : if (hit)
2509 : 0 : break;
2510 : :
2511 [ # # ]: 0 : CubitFacet* facet = facet_list.get_and_step();
2512 : :
2513 : : // Find intersection of ray with triangle
2514 [ # # ]: 0 : int rv = FacetEvalTool::intersect_ray(origin, direction, facet, intersection_pt, distance);
2515 : :
2516 [ # # # # : 0 : switch (rv)
# ]
2517 : : {
2518 : : case -1:
2519 : : //PRINT_INFO("Facet is degenerate (segment or point).\n");
2520 : 0 : break;
2521 : : case 0:
2522 : : //PRINT_INFO("Ray does not intersect the facet.\n");
2523 : 0 : break;
2524 : : case 1:
2525 : : {
2526 : 0 : hit = true;
2527 [ # # ]: 0 : if (hit_entity_list)
2528 [ # # ]: 0 : hit_entity_list->append(bridge_ptr);
2529 [ # # ]: 0 : ray_params.append(distance);
2530 : : //PRINT_INFO("Ray intersects facet at %f, %f, %f.\n", intersection_pt->x(), intersection_pt->y(), intersection_pt->z());
2531 : :
2532 : 0 : continue;
2533 : : }
2534 : : case 2:
2535 : : //PRINT_INFO("Ray is in same plane as the facet.\n");
2536 : 0 : break;
2537 : : }
2538 : : }
2539 [ # # ]: 0 : if (intersection_pt)
2540 [ # # ]: 0 : delete intersection_pt;
2541 : :
2542 : : }
2543 [ # # ][ # # ]: 0 : else if (CAST_TO(bridge_ptr, Curve))
[ # # ]
2544 : : {
2545 [ # # ]: 0 : FacetCurve* f_curve = CAST_TO(bridge_ptr, FacetCurve);
2546 [ # # ]: 0 : DLIList<CubitFacetEdge*> facet_edge_list;
2547 [ # # ]: 0 : f_curve->get_facets(facet_edge_list);
2548 : :
2549 : : //PRINT_INFO("There are %d facetedges.\n", facet_edge_list.size());
2550 [ # # ][ # # ]: 0 : CubitVector* intersection_pt = new CubitVector();
2551 : : double distance;
2552 : :
2553 [ # # ][ # # ]: 0 : for (j=0; j<facet_edge_list.size(); j++)
2554 : : {
2555 [ # # ]: 0 : if (hit)
2556 : 0 : break;
2557 : :
2558 [ # # ]: 0 : CubitFacetEdge* facet_edge = facet_edge_list.get_and_step();
2559 : :
2560 [ # # ]: 0 : int rv = FacetEvalTool::intersect_ray(origin, direction, facet_edge, intersection_pt, distance);
2561 : :
2562 [ # # # # : 0 : switch (rv)
# ]
2563 : : {
2564 : : case -1:
2565 : : //PRINT_INFO("Facet is degenerate (segment or point).\n");
2566 : 0 : break;
2567 : : case 0:
2568 : : //PRINT_INFO("Ray does not intersect the facet edge.\n");
2569 : 0 : break;
2570 : : case 1:
2571 : : {
2572 : 0 : hit = true;
2573 [ # # ]: 0 : if (hit_entity_list)
2574 [ # # ]: 0 : hit_entity_list->append(bridge_ptr);
2575 [ # # ]: 0 : ray_params.append(distance);
2576 : : //PRINT_INFO("Ray intersects facet at %f, %f, %f.\n", intersection_pt->x(), intersection_pt->y(), intersection_pt->z());
2577 : :
2578 : 0 : continue;
2579 : : }
2580 : : case 2:
2581 : : //PRINT_INFO("Ray is parallel to the facet.\n");
2582 : 0 : break;
2583 : : }
2584 : :
2585 : : }
2586 [ # # ]: 0 : if (intersection_pt)
2587 [ # # ]: 0 : delete intersection_pt;
2588 : : }
2589 [ # # ][ # # ]: 0 : else if (CAST_TO(bridge_ptr, FacetPoint))
[ # # ]
2590 : : {
2591 [ # # ]: 0 : FacetPoint* f_point = CAST_TO(bridge_ptr, FacetPoint);
2592 [ # # ]: 0 : at_point_list.append_unique(f_point);
2593 : : }
2594 : : else
2595 : : ;//PRINT_INFO("Cast error in FacetQueryEngine::fire_ray.\n");
2596 : :
2597 : : }
2598 : :
2599 [ # # ]: 0 : return CUBIT_SUCCESS;
2600 : : }
2601 : : //- fire a ray at the specified entities, returning the parameters
2602 : : //- (distances) along the ray and optionally the entities hit
2603 : :
2604 : :
2605 : 0 : double FacetQueryEngine::get_sme_resabs_tolerance() const
2606 : : {
2607 : 0 : return GEOMETRY_RESABS;
2608 : : }
2609 : : // Gets solid modeler's resolution absolute tolerance
2610 : :
2611 : 0 : double FacetQueryEngine::set_sme_resabs_tolerance( double )
2612 : : {
2613 [ # # ][ # # ]: 0 : PRINT_ERROR("FacetQueryEngine::set_sme_resabs_tolerance not yet implemented.\n");
2614 : 0 : return CUBIT_FAILURE;
2615 : : }
2616 : :
2617 : 0 : CubitStatus FacetQueryEngine::set_int_option( const char* , int )
2618 : : {
2619 [ # # ][ # # ]: 0 : PRINT_ERROR("FacetQueryEngine::set_int_option not yet implemented.\n");
2620 : 0 : return CUBIT_FAILURE;
2621 : : }
2622 : :
2623 : 0 : CubitStatus FacetQueryEngine::set_dbl_option( const char* , double )
2624 : : {
2625 [ # # ][ # # ]: 0 : PRINT_ERROR("FacetQueryEngine::set_dbl_option not yet implemented.\n");
2626 : 0 : return CUBIT_FAILURE;
2627 : : }
2628 : :
2629 : 0 : CubitStatus FacetQueryEngine::set_str_option( const char* , const char* )
2630 : : {
2631 [ # # ][ # # ]: 0 : PRINT_ERROR("FacetQueryEngine::set_str_option not yet implemented.\n");
2632 : 0 : return CUBIT_FAILURE;
2633 : : }
2634 : : //- Set solid modeler options
2635 : :
2636 : : //===========================================================================
2637 : : //Function Name: make_facets
2638 : : //Member Type: PUBLIC
2639 : : //Description: creates Cubit quad facet entities from the hash points and
2640 : : // connectivity
2641 : : //===========================================================================
2642 : 0 : CubitStatus FacetQueryEngine::make_facets(
2643 : : int *conn, // conectivity array (size = 4 * nfacets)
2644 : : int nfacets, // total number of facets (tri+quad)
2645 : : DLIList<CubitQuadFacet *> &facet_list ) // return the facet list
2646 : : {
2647 : 0 : CubitQuadFacet *facet_ptr = NULL;
2648 : 0 : CubitStatus rv = CUBIT_SUCCESS;
2649 : : CubitPoint *point0, *point1, *point2, *point3;
2650 : :
2651 : : // create the facet array
2652 : :
2653 [ # # ]: 0 : for(int ii=0; ii<nfacets; ii++)
2654 : : {
2655 [ # # ]: 0 : if (conn[ii*4+2] != conn[ii*4+3])
2656 : : {
2657 [ # # ]: 0 : point0 = get_hash_point(conn[ii*4]);
2658 [ # # ]: 0 : point1 = get_hash_point(conn[ii*4+1]);
2659 [ # # ]: 0 : point2 = get_hash_point(conn[ii*4+2]);
2660 [ # # ]: 0 : point3 = get_hash_point(conn[ii*4+3]);
2661 : :
2662 [ # # ][ # # ]: 0 : facet_ptr = new CubitQuadFacetData( point0, point1, point2, point3 );
2663 : :
2664 [ # # ]: 0 : if (!facet_ptr)
2665 : : {
2666 : 0 : rv = CUBIT_FAILURE;
2667 : 0 : return rv;
2668 : : }
2669 [ # # ]: 0 : facet_list.append( facet_ptr );
2670 : : }
2671 : : }
2672 : 0 : return rv;
2673 : : }
2674 : :
2675 : : //===========================================================================
2676 : : //Function Name: make_facets
2677 : : //Member Type: PUBLIC
2678 : : //Description: creates Cubit tri facet entities from the hash points and
2679 : : // connectivity
2680 : : //===========================================================================
2681 : 0 : CubitStatus FacetQueryEngine::make_facets(
2682 : : int *conn, // conectivity array (size = 4 * nfacets)
2683 : : int nfacets, // total number of facets (tri+quad)
2684 : : DLIList<CubitFacet *> &facet_list ) // return the facet list
2685 : : {
2686 : 0 : CubitFacet *facet_ptr = NULL;
2687 : 0 : CubitStatus rv = CUBIT_SUCCESS;
2688 : : CubitPoint *point0, *point1, *point2;
2689 : :
2690 : : // create the facet array
2691 : :
2692 [ # # ]: 0 : for(int ii=0; ii<nfacets; ii++)
2693 : : {
2694 [ # # ]: 0 : if (conn[ii*4+2] == conn[ii*4+3])
2695 : : {
2696 [ # # ]: 0 : point0 = get_hash_point(conn[ii*4]);
2697 [ # # ]: 0 : point1 = get_hash_point(conn[ii*4+1]);
2698 [ # # ]: 0 : point2 = get_hash_point(conn[ii*4+2]);
2699 [ # # ][ # # ]: 0 : if( (point0 == point1) || (point0 == point2) || (point1 == point2) ){
[ # # ]
2700 [ # # ][ # # ]: 0 : PRINT_ERROR("Point used more than once in a single facet. This is not allowed.\n");
[ # # ][ # # ]
2701 : 0 : return CUBIT_FAILURE;
2702 : : }
2703 [ # # ][ # # ]: 0 : if( !point0 || !point1 || !point2 ){
[ # # ]
2704 [ # # ][ # # ]: 0 : PRINT_ERROR("Point in facet is undefined. This is not allowed.\n");
[ # # ][ # # ]
2705 : 0 : return CUBIT_FAILURE;
2706 : : }
2707 : :
2708 [ # # ][ # # ]: 0 : facet_ptr = new CubitFacetData( point0, point1, point2 );
2709 : :
2710 [ # # ]: 0 : if (!facet_ptr)
2711 : : {
2712 : 0 : rv = CUBIT_FAILURE;
2713 : 0 : return rv;
2714 : : }
2715 [ # # ]: 0 : facet_list.append( facet_ptr );
2716 : : }
2717 : : }
2718 : :
2719 : 0 : return rv;
2720 : : }
2721 : :
2722 : : //===========================================================================
2723 : : //Function Name: ensure_is_ascii_stl_file
2724 : : //Member Type:
2725 : : //Description: returns CUBIT_TRUE in is_ascii if fp is an ascii stl file
2726 : : //Author: Plamen Stoyanov (USF)
2727 : : //===========================================================================
2728 : 11 : CubitStatus FacetQueryEngine::ensure_is_ascii_stl_file(FILE * fp, CubitBoolean &is_ascii)
2729 : : {
2730 : :
2731 : 11 : char line[128]="";
2732 : :
2733 [ + - ][ - + ]: 11 : if (fgets(line, 128, fp)==NULL)
2734 : : {
2735 : 0 : return CUBIT_FAILURE;
2736 : : }
2737 [ + - ][ - + ]: 11 : if (fgets(line, 128, fp)==NULL)
2738 : : {
2739 : 0 : return CUBIT_FAILURE;
2740 : : }
2741 [ - + ]: 11 : if (strlen(line)==127)
2742 : : {
2743 [ # # ][ # # ]: 0 : if (fgets(line, 128, fp)==NULL)
2744 : : {
2745 : 0 : return CUBIT_FAILURE;
2746 : : }
2747 : : }
2748 : :
2749 : :
2750 : 11 : unsigned int dummy_int=0;
2751 : :
2752 : : // One of the functions called by isspace() has an assert that can fail in debug mode if
2753 : : // line[dummy_int] is negative so check for it here.
2754 [ + - ][ - + ]: 11 : while (line[dummy_int] > -1 && isspace(line[dummy_int]) && dummy_int < strlen(line))
[ # # ]
2755 : 0 : dummy_int++;
2756 : :
2757 [ + - ]: 11 : if (strlen(line)-dummy_int>5)
2758 : : {
2759 [ + - ][ + - ]: 22 : if (tolower(line[dummy_int++])=='f' &&
2760 [ + - ]: 11 : tolower(line[dummy_int++])=='a' &&
2761 [ + - ]: 11 : tolower(line[dummy_int++])=='c' &&
2762 [ + - ][ + - ]: 22 : tolower(line[dummy_int++])=='e' &&
2763 : 11 : tolower(line[dummy_int])=='t')
2764 : : {
2765 [ + - ][ - + ]: 11 : if (fgets(line, 128, fp)==NULL)
2766 : : {
2767 : 0 : return CUBIT_FAILURE;
2768 : : }
2769 : 11 : dummy_int=0;
2770 [ - + ][ # # ]: 11 : while (isspace(line[dummy_int])&& dummy_int<strlen(line))
2771 : : {
2772 : 0 : dummy_int++;
2773 : : }
2774 [ + - ]: 11 : if (strlen(line)-dummy_int>5)
2775 : : {
2776 [ + - ][ + - ]: 22 : if (tolower(line[dummy_int++])=='o' &&
2777 [ + - ]: 11 : tolower(line[dummy_int++])=='u' &&
2778 [ + - ]: 11 : tolower(line[dummy_int++])=='t' &&
2779 [ + - ][ + - ]: 22 : tolower(line[dummy_int++])=='e' &&
2780 : 11 : tolower(line[dummy_int])=='r')
2781 : : {
2782 [ + - ][ - + ]: 11 : if (fgets(line, 128, fp)==NULL)
2783 : : {
2784 : 0 : return CUBIT_FAILURE;
2785 : : }
2786 : 11 : dummy_int=0;
2787 [ - + ][ # # ]: 11 : while (isspace(line[dummy_int])&& dummy_int<strlen(line)) {
2788 : 0 : dummy_int++;
2789 : : }
2790 [ + - ]: 11 : if (strlen(line)-dummy_int>6)
2791 : : {
2792 [ + - ][ + - ]: 22 : if (tolower(line[dummy_int++])=='v' &&
2793 [ + - ]: 11 : tolower(line[dummy_int++])=='e' &&
2794 [ + - ]: 11 : tolower(line[dummy_int++])=='r' &&
2795 [ + - ]: 11 : tolower(line[dummy_int++])=='t' &&
2796 [ + - ][ + - ]: 22 : tolower(line[dummy_int++])=='e' &&
2797 : 11 : tolower(line[dummy_int])=='x')
2798 : : {
2799 : 11 : is_ascii=CUBIT_TRUE;
2800 : : }
2801 : : }
2802 : : }
2803 : : }
2804 : : }
2805 : : }
2806 : 11 : return CUBIT_SUCCESS;
2807 : : }
2808 : :
2809 : : //===========================================================================
2810 : : //Function Name: read_facets_stl
2811 : : //Member Type:
2812 : : //Description: read facets from stl file combining vertices within tolerance
2813 : : //distance
2814 : : //Author: Plamen Stoyanov (USF)
2815 : : //===========================================================================
2816 : 11 : CubitStatus FacetQueryEngine::read_facets_stl_tolerance(
2817 : : DLIList<CubitFacet *> &tfacet_list,
2818 : : DLIList<CubitPoint *> & /*point_list*/,
2819 : : const char * file_name,
2820 : : int &npoints,
2821 : : int &ntri,
2822 : : long& seek_address,
2823 : : double tolerance
2824 : : )
2825 : : {
2826 : :
2827 [ + - ]: 11 : FILE *fp = fopen(file_name, "r");
2828 [ - + ]: 11 : if (fp == NULL)
2829 : : {
2830 [ # # ][ # # ]: 0 : PRINT_ERROR("Could not open file %s for reading\n", file_name);
[ # # ][ # # ]
2831 : 0 : seek_address = 0;
2832 : 0 : return CUBIT_FAILURE;
2833 : : }
2834 : :
2835 [ + - ]: 11 : DLIList <CubitPoint *> file_points;
2836 : : CubitPoint *current_point;
2837 : 11 : int points_in_file=0;
2838 : : int ii;
2839 : :
2840 : 11 : CubitBoolean is_ascii=CUBIT_FALSE;
2841 [ + - ][ - + ]: 11 : if (!ensure_is_ascii_stl_file(fp, is_ascii))
2842 : : {
2843 : 0 : seek_address = 0;
2844 [ # # ]: 0 : fclose(fp);
2845 : 0 : return CUBIT_FAILURE;
2846 : : }
2847 : :
2848 [ + - ]: 11 : if (is_ascii==CUBIT_TRUE)
2849 : : {
2850 : :
2851 [ + - ][ + - ]: 11 : PRINT_INFO("Reading facets...\n");
[ + - ][ + - ]
2852 [ + - ]: 11 : fclose(fp);
2853 [ + - ]: 11 : fp = fopen(file_name, "r");
2854 : 11 : fseek(fp,seek_address,SEEK_SET);
2855 : :
2856 : : char line[128], junk[30];
2857 : : int numverts;
2858 : : double xx[3], yy[3], zz[3];
2859 : : int linenumber, num;
2860 : : bool done, error_found, eof_found;
2861 : :
2862 : 11 : linenumber = 0;
2863 : :
2864 : 11 : strcpy(line,"");
2865 : 11 : done = false;
2866 : 11 : error_found = false;
2867 : 11 : eof_found = false;
2868 [ + - ][ + - ]: 143 : while ( (strstr(line,"endsolid") == 0) && (error_found == false) ) {
2869 : 143 : numverts = 0;
2870 [ + + ]: 1078 : while ( numverts < 3 ) {
2871 [ + - ][ - + ]: 946 : if ( fgets(line,127,fp) == 0 ) {
2872 : 0 : linenumber++;
2873 : 0 : eof_found = true;
2874 : 0 : break; // EOF
2875 : : }
2876 : 946 : linenumber++;
2877 : : // makelowercase(line);
2878 : : int len, ij;
2879 : 946 : len = strlen(line);
2880 [ + + ]: 34639 : for ( ij = 0; ij < len; ij++ )
2881 : 33693 : line[ij] = tolower(line[ij]);
2882 : :
2883 [ + + ]: 946 : if ( strstr(line,"endsolid") != 0 ) {
2884 : 11 : done = true;
2885 : 11 : break; // End of part definition
2886 : : }
2887 [ + + ]: 935 : if ( strstr(line,"vertex") != 0 ) {
2888 : 396 : num = sscanf(line,"%s %le %le %le",junk,&xx[numverts],&yy[numverts],&zz[numverts]);
2889 [ - + ]: 396 : if ( num != 4 ) {
2890 : 0 : error_found = true;
2891 : 0 : break; // error in reading vertices
2892 : : }
2893 : 396 : numverts += 1;
2894 : : }
2895 : : } // end of while ( numverts < 3 )
2896 : :
2897 [ + - ][ + + ]: 143 : if ( (eof_found == true) || (done == true) ||
[ + - ]
2898 [ + - ]: 132 : (error_found == true) || (numverts != 3) ) break;
2899 : :
2900 [ + - ][ + - ]: 132 : current_point = (CubitPoint *) new CubitPointData(xx[0],yy[0],zz[0]);
2901 [ + - ]: 132 : current_point->set_id(points_in_file++);
2902 [ + - ]: 132 : file_points.append(current_point);
2903 [ + - ][ + - ]: 132 : current_point = (CubitPoint *) new CubitPointData(xx[1],yy[1],zz[1]);
2904 [ + - ]: 132 : current_point->set_id(points_in_file++);
2905 [ + - ]: 132 : file_points.append(current_point);
2906 [ + - ][ + - ]: 132 : current_point = (CubitPoint *) new CubitPointData(xx[2],yy[2],zz[2]);
2907 [ + - ]: 132 : current_point->set_id(points_in_file++);
2908 [ + - ]: 132 : file_points.append(current_point);
2909 : :
2910 : : }
2911 : 11 : seek_address = 0;
2912 [ - + ]: 11 : if ( eof_found == true ) {
2913 [ # # ][ # # ]: 0 : PRINT_WARNING("Premature end-of-file on STL file. Body may be incomplete.\n");
[ # # ][ # # ]
2914 [ # # ]: 0 : fclose(fp);
2915 : 0 : goto end_read_file_points;
2916 : : }
2917 [ - + ]: 11 : if ( error_found == true ) {
2918 [ # # ][ # # ]: 0 : PRINT_WARNING("Error found while reading line number %d of file %s. Body may be incomplete.\n",
[ # # ]
2919 [ # # ]: 0 : linenumber,file_name);
2920 [ # # ]: 0 : fclose(fp);
2921 : 0 : goto end_read_file_points;
2922 : : }
2923 [ - + ]: 11 : if ( done == false ) {
2924 [ # # ][ # # ]: 0 : PRINT_WARNING("Error found while reading line number %d of file %s. Body may be incomplete.\n",
[ # # ]
2925 [ # # ]: 0 : linenumber,file_name);
2926 [ # # ]: 0 : fclose(fp);
2927 : 0 : goto end_read_file_points;
2928 : : }
2929 : :
2930 [ + - ][ + - ]: 11 : if ( (eof_found == false) && (error_found == false) && (done == true) ) {
[ + - ]
2931 [ + - ][ - + ]: 11 : while ( fgets(line,127,fp) != 0 ) {
2932 [ # # ][ # # ]: 0 : if ( (strstr(line,"solid") != 0) && (strstr(line,"endsolid") == 0) ) {
2933 [ # # ]: 0 : seek_address = ftell(fp);
2934 : 0 : break;
2935 : : }
2936 : : }
2937 : : }
2938 [ + - ]: 11 : fclose(fp);
2939 : 11 : goto end_read_file_points;
2940 : : }
2941 : : else
2942 : : {
2943 [ # # ]: 0 : fclose(fp);
2944 : : // file is closed so that it can be opened as binary
2945 [ # # ]: 0 : fp = fopen(file_name, "rb");
2946 [ # # ]: 0 : if (fp == NULL)
2947 : : {
2948 [ # # ][ # # ]: 0 : PRINT_ERROR("Could not open file %s for reading\n", file_name);
[ # # ][ # # ]
2949 : 0 : return CUBIT_FAILURE;
2950 : : }
2951 : :
2952 : : char dummy;
2953 : : // iterates through the facets of the file
2954 : : float cur[12]; // an array to hold 48 bytes representing 1AVS facet
2955 : :
2956 : 0 : fseek(fp, 80, SEEK_SET);
2957 [ # # ]: 0 : size_t count = fread(&ntri, 4, 1, fp);
2958 [ # # ]: 0 : if (count != 1) {
2959 [ # # ][ # # ]: 0 : PRINT_ERROR("Trouble reading in number of triangles\n");
[ # # ][ # # ]
2960 : 0 : return CUBIT_FAILURE;
2961 : : }
2962 : :
2963 [ # # ][ # # ]: 0 : PRINT_INFO ("Reading facets...\n");
[ # # ][ # # ]
2964 [ # # ]: 0 : for (ii=0; ii<ntri; ii++) {
2965 : : // read in 1 facet
2966 [ # # ][ # # ]: 0 : if (fread(cur, 4, 12, fp) != 12)
2967 : : {
2968 [ # # ][ # # ]: 0 : PRINT_INFO ("Abnormal file termination %s \n", file_name); break;
[ # # ][ # # ]
2969 : : }
2970 [ # # ]: 0 : count = fread(&dummy, 1, 1, fp);
2971 [ # # ]: 0 : count = fread(&dummy, 1, 1, fp);
2972 : :
2973 : : //make point
2974 [ # # ][ # # ]: 0 : current_point = (CubitPoint *) new CubitPointData(cur[3],cur[4],cur[5]);
2975 [ # # ]: 0 : current_point->set_id(points_in_file++);
2976 [ # # ]: 0 : file_points.append(current_point);
2977 [ # # ][ # # ]: 0 : current_point = (CubitPoint *) new CubitPointData(cur[6],cur[7],cur[8]);
2978 [ # # ]: 0 : current_point->set_id(points_in_file++);
2979 [ # # ]: 0 : file_points.append(current_point);
2980 [ # # ][ # # ]: 0 : current_point = (CubitPoint *) new CubitPointData(cur[9],cur[10],cur[11]);
2981 [ # # ]: 0 : current_point->set_id(points_in_file++);
2982 [ # # ]: 0 : file_points.append(current_point);
2983 : : }
2984 : : }
2985 [ # # ]: 0 : fclose(fp);
2986 : :
2987 : : // at this point all points from the file are in file_points
2988 : : end_read_file_points:
2989 : :
2990 : : // grid search tree to hold points
2991 [ + - ][ + - ]: 11 : GridSearchTree * node_grid = new GridSearchTree (tolerance);
2992 : :
2993 : : CubitPoint
2994 : : *point0,
2995 : : *point1,
2996 : : *point2;
2997 : : CubitFacet
2998 : : *facet_ptr;
2999 : 11 : ntri=0;
3000 : 11 : npoints=0;
3001 : :
3002 [ + - ][ - + ]: 11 : if (file_points.size() % 3 != 0)
3003 : : {
3004 [ # # ][ # # ]: 0 : PRINT_INFO("File Error.");
[ # # ][ # # ]
3005 : 0 : return CUBIT_FAILURE;
3006 : : }
3007 : :
3008 [ + - ][ + + ]: 143 : for (ii = file_points.size(); ii>0; ii-=3)
3009 : : {
3010 : :
3011 : : // get three points from the file_points list
3012 : : // and compare them against the data already in the
3013 : : // grid search tree; if it contains a point within
3014 : : // epsilon tolerance this point would replace the
3015 : : // current point
3016 [ + - ][ + - ]: 132 : point0 = node_grid->fix(file_points.get_and_step());
3017 [ + - ][ + - ]: 132 : point1 = node_grid->fix(file_points.get_and_step());
3018 [ + - ][ + - ]: 132 : point2 = node_grid->fix(file_points.get_and_step());
3019 : :
3020 : :
3021 [ + - ][ + - ]: 132 : if (point0 && point1 && point2 && point0 != point1 && point1!=point2 && point2!=point0 )
[ + - ][ + - ]
[ + - ][ + - ]
3022 : : {
3023 : :
3024 [ + - ][ + - ]: 132 : facet_ptr = new CubitFacetData(point0, point1, point2);
3025 : :
3026 [ + - ]: 132 : if (facet_ptr)
3027 : : {
3028 [ + - ]: 132 : tfacet_list.append(facet_ptr);
3029 : 132 : ntri++;
3030 : : }
3031 : :
3032 : : }
3033 : : }
3034 : :
3035 : : //delete node_grid;
3036 [ + - ]: 11 : return CUBIT_SUCCESS;
3037 : : }
3038 : :
3039 : :
3040 : : //===========================================================================
3041 : : //Function Name: read_facets_stl
3042 : : //Member Type:
3043 : : //Description: read facets from stl file
3044 : : //Author: Plamen Stoyanov (USF)
3045 : : //===========================================================================
3046 : :
3047 : 0 : CubitStatus FacetQueryEngine::read_facets_stl(
3048 : : DLIList<CubitFacet *> &tfacet_list,
3049 : : DLIList<CubitPoint *> &point_list,
3050 : : const char * file_name,
3051 : : int &npoints,
3052 : : int &ntri,
3053 : : long& seek_address
3054 : : )
3055 : : {
3056 : :
3057 : 0 : ntri = 0;
3058 : 0 : npoints = 0;
3059 [ # # ]: 0 : FILE *fp = fopen(file_name, "r");
3060 [ # # ]: 0 : if (fp == NULL)
3061 : : {
3062 [ # # ][ # # ]: 0 : PRINT_ERROR("Could not open file %s for reading\n", file_name);
[ # # ][ # # ]
3063 : 0 : seek_address = 0;
3064 : 0 : return CUBIT_FAILURE;
3065 : : }
3066 : :
3067 : : typedef std::map< CubitPoint * , int, CubitPointComparator > vMap;
3068 : :
3069 [ # # ]: 0 : vMap mm; // binary search tree to hold the vertices for efficiency
3070 [ # # ]: 0 : vMap::iterator pos;
3071 : 0 : bool append_to_facet_list=CUBIT_TRUE;
3072 : :
3073 : 0 : CubitBoolean is_ascii=CUBIT_FALSE;
3074 : :
3075 [ # # ][ # # ]: 0 : if (!ensure_is_ascii_stl_file(fp, is_ascii))
3076 : : {
3077 : 0 : seek_address = 0;
3078 [ # # ]: 0 : fclose(fp);
3079 : 0 : return CUBIT_FAILURE;
3080 : : }
3081 : :
3082 [ # # ]: 0 : if (is_ascii==CUBIT_TRUE)
3083 : : {
3084 : : CubitPoint *point0,*point1,*point2;
3085 : 0 : CubitFacet *facet_ptr = NULL;
3086 : :
3087 [ # # ][ # # ]: 0 : PRINT_INFO("Reading facets...\n");
[ # # ][ # # ]
3088 [ # # ]: 0 : fclose(fp);
3089 [ # # ]: 0 : fp = fopen(file_name, "r");
3090 : 0 : fseek(fp,seek_address,SEEK_SET);
3091 : : char line[128], junk[30];
3092 : : int numverts;
3093 : : double xx[3], yy[3], zz[3];
3094 : : int linenumber, num;
3095 : : bool done, error_found, eof_found;
3096 : :
3097 : 0 : linenumber = 0;
3098 : :
3099 : 0 : strcpy(line,"");
3100 : 0 : done = false;
3101 : 0 : error_found = false;
3102 : 0 : eof_found = false;
3103 [ # # ][ # # ]: 0 : while ( (strstr(line,"endsolid") == 0) && (error_found == false) ) {
3104 : 0 : numverts = 0;
3105 [ # # ]: 0 : while ( numverts < 3 ) {
3106 [ # # ][ # # ]: 0 : if ( fgets(line,127,fp) == 0 ) {
3107 : 0 : linenumber++;
3108 : 0 : eof_found = true;
3109 : 0 : break; // EOF
3110 : : }
3111 : 0 : linenumber++;
3112 : : // makelowercase(line);
3113 : : int len, ij;
3114 : 0 : len = strlen(line);
3115 [ # # ]: 0 : for ( ij = 0; ij < len; ij++ )
3116 : 0 : line[ij] = tolower(line[ij]);
3117 : :
3118 [ # # ]: 0 : if ( strstr(line,"endsolid") != 0 ) {
3119 : 0 : done = true;
3120 : 0 : break; // End of part definition
3121 : : }
3122 [ # # ]: 0 : if ( strstr(line,"vertex") != 0 ) {
3123 : 0 : num = sscanf(line,"%s %le %le %le",junk,&xx[numverts],&yy[numverts],&zz[numverts]);
3124 [ # # ]: 0 : if ( num != 4 ) {
3125 : 0 : error_found = true;
3126 : 0 : break; // error in reading vertices
3127 : : }
3128 : 0 : numverts += 1;
3129 : : }
3130 : : } // end of while ( numverts < 3 )
3131 : :
3132 [ # # ][ # # ]: 0 : if ( (eof_found == true) || (done == true) ||
[ # # ]
3133 [ # # ]: 0 : (error_found == true) || (numverts != 3) ) break;
3134 [ # # ][ # # ]: 0 : point0 = (CubitPoint *) new CubitPointData(xx[0],yy[0],zz[0]);
3135 [ # # ]: 0 : pos=mm.find(point0);
3136 : :
3137 [ # # ][ # # ]: 0 : if (pos==mm.end())
[ # # ]
3138 : : {
3139 [ # # ][ # # ]: 0 : mm.insert ( vMap::value_type(point0, npoints));
3140 [ # # ]: 0 : point0->set_id( npoints ++ );
3141 : : //point_list is output of functionAVS
3142 [ # # ]: 0 : point_list.append(point0);
3143 : : }
3144 : : else
3145 : : {
3146 [ # # ][ # # ]: 0 : delete point0;
3147 [ # # ]: 0 : point0=((*pos).first);
3148 : : }
3149 [ # # ][ # # ]: 0 : point1 = (CubitPoint *) new CubitPointData(xx[1],yy[1],zz[1]);
3150 [ # # ]: 0 : pos=mm.find(point1);
3151 [ # # ][ # # ]: 0 : if (pos==mm.end())
[ # # ]
3152 : : {
3153 [ # # ][ # # ]: 0 : mm.insert ( vMap::value_type(point1, npoints));
3154 [ # # ]: 0 : point1->set_id( npoints ++ );
3155 : : //point_list is output of function
3156 [ # # ]: 0 : point_list.append(point1);
3157 : : }
3158 : : else
3159 : : {
3160 [ # # ][ # # ]: 0 : delete point1;
3161 [ # # ]: 0 : point1=((*pos).first);
3162 : : }
3163 [ # # ][ # # ]: 0 : point2 = (CubitPoint *) new CubitPointData(xx[2],yy[2],zz[2]);
3164 [ # # ]: 0 : pos=mm.find(point2);
3165 [ # # ][ # # ]: 0 : if (pos==mm.end())
[ # # ]
3166 : : {
3167 [ # # ][ # # ]: 0 : mm.insert ( vMap::value_type(point2, npoints));
3168 [ # # ]: 0 : point2->set_id( npoints ++ );
3169 : : //point_list is output of function
3170 [ # # ]: 0 : point_list.append(point2);
3171 : : }
3172 : : else
3173 : : {
3174 [ # # ][ # # ]: 0 : delete point2;
3175 [ # # ]: 0 : point2=((*pos).first);
3176 : : }
3177 : :
3178 [ # # ][ # # ]: 0 : if (point0 && point1 && point2 && point0!=point1 && point1!=point2 && point2 !=point0)
[ # # ][ # # ]
[ # # ][ # # ]
3179 : : {
3180 [ # # ][ # # ]: 0 : facet_ptr = new CubitFacetData( point0, point1, point2 );
3181 : 0 : append_to_facet_list=CUBIT_TRUE;
3182 : : }
3183 : : else
3184 : : {
3185 : 0 : append_to_facet_list=CUBIT_FALSE;
3186 : : }
3187 : :
3188 [ # # ]: 0 : if (!facet_ptr)
3189 : : {
3190 : 0 : seek_address = 0;
3191 [ # # ]: 0 : fclose(fp);
3192 : 0 : return CUBIT_FAILURE;
3193 : : }
3194 : :
3195 : : /// APPEND facet to output facet_ptr list
3196 [ # # ]: 0 : if (append_to_facet_list)
3197 : : {
3198 [ # # ]: 0 : tfacet_list.append( facet_ptr );
3199 : 0 : ntri++;
3200 : : }
3201 : :
3202 : : }
3203 : 0 : seek_address = 0;
3204 [ # # ]: 0 : if ( eof_found == true ) {
3205 [ # # ][ # # ]: 0 : PRINT_WARNING("Premature end-of-file on STL file. Body may be incomplete.\n");
[ # # ][ # # ]
3206 [ # # ]: 0 : fclose(fp);
3207 : 0 : return CUBIT_SUCCESS;
3208 : : }
3209 [ # # ]: 0 : if ( error_found == true ) {
3210 [ # # ][ # # ]: 0 : PRINT_WARNING("Error found while reading line number %d of file %s. Body may be incomplete.\n",
[ # # ]
3211 [ # # ]: 0 : linenumber,file_name);
3212 [ # # ]: 0 : fclose(fp);
3213 : 0 : return CUBIT_SUCCESS;
3214 : : }
3215 [ # # ]: 0 : if ( done == false ) {
3216 [ # # ][ # # ]: 0 : PRINT_WARNING("Error found while reading line number %d of file %s. Body may be incomplete.\n",
[ # # ]
3217 [ # # ]: 0 : linenumber,file_name);
3218 [ # # ]: 0 : fclose(fp);
3219 : 0 : return CUBIT_SUCCESS;
3220 : : }
3221 : :
3222 [ # # ][ # # ]: 0 : if ( (eof_found == false) && (error_found == false) && (done == true) ) {
[ # # ]
3223 [ # # ][ # # ]: 0 : while ( fgets(line,127,fp) != 0 ) {
3224 [ # # ][ # # ]: 0 : if ( (strstr(line,"solid") != 0) && (strstr(line,"endsolid") == 0) ) {
3225 [ # # ]: 0 : seek_address = ftell(fp);
3226 : : // PRINT_INFO("This STL file is a multipart file. Only the first part was read.\n");
3227 : 0 : break;
3228 : : }
3229 : : }
3230 : : }
3231 [ # # ]: 0 : fclose(fp);
3232 : :
3233 : 0 : return CUBIT_SUCCESS;
3234 : : }
3235 : : else
3236 : : {
3237 [ # # ]: 0 : fclose(fp);
3238 : : // file is closed so that it can be opened as binary
3239 [ # # ]: 0 : fp = fopen(file_name, "rb");
3240 [ # # ]: 0 : if (fp == NULL)
3241 : : {
3242 [ # # ][ # # ]: 0 : PRINT_ERROR("Could not open file %s for reading\n", file_name);
[ # # ][ # # ]
3243 : 0 : return CUBIT_FAILURE;
3244 : : }
3245 : :
3246 : :
3247 : 0 : CubitFacet *facet_ptr = NULL;
3248 : : CubitPoint *point0,
3249 : : *point1,
3250 : : *point2;
3251 : :
3252 : : char dummy;
3253 : 0 : int ii=0; // iterates through the facets of the file
3254 : : float cur[12]; // an array to hold 48 bytes representing 1 facet
3255 : 0 : npoints=0; // only tri facets in stl files
3256 : :
3257 : : //put file pointer back where you found it
3258 : 0 : fseek(fp, seek_address+80, SEEK_SET);
3259 [ # # ]: 0 : size_t count = fread(&ntri, 4, 1, fp);
3260 [ # # ]: 0 : if (count != 1) {
3261 [ # # ][ # # ]: 0 : PRINT_ERROR("Trouble reading in number of triangles\n");
[ # # ][ # # ]
3262 : 0 : return CUBIT_FAILURE;
3263 : : }
3264 : 0 : int distinct_ntri=ntri;
3265 : :
3266 [ # # ][ # # ]: 0 : PRINT_INFO ("Reading facets...\n");
[ # # ][ # # ]
3267 [ # # ]: 0 : for (ii=0; ii<ntri; ii++) {
3268 : : // read in 1 facet
3269 [ # # ][ # # ]: 0 : if (fread(cur, 4, 12, fp) != 12)
3270 : : {
3271 [ # # ][ # # ]: 0 : PRINT_INFO ("Abnormal file termination %s \n", file_name); break;
[ # # ][ # # ]
3272 : : }
3273 [ # # ]: 0 : count = fread(&dummy, 1, 1, fp);
3274 [ # # ]: 0 : count = fread(&dummy, 1, 1, fp);
3275 : :
3276 : : //make point
3277 [ # # ][ # # ]: 0 : point0 = (CubitPoint *) new CubitPointData( cur[3], cur[4], cur[5] );
3278 : :
3279 [ # # ]: 0 : pos=mm.find(point0);
3280 [ # # ][ # # ]: 0 : if (pos==mm.end())
[ # # ]
3281 : : {
3282 [ # # ][ # # ]: 0 : mm.insert ( vMap::value_type(point0, npoints));
3283 [ # # ]: 0 : point0->set_id( npoints ++ );
3284 : : //point_list is output of function
3285 [ # # ]: 0 : point_list.append(point0);
3286 : : }
3287 : : else
3288 : : {
3289 [ # # ][ # # ]: 0 : delete point0;
3290 [ # # ]: 0 : point0=((*pos).first);
3291 : : }
3292 : :
3293 : : //make point
3294 [ # # ][ # # ]: 0 : point1 = (CubitPoint *) new CubitPointData( cur[6], cur[7], cur[8] );
3295 : :
3296 [ # # ]: 0 : pos=mm.find(point1);
3297 [ # # ][ # # ]: 0 : if (pos==mm.end())
[ # # ]
3298 : : {
3299 [ # # ][ # # ]: 0 : mm.insert ( vMap::value_type(point1, npoints));
3300 [ # # ]: 0 : point1->set_id( npoints ++ );
3301 : : //point_list is output of function
3302 [ # # ]: 0 : point_list.append(point1);
3303 : : }
3304 : : else
3305 : : {
3306 [ # # ][ # # ]: 0 : delete point1;
3307 [ # # ]: 0 : point1=((*pos).first);
3308 : : }
3309 : :
3310 : : //make point
3311 [ # # ][ # # ]: 0 : point2 = (CubitPoint *) new CubitPointData( cur[9], cur[10], cur[11] );
3312 : :
3313 [ # # ]: 0 : pos=mm.find(point2);
3314 [ # # ][ # # ]: 0 : if (pos==mm.end())
[ # # ]
3315 : : {
3316 [ # # ][ # # ]: 0 : mm.insert ( vMap::value_type(point2, npoints));
3317 [ # # ]: 0 : point2->set_id( npoints ++ );
3318 : : //point_list is output of function
3319 [ # # ]: 0 : point_list.append(point2);
3320 : : }
3321 : : else
3322 : : {
3323 [ # # ][ # # ]: 0 : delete point2;
3324 [ # # ]: 0 : point2=((*pos).first);
3325 : : }
3326 : :
3327 : : // this is to avoid a facet with all points on same line, which crashes CUBIT
3328 : : // because of assertion
3329 [ # # ][ # # ]: 0 : if (point0 && point1 && point2 && point0!=point1 && point1!=point2 && point2 !=point0)
[ # # ][ # # ]
[ # # ][ # # ]
3330 : : {
3331 [ # # ][ # # ]: 0 : facet_ptr = new CubitFacetData( point0, point1, point2 );
3332 : 0 : append_to_facet_list=CUBIT_TRUE;
3333 : : }
3334 : : else
3335 : : {
3336 : 0 : append_to_facet_list=CUBIT_FALSE;
3337 : : }
3338 : :
3339 [ # # ]: 0 : if (!facet_ptr)
3340 : : {
3341 [ # # ]: 0 : fclose(fp);
3342 : 0 : return CUBIT_FAILURE;
3343 : : }
3344 : :
3345 [ # # ]: 0 : if (append_to_facet_list)
3346 : : {
3347 [ # # ]: 0 : tfacet_list.append( facet_ptr );
3348 : : }
3349 : : else
3350 : : {
3351 : 0 : distinct_ntri--;
3352 : : }
3353 : : }
3354 : 0 : ntri=distinct_ntri;
3355 : :
3356 : : //reading at or past EOF
3357 [ # # ]: 0 : long previous_pos = ftell(fp);
3358 [ # # ]: 0 : fread(&dummy, 1, 1, fp);
3359 : :
3360 [ # # ]: 0 : if( feof(fp) )
3361 : 0 : seek_address = 0;
3362 : : else
3363 : : {
3364 : 0 : fseek(fp, previous_pos, SEEK_SET);
3365 [ # # ]: 0 : seek_address = ftell(fp);
3366 : : }
3367 : :
3368 [ # # ]: 0 : fclose(fp);
3369 : 0 : return CUBIT_SUCCESS;
3370 [ # # ]: 0 : }
3371 : : }
3372 : :
3373 : :
3374 : : //===========================================================================
3375 : : //Function Name: import_facets
3376 : : //Member Type: PUBLIC
3377 : : //Description: import facets and create geometry
3378 : : //===========================================================================
3379 : 11 : CubitStatus FacetQueryEngine::import_facets(
3380 : : const char *file_name, // to be read
3381 : : CubitBoolean use_feature_angle, // to define where surfaces are broken
3382 : : double feature_angle, // angle where surfaces are broken (degrees)
3383 : : double tolerance, // for stl files loading
3384 : : int interp_order, // Facet representation 1= linear, 4= Bezier
3385 : : CubitBoolean smooth_non_manifold, // continutiy accross non-manifold edges
3386 : : CubitBoolean split_surfaces, // break facet rep at surface boundaries
3387 : : CubitBoolean stitch, // attempt to stitch together facets at the boundary
3388 : : CubitBoolean improve, // smooth, swap and collapse to improve quality
3389 : : DLIList<CubitQuadFacet *> &quad_facet_list, // return quad facets
3390 : : DLIList<CubitFacet *> &tri_facet_list, // return tri facets
3391 : : DLIList<Surface *> &surface_list, // return list of surfaces
3392 : : FacetFileFormat file_format )
3393 : : {
3394 [ + - ]: 11 : DLIList <CubitFacet *>tfacet_list;
3395 [ + - ][ + - ]: 22 : DLIList <CubitQuadFacet *>qfacet_list;
3396 [ + - ][ + - ]: 22 : DLIList <CubitPoint *>point_list;
3397 : :
3398 : : ShellSM *shell_ptr;
3399 [ + - ][ + - ]: 22 : DLIList<ShellSM*> shell_list;
3400 : : Lump *lump_ptr;
3401 [ + - ][ + - ]: 22 : DLIList<Lump*> lump_list;
3402 : : BodySM *bodysm_ptr;
3403 : : Body *body_ptr;
3404 [ + - ]: 11 : GeometryQueryTool *gti = GeometryQueryTool::instance();
3405 : : FacetShell* facet_shell;
3406 [ + - ][ + - ]: 22 : DLIList<DLIList<CubitFacet *> *> shell_facet_list;
3407 : : int ishell, ii;
3408 : 11 : CubitBoolean is_water_tight = CUBIT_TRUE;
3409 : :
3410 : : // read the facets from a file
3411 : :
3412 : 11 : int *conn = NULL;
3413 : 11 : int npoints = 0;
3414 : 11 : int nfacets = 0;
3415 : 11 : int nquad = 0;
3416 : 11 : int ntri = 0;
3417 : :
3418 : : int prev_vert;
3419 : : int prev_edge;
3420 : : int prev_face;
3421 : : int prev_vol;
3422 : : int prev_bod;
3423 : :
3424 : 11 : long stl_seek_address=0;
3425 : 11 : bool stl_multiple_parts = true;
3426 : :
3427 : : CubitStatus rv;
3428 : : // Here we add the capability to read stl files with more than one part.
3429 [ + + ]: 22 : while ( stl_multiple_parts == true ) {
3430 : 11 : stl_multiple_parts = false;
3431 [ + - ]: 11 : prev_vert = gti->num_ref_vertices();
3432 [ + - ]: 11 : prev_edge = gti->num_ref_edges();
3433 [ + - ]: 11 : prev_face = gti->num_ref_faces();
3434 [ + - ]: 11 : prev_vol = gti->num_ref_volumes();
3435 [ + - ]: 11 : prev_bod = gti->num_bodies();
3436 [ + - - - : 11 : switch (file_format)
- ]
3437 : : {
3438 : : case STL_FILE:
3439 [ + - ]: 11 : tfacet_list.clean_out(); // In case there are multiple parts in the stl file
3440 [ + - ]: 11 : point_list.clean_out();
3441 [ + - ]: 11 : shell_list.clean_out();
3442 [ + - ]: 11 : lump_list.clean_out();
3443 [ + - ]: 11 : shell_facet_list.clean_out();
3444 [ + - ]: 11 : if (tolerance>0)
3445 : : {
3446 [ + - ]: 11 : rv = read_facets_stl_tolerance(tfacet_list, point_list, file_name, npoints, ntri, stl_seek_address, tolerance);
3447 : : }
3448 : : else
3449 : : {
3450 [ # # ]: 0 : rv = read_facets_stl(tfacet_list, point_list, file_name, npoints, ntri, stl_seek_address);
3451 : : }
3452 [ + - ][ + - ]: 11 : PRINT_INFO(" %d facets read.\n", ntri);
[ + - ][ + - ]
3453 [ + - ][ - + ]: 11 : if ( (rv == CUBIT_SUCCESS) && (stl_seek_address) > 0 ) stl_multiple_parts = true;
3454 : 11 : nfacets = ntri;
3455 : :
3456 [ - + ]: 11 : if (rv != CUBIT_SUCCESS)
3457 : : {
3458 : 0 : goto end_import_facets;
3459 : : }
3460 : 11 : break;
3461 : :
3462 : : case CUBIT_FACET_FILE:
3463 : : case AVS_FILE:
3464 [ # # ]: 0 : rv = read_facets( file_name, conn, npoints, nquad, ntri, file_format );
3465 : :
3466 : 0 : nfacets = ntri + nquad;
3467 : :
3468 [ # # ]: 0 : if (rv != CUBIT_SUCCESS)
3469 : 0 : goto end_import_facets;
3470 : :
3471 : : // make cubit facet entities from the points and connectivity
3472 : :
3473 [ # # ]: 0 : if (nquad > 0)
3474 [ # # ]: 0 : rv = make_facets(conn, nfacets, qfacet_list);
3475 [ # # ]: 0 : if (ntri > 0)
3476 [ # # ]: 0 : rv = make_facets(conn, nfacets, tfacet_list);
3477 [ # # ]: 0 : if (rv != CUBIT_SUCCESS)
3478 : 0 : goto end_import_facets;
3479 [ # # ]: 0 : get_all_hash_points(point_list);
3480 [ # # ]: 0 : delete_hash_points();
3481 : 0 : break;
3482 : : case CHOLLA_FILE:
3483 [ # # ]: 0 : rv = read_cholla_file( file_name, feature_angle, point_list, tfacet_list );
3484 : 0 : nquad = 0;
3485 [ # # ]: 0 : ntri = tfacet_list.size();
3486 [ # # ]: 0 : npoints = point_list.size();
3487 : 0 : break;
3488 : : case FROM_FACET_LIST:
3489 [ # # ]: 0 : tfacet_list = tri_facet_list;
3490 [ # # ]: 0 : qfacet_list = quad_facet_list;
3491 [ # # ][ # # ]: 0 : if (tfacet_list.size() + qfacet_list.size() == 0)
[ # # ]
3492 : : {
3493 [ # # ][ # # ]: 0 : PRINT_ERROR("No facets found to build geometry\n");
[ # # ][ # # ]
3494 : 0 : rv = CUBIT_FAILURE;
3495 : 0 : goto end_import_facets;
3496 : : }
3497 : 0 : break;
3498 : : default:
3499 : 0 : assert(0); // unrecognized file format
3500 : : break;
3501 : : }
3502 : :
3503 [ + - ][ + - ]: 11 : if (tfacet_list.size() + qfacet_list.size() == 0)
[ - + ]
3504 : : {
3505 [ # # ][ # # ]: 0 : PRINT_ERROR("No facets read from file %s.\n", file_name);
[ # # ][ # # ]
3506 : 0 : rv = CUBIT_FAILURE;
3507 : 0 : goto end_import_facets;
3508 : : }
3509 : : else
3510 : : {
3511 [ + - ][ + - ]: 22 : PRINT_INFO("Building facet-based geometry from %d facets...\n",
[ + - ][ + - ]
[ + - ]
3512 [ + - ]: 11 : tfacet_list.size() + qfacet_list.size() );
3513 : : }
3514 : :
3515 : : // if (fix)
3516 : : // {
3517 : : // rv = check_facets( point_list, tfacet_list );
3518 : : // }
3519 : :
3520 : : if (0)
3521 : : {
3522 : : // Call function to generate an x-y-z file for a CTH/SPH simulation
3523 : : // the following is an exampl call...
3524 : : //make_sph( point_list, tfacet_list, 100.0, "fem1-sph100.xyz" );
3525 : : }
3526 : :
3527 : : if (0)
3528 : : {
3529 : : // This is an example of using the export_facets function. Writes
3530 : : // a facet file of all facets in the list
3531 : :
3532 : : //commented out because otherwise it's a compiler warning.
3533 : :
3534 : : // char filename[128];
3535 : : // strcpy(filename, "my_test.facets");
3536 : : // export_facets(tfacet_list,filename);
3537 : : }
3538 : :
3539 : :
3540 : : // split the facets into shells if needed
3541 : :
3542 : : rv = FacetDataUtil::split_into_shells(tfacet_list, qfacet_list,
3543 [ + - ]: 11 : shell_facet_list, is_water_tight);
3544 [ - + ]: 11 : if (rv != CUBIT_SUCCESS)
3545 : : {
3546 [ # # ][ # # ]: 0 : PRINT_ERROR("Error processing facets from %s.\n", file_name);
[ # # ][ # # ]
3547 : 0 : goto end_import_facets;
3548 : : }
3549 : :
3550 : : // if the facets aren't watertight, see if they can be merged
3551 : :
3552 [ - + ][ # # ]: 11 : if (!is_water_tight && stitch)
3553 : : {
3554 : : rv = FacetDataUtil::stitch_facets(shell_facet_list,
3555 : : GEOMETRY_RESABS,
3556 [ # # ]: 0 : is_water_tight);
3557 [ # # ]: 0 : if (rv != CUBIT_SUCCESS)
3558 : : {
3559 [ # # ][ # # ]: 0 : PRINT_WARNING("Couldn't stitch facets.\n");
[ # # ][ # # ]
3560 : : }
3561 : : }
3562 : :
3563 : : DLIList <CubitFacet *> *facet_list_ptr;
3564 [ + - ]: 11 : if (improve)
3565 : : {
3566 [ + - ][ + + ]: 22 : for (ishell = 0; ishell < shell_facet_list.size(); ishell++)
3567 : : {
3568 [ + - ]: 11 : facet_list_ptr = shell_facet_list.get_and_step();
3569 [ + - ]: 11 : rv = FacetDataUtil::collapse_short_edges( *facet_list_ptr, CUBIT_TRUE );
3570 [ - + ]: 11 : if (rv != CUBIT_SUCCESS)
3571 : : {
3572 [ # # ][ # # ]: 0 : PRINT_WARNING("Couldn't improve facets.\n");
[ # # ][ # # ]
3573 : : }
3574 : : }
3575 : : }
3576 : :
3577 : : // check for consistent orientations on the facets for each shell
3578 : :
3579 [ + - ][ + + ]: 22 : for (ishell = 0; ishell < shell_facet_list.size(); ishell++)
3580 : : {
3581 [ + - ]: 11 : facet_list_ptr = shell_facet_list.get_and_step();
3582 : : rv = ChollaEngine::check_all_facet_orientations(*facet_list_ptr,
3583 [ + - ]: 11 : CUBIT_TRUE);
3584 [ - + ]: 11 : if (rv != CUBIT_SUCCESS)
3585 : : {
3586 [ # # ][ # # ]: 0 : PRINT_WARNING("Couldn't set consistent orientation for facets.\n");
[ # # ][ # # ]
3587 : : }
3588 : : // check to see that we have a positive enclosed volume (note this only works for
3589 : : // a single shell. Will need to do something else for multiple shells
3590 : :
3591 [ + - ][ + - ]: 11 : if (shell_facet_list.size() == 1)
3592 : : {
3593 [ + - ]: 11 : double volume = FacetEvalTool::contained_volume(*facet_list_ptr);
3594 [ - + ]: 11 : if (volume < 0.0)
3595 : : {
3596 [ # # ]: 11 : FacetEvalTool::reverse_facets(*facet_list_ptr);
3597 : : }
3598 : : }
3599 : : }
3600 : :
3601 : : // create the surface geometry
3602 : :
3603 [ - + ]: 11 : if (!use_feature_angle)
3604 : 0 : feature_angle = -1.0;
3605 : :
3606 [ + - ]: 11 : std::vector< std::vector<Surface*> > list_of_shells;
3607 : :
3608 [ + - ][ + + ]: 22 : for (ishell = 0; ishell < shell_facet_list.size(); ishell++)
3609 : : {
3610 [ + - ]: 11 : DLIList <Surface *> shell_surfaces;
3611 [ + - ][ + - ]: 22 : DLIList <CubitPoint *> mypoint_list;
[ + - ]
3612 [ + - ]: 11 : facet_list_ptr = shell_facet_list.get_and_step();
3613 [ - + ]: 11 : if(facet_list_ptr == NULL)
3614 : 0 : rv = CUBIT_FAILURE;
3615 : : else
3616 : : rv = FacetModifyEngine::instance()->build_facet_surface( NULL,
3617 : : *facet_list_ptr, mypoint_list,
3618 : : feature_angle, interp_order,
3619 : : smooth_non_manifold,
3620 [ + - ][ + - ]: 11 : split_surfaces, shell_surfaces);
3621 [ + - ][ + - ]: 11 : if (rv != CUBIT_SUCCESS || shell_surfaces.size() == 0)
[ - + ][ - + ]
3622 : : {
3623 [ # # ][ # # ]: 0 : PRINT_ERROR("Couldn't build facet based geometry from facets in %s\n", file_name);
[ # # ][ # # ]
3624 : 0 : rv = CUBIT_FAILURE;
3625 : 0 : goto end_import_facets;
3626 : : }
3627 : :
3628 [ + - ][ + - ]: 11 : list_of_shells.push_back( shell_surfaces.as_vector() );
[ + - ][ + - ]
3629 : 11 : }
3630 : :
3631 : : // make a shell out of these surfaces
3632 [ - + ]: 11 : if( split_surfaces ) //make a shell for each and every surface
3633 : : {
3634 [ # # ][ # # ]: 0 : for( size_t k=0; k<list_of_shells.size(); k++ )
3635 : : {
3636 [ # # ][ # # ]: 0 : std::vector<Surface*> shell_surfaces = list_of_shells[k];
3637 : :
3638 [ # # ][ # # ]: 0 : for( size_t i=0; i<shell_surfaces.size(); i++ )
[ # # ][ # # ]
3639 : : {
3640 [ # # ]: 0 : DLIList<Surface*> sheet_body_surfaces;
3641 [ # # ][ # # ]: 0 : sheet_body_surfaces.append( shell_surfaces[i] );
3642 : :
3643 [ # # ][ # # ]: 0 : rv = FacetModifyEngine::instance()->make_facet_shell(sheet_body_surfaces, shell_ptr);
3644 [ # # ][ # # ]: 0 : if ( shell_ptr == NULL || rv != CUBIT_SUCCESS )
3645 : : {
3646 [ # # ][ # # ]: 0 : PRINT_ERROR("Problems building facet based shell entity.\n");
[ # # ][ # # ]
3647 : 0 : rv = CUBIT_FAILURE;
3648 : 0 : goto end_import_facets;
3649 : : }
3650 : :
3651 : : //set the sense
3652 [ # # ]: 0 : facet_shell = CAST_TO( shell_ptr, FacetShell );
3653 [ # # ][ # # ]: 0 : FacetSurface* facet_surf = CAST_TO( sheet_body_surfaces.get(), FacetSurface );
3654 [ # # ]: 0 : facet_surf->set_shell_sense( facet_shell, CUBIT_FORWARD );
3655 : :
3656 [ # # ][ # # ]: 0 : surface_list.append( sheet_body_surfaces.get() );
3657 : :
3658 [ # # ]: 0 : shell_list.clean_out();
3659 [ # # ]: 0 : shell_list.append( shell_ptr );
3660 [ # # ][ # # ]: 0 : rv = FacetModifyEngine::instance()->make_facet_lump(shell_list,lump_ptr);
3661 [ # # ][ # # ]: 0 : if ( lump_ptr == NULL || rv != CUBIT_SUCCESS )
3662 : : {
3663 [ # # ][ # # ]: 0 : PRINT_ERROR("Problems building facet based lump entity.\n");
[ # # ][ # # ]
3664 : 0 : rv = CUBIT_FAILURE;
3665 : 0 : goto end_import_facets;
3666 : : }
3667 : :
3668 [ # # ]: 0 : lump_list.clean_out();
3669 [ # # ]: 0 : lump_list.append(lump_ptr);
3670 [ # # ][ # # ]: 0 : rv = FacetModifyEngine::instance()->make_facet_body(lump_list,bodysm_ptr);
3671 [ # # ][ # # ]: 0 : body_ptr = GeometryQueryTool::instance()->make_Body(bodysm_ptr);
3672 : :
3673 [ # # ][ # # ]: 0 : if ( body_ptr == NULL || rv != CUBIT_SUCCESS )
3674 : : {
3675 [ # # ][ # # ]: 0 : PRINT_ERROR("Problems building facet based body entity.\n");
[ # # ][ # # ]
3676 : 0 : rv = CUBIT_FAILURE;
3677 [ # # ][ # # ]: 0 : goto end_import_facets;
3678 : : }
3679 : 0 : }
3680 : 0 : }
3681 : : }
3682 : : else //make a shell out of all these surfaces
3683 : : {
3684 [ + - ][ + + ]: 22 : for( size_t k=0; k<list_of_shells.size(); k++ )
3685 : : {
3686 [ + - ][ + - ]: 11 : DLIList<Surface*> shell_surfaces( list_of_shells[k] );
3687 : :
3688 : : // make a shell out of these surfaces
3689 [ + - ][ + - ]: 11 : rv = FacetModifyEngine::instance()->make_facet_shell(shell_surfaces, shell_ptr);
3690 [ + - ][ - + ]: 11 : if ( shell_ptr == NULL || rv != CUBIT_SUCCESS )
3691 : : {
3692 [ # # ][ # # ]: 0 : PRINT_ERROR("Problems building facet based shell entity.\n");
[ # # ][ # # ]
3693 : 0 : rv = CUBIT_FAILURE;
3694 : 0 : goto end_import_facets;
3695 : : }
3696 : :
3697 : : //Set the sense for the surfaces (will be cofaces) on this shell.
3698 : : //Assumption: The sense is always forward when creating geom from facets.
3699 : : // (This may not be correct -especially with multiple shells in a body)
3700 : :
3701 [ - + ]: 11 : facet_shell = CAST_TO( shell_ptr, FacetShell );
3702 [ + - ][ + + ]: 77 : for( ii = shell_surfaces.size(); ii > 0; ii-- )
3703 : : {
3704 [ + - ]: 66 : Surface* surf = shell_surfaces.get_and_step();
3705 [ - + ]: 66 : FacetSurface* facet_surf = CAST_TO( surf, FacetSurface );
3706 [ + - ]: 66 : facet_surf->set_shell_sense( facet_shell, CUBIT_FORWARD );
3707 : : }
3708 : :
3709 [ + - ]: 11 : surface_list += shell_surfaces;
3710 [ + - ][ + - ]: 11 : shell_list.append(shell_ptr);
[ + - ]
3711 : 11 : }
3712 : :
3713 : : // make a body out of it
3714 [ + - ][ + - ]: 11 : rv = FacetModifyEngine::instance()->make_facet_lump(shell_list,lump_ptr);
3715 [ + - ][ - + ]: 11 : if ( lump_ptr == NULL || rv != CUBIT_SUCCESS )
3716 : : {
3717 [ # # ][ # # ]: 0 : PRINT_ERROR("Problems building facet based lump entity.\n");
[ # # ][ # # ]
3718 : 0 : rv = CUBIT_FAILURE;
3719 : 0 : goto end_import_facets;
3720 : : }
3721 : :
3722 [ + - ]: 11 : lump_list.append(lump_ptr);
3723 [ + - ][ + - ]: 11 : rv = FacetModifyEngine::instance()->make_facet_body(lump_list,bodysm_ptr);
3724 [ + - ][ + - ]: 11 : body_ptr = GeometryQueryTool::instance()->make_Body(bodysm_ptr);
3725 : :
3726 [ + - ][ - + ]: 11 : if ( body_ptr == NULL || rv != CUBIT_SUCCESS )
3727 : : {
3728 [ # # ][ # # ]: 0 : PRINT_ERROR("Problems building facet based body entity.\n");
[ # # ][ # # ]
3729 : 0 : rv = CUBIT_FAILURE;
3730 : 0 : goto end_import_facets;
3731 : : }
3732 : : }
3733 : :
3734 [ + - ][ - + ]: 11 : if(gti->num_bodies() - prev_bod > 1)
3735 [ # # ][ # # ]: 0 : PRINT_INFO("Bodies successfully created.\n");
[ # # ][ # # ]
3736 : : else
3737 [ + - ][ + - ]: 11 : PRINT_INFO("Body successfully created.\n");
[ + - ][ + - ]
3738 [ + - ][ + - ]: 11 : PRINT_INFO(" Number of new vertices = %d\n", gti->num_ref_vertices() - prev_vert);
[ + - ][ + - ]
[ + - ]
3739 [ + - ][ + - ]: 11 : PRINT_INFO(" Number of new curves = %d\n", gti->num_ref_edges() - prev_edge);
[ + - ][ + - ]
[ + - ]
3740 [ + - ][ + - ]: 11 : PRINT_INFO(" Number of new surfaces = %d\n", gti->num_ref_faces() - prev_face);
[ + - ][ + - ]
[ + - ]
3741 [ + - ][ + - ]: 11 : PRINT_INFO(" Number of new shells = %d\n", shell_facet_list.size());
[ + - ][ + - ]
[ + - ]
3742 [ + - ][ + - ]: 11 : PRINT_INFO(" Number of new volumes = %d\n", gti->num_ref_volumes() - prev_vol);
[ + - ][ + - ]
[ + - ]
3743 [ + - ][ + - ]: 11 : PRINT_INFO(" Number of new bodies = %d\n", gti->num_bodies() - prev_bod);
[ + - ][ + - ]
[ + - ]
3744 : :
3745 [ - + ]: 11 : if (!is_water_tight)
3746 : : {
3747 [ # # ][ # # ]: 0 : PRINT_WARNING("Volume generated does not completely close. 3D meshing (ie. hex/tet) will not be permitted.\n");
[ # # ][ # # ]
3748 [ # # ][ # # ]: 11 : PRINT_INFO("Hint: In some cases the \"stitch\" option on the import command may correct the problem.\n");
[ # # ][ # # ]
[ + - ][ + - ]
3749 : : }
3750 : 11 : } // end while ( stl_multiple_parts == true )
3751 : :
3752 : : end_import_facets:
3753 [ - + ]: 11 : if (conn != NULL)
3754 [ # # ]: 0 : delete [] conn;
3755 [ + - ][ + + ]: 22 : for (ii=0; ii<shell_list.size(); ii++)
3756 [ + - ][ + - ]: 11 : delete shell_facet_list.get_and_step();
[ + - ]
3757 : :
3758 [ + - ]: 11 : quad_facet_list = qfacet_list;
3759 [ + - ]: 11 : tri_facet_list = tfacet_list;
3760 [ + - ]: 11 : return rv;
3761 : : }
3762 : :
3763 : :
3764 : :
3765 : : //===========================================================================
3766 : : //Function Name: read_facets
3767 : : //Member Type: PUBLIC
3768 : : //Description: read facets from facet file
3769 : : //===========================================================================
3770 : 0 : CubitStatus FacetQueryEngine::read_facets( const char * file_name,
3771 : : int *&conn,
3772 : : int &npoints,
3773 : : int &nquad, int &ntri,
3774 : : FacetFileFormat file_format )
3775 : : {
3776 : : // open the file
3777 [ # # ]: 0 : FILE *fp = fopen(file_name, "r");
3778 [ # # ]: 0 : if (fp == NULL)
3779 : : {
3780 [ # # ][ # # ]: 0 : PRINT_ERROR("Could not open file %s for reading\n", file_name);
[ # # ][ # # ]
3781 : 0 : return CUBIT_FAILURE;
3782 : : }
3783 : :
3784 [ # # ][ # # ]: 0 : PRINT_INFO("Reading facets...\n");
[ # # ][ # # ]
3785 : :
3786 : : // read the number of nodes
3787 : :
3788 : : int id;
3789 : 0 : int nfacets = 0;
3790 : 0 : int iline = 1;
3791 : : char line[128];
3792 [ # # ][ # # ]: 0 : if (fgets(line, 128, fp) == NULL)
3793 : : {
3794 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3795 [ # # ]: 0 : fclose( fp );
3796 : 0 : return CUBIT_FAILURE;
3797 : : }
3798 : :
3799 : : int n;
3800 : : char type_header[8];
3801 : 0 : CubitBoolean is_off_file = CUBIT_FALSE;
3802 : 0 : n = sscanf( line, "%s", type_header );
3803 [ # # ][ # # ]: 0 : if( !strcmp( type_header, "OFF" ) ||
3804 : 0 : !strcmp( type_header, "off" ) )
3805 : : {
3806 [ # # ][ # # ]: 0 : PRINT_INFO( "Reading OFF file...\n" );
[ # # ][ # # ]
3807 : 0 : iline++;
3808 [ # # ][ # # ]: 0 : if (fgets(line, 128, fp) == NULL) {
3809 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3810 [ # # ]: 0 : fclose( fp );
3811 : 0 : return CUBIT_FAILURE;
3812 : : }
3813 : 0 : is_off_file = CUBIT_TRUE;
3814 : : }
3815 : :
3816 : 0 : n = sscanf(line, "%d %d", &npoints, &nfacets);
3817 [ # # ]: 0 : if( !is_off_file )
3818 : : {
3819 [ # # ][ # # ]: 0 : if (n < 1 || ( n > 2 && file_format == CUBIT_FACET_FILE ) )
[ # # ]
3820 : : {
3821 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3822 [ # # ]: 0 : fclose( fp );
3823 : 0 : return CUBIT_FAILURE;
3824 : : }
3825 : : }
3826 : :
3827 [ # # ]: 0 : if (npoints <= 0)
3828 : : {
3829 [ # # ][ # # ]: 0 : PRINT_ERROR("Expecting number of nodes in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3830 [ # # ]: 0 : fclose( fp );
3831 : 0 : return CUBIT_FAILURE;
3832 : : }
3833 [ # # ]: 0 : if (n==1)
3834 : : {
3835 : 0 : nfacets = 0;
3836 : : }
3837 [ # # ]: 0 : else if (nfacets <= 0)
3838 : : {
3839 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d reading number of facets\n", file_name, iline);
[ # # ][ # # ]
3840 [ # # ]: 0 : fclose( fp );
3841 : 0 : return CUBIT_FAILURE;
3842 : : }
3843 : :
3844 [ # # ][ # # ]: 0 : if (init_hash_points( npoints ) == CUBIT_FAILURE)
3845 : : {
3846 [ # # ][ # # ]: 0 : PRINT_ERROR("Can't allocate memory for points in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3847 [ # # ]: 0 : fclose( fp );
3848 : 0 : return CUBIT_FAILURE;
3849 : : }
3850 : :
3851 : : // read the nodes
3852 : :
3853 : : int ii;
3854 : : double xx, yy, zz;
3855 : : CubitPoint *new_point;
3856 [ # # ]: 0 : for (ii=0; ii<npoints; ii++)
3857 : : {
3858 : 0 : iline++;
3859 [ # # ][ # # ]: 0 : if (fgets(line, 128, fp)== NULL)
3860 : : {
3861 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3862 [ # # ]: 0 : fclose( fp );
3863 : 0 : return CUBIT_FAILURE;
3864 : : }
3865 [ # # ]: 0 : if( is_off_file )
3866 : : {
3867 : 0 : n = sscanf( line, "%lf %lf %lf", &xx, &yy, &zz );
3868 : 0 : id = ii;
3869 [ # # ]: 0 : if (n != 3)
3870 : : {
3871 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in OFF file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3872 [ # # ][ # # ]: 0 : PRINT_INFO(" Expecting 3 doubles, but instead read %d values\n", n);
[ # # ][ # # ]
3873 [ # # ]: 0 : fclose( fp );
3874 : 0 : return CUBIT_FAILURE;
3875 : : }
3876 : : }
3877 : : else
3878 : : {
3879 : 0 : n = sscanf(line, "%d %lf %lf %lf", &id, &xx, &yy, &zz );
3880 [ # # ]: 0 : if (n != 4)
3881 : : {
3882 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3883 [ # # ][ # # ]: 0 : PRINT_INFO(" Expecting 1 integer and 3 doubles, but instead read %d values\n", n);
[ # # ][ # # ]
3884 [ # # ]: 0 : fclose( fp );
3885 : 0 : return CUBIT_FAILURE;
3886 : : }
3887 : : }
3888 : :
3889 [ # # ][ # # ]: 0 : new_point = (CubitPoint *) new CubitPointData( xx, yy, zz );
3890 [ # # ]: 0 : new_point->set_id( id );
3891 [ # # ]: 0 : add_hash_point( new_point );
3892 : : }
3893 : :
3894 : : // read the number of facets
3895 : :
3896 [ # # ]: 0 : if (nfacets == 0)
3897 : : {
3898 : 0 : iline++;
3899 [ # # ][ # # ]: 0 : if (fgets(line, 128, fp) == NULL)
3900 : : {
3901 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d reading number of facets\n", file_name, iline);
[ # # ][ # # ]
3902 [ # # ]: 0 : fclose( fp );
3903 : 0 : return CUBIT_FAILURE;
3904 : : }
3905 : :
3906 : 0 : n = sscanf(line, "%d", &nfacets);
3907 [ # # ]: 0 : if (n != 1)
3908 : : {
3909 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d reading number of facets\n", file_name, iline);
[ # # ][ # # ]
3910 [ # # ][ # # ]: 0 : PRINT_INFO(" Expecting <num facets>\n");
[ # # ][ # # ]
3911 [ # # ]: 0 : fclose( fp );
3912 : 0 : return CUBIT_FAILURE;
3913 : : }
3914 [ # # ]: 0 : if (nfacets <= 0)
3915 : : {
3916 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d reading number of facets\n", file_name, iline);
[ # # ][ # # ]
3917 [ # # ]: 0 : fclose( fp );
3918 : 0 : return CUBIT_FAILURE;
3919 : : }
3920 : : }
3921 : :
3922 [ # # ][ # # ]: 0 : conn = new int [4*nfacets];
3923 [ # # ]: 0 : if (!conn)
3924 : : {
3925 [ # # ][ # # ]: 0 : PRINT_ERROR("Can't allocate memory for facets in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3926 [ # # ]: 0 : fclose( fp );
3927 : 0 : return CUBIT_FAILURE;
3928 : : }
3929 : 0 : ntri = nquad = 0;
3930 : :
3931 : : // read the facets
3932 : :
3933 [ # # ]: 0 : for (ii=0; ii<nfacets; ii++)
3934 : : {
3935 : 0 : iline++;
3936 [ # # ][ # # ]: 0 : if (fgets(line, 128, fp) == NULL)
3937 : : {
3938 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d\n", file_name, iline);
[ # # ][ # # ]
3939 [ # # ]: 0 : fclose( fp );
3940 : 0 : return CUBIT_FAILURE;
3941 : : }
3942 : :
3943 [ # # ]: 0 : if( AVS_FILE == file_format )
3944 : : {
3945 : : n = sscanf( line, "%d %*d %*s %d %d %d %d", &id, &conn[4*ii],
3946 : 0 : &conn[4*ii+1], &conn[4*ii+2], &conn[4*ii+3] );
3947 : :
3948 [ # # ][ # # ]: 0 : if( n < 4 || n > 5 )
3949 : : {
3950 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in avs file %s on line %d reading facets\n", file_name, iline);
[ # # ][ # # ]
3951 [ # # ][ # # ]: 0 : PRINT_INFO("Expecting 6 or 7 values, but instead read %d values\n", n);
[ # # ][ # # ]
3952 [ # # ]: 0 : fclose( fp );
3953 : 0 : return CUBIT_FAILURE;
3954 : : }
3955 : :
3956 : : //duplicate the point
3957 [ # # ]: 0 : if( n == 4 )
3958 : : {
3959 : 0 : conn[4*ii+3] = conn[4*ii+2];
3960 : 0 : ntri++;
3961 : : }
3962 : : else
3963 : : {
3964 : 0 : nquad++;
3965 : : }
3966 : : }
3967 : : else
3968 : : {
3969 : : // if( is_off_file )
3970 : : // {
3971 : : // n = sscanf( line, "%d %d %d %d", &id, &conn[4*ii], &conn[4*ii+1],
3972 : : // &conn[4*ii+2], &conn[4*ii+3] );
3973 : : // if (n < 4 || n > 5)
3974 : : // {
3975 : : // PRINT_ERROR("Format error in OFF file %s on line %d reading facets\n", file_name, iline);
3976 : : // PRINT_INFO(" Expecting 4 or 5 integers, but instead read %d values\n", n);
3977 : : // PRINT_INFO(" For example: <facet_size> <i0> <i1> <i2> [<i3>]\n");
3978 : : // fclose( fp );
3979 : : // return CUBIT_FAILURE;
3980 : : // }
3981 : :
3982 : : // // for triangles -- duplicate the point
3983 : : // // if( n==3 )
3984 : : // if( id==3 )
3985 : : // {
3986 : : // conn[4*ii+3] = conn[4*ii+2];
3987 : : // ntri++;
3988 : : // }
3989 : : // else
3990 : : // {
3991 : : // nquad++;
3992 : : // }
3993 : : // }
3994 : : // else
3995 : : // {
3996 : 0 : n = sscanf(line, "%d %d %d %d %d", &id, &conn[4*ii], &conn[4*ii+1],
3997 : 0 : &conn[4*ii+2], &conn[4*ii+3] );
3998 : :
3999 [ # # ][ # # ]: 0 : if (n < 4 || n > 5)
4000 : : {
4001 [ # # ][ # # ]: 0 : PRINT_ERROR("Format error in facet file %s on line %d reading facets\n", file_name, iline);
[ # # ][ # # ]
4002 [ # # ][ # # ]: 0 : PRINT_INFO(" Expecting 4 or 5 integers, but instead read %d values\n", n);
[ # # ][ # # ]
4003 [ # # ][ # # ]: 0 : PRINT_INFO(" For example: <id> <i0> <i1> <i2> [<i3>]\n");
[ # # ][ # # ]
4004 [ # # ]: 0 : fclose( fp );
4005 : 0 : return CUBIT_FAILURE;
4006 : : }
4007 : :
4008 : : // for triangles -- duplicate the point
4009 [ # # ]: 0 : if (n==4)
4010 : : {
4011 : 0 : conn[4*ii+3] = conn[4*ii+2];
4012 : 0 : ntri++;
4013 : : }
4014 : : else
4015 : : {
4016 : 0 : nquad++;
4017 : : }
4018 : : // }
4019 : : }
4020 : : }
4021 : :
4022 [ # # ]: 0 : fclose( fp );
4023 : 0 : return CUBIT_SUCCESS;
4024 : : }
4025 : :
4026 : : //===========================================================================
4027 : : // Function: read_cholla_file
4028 : : // Purpose: import the face mesh from the cholla file
4029 : : // Date: 11/28/2002
4030 : : // Author: sjowen
4031 : : //===========================================================================
4032 : 0 : CubitStatus FacetQueryEngine::read_cholla_file( const char *file_name,
4033 : : double &feature_angle,
4034 : : DLIList<CubitPoint *> &point_list,
4035 : : DLIList<CubitFacet *> &facet_list )
4036 : :
4037 : : {
4038 : :
4039 : 0 : double angle = 135.0;
4040 : 0 : int num_tri = 0;
4041 : 0 : int num_quad = 0;
4042 : 0 : int num_edge = 0;
4043 : 0 : int num_vert = 0;
4044 : 0 : int* tri_edge = NULL;
4045 : 0 : int* quad_edge = NULL;
4046 : 0 : int* edge_vert = NULL;
4047 : 0 : double* vert = NULL;
4048 : 0 : double* edge_ctrl_pts = NULL;
4049 : 0 : double* tri_ctrl_pts = NULL;
4050 : 0 : double* quad_ctrl_pts = NULL;
4051 : 0 : int results_included = 0;
4052 : :
4053 : : // importMesh and resolveFaceVectors are in Cholla.h
4054 : :
4055 : : importMesh(file_name, &results_included, &angle, &num_tri, &num_quad, &num_edge,
4056 : : &num_vert, &tri_edge, &quad_edge, &edge_vert, &vert,
4057 [ # # ]: 0 : &edge_ctrl_pts, &tri_ctrl_pts, &quad_ctrl_pts);
4058 : :
4059 : 0 : feature_angle = angle;
4060 : :
4061 : : // create the points
4062 : :
4063 [ # # ][ # # ]: 0 : CubitPoint **point_array = new CubitPoint * [num_vert];
4064 : : double x, y, z;
4065 : : int ii;
4066 : :
4067 [ # # ]: 0 : for (ii=0; ii<num_vert; ii++)
4068 : : {
4069 : 0 : x = vert[ii*3];
4070 : 0 : y = vert[ii*3 + 1];
4071 : 0 : z = vert[ii*3 + 2];
4072 [ # # ][ # # ]: 0 : point_array[ii] = (CubitPoint *) new CubitPointData( x, y, z );
4073 [ # # ]: 0 : point_list.append( point_array[ii] );
4074 : : }
4075 : :
4076 : : // create the edges
4077 : :
4078 [ # # ][ # # ]: 0 : CubitFacetEdge **edge_array = new CubitFacetEdge * [num_edge];
4079 : : int ip, jp;
4080 [ # # ]: 0 : for (ii=0; ii<num_edge; ii++)
4081 : : {
4082 : 0 : ip = edge_vert[ii*2];
4083 : 0 : jp = edge_vert[ii*2 + 1];
4084 [ # # ][ # # ]: 0 : assert(ip < num_vert && jp < num_vert && ip >= 0 && jp >= 0);
[ # # ][ # # ]
4085 : 0 : edge_array[ii] = (CubitFacetEdge *) new CubitFacetEdgeData( point_array[ip],
4086 [ # # ][ # # ]: 0 : point_array[jp] );
4087 : : }
4088 : :
4089 : : // create the tri facets
4090 : :
4091 : : int begin_face;
4092 : : int jj, iedge;
4093 : : CubitFacetEdge *edges[4];
4094 : 0 : CubitFacet *facet_ptr = NULL;
4095 : 0 : CubitQuadFacet *qfacet_ptr = NULL;
4096 [ # # ]: 0 : for (ii=0; ii<num_tri; ii++)
4097 : : {
4098 : 0 : begin_face = 3 * ii;
4099 [ # # ]: 0 : for(jj=0; jj<3; jj++)
4100 : : {
4101 : 0 : iedge = tri_edge[begin_face+jj];
4102 : 0 : edges[jj] = edge_array[iedge];
4103 : : }
4104 : : facet_ptr = (CubitFacet *)
4105 [ # # ][ # # ]: 0 : new CubitFacetData(edges[0], edges[1], edges[2]);
4106 [ # # ]: 0 : facet_list.append(facet_ptr);
4107 : : }
4108 : :
4109 : : // create the quad facets
4110 : :
4111 [ # # ]: 0 : for (ii=0; ii<num_quad; ii++)
4112 : : {
4113 : 0 : begin_face = 4 * ii;
4114 [ # # ]: 0 : for(jj=0; jj<4; jj++)
4115 : : {
4116 : 0 : iedge = quad_edge[begin_face+jj];
4117 : 0 : edges[jj] = edge_array[iedge];
4118 : : }
4119 : : qfacet_ptr = (CubitQuadFacet *)
4120 [ # # ][ # # ]: 0 : new CubitQuadFacetData(edges[0], edges[1], edges[2], edges[3]);
4121 [ # # ][ # # ]: 0 : facet_list.append(qfacet_ptr->get_tri_facet(0));
4122 [ # # ][ # # ]: 0 : facet_list.append(qfacet_ptr->get_tri_facet(1));
4123 : : }
4124 : :
4125 : : // delete the temp arrays
4126 : :
4127 [ # # ]: 0 : delete [] point_array;
4128 [ # # ]: 0 : delete [] edge_array;
4129 [ # # ]: 0 : delete [] tri_edge;
4130 [ # # ]: 0 : delete [] quad_edge;
4131 [ # # ]: 0 : delete [] edge_vert;
4132 [ # # ]: 0 : delete [] vert;
4133 [ # # ]: 0 : delete [] edge_ctrl_pts;
4134 [ # # ]: 0 : delete [] tri_ctrl_pts;
4135 [ # # ]: 0 : delete [] quad_ctrl_pts;
4136 : :
4137 : 0 : return CUBIT_SUCCESS;
4138 : : }
4139 : :
4140 : :
4141 : : //===========================================================================
4142 : : //Function Name: is_close
4143 : : //
4144 : : //Member Type: PRIVATE
4145 : : //Description: determine if one of the facets in the list is within a
4146 : : // certain distance of the point.
4147 : : //===========================================================================
4148 : : CubitBoolean
4149 : 0 : FacetQueryEngine::is_close(CubitVector &this_point,
4150 : : DLIList<CubitFacet *>&facet_list,
4151 : : CubitFacet *&lastFacet,
4152 : : double tol)
4153 : : {
4154 : 0 : CubitBoolean isclose = CUBIT_FALSE;
4155 [ # # ]: 0 : CubitBox bbox;
4156 [ # # ]: 0 : CubitVector close_point;
4157 : : CubitFacet *facet;
4158 : : int ii;
4159 : :
4160 : : // set the first facet to be checked as the last one located
4161 : :
4162 [ # # ]: 0 : if (lastFacet) {
4163 [ # # ][ # # ]: 0 : if (!facet_list.move_to(lastFacet)) {
4164 [ # # ]: 0 : facet_list.reset();
4165 : : }
4166 : : }
4167 : : else {
4168 [ # # ]: 0 : facet_list.reset();
4169 : : }
4170 : :
4171 : 0 : CubitBoolean done = CUBIT_FALSE;
4172 : :
4173 : : // define a bounding box around the point
4174 : :
4175 [ # # ]: 0 : CubitVector ptmin( this_point.x() - tol,
4176 [ # # ]: 0 : this_point.y() - tol,
4177 [ # # ][ # # ]: 0 : this_point.z() - tol );
4178 [ # # ]: 0 : CubitVector ptmax( this_point.x() + tol,
4179 [ # # ]: 0 : this_point.y() + tol,
4180 [ # # ][ # # ]: 0 : this_point.z() + tol );
4181 : :
4182 [ # # ][ # # ]: 0 : for ( ii = facet_list.size(); ii > 0 && !done; ii-- ) {
[ # # ]
4183 [ # # ]: 0 : facet = facet_list.get_and_step();
4184 : :
4185 : : // Try to trivially reject this facet with a bounding box test
4186 : :
4187 [ # # ][ # # ]: 0 : bbox = facet->bounding_box();
4188 [ # # ][ # # ]: 0 : if (ptmax.x() < bbox.minimum().x() ||
[ # # ][ # # ]
[ # # ][ # # ]
[ # # # # ]
4189 [ # # ][ # # ]: 0 : ptmin.x() > bbox.maximum().x()) {
[ # # ][ # # ]
[ # # ]
4190 : 0 : continue;
4191 : : }
4192 [ # # ][ # # ]: 0 : if (ptmax.y() < bbox.minimum().y() ||
[ # # ][ # # ]
[ # # ][ # # ]
[ # # # # ]
4193 [ # # ][ # # ]: 0 : ptmin.y() > bbox.maximum().y()) {
[ # # ][ # # ]
[ # # ]
4194 : 0 : continue;
4195 : : }
4196 [ # # ][ # # ]: 0 : if (ptmax.z() < bbox.minimum().z() ||
[ # # ][ # # ]
[ # # ][ # # ]
[ # # # # ]
4197 [ # # ][ # # ]: 0 : ptmin.z() > bbox.maximum().z()) {
[ # # ][ # # ]
[ # # ]
4198 : 0 : continue;
4199 : : }
4200 : :
4201 : : // Only facets that pass the bounding box test will get past here!
4202 : :
4203 : : // Project point to plane of the facet and determine its area coordinates
4204 : :
4205 [ # # ]: 0 : CubitVector pt_on_plane;
4206 : : double dist_to_plane;
4207 [ # # ]: 0 : FacetEvalTool::project_to_facet_plane( facet, this_point, pt_on_plane, dist_to_plane );
4208 : :
4209 [ # # ]: 0 : CubitVector areacoord;
4210 [ # # ]: 0 : FacetEvalTool::facet_area_coordinate( facet, pt_on_plane, areacoord );
4211 : :
4212 : : // If sign of areacoords are all positive then its inside the triangle
4213 : : // and we are done - go interpolate the point. (use an absolute
4214 : : // tolerance since the coordinates arenormalized)
4215 : :
4216 [ # # ][ # # ]: 0 : if (areacoord.x() > -GEOMETRY_RESABS &&
[ # # ]
4217 [ # # ][ # # ]: 0 : areacoord.y() > -GEOMETRY_RESABS &&
[ # # ]
4218 [ # # ]: 0 : areacoord.z() > -GEOMETRY_RESABS) {
4219 [ # # ]: 0 : FacetEvalTool::eval_facet( facet, areacoord, &close_point, NULL );
4220 : : }
4221 : :
4222 : : // otherwise find the closest vertex or edge to the projected point
4223 : :
4224 [ # # ][ # # ]: 0 : else if (areacoord.x() < GEOMETRY_RESABS) {
4225 [ # # ][ # # ]: 0 : if (areacoord.y() < GEOMETRY_RESABS) {
4226 [ # # ]: 0 : FacetEvalTool::eval_point( facet, 2, close_point );
4227 : : }
4228 [ # # ][ # # ]: 0 : else if(areacoord.z() < GEOMETRY_RESABS) {
4229 [ # # ]: 0 : FacetEvalTool::eval_point( facet, 1, close_point );
4230 : : }
4231 : : else {
4232 [ # # ]: 0 : FacetEvalTool::eval_edge( facet, 1, 2, pt_on_plane, close_point );
4233 : : }
4234 : : }
4235 [ # # ][ # # ]: 0 : else if (areacoord.y() < GEOMETRY_RESABS) {
4236 [ # # ][ # # ]: 0 : if (areacoord.z() < GEOMETRY_RESABS) {
4237 [ # # ]: 0 : FacetEvalTool::eval_point( facet, 0, close_point );
4238 : : }
4239 : : else {
4240 [ # # ]: 0 : FacetEvalTool::eval_edge( facet, 2, 0, pt_on_plane, close_point);
4241 : : }
4242 : : }
4243 : : else {
4244 [ # # ]: 0 : FacetEvalTool::eval_edge( facet, 0, 1, pt_on_plane, close_point );
4245 : : }
4246 : :
4247 : : // keep track of the minimum distance
4248 : :
4249 [ # # ][ # # ]: 0 : double dist = sqrt(FacetEvalToolUtils::sqr(close_point.x() - this_point.x()) +
[ # # ]
4250 [ # # ][ # # ]: 0 : FacetEvalToolUtils::sqr(close_point.y() - this_point.y()) +
[ # # ]
4251 [ # # ][ # # ]: 0 : FacetEvalToolUtils::sqr(close_point.z() - this_point.z()));
[ # # ]
4252 [ # # ]: 0 : if (dist <= tol) {
4253 : 0 : done = CUBIT_TRUE;
4254 : 0 : isclose = CUBIT_TRUE;
4255 : 0 : lastFacet = facet;
4256 : : }
4257 : : }
4258 [ # # ]: 0 : return isclose;
4259 : : }
4260 : :
4261 : :
4262 : :
4263 : :
4264 : : //=============================================================================
4265 : : // Function Name: export_facets
4266 : : // Member Type: PUBLIC
4267 : : // Description: export a list of facets to a facet file for debugging purposes
4268 : : // Author: sjowen
4269 : : // Date: 10/29/01
4270 : : //=============================================================================
4271 : 0 : CubitStatus FacetQueryEngine::export_facets(DLIList<CubitFacet*> &facet_list,
4272 : : char *filename)
4273 : : {
4274 : :
4275 : : // open the file for writing
4276 : :
4277 [ # # ]: 0 : FILE *fp = fopen(filename, "w");
4278 [ # # ]: 0 : if (!fp)
4279 : : {
4280 [ # # ][ # # ]: 0 : PRINT_ERROR("Couldn't open file %s for writing.\n", filename);
[ # # ][ # # ]
4281 : 0 : return CUBIT_FAILURE;
4282 : : }
4283 : :
4284 : : // make list of all points
4285 : :
4286 : : CubitPoint *point_ptr;
4287 : : CubitFacet *facet_ptr;
4288 [ # # ]: 0 : DLIList<CubitPoint*>temp_point_list;
4289 : : int ii, jj;
4290 [ # # ][ # # ]: 0 : for (ii=0; ii<facet_list.size(); ii++)
4291 : : {
4292 [ # # ]: 0 : facet_ptr = facet_list.get_and_step();
4293 [ # # ]: 0 : for(jj=0; jj<3; jj++)
4294 : : {
4295 [ # # ]: 0 : point_ptr = facet_ptr->point(jj);
4296 [ # # ]: 0 : point_ptr->marked(-1);
4297 [ # # ]: 0 : temp_point_list.append(point_ptr);
4298 : : }
4299 : : }
4300 : :
4301 : : // assign ids to points and make list unique
4302 : :
4303 : 0 : int id = 0;
4304 [ # # ][ # # ]: 0 : DLIList<CubitPoint*>point_list;
4305 [ # # ][ # # ]: 0 : for (ii=0; ii<temp_point_list.size(); ii++)
4306 : : {
4307 [ # # ]: 0 : point_ptr = temp_point_list.get_and_step();
4308 [ # # ][ # # ]: 0 : if (point_ptr->marked() == -1)
4309 : : {
4310 [ # # ]: 0 : point_ptr->marked(id++);
4311 [ # # ]: 0 : point_list.append( point_ptr );
4312 : : }
4313 : : }
4314 : :
4315 : : // write the points
4316 : :
4317 [ # # ]: 0 : CubitVector coords;
4318 [ # # ][ # # ]: 0 : fprintf(fp, "%d\n", point_list.size());
4319 [ # # ]: 0 : point_list.reset();
4320 [ # # ][ # # ]: 0 : for(ii=0; ii<point_list.size(); ii++)
4321 : : {
4322 [ # # ]: 0 : point_ptr = point_list.get_and_step();
4323 [ # # ][ # # ]: 0 : coords = point_ptr->coordinates();
4324 [ # # ][ # # ]: 0 : fprintf(fp,"%d %f %f %f\n", ii, coords.x(), coords.y(), coords.z());
[ # # ][ # # ]
4325 : : }
4326 : :
4327 : : // write the facets
4328 : :
4329 : : int indx[3];
4330 [ # # ][ # # ]: 0 : fprintf(fp, "%d\n", facet_list.size());
4331 [ # # ][ # # ]: 0 : for (ii=0; ii<facet_list.size(); ii++)
4332 : : {
4333 [ # # ]: 0 : facet_ptr = facet_list.get_and_step();
4334 [ # # ]: 0 : for (jj=0; jj<3; jj++)
4335 : : {
4336 [ # # ][ # # ]: 0 : indx[jj] = facet_ptr->point(jj)->marked();
4337 : : }
4338 [ # # ]: 0 : fprintf(fp,"%d %d %d %d\n", ii, indx[0], indx[1], indx[2]);
4339 : : }
4340 : :
4341 : : //- unmark the points
4342 : :
4343 [ # # ][ # # ]: 0 : for (ii=0; ii<point_list.size(); ii++)
4344 [ # # ][ # # ]: 0 : point_list.get_and_step()->marked(0);
4345 : :
4346 [ # # ]: 0 : fclose(fp);
4347 [ # # ]: 0 : return CUBIT_SUCCESS;
4348 : : }
4349 : :
4350 : : //=============================================================================
4351 : : //Function: init_hash_point (PRIVATE)
4352 : : //Description: create a hash array of all points. They are hashed based on the
4353 : : // id of the point
4354 : : //Author: sjowen
4355 : : //Date: 4/3/01
4356 : : //=============================================================================
4357 : 0 : CubitStatus FacetQueryEngine::init_hash_points( int num_points )
4358 : : {
4359 : : /* === find the next highest prime number */
4360 : :
4361 : 0 : hashPointSize = num_points / 10;
4362 : : int i;
4363 [ # # ]: 0 : if (hashPointSize < 13) hashPointSize = 13;
4364 : : else
4365 : : {
4366 : 0 : i=2;
4367 [ # # ]: 0 : while (i<hashPointSize*0.5 + 1) {
4368 [ # # ]: 0 : if (hashPointSize % i == 0) {
4369 : 0 : i=2;
4370 : 0 : hashPointSize++;
4371 : : }
4372 : : else {
4373 : 0 : i++;
4374 : : }
4375 : : }
4376 : : }
4377 [ # # ][ # # ]: 0 : hashPointArray = new DLIList<CubitPoint*>[hashPointSize];
[ # # # # ]
4378 : :
4379 [ # # ]: 0 : return CUBIT_SUCCESS;
4380 : : }
4381 : :
4382 : : //=============================================================================
4383 : : //Function: add_hash_point (PRIVATE)
4384 : : //Description: hash the point into the hash table
4385 : : //Author: sjowen
4386 : : //Date: 4/3/02
4387 : : //=============================================================================
4388 : 0 : CubitStatus FacetQueryEngine::add_hash_point( CubitPoint *point_ptr )
4389 : : {
4390 : 0 : int id = point_ptr->id();
4391 : 0 : int key = get_hash_key( id );
4392 : 0 : hashPointArray[key].append( point_ptr );
4393 : 0 : return CUBIT_SUCCESS;
4394 : : }
4395 : :
4396 : : //=============================================================================
4397 : : //Function: get_hash_point (PRIVATE)
4398 : : //Description: retreive the CubitPoint pointer from the id
4399 : : //Author: sjowen
4400 : : //Date: 4/3/02
4401 : : //=============================================================================
4402 : 0 : CubitPoint *FacetQueryEngine::get_hash_point( int id )
4403 : : {
4404 : 0 : int key = get_hash_key( id );
4405 : : int ii;
4406 : 0 : int found = 0;
4407 : : CubitPoint *point_ptr;
4408 [ # # ][ # # ]: 0 : for (ii=0; ii<hashPointArray[key].size() && !found; ii++)
[ # # ]
4409 : : {
4410 : 0 : point_ptr = hashPointArray[key].get_and_step();
4411 [ # # ]: 0 : if (point_ptr->id() == id)
4412 : : {
4413 : 0 : return point_ptr;
4414 : : }
4415 : : }
4416 : 0 : return (CubitPoint*)NULL;
4417 : : }
4418 : :
4419 : : //=============================================================================
4420 : : //Function: delete_hash_points (PRIVATE)
4421 : : //Description: delete the hash points stuff
4422 : : //Author: sjowen
4423 : : //Date: 4/3/02
4424 : : //=============================================================================
4425 : 0 : void FacetQueryEngine::delete_hash_points( )
4426 : : {
4427 [ # # ]: 0 : if (hashPointArray)
4428 [ # # ][ # # ]: 0 : delete [] hashPointArray;
4429 : 0 : hashPointArray = NULL;
4430 : 0 : hashPointSize = 0;
4431 : 0 : }
4432 : :
4433 : : //=============================================================================
4434 : : //Function: get_hash_key (PRIVATE)
4435 : : //Description:
4436 : : //Author: sjowen
4437 : : //Date: 4/3/02
4438 : : //=============================================================================
4439 : 0 : int FacetQueryEngine::get_hash_key( int id )
4440 : : {
4441 : 0 : int key = id % hashPointSize;
4442 : 0 : return key;
4443 : : }
4444 : :
4445 : : //===========================================================================
4446 : : //Function Name: get_all_hash_points
4447 : : //Member Type: PUBLIC
4448 : : //Description: makes a single list from all points in the hash table
4449 : : //===========================================================================
4450 : 0 : CubitStatus FacetQueryEngine::get_all_hash_points(
4451 : : DLIList<CubitPoint *> &point_list ) // return point list
4452 : : {
4453 : 0 : CubitStatus rv = CUBIT_SUCCESS;
4454 : :
4455 : : int ii, jj;
4456 : : CubitPoint *point_ptr;
4457 [ # # ]: 0 : for(jj=0; jj<hashPointSize; jj++)
4458 : : {
4459 [ # # ][ # # ]: 0 : for (ii=0; ii<hashPointArray[jj].size(); ii++)
4460 : : {
4461 [ # # ]: 0 : point_ptr = hashPointArray[jj].get_and_step();
4462 [ # # ]: 0 : point_list.append(point_ptr);
4463 : : }
4464 : : }
4465 : :
4466 : 0 : return rv;
4467 : : }
4468 : :
4469 : : //===========================================================================
4470 : : //Function Name: save_facets
4471 : : //Member Type: PUBLIC
4472 : : //Description: save the facets from the entities to a Cubit file
4473 : : //Author: sjowen
4474 : : //Date: 1/16/2003
4475 : : //===========================================================================
4476 : 55 : CubitStatus FacetQueryEngine::save_facets(
4477 : : FILE *fp, // file we are dumping to
4478 : : DLIList<FacetSurface*> facet_surfaces,
4479 : : DLIList<FacetCurve*> facet_curves,
4480 : : DLIList<FacetPoint*> facet_points ) // save facets from these entities
4481 : : {
4482 : 55 : CubitStatus rv = CUBIT_SUCCESS;
4483 : :
4484 [ + - ]: 55 : DLIList<CubitFacet *> facet_list;
4485 [ + - ][ + - ]: 110 : DLIList<CubitFacetEdge *> edge_list;
4486 [ + - ][ + - ]: 110 : DLIList<CubitPoint *> point_list;
4487 : :
4488 : : // get a unique list of all facets, edges and points
4489 : : rv = gather_facets(facet_surfaces, facet_curves, facet_points,
4490 [ + - ][ + - ]: 55 : facet_list, edge_list, point_list );
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ]
4491 : :
4492 [ - + ]: 55 : if (rv != CUBIT_SUCCESS)
4493 : 0 : return rv;
4494 : :
4495 : : // dump the facet entities the file
4496 : :
4497 [ + - ]: 55 : rv = dump_facets( fp, facet_list, edge_list, point_list );
4498 [ - + ]: 55 : if (rv != CUBIT_SUCCESS)
4499 : 0 : return rv;
4500 : :
4501 : : // dump the CurveFacetEvalTools and FacetEval Tools
4502 [ + - ][ + - ]: 55 : rv = save_eval_tools( fp, facet_surfaces, facet_curves );
[ + - ][ + - ]
[ + - ]
4503 : :
4504 [ + - ]: 110 : return rv;
4505 : : }
4506 : :
4507 : : //===========================================================================
4508 : : //Function Name: save_eval_tools
4509 : : //Member Type: PUBLIC
4510 : : //Description: go through the RefEntities and save the CurveFacetEvalTools
4511 : : // and FacetEvalTools. These are essentially lists of facets
4512 : : // that are owned by the curve or surface
4513 : : //Authors: sjowen & cdernst
4514 : : //Date: 1/21/2003
4515 : : //===========================================================================
4516 : 55 : CubitStatus FacetQueryEngine::save_eval_tools(
4517 : : FILE *fp, // cubit file we are dumping to
4518 : : DLIList<FacetSurface*> facet_surfaces,
4519 : : DLIList<FacetCurve*> facet_curves )
4520 : : {
4521 : :
4522 : : int ii;
4523 : : FacetSurface *fsurf_ptr;
4524 : : FacetCurve *fcurv_ptr;
4525 : :
4526 : : //separate out eval tools and set ids
4527 [ + - ]: 55 : DLIList<CurveFacetEvalTool*> cfe_tools;
4528 [ + - ][ + - ]: 110 : DLIList<FacetEvalTool*> fe_tools;
4529 : 55 : int ft_id = 0;
4530 : 55 : int cft_id = 0;
4531 : :
4532 [ + - ]: 55 : facet_surfaces.reset();
4533 [ + - ][ + + ]: 330 : for (ii=facet_surfaces.size(); ii--; )
4534 : : {
4535 [ + - ]: 275 : fsurf_ptr = facet_surfaces.get_and_step();
4536 [ + - ]: 275 : FacetEvalTool *feval_tool = fsurf_ptr->get_eval_tool();
4537 [ + - ]: 275 : if( feval_tool )
4538 : : {
4539 [ + - ]: 275 : feval_tool->set_output_id( ft_id++ );
4540 [ + - ]: 275 : fe_tools.append( feval_tool );
4541 : : }
4542 : : }
4543 : :
4544 [ + - ]: 55 : facet_curves.reset();
4545 [ + - ][ + + ]: 517 : for (ii=facet_curves.size(); ii--; )
4546 : : {
4547 [ + - ]: 462 : fcurv_ptr = facet_curves.get_and_step();
4548 [ + - ]: 462 : CurveFacetEvalTool *ceval_tool = fcurv_ptr->get_eval_tool();
4549 [ + - ]: 462 : if( ceval_tool )
4550 : : {
4551 [ + - ]: 462 : ceval_tool->set_output_id( cft_id++ );
4552 [ + - ]: 462 : cfe_tools.append( ceval_tool );
4553 : : }
4554 : : }
4555 : :
4556 : : //Write out number of FacetEvalTools
4557 [ + - ]: 55 : int count = fe_tools.size();
4558 [ + - ][ + - ]: 110 : NCubitFile::CIOWrapper cio(fp);
4559 [ + - ]: 55 : cio.Write( reinterpret_cast<UnsignedInt32*>(&count), 1 );
4560 : :
4561 : : //Write out each FacetEvalTool
4562 [ + - ]: 55 : fe_tools.reset();
4563 [ + - ][ + + ]: 330 : for( ii=0; ii<fe_tools.size(); ii++)
4564 : : {
4565 [ + - ]: 275 : FacetEvalTool *feval_tool = fe_tools.get_and_step();
4566 [ + - ]: 275 : feval_tool->save( fp );
4567 : : }
4568 : :
4569 : : //Write out number of CurveFacetEvalTools
4570 [ + - ]: 55 : count = cfe_tools.size();
4571 [ + - ]: 55 : cio.Write( reinterpret_cast<UnsignedInt32*>(&count), 1 );
4572 : :
4573 : : //Write out each CurveFacetEvalTool
4574 [ + - ]: 55 : cfe_tools.reset();
4575 [ + - ][ + + ]: 517 : for( ii=0; ii<cfe_tools.size(); ii++)
4576 : : {
4577 [ + - ]: 462 : CurveFacetEvalTool *ceval_tool = cfe_tools.get_and_step();
4578 [ + - ]: 462 : ceval_tool->save( fp );
4579 : : }
4580 : :
4581 [ + - ]: 55 : return CUBIT_SUCCESS;
4582 : : }
4583 : :
4584 : : //===============================================================================
4585 : : // Function : restore_eval_tools
4586 : : // Member Type: PUBLIC
4587 : : // Description: restore the curve and surface eval tools
4588 : : // Author : sjowen
4589 : : // Date : 1/26/03
4590 : : //===============================================================================
4591 : 11 : CubitStatus FacetQueryEngine::restore_eval_tools(
4592 : : FILE *fp, // CUB file we are currently reading
4593 : : unsigned int endian,
4594 : : int num_facets, // list of facet entities already read from the CUB file
4595 : : int num_edges, // that we will assign to the eval tools. Index into
4596 : : int num_points, // the array is the same as ID
4597 : : CubitFacet **facets,
4598 : : CubitFacetEdge **edges,
4599 : : CubitPoint **points,
4600 : : int &num_cfet,
4601 : : int &num_fet,
4602 : : CurveFacetEvalTool **&cfeval_tools,
4603 : : FacetEvalTool **&feval_tools) // return list of curve and surface tools
4604 : : {
4605 [ + - ]: 11 : NCubitFile::CIOWrapper cio(endian, fp);
4606 : :
4607 : : int ii;
4608 : : FacetEvalTool *fsurf_ptr;
4609 : : CurveFacetEvalTool *fcurv_ptr;
4610 : :
4611 : : // read the number of facet eval tools
4612 : : // we are about to read from the CUB file
4613 [ + - ]: 11 : cio.Read(reinterpret_cast<UnsignedInt32*>(&num_fet), 1);
4614 : :
4615 [ + - ][ + - ]: 11 : feval_tools = new FacetEvalTool *[num_fet];
4616 : :
4617 : : // read all the facet surface eval tools
4618 : :
4619 [ + + ]: 143 : for (ii=0; ii<num_fet; ii++)
4620 : : {
4621 : : /*
4622 : : // read the topo ID from the CUB file. This will be stored as the
4623 : : // FacetEvalTool toolID and serve as the means to associate this
4624 : : // eval tool with it's topology entity
4625 : : UnsignedInt32 surf_id = 0;
4626 : : cio.Read(&surf_id, 1);
4627 : : int topo_id = (int)surf_id; */
4628 : :
4629 : : // read the facet eval tool data and create the tool
4630 [ + - ][ + - ]: 132 : fsurf_ptr = new FacetEvalTool();
4631 : : fsurf_ptr->restore(fp, endian, num_facets,
4632 : : num_edges, num_points,
4633 [ + - ]: 132 : facets, edges, points);
4634 [ - + ]: 132 : if (fsurf_ptr == NULL)
4635 : : {
4636 [ # # ][ # # ]: 0 : PRINT_ERROR("Error restoring mesh-based geometry\n");
[ # # ][ # # ]
4637 : 0 : return CUBIT_FAILURE;
4638 : : }
4639 : 132 : feval_tools[ii] = fsurf_ptr;
4640 : : }
4641 : :
4642 : : // read the number of curves
4643 [ + - ]: 11 : cio.Read(reinterpret_cast<UnsignedInt32*>(&num_cfet), 1);
4644 [ + - ][ + - ]: 11 : cfeval_tools = new CurveFacetEvalTool *[num_cfet];
4645 : :
4646 : : // read all the curve facet eval tools. Same thing as surfaces
4647 : :
4648 [ + + ]: 275 : for (ii=0; ii<num_cfet; ii++)
4649 : : {
4650 : : // read the facet eval tool data and create the tool
4651 [ + - ][ + - ]: 264 : fcurv_ptr = new CurveFacetEvalTool();
4652 : : fcurv_ptr->restore(fp, endian, num_edges, num_points,
4653 [ + - ]: 264 : edges, points, num_fet, feval_tools );
4654 [ - + ]: 264 : if (fcurv_ptr == NULL)
4655 : : {
4656 [ # # ][ # # ]: 0 : PRINT_ERROR("Error restoring mesh-based geometry\n");
[ # # ][ # # ]
4657 : 0 : return CUBIT_FAILURE;
4658 : : }
4659 : :
4660 : 264 : cfeval_tools[ii] = fcurv_ptr;
4661 : : }
4662 : :
4663 [ + - ]: 11 : return CUBIT_SUCCESS;
4664 : : }
4665 : :
4666 : :
4667 : : //===========================================================================
4668 : : //Function Name: dump_facets
4669 : : //Member Type: PUBLIC
4670 : : //Description: dump the facets and associated data to the cubit file
4671 : : //Authors: sjowen & cdernst
4672 : : //Date: 1/16/2003
4673 : : //===========================================================================
4674 : 55 : CubitStatus FacetQueryEngine::dump_facets(
4675 : : FILE *fp, // file we are dumping to
4676 : : DLIList<CubitFacet *> &facet_list, // return unique list of facets
4677 : : DLIList<CubitFacetEdge *> &edge_list, // return unique list of edges
4678 : : DLIList<CubitPoint *> &point_list ) // return unique list of points
4679 : : {
4680 : :
4681 [ + - ]: 55 : NCubitFile::CIOWrapper cio(fp);
4682 : : typedef NCubitFile::UnsignedInt32 UnsignedInt32;
4683 : :
4684 : : // Gather CubitPoint Data
4685 [ + - ]: 55 : int npoints = point_list.size();
4686 : 55 : int nnormals = 0;
4687 [ + - ][ + - ]: 55 : double* uvs_array = new double [npoints * 3];
4688 [ + - ][ + - ]: 55 : double* coord_array = new double [npoints * 3];
4689 : : //double* du_array = new double [npoints * 3];
4690 : : //double* dv_array = new double [npoints * 3];
4691 : 55 : int c_zero_points = 0;
4692 : 55 : int c_zero_int_data_size = 0;
4693 : 55 : int c_zero_double_data_size = 0;
4694 : : int ii;
4695 [ + - ][ + - ]: 110 : DLIList<CubitPoint*> has_td_boundary_point;
4696 [ + - ][ + - ]: 110 : DLIList<CubitPoint*> points_with_normal;
4697 : :
4698 : : TDFacetBoundaryPoint *td_fbp;
4699 : : CubitPoint *cp_ptr;
4700 [ + - ]: 55 : CubitVector coord, *normal;
4701 [ + - ]: 55 : point_list.reset();
4702 [ + - ][ + + ]: 715 : for (ii=0; ii<point_list.size(); ii++)
4703 : : {
4704 [ + - ]: 660 : cp_ptr = point_list.get_and_step();
4705 : :
4706 : : // write out uVal, vVal, sizeVal
4707 [ + - ]: 660 : uvs_array[ii*3] = cp_ptr->u();
4708 [ + - ]: 660 : uvs_array[ii*3+1] = cp_ptr->v();
4709 [ + - ]: 660 : uvs_array[ii*3+2] = cp_ptr->size();
4710 : : // coordinates
4711 [ + - ][ + - ]: 660 : coord = cp_ptr->coordinates();
4712 [ + - ]: 660 : coord_array[ii*3] = coord.x();
4713 [ + - ]: 660 : coord_array[ii*3+1] = coord.y();
4714 [ + - ]: 660 : coord_array[ii*3+2] = coord.z();
4715 : : // surfNormal
4716 [ + - ][ + + ]: 660 : if( cp_ptr->normal_ptr() )
4717 [ + - ]: 88 : points_with_normal.append( cp_ptr );
4718 : :
4719 : : /*
4720 : : // surfU
4721 : : du = cp_ptr->du();
4722 : : du_array[ii*3] = du.x();
4723 : : du_array[ii*3+1] = du.y();
4724 : : du_array[ii*3+2] = du.z();
4725 : : // surfV
4726 : : dv = cp_ptr->dv();
4727 : : dv_array[ii*3] = dv.x();
4728 : : dv_array[ii*3+1] = dv.y();
4729 : : dv_array[ii*3+2] = dv.z(); */
4730 : :
4731 [ + - ][ + + ]: 660 : if ((td_fbp = TDFacetBoundaryPoint::get_facet_boundary_point( cp_ptr ))!= NULL)
4732 : : {
4733 [ + - ]: 484 : has_td_boundary_point.append( cp_ptr );
4734 : 484 : c_zero_points++;
4735 : : td_fbp->get_boundary_point_data_size( c_zero_int_data_size,
4736 [ + - ]: 484 : c_zero_double_data_size );
4737 : : }
4738 : : }
4739 : :
4740 : : // Normals
4741 [ + - ]: 55 : nnormals = points_with_normal.size();
4742 : 55 : double* normal_array = NULL;
4743 : 55 : int* normal_ids = NULL;
4744 [ + - ]: 55 : points_with_normal.reset();
4745 [ + + ]: 55 : if( nnormals > 0 )
4746 : : {
4747 [ + - ][ + - ]: 11 : normal_array = new double [nnormals* 3];
4748 [ + - ][ + - ]: 11 : normal_ids = new int[nnormals];
4749 [ + - ]: 11 : points_with_normal.reset();
4750 [ + + ]: 99 : for( ii=0; ii<nnormals; ii++)
4751 : : {
4752 [ + - ]: 88 : cp_ptr = points_with_normal.get_and_step();
4753 [ + - ]: 88 : normal_ids[ii] = cp_ptr->id();
4754 [ + - ]: 88 : normal = cp_ptr->normal_ptr();
4755 [ + - ]: 88 : normal_array[ii*3] = normal->x();
4756 [ + - ]: 88 : normal_array[ii*3+1] = normal->y();
4757 [ + - ]: 88 : normal_array[ii*3+2] = normal->z();
4758 : : }
4759 : : }
4760 : :
4761 : : // write arrays --CubitPoint
4762 [ + - ]: 55 : cio.Write(reinterpret_cast<UnsignedInt32*>(&npoints), 1);
4763 [ + - ]: 55 : if( npoints > 0 )
4764 : : {
4765 [ + - ]: 55 : cio.Write(coord_array, npoints*3);
4766 [ + - ]: 55 : cio.Write(uvs_array, npoints*3);
4767 : : }
4768 : :
4769 : : // clean up
4770 [ + - ]: 55 : delete [] uvs_array;
4771 [ + - ]: 55 : delete [] coord_array;
4772 : 55 : uvs_array = NULL;
4773 : 55 : coord_array = NULL;
4774 : :
4775 : : // write normals & ids of points to which normals belong
4776 [ + - ]: 55 : cio.Write( reinterpret_cast<UnsignedInt32*>(&nnormals), 1 );
4777 [ + + ]: 55 : if( nnormals > 0 )
4778 : : {
4779 [ + - ]: 11 : cio.Write(normal_array, nnormals*3);
4780 [ + - ]: 11 : cio.Write(reinterpret_cast<UnsignedInt32*>(normal_ids), nnormals);
4781 [ + - ]: 11 : delete [] normal_array;
4782 [ + - ]: 11 : delete [] normal_ids;
4783 : 11 : normal_array = NULL;
4784 : 11 : normal_ids = NULL;
4785 : : }
4786 : :
4787 : : // Gather CubitFacetEdge Data
4788 : : int jj, idx;
4789 [ + - ]: 55 : int nedges = edge_list.size();
4790 : 55 : int nctrl_pts = nedges * NUM_EDGE_CPTS;
4791 : : CubitFacetEdge *edge_ptr;
4792 : : CubitVector *edge_ctrl_pts;
4793 [ + - ][ + - ]: 55 : double* control_points = new double [nctrl_pts * 3];
4794 [ + - ][ + - ]: 55 : UnsignedInt32* edge_vert_array = new UnsignedInt32 [nedges * 2];
4795 [ + + ]: 1353 : for(ii=0; ii<nedges; ii++)
4796 : : {
4797 : : // pointArray[2]
4798 [ + - ]: 1298 : edge_ptr = edge_list.get_and_step();
4799 [ + - ][ + - ]: 1298 : edge_vert_array[ii*2] = edge_ptr->point(0)->id();
4800 [ + - ][ + - ]: 1298 : edge_vert_array[ii*2+1] = edge_ptr->point(1)->id();
4801 [ + - ]: 1298 : edge_ctrl_pts = edge_ptr->control_points();
4802 : :
4803 : : // controlPoints[3]
4804 [ + - ]: 1298 : if (nctrl_pts > 0)
4805 : : {
4806 [ - + ]: 1298 : if (!edge_ctrl_pts)
4807 : : {
4808 : 0 : nctrl_pts = 0;
4809 : 0 : continue;
4810 : : }
4811 [ + + ]: 5192 : for(jj=0; jj<NUM_EDGE_CPTS; jj++)
4812 : : {
4813 : 3894 : idx = (ii*NUM_EDGE_CPTS+jj)*3;
4814 [ + - ]: 3894 : control_points[idx] = edge_ctrl_pts[jj].x();
4815 [ + - ]: 3894 : control_points[idx+1] = edge_ctrl_pts[jj].y();
4816 [ + - ]: 3894 : control_points[idx+2] = edge_ctrl_pts[jj].z();
4817 : : }
4818 : : }
4819 : : }
4820 : :
4821 : : // write arrays --CubitFacetEdge
4822 [ + - ]: 55 : cio.Write(reinterpret_cast<UnsignedInt32*>(&nedges), 1);
4823 [ + - ]: 55 : if( nedges > 0 )
4824 : : {
4825 [ + - ]: 55 : cio.Write(edge_vert_array, nedges*2 );
4826 [ + - ]: 55 : cio.Write(reinterpret_cast<UnsignedInt32*>(&nctrl_pts), 1);
4827 [ + - ]: 55 : if (nctrl_pts > 0)
4828 [ + - ]: 55 : cio.Write(control_points, nctrl_pts*3);
4829 : : }
4830 : :
4831 : : // clean up
4832 [ + - ]: 55 : delete [] edge_vert_array;
4833 [ + - ]: 55 : delete [] control_points;
4834 : 55 : edge_vert_array = NULL;
4835 : 55 : control_points = NULL;
4836 : :
4837 : : // Gather CubitFacet Data
4838 [ + - ]: 55 : int nfacets = facet_list.size();
4839 : 55 : nctrl_pts = nfacets * NUM_TRI_CPTS;
4840 : : CubitFacet *facet_ptr;
4841 : : CubitVector *facet_ctrl_pts;
4842 [ + - ][ + - ]: 55 : control_points = new double [nctrl_pts * 3];
4843 [ + - ][ + - ]: 55 : UnsignedInt32* facet_edge_array = new UnsignedInt32 [nfacets * 3];
4844 [ + - ][ + - ]: 55 : int *int_data = new int[ nfacets * 2 ];
4845 [ + - ]: 55 : facet_list.reset();
4846 [ + + ]: 847 : for (ii=0; ii<nfacets; ii++)
4847 : : {
4848 [ + - ]: 792 : facet_ptr = facet_list.get_and_step();
4849 : :
4850 : : // is Flat and isBackwards
4851 [ + - ]: 792 : int_data[ii*2] = facet_ptr->is_flat();
4852 [ + - ]: 792 : int_data[ii*2+1] = facet_ptr->is_backwards();
4853 : :
4854 : : // edgeArray[3]
4855 [ + - ][ + - ]: 792 : facet_edge_array[ii*3] = facet_ptr->edge(0)->id();
4856 [ + - ][ + - ]: 792 : facet_edge_array[ii*3+1] = facet_ptr->edge(1)->id();
4857 [ + - ][ + - ]: 792 : facet_edge_array[ii*3+2] = facet_ptr->edge(2)->id();
4858 [ + - ]: 792 : facet_ctrl_pts = facet_ptr->control_points();
4859 [ + + ]: 792 : if(nctrl_pts > 0)
4860 : : {
4861 [ + + ]: 176 : if (!facet_ctrl_pts)
4862 : : {
4863 : 44 : nctrl_pts = 0;
4864 : 44 : continue;
4865 : : }
4866 [ + + ]: 924 : for(jj=0; jj<NUM_TRI_CPTS; jj++)
4867 : : {
4868 : 792 : idx = (ii*NUM_TRI_CPTS+jj)*3;
4869 [ + - ]: 792 : control_points[idx] = facet_ctrl_pts[jj].x();
4870 [ + - ]: 792 : control_points[idx+1] = facet_ctrl_pts[jj].y();
4871 [ + - ]: 792 : control_points[idx+2] = facet_ctrl_pts[jj].z();
4872 : : }
4873 : : }
4874 : : }
4875 : :
4876 : : // write arrays --CubitFacet
4877 [ + - ]: 55 : cio.Write(reinterpret_cast<UnsignedInt32*>(&nfacets), 1);
4878 [ + - ]: 55 : if( nfacets > 0 )
4879 : : {
4880 [ + - ]: 55 : cio.Write(facet_edge_array, nfacets*3);
4881 [ + - ]: 55 : cio.Write( reinterpret_cast<UnsignedInt32*>(int_data), nfacets*2 );
4882 [ + - ]: 55 : cio.Write(reinterpret_cast<UnsignedInt32*>(&nctrl_pts), 1);
4883 [ + + ]: 55 : if (nctrl_pts > 0)
4884 [ + - ]: 11 : cio.Write(control_points, nctrl_pts*3);
4885 : : }
4886 : :
4887 : : // clean up
4888 [ + - ]: 55 : delete [] facet_edge_array;
4889 [ + - ]: 55 : delete [] control_points;
4890 [ + - ]: 55 : delete [] int_data;
4891 : 55 : facet_edge_array = NULL;
4892 : 55 : control_points = NULL;
4893 : 55 : int_data = NULL;
4894 : :
4895 : :
4896 : : // At points along the boundary (C0 continuity) there may be
4897 : : // multiple normals. Write this data too. First gether it
4898 : : // into two arrays and then dump.
4899 : :
4900 [ + - ]: 55 : cio.Write(reinterpret_cast<UnsignedInt32*>(&c_zero_points), 1);
4901 [ + + ]: 55 : if (c_zero_points > 0)
4902 : : {
4903 [ + - ][ + - ]: 44 : int *c_zero_int_data = new int [c_zero_int_data_size];
4904 [ + - ][ + - ]: 44 : double *c_zero_double_data = new double [c_zero_double_data_size];
4905 [ + - ]: 44 : point_list.reset();
4906 : 44 : int iidx = 0;
4907 : 44 : int didx = 0;
4908 [ + - ]: 44 : point_list.reset();
4909 [ + - ][ + + ]: 660 : for (ii=0; ii<point_list.size(); ii++)
4910 : : {
4911 [ + - ]: 616 : cp_ptr = point_list.get_and_step();
4912 [ + - ]: 616 : td_fbp = TDFacetBoundaryPoint::get_facet_boundary_point( cp_ptr );
4913 [ + + ]: 616 : if (td_fbp != NULL)
4914 : : {
4915 : : td_fbp->get_boundary_point_data( c_zero_int_data,
4916 : : c_zero_double_data,
4917 [ + - ]: 484 : iidx, didx );
4918 : : }
4919 : : }
4920 : :
4921 : : // dump the int data array
4922 : :
4923 [ + - ]: 44 : cio.Write(reinterpret_cast<UnsignedInt32*>(&c_zero_int_data_size), 1);
4924 : : //convert to UnsignedInt32
4925 [ + - ][ + - ]: 44 : UnsignedInt32 *c_zero_int32_data = new UnsignedInt32 [c_zero_int_data_size];
4926 [ + + ]: 4752 : for (ii=0; ii<c_zero_int_data_size; ii++)
4927 : 4708 : c_zero_int32_data[ii] = (UnsignedInt32)c_zero_int_data[ii];
4928 [ + - ]: 44 : cio.Write(c_zero_int32_data, c_zero_int_data_size);
4929 : :
4930 : : // dump the double array
4931 : :
4932 [ + - ]: 44 : cio.Write(reinterpret_cast<UnsignedInt32*>(&c_zero_double_data_size), 1);
4933 [ + - ]: 44 : cio.Write(c_zero_double_data, c_zero_double_data_size);
4934 : :
4935 : : // clean up
4936 [ + - ]: 44 : delete [] c_zero_int_data;
4937 [ + - ]: 44 : delete [] c_zero_int32_data;
4938 [ + - ]: 44 : delete [] c_zero_double_data;
4939 : : }
4940 : :
4941 [ + - ]: 55 : return CUBIT_SUCCESS;
4942 : : }
4943 : :
4944 : : //===========================================================================
4945 : : //Function Name: gather_facets
4946 : : //Member Type: PUBLIC
4947 : : //Description: get a unique list of facets from the entities
4948 : : //Author: sjowen
4949 : : //Date: 1/16/2003
4950 : : //===========================================================================
4951 : 55 : CubitStatus FacetQueryEngine::gather_facets(
4952 : : DLIList<FacetSurface *> facet_surfaces,
4953 : : DLIList<FacetCurve *> facet_curves,
4954 : : DLIList<FacetPoint *> facet_points,
4955 : : DLIList<CubitFacet *> &facet_list, // return unique list of facets
4956 : : DLIList<CubitFacetEdge *> &edge_list, // return unique list of edges
4957 : : DLIList<CubitPoint *> &point_list) // return unique list of points
4958 : : {
4959 : : int ii, jj, kk;
4960 : : FacetSurface *fsurf_ptr;
4961 : : FacetCurve *fcurv_ptr;
4962 : : FacetPoint *fpoint_ptr;
4963 [ + - ]: 55 : DLIList<CubitFacet *>temp_facets;
4964 [ + - ][ + - ]: 110 : DLIList<CubitPoint *>temp_points;
4965 [ + - ][ + - ]: 110 : DLIList<CubitFacetEdge *>temp_edges;
4966 : :
4967 : : CubitFacet *facet_ptr;
4968 : : CubitFacetEdge *edge_ptr;
4969 : : CubitPoint *cp_ptr;
4970 : :
4971 : : //unmark facets/edges/points on surface
4972 [ + - ][ + + ]: 330 : for(ii=facet_surfaces.size(); ii--;)
4973 : : {
4974 [ + - ]: 275 : fsurf_ptr = facet_surfaces.get_and_step();
4975 [ + - ]: 275 : temp_facets.clean_out();
4976 [ + - ]: 275 : temp_points.clean_out();
4977 [ + - ]: 275 : fsurf_ptr->get_my_facets(temp_facets, temp_points);
4978 [ + - ][ + + ]: 1067 : for(jj=0; jj<temp_facets.size(); jj++)
4979 : : {
4980 [ + - ]: 792 : facet_ptr = temp_facets.get_and_step();
4981 [ + - ]: 792 : facet_ptr->marked( 0 );
4982 [ + + ]: 3168 : for (kk=0; kk<3; kk++)
4983 : : {
4984 [ + - ]: 2376 : edge_ptr = facet_ptr->edge( kk );
4985 [ + - ]: 2376 : edge_ptr->marked( 0 );
4986 : : }
4987 : : }
4988 [ + - ][ + + ]: 1463 : for (jj=0; jj<temp_points.size(); jj++)
4989 : : {
4990 [ + - ]: 1188 : cp_ptr = temp_points.get_and_step();
4991 [ + - ]: 1188 : cp_ptr->marked( 0 );
4992 : : }
4993 : : }
4994 : :
4995 : : //unmark facet-edges/points on curves
4996 [ + - ][ + + ]: 517 : for(ii=facet_curves.size(); ii--; )
4997 : : {
4998 [ + - ]: 462 : fcurv_ptr = facet_curves.get_and_step();
4999 [ + - ]: 462 : temp_edges.clean_out();
5000 [ + - ]: 462 : fcurv_ptr->get_facets( temp_edges );
5001 [ + - ][ + + ]: 1078 : for (jj=0; jj<temp_edges.size(); jj++)
5002 : : {
5003 [ + - ]: 616 : edge_ptr = temp_edges.get_and_step();
5004 [ + - ]: 616 : edge_ptr->marked( 0 );
5005 [ + - ][ + - ]: 616 : edge_ptr->point( 0 )->marked( 0 );
5006 [ + - ][ + - ]: 616 : edge_ptr->point( 1 )->marked( 0 );
5007 : : }
5008 : : }
5009 : :
5010 : : //unmark facet-points on points
5011 [ + - ][ + + ]: 385 : for(ii=facet_points.size(); ii--; )
5012 : : {
5013 [ + - ]: 330 : fpoint_ptr = facet_points.get_and_step();
5014 [ + - ]: 330 : if (fpoint_ptr != NULL)
5015 : : {
5016 [ + - ]: 330 : cp_ptr = fpoint_ptr->get_cubit_point();
5017 [ + - ]: 330 : cp_ptr->marked( 0 );
5018 : : }
5019 : : }
5020 : :
5021 : :
5022 : : // make unique lists
5023 [ + - ][ + + ]: 330 : for(ii=facet_surfaces.size(); ii--;)
5024 : : {
5025 [ + - ]: 275 : fsurf_ptr = facet_surfaces.get_and_step();
5026 [ + - ]: 275 : temp_facets.clean_out();
5027 [ + - ]: 275 : temp_points.clean_out();
5028 [ + - ]: 275 : fsurf_ptr->get_my_facets(temp_facets, temp_points);
5029 [ + - ][ + + ]: 1067 : for(jj=0; jj<temp_facets.size(); jj++)
5030 : : {
5031 [ + - ]: 792 : facet_ptr = temp_facets.get_and_step();
5032 [ + - ][ + - ]: 792 : if (0 == facet_ptr->marked())
5033 : : {
5034 [ + - ]: 792 : facet_ptr->marked( 1 );
5035 [ + - ]: 792 : facet_list.append( facet_ptr );
5036 : : }
5037 [ + + ]: 3168 : for (kk=0; kk<3; kk++)
5038 : : {
5039 [ + - ]: 2376 : edge_ptr = facet_ptr->edge( kk );
5040 [ + - ][ + + ]: 2376 : if (0 == edge_ptr->marked())
5041 : : {
5042 [ + - ]: 1298 : edge_ptr->marked( 1 );
5043 [ + - ]: 1298 : edge_list.append( edge_ptr );
5044 : : }
5045 : : }
5046 : : }
5047 [ + - ][ + + ]: 1463 : for (jj=0; jj<temp_points.size(); jj++)
5048 : : {
5049 [ + - ]: 1188 : cp_ptr = temp_points.get_and_step();
5050 [ + - ][ + + ]: 1188 : if (0 == cp_ptr->marked())
5051 : : {
5052 [ + - ]: 660 : cp_ptr->marked(1);
5053 [ + - ]: 660 : point_list.append( cp_ptr );
5054 : : }
5055 : : }
5056 : : }
5057 : :
5058 [ + - ][ + + ]: 517 : for(ii=facet_curves.size(); ii--;)
5059 : : {
5060 [ + - ]: 462 : fcurv_ptr = facet_curves.get_and_step();
5061 [ + - ]: 462 : temp_edges.clean_out();
5062 [ + - ]: 462 : fcurv_ptr->get_facets( temp_edges );
5063 [ + - ][ + + ]: 1078 : for (jj=0; jj<temp_edges.size(); jj++)
5064 : : {
5065 [ + - ]: 616 : edge_ptr = temp_edges.get_and_step();
5066 [ + - ][ - + ]: 616 : if (0 == edge_ptr->marked())
5067 : : {
5068 [ # # ]: 0 : edge_ptr->marked(1);
5069 [ # # ]: 0 : edge_list.append( edge_ptr );
5070 [ # # ]: 0 : for (kk=0; kk<2; kk++)
5071 : : {
5072 [ # # ]: 0 : cp_ptr = edge_ptr->point( kk );
5073 [ # # ][ # # ]: 0 : if (0 == cp_ptr->marked())
5074 : : {
5075 [ # # ]: 0 : cp_ptr->marked(1);
5076 [ # # ]: 0 : point_list.append(cp_ptr);
5077 : : }
5078 : : }
5079 : : }
5080 : : }
5081 : : }
5082 : :
5083 [ + - ][ + + ]: 385 : for(ii=facet_points.size(); ii--;)
5084 : : {
5085 [ + - ]: 330 : fpoint_ptr = facet_points.get_and_step();
5086 [ + - ]: 330 : cp_ptr = fpoint_ptr->get_cubit_point();
5087 [ + - ][ - + ]: 330 : if (0 == cp_ptr->marked())
5088 : : {
5089 [ # # ]: 0 : cp_ptr->marked( 1 );
5090 [ # # ]: 0 : point_list.append( cp_ptr );
5091 : : }
5092 : : }
5093 : :
5094 : : // set the IDs of the facet entities and clear the marks
5095 [ + - ]: 55 : facet_list.reset();
5096 [ + - ][ + + ]: 847 : for (ii=0; ii<facet_list.size(); ii++)
5097 : : {
5098 [ + - ]: 792 : facet_ptr = facet_list.get_and_step();
5099 [ + - ]: 792 : facet_ptr->set_id(ii);
5100 [ + - ]: 792 : facet_ptr->marked(0);
5101 : : }
5102 [ + - ]: 55 : edge_list.reset();
5103 [ + - ][ + + ]: 1353 : for (ii=0; ii<edge_list.size(); ii++)
5104 : : {
5105 [ + - ]: 1298 : edge_ptr = edge_list.get_and_step();
5106 [ + - ]: 1298 : edge_ptr->set_id(ii);
5107 [ + - ]: 1298 : edge_ptr->marked(0);
5108 : : }
5109 [ + - ][ + + ]: 715 : for (ii=0; ii<point_list.size(); ii++)
5110 : : {
5111 [ + - ]: 660 : cp_ptr = point_list.get_and_step();
5112 [ + - ]: 660 : cp_ptr->set_id(ii);
5113 [ + - ]: 660 : cp_ptr->marked(0);
5114 : : }
5115 : :
5116 [ + - ]: 55 : return CUBIT_SUCCESS;
5117 : : }
5118 : :
5119 : : //=============================================================================
5120 : : //Function: create_super_facet_bounding_box(PUBLIC)
5121 : : //Description: Find the bounding box of a list of BodySMs
5122 : : //Author: jdfowle
5123 : : //Date: 12/15/03
5124 : : //=============================================================================
5125 : 0 : CubitStatus FacetQueryEngine::create_super_facet_bounding_box(
5126 : : DLIList<BodySM*>& body_list,
5127 : : CubitBox& super_box )
5128 : : {
5129 : : BodySM *bodySM;
5130 : : int i;
5131 : 0 : CubitStatus status = CUBIT_SUCCESS;
5132 : :
5133 : 0 : body_list.reset();
5134 [ # # ]: 0 : for ( i = 0; i < body_list.size(); i++ ) {
5135 : 0 : bodySM = body_list.get_and_step();
5136 : 0 : create_facet_bounding_box(bodySM,super_box);
5137 : : }
5138 : :
5139 : 0 : return status;
5140 : : }
5141 : :
5142 : : //=============================================================================
5143 : : //Function: create_facet_bounding_box(PUBLIC)
5144 : : //Description: Find the bounding box of a BodySM
5145 : : //Author: jdfowle
5146 : : //Date: 12/15/03
5147 : : //=============================================================================
5148 : 0 : CubitStatus FacetQueryEngine::create_facet_bounding_box(
5149 : : BodySM* bodySM,
5150 : : CubitBox& bbox )
5151 : : {
5152 : : FacetBody *fbody_ptr;
5153 : : int j;
5154 [ # # ]: 0 : DLIList<FacetSurface*> facet_surf_list;
5155 [ # # ][ # # ]: 0 : DLIList<CubitFacet*> facet_list;
5156 [ # # ][ # # ]: 0 : DLIList<CubitPoint*> point_list;
5157 : : FacetSurface *facet_surface;
5158 [ # # ][ # # ]: 0 : CubitBox surf_bbox, total_box;
[ # # ][ # # ]
5159 : 0 : CubitStatus status = CUBIT_FAILURE;
5160 : :
5161 [ # # ]: 0 : fbody_ptr = dynamic_cast<FacetBody *>(bodySM);
5162 [ # # ]: 0 : fbody_ptr->get_surfaces(facet_surf_list);
5163 [ # # ][ # # ]: 0 : for ( j = 0; j < facet_surf_list.size(); j++ ) {
5164 [ # # ]: 0 : facet_surface = facet_surf_list.get_and_step();
5165 [ # # ]: 0 : facet_list.clean_out();
5166 [ # # ]: 0 : point_list.clean_out();
5167 [ # # ]: 0 : facet_surface->get_my_facets(facet_list,point_list);
5168 [ # # ]: 0 : status = FacetDataUtil::get_bbox_of_points(point_list,surf_bbox);
5169 : :
5170 [ # # ]: 0 : if ( j == 0 )
5171 [ # # ]: 0 : total_box = surf_bbox;
5172 : : else
5173 [ # # ]: 0 : total_box |= surf_bbox;
5174 : : }
5175 [ # # ]: 0 : bbox = total_box;
5176 : :
5177 [ # # ]: 0 : return status;
5178 : : }
5179 : :
5180 : : const char* fqe_xform_err = "Transform not implemented for facet geometry.\n";
5181 : 0 : CubitStatus FacetQueryEngine::restore_transform( BodySM* body )
5182 : : {
5183 [ # # ]: 0 : FacetBody* facetbod = dynamic_cast<FacetBody*>(body);
5184 [ # # ]: 0 : return facetbod ? facetbod->restore( ) : CUBIT_FAILURE;
5185 : : }
5186 : 11 : CubitStatus FacetQueryEngine::translate( BodySM* body, const CubitVector& d )
5187 : : {
5188 [ - + ]: 11 : FacetBody* facetbod = dynamic_cast<FacetBody*>(body);
5189 [ + - ]: 11 : return facetbod ? facetbod->move( d.x(), d.y(), d.z() ) : CUBIT_FAILURE;
5190 : : }
5191 : 0 : CubitStatus FacetQueryEngine::rotate( BodySM* body, const CubitVector& v, double a )
5192 : : {
5193 [ # # ]: 0 : FacetBody* facetbod = dynamic_cast<FacetBody*>(body);
5194 [ # # ]: 0 : return facetbod ? facetbod->rotate( v.x(), v.y(), v.z(), a ) : CUBIT_FAILURE;
5195 : : }
5196 : 0 : CubitStatus FacetQueryEngine::scale( BodySM* body, double factor )
5197 : : {
5198 [ # # ]: 0 : FacetBody* facetbod = dynamic_cast<FacetBody*>(body);
5199 [ # # ]: 0 : return facetbod ? facetbod->scale( factor ) : CUBIT_FAILURE;
5200 : : }
5201 : 0 : CubitStatus FacetQueryEngine::scale( BodySM* body, const CubitVector& f )
5202 : : {
5203 [ # # ]: 0 : FacetBody* facetbod = dynamic_cast<FacetBody*>(body);
5204 [ # # ]: 0 : return facetbod ? facetbod->scale( f.x(), f.y(), f.z() ) : CUBIT_FAILURE;
5205 : : }
5206 : :
5207 : 0 : CubitStatus FacetQueryEngine::translate( GeometryEntity* , const CubitVector& )
5208 : : {
5209 [ # # ][ # # ]: 0 : PRINT_ERROR("%s", fqe_xform_err);
5210 : 0 : return CUBIT_FAILURE;
5211 : : }
5212 : 0 : CubitStatus FacetQueryEngine::rotate( GeometryEntity* , const CubitVector& , double )
5213 : : {
5214 [ # # ][ # # ]: 0 : PRINT_ERROR("%s", fqe_xform_err);
5215 : 0 : return CUBIT_FAILURE;
5216 : : }
5217 : 0 : CubitStatus FacetQueryEngine::scale( GeometryEntity* , double )
5218 : : {
5219 [ # # ][ # # ]: 0 : PRINT_ERROR("%s", fqe_xform_err);
5220 : 0 : return CUBIT_FAILURE;
5221 : : }
5222 : 0 : CubitStatus FacetQueryEngine::scale( GeometryEntity* , const CubitVector& )
5223 : : {
5224 [ # # ][ # # ]: 0 : PRINT_ERROR("%s", fqe_xform_err);
5225 : 0 : return CUBIT_FAILURE;
5226 : : }
5227 : 0 : CubitStatus FacetQueryEngine::reflect( GeometryEntity* , const CubitVector& )
5228 : : {
5229 [ # # ][ # # ]: 0 : PRINT_ERROR("%s", fqe_xform_err);
5230 : 0 : return CUBIT_FAILURE;
5231 : : }
5232 : :
5233 : :
5234 : :
5235 : :
5236 : : //===============================================================================
5237 : : // Function : bodies_overlap
5238 : : // Member Type: PUBLIC
5239 : : // Description: determine if facet-based bodies overlap
5240 : : // Author : John Fowler
5241 : : // Date : 10/02
5242 : : //===============================================================================
5243 : 0 : CubitBoolean FacetQueryEngine::bodies_overlap (BodySM * /*body_ptr_1*/,
5244 : : BodySM * /*body_ptr_2*/ ) const
5245 : : {
5246 [ # # ][ # # ]: 0 : PRINT_ERROR("Currently, Cubit is unable to determine overlap for Facet-based geometry.\n");
5247 : 0 : return CUBIT_FALSE;
5248 : : //The following should work, but due to bug 5599, we are not
5249 : : // using it. Having this code in the default would cause the
5250 : : // GeometryPowerTool to rely on Facetbool, which isn't robust
5251 : : // yet.
5252 : : /*
5253 : : FacetboolInterface *fbint;
5254 : : CubitFacetboolOp op = CUBIT_FB_INTERSECTION;
5255 : : bool keep_old = true;
5256 : : CubitStatus status;
5257 : : BodySM* body_out = 0;
5258 : : bool intersection_found;
5259 : :
5260 : : fbint = new FacetboolInterface;
5261 : : status = fbint->dofacetboolean_2bodies(body_ptr_1,body_ptr_2,body_out,
5262 : : keep_old,intersection_found,op);
5263 : : if ( status == CUBIT_FAILURE ) return CUBIT_FALSE;
5264 : : else return CUBIT_TRUE;
5265 : : */
5266 : : }
5267 : :
5268 : 0 : CubitBoolean FacetQueryEngine::volumes_overlap (Lump * /*lump_ptr_1*/,
5269 : : Lump * /*lump_ptr_2*/ ) const
5270 : : {
5271 [ # # ][ # # ]: 0 : PRINT_ERROR("Currently, Cubit is unable to determine overlap for Facet-based geometry.\n");
5272 : 0 : return CUBIT_FALSE;
5273 : : }
5274 : :
5275 : 0 : CubitStatus FacetQueryEngine::get_point_containment( DLIList<BodySM*> &bodysm_list,
5276 : : DLIList<CubitVector> &point_list,
5277 : : double tolerance,
5278 : : bool allow_pts_in_multiple_bodies,
5279 : : std::vector< std::pair<BodySM*, std::vector<int> > > &bodysm_to_pt_indices )
5280 : : {
5281 : : //convert all the BodySMs into FacetBodies
5282 [ # # ]: 0 : DLIList<FacetBody*> body_list;
5283 [ # # ][ # # ]: 0 : for( int k=bodysm_list.size(); k--; )
5284 : : {
5285 [ # # ]: 0 : BodySM *body_sm = bodysm_list.get_and_step();
5286 [ # # ]: 0 : FacetBody *facet_body = dynamic_cast<FacetBody*>(body_sm);
5287 [ # # ]: 0 : if( !facet_body )
5288 : 0 : return CUBIT_FAILURE;
5289 [ # # ]: 0 : body_list.append( facet_body );
5290 : : }
5291 : :
5292 : : //stuff all the points into the atree
5293 [ # # ][ # # ]: 0 : AbstractTree<ContainmentPoint*> *atree = new RTree<ContainmentPoint*>( tolerance );
5294 : :
5295 [ # # ][ # # ]: 0 : std::vector<ContainmentPoint*> atree_nodes;
5296 [ # # ]: 0 : int num_points = point_list.size();
5297 [ # # ]: 0 : for( int i=0; i<num_points; i++ )
5298 : : {
5299 [ # # ]: 0 : ContainmentPoint *tmp_pt = new ContainmentPoint();
5300 [ # # ]: 0 : tmp_pt->pt_coordinates = &(point_list[i]);
5301 : 0 : tmp_pt->index = i;
5302 [ # # ]: 0 : atree->add( tmp_pt );
5303 [ # # ]: 0 : atree_nodes.push_back( tmp_pt );
5304 : : }
5305 : :
5306 [ # # ]: 0 : int num_bodies = body_list.size();
5307 : :
5308 [ # # ]: 0 : if( num_bodies > 10 )
5309 : : {
5310 : : char message[128];
5311 : 0 : sprintf(message, "Point containment routine: %d points %d volumes.", num_points, num_bodies );
5312 [ # # ][ # # ]: 0 : AppUtil::instance()->progress_tool()->start(0, num_bodies,
5313 [ # # ]: 0 : "Progress", message, TRUE, TRUE );
5314 : : }
5315 : :
5316 : : //for each body
5317 : : //get the points in the bbox of the body
5318 [ # # ][ # # ]: 0 : for( int i=0; i<body_list.size(); i++ )
5319 : : {
5320 [ # # ]: 0 : FacetBody *facet_body = body_list[i];
5321 [ # # ]: 0 : CubitBox cubit_box = facet_body->bounding_box();
5322 : :
5323 [ # # ][ # # ]: 0 : double range_ratio = cubit_box.maximum_range() / cubit_box.minimum_range();
5324 : :
5325 : : //find the points in the bounding box
5326 [ # # ][ # # ]: 0 : DLIList<ContainmentPoint*> close_pts;
[ # # ]
5327 [ # # ]: 0 : atree->find( cubit_box, close_pts );
5328 : :
5329 [ # # ][ # # ]: 0 : std::vector<int> pts_in_body;
[ # # ]
5330 : :
5331 : :
5332 : : //if( 0 ) // old ray-shooting
5333 : : //if( 1 ) // new octree
5334 [ # # ][ # # ]: 0 : if( range_ratio < CUTOFF_BBOX_RANGE_RATIO && (close_pts.size() > CUTOFF_NUM_NODES /*pow( pow(2, CUTOFF_OCTREE_DEPTH), 3) */ ) ) // smart
[ # # ][ # # ]
5335 : :
5336 : : {
5337 : : // build octree
5338 [ # # ][ # # ]: 0 : RefEntity* ref_ent = dynamic_cast<RefEntity*>( facet_body->topology_entity() );
5339 [ # # ]: 0 : DLIList<RefEntity*> ref_entity_list;
5340 [ # # ]: 0 : ref_entity_list.insert( ref_ent );
5341 [ # # ][ # # ]: 0 : CubitOctreeGeneratorVolumes octree_generator( ref_entity_list);
5342 [ # # ]: 0 : octree_generator.generate_full_octree();
5343 : :
5344 [ # # ][ # # ]: 0 : for( int k=0; k<close_pts.size(); k++ )
5345 : : {
5346 : : //ask each point if it is in the body
5347 [ # # ][ # # ]: 0 : CubitVector tmp_vec = *(close_pts[k]->pt_coordinates);
5348 : :
5349 : : CubitPointContainment pt_cont;
5350 [ # # ][ # # ]: 0 : pt_cont = octree_generator.point_containment( tmp_vec, tolerance );
5351 [ # # # # ]: 0 : switch( pt_cont )
5352 : : {
5353 : : case CUBIT_PNT_INSIDE:
5354 [ # # ]: 0 : if( false == allow_pts_in_multiple_bodies )
5355 [ # # ][ # # ]: 0 : atree->remove( close_pts[k] );
5356 [ # # ][ # # ]: 0 : pts_in_body.push_back( close_pts[k]->index );
5357 : : //GfxDebug::draw_point(tmp_vec.x(), tmp_vec.y(), tmp_vec.z(), CUBIT_BLUE_INDEX);
5358 : : //PRINT_INFO(" INSIDE ");
5359 : 0 : break;
5360 : :
5361 : : case CUBIT_PNT_BOUNDARY:
5362 [ # # ]: 0 : pt_cont = facet_body->point_containment( tmp_vec, tolerance );
5363 [ # # ][ # # ]: 0 : if( CUBIT_PNT_INSIDE == pt_cont || CUBIT_PNT_BOUNDARY == pt_cont )
5364 : : {
5365 [ # # ]: 0 : if( false == allow_pts_in_multiple_bodies )
5366 [ # # ][ # # ]: 0 : atree->remove( close_pts[k] );
5367 [ # # ][ # # ]: 0 : pts_in_body.push_back( close_pts[k]->index );
5368 : : }
5369 : : //GfxDebug::draw_point(tmp_vec.x(), tmp_vec.y(), tmp_vec.z(), CUBIT_GREEN_INDEX);
5370 : : //PRINT_INFO(" BOUNDARY ");
5371 : 0 : break;
5372 : :
5373 : : case CUBIT_PNT_OUTSIDE:
5374 : : // do nothing
5375 : : //GfxDebug::draw_point(tmp_vec.x(), tmp_vec.y(), tmp_vec.z(), CUBIT_RED_INDEX);
5376 : : //PRINT_INFO(" OUTSIDE ");
5377 : 0 : break;
5378 : :
5379 : : default:
5380 : 0 : break;
5381 : : }
5382 [ # # ]: 0 : }
5383 : : }
5384 : : else {
5385 [ # # ][ # # ]: 0 : for( int k=0; k<close_pts.size(); k++ )
5386 : : {
5387 : : //ask each point if it is in the body
5388 [ # # ][ # # ]: 0 : CubitVector tmp_vec = *(close_pts[k]->pt_coordinates);
5389 [ # # ]: 0 : CubitPointContainment pt_cont = facet_body->point_containment( tmp_vec, tolerance );
5390 [ # # ][ # # ]: 0 : if( CUBIT_PNT_INSIDE == pt_cont || CUBIT_PNT_BOUNDARY == pt_cont )
5391 : : {
5392 [ # # ]: 0 : if( false == allow_pts_in_multiple_bodies )
5393 [ # # ][ # # ]: 0 : atree->remove( close_pts[k] );
5394 [ # # ][ # # ]: 0 : pts_in_body.push_back( close_pts[k]->index );
5395 : : }
5396 : : }
5397 : : }
5398 : :
5399 [ # # ]: 0 : if( num_bodies > 10 )
5400 [ # # ][ # # ]: 0 : AppUtil::instance()->progress_tool()->step();
[ # # ]
5401 : :
5402 [ # # ][ # # ]: 0 : if(AppUtil::instance()->interrupt())
[ # # ]
5403 : : {
5404 [ # # ]: 0 : if( num_bodies > 10 )
5405 [ # # ][ # # ]: 0 : AppUtil::instance()->progress_tool()->end();
[ # # ]
5406 : :
5407 : : //clean up
5408 [ # # ][ # # ]: 0 : while( atree_nodes.size() )
5409 : : {
5410 [ # # ]: 0 : delete atree_nodes.back();
5411 [ # # ]: 0 : atree_nodes.pop_back();
5412 : : }
5413 [ # # ][ # # ]: 0 : delete atree;
5414 : 0 : return CUBIT_FAILURE;
5415 : : }
5416 : :
5417 [ # # ][ # # ]: 0 : bodysm_to_pt_indices.push_back( std::make_pair( bodysm_list[i], pts_in_body ) );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
5418 : 0 : }
5419 : :
5420 : : //cleanup
5421 [ # # ][ # # ]: 0 : while( atree_nodes.size() )
5422 : : {
5423 [ # # ]: 0 : delete atree_nodes.back();
5424 [ # # ]: 0 : atree_nodes.pop_back();
5425 : : }
5426 [ # # ][ # # ]: 0 : delete atree;
5427 : :
5428 [ # # ]: 0 : if( num_bodies > 10 )
5429 [ # # ][ # # ]: 0 : AppUtil::instance()->progress_tool()->end();
[ # # ]
5430 : :
5431 [ # # ]: 0 : return CUBIT_SUCCESS;
5432 [ + - ][ + - ]: 6540 : }
5433 : :
5434 : :
5435 : : //EOF
|