Branch data Line data Source code
1 : : /*
2 : : * normals.cpp
3 : : *
4 : : * Created on: Oct 30, 2015
5 : : * will take an occ model and compute normals at all vertices, using exact geometry info
6 : : */
7 : :
8 : : #include "iGeom.h"
9 : : #include "iMesh.h"
10 : : #include "iRel.h"
11 : :
12 : : #include "stdio.h"
13 : : #include "stdlib.h"
14 : : #include "string.h"
15 : :
16 : : #include "MBiMesh.hpp"
17 : : #include "moab/Core.hpp"
18 : :
19 : : #define STRINGIFY_( X ) #X
20 : : #define STRINGIFY( X ) STRINGIFY_( X )
21 : : #ifdef MESHDIR
22 : : #ifdef HAVE_OCC
23 : : #define DEFAULT_GEOM STRINGIFY( MESHDIR / irel / cyl2.stp )
24 : : #define DEFAULT_MESH STRINGIFY( MESHDIR / irel / cyl2.h5m )
25 : : #else
26 : : #define DEFAULT_GEOM STRINGIFY( MESHDIR / irel / brick.facet )
27 : : #define DEFAULT_MESH STRINGIFY( MESHDIR / irel / brick.h5m )
28 : : #endif
29 : : #endif
30 : :
31 : : #define CHECK_SIZE_C( type, array, allocated_size, size ) \
32 : : if( NULL == *array || *allocated_size == 0 ) \
33 : : { \
34 : : *array = (type*)malloc( sizeof( type ) * size ); \
35 : : *allocated_size = size; \
36 : : } \
37 : : else if( *allocated_size < size ) \
38 : : { \
39 : : printf( " Array passed in is non-zero but too short.\n" ); \
40 : : }
41 : :
42 : : typedef void* iRel_EntityHandle;
43 : :
44 : 0 : int print_geom_info( iGeom_Instance geom, iBase_EntityHandle gent )
45 : : {
46 : : /* print information about this entity */
47 : : int ent_type;
48 : : int result;
49 : 0 : const char* type_names[] = { "Vertex", "Edge", "Face", "Region" };
50 : :
51 [ # # ]: 0 : iGeom_getEntType( geom, gent, &ent_type, &result );
52 : :
53 [ # # ]: 0 : if( iBase_SUCCESS != result )
54 : : {
55 [ # # ]: 0 : printf( "Trouble getting entity adjacencies or types." );
56 : 0 : return 0;
57 : : }
58 : :
59 [ # # ]: 0 : printf( "%s 0x%lx\n", type_names[ent_type], (unsigned long)gent );
60 : :
61 : 0 : return 1;
62 : : }
63 : :
64 : 0 : int print_mesh_info( iMesh_Instance mesh, iBase_EntityHandle ment )
65 : : {
66 : : /* print information about this entity */
67 : :
68 : : /* get adjacencies first; assume not more than 50 */
69 : 0 : iBase_EntityHandle adj_ents[500], *adj_ents_ptr = adj_ents;
70 : 0 : int ent_types[500], *ent_types_ptr = ent_types;
71 : 0 : int adj_ents_alloc = 500, adj_ents_size, ent_types_size, ent_types_allocated = 500;
72 : : int result;
73 : :
74 : 0 : iBase_TagHandle* ment_tags = NULL;
75 : : int ment_tags_size, ment_tags_alloc;
76 : :
77 : : char** tag_names;
78 : : int i;
79 : :
80 : 0 : const char* type_names[] = { "Vertex", "Edge", "Face", "Region" };
81 : :
82 [ # # ]: 0 : iMesh_getEntAdj( mesh, ment, iBase_ALL_TYPES, &adj_ents_ptr, &adj_ents_alloc, &adj_ents_size, &result );
83 : :
84 [ # # ]: 0 : if( iBase_SUCCESS != result ) return 0;
85 : :
86 : : /* put this ent on the end, then get types */
87 : 0 : adj_ents[adj_ents_size] = ment;
88 : : iMesh_getEntArrType( mesh, adj_ents, adj_ents_size + 1, &ent_types_ptr, &ent_types_allocated, &ent_types_size,
89 [ # # ]: 0 : &result );
90 [ # # ]: 0 : if( iBase_SUCCESS != result )
91 : : {
92 [ # # ]: 0 : printf( "Trouble getting entity adjacencies or types." );
93 : 0 : return 0;
94 : : }
95 : :
96 : : /* get tags on ment */
97 [ # # ]: 0 : iMesh_getAllTags( mesh, ment, &ment_tags, &ment_tags_alloc, &ment_tags_size, &result );
98 : :
99 [ # # ]: 0 : printf( "Trouble getting tags on an entity or their names." );
100 : :
101 : : /* while we're at it, get all the tag names */
102 : :
103 : 0 : tag_names = (char**)malloc( ment_tags_size * sizeof( char* ) );
104 : :
105 [ # # ]: 0 : for( i = 0; i < ment_tags_size; i++ )
106 : : {
107 : 0 : tag_names[i] = (char*)malloc( 120 * sizeof( char ) );
108 [ # # ]: 0 : iMesh_getTagName( mesh, ment_tags[i], tag_names[i], &result, 120 );
109 : : }
110 : :
111 : : /* now print the information */
112 [ # # ]: 0 : printf( "%s %ld:\n", type_names[ent_types[ent_types_size - 1]], (long)ment );
113 [ # # ]: 0 : printf( "Adjacencies:" );
114 [ # # ]: 0 : for( i = 0; i < adj_ents_size; i++ )
115 : : {
116 [ # # ][ # # ]: 0 : if( i > 0 ) printf( ", " );
117 [ # # ]: 0 : printf( "%s %ld", type_names[ent_types[i]], (long)adj_ents[i] );
118 : : }
119 [ # # ]: 0 : printf( "\nTags: \n" );
120 [ # # ]: 0 : for( i = 0; i < ment_tags_size; i++ )
121 : : {
122 : : int tag_type;
123 : :
124 [ # # ]: 0 : printf( "%s ", tag_names[i] );
125 [ # # ]: 0 : iMesh_getTagType( mesh, ment_tags[i], &tag_type, &result );
126 [ # # ]: 0 : if( iBase_SUCCESS != result )
127 [ # # ]: 0 : printf( "(trouble getting type...)\n" );
128 : : else
129 : : {
130 : 0 : char* dum_handle = NULL;
131 : 0 : int dum_handle_alloc = 0, dum_handle_size = 0;
132 : : int int_data;
133 : : double dbl_data;
134 : : iBase_EntityHandle eh_data;
135 : :
136 [ # # # # : 0 : switch( tag_type )
# ]
137 : : {
138 : : case iBase_INTEGER:
139 [ # # ]: 0 : iMesh_getIntData( mesh, ment, ment_tags[i], &int_data, &result );
140 [ # # ]: 0 : printf( "(Int value=%d)", int_data );
141 : 0 : break;
142 : : case iBase_DOUBLE:
143 [ # # ]: 0 : iMesh_getDblData( mesh, ment, ment_tags[i], &dbl_data, &result );
144 [ # # ]: 0 : printf( "(Dbl value=%f)", dbl_data );
145 : 0 : break;
146 : : case iBase_ENTITY_HANDLE:
147 [ # # ]: 0 : iMesh_getEHData( mesh, ment, ment_tags[i], &eh_data, &result );
148 [ # # ]: 0 : printf( "(EH value=%ld)", (long)eh_data );
149 : 0 : break;
150 : : case iBase_BYTES:
151 : 0 : iMesh_getData( mesh, ment, ment_tags[i], (void**)&dum_handle, &dum_handle_alloc, &dum_handle_size,
152 [ # # ]: 0 : &result );
153 [ # # ][ # # ]: 0 : if( NULL != dum_handle && dum_handle_size > 0 ) printf( "(Opaque value=%c)", dum_handle[0] );
[ # # ]
154 : 0 : break;
155 : : }
156 : : }
157 : :
158 [ # # ]: 0 : printf( "\n" );
159 : : }
160 [ # # ]: 0 : printf( "(end tags)\n\n" );
161 : 0 : free( ment_tags );
162 : :
163 : 0 : return 1;
164 : : }
165 : :
166 : : /*!
167 : : @li Load a geom and a mesh file
168 : : */
169 : 1 : int load_geom_mesh( const char* geom_filename, const char* mesh_filename, iGeom_Instance geom, iMesh_Instance mesh )
170 : : {
171 : : /* load a geom */
172 : : int result;
173 [ + - ]: 1 : iGeom_load( geom, geom_filename, 0, &result, strlen( geom_filename ), 0 );
174 [ + - ]: 1 : if( iBase_SUCCESS != result )
175 : : {
176 [ + - ]: 1 : printf( "ERROR : can not load a geometry\n" );
177 : 1 : return 0;
178 : : }
179 : :
180 : : /* load a mesh */
181 [ # # ]: 0 : iMesh_load( mesh, 0, mesh_filename, 0, &result, strlen( mesh_filename ), 0 );
182 [ # # ]: 0 : if( iBase_SUCCESS != result )
183 : : {
184 [ # # ]: 0 : printf( "ERROR : can not load a mesh\n" );
185 : 0 : return 0;
186 : : }
187 : :
188 : 1 : return 1;
189 : : }
190 : :
191 : : /*!
192 : :
193 : : @li Create relation between geom and mesh
194 : : */
195 : 1 : int create_relation( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle* pair )
196 : : {
197 : : int result;
198 : : iBase_Instance iface1, iface2;
199 : : int type1, type2;
200 : : int ent_or_set1, ent_or_set2;
201 : : int status1, status2;
202 : :
203 : : iRel_PairHandle tmp_pair;
204 : 1 : iRel_PairHandle* pair_ptr = &tmp_pair;
205 : 1 : int pairs_alloc = 1, pairs_size;
206 : :
207 : : /* create an relation, entity to set */
208 : : iRel_createPair( assoc, geom, iRel_ENTITY, iRel_IGEOM_IFACE, iRel_ACTIVE, mesh, iRel_SET, iRel_IMESH_IFACE,
209 [ + - ]: 1 : iRel_ACTIVE, pair, &result );
210 [ - + ]: 1 : if( iBase_SUCCESS != result )
211 : : {
212 [ # # ]: 0 : printf( "Couldn't create a new relation.\n" );
213 : 0 : return 0;
214 : : }
215 : :
216 : : iRel_getPairInfo( assoc, *pair, &iface1, &ent_or_set1, &type1, &status1, &iface2, &ent_or_set2, &type2, &status2,
217 [ + - ]: 1 : &result );
218 [ - + ]: 1 : if( iBase_SUCCESS != result )
219 : : {
220 [ # # ]: 0 : printf( "Couldn't retrieve relation info.\n" );
221 : 0 : return 0;
222 : : }
223 [ + - ][ + - ]: 1 : if( iface1 != geom || ent_or_set1 != iRel_ENTITY || type1 != iRel_IGEOM_IFACE || iface2 != mesh ||
[ + - ][ + - ]
[ + - ]
224 [ - + ]: 1 : ent_or_set2 != iRel_SET || type2 != iRel_IMESH_IFACE )
225 : : {
226 [ # # ]: 0 : printf( "Unexpected relation info returned.\n" );
227 : 0 : return 0;
228 : : }
229 : :
230 [ + - ]: 1 : iRel_findPairs( assoc, geom, &pair_ptr, &pairs_alloc, &pairs_size, &result );
231 [ - + ]: 1 : if( iBase_SUCCESS != result )
232 : : {
233 [ # # ]: 0 : printf( "Couldn't find relation pair when querying geom.\n" );
234 : 0 : return 0;
235 : : }
236 [ + - ][ - + ]: 1 : if( pairs_size != 1 || tmp_pair != *pair )
237 : : {
238 [ # # ]: 0 : printf( "Unexpected relation pairs returned when querying geom.\n" );
239 : 0 : return 0;
240 : : }
241 : :
242 [ + - ]: 1 : iRel_findPairs( assoc, mesh, &pair_ptr, &pairs_alloc, &pairs_size, &result );
243 [ - + ]: 1 : if( iBase_SUCCESS != result )
244 : : {
245 [ # # ]: 0 : printf( "Couldn't find relation pair when querying mesh.\n" );
246 : 0 : return 0;
247 : : }
248 [ + - ][ - + ]: 1 : if( pairs_size != 1 || tmp_pair != *pair )
249 : : {
250 [ # # ]: 0 : printf( "Unexpected relation pairs returned when querying mesh.\n" );
251 : 0 : return 0;
252 : : }
253 : :
254 : 1 : return 1;
255 : : }
256 : :
257 : : /*!
258 : : @li Check relation between geom and mesh
259 : : */
260 : 1 : int relate_geom_mesh( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle pair )
261 : : {
262 : : int result;
263 : :
264 : 1 : iBase_EntityHandle* gentities = NULL;
265 : 1 : int gentities_size = 0, gentities_alloc = 0;
266 : :
267 : 1 : iBase_EntitySetHandle* mentity_handles = NULL;
268 : 1 : int mentity_handles_size = 0, mentity_handles_alloc = 0;
269 : :
270 : 1 : const char* dim_tag_name = "GEOM_DIMENSION";
271 : : iBase_TagHandle dim_tag_mesh;
272 : :
273 : : iBase_EntitySetHandle* mentities_vec;
274 : 1 : int mentities_vec_size = 0;
275 : : int i;
276 : :
277 : 1 : iBase_EntitySetHandle* out_mentities = NULL;
278 : 1 : int out_mentities_size = 0, out_mentities_alloc = 0;
279 : :
280 : 1 : iBase_EntitySetHandle* out_mentities2 = NULL;
281 : 1 : int out_mentities2_size = 0, out_mentities2_alloc = 0;
282 : :
283 : 1 : iBase_EntityHandle* out_gentities = NULL;
284 : 1 : int out_gentities_size = 0, out_gentities_alloc = 0;
285 : :
286 : : /* relate geometry entities with coresponding mesh entity sets */
287 [ + - ]: 1 : iGeom_getEntities( geom, NULL, iBase_VERTEX, &gentities, &gentities_alloc, &gentities_size, &result );
288 [ - + ]: 1 : if( iBase_SUCCESS != result )
289 : : {
290 [ # # ]: 0 : printf( "Failed to get gentities by type in relate_geom_mesh.\n" );
291 : 0 : return 0;
292 : : }
293 : :
294 [ + - ]: 1 : iRel_inferEntArrRelations( assoc, pair, gentities, gentities_size, 0, &result );
295 [ - + ]: 1 : if( iBase_SUCCESS != result )
296 : : {
297 [ # # ]: 0 : printf( "Failed to relate geom entities in relate_geom_mesh.\n" );
298 : 0 : return 0;
299 : : }
300 : :
301 : : /* relate coresponding mesh entity sets for geometry entities */
302 : : /* get 1-dimensional mesh entitysets */
303 [ + - ]: 1 : iMesh_getEntSets( mesh, NULL, 1, &mentity_handles, &mentity_handles_alloc, &mentity_handles_size, &result );
304 [ - + ]: 1 : if( iBase_SUCCESS != result )
305 : : {
306 [ # # ]: 0 : printf( "Problem to get all entity sets.\n" );
307 : 0 : return 0;
308 : : }
309 : :
310 : : /* get geom dimension tags for mesh entitysets */
311 [ + - ]: 1 : iMesh_createTag( mesh, dim_tag_name, 1, iBase_INTEGER, &dim_tag_mesh, &result, 15 );
312 [ + - ][ - + ]: 1 : if( iBase_SUCCESS != result && result != iBase_TAG_ALREADY_EXISTS )
313 : : {
314 [ # # ]: 0 : printf( "Couldn't create geom dim tag for mesh entities.\n" );
315 : 0 : return 0;
316 : : }
317 : :
318 : : /* get 1-dimensional mesh entitysets */
319 : 1 : mentities_vec = (iBase_EntitySetHandle*)malloc( mentity_handles_size * sizeof( iBase_EntitySetHandle ) );
320 [ - + ]: 1 : for( i = 0; i < mentity_handles_size; i++ )
321 : : { /* test */
322 : : int dim;
323 [ # # ]: 0 : iMesh_getEntSetIntData( mesh, mentity_handles[i], dim_tag_mesh, &dim, &result );
324 [ # # ]: 0 : if( iBase_SUCCESS != result ) continue;
325 : :
326 [ # # ]: 0 : if( dim == 1 ) mentities_vec[mentities_vec_size++] = mentity_handles[i];
327 : : }
328 : :
329 [ + - ]: 1 : iRel_inferSetArrRelations( assoc, pair, mentities_vec, mentities_vec_size, 1, &result );
330 [ - + ]: 1 : if( iBase_SUCCESS != result )
331 : : {
332 [ # # ]: 0 : printf( "Failed to relate mesh entities in relate_geom_mesh.\n" );
333 : 0 : return 0;
334 : : }
335 : :
336 : : /* relate all geometry and mesh entities */
337 [ + - ]: 1 : iRel_inferAllRelations( assoc, pair, &result );
338 [ - + ]: 1 : if( iBase_SUCCESS != result )
339 : : {
340 [ # # ]: 0 : printf( "Failed to relate all geom and mesh entities in relate_geom_mesh.\n" );
341 : 0 : return 0;
342 : : }
343 : :
344 : : /* reset geom entities list and get all geom entities (prev
345 : : only vertices) */
346 : 1 : free( gentities );
347 : 1 : gentities = NULL;
348 : 1 : gentities_alloc = 0;
349 [ + - ]: 1 : iGeom_getEntities( geom, NULL, iBase_ALL_TYPES, &gentities, &gentities_alloc, &gentities_size, &result );
350 [ - + ]: 1 : if( iBase_SUCCESS != result )
351 : : {
352 [ # # ]: 0 : printf( "Failed to get gentities by type in relate_geom_mesh.\n" );
353 : 0 : return 0;
354 : : }
355 : :
356 : : /* get related mesh entity sets for geometry entities */
357 : : iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities, &out_mentities_alloc,
358 [ + - ]: 1 : &out_mentities_size, &result );
359 [ - + ]: 1 : if( iBase_SUCCESS != result )
360 : : {
361 [ # # ]: 0 : printf( "Failed to get geom entities in relate_geom_mesh.\n" );
362 : 0 : return 0;
363 : : }
364 : :
365 [ - + ]: 1 : if( out_mentities_size != gentities_size )
366 : : {
367 [ # # ]: 0 : printf( "Number of input geom entities and output mesh entity sets should be same\n" );
368 : 0 : return 0;
369 : : }
370 : :
371 : : /* now try deleting this relation */
372 [ + - ]: 1 : iRel_rmvEntArrRelation( assoc, pair, gentities, gentities_size, 0, &result );
373 [ - + ]: 1 : if( iBase_SUCCESS != result )
374 : : {
375 [ # # ]: 0 : printf( "Failed to remove relation in relate_geom_mesh.\n" );
376 : 0 : return 0;
377 : : }
378 : :
379 : : iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities2, &out_mentities2_alloc,
380 [ + - ]: 1 : &out_mentities2_size, &result );
381 [ + - ]: 1 : if( iBase_SUCCESS == result )
382 : : {
383 [ + - ]: 1 : printf( "Shouldn't have gotten mesh sets in relate_geom_mesh.\n" );
384 : 1 : return 0;
385 : : }
386 : :
387 : : /* restore the relation, since we need it later */
388 [ # # ]: 0 : iRel_setEntArrSetArrRelation( assoc, pair, gentities, gentities_size, out_mentities, out_mentities_size, &result );
389 [ # # ]: 0 : if( iBase_SUCCESS != result )
390 : : {
391 [ # # ]: 0 : printf( "Failed to restore relation in relate_geom_mesh.\n" );
392 : 0 : return 0;
393 : : }
394 : :
395 : : /* get related geometry entities for mesh entity sets */
396 : : iRel_getSetArrEntArrRelation( assoc, pair, out_mentities, out_mentities_size, 1, &out_gentities,
397 [ # # ]: 0 : &out_gentities_alloc, &out_gentities_size, &result );
398 [ # # ]: 0 : if( iBase_SUCCESS != result )
399 : : {
400 [ # # ]: 0 : printf( "Failed to get mesh entities in relate_geom_mesh.\n" );
401 : 0 : return 0;
402 : : }
403 : :
404 [ # # ]: 0 : if( out_mentities_size != out_gentities_size )
405 : : {
406 [ # # ]: 0 : printf( "Number of input mesh entity sets and output geom entities should be same\n" );
407 : 0 : return 0;
408 : : }
409 : 0 : free( mentity_handles );
410 : 0 : mentity_handles = NULL;
411 : 0 : free( gentities );
412 : 0 : gentities = NULL;
413 : 0 : free( mentity_handles );
414 : 0 : mentity_handles = NULL;
415 : 0 : free( out_mentities );
416 : 0 : out_mentities = NULL;
417 : 0 : free( mentities_vec );
418 : 0 : mentities_vec = NULL;
419 : 0 : free( out_gentities );
420 : 0 : out_gentities = NULL;
421 : 1 : return 1;
422 : : }
423 : :
424 : : /*!
425 : : @li compute normals onto the given geometry
426 : : */
427 : 1 : int compute_normals( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle pair )
428 : : {
429 : : int result;
430 : : int i;
431 : :
432 : 1 : iBase_EntityHandle* gentities = NULL;
433 : 1 : int gentities_size = 0, gentities_alloc = 0;
434 : :
435 : 1 : iBase_EntitySetHandle* out_mentities = NULL;
436 : 1 : int out_mentities_size, out_mentities_alloc = 0;
437 : :
438 : : /* get all the face geo entities, and find relation to some mesh entity */
439 [ + - ]: 1 : iGeom_getEntities( geom, NULL, iBase_FACE, &gentities, &gentities_alloc, &gentities_size, &result );
440 [ - + ]: 1 : if( iBase_SUCCESS != result )
441 : : {
442 [ # # ]: 0 : printf( "Problem getting all geom entities.\n" );
443 : 0 : return 0;
444 : : }
445 [ - + ]: 1 : for( i = 0; i < gentities_size; i++ )
446 : : {
447 [ # # ]: 0 : print_geom_info( geom, gentities[i] );
448 : : }
449 : :
450 : : iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities, &out_mentities_alloc,
451 [ + - ]: 1 : &out_mentities_size, &result );
452 : : /* might not all be */
453 [ - + ]: 1 : if( iBase_SUCCESS != result )
454 : : {
455 [ # # ]: 0 : printf( "Failed to get mesh entities related to geom entities in compute_normals.\n" );
456 : 0 : return 0;
457 : : }
458 : :
459 : : /* check that they're all non-null */
460 [ - + ]: 1 : if( out_mentities_size != gentities_size )
461 : : {
462 [ # # ]: 0 : printf( "Number of mesh & related geom entities don't match.\n" );
463 : 0 : return 0;
464 : : }
465 : :
466 : : /* check to make sure they're mesh sets; how to do that? */
467 [ - + ]: 1 : for( i = 0; i < out_mentities_size; i++ )
468 : : {
469 : : int is_list;
470 [ # # ]: 0 : iMesh_isList( mesh, (iBase_EntitySetHandle)out_mentities[i], &is_list, &result );
471 [ # # ]: 0 : if( iBase_SUCCESS != result )
472 : : {
473 [ # # ]: 0 : printf( "Entity set returned from classification wasn't valid.\n" );
474 : 0 : return 0;
475 : : }
476 : : }
477 : :
478 : 1 : moab::Interface* mb = reinterpret_cast< MBiMesh* >( mesh )->mbImpl;
479 [ - + ]: 1 : if( !mb ) return 0;
480 : 1 : moab::ErrorCode rval = MB_SUCCESS;
481 : :
482 : : moab::Tag idtag;
483 [ + - ]: 1 : rval = mb->tag_get_handle( "GLOBAL_ID", idtag );
484 [ - + ]: 1 : if( MB_SUCCESS != rval ) return 0;
485 : :
486 [ - + ]: 1 : for( i = 0; i < gentities_size; i++ )
487 : : {
488 : :
489 : 0 : EntityHandle meshSet = (EntityHandle)out_mentities[i];
490 [ # # ]: 0 : Range faces;
491 [ # # ]: 0 : rval = mb->get_entities_by_dimension( meshSet, 2, faces ); // MB_CHK_ERR(rval);
492 : :
493 [ # # ][ # # ]: 0 : Range vertices;
494 [ # # ]: 0 : rval = mb->get_connectivity( faces, vertices );
495 : :
496 [ # # ][ # # ]: 0 : std::vector< double > coords;
497 [ # # ][ # # ]: 0 : coords.resize( vertices.size() * 3 );
498 [ # # ][ # # ]: 0 : rval = mb->get_coords( vertices, &coords[0] );
499 : :
500 : : int id;
501 [ # # ]: 0 : rval = mb->tag_get_data( idtag, &meshSet, 1, &id );
502 [ # # ][ # # ]: 0 : printf( "surface %d has %d faces and %d vertices \n", id, (int)faces.size(), (int)vertices.size() );
[ # # ]
503 : :
504 [ # # ][ # # ]: 0 : std::vector< double > normals;
505 [ # # ][ # # ]: 0 : normals.resize( 3 * vertices.size() );
506 : :
507 [ # # ][ # # ]: 0 : std::vector< double > on_coordinates;
508 [ # # ][ # # ]: 0 : on_coordinates.resize( 3 * vertices.size() );
509 : :
510 [ # # ][ # # ]: 0 : for( int j = 0; j < (int)vertices.size(); j++ )
[ # # ]
511 : : {
512 [ # # ][ # # ]: 0 : iGeom_getEntNrmlXYZ( geom, gentities[i], coords[3 * j], coords[3 * j + 1], coords[3 * j + 2],
[ # # ]
513 [ # # ][ # # ]: 0 : &normals[3 * j], &normals[3 * j + 1], &normals[3 * j + 2], &result );
[ # # ][ # # ]
514 [ # # ]: 0 : if( iBase_SUCCESS != result )
515 : : {
516 [ # # ]: 0 : printf( "Problem getting normals.\n" );
517 : 0 : return 0;
518 : : }
519 [ # # ]: 0 : EntityHandle vertex = vertices[j];
520 [ # # ]: 0 : rval = mb->tag_get_data( idtag, &vertex, 1, &id );
521 [ # # ]: 0 : printf( "v: %4d coor: %12.6f %12.6f %12.6f norm: %12.6f %12.6f %12.6f \n", id, coords[3 * j],
522 [ # # ][ # # ]: 0 : coords[3 * j + 1], coords[3 * j + 2], normals[3 * j], normals[3 * j + 1], normals[3 * j + 2] );
[ # # ][ # # ]
[ # # ][ # # ]
523 : : ;
524 : : }
525 : 0 : }
526 : :
527 : 1 : free( gentities );
528 : 1 : gentities = NULL;
529 : 1 : free( out_mentities );
530 : 1 : out_mentities = NULL;
531 : : /* ok, we're done */
532 : 1 : return 1;
533 : : }
534 : :
535 : 1 : int main( int argc, char* argv[] )
536 : : {
537 : : /* Check command line arg */
538 : 1 : const char* geom_filename = DEFAULT_GEOM;
539 : 1 : const char* mesh_filename = DEFAULT_MESH;
540 : :
541 : : int result;
542 : :
543 : : iGeom_Instance geom;
544 : : iMesh_Instance mesh;
545 : : iRel_Instance assoc;
546 : : iRel_PairHandle pair;
547 : :
548 [ + - ]: 1 : printf( "Usage: %s %s\n", geom_filename, mesh_filename );
549 : :
550 [ - + ][ # # ]: 1 : if( argc == 2 && !strcmp( argv[1], "-h" ) )
551 : : {
552 [ # # ]: 0 : printf( "Usage: %s <geom_filename> <mesh_filename>\n", argv[0] );
553 : 0 : return 1;
554 : : }
555 [ - + ]: 1 : else if( argc == 2 )
556 : : {
557 : 0 : geom_filename = argv[1];
558 : 0 : mesh_filename = argv[1];
559 : : }
560 [ - + ]: 1 : else if( argc == 3 )
561 : : {
562 : 0 : geom_filename = argv[1];
563 : 0 : mesh_filename = argv[2];
564 : : }
565 : :
566 : : /* initialize the Geometry */
567 [ + - ]: 1 : iGeom_newGeom( 0, &geom, &result, 0 );
568 : :
569 : : /* initialize the Mesh */
570 [ + - ]: 1 : iMesh_newMesh( 0, &mesh, &result, 0 );
571 : :
572 : : /* initialize the Associate */
573 [ + - ]: 1 : iRel_create( 0, &assoc, &result, 0 );
574 : :
575 [ + - ]: 1 : printf( " load_geom_mesh: \n" );
576 [ + - ]: 1 : result = load_geom_mesh( geom_filename, mesh_filename, geom, mesh );
577 : :
578 [ + - ]: 1 : printf( " create_relation: \n" );
579 [ + - ]: 1 : result = create_relation( assoc, geom, mesh, &pair );
580 : :
581 [ + - ]: 1 : printf( " relate_geom_mesh: \n" );
582 [ + - ]: 1 : result = relate_geom_mesh( assoc, geom, mesh, pair );
583 : :
584 : : /* compute normals */
585 [ + - ]: 1 : printf( " compute normals: \n" );
586 [ + - ]: 1 : result = compute_normals( assoc, geom, mesh, pair );
587 : :
588 : : /* summary */
589 : :
590 [ + - ]: 1 : iRel_destroy( assoc, &result );
591 [ + - ]: 1 : iMesh_dtor( mesh, &result );
592 [ + - ]: 1 : iGeom_dtor( geom, &result );
593 : :
594 : 1 : return 0;
595 [ + - ][ + - ]: 4 : }
|