![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <ReadCGM.hpp>
Public Member Functions | |
void | tokenize (const std::string &str, std::vector< std::string > &tokens, const char *delimiters) |
ErrorCode | load_file (const char *file_name, const EntityHandle *file_set, const FileOptions &opts, const SubsetList *subset_list=0, const Tag *file_id_tag=0) |
load a CGM file | |
ErrorCode | read_tag_values (const char *file_name, const char *tag_name, const FileOptions &opts, std::vector< int > &tag_values_out, const SubsetList *subset_list=0) |
Read tag values from a file. | |
ReadCGM (Interface *impl=NULL) | |
Constructor. | |
virtual | ~ReadCGM () |
Destructor. | |
int | get_failed_curve_count () |
int | get_failed_surface_count () |
Static Public Member Functions | |
static ReaderIface * | factory (Interface *) |
Private Member Functions | |
ErrorCode | set_options (const FileOptions &opts, int &norm_tol, double &faceting_tol, double &len_tol, bool &act_att, bool &verbose_warnings, bool &fatal_on_curves) |
ErrorCode | create_entity_sets (std::map< RefEntity *, EntityHandle >(&entmap)[5]) |
ErrorCode | create_topology (std::map< RefEntity *, EntityHandle >(&entitymap)[5]) |
ErrorCode | store_surface_senses (std::map< RefEntity *, EntityHandle > &surface_map, std::map< RefEntity *, EntityHandle > &volume_map) |
ErrorCode | store_curve_senses (std::map< RefEntity *, EntityHandle > &curve_map, std::map< RefEntity *, EntityHandle > &surface_map) |
ErrorCode | store_groups (std::map< RefEntity *, EntityHandle >(&entitymap)[5]) |
ErrorCode | create_group_entsets (std::map< RefEntity *, EntityHandle > &group_map) |
ErrorCode | store_group_content (std::map< RefEntity *, EntityHandle >(&entitymap)[5]) |
void | set_cgm_attributes (bool const act_attributes, bool const verbose) |
ErrorCode | create_vertices (std::map< RefEntity *, EntityHandle > &vertex_map) |
ErrorCode | create_curve_facets (std::map< RefEntity *, EntityHandle > &curve_map, std::map< RefEntity *, EntityHandle > &vertex_map, int norm_tol, double faceting_tol, bool verbose_warn=false, bool fatal_on_curves=false) |
ErrorCode | create_surface_facets (std::map< RefEntity *, EntityHandle > &surface_map, std::map< RefEntity *, EntityHandle > &vertex_map, int norm_tol, double facet_tol, double length_tol) |
void | dump_fail_counts () |
const char * | get_geom_file_type (const char *filename) |
const char * | get_geom_fptr_type (FILE *file) |
int | is_cubit_file (FILE *file) |
int | is_step_file (FILE *file) |
int | is_iges_file (FILE *file) |
int | is_occ_brep_file (FILE *file) |
int | is_facet_file (FILE *file) |
Private Attributes | |
ReadUtilIface * | readUtilIface |
GeomTopoTool * | myGeomTool |
Interface * | mdbImpl |
interface instance | |
Tag | geom_tag |
Tag | id_tag |
Tag | name_tag |
Tag | category_tag |
Tag | faceting_tol_tag |
Tag | geometry_resabs_tag |
int | failed_curve_count |
std::vector< int > | failed_curves |
int | failed_surface_count |
std::vector< int > | failed_surfaces |
Definition at line 47 of file ReadCGM.hpp.
moab::ReadCGM::ReadCGM | ( | Interface * | impl = NULL | ) |
Constructor.
Definition at line 69 of file ReadCGM.cpp.
References category_tag, CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, ErrorCode, faceting_tol_tag, failed_curve_count, failed_surface_count, GEOM_DIMENSION_TAG_NAME, geom_tag, geometry_resabs_tag, moab::Interface::globalId_tag(), id_tag, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, MB_TYPE_OPAQUE, mdbImpl, myGeomTool, name_tag, NAME_TAG_NAME, NAME_TAG_SIZE, moab::Interface::query_interface(), readUtilIface, and moab::Interface::tag_get_handle().
Referenced by factory().
: geom_tag( 0 ), id_tag( 0 ), name_tag( 0 ), category_tag( 0 ), faceting_tol_tag( 0 ), geometry_resabs_tag( 0 )
{
assert( NULL != impl );
mdbImpl = impl;
myGeomTool = new GeomTopoTool( impl );
impl->query_interface( readUtilIface );
assert( NULL != readUtilIface );
// initialise counters
failed_curve_count = 0;
failed_surface_count = 0;
ErrorCode rval;
// get some tag handles
int negone = -1, zero = 0 /*, negonearr[] = {-1, -1, -1, -1}*/;
rval = mdbImpl->tag_get_handle( GEOM_DIMENSION_TAG_NAME, 1, MB_TYPE_INTEGER, geom_tag, MB_TAG_SPARSE | MB_TAG_CREAT,
&negone );
assert( !rval );
id_tag = mdbImpl->globalId_tag();
rval =
mdbImpl->tag_get_handle( NAME_TAG_NAME, NAME_TAG_SIZE, MB_TYPE_OPAQUE, name_tag, MB_TAG_SPARSE | MB_TAG_CREAT );
assert( !rval );
rval = mdbImpl->tag_get_handle( CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, MB_TYPE_OPAQUE, category_tag,
MB_TAG_SPARSE | MB_TAG_CREAT );
assert( !rval );
rval = mdbImpl->tag_get_handle( "FACETING_TOL", 1, MB_TYPE_DOUBLE, faceting_tol_tag, MB_TAG_SPARSE | MB_TAG_CREAT );
assert( !rval );
rval = mdbImpl->tag_get_handle( "GEOMETRY_RESABS", 1, MB_TYPE_DOUBLE, geometry_resabs_tag,
MB_TAG_SPARSE | MB_TAG_CREAT );
assert( !rval );
#ifdef NDEBUG
if( !rval )
{
}; // Line to avoid compiler warning about variable set but not used
#endif
}
moab::ReadCGM::~ReadCGM | ( | ) | [virtual] |
Destructor.
Definition at line 110 of file ReadCGM.cpp.
References mdbImpl, myGeomTool, readUtilIface, and moab::Interface::release_interface().
{
mdbImpl->release_interface( readUtilIface );
delete myGeomTool;
}
ErrorCode moab::ReadCGM::create_curve_facets | ( | std::map< RefEntity *, EntityHandle > & | curve_map, |
std::map< RefEntity *, EntityHandle > & | vertex_map, | ||
int | norm_tol, | ||
double | faceting_tol, | ||
bool | verbose_warn = false , |
||
bool | fatal_on_curves = false |
||
) | [private] |
Definition at line 532 of file ReadCGM.cpp.
References moab::Interface::add_entities(), moab::Interface::create_element(), moab::Interface::create_vertex(), ErrorCode, failed_curve_count, failed_curves, GEOMETRY_RESABS, length(), MB_SUCCESS, MBEDGE, and mdbImpl.
Referenced by load_file().
{
ErrorCode rval;
CubitStatus s;
// Maximum allowable curve-endpoint proximity warnings
// If this integer becomes negative, then abs(curve_warnings) is the
// number of warnings that were suppressed.
int curve_warnings = 0;
// Map iterator
std::map< RefEntity*, EntityHandle >::iterator ci;
// Create geometry for all curves
GMem data;
for( ci = curve_map.begin(); ci != curve_map.end(); ++ci )
{
// Get the start and end points of the curve in the form of a reference edge
RefEdge* edge = dynamic_cast< RefEdge* >( ci->first );
// Get the edge's curve information
Curve* curve = edge->get_curve_ptr();
// Clean out previous curve information
data.clean_out();
// Facet curve according to parameters and CGM version
#if CGM_MAJOR_VERSION > 12
s = edge->get_graphics( data, norm_tol, faceting_tol );
#else
s = edge->get_graphics( data, faceting_tol );
#endif
if( s != CUBIT_SUCCESS )
{
// if we fatal on curves
if( fatal_on_curves )
{
std::cout << "Failed to facet the curve " << edge->id() << std::endl;
return MB_FAILURE;
}
// otherwise record them
else
{
failed_curve_count++;
failed_curves.push_back( edge->id() );
}
continue;
}
std::vector< CubitVector > points;
for( int i = 0; i < data.pointListCount; ++i )
// Add Cubit vertext points to a list
points.push_back( CubitVector( data.point_list()[i].x, data.point_list()[i].y, data.point_list()[i].z ) );
// Need to reverse data?
if( curve->bridge_sense() == CUBIT_REVERSED ) std::reverse( points.begin(), points.end() );
// Check for closed curve
RefVertex *start_vtx, *end_vtx;
start_vtx = edge->start_vertex();
end_vtx = edge->end_vertex();
// Special case for point curve
if( points.size() < 2 )
{
if( start_vtx != end_vtx || curve->measure() > GEOMETRY_RESABS )
{
std::cerr << "Warning: No facetting for curve " << edge->id() << std::endl;
continue;
}
EntityHandle h = vertex_map[start_vtx];
rval = mdbImpl->add_entities( ci->second, &h, 1 );
if( MB_SUCCESS != rval ) return MB_FAILURE;
continue;
}
// Check to see if the first and last interior vertices are considered to be
// coincident by CUBIT
const bool closed = ( points.front() - points.back() ).length() < GEOMETRY_RESABS;
if( closed != ( start_vtx == end_vtx ) )
{
std::cerr << "Warning: topology and geometry inconsistant for possibly closed curve " << edge->id()
<< std::endl;
}
// Check proximity of vertices to end coordinates
if( ( start_vtx->coordinates() - points.front() ).length() > GEOMETRY_RESABS ||
( end_vtx->coordinates() - points.back() ).length() > GEOMETRY_RESABS )
{
curve_warnings--;
if( curve_warnings >= 0 || verbose_warn )
{
std::cerr << "Warning: vertices not at ends of curve " << edge->id() << std::endl;
if( curve_warnings == 0 && !verbose_warn )
{
std::cerr << " further instances of this warning will be suppressed..." << std::endl;
}
}
}
// Create interior points
std::vector< EntityHandle > verts, edges;
verts.push_back( vertex_map[start_vtx] );
for( size_t i = 1; i < points.size() - 1; ++i )
{
double coords[] = { points[i].x(), points[i].y(), points[i].z() };
EntityHandle h;
// Create vertex entity
rval = mdbImpl->create_vertex( coords, h );
if( MB_SUCCESS != rval ) return MB_FAILURE;
verts.push_back( h );
}
verts.push_back( vertex_map[end_vtx] );
// Create edges
for( size_t i = 0; i < verts.size() - 1; ++i )
{
EntityHandle h;
rval = mdbImpl->create_element( MBEDGE, &verts[i], 2, h );
if( MB_SUCCESS != rval ) return MB_FAILURE;
edges.push_back( h );
}
// If closed, remove duplicate
if( verts.front() == verts.back() ) verts.pop_back();
// Add entities to the curve meshset from entitymap
rval = mdbImpl->add_entities( ci->second, &verts[0], verts.size() );
if( MB_SUCCESS != rval ) return MB_FAILURE;
rval = mdbImpl->add_entities( ci->second, &edges[0], edges.size() );
if( MB_SUCCESS != rval ) return MB_FAILURE;
}
if( !verbose_warn && curve_warnings < 0 )
{
std::cerr << "Suppressed " << -curve_warnings << " 'vertices not at ends of curve' warnings." << std::endl;
std::cerr << "To see all warnings, use reader param VERBOSE_CGM_WARNINGS." << std::endl;
}
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::create_entity_sets | ( | std::map< RefEntity *, EntityHandle >(&) | entmap[5] | ) | [private] |
Definition at line 162 of file ReadCGM.cpp.
References category_tag, CATEGORY_TAG_SIZE, moab::Interface::create_meshset(), dim, ErrorCode, geom_tag, id_tag, MB_SUCCESS, mdbImpl, MESHSET_SET, and moab::Interface::tag_set_data().
Referenced by load_file().
{
ErrorCode rval;
const char geom_categories[][CATEGORY_TAG_SIZE] = { "Vertex\0", "Curve\0", "Surface\0", "Volume\0", "Group\0" };
const char* const names[] = { "Vertex", "Curve", "Surface", "Volume" };
DLIList< RefEntity* > entlist;
for( int dim = 0; dim < 4; dim++ )
{
entlist.clean_out();
GeometryQueryTool::instance()->ref_entity_list( names[dim], entlist, true );
entlist.reset();
for( int i = entlist.size(); i--; )
{
RefEntity* ent = entlist.get_and_step();
EntityHandle handle;
// Create the new meshset
rval = mdbImpl->create_meshset( dim == 1 ? MESHSET_ORDERED : MESHSET_SET, handle );
if( MB_SUCCESS != rval ) return rval;
// Map the geom reference entity to the corresponding moab meshset
entmap[dim][ent] = handle;
// Create tags for the new meshset
rval = mdbImpl->tag_set_data( geom_tag, &handle, 1, &dim );
if( MB_SUCCESS != rval ) return rval;
int id = ent->id();
rval = mdbImpl->tag_set_data( id_tag, &handle, 1, &id );
if( MB_SUCCESS != rval ) return rval;
rval = mdbImpl->tag_set_data( category_tag, &handle, 1, &geom_categories[dim] );
if( MB_SUCCESS != rval ) return rval;
}
}
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::create_group_entsets | ( | std::map< RefEntity *, EntityHandle > & | group_map | ) | [private] |
Definition at line 333 of file ReadCGM.cpp.
References category_tag, CATEGORY_TAG_SIZE, moab::Interface::create_meshset(), ErrorCode, id_tag, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_OPAQUE, mdbImpl, MESHSET_SET, name_tag, NAME_TAG_NAME, NAME_TAG_SIZE, t, moab::Interface::tag_get_handle(), and moab::Interface::tag_set_data().
Referenced by store_groups().
{
ErrorCode rval;
const char geom_categories[][CATEGORY_TAG_SIZE] = { "Vertex\0", "Curve\0", "Surface\0", "Volume\0", "Group\0" };
DLIList< RefEntity* > entitylist;
// Create entity sets for all ref groups
std::vector< Tag > extra_name_tags;
#if CGM_MAJOR_VERSION > 13
DLIList< CubitString > name_list;
#else
DLIList< CubitString* > name_list;
#endif
entitylist.clean_out();
// Get all entity groups from the CGM model
GeometryQueryTool::instance()->ref_entity_list( "group", entitylist );
entitylist.reset();
// Loop over all groups
for( int i = entitylist.size(); i--; )
{
// Take the next group
RefEntity* grp = entitylist.get_and_step();
name_list.clean_out();
// Get the names of all entities in this group from the solid model
#if CGM_MAJOR_VERSION > 13
RefEntityName::instance()->get_refentity_name( grp, name_list );
#else
// True argument is optional, but for large multi-names situation, it should save
// some cpu time
RefEntityName::instance()->get_refentity_name( grp, name_list, true );
#endif
if( name_list.size() == 0 ) continue;
// Set pointer to first name of the group and set the first name to name1
name_list.reset();
#if CGM_MAJOR_VERSION > 13
CubitString name1 = name_list.get();
#else
CubitString name1 = *name_list.get();
#endif
// Create entity handle for the group
EntityHandle h;
rval = mdbImpl->create_meshset( MESHSET_SET, h );
if( MB_SUCCESS != rval ) return rval;
// Set tag data for the group
char namebuf[NAME_TAG_SIZE];
memset( namebuf, '\0', NAME_TAG_SIZE );
strncpy( namebuf, name1.c_str(), NAME_TAG_SIZE - 1 );
if( name1.length() >= (unsigned)NAME_TAG_SIZE )
std::cout << "WARNING: group name '" << name1.c_str() << "' truncated to '" << namebuf << "'" << std::endl;
rval = mdbImpl->tag_set_data( name_tag, &h, 1, namebuf );
if( MB_SUCCESS != rval ) return MB_FAILURE;
int id = grp->id();
rval = mdbImpl->tag_set_data( id_tag, &h, 1, &id );
if( MB_SUCCESS != rval ) return MB_FAILURE;
rval = mdbImpl->tag_set_data( category_tag, &h, 1, &geom_categories[4] );
if( MB_SUCCESS != rval ) return MB_FAILURE;
// Check for extra group names
if( name_list.size() > 1 )
{
for( int j = extra_name_tags.size(); j < name_list.size(); ++j )
{
sprintf( namebuf, "EXTRA_%s%d", NAME_TAG_NAME, j );
Tag t;
rval =
mdbImpl->tag_get_handle( namebuf, NAME_TAG_SIZE, MB_TYPE_OPAQUE, t, MB_TAG_SPARSE | MB_TAG_CREAT );
assert( !rval );
extra_name_tags.push_back( t );
}
// Add extra group names to the group handle
for( int j = 0; j < name_list.size(); ++j )
{
#if CGM_MAJOR_VERSION > 13
name1 = name_list.get_and_step();
#else
name1 = *name_list.get_and_step();
#endif
memset( namebuf, '\0', NAME_TAG_SIZE );
strncpy( namebuf, name1.c_str(), NAME_TAG_SIZE - 1 );
if( name1.length() >= (unsigned)NAME_TAG_SIZE )
std::cout << "WARNING: group name '" << name1.c_str() << "' truncated to '" << namebuf << "'"
<< std::endl;
rval = mdbImpl->tag_set_data( extra_name_tags[j], &h, 1, namebuf );
if( MB_SUCCESS != rval ) return MB_FAILURE;
}
}
// Add the group handle
group_map[grp] = h;
}
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::create_surface_facets | ( | std::map< RefEntity *, EntityHandle > & | surface_map, |
std::map< RefEntity *, EntityHandle > & | vertex_map, | ||
int | norm_tol, | ||
double | facet_tol, | ||
double | length_tol | ||
) | [private] |
Definition at line 678 of file ReadCGM.cpp.
References moab::Interface::add_entities(), moab::Interface::create_element(), moab::Interface::create_vertex(), ErrorCode, failed_surface_count, failed_surfaces, GEOMETRY_RESABS, moab::Range::insert(), MB_SUCCESS, MBPOLYGON, MBQUAD, MBTRI, and mdbImpl.
Referenced by load_file().
{
ErrorCode rval;
std::map< RefEntity*, EntityHandle >::iterator ci;
CubitStatus s;
#if( ( CGM_MAJOR_VERSION == 14 && CGM_MINOR_VERSION > 2 ) || CGM_MAJOR_VERSION >= 15 )
DLIList< TopologyEntity* > me_list;
#else
DLIList< ModelEntity* > me_list;
#endif
GMem data;
// Create geometry for all surfaces
for( ci = surface_map.begin(); ci != surface_map.end(); ++ci )
{
RefFace* face = dynamic_cast< RefFace* >( ci->first );
data.clean_out();
s = face->get_graphics( data, norm_tol, facet_tol, length_tol );
if( CUBIT_SUCCESS != s ) return MB_FAILURE;
// Declare array of all vertex handles
std::vector< EntityHandle > verts( data.pointListCount, 0 );
// Get list of geometric vertices in surface
me_list.clean_out();
ModelQueryEngine::instance()->query_model( *face, DagType::ref_vertex_type(), me_list );
// For each geometric vertex, find a single coincident point in facets
// Otherwise, print a warning
for( int i = me_list.size(); i--; )
{
// Assign geometric vertex
RefVertex* vtx = dynamic_cast< RefVertex* >( me_list.get_and_step() );
CubitVector pos = vtx->coordinates();
for( int j = 0; j < data.pointListCount; ++j )
{
// Assign facet vertex
CubitVector vpos( data.point_list()[j].x, data.point_list()[j].y, data.point_list()[j].z );
// Check to see if they are considered coincident
if( ( pos - vpos ).length_squared() < GEOMETRY_RESABS * GEOMETRY_RESABS )
{
// If this facet vertex has already been found coincident, print warning
if( verts[j] ) std::cerr << "Warning: Coincident vertices in surface " << face->id() << std::endl;
// If a coincidence is found, keep track of it in the verts vector
verts[j] = vertex_map[vtx];
break;
}
}
}
// Now create vertices for the remaining points in the facetting
for( int i = 0; i < data.pointListCount; ++i )
{
if( verts[i] ) // If a geometric vertex
continue;
double coords[] = { data.point_list()[i].x, data.point_list()[i].y, data.point_list()[i].z };
// Return vertex handle to verts to fill in all remaining facet
// vertices
rval = mdbImpl->create_vertex( coords, verts[i] );
if( MB_SUCCESS != rval ) return rval;
}
// record the failures for information
if( data.fListCount == 0 )
{
failed_surface_count++;
failed_surfaces.push_back( face->id() );
}
// Now create facets
Range facets;
std::vector< EntityHandle > corners;
for( int i = 0; i < data.fListCount; i += data.facet_list()[i] + 1 )
{
// Get number of facet verts
int* facet = data.facet_list() + i;
corners.resize( *facet );
for( int j = 1; j <= *facet; ++j )
{
if( facet[j] >= (int)verts.size() )
{
std::cerr << "ERROR: Invalid facet data for surface " << face->id() << std::endl;
return MB_FAILURE;
}
corners[j - 1] = verts[facet[j]];
}
EntityType type;
if( *facet == 3 )
type = MBTRI;
else
{
std::cerr << "Warning: non-triangle facet in surface " << face->id() << std::endl;
std::cerr << " entity has " << *facet << " edges" << std::endl;
if( *facet == 4 )
type = MBQUAD;
else
type = MBPOLYGON;
}
// if (surf->bridge_sense() == CUBIT_REVERSED)
// std::reverse(corners.begin(), corners.end());
EntityHandle h;
rval = mdbImpl->create_element( type, &corners[0], corners.size(), h );
if( MB_SUCCESS != rval ) return MB_FAILURE;
facets.insert( h );
}
// Add vertices and facets to surface set
rval = mdbImpl->add_entities( ci->second, &verts[0], verts.size() );
if( MB_SUCCESS != rval ) return MB_FAILURE;
rval = mdbImpl->add_entities( ci->second, facets );
if( MB_SUCCESS != rval ) return MB_FAILURE;
}
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::create_topology | ( | std::map< RefEntity *, EntityHandle >(&) | entitymap[5] | ) | [private] |
Definition at line 202 of file ReadCGM.cpp.
References moab::Interface::add_parent_child(), dim, ErrorCode, MB_SUCCESS, and mdbImpl.
Referenced by load_file().
{
ErrorCode rval;
DLIList< RefEntity* > entitylist;
std::map< RefEntity*, EntityHandle >::iterator ci;
for( int dim = 1; dim < 4; ++dim )
{
for( ci = entitymap[dim].begin(); ci != entitymap[dim].end(); ++ci )
{
entitylist.clean_out();
ci->first->get_child_ref_entities( entitylist );
entitylist.reset();
for( int i = entitylist.size(); i--; )
{
RefEntity* ent = entitylist.get_and_step();
EntityHandle h = entitymap[dim - 1][ent];
rval = mdbImpl->add_parent_child( ci->second, h );
if( MB_SUCCESS != rval ) return rval;
}
}
}
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::create_vertices | ( | std::map< RefEntity *, EntityHandle > & | vertex_map | ) | [private] |
Definition at line 508 of file ReadCGM.cpp.
References moab::Interface::add_entities(), moab::Interface::create_vertex(), ErrorCode, MB_SUCCESS, and mdbImpl.
Referenced by load_file().
{
ErrorCode rval;
std::map< RefEntity*, EntityHandle >::iterator ci;
for( ci = vertex_map.begin(); ci != vertex_map.end(); ++ci )
{
CubitVector pos = dynamic_cast< RefVertex* >( ci->first )->coordinates();
double coords[3] = { pos.x(), pos.y(), pos.z() };
EntityHandle vh;
rval = mdbImpl->create_vertex( coords, vh );
if( MB_SUCCESS != rval ) return MB_FAILURE;
// Add the vertex to its tagged meshset
rval = mdbImpl->add_entities( ci->second, &vh, 1 );
if( MB_SUCCESS != rval ) return MB_FAILURE;
// Replace the meshset handle with the vertex handle
// This makes adding the vertex to higher dim sets easier
ci->second = vh;
}
return MB_SUCCESS;
}
void moab::ReadCGM::dump_fail_counts | ( | ) | [private] |
Dumps the failed faceting information to screen
Definition at line 913 of file ReadCGM.cpp.
References failed_curve_count, failed_curves, failed_surface_count, and failed_surfaces.
Referenced by load_file().
{
std::cout << "***** Faceting Summary Information *****" << std::endl;
std::cout << "----- Curve Fail Information -----" << std::endl;
std::cout << "There were " << failed_curve_count << " curves that could not be faceted." << std::endl;
if( failed_curve_count > 0 )
{
std::cout << "The curves were ";
for( int i = 0; i < failed_curve_count; i++ )
{
std::cout << failed_curves[i] << " ";
if( ( i % 10 == 0 ) & ( i > 0 ) ) std::cout << std::endl;
}
}
std::cout << std::endl;
std::cout << "----- Facet Fail Information -----" << std::endl;
std::cout << "There were " << failed_surface_count << " surfaces that could not be faceted." << std::endl;
if( failed_surface_count > 0 )
{
std::cout << "The surfaces were ";
for( int i = 0; i < failed_surface_count; i++ )
{
std::cout << failed_surfaces[i] << " ";
if( ( i % 10 == 0 ) & ( i > 0 ) ) std::cout << std::endl;
}
}
std::cout << std::endl;
std::cout << "***** End of Faceting Summary Information *****" << std::endl;
return;
}
ReaderIface * moab::ReadCGM::factory | ( | Interface * | iface | ) | [static] |
Definition at line 64 of file ReadCGM.cpp.
References ReadCGM().
Referenced by moab::ReaderWriterSet::ReaderWriterSet().
{
return new ReadCGM( iface );
}
Definition at line 902 of file ReadCGM.cpp.
References failed_curve_count.
{
return failed_curve_count;
}
Definition at line 908 of file ReadCGM.cpp.
References failed_surface_count.
{
return failed_surface_count;
}
const char * moab::ReadCGM::get_geom_file_type | ( | const char * | filename | ) | [private] |
Definition at line 945 of file ReadCGM.cpp.
References get_geom_fptr_type().
Referenced by load_file().
{
FILE* file;
const char* result = 0;
file = fopen( name, "r" );
if( file )
{
result = get_geom_fptr_type( file );
fclose( file );
}
return result;
}
const char * moab::ReadCGM::get_geom_fptr_type | ( | FILE * | file | ) | [private] |
Definition at line 960 of file ReadCGM.cpp.
References GF_CUBIT_FILE_TYPE, GF_FACET_FILE_TYPE, GF_IGES_FILE_TYPE, GF_OCC_BREP_FILE_TYPE, GF_STEP_FILE_TYPE, is_cubit_file(), is_facet_file(), is_iges_file(), is_occ_brep_file(), and is_step_file().
Referenced by get_geom_file_type().
{
static const char* CUBIT_NAME = GF_CUBIT_FILE_TYPE;
static const char* STEP_NAME = GF_STEP_FILE_TYPE;
static const char* IGES_NAME = GF_IGES_FILE_TYPE;
static const char* BREP_NAME = GF_OCC_BREP_FILE_TYPE;
static const char* FACET_NAME = GF_FACET_FILE_TYPE;
if( is_cubit_file( file ) )
return CUBIT_NAME;
else if( is_step_file( file ) )
return STEP_NAME;
else if( is_iges_file( file ) )
return IGES_NAME;
else if( is_occ_brep_file( file ) )
return BREP_NAME;
else if( is_facet_file( file ) )
return FACET_NAME;
else
return NULL;
}
int moab::ReadCGM::is_cubit_file | ( | FILE * | file | ) | [private] |
Definition at line 982 of file ReadCGM.cpp.
References buffer.
Referenced by get_geom_fptr_type().
{
unsigned char buffer[4];
return !fseek( file, 0, SEEK_SET ) && fread( buffer, 4, 1, file ) && !memcmp( buffer, "CUBE", 4 );
}
int moab::ReadCGM::is_facet_file | ( | FILE * | file | ) | [private] |
Definition at line 1005 of file ReadCGM.cpp.
References buffer.
Referenced by get_geom_fptr_type().
{
unsigned char buffer[10];
return !fseek( file, 0, SEEK_SET ) && fread( buffer, 10, 1, file ) && !memcmp( buffer, "MESH_BASED", 10 );
}
int moab::ReadCGM::is_iges_file | ( | FILE * | file | ) | [private] |
Definition at line 994 of file ReadCGM.cpp.
References buffer.
Referenced by get_geom_fptr_type().
{
unsigned char buffer[10];
return !fseek( file, 72, SEEK_SET ) && fread( buffer, 10, 1, file ) && !memcmp( buffer, "S 1", 8 );
}
int moab::ReadCGM::is_occ_brep_file | ( | FILE * | file | ) | [private] |
Definition at line 1000 of file ReadCGM.cpp.
References buffer.
Referenced by get_geom_fptr_type().
{
unsigned char buffer[6];
return !fseek( file, 0, SEEK_SET ) && fread( buffer, 6, 1, file ) && !memcmp( buffer, "DBRep_", 6 );
}
int moab::ReadCGM::is_step_file | ( | FILE * | file | ) | [private] |
Definition at line 988 of file ReadCGM.cpp.
References buffer.
Referenced by get_geom_fptr_type().
{
unsigned char buffer[9];
return !fseek( file, 0, SEEK_SET ) && fread( buffer, 9, 1, file ) && !memcmp( buffer, "ISO-10303", 9 );
}
ErrorCode moab::ReadCGM::load_file | ( | const char * | file_name, |
const EntityHandle * | file_set, | ||
const FileOptions & | opts, | ||
const SubsetList * | subset_list = 0 , |
||
const Tag * | file_id_tag = 0 |
||
) | [virtual] |
load a CGM file
Implements moab::ReaderIface.
Definition at line 805 of file ReadCGM.cpp.
References create_curve_facets(), create_entity_sets(), create_surface_facets(), create_topology(), create_vertices(), dump_fail_counts(), ErrorCode, faceting_tol_tag, GEOMETRY_RESABS, geometry_resabs_tag, get_geom_file_type(), MB_SET_ERR, MB_SUCCESS, MB_UNSUPPORTED_OPERATION, mdbImpl, set_cgm_attributes(), set_options(), store_curve_senses(), store_groups(), store_surface_senses(), and moab::Interface::tag_set_data().
{
// Blocks_to_load and num_blocks are ignored.
ErrorCode rval;
if( subset_list )
{
MB_SET_ERR( MB_UNSUPPORTED_OPERATION, "Reading subset of files not supported for CGM data" );
}
int norm_tol;
double faceting_tol;
double len_tol;
bool act_att = true;
bool verbose_warnings = false;
bool fatal_on_curves = false;
rval = set_options( opts, norm_tol, faceting_tol, len_tol, act_att, verbose_warnings, fatal_on_curves );
if( MB_SUCCESS != rval ) return rval;
// Always tag with the faceting_tol and geometry absolute resolution
// If file_set is defined, use that, otherwise (file_set == NULL) tag the interface
EntityHandle set = file_set ? *file_set : 0;
rval = mdbImpl->tag_set_data( faceting_tol_tag, &set, 1, &faceting_tol );
if( MB_SUCCESS != rval ) return rval;
rval = mdbImpl->tag_set_data( geometry_resabs_tag, &set, 1, &GEOMETRY_RESABS );
if( MB_SUCCESS != rval ) return rval;
// Initialize CGM
InitCGMA::initialize_cgma();
// Determine CGM settings and amount of output
set_cgm_attributes( act_att, verbose_warnings );
CubitStatus s;
// Get CGM file type
const char* file_type = 0;
file_type = get_geom_file_type( cgm_file_name );
if( !file_type || !strcmp( file_type, "CUBIT" ) ) return MB_FAILURE;
s = CubitCompat_import_solid_model( cgm_file_name, file_type );
if( CUBIT_SUCCESS != s )
{
MB_SET_ERR( MB_FAILURE, cgm_file_name << ": Failed to read file of type \"" << file_type << "\"" );
}
// Create entity sets for all geometric entities
std::map< RefEntity*, EntityHandle > entmap[5]; // One for each dim, and one for groups
rval = create_entity_sets( entmap );
if( rval != MB_SUCCESS ) return rval;
// Create topology for all geometric entities
rval = create_topology( entmap );
if( rval != MB_SUCCESS ) return rval;
// Store CoFace senses
rval = store_surface_senses( entmap[2], entmap[3] );
if( rval != MB_SUCCESS ) return rval;
// Store CoEdge senses
rval = store_curve_senses( entmap[1], entmap[2] );
if( rval != MB_SUCCESS ) return rval;
// Get group information and store it in the mesh
rval = store_groups( entmap );
if( rval != MB_SUCCESS ) return rval;
// Done with volumes and groups
entmap[3].clear();
entmap[4].clear();
// Create geometry for all vertices and replace
rval = create_vertices( entmap[0] );
if( rval != MB_SUCCESS ) return rval;
// Create facets for all curves
rval = create_curve_facets( entmap[1], entmap[0], norm_tol, faceting_tol, verbose_warnings, fatal_on_curves );
if( rval != MB_SUCCESS ) return rval;
// Create facets for surfaces
rval = create_surface_facets( entmap[2], entmap[0], norm_tol, faceting_tol, len_tol );
if( rval != MB_SUCCESS ) return rval;
// print the fail information
dump_fail_counts();
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::read_tag_values | ( | const char * | file_name, |
const char * | tag_name, | ||
const FileOptions & | opts, | ||
std::vector< int > & | tag_values_out, | ||
const SubsetList * | subset_list = 0 |
||
) | [virtual] |
Read tag values from a file.
Read the list if all integer tag values from the file for a tag that is a single integer value per entity.
file_name | The file to read. |
tag_name | The tag for which to read values |
tag_values_out | Output: The list of tag values. |
subset_list | An array of tag name and value sets specifying the subset of the file to read. If multiple tags are specified, the sets that match all tags (intersection) should be read. |
subset_list_length | The length of the 'subset_list' array. |
Implements moab::ReaderIface.
Definition at line 116 of file ReadCGM.cpp.
References MB_NOT_IMPLEMENTED.
{
return MB_NOT_IMPLEMENTED;
}
void moab::ReadCGM::set_cgm_attributes | ( | bool const | act_attributes, |
bool const | verbose | ||
) | [private] |
Definition at line 494 of file ReadCGM.cpp.
Referenced by load_file().
{
if( act_attributes )
{
CGMApp::instance()->attrib_manager()->set_all_auto_read_flags( act_attributes );
CGMApp::instance()->attrib_manager()->set_all_auto_actuate_flags( act_attributes );
}
if( !verbose )
{
CGMApp::instance()->attrib_manager()->silent_flag( true );
}
}
ErrorCode moab::ReadCGM::set_options | ( | const FileOptions & | opts, |
int & | norm_tol, | ||
double & | faceting_tol, | ||
double & | len_tol, | ||
bool & | act_att, | ||
bool & | verbose_warnings, | ||
bool & | fatal_on_curves | ||
) | [private] |
Definition at line 126 of file ReadCGM.cpp.
References DEFAULT_NORM, ErrorCode, moab::FileOptions::get_int_option(), moab::FileOptions::get_null_option(), moab::FileOptions::get_real_option(), moab::FileOptions::match_option(), and MB_SUCCESS.
Referenced by load_file().
{
ErrorCode rval;
// Default Values
int DEFAULT_NORM = 5;
double DEFAULT_FACET_TOL = 0.001;
double DEFAULT_LEN_TOL = 0.0;
act_att = true;
// Check for the options.
if( MB_SUCCESS != opts.get_int_option( "FACET_NORMAL_TOLERANCE", norm_tol ) ) norm_tol = DEFAULT_NORM;
if( MB_SUCCESS != opts.get_real_option( "FACET_DISTANCE_TOLERANCE", faceting_tol ) )
faceting_tol = DEFAULT_FACET_TOL;
if( MB_SUCCESS != opts.get_real_option( "MAX_FACET_EDGE_LENGTH", len_tol ) ) len_tol = DEFAULT_LEN_TOL;
if( MB_SUCCESS == opts.get_null_option( "VERBOSE_CGM_WARNINGS" ) ) verbose_warnings = true;
if( MB_SUCCESS == opts.get_null_option( "FATAL_ON_CURVES" ) ) fatal_on_curves = true;
const char* name = "CGM_ATTRIBS";
const char* value = "no";
rval = opts.match_option( name, value );
if( MB_SUCCESS == rval ) act_att = false;
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::store_curve_senses | ( | std::map< RefEntity *, EntityHandle > & | curve_map, |
std::map< RefEntity *, EntityHandle > & | surface_map | ||
) | [private] |
Definition at line 284 of file ReadCGM.cpp.
References ErrorCode, MB_SUCCESS, myGeomTool, SENSE_REVERSE, and moab::GeomTopoTool::set_senses().
Referenced by load_file().
{
ErrorCode rval;
std::vector< EntityHandle > ents;
std::vector< int > senses;
std::map< RefEntity*, EntityHandle >::iterator ci;
for( ci = curve_map.begin(); ci != curve_map.end(); ++ci )
{
RefEdge* edge = (RefEdge*)( ci->first );
ents.clear();
senses.clear();
for( SenseEntity* ce = edge->get_first_sense_entity_ptr(); ce; ce = ce->next_on_bte() )
{
BasicTopologyEntity* fac = ce->get_parent_basic_topology_entity_ptr();
EntityHandle face = surface_map[fac];
if( ce->get_sense() == CUBIT_UNKNOWN || ce->get_sense() != edge->get_curve_ptr()->bridge_sense() )
{
ents.push_back( face );
senses.push_back( SENSE_REVERSE );
}
if( ce->get_sense() == CUBIT_UNKNOWN || ce->get_sense() == edge->get_curve_ptr()->bridge_sense() )
{
ents.push_back( face );
senses.push_back( SENSE_FORWARD );
}
}
rval = myGeomTool->set_senses( ci->second, ents, senses );
if( MB_SUCCESS != rval ) return rval;
}
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::store_group_content | ( | std::map< RefEntity *, EntityHandle >(&) | entitymap[5] | ) | [private] |
Definition at line 426 of file ReadCGM.cpp.
References moab::Interface::add_entities(), dim, moab::Range::empty(), entities, ErrorCode, moab::Range::insert(), MB_SUCCESS, and mdbImpl.
Referenced by store_groups().
{
ErrorCode rval;
DLIList< RefEntity* > entlist;
std::map< RefEntity*, EntityHandle >::iterator ci;
// Store contents for each group
entlist.reset();
for( ci = entitymap[4].begin(); ci != entitymap[4].end(); ++ci )
{
RefGroup* grp = (RefGroup*)( ci->first );
entlist.clean_out();
grp->get_child_ref_entities( entlist );
Range entities;
while( entlist.size() )
{
RefEntity* ent = entlist.pop();
int dim = ent->dimension();
if( dim < 0 )
{
Body* body;
if( entitymap[4].find( ent ) != entitymap[4].end() )
{
// Child is another group; examine its contents
entities.insert( entitymap[4][ent] );
}
else if( ( body = dynamic_cast< Body* >( ent ) ) != NULL )
{
// Child is a CGM Body, which presumably comprises some volumes--
// extract volumes as if they belonged to group.
DLIList< RefVolume* > vols;
body->ref_volumes( vols );
for( int vi = vols.size(); vi--; )
{
RefVolume* vol = vols.get_and_step();
if( entitymap[3].find( vol ) != entitymap[3].end() )
{
entities.insert( entitymap[3][vol] );
}
else
{
std::cerr << "Warning: CGM Body has orphan RefVolume" << std::endl;
}
}
}
else
{
// Otherwise, warn user.
std::cerr << "Warning: A dim<0 entity is being ignored by ReadCGM." << std::endl;
}
}
else if( dim < 4 )
{
if( entitymap[dim].find( ent ) != entitymap[dim].end() ) entities.insert( entitymap[dim][ent] );
}
}
if( !entities.empty() )
{
rval = mdbImpl->add_entities( ci->second, entities );
if( MB_SUCCESS != rval ) return MB_FAILURE;
}
}
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::store_groups | ( | std::map< RefEntity *, EntityHandle >(&) | entitymap[5] | ) | [private] |
Definition at line 318 of file ReadCGM.cpp.
References create_group_entsets(), ErrorCode, MB_SUCCESS, and store_group_content().
Referenced by load_file().
{
ErrorCode rval;
// Create entity sets for all ref groups
rval = create_group_entsets( entitymap[4] );
if( rval != MB_SUCCESS ) return rval;
// Store group names and entities in the mesh
rval = store_group_content( entitymap );
if( rval != MB_SUCCESS ) return rval;
return MB_SUCCESS;
}
ErrorCode moab::ReadCGM::store_surface_senses | ( | std::map< RefEntity *, EntityHandle > & | surface_map, |
std::map< RefEntity *, EntityHandle > & | volume_map | ||
) | [private] |
Definition at line 229 of file ReadCGM.cpp.
References ErrorCode, MB_SUCCESS, myGeomTool, SENSE_REVERSE, and moab::GeomTopoTool::set_sense().
Referenced by load_file().
{
ErrorCode rval;
std::map< RefEntity*, EntityHandle >::iterator ci;
for( ci = surface_map.begin(); ci != surface_map.end(); ++ci )
{
RefFace* face = (RefFace*)( ci->first );
BasicTopologyEntity *forward = 0, *reverse = 0;
for( SenseEntity* cf = face->get_first_sense_entity_ptr(); cf; cf = cf->next_on_bte() )
{
BasicTopologyEntity* vol = cf->get_parent_basic_topology_entity_ptr();
// Allocate vol to the proper topology entity (forward or reverse)
if( cf->get_sense() == CUBIT_UNKNOWN || cf->get_sense() != face->get_surface_ptr()->bridge_sense() )
{
// Check that each surface has a sense for only one volume
if( reverse )
{
std::cout << "Surface " << face->id() << " has reverse sense "
<< "with multiple volume " << reverse->id() << " and "
<< "volume " << vol->id() << std::endl;
return MB_FAILURE;
}
reverse = vol;
}
if( cf->get_sense() == CUBIT_UNKNOWN || cf->get_sense() == face->get_surface_ptr()->bridge_sense() )
{
// Check that each surface has a sense for only one volume
if( forward )
{
std::cout << "Surface " << face->id() << " has forward sense "
<< "with multiple volume " << forward->id() << " and "
<< "volume " << vol->id() << std::endl;
return MB_FAILURE;
}
forward = vol;
}
}
if( forward )
{
rval = myGeomTool->set_sense( ci->second, volume_map[forward], SENSE_FORWARD );
if( MB_SUCCESS != rval ) return rval;
}
if( reverse )
{
rval = myGeomTool->set_sense( ci->second, volume_map[reverse], SENSE_REVERSE );
if( MB_SUCCESS != rval ) return rval;
}
}
return MB_SUCCESS;
}
void moab::ReadCGM::tokenize | ( | const std::string & | str, |
std::vector< std::string > & | tokens, | ||
const char * | delimiters | ||
) |
Definition at line 1011 of file ReadCGM.cpp.
{
std::string::size_type last = str.find_first_not_of( delimiters, 0 );
std::string::size_type pos = str.find_first_of( delimiters, last );
while( std::string::npos != pos && std::string::npos != last )
{
tokens.push_back( str.substr( last, pos - last ) );
last = str.find_first_not_of( delimiters, pos );
pos = str.find_first_of( delimiters, last );
if( std::string::npos == pos ) pos = str.size();
}
}
Tag moab::ReadCGM::category_tag [private] |
Definition at line 147 of file ReadCGM.hpp.
Referenced by create_entity_sets(), create_group_entsets(), and ReadCGM().
Tag moab::ReadCGM::faceting_tol_tag [private] |
Definition at line 147 of file ReadCGM.hpp.
Referenced by load_file(), and ReadCGM().
int moab::ReadCGM::failed_curve_count [private] |
Definition at line 149 of file ReadCGM.hpp.
Referenced by create_curve_facets(), dump_fail_counts(), get_failed_curve_count(), and ReadCGM().
std::vector< int > moab::ReadCGM::failed_curves [private] |
Definition at line 150 of file ReadCGM.hpp.
Referenced by create_curve_facets(), and dump_fail_counts().
int moab::ReadCGM::failed_surface_count [private] |
Definition at line 152 of file ReadCGM.hpp.
Referenced by create_surface_facets(), dump_fail_counts(), get_failed_surface_count(), and ReadCGM().
std::vector< int > moab::ReadCGM::failed_surfaces [private] |
Definition at line 153 of file ReadCGM.hpp.
Referenced by create_surface_facets(), and dump_fail_counts().
Tag moab::ReadCGM::geom_tag [private] |
Definition at line 147 of file ReadCGM.hpp.
Referenced by create_entity_sets(), and ReadCGM().
Tag moab::ReadCGM::geometry_resabs_tag [private] |
Definition at line 147 of file ReadCGM.hpp.
Referenced by load_file(), and ReadCGM().
Tag moab::ReadCGM::id_tag [private] |
Definition at line 147 of file ReadCGM.hpp.
Referenced by create_entity_sets(), create_group_entsets(), and ReadCGM().
Interface* moab::ReadCGM::mdbImpl [private] |
interface instance
Definition at line 145 of file ReadCGM.hpp.
Referenced by create_curve_facets(), create_entity_sets(), create_group_entsets(), create_surface_facets(), create_topology(), create_vertices(), load_file(), ReadCGM(), store_group_content(), and ~ReadCGM().
GeomTopoTool* moab::ReadCGM::myGeomTool [private] |
Definition at line 131 of file ReadCGM.hpp.
Referenced by ReadCGM(), store_curve_senses(), store_surface_senses(), and ~ReadCGM().
Tag moab::ReadCGM::name_tag [private] |
Definition at line 147 of file ReadCGM.hpp.
Referenced by create_group_entsets(), and ReadCGM().
ReadUtilIface* moab::ReadCGM::readUtilIface [private] |
Definition at line 129 of file ReadCGM.hpp.
Referenced by ReadCGM(), and ~ReadCGM().