MOAB: Mesh Oriented datABase  (version 5.3.1)
MBMesquite::MeshImplTags Class Reference

#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 TagDescriptionproperties (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

Detailed Description

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.


Constructor & Destructor Documentation

Definition at line 89 of file MeshImplTags.hpp.

References clear().

    {
        clear();
    }

Member Function Documentation

Clear all data.

Definition at line 42 of file MeshImplTags.cpp.

References tagList.

Referenced by MBMesquite::MeshImpl::clear(), and ~MeshImplTags().

{
    for( std::vector< TagData* >::iterator iter = tagList.begin(); iter != tagList.end(); ++iter )
        if( *iter ) delete *iter;

    tagList.clear();
}
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

Parameters:
nameTag name (must be unique)
typeTag data type
lengthNumber of values in tag (array length, 1 for scalar)
defvalOptional 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 99 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 128 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 215 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 305 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 141 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().

{
    for( size_t i = 0; i < tagList.size(); ++i )
        if( tagList[i] && tagList[i]->desc.name == name ) return i + 1;

    return 0;
}
const TagDescription & MBMesquite::MeshImplTags::properties ( size_t  tag_handle,
MsqError err 
) const

Get tag properties.

Definition at line 149 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 163 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 253 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;
    }
}

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 369 of file MeshImplTags.cpp.

References tagList.

Referenced by MBMesquite::MeshImpl::write_vtk().

{
    size_t index = 0;
    while( index < tagList.size() && tagList[index] == NULL )
        ++index;
    return TagIterator( this, index );
}

Definition at line 221 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 356 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 343 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;
}

Friends And Related Function Documentation

friend class MeshImplTags::TagIterator [friend]

Definition at line 232 of file MeshImplTags.hpp.


Member Data Documentation

List of all members.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines