Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <WriteSmf.hpp>
Public Member Functions | |
WriteSmf (Interface *impl) | |
Constructor. | |
virtual | ~WriteSmf () |
Destructor. | |
ErrorCode | write_file (const char *file_name, const bool overwrite, const FileOptions &opts, const EntityHandle *output_list, const int num_sets, const std::vector< std::string > &qa_list, const Tag *tag_list=NULL, int num_tags=0, int export_dimension=3) |
writes out a file | |
Static Public Member Functions | |
static WriterIface * | factory (Interface *) |
Private Attributes | |
Interface * | mbImpl |
WriteUtilIface * | writeTool |
Definition at line 29 of file WriteSmf.hpp.
moab::WriteSmf::WriteSmf | ( | Interface * | impl | ) |
Constructor.
Definition at line 54 of file WriteSmf.cpp.
References moab::Interface::query_interface(), and writeTool.
Referenced by factory().
moab::WriteSmf::~WriteSmf | ( | ) | [virtual] |
Destructor.
Definition at line 60 of file WriteSmf.cpp.
References mbImpl, moab::Interface::release_interface(), and writeTool.
{ mbImpl->release_interface( writeTool ); }
WriterIface * moab::WriteSmf::factory | ( | Interface * | iface | ) | [static] |
Definition at line 49 of file WriteSmf.cpp.
References WriteSmf().
Referenced by moab::ReaderWriterSet::ReaderWriterSet().
ErrorCode moab::WriteSmf::write_file | ( | const char * | file_name, |
const bool | overwrite, | ||
const FileOptions & | opts, | ||
const EntityHandle * | output_list, | ||
const int | num_sets, | ||
const std::vector< std::string > & | qa_list, | ||
const Tag * | tag_list = NULL , |
||
int | num_tags = 0 , |
||
int | export_dimension = 3 |
||
) | [virtual] |
writes out a file
Implements moab::WriterIface.
Definition at line 65 of file WriteSmf.cpp.
References moab::Range::begin(), moab::WriteUtilIface::check_doesnt_exist(), moab::DEFAULT_PRECISION, moab::Range::end(), ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), moab::Interface::get_entities_by_type(), moab::FileOptions::get_int_option(), MB_FILE_WRITE_ERROR, MB_INVALID_SIZE, MB_MEMORY_ALLOCATION_FAILED, MB_SET_ERR, MB_SUCCESS, mbImpl, MBTRI, moab::Range::size(), and writeTool.
{ ErrorCode rval; // Get precision for node coordinates int precision; if( MB_SUCCESS != opts.get_int_option( "PRECISION", precision ) ) precision = DEFAULT_PRECISION; // Honor overwrite flag if( !overwrite ) { rval = writeTool->check_doesnt_exist( file_name ); if( MB_SUCCESS != rval ) return rval; } // Create file std::ofstream file( file_name ); if( !file ) { MB_SET_ERR( MB_FILE_WRITE_ERROR, "Could not open file: " << file_name ); } file.precision( precision ); // Get entities to write Range triangles; if( !output_list || !num_sets ) { rval = mbImpl->get_entities_by_type( 0, MBTRI, triangles, false ); if( MB_SUCCESS != rval ) return rval; // Somehow get all the nodes from this range, order them, uniquify, then use binary search } else { // Get all triangles from output sets for( int i = 0; i < num_sets; i++ ) rval = mbImpl->get_entities_by_type( output_list[i], MBTRI, triangles, false ); } // Use an array with all the connectivities in the triangles; it will be converted later to ints int numTriangles = triangles.size(); int array_alloc = 3 * numTriangles; // Allocated size of 'array' EntityHandle* array = new EntityHandle[array_alloc]; // ptr to working array of result handles // Fill up array with node handles; reorder and uniquify if( !array ) return MB_MEMORY_ALLOCATION_FAILED; int fillA = 0; for( Range::const_iterator e = triangles.begin(); e != triangles.end(); ++e ) { const EntityHandle* conn; int conn_len; rval = mbImpl->get_connectivity( *e, conn, conn_len ); if( MB_SUCCESS != rval ) { delete[] array; return rval; } if( 3 != conn_len ) { delete[] array; return MB_INVALID_SIZE; } for( int i = 0; i < conn_len; ++i ) array[fillA++] = conn[i]; } if( fillA != array_alloc ) { delete[] array; return MB_INVALID_SIZE; } std::sort( array, array + array_alloc ); int numNodes = std::unique( array, array + array_alloc ) - array; file << "#$SMF 1.0\n"; file << "#$vertices " << numNodes << std::endl; file << "#$faces " << numTriangles << std::endl; file << "# \n"; file << "# output from MOAB \n"; file << "# \n"; // Output first the nodes // num nodes?? // Write the nodes double coord[3]; for( int i = 0; i < numNodes; i++ ) { EntityHandle node_handle = array[i]; rval = mbImpl->get_coords( &node_handle, 1, coord ); if( rval != MB_SUCCESS ) { delete[] array; return rval; } file << "v " << coord[0] << " " << coord[1] << " " << coord[2] << std::endl; } // Write faces now // Leave a blank line for cosmetics file << " \n"; for( Range::const_iterator e = triangles.begin(); e != triangles.end(); ++e ) { const EntityHandle* conn; int conn_len; rval = mbImpl->get_connectivity( *e, conn, conn_len ); if( MB_SUCCESS != rval ) { delete[] array; return rval; } if( 3 != conn_len ) { delete[] array; return MB_INVALID_SIZE; } file << "f "; for( int i = 0; i < conn_len; ++i ) { int indexInArray = std::lower_bound( array, array + numNodes, conn[i] ) - array; file << indexInArray + 1 << " "; } file << std::endl; } file.close(); delete[] array; return MB_SUCCESS; }
Interface* moab::WriteSmf::mbImpl [private] |
Definition at line 53 of file WriteSmf.hpp.
Referenced by write_file(), and ~WriteSmf().
WriteUtilIface* moab::WriteSmf::writeTool [private] |
Definition at line 54 of file WriteSmf.hpp.
Referenced by write_file(), WriteSmf(), and ~WriteSmf().