25 #define CHECK( STR ) \
26 if( err != iBase_SUCCESS ) return print_error( STR, err, geom, __FILE__, __LINE__ )
28 #define STRINGIFY( S ) XSTRINGIFY( S )
29 #define XSTRINGIFY( S ) #S
37 std::cerr <<
"ERROR: " << desc << std::endl
38 <<
" Error code: " << err << std::endl
39 <<
" Error desc: " <<
buffer << std::endl
40 <<
" At : " << file <<
':' << line << std::endl;
50 template <
typename T >
62 arr = (
T*)malloc( s *
sizeof(
T ) );
63 for(
unsigned i = 0; i < s; ++i )
69 for(
int i = 0; i <
size(); ++i )
124 #define ARRAY_INOUT( A ) A.ptr(), &( A ).capacity(), &( A ).size()
125 #define ARRAY_IN( A ) &( A )[0], ( A ).size()
147 std::cout <<
"Success";
152 std::cout <<
"Failure";
157 int main(
int argc,
char* argv[] )
160 std::string engine_opt;
164 std::cout <<
"Using default input file: " <<
filename << std::endl;
172 std::cerr <<
"Usage: " << argv[0] <<
" [geom_filename]" << std::endl;
179 int number_tests_not_implemented = 0;
188 std::cout <<
"\n\nITAPS GEOMETRY INTERFACE TEST PROGRAM:\n\n";
190 std::cout <<
" gLoad: ";
197 std::cout <<
" tags: ";
213 std::cout <<
" topology adjacencies: ";
220 std::cout <<
" geometry evaluation: ";
282 std::cout <<
" shutdown: ";
290 std::cout <<
"\nTSTT TEST SUMMARY: \n"
293 <<
" Number Not Implemented: " << number_tests_not_implemented <<
"\n"
309 CHECK(
"ERROR : can not load a geometry" );
313 CHECK(
"ERROR : getRootSet failed!" );
316 std::cout <<
"Model contents: " << std::endl;
317 const char* gtype[] = {
"vertices: ",
"edges: ",
"faces: ",
"regions: " };
318 for(
int i = 0; i <= 3; ++i )
322 CHECK(
"Error: problem getting entities after gLoad." );
323 std::cout << gtype[i] << count << std::endl;
337 if( !success )
return success;
340 if( !success )
return success;
351 CHECK(
"ERROR : getRootSet failed!" );
355 std::string tag_name(
"tag_info tag" ), tmp_name;
357 CHECK(
"ERROR : can not create a tag." );
361 char name_buffer[256];
363 CHECK(
"ERROR : Couldn't get tag name." );
364 if( tag_name != name_buffer )
366 std::cerr <<
"ERROR: getTagName returned '" << name_buffer <<
"' for tag created as '" << tag_name <<
"'"
372 CHECK(
"ERROR : Couldn't get tag handle." );
373 if( tmp_handle != this_tag )
375 std::cerr <<
"ERROR: getTagHandle didn't return consistent result." << std::endl;
381 CHECK(
"ERROR : Couldn't get tag size." );
384 std::cerr <<
"ERROR: getTagSizeBytes: expected 4, got " << tag_size << std::endl;
389 CHECK(
"ERROR : Couldn't get tag size." );
392 std::cerr <<
"ERROR: getTagSizeValues: expected 4, got " << tag_size << std::endl;
398 CHECK(
"ERROR : Couldn't get tag type." );
401 std::cerr <<
"ERROR: getTagType: expected " <<
iBase_BYTES <<
", got " << tag_type << std::endl;
406 CHECK(
"ERROR : Couldn't delete a tag." );
410 std::set< iBase_TagHandle > tags;
413 CHECK(
"getEntities( ..., iBase_ALL_TYPES, ... ) failed." );
414 for(
int i = 0; i <
entities.size(); ++i )
418 CHECK(
"getAllTags failed." );
419 std::copy( tag_arr.
begin(), tag_arr.
end(), std::inserter( tags, tags.begin() ) );
422 std::cout <<
"Tags defined on model: ";
424 for( std::set< iBase_TagHandle >::iterator sit = tags.begin(); sit != tags.end(); ++sit )
427 name_buffer[
sizeof( name_buffer ) - 1] =
'\0';
428 CHECK(
"getTagName failed." );
430 if( !
first ) std::cout <<
", ";
431 std::cout << name_buffer;
434 if(
first ) std::cout <<
"<none>";
435 std::cout << std::endl;
446 std::string tag_name(
"tag_get_set tag" );
448 CHECK(
"ERROR : can not create a tag for get_set test." );
452 CHECK(
"ERROR : getRootSet failed!" );
455 int sum = 0, num = 0,
dim;
460 int num_ents = gentity_handles.
size();
461 std::vector< int > tag_vals( num_ents );
462 for(
int i = 0; i < num_ents; ++i )
470 tag_vals.size() *
sizeof(
int ), &err );
471 CHECK(
"ERROR : can't set tag on entities" );
480 int num_ents = gentity_handles.
size();
484 &tag_vals.
size(), &err );
485 CHECK(
"ERROR : can't get tag on entities" );
487 int* tag_ptr = (
int*)( &tag_vals[0] );
488 for(
int i = 0; i < num_ents; ++i )
489 get_sum += tag_ptr[i];
494 std::cerr <<
"ERROR: getData didn't return consistent results." << std::endl;
499 CHECK(
"ERROR : couldn't delete tag." );
520 CHECK(
"ERROR : getRootSet failed!" );
525 CHECK(
"Problem getting the number of all gentity sets in whole model." );
528 for( ; ent_type < num_type; ent_type++ )
532 CHECK(
"Problem creating entityset." );
537 CHECK(
"Failed to get gentities by type in gentityset_test." );
541 CHECK(
"Failed to add gentities in entityset_test." );
545 CHECK(
"Failed to get number of gentities by type in entityset_test." );
548 int num_type_gentity = gentities.
size();
550 if( number_array[ent_type] != num_type_gentity )
552 std::cerr <<
"Number of gentities by type is not correct" << std::endl;
563 CHECK(
"Failed to create a super set in gentityset_test." );
565 for(
int i = 0; i < num_type; i++ )
568 CHECK(
"Failed to create a super set in gentityset_test." );
575 CHECK(
"Failed to create a super set in gentityset_test." );
582 CHECK(
"Failed to get gedge gentities in gentityset_test." );
586 CHECK(
"Failed to add gedge gentities in gentityset_test." );
590 CHECK(
"Failed to get gface gentities in gentityset_test." );
594 CHECK(
"Failed to add gface gentities in gentityset_test." );
598 CHECK(
"Failed to subtract gentitysets in gentityset_test." );
601 CHECK(
"Failed to get gface gentities in gentityset_test." );
603 if( gfaces.
size() != temp_gentities1.
size() )
605 std::cerr <<
"Number of entitysets after subtraction not correct \
614 CHECK(
"Failed to get dimensions of gentities in gentityset_test." );
617 std::cerr <<
"Subtraction failed to remove all edges" << std::endl;
626 CHECK(
"Failed to remove gface gentities in gentityset_test." );
630 CHECK(
"Failed to get number of gentities by type in gentityset_test." );
634 std::cerr <<
"failed to remove correctly." << std::endl;
640 CHECK(
"Failed to add gedge gentities in gentityset_test." );
644 CHECK(
"Failed to add gface gentities in gentityset_test." );
649 CHECK(
"Failed to intersect in gentityset_test." );
653 CHECK(
"Failed to get gface gentities in gentityset_test." );
657 std::cerr <<
"wrong number of gfaces." << std::endl;
668 CHECK(
"Failed to create a temp gentityset in gentityset_test." );
671 CHECK(
"Failed to get gregion gentities in gentityset_test." );
675 CHECK(
"Failed to add gregion gentities in gentityset_test." );
680 CHECK(
"Failed to unite in gentityset_test." );
684 CHECK(
"Failed to get number of gregion gentities by type in gentityset_test." );
688 std::cerr <<
"different number of gregions in gentityset_test." << std::endl;
697 CHECK(
"Problem creating gentityset in gentityset_test." );
700 CHECK(
"Problem add parent in gentityset_test." );
705 CHECK(
"Problem getting parents in gentityset_test." );
707 if( parents.
size() != 1 )
709 std::cerr <<
"number of parents is not correct in gentityset_test." << std::endl;
721 CHECK(
"Problem adding parent and child in gentityset_test." );
727 CHECK(
"Problem adding parent and child in gentityset_test." );
731 CHECK(
"Problem adding child in gentityset_test." );
736 CHECK(
"Problem getting number of parents in gentityset_test." );
740 std::cerr <<
"number of parents is not correct in gentityset_test." << std::endl;
747 CHECK(
"Problem getting number of children in gentityset_test." );
751 std::cerr <<
"number of children is not correct in gentityset_test." << std::endl;
757 CHECK(
"Problem getting children in gentityset_test." );
761 std::cerr <<
"number of children is not correct in gentityset_test." << std::endl;
767 CHECK(
"Problem removing parent child in gentityset_test." );
771 CHECK(
"Problem getting number of children in gentityset_test." );
775 std::cerr <<
"number of children is not correct in gentityset_test." << std::endl;
782 CHECK(
"Problem checking relation in gentityset_test." );
785 std::cerr <<
"parent_child and ges_array[TSTTG::EntityType_EDGE] should be related" << std::endl;
794 std::cerr <<
"ges_array[TSTTG::REGION] and ges_array[TSTTG::EntityType_FACE] should not be "
805 CHECK(
"Problem to get all gentity sets in mesh." );
807 if( gentity_sets.
size() != all_sets + 8 )
809 std::cerr <<
"the number of gentity sets in whole mesh should be 8 times of num_iter." << std::endl;
816 CHECK(
"Problem to get gentity sets in super set." );
821 CHECK(
"Problem to get the number of all gentity sets in super set." );
824 if( num_super != ges_array1.
size() )
826 std::cerr <<
"the number of gentity sets in super set should be same." << std::endl;
833 CHECK(
"Problem to get all gentities in super set." );
845 for(
int k = 0; k < num_super; k++ )
851 for(
int a = 0; a < ges_array1.
size(); a++ )
854 CHECK(
"Problem to add entity set." );
864 CHECK(
"Problem to add super set to gentitysets." );
875 CHECK(
"Problem to add temp set to gentitysets." );
895 CHECK(
"ERROR : getRootSet failed!" );
899 std::vector< std::vector< iBase_EntityHandle > > gentity_vectors( num_test_top );
905 for( i = top; i < num_test_top; i++ )
909 CHECK(
"Failed to get gentities in adjacencies_test." );
911 gentity_vectors[i].resize( gentities.
size() );
912 std::copy( gentities.
begin(), gentities.
end(), gentity_vectors[i].begin() );
916 for( i = top; i < num_test_top; i++ )
920 CHECK(
"Failed to get number of gentities in adjacencies_test." );
922 if(
static_cast< int >( gentity_vectors[i].
size() ) != num_tops )
924 std::cerr <<
"Number of gentities doesn't agree with number returned for dimension " << i << std::endl;
930 std::vector< iBase_EntityHandle >::iterator vit;
933 for( vit = gentity_vectors[i].begin(); vit != gentity_vectors[i].end(); ++vit )
943 CHECK(
"Bi-directional adjacencies test failed." );
946 int num_lower = lower_ents.
size();
947 for(
int k = 0; k < num_lower; k++ )
951 CHECK(
"Bi-directional adjacencies test failed." );
952 if( std::find( upper_ents.
begin(), upper_ents.
end(), this_gent ) == upper_ents.
end() )
954 std::cerr <<
"Didn't find lower-upper adjacency which was supposed to be "
956 << i <<
", " << j << std::endl;
980 CHECK(
"ERROR : getRootSet failed!" );
984 std::vector< std::vector< iBase_EntityHandle > > gentity_vectors( num_test_top );
990 for( i = top; i < num_test_top; i++ )
994 CHECK(
"Failed to get gentities in adjacencies_test." );
996 gentity_vectors[i].resize( gentities.
size() );
997 std::copy( gentities.
begin(), gentities.
end(), gentity_vectors[i].begin() );
1001 double min[3], max[3], on[3];
1002 double near[3] = { .0, .0, .0 };
1003 std::vector< iBase_EntityHandle >::iterator vit;
1008 for( vit = gentity_vectors[i].begin(); vit != gentity_vectors[i].end(); ++vit )
1012 CHECK(
"Failed to get bounding box of entity." );
1015 CHECK(
"Failed to get closest point on entity." );
1037 CHECK(
"Creating cylinder failed." );
1041 CHECK(
"Problems moving surface." );
1047 CHECK(
"Problems getting max surf for rotation." );
1052 CHECK(
"Problems getting max surf for rotation." );
1053 double dtol = 1.0e-6;
1054 for(
int i = 0; i < surfs.
size(); ++i )
1056 if( ( max_corn[3 * i + 2] ) <= dtol && ( max_corn[3 * i + 2] ) >= -dtol && ( min_corn[3 * i + 2] ) <= dtol &&
1057 ( min_corn[3 * i + 2] ) >= -dtol )
1059 max_surf = surfs[i];
1066 std::cerr <<
"Couldn't find max surf for rotation." << std::endl;
1072 CHECK(
"Problems moving surface." );
1075 CHECK(
"Problems sweeping surface about axis." );
1079 CHECK(
"Problems deleting cylinder or swept surface body." );
1086 const double* expected_max,
1087 const double* actual_min,
1088 const double* actual_max )
1091 double dtol = 1.0e-6;
1093 for(
int i = 0; i < 3; ++i )
1095 if( expected_min[i] < actual_min[i] - dtol || expected_min[i] * 10 > actual_min[i] ||
1096 expected_max[i] > actual_max[i] + dtol || expected_max[i] * 10 < actual_max[i] )
1109 CHECK(
"createBrick failed." );
1113 CHECK(
"createCylinder failed." );
1117 CHECK(
"createTorus failed." );
1125 double preset_min_corn[] =
1133 double preset_max_corn[] =
1141 if( !
compare_box( preset_min_corn, preset_max_corn, &min_corn[0], &max_corn[0] ) )
1143 std::cerr <<
"Box check failed for brick" << std::endl;
1147 if( !
compare_box( preset_min_corn + 3, preset_max_corn + 3, &min_corn[3], &max_corn[3] ) )
1149 std::cerr <<
"Box check failed for cylinder" << std::endl;
1153 if( !
compare_box( preset_min_corn + 6, preset_max_corn + 6, &min_corn[6], &max_corn[6] ) )
1155 std::cerr <<
"Box check failed for torus" << std::endl;
1159 for(
int i = 0; i < 3; ++i )
1162 CHECK(
"Problems deleting primitive after boolean check." );
1175 CHECK(
"Problems creating brick for transforms test." );
1179 CHECK(
"Problems moving brick for transforms test." );
1181 double bb_min[3], bb_max[3];
1183 CHECK(
"Problems getting bounding box after move." );
1185 double dtol = 1.0e-6;
1186 if( ( bb_min[0] ) >= dtol || ( bb_min[0] ) <= -dtol || ( bb_min[1] ) >= dtol || ( bb_min[1] ) <= -dtol ||
1187 ( bb_min[2] ) >= dtol || ( bb_min[2] ) <= -dtol || ( bb_max[0] - 1 ) >= dtol || 1 - bb_max[0] >= dtol ||
1188 ( bb_max[1] - 2 ) >= dtol || 2 - bb_max[1] >= dtol || ( bb_max[2] - 3 ) >= dtol || 3 - bb_max[2] >= dtol )
1190 std::cerr <<
"Wrong bounding box after move." << std::endl;
1196 CHECK(
"Problems rotating brick for transforms test." );
1199 CHECK(
"Problems getting bounding box after rotate." );
1201 if( ( bb_min[0] ) >= dtol || -bb_min[0] >= dtol || ( bb_min[1] + 3 ) >= dtol || -( bb_min[1] + 3 ) >= dtol ||
1202 ( bb_min[2] ) >= dtol || -( bb_min[2] ) >= dtol || ( bb_max[0] - 1 ) >= dtol || 1 - bb_max[0] >= dtol ||
1203 ( bb_max[1] ) >= dtol || -( bb_max[1] ) >= dtol || ( bb_max[2] - 2 ) >= dtol || 2 - bb_max[2] >= dtol )
1205 std::cerr <<
"Wrong bounding box after rotate." << std::endl;
1211 CHECK(
"Problems reflecting brick for transforms test." );
1214 CHECK(
"Problems getting bounding box after reflect." );
1216 if( ( bb_min[0] ) >= dtol || -( bb_min[0] ) >= dtol || ( bb_min[1] ) >= dtol || ( bb_min[2] ) >= dtol ||
1217 -( bb_min[1] ) >= dtol || -( bb_min[2] ) >= dtol || ( bb_max[0] - 1 ) >= dtol || 1 - bb_max[0] >= dtol ||
1218 ( bb_max[1] - 3 ) >= dtol || 3 - bb_max[1] >= dtol || ( bb_max[2] - 2 ) >= dtol || 2 - bb_max[2] >= dtol )
1220 std::cerr <<
"Wrong bounding box after reflect." << std::endl;
1226 CHECK(
"Problems deleting brick after transforms check." );
1237 CHECK(
"Problems creating brick for booleans test." );
1239 CHECK(
"Problems creating cylinder for booleans test." );
1244 CHECK(
"Problems subtracting for booleans subtract test." );
1249 CHECK(
"Problems sectioning for booleans section test." );
1253 CHECK(
"Problems creating cylinder for unite test." );
1257 CHECK(
"Problems uniting for booleans unite test." );
1260 CHECK(
"Problems deleting for booleans unite test." );
1266 std::vector< iBase_EntityHandle >& entities_out,
1268 std::vector< int >* ids_out = 0 )
1277 entities_out.resize( num );
1278 int junk1 = entities_out.size(), junk2;
1283 assert( num == junk1 && num == junk2 );
1287 ids_out->resize( num );
1288 int* int_ptr = &( *ids_out )[0];
1291 assert( num == junk1 && num == junk2 );
1297 const std::vector< iBase_EntityHandle >&
entities,
1298 const std::vector< int >& ids,
1300 const char* expected_value,
1301 const char* ent_type_str )
1303 const int firmness_size = 4;
1304 std::vector< char > firmness( firmness_size *
entities.size() );
1306 char* byte_ptr = &firmness[0];
1307 int err, junk1 = firmness.size(), junk2 =
entities.size() * firmness_size;
1311 bool all_correct =
true;
1312 for(
unsigned i = 0; i <
entities.size(); ++i )
1313 if( std::string( &firmness[firmness_size * i], firmness_size ) != expected_value ) all_correct =
false;
1316 std::cout <<
"ERROR: Expected \"" << expected_value <<
"\" firmness "
1317 <<
"for all " << ent_type_str <<
"." << std::endl;
1318 std::cout <<
"ID Actual " << std::endl;
1319 for(
unsigned i = 0; i <
entities.size(); ++i )
1320 std::cout << std::setw( 2 ) << ids[i] <<
" " << std::string( &firmness[firmness_size * i], firmness_size )
1329 const std::vector< iBase_EntityHandle >& ents,
1335 std::vector< char > data( bytes );
1337 int success_count = 0;
1338 for(
size_t i = 0; i < ents.size(); ++i )
1340 char* ptr = &data[0];
1341 int junk1 = bytes, junk2;
1348 return success_count;
1354 int err, junk1, junk2;
1360 CHECK(
"Failed to load input file: 'size.sat'" );
1365 CHECK(
"FBiGeom_getTagHandle(\"MESH_INTERVAL\")" );
1367 CHECK(
"FBiGeom_getTagHandle(\"MESH_SIZE\")" );
1369 CHECK(
"FBiGeom_getTagHandle(\"SIZE_FIRMNESS\")" );
1371 CHECK(
"FBiGeom_getTagHandle(\"GLOBAL_ID\")" );
1374 std::vector< iBase_EntityHandle > verts, curves, surfs, vols;
1375 std::vector< int > vert_ids, curve_ids, surf_ids, vol_ids;
1386 std::vector< int > intervals( curves.size() );
1387 int* int_ptr = &intervals[0];
1388 junk1 = junk2 = curves.size();
1390 CHECK(
"Failed to get intervals for curves" );
1391 if( intervals != curve_ids )
1393 std::cout <<
"ERROR: Incorrect curve intervals for one or more curves." << std::endl;
1394 std::cout <<
"ID Expected Actual" << std::endl;
1395 for(
unsigned i = 0; i < curves.size(); ++i )
1396 std::cout << std::setw( 2 ) << curve_ids[i] <<
" " << std::setw( 8 ) << curve_ids[i] <<
" "
1397 << std::setw( 6 ) << intervals[i] << std::endl;
1402 std::vector< double >
sizes( surfs.size() );
1403 double* dbl_ptr = &
sizes[0];
1404 junk1 = junk2 = surfs.size();
1406 CHECK(
"Failed to get sizes for surfaces" );
1407 bool all_correct =
true;
1408 for(
unsigned i = 0; i < surfs.size(); ++i )
1409 if( fabs(
sizes[i] - (
double)surf_ids[i] ) > 1e-8 ) all_correct =
false;
1412 std::cout <<
"ERROR: Incorrect mesh size for one or more surfaces." << std::endl;
1413 std::cout <<
"ID Expected Actual " << std::endl;
1414 for(
unsigned i = 0; i < surfs.size(); ++i )
1415 std::cout << std::setw( 2 ) << surf_ids[i] <<
" " << std::setw( 8 ) << (double)surf_ids[i] <<
" "
1416 << std::setw( 8 ) <<
sizes[i] << std::endl;
1421 CHECK(
"Invalid size or interval data" );
1425 CHECK(
"Invalid curve firmness" );
1428 CHECK(
"Invalid surface firmness" );
1432 CHECK(
"Got firmness for vertex." );
1434 CHECK(
"Got firmness for volume." );
1438 CHECK(
"Got interval count for vertex." );
1440 CHECK(
"Got interval count for volume." );
1445 CHECK(
"Got mesh size for vertex." );
1447 CHECK(
"Got mesh size for volume." );
1458 CHECK(
"Interface destruction didn't work properly." );
1461 CHECK(
"Interface re-construction didn't work properly." );
1464 CHECK(
"2nd Interface destruction didn't work properly." );
1474 std::string
filename =
"testout.brep";
1475 #elif defined( HAVE_ACIS )
1476 std::string
filename =
"testout.sat";
1477 #elif defined( HAVE_OCC )
1478 std::string
filename =
"testout.brep";
1480 std::string
filename =
"testout.sat";
1484 int num_ents_bef, num_sets_bef;
1487 CHECK(
"Failed to get root set." );
1489 CHECK(
"Failed to get number of ent sets." );
1491 CHECK(
"Failed to get number of entities." );
1496 CHECK(
"Problems creating cylinder for save entset test." );
1499 CHECK(
"Problems creating entity set for save entset test." );
1503 CHECK(
"Problems adding entity to set for save entset test." );
1507 CHECK(
"Problems saving file for save entset test." );
1510 CHECK(
"Failed to destroy entity set." );
1512 CHECK(
"Failed to destroy entity." );
1516 CHECK(
"Problems reading file for save entset test." );
1519 int num_ents_aft, num_sets_aft;
1521 CHECK(
"Failed to get number of ent sets." );
1523 CHECK(
"Failed to get number of entities." );
1524 bool success =
true;
1525 if( num_ents_aft != 2 * num_ents_bef + 1 )
1530 else if( num_sets_aft != 2 * num_sets_bef + 1 )