MOAB: Mesh Oriented datABase  (version 5.5.0)
testgeom.cpp File Reference
#include "FBiGeom.h"
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
#include <iterator>
#include <iomanip>
#include <cassert>
#include <cstring>
#include <cmath>
+ Include dependency graph for testgeom.cpp:

Go to the source code of this file.

Classes

class  SimpleArray< T >
 

Macros

#define CHECK(STR)    if( err != iBase_SUCCESS ) return print_error( STR, err, geom, __FILE__, __LINE__ )
 
#define STRINGIFY(S)   XSTRINGIFY( S )
 
#define XSTRINGIFY(S)   #S
 
#define ARRAY_INOUT(A)   A.ptr(), &( A ).capacity(), &( A ).size()
 
#define ARRAY_IN(A)   &( A )[0], ( A ).size()
 

Typedefs

typedef iBase_TagHandle TagHandle
 
typedef iBase_EntityHandle GentityHandle
 
typedef iBase_EntitySetHandle GentitysetHandle
 

Functions

static bool print_error (const char *desc, int err, FBiGeom_Instance geom, const char *file, int line)
 
bool gLoad_test (const std::string &filename, FBiGeom_Instance)
 
bool tags_test (FBiGeom_Instance geom)
 
bool tag_get_set_test (FBiGeom_Instance geom)
 
bool tag_info_test (FBiGeom_Instance geom)
 
bool gentityset_test (FBiGeom_Instance geom, bool, bool)
 
bool topology_adjacencies_test (FBiGeom_Instance geom)
 
bool geometry_evaluation_test (FBiGeom_Instance geom)
 
bool construct_test (FBiGeom_Instance geom)
 
bool primitives_test (FBiGeom_Instance geom)
 
bool transforms_test (FBiGeom_Instance geom)
 
bool booleans_test (FBiGeom_Instance geom)
 
bool shutdown_test (FBiGeom_Instance geom, std::string &engine_opt)
 
bool save_entset_test (FBiGeom_Instance geom)
 
bool mesh_size_test (FBiGeom_Instance geom)
 
void handle_error_code (const bool result, int &number_failed, int &, int &number_successful)
 
int main (int argc, char *argv[])
 
static bool compare_box (const double *expected_min, const double *expected_max, const double *actual_min, const double *actual_max)
 
static int get_entities (FBiGeom_Instance geom, int entity_type, std::vector< iBase_EntityHandle > &entities_out, iBase_TagHandle id_tag=0, std::vector< int > *ids_out=0)
 
static int check_firmness (FBiGeom_Instance geom, const std::vector< iBase_EntityHandle > &entities, const std::vector< int > &ids, iBase_TagHandle firmness_tag, const char *expected_value, const char *ent_type_str)
 
static int count_num_with_tag (FBiGeom_Instance geom, const std::vector< iBase_EntityHandle > &ents, iBase_TagHandle tag)
 

Macro Definition Documentation

◆ ARRAY_IN

#define ARRAY_IN (   A)    &( A )[0], ( A ).size()

Definition at line 125 of file testgeom.cpp.

◆ ARRAY_INOUT

#define ARRAY_INOUT (   A)    A.ptr(), &( A ).capacity(), &( A ).size()

Definition at line 124 of file testgeom.cpp.

◆ CHECK

#define CHECK (   STR)     if( err != iBase_SUCCESS ) return print_error( STR, err, geom, __FILE__, __LINE__ )

Definition at line 25 of file testgeom.cpp.

◆ STRINGIFY

#define STRINGIFY (   S)    XSTRINGIFY( S )

Definition at line 28 of file testgeom.cpp.

◆ XSTRINGIFY

#define XSTRINGIFY (   S)    #S

Definition at line 29 of file testgeom.cpp.

Typedef Documentation

◆ GentityHandle

Definition at line 46 of file testgeom.cpp.

◆ GentitysetHandle

Definition at line 47 of file testgeom.cpp.

◆ TagHandle

Definition at line 45 of file testgeom.cpp.

Function Documentation

◆ booleans_test()

bool booleans_test ( FBiGeom_Instance  geom)

Definition at line 1230 of file testgeom.cpp.

1231 {
1232  int err;
1233 
1234  // construct a brick size 1, and a cylinder rad 0.25 height 2
1235  iBase_EntityHandle brick = 0, cyl = 0;
1236  FBiGeom_createBrick( geom, 1.0, 0.0, 0.0, &brick, &err );
1237  CHECK( "Problems creating brick for booleans test." );
1238  FBiGeom_createCylinder( geom, 1.0, 0.25, 0.0, &cyl, &err );
1239  CHECK( "Problems creating cylinder for booleans test." );
1240 
1241  // subtract the cylinder from the brick
1242  iBase_EntityHandle subtract_result = 0;
1243  FBiGeom_subtractEnts( geom, brick, cyl, &subtract_result, &err );
1244  CHECK( "Problems subtracting for booleans subtract test." );
1245 
1246  // section the brick
1247  iBase_EntityHandle section_result = 0;
1248  FBiGeom_sectionEnt( geom, subtract_result, 1.0, 0.0, 0.0, 0.25, true, &section_result, &err );
1249  CHECK( "Problems sectioning for booleans section test." );
1250 
1251  // unite the section result with a new cylinder
1252  FBiGeom_createCylinder( geom, 1.0, 0.25, 0.0, &cyl, &err );
1253  CHECK( "Problems creating cylinder for unite test." );
1254  iBase_EntityHandle unite_results;
1255  iBase_EntityHandle unite_input[] = { section_result, cyl };
1256  FBiGeom_uniteEnts( geom, unite_input, 2, &unite_results, &err );
1257  CHECK( "Problems uniting for booleans unite test." );
1258 
1259  FBiGeom_deleteEnt( geom, unite_results, &err );
1260  CHECK( "Problems deleting for booleans unite test." );
1261  return true;
1262 }

References CHECK, FBiGeom_createBrick, FBiGeom_createCylinder, FBiGeom_deleteEnt, FBiGeom_sectionEnt, FBiGeom_subtractEnts, FBiGeom_uniteEnts, and geom.

◆ check_firmness()

static int check_firmness ( FBiGeom_Instance  geom,
const std::vector< iBase_EntityHandle > &  entities,
const std::vector< int > &  ids,
iBase_TagHandle  firmness_tag,
const char *  expected_value,
const char *  ent_type_str 
)
static

Definition at line 1296 of file testgeom.cpp.

1302 {
1303  const int firmness_size = 4;
1304  std::vector< char > firmness( firmness_size * entities.size() );
1305 
1306  char* byte_ptr = &firmness[0];
1307  int err, junk1 = firmness.size(), junk2 = entities.size() * firmness_size;
1308  FBiGeom_getArrData( geom, &entities[0], entities.size(), firmness_tag, (void**)&byte_ptr, &junk1, &junk2, &err );
1309  if( iBase_SUCCESS != err ) return err;
1310 
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;
1314  if( !all_correct )
1315  {
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 )
1321  << std::endl;
1322  return iBase_FAILURE;
1323  }
1324 
1325  return iBase_SUCCESS;
1326 }

References entities, FBiGeom_getArrData, geom, iBase_FAILURE, and iBase_SUCCESS.

Referenced by mesh_size_test().

◆ compare_box()

static bool compare_box ( const double *  expected_min,
const double *  expected_max,
const double *  actual_min,
const double *  actual_max 
)
static

Definition at line 1085 of file testgeom.cpp.

1089 {
1090  bool same = true;
1091  double dtol = 1.0e-6;
1092 
1093  for( int i = 0; i < 3; ++i )
1094  {
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] )
1097  same = false;
1098  }
1099  return same;
1100 }

Referenced by primitives_test().

◆ construct_test()

bool construct_test ( FBiGeom_Instance  geom)
Test:
TSTTG construct Test
  • Check construction of geometry
Test:
TSTTG construct Test
  • Check construction of geometry
Test:
TSTTG construct Test
  • Check construction of geometry

Definition at line 1028 of file testgeom.cpp.

1029 {
1030  int err;
1031  iBase_EntityHandle new_body = 0;
1032 
1033  // construct a cylinder, sweep it about an axis, and delete the result
1034  iBase_EntityHandle cyl = 0;
1035  FBiGeom_createCylinder( geom, 1.0, 1.0, 0.0, &cyl, &err );
1036  // Is the minor radius really supposed to be zero??? - JK
1037  CHECK( "Creating cylinder failed." );
1038 
1039  // move it onto the y axis
1040  FBiGeom_moveEnt( geom, cyl, 0.0, 1.0, -0.5, &err );
1041  CHECK( "Problems moving surface." );
1042 
1043  // get the surface with max z
1044  iBase_EntityHandle max_surf = 0;
1046  FBiGeom_getEntAdj( geom, cyl, iBase_FACE, ARRAY_INOUT( surfs ), &err );
1047  CHECK( "Problems getting max surf for rotation." );
1048 
1049  SimpleArray< double > max_corn, min_corn;
1051  ARRAY_INOUT( max_corn ), &err );
1052  CHECK( "Problems getting max surf for rotation." );
1053  double dtol = 1.0e-6;
1054  for( int i = 0; i < surfs.size(); ++i )
1055  {
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 )
1058  {
1059  max_surf = surfs[i];
1060  break;
1061  }
1062  }
1063 
1064  if( 0 == max_surf )
1065  {
1066  std::cerr << "Couldn't find max surf for rotation." << std::endl;
1067  return false;
1068  }
1069 
1070  // sweep it around the x axis
1071  FBiGeom_moveEnt( geom, cyl, 0.0, 1.0, 0.0, &err );
1072  CHECK( "Problems moving surface." );
1073 
1074  FBiGeom_sweepEntAboutAxis( geom, max_surf, 360.0, 1.0, 0.0, 0.0, &new_body, &err );
1075  CHECK( "Problems sweeping surface about axis." );
1076 
1077  // now delete
1078  FBiGeom_deleteEnt( geom, new_body, &err );
1079  CHECK( "Problems deleting cylinder or swept surface body." );
1080 
1081  // if we got here, we were successful
1082  return true;
1083 }

References ARRAY_IN, ARRAY_INOUT, CHECK, FBiGeom_createCylinder, FBiGeom_deleteEnt, FBiGeom_getArrBoundBox, FBiGeom_getEntAdj, FBiGeom_moveEnt, FBiGeom_sweepEntAboutAxis, geom, iBase_FACE, iBase_INTERLEAVED, and SimpleArray< T >::size().

◆ count_num_with_tag()

static int count_num_with_tag ( FBiGeom_Instance  geom,
const std::vector< iBase_EntityHandle > &  ents,
iBase_TagHandle  tag 
)
static

Definition at line 1328 of file testgeom.cpp.

1331 {
1332  int err, bytes;
1333  FBiGeom_getTagSizeBytes( geom, tag, &bytes, &err );
1334  if( iBase_SUCCESS != err ) return -1;
1335  std::vector< char > data( bytes );
1336 
1337  int success_count = 0;
1338  for( size_t i = 0; i < ents.size(); ++i )
1339  {
1340  char* ptr = &data[0];
1341  int junk1 = bytes, junk2;
1342  FBiGeom_getData( geom, ents[i], tag, (void**)&ptr, &junk1, &junk2, &err );
1343  if( iBase_TAG_NOT_FOUND == err ) continue;
1344  if( iBase_SUCCESS != err ) return -1;
1345  ++success_count;
1346  }
1347 
1348  return success_count;
1349 }

References FBiGeom_getData, FBiGeom_getTagSizeBytes, geom, iBase_SUCCESS, and iBase_TAG_NOT_FOUND.

Referenced by mesh_size_test().

◆ gentityset_test()

bool gentityset_test ( FBiGeom_Instance  geom,
bool  ,
bool   
)
Test:
TSTT gentity sets test (just implemented parts for now)
  • Check gentity sets
Test:
TSTT gentity sets test (just implemented parts for now)
  • Check gentity sets
Test:
TSTT gentity sets test (just implemented parts for now)
  • Check gentity sets

Definition at line 509 of file testgeom.cpp.

510 {
511  int num_type = 4;
512  iBase_EntitySetHandle ges_array[4];
513  int number_array[4];
514  // int num_all_gentities_super = 0;
515  int ent_type = iBase_VERTEX;
516 
517  int err;
519  FBiGeom_getRootSet( geom, &root_set, &err );
520  CHECK( "ERROR : getRootSet failed!" );
521 
522  // get the number of sets in the whole model
523  int all_sets = 0;
524  FBiGeom_getNumEntSets( geom, root_set, 0, &all_sets, &err );
525  CHECK( "Problem getting the number of all gentity sets in whole model." );
526 
527  // add gentities to entitysets by type
528  for( ; ent_type < num_type; ent_type++ )
529  {
530  // initialize the entityset
531  FBiGeom_createEntSet( geom, true, &ges_array[ent_type], &err );
532  CHECK( "Problem creating entityset." );
533 
534  // get entities by type in total "mesh"
536  FBiGeom_getEntities( geom, root_set, ent_type, ARRAY_INOUT( gentities ), &err );
537  CHECK( "Failed to get gentities by type in gentityset_test." );
538 
539  // add gentities into gentity set
540  FBiGeom_addEntArrToSet( geom, ARRAY_IN( gentities ), ges_array[ent_type], &err );
541  CHECK( "Failed to add gentities in entityset_test." );
542 
543  // Check to make sure entity set really has correct number of entities in it
544  FBiGeom_getNumOfType( geom, ges_array[ent_type], ent_type, &number_array[ent_type], &err );
545  CHECK( "Failed to get number of gentities by type in entityset_test." );
546 
547  // compare the number of entities by type
548  int num_type_gentity = gentities.size();
549 
550  if( number_array[ent_type] != num_type_gentity )
551  {
552  std::cerr << "Number of gentities by type is not correct" << std::endl;
553  return false;
554  }
555 
556  // add to number of all entities in super set
557  // num_all_gentities_super += num_type_gentity;
558  }
559 
560  // make a super set having all entitysets
561  iBase_EntitySetHandle super_set;
562  FBiGeom_createEntSet( geom, true, &super_set, &err );
563  CHECK( "Failed to create a super set in gentityset_test." );
564 
565  for( int i = 0; i < num_type; i++ )
566  {
567  FBiGeom_addEntSet( geom, ges_array[i], super_set, &err );
568  CHECK( "Failed to create a super set in gentityset_test." );
569  }
570 
571  //----------TEST BOOLEAN OPERATIONS----------------//
572 
573  iBase_EntitySetHandle temp_ges1;
574  FBiGeom_createEntSet( geom, true, &temp_ges1, &err );
575  CHECK( "Failed to create a super set in gentityset_test." );
576 
577  // Subtract
578  // add all EDGEs and FACEs to temp_es1
579  // get all EDGE entities
580  SimpleArray< iBase_EntityHandle > gedges, gfaces, temp_gentities1;
581  FBiGeom_getEntities( geom, ges_array[iBase_EDGE], iBase_EDGE, ARRAY_INOUT( gedges ), &err );
582  CHECK( "Failed to get gedge gentities in gentityset_test." );
583 
584  // add EDGEs to ges1
585  FBiGeom_addEntArrToSet( geom, ARRAY_IN( gedges ), temp_ges1, &err );
586  CHECK( "Failed to add gedge gentities in gentityset_test." );
587 
588  // get all FACE gentities
589  FBiGeom_getEntities( geom, ges_array[iBase_FACE], iBase_FACE, ARRAY_INOUT( gfaces ), &err );
590  CHECK( "Failed to get gface gentities in gentityset_test." );
591 
592  // add FACEs to es1
593  FBiGeom_addEntArrToSet( geom, ARRAY_IN( gfaces ), temp_ges1, &err );
594  CHECK( "Failed to add gface gentities in gentityset_test." );
595 
596  // subtract EDGEs
597  FBiGeom_subtract( geom, temp_ges1, ges_array[iBase_EDGE], &temp_ges1, &err );
598  CHECK( "Failed to subtract gentitysets in gentityset_test." );
599 
600  FBiGeom_getEntities( geom, temp_ges1, iBase_FACE, ARRAY_INOUT( temp_gentities1 ), &err );
601  CHECK( "Failed to get gface gentities in gentityset_test." );
602 
603  if( gfaces.size() != temp_gentities1.size() )
604  {
605  std::cerr << "Number of entitysets after subtraction not correct \
606  in gentityset_test."
607  << std::endl;
608  return false;
609  }
610 
611  // check there's nothing but gfaces in temp_ges1
612  int num_gents;
613  FBiGeom_getNumOfType( geom, temp_ges1, iBase_EDGE, &num_gents, &err );
614  CHECK( "Failed to get dimensions of gentities in gentityset_test." );
615  if( 0 != num_gents )
616  {
617  std::cerr << "Subtraction failed to remove all edges" << std::endl;
618  return false;
619  }
620 
621  //------------Intersect------------
622  //
623 
624  // clean out the temp_ges1
625  FBiGeom_rmvEntArrFromSet( geom, ARRAY_IN( gfaces ), temp_ges1, &err );
626  CHECK( "Failed to remove gface gentities in gentityset_test." );
627 
628  // check if it is really cleaned out
629  FBiGeom_getNumOfType( geom, temp_ges1, iBase_FACE, &num_gents, &err );
630  CHECK( "Failed to get number of gentities by type in gentityset_test." );
631 
632  if( num_gents != 0 )
633  {
634  std::cerr << "failed to remove correctly." << std::endl;
635  return false;
636  }
637 
638  // add EDGEs to temp ges1
639  FBiGeom_addEntArrToSet( geom, ARRAY_IN( gedges ), temp_ges1, &err );
640  CHECK( "Failed to add gedge gentities in gentityset_test." );
641 
642  // add FACEs to temp ges1
643  FBiGeom_addEntArrToSet( geom, ARRAY_IN( gfaces ), temp_ges1, &err );
644  CHECK( "Failed to add gface gentities in gentityset_test." );
645 
646  // intersect temp_ges1 with gedges set
647  // temp_ges1 entityset is altered
648  FBiGeom_intersect( geom, temp_ges1, ges_array[iBase_EDGE], &temp_ges1, &err );
649  CHECK( "Failed to intersect in gentityset_test." );
650 
651  // try to get FACEs, but there should be nothing but EDGE
652  FBiGeom_getNumOfType( geom, temp_ges1, iBase_FACE, &num_gents, &err );
653  CHECK( "Failed to get gface gentities in gentityset_test." );
654 
655  if( num_gents != 0 )
656  {
657  std::cerr << "wrong number of gfaces." << std::endl;
658  return false;
659  }
660 
661  //-------------Unite--------------
662 
663  // get all regions
664  iBase_EntitySetHandle temp_ges2;
666 
667  FBiGeom_createEntSet( geom, true, &temp_ges2, &err );
668  CHECK( "Failed to create a temp gentityset in gentityset_test." );
669 
670  FBiGeom_getEntities( geom, ges_array[iBase_REGION], iBase_REGION, ARRAY_INOUT( gregions ), &err );
671  CHECK( "Failed to get gregion gentities in gentityset_test." );
672 
673  // add REGIONs to temp es2
674  FBiGeom_addEntArrToSet( geom, ARRAY_IN( gregions ), temp_ges2, &err );
675  CHECK( "Failed to add gregion gentities in gentityset_test." );
676 
677  // unite temp_ges1 and temp_ges2
678  // temp_ges1 gentityset is altered
679  FBiGeom_unite( geom, temp_ges1, temp_ges2, &temp_ges1, &err );
680  CHECK( "Failed to unite in gentityset_test." );
681 
682  // perform the check
683  FBiGeom_getNumOfType( geom, temp_ges1, iBase_REGION, &num_gents, &err );
684  CHECK( "Failed to get number of gregion gentities by type in gentityset_test." );
685 
686  if( num_gents != number_array[iBase_REGION] )
687  {
688  std::cerr << "different number of gregions in gentityset_test." << std::endl;
689  return false;
690  }
691 
692  //--------Test parent/child stuff in entiysets-----------
693 
694  // Add 2 sets as children to another
695  iBase_EntitySetHandle parent_child;
696  FBiGeom_createEntSet( geom, true, &parent_child, &err );
697  CHECK( "Problem creating gentityset in gentityset_test." );
698 
699  FBiGeom_addPrntChld( geom, ges_array[iBase_VERTEX], parent_child, &err );
700  CHECK( "Problem add parent in gentityset_test." );
701 
702  // check if parent is really added
704  FBiGeom_getPrnts( geom, parent_child, 1, ARRAY_INOUT( parents ), &err );
705  CHECK( "Problem getting parents in gentityset_test." );
706 
707  if( parents.size() != 1 )
708  {
709  std::cerr << "number of parents is not correct in gentityset_test." << std::endl;
710  return false;
711  }
712 
713  // add parent and child
714  // sidl::array<void*> parent_child_array = sidl::array<void*>::create1d(1);
715  // int num_parent_child_array;
716  // sidl::array<void*> temp_gedge_array = sidl::array<void*>::create1d(1);
717  // int num_temp_gedge_array;
718  // parent_child_array.set(0, parent_child);
719  // temp_gedge_array.set(0, ges_array[TSTTG::EntityType_EDGE]);
720  FBiGeom_addPrntChld( geom, ges_array[iBase_EDGE], parent_child, &err );
721  CHECK( "Problem adding parent and child in gentityset_test." );
722 
723  // sidl::array<void*> temp_gface_array = sidl::array<void*>::create1d(1);
724  // int num_temp_gface_array;
725  // temp_gface_array.set(0, ges_array[TSTTG::EntityType_FACE]);
726  FBiGeom_addPrntChld( geom, parent_child, ges_array[iBase_FACE], &err );
727  CHECK( "Problem adding parent and child in gentityset_test." );
728 
729  // add child
730  FBiGeom_addPrntChld( geom, parent_child, ges_array[iBase_REGION], &err );
731  CHECK( "Problem adding child in gentityset_test." );
732 
733  // get the number of parent gentitysets
734  num_gents = -1;
735  FBiGeom_getNumPrnt( geom, parent_child, 1, &num_gents, &err );
736  CHECK( "Problem getting number of parents in gentityset_test." );
737 
738  if( num_gents != 2 )
739  {
740  std::cerr << "number of parents is not correct in gentityset_test." << std::endl;
741  return false;
742  }
743 
744  // get the number of child gentitysets
745  num_gents = -1;
746  FBiGeom_getNumChld( geom, parent_child, 1, &num_gents, &err );
747  CHECK( "Problem getting number of children in gentityset_test." );
748 
749  if( num_gents != 2 )
750  {
751  std::cerr << "number of children is not correct in gentityset_test." << std::endl;
752  return false;
753  }
754 
756  FBiGeom_getChldn( geom, parent_child, 1, ARRAY_INOUT( children ), &err );
757  CHECK( "Problem getting children in gentityset_test." );
758 
759  if( children.size() != 2 )
760  {
761  std::cerr << "number of children is not correct in gentityset_test." << std::endl;
762  return false;
763  }
764 
765  // remove children
766  FBiGeom_rmvPrntChld( geom, parent_child, ges_array[iBase_FACE], &err );
767  CHECK( "Problem removing parent child in gentityset_test." );
768 
769  // get the number of child gentitysets
770  FBiGeom_getNumChld( geom, parent_child, 1, &num_gents, &err );
771  CHECK( "Problem getting number of children in gentityset_test." );
772 
773  if( num_gents != 1 )
774  {
775  std::cerr << "number of children is not correct in gentityset_test." << std::endl;
776  return false;
777  }
778 
779  // parent_child and ges_array[TSTTG::EntityType_EDGE] should be related
780  int result = 0;
781  FBiGeom_isChildOf( geom, ges_array[iBase_EDGE], parent_child, &result, &err );
782  CHECK( "Problem checking relation in gentityset_test." );
783  if( !result )
784  {
785  std::cerr << "parent_child and ges_array[TSTTG::EntityType_EDGE] should be related" << std::endl;
786  return false;
787  }
788 
789  // ges_array[TSTTG::EntityType_FACE] and ges_array[TSTTG::REGION] are not related
790  result = 2;
791  FBiGeom_isChildOf( geom, ges_array[iBase_FACE], ges_array[iBase_REGION], &result, &err );
792  if( result )
793  {
794  std::cerr << "ges_array[TSTTG::REGION] and ges_array[TSTTG::EntityType_FACE] should not be "
795  "related"
796  << std::endl;
797  return false;
798  }
799 
800  //--------test modify and query functions-----------------------------
801 
802  // check the number of gentity sets in whole mesh
804  FBiGeom_getEntSets( geom, root_set, 1, ARRAY_INOUT( gentity_sets ), &err );
805  CHECK( "Problem to get all gentity sets in mesh." );
806 
807  if( gentity_sets.size() != all_sets + 8 )
808  {
809  std::cerr << "the number of gentity sets in whole mesh should be 8 times of num_iter." << std::endl;
810  return false;
811  }
812 
813  // get all gentity sets in super set
815  FBiGeom_getEntSets( geom, super_set, 1, ARRAY_INOUT( ges_array1 ), &err );
816  CHECK( "Problem to get gentity sets in super set." );
817 
818  // get the number of gentity sets in super set
819  int num_super;
820  FBiGeom_getNumEntSets( geom, super_set, 1, &num_super, &err );
821  CHECK( "Problem to get the number of all gentity sets in super set." );
822 
823  // the number of gentity sets in super set should be same
824  if( num_super != ges_array1.size() )
825  {
826  std::cerr << "the number of gentity sets in super set should be same." << std::endl;
827  return false;
828  }
829 
830  // get all entities in super set
832  FBiGeom_getEntSets( geom, super_set, 1, ARRAY_INOUT( all_gentities ), &err );
833  CHECK( "Problem to get all gentities in super set." );
834 
835  // compare the number of all gentities in super set
836  // HJK : num_hops is not implemented
837  // if (num_all_gentities_super != ARRAY_SIZE(all_gentities)) {
838  // std::cerr << "number of all gentities in super set should be same." << std::endl;
839  // success = false;
840  //}
841 
842  // test add, remove and get all entitiy sets using super set
843  // check GetAllGentitysets works recursively and dosen't return
844  // multi sets
845  for( int k = 0; k < num_super; k++ )
846  {
847  // add gentity sets of super set to each gentity set of super set
848  // make multiple child super sets
849  iBase_EntitySetHandle ges_k = ges_array1[k];
850 
851  for( int a = 0; a < ges_array1.size(); a++ )
852  {
853  FBiGeom_addEntSet( geom, ges_array1[a], ges_k, &err );
854  CHECK( "Problem to add entity set." );
855  }
856 
857  // add super set to each entity set
858  // sidl::array<GentitysetHandle> superset_array
859  //= sidl::array<GentitysetHandle>::create1d(1);
860  // superset_array.set(0, super_set);
861  // int num_superset_array;
862 
863  FBiGeom_addEntSet( geom, super_set, ges_k, &err );
864  CHECK( "Problem to add super set to gentitysets." );
865 
866  // add one gentity sets multiple times
867  // HJK: ??? how to deal this case?
868  // sidl::array<GentitysetHandle> temp_array1
869  //= sidl::array<GentitysetHandle>::create1d(1);
870  // int num_temp_array1;
871  // temp_array1.set(0, temp_ges1);
872 
873  // for (int l = 0; l < 3; l++) {
874  FBiGeom_addEntSet( geom, temp_ges1, ges_k, &err );
875  CHECK( "Problem to add temp set to gentitysets." );
876  //}
877  }
878 
879  return true;
880 }

References ARRAY_IN, ARRAY_INOUT, CHECK, children, FBiGeom_addEntArrToSet, FBiGeom_addEntSet, FBiGeom_addPrntChld, FBiGeom_createEntSet, FBiGeom_getChldn, FBiGeom_getEntities, FBiGeom_getEntSets, FBiGeom_getNumChld, FBiGeom_getNumEntSets, FBiGeom_getNumOfType, FBiGeom_getNumPrnt, FBiGeom_getPrnts, FBiGeom_getRootSet, FBiGeom_intersect, FBiGeom_isChildOf, FBiGeom_rmvEntArrFromSet, FBiGeom_rmvPrntChld, FBiGeom_subtract, FBiGeom_unite, geom, iBase_EDGE, iBase_FACE, iBase_REGION, iBase_VERTEX, root_set, and SimpleArray< T >::size().

◆ geometry_evaluation_test()

bool geometry_evaluation_test ( FBiGeom_Instance  geom)
Test:
FBiGeom_MOAB topology adjacencies Test
  • Check topology information
  • Check adjacency
Test:
FBiGeom_MOAB topology adjacencies Test
  • Check topology information
  • Check adjacency
Test:
FBiGeom_MOAB topology adjacencies Test
  • Check topology information
  • Check adjacency

Definition at line 975 of file testgeom.cpp.

976 {
977  int i, err;
979  FBiGeom_getRootSet( geom, &root_set, &err );
980  CHECK( "ERROR : getRootSet failed!" );
981 
982  int top = iBase_VERTEX;
983  int num_test_top = iBase_ALL_TYPES;
984  std::vector< std::vector< iBase_EntityHandle > > gentity_vectors( num_test_top );
985 
986  // fill the vectors of each topology entities
987  // like lines vector, polygon vector, triangle vector,
988  // quadrilateral, polyhedrron, tet, hex, prism, pyramid,
989  // septahedron vectors
990  for( i = top; i < num_test_top; i++ )
991  {
993  FBiGeom_getEntities( geom, root_set, i, ARRAY_INOUT( gentities ), &err );
994  CHECK( "Failed to get gentities in adjacencies_test." );
995 
996  gentity_vectors[i].resize( gentities.size() );
997  std::copy( gentities.begin(), gentities.end(), gentity_vectors[i].begin() );
998  }
999 
1000  // check adjacencies in both directions
1001  double min[3], max[3], on[3];
1002  double near[3] = { .0, .0, .0 };
1003  std::vector< iBase_EntityHandle >::iterator vit;
1004  for( i = iBase_REGION; i >= iBase_VERTEX; i-- )
1005  {
1006  if( i != iBase_EDGE )
1007  {
1008  for( vit = gentity_vectors[i].begin(); vit != gentity_vectors[i].end(); ++vit )
1009  {
1010  iBase_EntityHandle this_gent = *vit;
1011  FBiGeom_getEntBoundBox( geom, this_gent, &min[0], &min[1], &min[2], &max[0], &max[1], &max[2], &err );
1012  CHECK( "Failed to get bounding box of entity." );
1013 
1014  FBiGeom_getEntClosestPt( geom, this_gent, near[0], near[1], near[2], &on[0], &on[1], &on[2], &err );
1015  CHECK( "Failed to get closest point on entity." );
1016  }
1017  }
1018  }
1019 
1020  return true;
1021 }

References ARRAY_INOUT, SimpleArray< T >::begin(), CHECK, SimpleArray< T >::end(), FBiGeom_getEntBoundBox, FBiGeom_getEntClosestPt, FBiGeom_getEntities, FBiGeom_getRootSet, geom, iBase_ALL_TYPES, iBase_EDGE, iBase_REGION, iBase_VERTEX, root_set, and SimpleArray< T >::size().

Referenced by main().

◆ get_entities()

static int get_entities ( FBiGeom_Instance  geom,
int  entity_type,
std::vector< iBase_EntityHandle > &  entities_out,
iBase_TagHandle  id_tag = 0,
std::vector< int > *  ids_out = 0 
)
static

Definition at line 1264 of file testgeom.cpp.

1269 {
1270  int err, num;
1271  iBase_EntitySetHandle root;
1272  FBiGeom_getRootSet( geom, &root, &err );
1273  if( iBase_SUCCESS != err ) return err;
1274  FBiGeom_getNumOfType( geom, root, entity_type, &num, &err );
1275  if( iBase_SUCCESS != err ) return err;
1276 
1277  entities_out.resize( num );
1278  int junk1 = entities_out.size(), junk2;
1279  iBase_EntityHandle* junk_ptr = &entities_out[0];
1280  ;
1281  FBiGeom_getEntities( geom, root, entity_type, &junk_ptr, &junk1, &junk2, &err );
1282  if( iBase_SUCCESS != err ) return err;
1283  assert( num == junk1 && num == junk2 );
1284 
1285  if( !ids_out ) return iBase_SUCCESS;
1286 
1287  ids_out->resize( num );
1288  int* int_ptr = &( *ids_out )[0];
1289  FBiGeom_getIntArrData( geom, &entities_out[0], num, id_tag, &int_ptr, &junk1, &junk2, &err );
1290  if( iBase_SUCCESS != err ) return err;
1291  assert( num == junk1 && num == junk2 );
1292 
1293  return iBase_SUCCESS;
1294 }

References FBiGeom_getEntities, FBiGeom_getIntArrData, FBiGeom_getNumOfType, FBiGeom_getRootSet, geom, iBase_SUCCESS, and id_tag.

Referenced by mesh_size_test().

◆ gLoad_test()

bool gLoad_test ( const std::string &  filename,
FBiGeom_Instance  geom 
)
Test:
Load Mesh
  • Load a mesh file

Definition at line 305 of file testgeom.cpp.

306 {
307  int err;
308  FBiGeom_load( geom, &filename[0], 0, &err, filename.length(), 0 );
309  CHECK( "ERROR : can not load a geometry" );
310 
312  FBiGeom_getRootSet( geom, &root_set, &err );
313  CHECK( "ERROR : getRootSet failed!" );
314 
315  // print out the number of entities
316  std::cout << "Model contents: " << std::endl;
317  const char* gtype[] = { "vertices: ", "edges: ", "faces: ", "regions: " };
318  for( int i = 0; i <= 3; ++i )
319  {
320  int count;
321  FBiGeom_getNumOfType( geom, root_set, i, &count, &err );
322  CHECK( "Error: problem getting entities after gLoad." );
323  std::cout << gtype[i] << count << std::endl;
324  }
325 
326  return true;
327 }

References CHECK, FBiGeom_getNumOfType, FBiGeom_getRootSet, FBiGeom_load, filename, geom, and root_set.

Referenced by main().

◆ handle_error_code()

void handle_error_code ( const bool  result,
int &  number_failed,
int &  ,
int &  number_successful 
)

Definition at line 143 of file testgeom.cpp.

144 {
145  if( result )
146  {
147  std::cout << "Success";
148  number_successful++;
149  }
150  else
151  {
152  std::cout << "Failure";
153  number_failed++;
154  }
155 }

Referenced by main().

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 157 of file testgeom.cpp.

158 {
159  std::string filename = STRINGIFY( MESHDIR ) "/shell.h5m";
160  std::string engine_opt;
161 
162  if( argc == 1 )
163  {
164  std::cout << "Using default input file: " << filename << std::endl;
165  }
166  else if( argc == 2 )
167  {
168  filename = argv[1];
169  }
170  else
171  {
172  std::cerr << "Usage: " << argv[0] << " [geom_filename]" << std::endl;
173  return 1;
174  }
175 
176  bool result;
177  int number_tests = 0;
178  int number_tests_successful = 0;
179  int number_tests_not_implemented = 0;
180  int number_tests_failed = 0;
181 
182  // initialize the Mesh
183  int err;
185  FBiGeom_newGeom( engine_opt.c_str(), &geom, &err, engine_opt.length() );
186 
187  // Print out Header information
188  std::cout << "\n\nITAPS GEOMETRY INTERFACE TEST PROGRAM:\n\n";
189  // gLoad test
190  std::cout << " gLoad: ";
191  result = gLoad_test( filename, geom );
192  handle_error_code( result, number_tests_failed, number_tests_not_implemented, number_tests_successful );
193  number_tests++;
194  std::cout << "\n";
195 
196  // tags test
197  std::cout << " tags: ";
198  result = tags_test( geom );
199  handle_error_code( result, number_tests_failed, number_tests_not_implemented, number_tests_successful );
200  number_tests++;
201  std::cout << "\n";
202  /*
203  // gentitysets test
204  std::cout << " gentity sets: ";
205  result = gentityset_test(geom, false, false);
206  handle_error_code(result, number_tests_failed,
207  number_tests_not_implemented,
208  number_tests_successful);
209  number_tests++;
210  std::cout << "\n";
211  */
212  // topology adjacencies test
213  std::cout << " topology adjacencies: ";
214  result = topology_adjacencies_test( geom );
215  handle_error_code( result, number_tests_failed, number_tests_not_implemented, number_tests_successful );
216  number_tests++;
217  std::cout << "\n";
218 
219  // geometry evaluation test
220  std::cout << " geometry evaluation: ";
221  result = geometry_evaluation_test( geom );
222  handle_error_code( result, number_tests_failed, number_tests_not_implemented, number_tests_successful );
223  number_tests++;
224  std::cout << "\n";
225  /*
226  // construct test
227  std::cout << " construct: ";
228  result = construct_test(geom);
229  handle_error_code(result, number_tests_failed,
230  number_tests_not_implemented,
231  number_tests_successful);
232  number_tests++;
233  std::cout << "\n";
234 
235  // primitives test
236  std::cout << " primitives: ";
237  result = primitives_test(geom);
238  handle_error_code(result, number_tests_failed,
239  number_tests_not_implemented,
240  number_tests_successful);
241  number_tests++;
242  std::cout << "\n";
243 
244  // transforms test
245  std::cout << " transforms: ";
246  result = transforms_test(geom);
247  handle_error_code(result, number_tests_failed,
248  number_tests_not_implemented,
249  number_tests_successful);
250  number_tests++;
251  std::cout << "\n";
252 
253  // booleans test
254  std::cout << " booleans: ";
255  result = booleans_test(geom);
256  handle_error_code(result, number_tests_failed,
257  number_tests_not_implemented,
258  number_tests_successful);
259  number_tests++;
260  std::cout << "\n";
261 
262  #if defined(HAVE_ACIS) && !defined(FORCE_OCC)
263  std::cout << " mesh size: ";
264  result = mesh_size_test(geom);
265  handle_error_code(result, number_tests_failed,
266  number_tests_not_implemented,
267  number_tests_successful);
268  number_tests++;
269  std::cout << "\n";
270 
271  // save entset test
272  std::cout << " save entset: ";
273  result = save_entset_test(geom);
274  handle_error_code(result, number_tests_failed,
275  number_tests_not_implemented,
276  number_tests_successful);
277  number_tests++;
278  std::cout << "\n";
279  #endif
280  */
281  // shutdown test
282  std::cout << " shutdown: ";
283  result = shutdown_test( geom, engine_opt );
284  handle_error_code( result, number_tests_failed, number_tests_not_implemented, number_tests_successful );
285  number_tests++;
286  std::cout << "\n";
287 
288  // summary
289 
290  std::cout << "\nTSTT TEST SUMMARY: \n"
291  << " Number Tests: " << number_tests << "\n"
292  << " Number Successful: " << number_tests_successful << "\n"
293  << " Number Not Implemented: " << number_tests_not_implemented << "\n"
294  << " Number Failed: " << number_tests_failed << "\n\n"
295  << std::endl;
296 
297  return number_tests_failed;
298 }

References FBiGeom_newGeom, filename, geom, geometry_evaluation_test(), gLoad_test(), handle_error_code(), number_tests, number_tests_failed, number_tests_successful, shutdown_test(), STRINGIFY, tags_test(), and topology_adjacencies_test().

◆ mesh_size_test()

bool mesh_size_test ( FBiGeom_Instance  geom)

Definition at line 1351 of file testgeom.cpp.

1352 {
1353  const char* filename = STRINGIFY( SRCDIR ) "/size.sat";
1354  int err, junk1, junk2;
1355  bool result = true;
1356 
1357  FBiGeom_deleteAll( geom, &err );
1358  CHECK( "" );
1359  FBiGeom_load( geom, filename, 0, &err, strlen( filename ), 0 );
1360  CHECK( "Failed to load input file: 'size.sat'" );
1361 
1362  // get tag handles
1363  iBase_TagHandle interval, size, firmness, id;
1364  FBiGeom_getTagHandle( geom, "MESH_INTERVAL", &interval, &err, strlen( "MESH_INTERVAL" ) );
1365  CHECK( "FBiGeom_getTagHandle(\"MESH_INTERVAL\")" );
1366  FBiGeom_getTagHandle( geom, "MESH_SIZE", &size, &err, strlen( "MESH_SIZE" ) );
1367  CHECK( "FBiGeom_getTagHandle(\"MESH_SIZE\")" );
1368  FBiGeom_getTagHandle( geom, "SIZE_FIRMNESS", &firmness, &err, strlen( "SIZE_FIRMNESS" ) );
1369  CHECK( "FBiGeom_getTagHandle(\"SIZE_FIRMNESS\")" );
1370  FBiGeom_getTagHandle( geom, "GLOBAL_ID", &id, &err, strlen( "GLOBAL_ID" ) );
1371  CHECK( "FBiGeom_getTagHandle(\"GLOBAL_ID\")" );
1372 
1373  // get entity lists
1374  std::vector< iBase_EntityHandle > verts, curves, surfs, vols;
1375  std::vector< int > vert_ids, curve_ids, surf_ids, vol_ids;
1376  err = get_entities( geom, iBase_VERTEX, verts, id, &vert_ids );
1377  CHECK( "" );
1378  err = get_entities( geom, iBase_EDGE, curves, id, &curve_ids );
1379  CHECK( "" );
1380  err = get_entities( geom, iBase_FACE, surfs, id, &surf_ids );
1381  CHECK( "" );
1382  err = get_entities( geom, iBase_REGION, vols, id, &vol_ids );
1383  CHECK( "" );
1384 
1385  // expect interval count to be the same as ID for every curve
1386  std::vector< int > intervals( curves.size() );
1387  int* int_ptr = &intervals[0];
1388  junk1 = junk2 = curves.size();
1389  FBiGeom_getIntArrData( geom, &curves[0], curves.size(), interval, &int_ptr, &junk1, &junk2, &err );
1390  CHECK( "Failed to get intervals for curves" );
1391  if( intervals != curve_ids )
1392  {
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;
1398  result = false;
1399  }
1400 
1401  // expect size to be the same as ID for every surface
1402  std::vector< double > sizes( surfs.size() );
1403  double* dbl_ptr = &sizes[0];
1404  junk1 = junk2 = surfs.size();
1405  FBiGeom_getDblArrData( geom, &surfs[0], surfs.size(), size, &dbl_ptr, &junk1, &junk2, &err );
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;
1410  if( !all_correct )
1411  {
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;
1417  result = false;
1418  }
1419 
1420  err = result ? iBase_SUCCESS : iBase_FAILURE;
1421  CHECK( "Invalid size or interval data" );
1422 
1423  // expect "HARD" firmness on all curves
1424  err = check_firmness( geom, curves, curve_ids, firmness, "HARD", "curves" );
1425  CHECK( "Invalid curve firmness" );
1426  // expect "SOFT" firmness on all surfaces
1427  err = check_firmness( geom, surfs, surf_ids, firmness, "SOFT", "surfaces" );
1428  CHECK( "Invalid surface firmness" );
1429 
1430  // expect no firmnes on other entities
1431  err = count_num_with_tag( geom, verts, firmness ) ? iBase_FAILURE : iBase_SUCCESS;
1432  CHECK( "Got firmness for vertex." );
1433  err = count_num_with_tag( geom, vols, firmness ) ? iBase_FAILURE : iBase_SUCCESS;
1434  CHECK( "Got firmness for volume." );
1435 
1436  // expect no interval tag on any entities except curves
1437  err = count_num_with_tag( geom, verts, interval ) ? iBase_FAILURE : iBase_SUCCESS;
1438  CHECK( "Got interval count for vertex." );
1439  err = count_num_with_tag( geom, vols, interval ) ? iBase_FAILURE : iBase_SUCCESS;
1440  CHECK( "Got interval count for volume." );
1441 
1442  // expect no size tag on any entities except surfaces
1443  // curves should have size of one of their parent surfaces
1445  CHECK( "Got mesh size for vertex." );
1447  CHECK( "Got mesh size for volume." );
1448 
1449  return true;
1450 }

References CHECK, check_firmness(), count_num_with_tag(), FBiGeom_deleteAll, FBiGeom_getDblArrData, FBiGeom_getIntArrData, FBiGeom_getTagHandle, FBiGeom_load, filename, geom, get_entities(), iBase_EDGE, iBase_FACE, iBase_FAILURE, iBase_REGION, iBase_SUCCESS, iBase_VERTEX, size, sizes, and STRINGIFY.

◆ primitives_test()

bool primitives_test ( FBiGeom_Instance  geom)

Definition at line 1102 of file testgeom.cpp.

1103 {
1104  int err;
1106  iBase_EntityHandle prim;
1107 
1108  FBiGeom_createBrick( geom, 1.0, 2.0, 3.0, &prim, &err );
1109  CHECK( "createBrick failed." );
1110  prims[0] = prim;
1111 
1112  FBiGeom_createCylinder( geom, 1.0, 4.0, 2.0, &prim, &err );
1113  CHECK( "createCylinder failed." );
1114  prims[1] = prim;
1115 
1116  FBiGeom_createTorus( geom, 2.0, 1.0, &prim, &err );
1117  CHECK( "createTorus failed." );
1118  prims[2] = prim;
1119 
1120  // verify the bounding boxes for Acis based entities
1121  SimpleArray< double > max_corn, min_corn;
1123  ARRAY_INOUT( max_corn ), &err );
1124 
1125  double preset_min_corn[] =
1126  // min brick corner xyz
1127  { -0.5, -1.0, -1.5,
1128  // min cyl corner xyz
1129  -4.0, -2.0, -0.5,
1130  // min torus corner xyz
1131  -3.0, -3.0, -1.0 };
1132 
1133  double preset_max_corn[] =
1134  // max brick corner xyz
1135  { 0.5, 1.0, 1.5,
1136  // max cyl corner xyz
1137  4.0, 2.0, 0.5,
1138  // max torus corner xyz
1139  3.0, 3.0, 1.0 };
1140 
1141  if( !compare_box( preset_min_corn, preset_max_corn, &min_corn[0], &max_corn[0] ) )
1142  {
1143  std::cerr << "Box check failed for brick" << std::endl;
1144  return false;
1145  }
1146 
1147  if( !compare_box( preset_min_corn + 3, preset_max_corn + 3, &min_corn[3], &max_corn[3] ) )
1148  {
1149  std::cerr << "Box check failed for cylinder" << std::endl;
1150  return false;
1151  }
1152 
1153  if( !compare_box( preset_min_corn + 6, preset_max_corn + 6, &min_corn[6], &max_corn[6] ) )
1154  {
1155  std::cerr << "Box check failed for torus" << std::endl;
1156  return false;
1157  }
1158  // must have worked; delete the entities then return
1159  for( int i = 0; i < 3; ++i )
1160  {
1161  FBiGeom_deleteEnt( geom, prims[i], &err );
1162  CHECK( "Problems deleting primitive after boolean check." );
1163  }
1164 
1165  return true;
1166 }

References ARRAY_IN, ARRAY_INOUT, CHECK, compare_box(), FBiGeom_createBrick, FBiGeom_createCylinder, FBiGeom_createTorus, FBiGeom_deleteEnt, FBiGeom_getArrBoundBox, geom, and iBase_INTERLEAVED.

◆ print_error()

static bool print_error ( const char *  desc,
int  err,
FBiGeom_Instance  geom,
const char *  file,
int  line 
)
static

Definition at line 31 of file testgeom.cpp.

32 {
33  char buffer[1024];
35  buffer[sizeof( buffer ) - 1] = '\0';
36 
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;
41 
42  return false; // must always return false or CHECK macro will break
43 }

References buffer, FBiGeom_getDescription, and geom.

Referenced by save_entset_test().

◆ save_entset_test()

bool save_entset_test ( FBiGeom_Instance  geom)

Definition at line 1469 of file testgeom.cpp.

1470 {
1471  int err;
1472 
1473 #ifdef FORCE_OCC
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";
1479 #else
1480  std::string filename = "testout.sat";
1481 #endif
1482 
1483  // initialize number of ents and sets to compare with later
1484  int num_ents_bef, num_sets_bef;
1485  iBase_EntitySetHandle root;
1486  FBiGeom_getRootSet( geom, &root, &err );
1487  CHECK( "Failed to get root set." );
1488  FBiGeom_getNumEntSets( geom, root, 1, &num_sets_bef, &err );
1489  CHECK( "Failed to get number of ent sets." );
1490  FBiGeom_getNumOfType( geom, root, iBase_REGION, &num_ents_bef, &err );
1491  CHECK( "Failed to get number of entities." );
1492 
1493  // create set, and entity to add to set
1494  iBase_EntityHandle cyl;
1495  FBiGeom_createCylinder( geom, 1.0, 0.25, 0.0, &cyl, &err );
1496  CHECK( "Problems creating cylinder for save entset test." );
1497  iBase_EntitySetHandle seth;
1498  FBiGeom_createEntSet( geom, true, &seth, &err );
1499  CHECK( "Problems creating entity set for save entset test." );
1500 
1501  // add the entity
1502  FBiGeom_addEntToSet( geom, cyl, seth, &err );
1503  CHECK( "Problems adding entity to set for save entset test." );
1504 
1505  // save/restore the model, and see if the entity is there
1506  FBiGeom_save( geom, filename.c_str(), NULL, &err, filename.length(), 0 );
1507  CHECK( "Problems saving file for save entset test." );
1508 
1509  FBiGeom_destroyEntSet( geom, seth, &err );
1510  CHECK( "Failed to destroy entity set." );
1511  FBiGeom_deleteEnt( geom, cyl, &err );
1512  CHECK( "Failed to destroy entity." );
1513 
1514  // read the file back in
1515  FBiGeom_load( geom, filename.c_str(), NULL, &err, filename.length(), 0 );
1516  CHECK( "Problems reading file for save entset test." );
1517 
1518  // check number of sets and entities
1519  int num_ents_aft, num_sets_aft;
1520  FBiGeom_getNumEntSets( geom, root, 1, &num_sets_aft, &err );
1521  CHECK( "Failed to get number of ent sets." );
1522  FBiGeom_getNumOfType( geom, root, iBase_REGION, &num_ents_aft, &err );
1523  CHECK( "Failed to get number of entities." );
1524  bool success = true;
1525  if( num_ents_aft != 2 * num_ents_bef + 1 )
1526  {
1527  print_error( "Failed to get the right number of entities.", iBase_FAILURE, geom, __FILE__, __LINE__ );
1528  success = false;
1529  }
1530  else if( num_sets_aft != 2 * num_sets_bef + 1 )
1531  {
1532  print_error( "Failed to get the right number of entity sets.", iBase_FAILURE, geom, __FILE__, __LINE__ );
1533  success = false;
1534  }
1535 
1536  // otherwise, we succeeded
1537  return success;
1538 }

References CHECK, FBiGeom_addEntToSet, FBiGeom_createCylinder, FBiGeom_createEntSet, FBiGeom_deleteEnt, FBiGeom_destroyEntSet, FBiGeom_getNumEntSets, FBiGeom_getNumOfType, FBiGeom_getRootSet, FBiGeom_load, FBiGeom_save, filename, geom, iBase_FAILURE, iBase_REGION, and print_error().

◆ shutdown_test()

bool shutdown_test ( FBiGeom_Instance  geom,
std::string &  engine_opt 
)

Definition at line 1452 of file testgeom.cpp.

1453 {
1454  int err;
1455 
1456  // test shutdown & startup of interface
1457  FBiGeom_dtor( geom, &err );
1458  CHECK( "Interface destruction didn't work properly." );
1459 
1460  FBiGeom_newGeom( engine_opt.c_str(), &geom, &err, engine_opt.length() );
1461  CHECK( "Interface re-construction didn't work properly." );
1462 
1463  FBiGeom_dtor( geom, &err );
1464  CHECK( "2nd Interface destruction didn't work properly." );
1465 
1466  return true;
1467 }

References CHECK, FBiGeom_dtor, FBiGeom_newGeom, and geom.

Referenced by main().

◆ tag_get_set_test()

bool tag_get_set_test ( FBiGeom_Instance  geom)

Definition at line 440 of file testgeom.cpp.

441 {
442  int err;
443 
444  // create an arbitrary tag, size 4
445  iBase_TagHandle this_tag;
446  std::string tag_name( "tag_get_set tag" );
447  FBiGeom_createTag( geom, &tag_name[0], sizeof( int ), iBase_BYTES, &this_tag, &err, tag_name.length() );
448  CHECK( "ERROR : can not create a tag for get_set test." );
449 
451  FBiGeom_getRootSet( geom, &root_set, &err );
452  CHECK( "ERROR : getRootSet failed!" );
453 
454  // set this tag to an integer on each entity; keep track of total sum
455  int sum = 0, num = 0, dim;
456  for( dim = 0; dim <= 3; dim++ )
457  {
458  SimpleArray< iBase_EntityHandle > gentity_handles;
459  FBiGeom_getEntities( geom, root_set, dim, ARRAY_INOUT( gentity_handles ), &err );
460  int num_ents = gentity_handles.size();
461  std::vector< int > tag_vals( num_ents );
462  for( int i = 0; i < num_ents; ++i )
463  {
464  tag_vals[i] = num;
465  sum += num;
466  ++num;
467  }
468 
469  FBiGeom_setArrData( geom, ARRAY_IN( gentity_handles ), this_tag, (char*)&tag_vals[0],
470  tag_vals.size() * sizeof( int ), &err );
471  CHECK( "ERROR : can't set tag on entities" );
472  }
473 
474  // check tag values for entities now
475  int get_sum = 0;
476  for( dim = 0; dim <= 3; dim++ )
477  {
478  SimpleArray< iBase_EntityHandle > gentity_handles;
479  FBiGeom_getEntities( geom, root_set, dim, ARRAY_INOUT( gentity_handles ), &err );
480  int num_ents = gentity_handles.size();
481 
482  SimpleArray< char > tag_vals;
483  FBiGeom_getArrData( geom, ARRAY_IN( gentity_handles ), this_tag, (void**)tag_vals.ptr(), &tag_vals.capacity(),
484  &tag_vals.size(), &err );
485  CHECK( "ERROR : can't get tag on entities" );
486 
487  int* tag_ptr = (int*)( &tag_vals[0] );
488  for( int i = 0; i < num_ents; ++i )
489  get_sum += tag_ptr[i];
490  }
491 
492  if( get_sum != sum )
493  {
494  std::cerr << "ERROR: getData didn't return consistent results." << std::endl;
495  return false;
496  }
497 
498  FBiGeom_destroyTag( geom, this_tag, true, &err );
499  CHECK( "ERROR : couldn't delete tag." );
500 
501  return true;
502 }

References ARRAY_IN, ARRAY_INOUT, SimpleArray< T >::capacity(), CHECK, dim, FBiGeom_createTag, FBiGeom_destroyTag, FBiGeom_getArrData, FBiGeom_getEntities, FBiGeom_getRootSet, FBiGeom_setArrData, geom, iBase_BYTES, SimpleArray< T >::ptr(), root_set, SimpleArray< T >::size(), and moab::sum().

Referenced by tags_test().

◆ tag_info_test()

bool tag_info_test ( FBiGeom_Instance  geom)

Definition at line 345 of file testgeom.cpp.

346 {
347  int err;
348 
350  FBiGeom_getRootSet( geom, &root_set, &err );
351  CHECK( "ERROR : getRootSet failed!" );
352 
353  // create an arbitrary tag, size 4
354  iBase_TagHandle this_tag, tmp_handle;
355  std::string tag_name( "tag_info tag" ), tmp_name;
356  FBiGeom_createTag( geom, &tag_name[0], 4, iBase_BYTES, &this_tag, &err, tag_name.length() );
357  CHECK( "ERROR : can not create a tag." );
358 
359  // get information on the tag
360 
361  char name_buffer[256];
362  FBiGeom_getTagName( geom, this_tag, name_buffer, &err, sizeof( name_buffer ) );
363  CHECK( "ERROR : Couldn't get tag name." );
364  if( tag_name != name_buffer )
365  {
366  std::cerr << "ERROR: getTagName returned '" << name_buffer << "' for tag created as '" << tag_name << "'"
367  << std::endl;
368  return false;
369  }
370 
371  FBiGeom_getTagHandle( geom, &tag_name[0], &tmp_handle, &err, tag_name.length() );
372  CHECK( "ERROR : Couldn't get tag handle." );
373  if( tmp_handle != this_tag )
374  {
375  std::cerr << "ERROR: getTagHandle didn't return consistent result." << std::endl;
376  return false;
377  }
378 
379  int tag_size;
380  FBiGeom_getTagSizeBytes( geom, this_tag, &tag_size, &err );
381  CHECK( "ERROR : Couldn't get tag size." );
382  if( tag_size != 4 )
383  {
384  std::cerr << "ERROR: getTagSizeBytes: expected 4, got " << tag_size << std::endl;
385  return false;
386  }
387 
388  FBiGeom_getTagSizeValues( geom, this_tag, &tag_size, &err );
389  CHECK( "ERROR : Couldn't get tag size." );
390  if( tag_size != 4 )
391  {
392  std::cerr << "ERROR: getTagSizeValues: expected 4, got " << tag_size << std::endl;
393  return false;
394  }
395 
396  int tag_type;
397  FBiGeom_getTagType( geom, this_tag, &tag_type, &err );
398  CHECK( "ERROR : Couldn't get tag type." );
399  if( tag_type != iBase_BYTES )
400  {
401  std::cerr << "ERROR: getTagType: expected " << iBase_BYTES << ", got " << tag_type << std::endl;
402  return false;
403  }
404 
405  FBiGeom_destroyTag( geom, this_tag, true, &err );
406  CHECK( "ERROR : Couldn't delete a tag." );
407 
408  // print information about all the tags in the model
409 
410  std::set< iBase_TagHandle > tags;
413  CHECK( "getEntities( ..., iBase_ALL_TYPES, ... ) failed." );
414  for( int i = 0; i < entities.size(); ++i )
415  {
417  FBiGeom_getAllTags( geom, entities[i], ARRAY_INOUT( tag_arr ), &err );
418  CHECK( "getAllTags failed." );
419  std::copy( tag_arr.begin(), tag_arr.end(), std::inserter( tags, tags.begin() ) );
420  }
421 
422  std::cout << "Tags defined on model: ";
423  bool first = true;
424  for( std::set< iBase_TagHandle >::iterator sit = tags.begin(); sit != tags.end(); ++sit )
425  {
426  FBiGeom_getTagName( geom, *sit, name_buffer, &err, sizeof( name_buffer ) );
427  name_buffer[sizeof( name_buffer ) - 1] = '\0'; // mnake sure of NUL termination
428  CHECK( "getTagName failed." );
429 
430  if( !first ) std::cout << ", ";
431  std::cout << name_buffer;
432  first = false;
433  }
434  if( first ) std::cout << "<none>";
435  std::cout << std::endl;
436 
437  return true;
438 }

References ARRAY_INOUT, SimpleArray< T >::begin(), CHECK, SimpleArray< T >::end(), entities, FBiGeom_createTag, FBiGeom_destroyTag, FBiGeom_getAllTags, FBiGeom_getEntities, FBiGeom_getRootSet, FBiGeom_getTagHandle, FBiGeom_getTagName, FBiGeom_getTagSizeBytes, FBiGeom_getTagSizeValues, FBiGeom_getTagType, moab::GeomUtil::first(), geom, iBase_ALL_TYPES, iBase_BYTES, and root_set.

Referenced by tags_test().

◆ tags_test()

bool tags_test ( FBiGeom_Instance  geom)
Test:
Test tag creating, reading, writing, deleting
  • Load a mesh file
Test:
Test tag creating, reading, writing, deleting
  • Load a mesh file
Test:
Test tag creating, reading, writing, deleting
  • Load a mesh file

Definition at line 334 of file testgeom.cpp.

335 {
336  bool success = tag_info_test( geom );
337  if( !success ) return success;
338 
339  success = tag_get_set_test( geom );
340  if( !success ) return success;
341 
342  return true;
343 }

References geom, tag_get_set_test(), and tag_info_test().

Referenced by main().

◆ topology_adjacencies_test()

bool topology_adjacencies_test ( FBiGeom_Instance  geom)
Test:
TSTTG topology adjacencies Test
  • Check topology information
  • Check adjacency
Test:
TSTTG topology adjacencies Test
  • Check topology information
  • Check adjacency
Test:
TSTTG topology adjacencies Test
  • Check topology information
  • Check adjacency

Definition at line 890 of file testgeom.cpp.

891 {
892  int i, err;
894  FBiGeom_getRootSet( geom, &root_set, &err );
895  CHECK( "ERROR : getRootSet failed!" );
896 
897  int top = iBase_VERTEX;
898  int num_test_top = iBase_ALL_TYPES;
899  std::vector< std::vector< iBase_EntityHandle > > gentity_vectors( num_test_top );
900 
901  // fill the vectors of each topology entities
902  // like lines vector, polygon vector, triangle vector,
903  // quadrilateral, polyhedrron, tet, hex, prism, pyramid,
904  // septahedron vectors
905  for( i = top; i < num_test_top; i++ )
906  {
908  FBiGeom_getEntities( geom, root_set, i, ARRAY_INOUT( gentities ), &err );
909  CHECK( "Failed to get gentities in adjacencies_test." );
910 
911  gentity_vectors[i].resize( gentities.size() );
912  std::copy( gentities.begin(), gentities.end(), gentity_vectors[i].begin() );
913  }
914 
915  // check number of entities for each topology
916  for( i = top; i < num_test_top; i++ )
917  {
918  int num_tops = 0;
919  FBiGeom_getNumOfType( geom, root_set, i, &num_tops, &err );
920  CHECK( "Failed to get number of gentities in adjacencies_test." );
921 
922  if( static_cast< int >( gentity_vectors[i].size() ) != num_tops )
923  {
924  std::cerr << "Number of gentities doesn't agree with number returned for dimension " << i << std::endl;
925  return false;
926  }
927  }
928 
929  // check adjacencies in both directions
930  std::vector< iBase_EntityHandle >::iterator vit;
931  for( i = iBase_REGION; i >= iBase_VERTEX; i-- )
932  {
933  for( vit = gentity_vectors[i].begin(); vit != gentity_vectors[i].end(); ++vit )
934  {
935  iBase_EntityHandle this_gent = *vit;
936 
937  // check downward adjacencies
938  for( int j = iBase_VERTEX; j < i; j++ )
939  {
940 
942  FBiGeom_getEntAdj( geom, this_gent, j, ARRAY_INOUT( lower_ents ), &err );
943  CHECK( "Bi-directional adjacencies test failed." );
944 
945  // for each of them, make sure they are adjacent to the upward ones
946  int num_lower = lower_ents.size();
947  for( int k = 0; k < num_lower; k++ )
948  {
950  FBiGeom_getEntAdj( geom, lower_ents[k], i, ARRAY_INOUT( upper_ents ), &err );
951  CHECK( "Bi-directional adjacencies test failed." );
952  if( std::find( upper_ents.begin(), upper_ents.end(), this_gent ) == upper_ents.end() )
953  {
954  std::cerr << "Didn't find lower-upper adjacency which was supposed to be "
955  "there, dims = "
956  << i << ", " << j << std::endl;
957  return false;
958  }
959  }
960  }
961  }
962  }
963 
964  return true;
965 }

References ARRAY_INOUT, SimpleArray< T >::begin(), CHECK, SimpleArray< T >::end(), FBiGeom_getEntAdj, FBiGeom_getEntities, FBiGeom_getNumOfType, FBiGeom_getRootSet, geom, iBase_ALL_TYPES, iBase_REGION, iBase_VERTEX, root_set, SimpleArray< T >::size(), and size.

Referenced by main().

◆ transforms_test()

bool transforms_test ( FBiGeom_Instance  geom)

Definition at line 1168 of file testgeom.cpp.

1169 {
1170  int err;
1171 
1172  // construct a brick
1173  iBase_EntityHandle brick = 0;
1174  FBiGeom_createBrick( geom, 1.0, 2.0, 3.0, &brick, &err );
1175  CHECK( "Problems creating brick for transforms test." );
1176 
1177  // move it, then test bounding box
1178  FBiGeom_moveEnt( geom, brick, 0.5, 1.0, 1.5, &err );
1179  CHECK( "Problems moving brick for transforms test." );
1180 
1181  double bb_min[3], bb_max[3];
1182  FBiGeom_getEntBoundBox( geom, brick, bb_min, bb_min + 1, bb_min + 2, bb_max, bb_max + 1, bb_max + 2, &err );
1183  CHECK( "Problems getting bounding box after move." );
1184 
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 )
1189  {
1190  std::cerr << "Wrong bounding box after move." << std::endl;
1191  return false;
1192  }
1193 
1194  // now rotate it about +x, then test bounding box
1195  FBiGeom_rotateEnt( geom, brick, 90, 1.0, 0.0, 0.0, &err );
1196  CHECK( "Problems rotating brick for transforms test." );
1197 
1198  FBiGeom_getEntBoundBox( geom, brick, bb_min, bb_min + 1, bb_min + 2, bb_max, bb_max + 1, bb_max + 2, &err );
1199  CHECK( "Problems getting bounding box after rotate." );
1200 
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 )
1204  {
1205  std::cerr << "Wrong bounding box after rotate." << std::endl;
1206  return false;
1207  }
1208 
1209  // now reflect through y plane; should recover original bb
1210  FBiGeom_reflectEnt( geom, brick, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, &err );
1211  CHECK( "Problems reflecting brick for transforms test." );
1212 
1213  FBiGeom_getEntBoundBox( geom, brick, bb_min, bb_min + 1, bb_min + 2, bb_max, bb_max + 1, bb_max + 2, &err );
1214  CHECK( "Problems getting bounding box after reflect." );
1215 
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 )
1219  {
1220  std::cerr << "Wrong bounding box after reflect." << std::endl;
1221  return false;
1222  }
1223 
1224  // must have worked; delete the entities then return
1225  FBiGeom_deleteEnt( geom, brick, &err );
1226  CHECK( "Problems deleting brick after transforms check." );
1227  return true;
1228 }

References CHECK, FBiGeom_createBrick, FBiGeom_deleteEnt, FBiGeom_getEntBoundBox, FBiGeom_moveEnt, FBiGeom_reflectEnt, FBiGeom_rotateEnt, and geom.