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 <cstdio> 00006 #include <cstdlib> 00007 #include <cstring> 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 <geom_filename> <mesh_filename>\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 }