![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "iGeom.h"
00002 #include "iMesh.h"
00003 #include "iRel.h"
00004
00005 #include
00006 #include
00007 #include
00008
00009 // clang-format off
00010
00011 #define STRINGIFY_( X ) #X
00012 #define STRINGIFY( X ) STRINGIFY_( X )
00013 #ifdef MESHDIR
00014 #ifdef HAVE_OCC
00015 #define DEFAULT_GEOM STRINGIFY( MESHDIR/irel/brick.stp )
00016 #define DEFAULT_MESH STRINGIFY( MESHDIR/irel/brick.h5m )
00017 #else
00018 #define DEFAULT_GEOM STRINGIFY( MESHDIR/irel/brick.facet )
00019 #define DEFAULT_MESH STRINGIFY( MESHDIR/irel/brick.h5m )
00020 #endif
00021 #else
00022 #error Specify MESHDIR to compile test
00023 #endif
00024
00025 #define CHECK_SIZE_C( type, array, allocated_size, size ) \
00026 if( NULL == *(array) || *(allocated_size) == 0 ) \
00027 { \
00028 *(array) = (type*)malloc( sizeof( type ) * (size) ); \
00029 *(allocated_size) = size; \
00030 } \
00031 else if( *(allocated_size) < (size) ) \
00032 { \
00033 printf( " Array passed in is non-zero but too short.\n" ); \
00034 }
00035
00036 // clang-format on
00037
00038 typedef void* iRel_EntityHandle;
00039
00040 /*!
00041 prints out a result string based on the value of error_code
00042 */
00043 void handle_error_code( const int result, int* number_failed, int* /*number_not_implemented*/, int* number_successful )
00044 {
00045 if( result )
00046 {
00047 printf( "Success" );
00048 ( *number_successful )++;
00049 }
00050 else
00051 {
00052 printf( "Failure" );
00053 ( *number_failed )++;
00054 }
00055 }
00056
00057 int print_geom_info( iGeom_Instance geom, iBase_EntityHandle gent )
00058 {
00059 /* print information about this entity */
00060 int ent_type;
00061 int result;
00062 const char* type_names[] = { "Vertex", "Edge", "Face", "Region" };
00063
00064 iGeom_getEntType( geom, gent, &ent_type, &result );
00065
00066 if( iBase_SUCCESS != result )
00067 {
00068 printf( "Trouble getting entity adjacencies or types." );
00069 return 0;
00070 }
00071
00072 printf( "%s 0x%lx\n", type_names[ent_type], (unsigned long)gent );
00073
00074 return 1;
00075 }
00076
00077 int print_mesh_info( iMesh_Instance mesh, iBase_EntityHandle ment )
00078 {
00079 /* print information about this entity */
00080
00081 /* get adjacencies first; assume not more than 50 */
00082 iBase_EntityHandle adj_ents[50], *adj_ents_ptr = adj_ents;
00083 int ent_types[50], *ent_types_ptr = ent_types;
00084 int adj_ents_alloc = 50, adj_ents_size, ent_types_size, ent_types_allocated = 50;
00085 int result;
00086
00087 iBase_TagHandle* ment_tags = NULL;
00088 int ment_tags_size, ment_tags_alloc;
00089
00090 char** tag_names;
00091 int i;
00092
00093 const char* type_names[] = { "Vertex", "Edge", "Face", "Region" };
00094
00095 iMesh_getEntAdj( mesh, ment, iBase_ALL_TYPES, &adj_ents_ptr, &adj_ents_alloc, &adj_ents_size, &result );
00096
00097 if( iBase_SUCCESS != result ) return 0;
00098
00099 /* put this ent on the end, then get types */
00100 adj_ents[adj_ents_size] = ment;
00101 iMesh_getEntArrType( mesh, adj_ents, adj_ents_size + 1, &ent_types_ptr, &ent_types_allocated, &ent_types_size,
00102 &result );
00103 if( iBase_SUCCESS != result )
00104 {
00105 printf( "Trouble getting entity adjacencies or types." );
00106 return 0;
00107 }
00108
00109 /* get tags on ment */
00110 iMesh_getAllTags( mesh, ment, &ment_tags, &ment_tags_alloc, &ment_tags_size, &result );
00111
00112 printf( "Trouble getting tags on an entity or their names." );
00113
00114 /* while we're at it, get all the tag names */
00115
00116 tag_names = (char**)malloc( ment_tags_size * sizeof( char* ) );
00117
00118 for( i = 0; i < ment_tags_size; i++ )
00119 {
00120 tag_names[i] = (char*)malloc( 120 * sizeof( char ) );
00121 iMesh_getTagName( mesh, ment_tags[i], tag_names[i], &result, 120 );
00122 }
00123
00124 /* now print the information */
00125 printf( "%s %ld:\n", type_names[ent_types[ent_types_size - 1]], (long)ment );
00126 printf( "Adjacencies:" );
00127 for( i = 0; i < adj_ents_size; i++ )
00128 {
00129 if( i > 0 ) printf( ", " );
00130 printf( "%s %ld", type_names[ent_types[i]], (long)adj_ents[i] );
00131 }
00132 printf( "\nTags: \n" );
00133 for( i = 0; i < ment_tags_size; i++ )
00134 {
00135 int tag_type;
00136
00137 printf( "%s ", tag_names[i] );
00138 iMesh_getTagType( mesh, ment_tags[i], &tag_type, &result );
00139 if( iBase_SUCCESS != result )
00140 printf( "(trouble getting type...)\n" );
00141 else
00142 {
00143 char* dum_handle = NULL;
00144 int dum_handle_alloc = 0, dum_handle_size = 0;
00145 int int_data;
00146 double dbl_data;
00147 iBase_EntityHandle eh_data;
00148
00149 switch( tag_type )
00150 {
00151 case iBase_INTEGER:
00152 iMesh_getIntData( mesh, ment, ment_tags[i], &int_data, &result );
00153 printf( "(Int value=%d)", int_data );
00154 break;
00155 case iBase_DOUBLE:
00156 iMesh_getDblData( mesh, ment, ment_tags[i], &dbl_data, &result );
00157 printf( "(Dbl value=%f)", dbl_data );
00158 break;
00159 case iBase_ENTITY_HANDLE:
00160 iMesh_getEHData( mesh, ment, ment_tags[i], &eh_data, &result );
00161 printf( "(EH value=%ld)", (long)eh_data );
00162 break;
00163 case iBase_BYTES:
00164 iMesh_getData( mesh, ment, ment_tags[i], (void**)&dum_handle, &dum_handle_alloc, &dum_handle_size,
00165 &result );
00166 if( NULL != dum_handle && dum_handle_size > 0 ) printf( "(Opaque value=%c)", dum_handle[0] );
00167 break;
00168 }
00169 }
00170
00171 printf( "\n" );
00172 }
00173 printf( "(end tags)\n\n" );
00174 free( ment_tags );
00175
00176 return 1;
00177 }
00178
00179 /*!
00180 @test
00181 Load Mesh
00182 @li Load a geom and a mesh file
00183 */
00184 int load_geom_mesh_test( const char* geom_filename,
00185 const char* mesh_filename,
00186 iGeom_Instance geom,
00187 iMesh_Instance mesh )
00188 {
00189 /* load a geom */
00190 int result;
00191 iGeom_load( geom, geom_filename, 0, &result, strlen( geom_filename ), 0 );
00192 if( iBase_SUCCESS != result )
00193 {
00194 printf( "ERROR : can not load a geometry\n" );
00195 return 0;
00196 }
00197
00198 /* load a mesh */
00199 iMesh_load( mesh, 0, mesh_filename, 0, &result, strlen( mesh_filename ), 0 );
00200 if( iBase_SUCCESS != result )
00201 {
00202 printf( "ERROR : can not load a mesh\n" );
00203 return 0;
00204 }
00205
00206 return 1;
00207 }
00208
00209 /*!
00210 @test
00211 TSTTLasso create relation Test
00212 @li Create relation between geom and mesh
00213 */
00214 int create_relation_test( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle* pair )
00215 {
00216 int result;
00217 iBase_Instance iface1, iface2;
00218 int type1, type2;
00219 int ent_or_set1, ent_or_set2;
00220 int status1, status2;
00221
00222 iRel_PairHandle tmp_pair;
00223 iRel_PairHandle* pair_ptr = &tmp_pair;
00224 int pairs_alloc = 1, pairs_size;
00225
00226 /* create an relation, entity to set */
00227 iRel_createPair( assoc, geom, iRel_ENTITY, iRel_IGEOM_IFACE, iRel_ACTIVE, mesh, iRel_SET, iRel_IMESH_IFACE,
00228 iRel_ACTIVE, pair, &result );
00229 if( iBase_SUCCESS != result )
00230 {
00231 printf( "Couldn't create a new relation.\n" );
00232 return 0;
00233 }
00234
00235 iRel_getPairInfo( assoc, *pair, &iface1, &ent_or_set1, &type1, &status1, &iface2, &ent_or_set2, &type2, &status2,
00236 &result );
00237 if( iBase_SUCCESS != result )
00238 {
00239 printf( "Couldn't retrieve relation info.\n" );
00240 return 0;
00241 }
00242 if( iface1 != geom || ent_or_set1 != iRel_ENTITY || type1 != iRel_IGEOM_IFACE || iface2 != mesh ||
00243 ent_or_set2 != iRel_SET || type2 != iRel_IMESH_IFACE )
00244 {
00245 printf( "Unexpected relation info returned.\n" );
00246 return 0;
00247 }
00248
00249 iRel_findPairs( assoc, geom, &pair_ptr, &pairs_alloc, &pairs_size, &result );
00250 if( iBase_SUCCESS != result )
00251 {
00252 printf( "Couldn't find relation pair when querying geom.\n" );
00253 return 0;
00254 }
00255 if( pairs_size != 1 || tmp_pair != *pair )
00256 {
00257 printf( "Unexpected relation pairs returned when querying geom.\n" );
00258 return 0;
00259 }
00260
00261 iRel_findPairs( assoc, mesh, &pair_ptr, &pairs_alloc, &pairs_size, &result );
00262 if( iBase_SUCCESS != result )
00263 {
00264 printf( "Couldn't find relation pair when querying mesh.\n" );
00265 return 0;
00266 }
00267 if( pairs_size != 1 || tmp_pair != *pair )
00268 {
00269 printf( "Unexpected relation pairs returned when querying mesh.\n" );
00270 return 0;
00271 }
00272
00273 return 1;
00274 }
00275
00276 /*!
00277 @test
00278 TSTTLasso relate geom and mesh Test
00279 @li Check relation between geom and mesh
00280 */
00281 int relate_geom_mesh_test( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle pair )
00282 {
00283 int result;
00284
00285 iBase_EntityHandle* gentities = NULL;
00286 int gentities_size = 0, gentities_alloc = 0;
00287
00288 iBase_EntitySetHandle* mentity_handles = NULL;
00289 int mentity_handles_size = 0, mentity_handles_alloc = 0;
00290
00291 const char* dim_tag_name = "GEOM_DIMENSION";
00292 iBase_TagHandle dim_tag_mesh;
00293
00294 iBase_EntitySetHandle* mentities_vec;
00295 int mentities_vec_size = 0;
00296 int i;
00297
00298 iBase_EntitySetHandle* out_mentities = NULL;
00299 int out_mentities_size = 0, out_mentities_alloc = 0;
00300
00301 iBase_EntitySetHandle* out_mentities2 = NULL;
00302 int out_mentities2_size = 0, out_mentities2_alloc = 0;
00303
00304 iBase_EntityHandle* out_gentities = NULL;
00305 int out_gentities_size = 0, out_gentities_alloc = 0;
00306
00307 /* relate geometry entities with coresponding mesh entity sets */
00308 iGeom_getEntities( geom, NULL, iBase_VERTEX, &gentities, &gentities_alloc, &gentities_size, &result );
00309 if( iBase_SUCCESS != result )
00310 {
00311 printf( "Failed to get gentities by type in relate_geom_mesh_test.\n" );
00312 return 0;
00313 }
00314
00315 iRel_inferEntArrRelations( assoc, pair, gentities, gentities_size, 0, &result );
00316 if( iBase_SUCCESS != result )
00317 {
00318 printf( "Failed to relate geom entities in relate_geom_mesh_test.\n" );
00319 return 0;
00320 }
00321
00322 /* relate coresponding mesh entity sets for geometry entities */
00323 /* get 1-dimensional mesh entitysets */
00324 iMesh_getEntSets( mesh, NULL, 1, &mentity_handles, &mentity_handles_alloc, &mentity_handles_size, &result );
00325 if( iBase_SUCCESS != result )
00326 {
00327 printf( "Problem to get all entity sets.\n" );
00328 return 0;
00329 }
00330
00331 /* get geom dimension tags for mesh entitysets */
00332 iMesh_createTag( mesh, dim_tag_name, 1, iBase_INTEGER, &dim_tag_mesh, &result, 15 );
00333 if( iBase_SUCCESS != result && result != iBase_TAG_ALREADY_EXISTS )
00334 {
00335 printf( "Couldn't create geom dim tag for mesh entities.\n" );
00336 return 0;
00337 }
00338
00339 /* get 1-dimensional mesh entitysets */
00340 mentities_vec = (iBase_EntitySetHandle*)malloc( mentity_handles_size * sizeof( iBase_EntitySetHandle ) );
00341 for( i = 0; i < mentity_handles_size; i++ )
00342 { /* test */
00343 int dim;
00344 iMesh_getEntSetIntData( mesh, mentity_handles[i], dim_tag_mesh, &dim, &result );
00345 if( iBase_SUCCESS != result ) continue;
00346
00347 if( dim == 1 ) mentities_vec[mentities_vec_size++] = mentity_handles[i];
00348 }
00349
00350 iRel_inferSetArrRelations( assoc, pair, mentities_vec, mentities_vec_size, 1, &result );
00351 if( iBase_SUCCESS != result )
00352 {
00353 printf( "Failed to relate mesh entities in relate_geom_mesh_test.\n" );
00354 return 0;
00355 }
00356
00357 /* relate all geometry and mesh entities */
00358 iRel_inferAllRelations( assoc, pair, &result );
00359 if( iBase_SUCCESS != result )
00360 {
00361 printf( "Failed to relate all geom and mesh entities in relate_geom_mesh_test.\n" );
00362 return 0;
00363 }
00364
00365 /* reset geom entities list and get all geom entities (prev
00366 only vertices) */
00367 free( gentities );
00368 gentities = NULL;
00369 gentities_alloc = 0;
00370 iGeom_getEntities( geom, NULL, iBase_ALL_TYPES, &gentities, &gentities_alloc, &gentities_size, &result );
00371 if( iBase_SUCCESS != result )
00372 {
00373 printf( "Failed to get gentities by type in relate_geom_mesh_test.\n" );
00374 return 0;
00375 }
00376
00377 /* get related mesh entity sets for geometry entities */
00378 iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities, &out_mentities_alloc,
00379 &out_mentities_size, &result );
00380 if( iBase_SUCCESS != result )
00381 {
00382 printf( "Failed to get geom entities in relate_geom_mesh_test.\n" );
00383 return 0;
00384 }
00385
00386 if( out_mentities_size != gentities_size )
00387 {
00388 printf( "Number of input geom entities and output mesh entity sets should be same\n" );
00389 return 0;
00390 }
00391
00392 /* now try deleting this relation */
00393 iRel_rmvEntArrRelation( assoc, pair, gentities, gentities_size, 0, &result );
00394 if( iBase_SUCCESS != result )
00395 {
00396 printf( "Failed to remove relation in relate_geom_mesh_test.\n" );
00397 return 0;
00398 }
00399
00400 iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities2, &out_mentities2_alloc,
00401 &out_mentities2_size, &result );
00402 if( iBase_SUCCESS == result )
00403 {
00404 printf( "Shouldn't have gotten mesh sets in relate_geom_mesh_test.\n" );
00405 return 0;
00406 }
00407
00408 /* restore the relation, since we need it later */
00409 iRel_setEntArrSetArrRelation( assoc, pair, gentities, gentities_size, out_mentities, out_mentities_size, &result );
00410 if( iBase_SUCCESS != result )
00411 {
00412 printf( "Failed to restore relation in relate_geom_mesh_test.\n" );
00413 return 0;
00414 }
00415
00416 /* get related geometry entities for mesh entity sets */
00417 iRel_getSetArrEntArrRelation( assoc, pair, out_mentities, out_mentities_size, 1, &out_gentities,
00418 &out_gentities_alloc, &out_gentities_size, &result );
00419 if( iBase_SUCCESS != result )
00420 {
00421 printf( "Failed to get mesh entities in relate_geom_mesh_test.\n" );
00422 return 0;
00423 }
00424
00425 if( out_mentities_size != out_gentities_size )
00426 {
00427 printf( "Number of input mesh entity sets and output geom entities should be same\n" );
00428 return 0;
00429 }
00430 free( mentity_handles );
00431 mentity_handles = NULL;
00432 free( gentities );
00433 gentities = NULL;
00434 free( mentity_handles );
00435 mentity_handles = NULL;
00436 free( out_mentities );
00437 out_mentities = NULL;
00438 free( mentities_vec );
00439 mentities_vec = NULL;
00440 free( out_gentities );
00441 out_gentities = NULL;
00442 return 1;
00443 }
00444
00445 /*!
00446 @test
00447 TSTTAssoc move to test
00448 @li Move meshes onto the given geometry
00449 */
00450 int query_relations_test( iRel_Instance assoc, iGeom_Instance geom, iMesh_Instance mesh, iRel_PairHandle pair )
00451 {
00452 int result;
00453 int i;
00454
00455 iBase_EntityHandle* gentities = NULL;
00456 int gentities_size = 0, gentities_alloc = 0;
00457
00458 iBase_EntitySetHandle* out_mentities = NULL;
00459 int out_mentities_size, out_mentities_alloc = 0;
00460
00461 iBase_EntityHandle* out_gentities = NULL;
00462 int out_gentities_size, out_gentities_alloc = 0;
00463
00464 /* get all the geom entities, and find relation to some mesh entity */
00465 iGeom_getEntities( geom, NULL, iBase_ALL_TYPES, &gentities, &gentities_alloc, &gentities_size, &result );
00466 if( iBase_SUCCESS != result )
00467 {
00468 printf( "Problem getting all geom entities.\n" );
00469 return 0;
00470 }
00471
00472 iRel_getEntArrSetArrRelation( assoc, pair, gentities, gentities_size, 0, &out_mentities, &out_mentities_alloc,
00473 &out_mentities_size, &result );
00474 /* might not all be */
00475 if( iBase_SUCCESS != result )
00476 {
00477 char descr[120];
00478
00479 printf( "Failed to get mesh entities related to geom entities in query_relations_test.\n" );
00480
00481 iRel_getDescription( assoc, descr, sizeof( descr ) - 1 );
00482 printf( "Entities missing relations: %s\n", descr );
00483
00484 for( i = 0; i < gentities_size; i++ )
00485 {
00486 print_geom_info( geom, gentities[i] );
00487 }
00488
00489 return 0;
00490 }
00491
00492 /* check that they're all non-null */
00493 if( out_mentities_size != gentities_size )
00494 {
00495 printf( "Number of mesh & related geom entities don't match.\n" );
00496 return 0;
00497 }
00498
00499 /* check to make sure they're mesh sets; how to do that? */
00500 for( i = 0; i < out_mentities_size; i++ )
00501 {
00502 int is_list;
00503 iMesh_isList( mesh, (iBase_EntitySetHandle)out_mentities[i], &is_list, &result );
00504 if( iBase_SUCCESS != result )
00505 {
00506 printf( "Entity set returned from classification wasn't valid.\n" );
00507 return 0;
00508 }
00509 }
00510
00511 /* now turn around and check classification of those mesh entities */
00512 iRel_getSetArrEntArrRelation( assoc, pair, out_mentities, out_mentities_size, 1, &out_gentities,
00513 &out_gentities_alloc, &out_gentities_size, &result );
00514 if( iBase_SUCCESS != result )
00515 {
00516 printf( "Failed to get geom entities related to mesh entities in query_relations_test.\n" );
00517 return 0;
00518 }
00519
00520 /* check that they're all non-null */
00521 if( out_mentities_size != out_gentities_size )
00522 {
00523 printf( "Number of geom & related mesh entities don't match.\n" );
00524 return 0;
00525 }
00526
00527 free( gentities );
00528 gentities = NULL;
00529 free( out_mentities );
00530 out_mentities = NULL;
00531 free( out_gentities );
00532 out_gentities = NULL;
00533 /* ok, we're done */
00534 return 1;
00535 }
00536
00537 int main( int argc, char* argv[] )
00538 {
00539 /* Check command line arg */
00540 const char* geom_filename = DEFAULT_GEOM;
00541 const char* mesh_filename = DEFAULT_MESH;
00542
00543 int result;
00544 int number_tests = 0;
00545 int number_tests_successful = 0;
00546 int number_tests_not_implemented = 0;
00547 int number_tests_failed = 0;
00548
00549 iGeom_Instance geom;
00550 iMesh_Instance mesh;
00551 iRel_Instance assoc;
00552 iRel_PairHandle pair;
00553
00554 printf( "Usage: %s %s\n", geom_filename, mesh_filename );
00555
00556 if( argc == 2 && !strcmp( argv[1], "-h" ) )
00557 {
00558 printf( "Usage: %s \n", argv[0] );
00559 return 1;
00560 }
00561 else if( argc == 2 )
00562 {
00563 geom_filename = argv[1];
00564 mesh_filename = argv[1];
00565 }
00566 else if( argc == 3 )
00567 {
00568 geom_filename = argv[1];
00569 mesh_filename = argv[2];
00570 }
00571
00572 /* initialize the Geometry */
00573 iGeom_newGeom( 0, &geom, &result, 0 );
00574
00575 /* initialize the Mesh */
00576 iMesh_newMesh( 0, &mesh, &result, 0 );
00577
00578 /* initialize the Associate */
00579 iRel_create( 0, &assoc, &result, 0 );
00580
00581 /* Print out Header information */
00582 printf( "\n\niRel TEST PROGRAM:\n\n" );
00583
00584 /* load_geom_mesh test */
00585 printf( " load_geom_mesh: " );
00586 result = load_geom_mesh_test( geom_filename, mesh_filename, geom, mesh );
00587 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
00588 number_tests++;
00589 printf( "\n" );
00590
00591 /* create_relation test */
00592 printf( " create_relation: " );
00593 result = create_relation_test( assoc, geom, mesh, &pair );
00594 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
00595 number_tests++;
00596 printf( "\n" );
00597
00598 /* relate_geom_mesh test */
00599 printf( " relate_geom_mesh: " );
00600 result = relate_geom_mesh_test( assoc, geom, mesh, pair );
00601 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
00602 number_tests++;
00603 printf( "\n" );
00604
00605 /* query_relations test */
00606 printf( " query_relations: " );
00607 result = query_relations_test( assoc, geom, mesh, pair );
00608 handle_error_code( result, &number_tests_failed, &number_tests_not_implemented, &number_tests_successful );
00609 number_tests++;
00610 printf( "\n" );
00611
00612 /* summary */
00613
00614 printf( "\niRel TEST SUMMARY: \n" );
00615 printf( " Number Tests: %d\n", number_tests );
00616 printf( " Number Successful: %d\n", number_tests_successful );
00617 printf( " Number Not Implemented: %d\n", number_tests_not_implemented );
00618 printf( " Number Failed: %d\n", number_tests_failed );
00619 printf( "\n\n" );
00620
00621 iRel_destroy( assoc, &result );
00622 iMesh_dtor( mesh, &result );
00623 iGeom_dtor( geom, &result );
00624
00625 return number_tests_failed != 0;
00626 }