|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
test mbfacet, a unit test for the FBEngine class, which is providing iGeom like methods to a MOAB db More...
#include "moab/Core.hpp"#include <iostream>#include <fstream>#include <set>#include <algorithm>#include <vector>#include <iterator>#include <iomanip>#include <cassert>#include <cstring>#include <cmath>#include "moab/FBEngine.hpp"#include "moab/GeomTopoTool.hpp"#include "TestUtil.hpp"
Include dependency graph for mbfacet_test.cpp:Go to the source code of this file.
Functions | |
| ErrorCode | root_set_test (FBEngine *pFacet) |
| ErrorCode | gentityset_test (FBEngine *pFacet) |
| ErrorCode | geometry_evaluation_test (FBEngine *pFacet) |
| ErrorCode | normals_test (FBEngine *pFacet) |
| ErrorCode | ray_test (FBEngine *pFacet) |
| ErrorCode | split_test (Interface *mb, FBEngine *pFacet) |
| ErrorCode | check_split (Interface *mb) |
| ErrorCode | split_quads_test () |
| void | handle_error_code (ErrorCode rv, int &number_failed, int &number_successful) |
| int | main (int argc, char *argv[]) |
Variables | |
| std::string | filename |
| std::string | filename_out |
| std::string | polygon_file_name |
| std::string | quads_file |
| double | min_dot = 0.8 |
| bool | keep_output |
| int | number_tests_successful = 0 |
| int | number_tests_failed = 0 |
test mbfacet, a unit test for the FBEngine class, which is providing iGeom like methods to a MOAB db
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
Definition in file mbfacet_test.cpp.
| ErrorCode check_split | ( | Interface * | mb | ) |
Definition at line 527 of file mbfacet_test.cpp.
References moab::Interface::delete_mesh(), ErrorCode, filename_out, gentityset_test(), geometry_evaluation_test(), handle_error_code(), moab::FBEngine::Init(), moab::Interface::load_file(), MB_CHK_SET_ERR, MB_SUCCESS, normals_test(), number_tests_failed, number_tests_successful, ray_test(), and root_set_test().
Referenced by main().
{
// check loading the file in an empty db
// delete pFacet;// should clean up the FBEngine
ErrorCode rval = mb->delete_mesh();MB_CHK_SET_ERR( rval, "ERROR : delete mesh failed!" );
rval = mb->load_file( filename_out.c_str() );MB_CHK_SET_ERR( rval, "ERROR : can't load modified file!" );
FBEngine* pFacet = new FBEngine( mb, NULL, true ); // smooth facetting, no OBB tree passed
// repeat tests on modified file
// should the init be part of constructor or not?
// this is where the obb tree is constructed, and smooth faceting initialized, too.
rval = pFacet->Init();MB_CHK_SET_ERR( rval, "failed to initialize smoothing" );
std::cout << "root set test: ";
rval = root_set_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "gentity set test: ";
rval = gentityset_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "geometry evals test: ";
rval = geometry_evaluation_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "normal evals test: ";
rval = normals_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "ray test: ";
rval = ray_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
delete pFacet;
pFacet = NULL;
if( number_tests_failed > 0 ) return MB_FAILURE;
return MB_SUCCESS;
}
| ErrorCode gentityset_test | ( | FBEngine * | pFacet | ) |
Definition at line 188 of file mbfacet_test.cpp.
References moab::FBEngine::addEntArrToSet(), moab::FBEngine::addEntSet(), moab::FBEngine::createEntSet(), ErrorCode, moab::FBEngine::getEntities(), moab::FBEngine::getNumEntSets(), moab::FBEngine::getNumOfType(), moab::FBEngine::getRootSet(), moab::FBEngine::gsubtract(), MB_CHK_SET_ERR, MB_SUCCESS, root_set, and moab::Range::size().
{
int num_type = 4;
EntityHandle ges_array[4];
int number_array[4];
// int num_all_gentities_super = 0;
int ent_type = 0; // iBase_VERTEX;
EntityHandle root_set;
ErrorCode rval = pFacet->getRootSet( &root_set );MB_CHK_SET_ERR( rval, "ERROR : getRootSet failed!" );
// get the number of sets in the whole model
int all_sets = 0;
rval = pFacet->getNumEntSets( root_set, 0, &all_sets );MB_CHK_SET_ERR( rval, "Problem getting the number of all gentity sets in whole model." ); // why do we
// count all sets
// add gentities to entitysets by type
for( ; ent_type < num_type; ent_type++ )
{
// initialize the entityset
rval = pFacet->createEntSet( 1, &ges_array[ent_type] ); // 1 means isList, ordered
MB_CHK_SET_ERR( rval, "Problem creating entityset." );
// get entities by type in total "mesh"
Range gentities;
rval = pFacet->getEntities( root_set, ent_type, gentities );MB_CHK_SET_ERR( rval, "Failed to get gentities by type in gentityset_test." );
// add gentities into gentity set
rval = pFacet->addEntArrToSet( gentities, ges_array[ent_type] );MB_CHK_SET_ERR( rval, "Failed to add gentities in entityset_test." );
// Check to make sure entity set really has correct number of entities in it
rval = pFacet->getNumOfType( ges_array[ent_type], ent_type, &number_array[ent_type] );MB_CHK_SET_ERR( rval, "Failed to get number of gentities by type in entityset_test." );
// compare the number of entities by type
int num_type_gentity = gentities.size();
if( number_array[ent_type] != num_type_gentity )
{
std::cerr << "Number of gentities by type is not correct" << std::endl;
return MB_FAILURE;
}
// add to number of all entities in super set
// num_all_gentities_super += num_type_gentity;
}
// make a super set having all entitysets
EntityHandle super_set;
rval = pFacet->createEntSet( 1, &super_set ); // 1 is list
MB_CHK_SET_ERR( rval, "Failed to create a super set in gentityset_test." );
for( int i = 0; i < num_type; i++ )
{
rval = pFacet->addEntSet( ges_array[i], super_set );MB_CHK_SET_ERR( rval, "Failed to create a super set in gentityset_test." );
}
//----------TEST BOOLEAN OPERATIONS----------------//
EntityHandle temp_ges1;
rval = pFacet->createEntSet( 1, &temp_ges1 );MB_CHK_SET_ERR( rval, "Failed to create a super set in gentityset_test." );
// Subtract
// add all EDGEs and FACEs to temp_es1
// get all EDGE entities
Range gedges, gfaces, temp_gentities1;
rval = pFacet->getEntities( ges_array[1], /* iBase_EDGE*/ 1, gedges );MB_CHK_SET_ERR( rval, "Failed to get gedge gentities in gentityset_test." );
// add EDGEs to ges1
rval = pFacet->addEntArrToSet( gedges, temp_ges1 );MB_CHK_SET_ERR( rval, "Failed to add gedge gentities in gentityset_test." );
// get all FACE gentities
rval = pFacet->getEntities( ges_array[2], /*iBase_FACE*/ 2, gfaces );MB_CHK_SET_ERR( rval, "Failed to get gface gentities in gentityset_test." );
// add FACEs to es1
rval = pFacet->addEntArrToSet( gfaces, temp_ges1 );MB_CHK_SET_ERR( rval, "Failed to add gface gentities in gentityset_test." );
// subtract EDGEs
rval = pFacet->gsubtract( temp_ges1, ges_array[1], temp_ges1 );MB_CHK_SET_ERR( rval, "Failed to subtract gentitysets in gentityset_test." );
rval = pFacet->getEntities( temp_ges1, 2, temp_gentities1 );MB_CHK_SET_ERR( rval, "Failed to get gface gentities in gentityset_test." );
if( gfaces.size() != temp_gentities1.size() )
{
std::cerr << "Number of entitysets after subtraction not correct \
in gentityset_test."
<< std::endl;
return MB_FAILURE;
}
// check there's nothing but gfaces in temp_ges1
int num_gents;
rval = pFacet->getNumOfType( temp_ges1, 1, &num_gents );MB_CHK_SET_ERR( rval, "Failed to get dimensions of gentities in gentityset_test." );
if( 0 != num_gents )
{
std::cerr << "Subtraction failed to remove all edges" << std::endl;
return MB_FAILURE;
}
return MB_SUCCESS;
}
| ErrorCode geometry_evaluation_test | ( | FBEngine * | pFacet | ) |
Definition at line 289 of file mbfacet_test.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::FBEngine::getEntBoundBox(), moab::FBEngine::getEntClosestPt(), moab::FBEngine::getEntities(), moab::FBEngine::getEntUtoXYZ(), moab::FBEngine::getRootSet(), MB_CHK_SET_ERR, MB_SUCCESS, root_set, and moab::Range::size().
{
int i;
EntityHandle root_set;
ErrorCode rval = pFacet->getRootSet( &root_set );MB_CHK_SET_ERR( rval, "ERROR : getRootSet failed!" );
int top = 0; // iBase_VERTEX;
int num_test_top = 4; // iBase_ALL_TYPES;
std::vector< std::vector< EntityHandle > > gentity_vectors( num_test_top );
// fill the vectors of each topology entities
//
for( i = top; i < num_test_top; i++ )
{
Range gentities;
rval = pFacet->getEntities( root_set, i, gentities );MB_CHK_SET_ERR( rval, "Failed to get gentities in eval tests." );
gentity_vectors[i].resize( gentities.size() );
std::copy( gentities.begin(), gentities.end(), gentity_vectors[i].begin() );
}
// check geometries in both directions
double min[3], max[3], on[3];
double near[3] = { .0, .0, .0 };
std::vector< EntityHandle >::iterator vit;
/*for (i = iBase_REGION; i >= iBase_VERTEX; i--) {
if (i != iBase_EDGE) {*/
for( i = 3; i >= 0; i-- )
{
if( i != 1 )
{
for( vit = gentity_vectors[i].begin(); vit != gentity_vectors[i].end(); ++vit )
{
EntityHandle this_gent = *vit;
rval = pFacet->getEntBoundBox( this_gent, &min[0], &min[1], &min[2], &max[0], &max[1], &max[2] );MB_CHK_SET_ERR( rval, "Failed to get bounding box of entity." );
for( int j = 0; j < 3; j++ )
near[j] = ( min[j] + max[j] ) / 2.;
rval = pFacet->getEntClosestPt( this_gent, near[0], near[1], near[2], &on[0], &on[1], &on[2] );MB_CHK_SET_ERR( rval, "Failed to get closest point on entity." );
}
}
else
{
// for edges, provide a little better help
for( vit = gentity_vectors[i].begin(); vit != gentity_vectors[i].end(); ++vit )
{
EntityHandle this_gent = *vit;
// we know that the edge is parametric, with par between 0 and 1
// some random parameter
rval = pFacet->getEntUtoXYZ( this_gent, 0.33, near[0], near[1], near[2] );MB_CHK_SET_ERR( rval, "Failed to get a new point" );
std::cout << " entity of type " << i << " position:\n " << near[0] << " " << near[1] << " " << near[2]
<< "\n";
rval = pFacet->getEntClosestPt( this_gent, near[0], near[1], near[2], &on[0], &on[1], &on[2] );MB_CHK_SET_ERR( rval, "Failed to get closest point on entity." );
std::cout << " close by: " << on[0] << " " << on[1] << " " << on[2] << "\n";
}
}
}
return MB_SUCCESS;
}
| void handle_error_code | ( | ErrorCode | rv, |
| int & | number_failed, | ||
| int & | number_successful | ||
| ) |
Definition at line 55 of file mbfacet_test.cpp.
References MB_SUCCESS.
{
if( rv == MB_SUCCESS )
{
std::cout << "Success";
number_successful++;
}
else
{
std::cout << "Failure";
number_failed++;
}
}
| int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Definition at line 69 of file mbfacet_test.cpp.
References check_split(), ErrorCode, filename, filename_out, gentityset_test(), geometry_evaluation_test(), handle_error_code(), moab::FBEngine::Init(), keep_output, moab::Interface::load_file(), mb, MB_CHK_SET_ERR, mbcore, min_dot, normals_test(), number_tests_failed, number_tests_successful, polygon_file_name, quads_file, ray_test(), root_set_test(), split_quads_test(), and split_test().
{
filename = TestDir + "unittest/PB.h5m";
polygon_file_name = TestDir + "unittest/polyPB.txt";
filename_out = "PB_facet.h5m";
quads_file = TestDir + "unittest/quads.h5m";
min_dot = 0.8;
keep_output = false;
bool only_cropping = false;
if( argc == 1 )
{
std::cout << "Using default input files: " << filename << " " << polygon_file_name << " " << filename_out << " "
<< min_dot << " " << quads_file << std::endl;
std::cout << " default output file: " << filename_out << " will be deleted \n";
}
else if( argc == 5 )
{
only_cropping = true;
filename = argv[1];
polygon_file_name = argv[2];
filename_out = argv[3];
min_dot = atof( argv[4] );
}
else if( argc >= 6 )
{
filename = argv[1];
polygon_file_name = argv[2];
filename_out = argv[3];
min_dot = atof( argv[4] );
quads_file = argv[5];
keep_output = true;
std::cout << "Using input files: " << filename << " " << polygon_file_name << " " << std::endl;
std::cout << " default output file: " << filename_out << " will be saved \n";
std::cout << " min_dot: " << min_dot << " quads file:" << quads_file << "\n";
}
else
{
std::cerr << "Usage: " << argv[0] << " [geom_filename] [polygon_file] [output_file] [min_dot] [quads_file]"
<< std::endl;
return 1;
}
Core mbcore;
Interface* mb = &mbcore;
ErrorCode rval = mb->load_file( filename.c_str() );MB_CHK_SET_ERR( rval, "failed to load input file" );
FBEngine* pFacet = new FBEngine( mb, NULL, true ); // smooth facetting, no OBB tree passed
if( !pFacet ) return 1; // error
// should the init be part of constructor or not?
// this is where the obb tree is constructed, and smooth faceting initialized, too.
rval = pFacet->Init();MB_CHK_SET_ERR( rval, "failed to initialize smoothing" );
std::cout << "root set test: ";
rval = root_set_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "gentity set test: ";
rval = gentityset_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "geometry evals test: ";
rval = geometry_evaluation_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "normal evals test: ";
rval = normals_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "ray test: ";
rval = ray_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "split with loop test ";
rval = split_test( mb, pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
// pFacet has been deleted in split_test(), so we should mark it as NULL
// Setting pFacet (value parameter) to NULL in split_test() does not work
pFacet = NULL;
std::cout << " check split: ";
rval = check_split( mb );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
if( only_cropping ) return number_tests_failed; // we do not remove the output file, either
std::cout << " split quads test: ";
rval = split_quads_test();
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
// when we are done, remove modified file if we want to
if( !keep_output )
{
remove( filename_out.c_str() );
}
return number_tests_failed;
}
| ErrorCode normals_test | ( | FBEngine * | pFacet | ) |
Definition at line 355 of file mbfacet_test.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::FBEngine::getEntBoundBox(), moab::FBEngine::getEntities(), moab::FBEngine::getEntNrmlXYZ(), moab::FBEngine::getRootSet(), MB_CHK_SET_ERR, MB_SUCCESS, root_set, and moab::Range::size().
{
int i;
EntityHandle root_set;
ErrorCode rval = pFacet->getRootSet( &root_set );MB_CHK_SET_ERR( rval, "ERROR : getRootSet failed!" );
int top = 0; // iBase_VERTEX;
int num_test_top = 4; // iBase_ALL_TYPES;
std::vector< std::vector< EntityHandle > > gentity_vectors( num_test_top );
// fill the vectors of each topology entities
//
for( i = top; i < num_test_top; i++ )
{
Range gentities;
rval = pFacet->getEntities( root_set, i, gentities );MB_CHK_SET_ERR( rval, "Failed to get gentities in eval tests." );
gentity_vectors[i].resize( gentities.size() );
std::copy( gentities.begin(), gentities.end(), gentity_vectors[i].begin() );
}
// check adjacencies in both directions
double min[3], max[3];
double normal[3] = { .0, .0, .0 };
std::vector< EntityHandle >::iterator vit;
for( i = 3 /*iBase_REGION*/; i > 1 /*iBase_EDGE*/; i-- )
{
for( vit = gentity_vectors[i].begin(); vit != gentity_vectors[i].end(); ++vit )
{
EntityHandle this_gent = *vit;
rval = pFacet->getEntBoundBox( this_gent, &min[0], &min[1], &min[2], &max[0], &max[1], &max[2] );MB_CHK_SET_ERR( rval, "Failed to get bounding box of entity." );
rval = pFacet->getEntNrmlXYZ( this_gent, ( max[0] + min[0] ) / 2, ( max[1] + min[1] ) / 2,
( max[2] + min[2] ) / 2, &normal[0], &normal[1], &normal[2] );MB_CHK_SET_ERR( rval, "Failed to get normal to the closest point." );
std::cout << " entity of type " << i << " closest normal to center:\n " << normal[0] << " " << normal[1]
<< " " << normal[2] << "\n";
}
}
return MB_SUCCESS;
}
Definition at line 399 of file mbfacet_test.cpp.
References ErrorCode, moab::FBEngine::getEntBoundBox(), moab::FBEngine::getEntities(), moab::FBEngine::getPntRayIntsct(), moab::FBEngine::getRootSet(), moab::Interface::id_from_handle(), MB_CHK_SET_ERR, MB_SUCCESS, moab::FBEngine::moab_instance(), root_set, and moab::Interface::type_from_handle().
{
EntityHandle root_set;
ErrorCode rval = pFacet->getRootSet( &root_set );MB_CHK_SET_ERR( rval, "ERROR : getRootSet failed!" );
int top = 2; // iBase_FACE;
Range faces;
rval = pFacet->getEntities( root_set, top, faces );MB_CHK_SET_ERR( rval, "Failed to get faces in ray_test." );
// check only the first face
// check adjacencies in both directions
double min[3], max[3];
EntityHandle first_face = faces[0];
rval = pFacet->getEntBoundBox( first_face, &min[0], &min[1], &min[2], &max[0], &max[1], &max[2] );MB_CHK_SET_ERR( rval, "Failed to get bounding box of entity." );
// assume that the ray shot from the bottom of the box (middle) is a pretty good candidate
// in z direction
double x = ( min[0] + max[0] ) / 2, y = ( min[1] + max[1] ) / 2, z = min[2];
std::vector< EntityHandle > intersect_entity_handles;
std::vector< double > intersect_coords;
std::vector< double > param_coords;
rval = pFacet->getPntRayIntsct( x, y, z, // shot from
0., 0., 1., // direction
intersect_entity_handles,
/*iBase_INTERLEAVED,*/
intersect_coords, param_coords );MB_CHK_SET_ERR( rval, "Failed to find ray intersections points " );
for( unsigned int i = 0; i < intersect_entity_handles.size(); i++ )
{
std::cout << " entity of type " << pFacet->moab_instance()->type_from_handle( intersect_entity_handles[i] )
<< " id from handle: " << pFacet->moab_instance()->id_from_handle( intersect_entity_handles[i] )
<< "\n"
<< intersect_coords[3 * i] << " " << intersect_coords[3 * i + 1] << " " << intersect_coords[3 * i + 2]
<< "\n"
<< " distance: " << param_coords[i] << "\n";
}
return MB_SUCCESS;
}
| ErrorCode root_set_test | ( | FBEngine * | pFacet | ) |
Definition at line 180 of file mbfacet_test.cpp.
References ErrorCode, moab::FBEngine::getRootSet(), MB_CHK_SET_ERR, MB_SUCCESS, and root_set.
Referenced by check_split(), and main().
{
EntityHandle root_set;
ErrorCode rval = pFacet->getRootSet( &root_set );MB_CHK_SET_ERR( rval, "ERROR : getRootSet failed!" );
return MB_SUCCESS;
}
Definition at line 575 of file mbfacet_test.cpp.
References moab::FBEngine::delete_smooth_tags(), ErrorCode, gentityset_test(), geometry_evaluation_test(), moab::FBEngine::getEntities(), moab::FBEngine::getRootSet(), handle_error_code(), moab::FBEngine::Init(), keep_output, moab::Interface::load_file(), mb, MB_CHK_SET_ERR, MB_SUCCESS, mbcore, normals_test(), number_tests_failed, number_tests_successful, quads_file, ray_test(), root_set, moab::Range::size(), and moab::Interface::write_file().
Referenced by main().
{
Core mbcore;
Interface* mb = &mbcore;
ErrorCode rval = mb->load_file( quads_file.c_str() );MB_CHK_SET_ERR( rval, "failed to load quads file" );
FBEngine* pFacet = new FBEngine( mb, NULL, true );
rval = pFacet->Init();MB_CHK_SET_ERR( rval, "failed to initialize smoothing" );
EntityHandle root_set;
rval = pFacet->getRootSet( &root_set );MB_CHK_SET_ERR( rval, "ERROR : getRootSet failed!" );
int top = 2; // iBase_FACE;
Range faces;
rval = pFacet->getEntities( root_set, top, faces );MB_CHK_SET_ERR( rval, "Failed to get faces in split_test." );
if( faces.size() != 2 )
{
std::cout << "num faces after loading quads model:" << faces.size() << "\n";
return MB_FAILURE; //
}
// multiple tests
std::cout << "gentity set test: ";
rval = gentityset_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "geometry evals test: ";
rval = geometry_evaluation_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "normal evals test: ";
rval = normals_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
std::cout << "ray test: ";
rval = ray_test( pFacet );
handle_error_code( rval, number_tests_failed, number_tests_successful );
std::cout << "\n";
// export split triangles model, after deleting the smooth tags
pFacet->delete_smooth_tags();
delete pFacet;
pFacet = NULL;
std::string spl_file = "q.split.h5m";
rval = mb->write_file( spl_file.c_str(), 0, 0, &root_set, 1 );MB_CHK_SET_ERR( rval, "can't write result file" );
if( !keep_output )
{
remove( spl_file.c_str() );
}
if( number_tests_failed > 0 ) return MB_FAILURE;
return MB_SUCCESS;
}
| ErrorCode split_test | ( | Interface * | mb, |
| FBEngine * | pFacet | ||
| ) |
Definition at line 449 of file mbfacet_test.cpp.
References moab::FBEngine::delete_smooth_tags(), moab::GeomTopoTool::duplicate_model(), ErrorCode, filename_out, moab::FBEngine::get_gtt(), moab::GeomTopoTool::get_root_model_set(), moab::FBEngine::getEntities(), moab::FBEngine::getRootSet(), MB_CHK_SET_ERR, min_dot, nr, polygon_file_name, root_set, moab::FBEngine::split_surface_with_direction(), and moab::Interface::write_file().
Referenced by main().
{
EntityHandle root_set;
ErrorCode rval = pFacet->getRootSet( &root_set );MB_CHK_SET_ERR( rval, "ERROR : getRootSet failed!" );
int top = 2; // iBase_FACE;
Range faces;
rval = pFacet->getEntities( root_set, top, faces );MB_CHK_SET_ERR( rval, "Failed to get faces in split_test." );
// check only the first face
EntityHandle first_face = faces[0];
// use the polyPB.txt file to get the trimming polygon
;
// read the file with the polygon user data
std::ifstream datafile( polygon_file_name.c_str(), std::ifstream::in );
if( !datafile )
{
std::cout << "can't read file\n";
return MB_FAILURE;
}
//
char temp[100];
double direction[3]; // normalized
double gridSize;
datafile.getline( temp, 100 ); // first line
// get direction and mesh size along polygon segments, from file
sscanf( temp, " %lf %lf %lf %lf ", direction, direction + 1, direction + 2, &gridSize );
// NORMALIZE(direction);// just to be sure
std::vector< double > xyz;
while( !datafile.eof() )
{
datafile.getline( temp, 100 );
// int id = 0;
double x, y, z;
int nr = sscanf( temp, "%lf %lf %lf", &x, &y, &z );
if( nr == 3 )
{
xyz.push_back( x );
xyz.push_back( y );
xyz.push_back( z );
}
}
int sizePolygon = (int)xyz.size() / 3;
if( sizePolygon < 3 )
{
std::cerr << " Not enough points in the polygon" << std::endl;
return MB_FAILURE;
}
EntityHandle newFace; // first test is with closed surface
rval = pFacet->split_surface_with_direction( first_face, xyz, direction, /*closed*/ 1, min_dot, newFace );MB_CHK_SET_ERR( rval, "ERROR : splitting surface failed!" );
// save a new database
pFacet->delete_smooth_tags();
// get a new gtt tool
// duplicate -- extract a new geom topo tool
GeomTopoTool* gtt = pFacet->get_gtt();
GeomTopoTool* duplicate = NULL;
std::vector< EntityHandle > gents;
gents.push_back( newFace );
rval = gtt->duplicate_model( duplicate, &gents );MB_CHK_SET_ERR( rval, "Failed to extract surface." );
EntityHandle newRootSet = duplicate->get_root_model_set();
delete pFacet;
pFacet = NULL; // try not to write the obb tree
rval = mb->write_file( filename_out.c_str(), NULL, NULL, &newRootSet, 1 );MB_CHK_SET_ERR( rval, "ERROR : writing mesh failed!" );
delete duplicate;
return rval;
}
| std::string filename |
Definition at line 31 of file mbfacet_test.cpp.
| std::string filename_out |
Definition at line 32 of file mbfacet_test.cpp.
Referenced by check_split(), main(), split_test(), split_test_across(), and verify_split().
| bool keep_output |
Definition at line 39 of file mbfacet_test.cpp.
Referenced by main(), and split_quads_test().
| double min_dot = 0.8 |
Definition at line 37 of file mbfacet_test.cpp.
| int number_tests_failed = 0 |
Definition at line 41 of file mbfacet_test.cpp.
| int number_tests_successful = 0 |
Definition at line 40 of file mbfacet_test.cpp.
| std::string polygon_file_name |
Definition at line 33 of file mbfacet_test.cpp.
| std::string quads_file |
Definition at line 35 of file mbfacet_test.cpp.
Referenced by main(), and split_quads_test().