MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include <MeshImplTags.hpp>
Classes | |
class | TagData |
class | TagIterator |
Public Member Functions | |
~MeshImplTags () | |
void | clear () |
Clear all data. | |
size_t | handle (const std::string &name, MsqError &err) const |
Get tag index from name. | |
const TagDescription & | properties (size_t tag_handle, MsqError &err) const |
Get tag properties. | |
size_t | create (const std::string &name, Mesh::TagType type, unsigned length, const void *defval, MsqError &err) |
Create a new tag. | |
size_t | create (const TagDescription &desc, const void *defval, MsqError &err) |
Create a new tag. | |
void | destroy (size_t tag_index, MsqError &err) |
Remove a tag. | |
void | set_element_data (size_t tag_handle, size_t num_indices, const size_t *elem_indices, const void *tag_data, MsqError &err) |
Set tag data on elements. | |
void | set_vertex_data (size_t tag_handle, size_t num_indices, const size_t *elem_indices, const void *tag_data, MsqError &err) |
Set tag data on vertices. | |
void | get_element_data (size_t tag_handle, size_t num_indices, const size_t *elem_indices, void *tag_data, MsqError &err) const |
Get tag data on elements. | |
void | get_vertex_data (size_t tag_handle, size_t num_indices, const size_t *elem_indices, void *tag_data, MsqError &err) const |
Get tag data on vertices. | |
TagIterator | tag_begin () |
TagIterator | tag_end () |
bool | tag_has_vertex_data (size_t index, MsqError &err) |
Check if any vertices have tag. | |
bool | tag_has_element_data (size_t index, MsqError &err) |
Check if any elements have tag. | |
Static Public Member Functions | |
static size_t | size_from_tag_type (Mesh::TagType type) |
Get the size of the passed data type. | |
Private Attributes | |
std::vector< TagData * > | tagList |
Friends | |
class | MeshImplTags::TagIterator |
Store tags and tag data for Mesquite's native mesh representation. Stores for each tag: properties, element data, and vertex data. The tag element and vertex data sets are maps between some element or vertex index and a tag value.
Definition at line 86 of file MeshImplTags.hpp.
MBMesquite::MeshImplTags::~MeshImplTags | ( | ) | [inline] |
void MBMesquite::MeshImplTags::clear | ( | ) |
Clear all data.
Definition at line 42 of file MeshImplTags.cpp.
References tagList.
Referenced by MBMesquite::MeshImpl::clear(), and ~MeshImplTags().
size_t MBMesquite::MeshImplTags::create | ( | const std::string & | name, |
Mesh::TagType | type, | ||
unsigned | length, | ||
const void * | defval, | ||
MsqError & | err | ||
) |
Create a new tag.
Create a new tag with the passed properties
name | Tag name (must be unique) |
type | Tag data type |
length | Number of values in tag (array length, 1 for scalar) |
defval | Optional default value for tag |
Definition at line 70 of file MeshImplTags.cpp.
References MBMesquite::MeshImplTags::TagData::defaultValue, MBMesquite::MeshImplTags::TagData::desc, handle(), MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, MBMesquite::TagDescription::size, size_from_tag_type(), MBMesquite::MsqError::TAG_ALREADY_EXISTS, and tagList.
Referenced by MBMesquite::MeshImpl::tag_create(), MBMesquite::MeshImpl::vtk_store_cell_data(), and MBMesquite::MeshImpl::vtk_store_point_data().
{ size_t h = handle( name, err ); if( h ) { MSQ_SETERR( err )( name, MsqError::TAG_ALREADY_EXISTS ); return 0; } if( length == 0 || size_from_tag_type( type ) == 0 ) { MSQ_SETERR( err )( MsqError::INVALID_ARG ); return 0; } TagData* tag = new TagData( name, type, length ); h = tagList.size(); tagList.push_back( tag ); if( defval ) { tag->defaultValue = malloc( tag->desc.size ); memcpy( tag->defaultValue, defval, tag->desc.size ); } return h + 1; }
size_t MBMesquite::MeshImplTags::create | ( | const TagDescription & | desc, |
const void * | defval, | ||
MsqError & | err | ||
) |
Create a new tag.
Create a new tag with the passed properties
Definition at line 102 of file MeshImplTags.cpp.
References MBMesquite::MsqError::clear(), MBMesquite::MeshImplTags::TagData::defaultValue, MBMesquite::MeshImplTags::TagData::desc, handle(), MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, MBMesquite::TagDescription::name, MBMesquite::TagDescription::size, size_from_tag_type(), MBMesquite::MsqError::TAG_ALREADY_EXISTS, tagList, and MBMesquite::TagDescription::type.
{ size_t h = handle( desc.name.c_str(), err ); if( h ) { MSQ_SETERR( err )( desc.name.c_str(), MsqError::TAG_ALREADY_EXISTS ); return 0; } err.clear(); if( desc.size == 0 || ( desc.size % size_from_tag_type( desc.type ) ) != 0 ) { MSQ_SETERR( err )( MsqError::INVALID_ARG ); return 0; } TagData* tag = new TagData( desc ); h = tagList.size(); tagList.push_back( tag ); if( defval ) { tag->defaultValue = malloc( tag->desc.size ); memcpy( tag->defaultValue, defval, tag->desc.size ); } return h + 1; }
void MBMesquite::MeshImplTags::destroy | ( | size_t | tag_index, |
MsqError & | err | ||
) |
Remove a tag.
Definition at line 131 of file MeshImplTags.cpp.
References MSQ_SETERR, MBMesquite::MsqError::TAG_NOT_FOUND, and tagList.
Referenced by MBMesquite::MeshImpl::tag_delete().
{ --tag_index; if( tag_index >= tagList.size() || 0 == tagList[tag_index] ) { MSQ_SETERR( err )( MsqError::TAG_NOT_FOUND ); return; } delete tagList[tag_index]; tagList[tag_index] = 0; }
void MBMesquite::MeshImplTags::get_element_data | ( | size_t | tag_handle, |
size_t | num_indices, | ||
const size_t * | elem_indices, | ||
void * | tag_data, | ||
MsqError & | err | ||
) | const |
Get tag data on elements.
Definition at line 221 of file MeshImplTags.cpp.
References MBMesquite::MeshImplTags::TagData::defaultValue, MBMesquite::MeshImplTags::TagData::desc, MBMesquite::MeshImplTags::TagData::elementCount, MBMesquite::MeshImplTags::TagData::elementData, MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, MBMesquite::TagDescription::size, MBMesquite::MsqError::TAG_NOT_FOUND, and tagList.
Referenced by MBMesquite::MeshImpl::tag_get_element_data(), and MBMesquite::MeshImpl::write_vtk().
{ --tag_index; if( tag_index >= tagList.size() || !tagList[tag_index] ) { MSQ_SETERR( err )( "Invalid tag handle", MsqError::INVALID_ARG ); return; } TagData* tag = tagList[tag_index]; char* iter = (char*)values; const char* data = (const char*)tag->elementData; for( size_t i = 0; i < num_indices; ++i ) { const void* ptr; size_t index = index_array[i]; if( index >= tag->elementCount ) { ptr = tag->defaultValue; if( !ptr ) { MSQ_SETERR( err )( MsqError::TAG_NOT_FOUND ); return; } } else { ptr = data + index * tag->desc.size; } memcpy( iter, ptr, tag->desc.size ); iter += tag->desc.size; } }
void MBMesquite::MeshImplTags::get_vertex_data | ( | size_t | tag_handle, |
size_t | num_indices, | ||
const size_t * | elem_indices, | ||
void * | tag_data, | ||
MsqError & | err | ||
) | const |
Get tag data on vertices.
Definition at line 317 of file MeshImplTags.cpp.
References MBMesquite::MeshImplTags::TagData::defaultValue, MBMesquite::MeshImplTags::TagData::desc, MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, MBMesquite::TagDescription::size, MBMesquite::MsqError::TAG_NOT_FOUND, tagList, MBMesquite::MeshImplTags::TagData::vertexCount, and MBMesquite::MeshImplTags::TagData::vertexData.
Referenced by MBMesquite::MeshImpl::tag_get_vertex_data(), MBMesquite::MeshImpl::tag_to_bool(), and MBMesquite::MeshImpl::write_vtk().
{ --tag_index; if( tag_index >= tagList.size() || !tagList[tag_index] ) { MSQ_SETERR( err )( "Invalid tag handle", MsqError::INVALID_ARG ); return; } TagData* tag = tagList[tag_index]; char* iter = (char*)values; const char* data = (const char*)tag->vertexData; for( size_t i = 0; i < num_indices; ++i ) { const void* ptr; size_t index = index_array[i]; if( index >= tag->vertexCount ) { ptr = tag->defaultValue; if( !ptr ) { MSQ_SETERR( err )( MsqError::TAG_NOT_FOUND ); return; } } else { ptr = data + index * tag->desc.size; } memcpy( iter, ptr, tag->desc.size ); iter += tag->desc.size; } }
size_t MBMesquite::MeshImplTags::handle | ( | const std::string & | name, |
MsqError & | err | ||
) | const |
Get tag index from name.
Definition at line 144 of file MeshImplTags.cpp.
References tagList.
Referenced by create(), MBMesquite::MeshImpl::tag_get(), MBMesquite::MeshImpl::vtk_store_cell_data(), and MBMesquite::MeshImpl::vtk_store_point_data().
const TagDescription & MBMesquite::MeshImplTags::properties | ( | size_t | tag_handle, |
MsqError & | err | ||
) | const |
Get tag properties.
Definition at line 152 of file MeshImplTags.cpp.
References MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, and tagList.
Referenced by MBMesquite::MeshImpl::tag_properties(), MBMesquite::MeshImpl::tag_to_bool(), MBMesquite::MeshImpl::vtk_store_cell_data(), MBMesquite::MeshImpl::vtk_store_point_data(), and MBMesquite::MeshImpl::write_vtk().
{ static TagDescription dummy_desc; --tag_index; if( tag_index >= tagList.size() || !tagList[tag_index] ) { MSQ_SETERR( err )( "Invalid tag handle", MsqError::INVALID_ARG ); return dummy_desc; } return tagList[tag_index]->desc; }
void MBMesquite::MeshImplTags::set_element_data | ( | size_t | tag_handle, |
size_t | num_indices, | ||
const size_t * | elem_indices, | ||
const void * | tag_data, | ||
MsqError & | err | ||
) |
Set tag data on elements.
Definition at line 166 of file MeshImplTags.cpp.
References MBMesquite::MeshImplTags::TagData::defaultValue, MBMesquite::MeshImplTags::TagData::desc, MBMesquite::MeshImplTags::TagData::elementCount, MBMesquite::MeshImplTags::TagData::elementData, MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, MBMesquite::TagDescription::size, and tagList.
Referenced by MBMesquite::MeshImpl::tag_set_element_data(), and MBMesquite::MeshImpl::vtk_store_cell_data().
{ size_t i; char* data; --tag_index; if( tag_index >= tagList.size() || !tagList[tag_index] ) { MSQ_SETERR( err )( "Invalid tag handle", MsqError::INVALID_ARG ); return; } TagData* tag = tagList[tag_index]; // Get highest element index size_t total = tag->elementCount; for( i = 0; i < num_indices; ++i ) if( index_array[i] >= total ) total = index_array[i] + 1; // If need more space if( total > tag->elementCount ) { // allocate more space tag->elementData = realloc( tag->elementData, tag->desc.size * total ); // if a default value, initialize new space with it if( tag->defaultValue ) { data = ( (char*)tag->elementData ) + tag->elementCount * tag->desc.size; for( i = tag->elementCount; i < total; ++i ) { memcpy( data, tag->defaultValue, tag->desc.size ); data += tag->desc.size; } } else { memset( (char*)tag->elementData + tag->elementCount * tag->desc.size, 0, ( total - tag->elementCount ) * tag->desc.size ); } tag->elementCount = total; } // Store passed tag values data = (char*)tag->elementData; const char* iter = (const char*)values; for( i = 0; i < num_indices; ++i ) { memcpy( data + index_array[i] * tag->desc.size, iter, tag->desc.size ); iter += tag->desc.size; } }
void MBMesquite::MeshImplTags::set_vertex_data | ( | size_t | tag_handle, |
size_t | num_indices, | ||
const size_t * | elem_indices, | ||
const void * | tag_data, | ||
MsqError & | err | ||
) |
Set tag data on vertices.
Definition at line 262 of file MeshImplTags.cpp.
References MBMesquite::MeshImplTags::TagData::defaultValue, MBMesquite::MeshImplTags::TagData::desc, MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, MBMesquite::TagDescription::size, tagList, MBMesquite::MeshImplTags::TagData::vertexCount, and MBMesquite::MeshImplTags::TagData::vertexData.
Referenced by MBMesquite::MeshImpl::tag_set_vertex_data(), and MBMesquite::MeshImpl::vtk_store_point_data().
{ size_t i; char* data; --tag_index; if( tag_index >= tagList.size() || !tagList[tag_index] ) { MSQ_SETERR( err )( "Invalid tag handle", MsqError::INVALID_ARG ); return; } TagData* tag = tagList[tag_index]; // Get highest element index size_t total = tag->vertexCount; for( i = 0; i < num_indices; ++i ) if( index_array[i] >= total ) total = index_array[i] + 1; // If need more space if( total > tag->vertexCount ) { // allocate more space tag->vertexData = realloc( tag->vertexData, tag->desc.size * total ); // if a default value, initialize new space with it if( tag->defaultValue ) { data = ( (char*)tag->vertexData ) + tag->vertexCount * tag->desc.size; for( i = tag->vertexCount; i < total; ++i ) { memcpy( data, tag->defaultValue, tag->desc.size ); data += tag->desc.size; } } else { memset( (char*)tag->vertexData + tag->vertexCount * tag->desc.size, 0, ( total - tag->vertexCount ) * tag->desc.size ); } tag->vertexCount = total; } // Store passed tag values data = (char*)tag->vertexData; const char* iter = (const char*)values; for( i = 0; i < num_indices; ++i ) { memcpy( data + index_array[i] * tag->desc.size, iter, tag->desc.size ); iter += tag->desc.size; } }
size_t MBMesquite::MeshImplTags::size_from_tag_type | ( | Mesh::TagType | type | ) | [static] |
Get the size of the passed data type.
Definition at line 50 of file MeshImplTags.cpp.
References MBMesquite::Mesh::BOOL, MBMesquite::Mesh::BYTE, MBMesquite::Mesh::DOUBLE, MBMesquite::Mesh::HANDLE, and MBMesquite::Mesh::INT.
Referenced by create(), MBMesquite::MeshImpl::tag_create(), MBMesquite::MeshImpl::tag_properties(), and MBMesquite::MeshImpl::vtk_write_attrib_data().
{ switch( type ) { case Mesh::BYTE: return 1; case Mesh::BOOL: return sizeof( bool ); case Mesh::DOUBLE: return sizeof( double ); case Mesh::INT: return sizeof( int ); case Mesh::HANDLE: return sizeof( void* ); default: assert( 0 ); return 0; } }
Definition at line 384 of file MeshImplTags.cpp.
References tagList.
Referenced by MBMesquite::MeshImpl::write_vtk().
TagIterator MBMesquite::MeshImplTags::tag_end | ( | ) | [inline] |
Definition at line 237 of file MeshImplTags.hpp.
References tagList.
Referenced by MBMesquite::MeshImpl::write_vtk().
{ return TagIterator( this, tagList.size() ); }
bool MBMesquite::MeshImplTags::tag_has_element_data | ( | size_t | index, |
MsqError & | err | ||
) |
Check if any elements have tag.
Definition at line 371 of file MeshImplTags.cpp.
References MBMesquite::MeshImplTags::TagData::defaultValue, MBMesquite::MeshImplTags::TagData::elementData, MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, and tagList.
Referenced by MBMesquite::MeshImpl::write_vtk().
{ --tag_index; if( tag_index >= tagList.size() || !tagList[tag_index] ) { MSQ_SETERR( err )( "Invalid tag handle", MsqError::INVALID_ARG ); return false; } TagData* tag = tagList[tag_index]; return 0 != tag->elementData || tag->defaultValue; }
bool MBMesquite::MeshImplTags::tag_has_vertex_data | ( | size_t | index, |
MsqError & | err | ||
) |
Check if any vertices have tag.
Definition at line 358 of file MeshImplTags.cpp.
References MBMesquite::MeshImplTags::TagData::defaultValue, MBMesquite::MsqError::INVALID_ARG, MSQ_SETERR, tagList, and MBMesquite::MeshImplTags::TagData::vertexData.
Referenced by MBMesquite::MeshImpl::tag_to_bool(), and MBMesquite::MeshImpl::write_vtk().
{ --tag_index; if( tag_index >= tagList.size() || !tagList[tag_index] ) { MSQ_SETERR( err )( "Invalid tag handle", MsqError::INVALID_ARG ); return false; } TagData* tag = tagList[tag_index]; return 0 != tag->vertexData || tag->defaultValue; }
friend class MeshImplTags::TagIterator [friend] |
Definition at line 248 of file MeshImplTags.hpp.
std::vector< TagData* > MBMesquite::MeshImplTags::tagList [private] |
Definition at line 250 of file MeshImplTags.hpp.
Referenced by clear(), create(), destroy(), get_element_data(), get_vertex_data(), handle(), MBMesquite::MeshImplTags::TagIterator::operator++(), MBMesquite::MeshImplTags::TagIterator::operator--(), properties(), set_element_data(), set_vertex_data(), tag_begin(), tag_end(), tag_has_element_data(), and tag_has_vertex_data().