![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "MeshAssocPairSide.hpp"
00002
00003 #include
00004 #include
00005 #include
00006
00007 #include
00008
00009 #include "Lasso.hpp"
00010 #include "iRel_Lasso.hpp"
00011
00012 #define PROCESS_ERROR \
00013 do \
00014 { \
00015 if( iBase_SUCCESS != result ) \
00016 { \
00017 char this_descr[120]; \
00018 iMesh_getDescription( instance_, this_descr, 120 ); \
00019 ERRORR( result, this_descr ); \
00020 } \
00021 } while( false )
00022
00023 // Redefine LASSOI
00024 #undef LASSOI
00025 #define LASSOI lasso_instance( relation )
00026
00027 static const char* GLOBAL_ID_TAG_NAME = "GLOBAL_ID";
00028 static const char* MESH_DIMENSION_TAG_NAME = "GEOM_DIMENSION";
00029 static const char* RELATION_TAG_NAME = "__MESH_ASSOCIATION";
00030
00031 MeshAssocPairSide::MeshAssocPairSide( iRel_Instance p_relation, iBase_Instance p_instance, int p_id )
00032 : relation( p_relation ), instance_( reinterpret_cast< iMesh_Instance >( p_instance ) ), id( p_id )
00033 {
00034 int result;
00035
00036 create_relation_side();
00037
00038 iMesh_getTagHandle( instance_, GLOBAL_ID_TAG_NAME, &gid_tag, &result, strlen( GLOBAL_ID_TAG_NAME ) );
00039 if( result == iBase_TAG_NOT_FOUND )
00040 {
00041 iMesh_createTag( instance_, GLOBAL_ID_TAG_NAME, 1, iBase_INTEGER, &gid_tag, &result,
00042 strlen( GLOBAL_ID_TAG_NAME ) );
00043 }
00044
00045 iMesh_getTagHandle( instance_, MESH_DIMENSION_TAG_NAME, &dim_tag, &result, strlen( MESH_DIMENSION_TAG_NAME ) );
00046 if( result == iBase_TAG_NOT_FOUND ) dim_tag = NULL;
00047 }
00048
00049 MeshAssocPairSide::~MeshAssocPairSide()
00050 {
00051 destroy_relation_side();
00052 }
00053
00054 iBase_Instance MeshAssocPairSide::instance() const
00055 {
00056 return instance_;
00057 }
00058
00059 iRel_IfaceType MeshAssocPairSide::type() const
00060 {
00061 return iRel_IMESH_IFACE;
00062 }
00063
00064 int MeshAssocPairSide::create_relation_side()
00065 {
00066 int result;
00067 std::stringstream ss;
00068 ss << RELATION_TAG_NAME << id;
00069 std::string rel_tag_name( ss.str() );
00070
00071 iMesh_getTagHandle( instance_, rel_tag_name.c_str(), &relation_tag, &result, rel_tag_name.size() );
00072 if( result == iBase_TAG_NOT_FOUND )
00073 {
00074 iMesh_createTag( instance_, rel_tag_name.c_str(), 1, iBase_ENTITY_HANDLE, &relation_tag, &result,
00075 rel_tag_name.size() );
00076 }
00077
00078 PROCESS_ERROR;
00079 RETURNR( iBase_SUCCESS );
00080 }
00081
00082 int MeshAssocPairSide::destroy_relation_side()
00083 {
00084 if( relation_tag )
00085 {
00086 int result;
00087
00088 iMesh_destroyTag( instance_, relation_tag, true, &result );
00089 relation_tag = NULL;
00090
00091 PROCESS_ERROR;
00092 }
00093 RETURNR( iBase_SUCCESS );
00094 }
00095
00096 int MeshAssocPairSide::get_all_entities( int dimension,
00097 iBase_EntityHandle** entities,
00098 int* entities_alloc,
00099 int* entities_size )
00100 {
00101 int this_type = ( dimension == -1 ? iBase_ALL_TYPES : dimension );
00102 int result;
00103
00104 iMesh_getEntities( instance_, 0, this_type, iMesh_ALL_TOPOLOGIES, entities, entities_alloc, entities_size,
00105 &result );
00106 PROCESS_ERROR;
00107 RETURNR( iBase_SUCCESS );
00108 }
00109
00110 int MeshAssocPairSide::get_all_sets( iBase_EntitySetHandle** sets, int* sets_alloc, int* sets_size )
00111 {
00112 int result;
00113
00114 iMesh_getEntSets( instance_, 0, 0, sets, sets_alloc, sets_size, &result );
00115 PROCESS_ERROR;
00116 RETURNR( iBase_SUCCESS );
00117 }
00118
00119 int MeshAssocPairSide::get_entities( int dimension,
00120 iBase_EntitySetHandle set_handle,
00121 iBase_EntityHandle** entities,
00122 int* entities_alloc,
00123 int* entities_size )
00124 {
00125 int this_type = ( dimension == -1 ? iBase_ALL_TYPES : dimension );
00126 int result;
00127
00128 iMesh_getEntities( instance_, set_handle, this_type, iMesh_ALL_TOPOLOGIES, entities, entities_alloc, entities_size,
00129 &result );
00130 PROCESS_ERROR;
00131 RETURNR( iBase_SUCCESS );
00132 }
00133
00134 int MeshAssocPairSide::get_ents_dims( iBase_EntityHandle* entities,
00135 int entities_size,
00136 int** ent_types,
00137 int* ent_types_alloc,
00138 int* ent_types_size )
00139 {
00140 int result;
00141
00142 iMesh_getEntArrType( instance_, entities, entities_size, ent_types, ent_types_alloc, ent_types_size, &result );
00143 PROCESS_ERROR;
00144 RETURNR( iBase_SUCCESS );
00145 }
00146
00147 int MeshAssocPairSide::get_related_ents( iBase_EntityHandle** entities, int* entities_alloc, int* entities_size )
00148 {
00149 int result;
00150 iMesh_getEntsByTagsRec( instance_, 0, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, &relation_tag, NULL, 1, false,
00151 entities, entities_alloc, entities_size, &result );
00152 PROCESS_ERROR;
00153 RETURNR( iBase_SUCCESS );
00154 }
00155
00156 int MeshAssocPairSide::get_related_sets( iBase_EntitySetHandle** sets, int* sets_alloc, int* sets_size )
00157 {
00158 int result;
00159 iMesh_getEntSetsByTagsRec( instance_, 0, &relation_tag, NULL, 1, false, sets, sets_alloc, sets_size, &result );
00160 PROCESS_ERROR;
00161 RETURNR( iBase_SUCCESS );
00162 }
00163
00164 int MeshAssocPairSide::get_relation_side( iBase_EntityHandle* entities, int num_entities, void* values )
00165 {
00166 int values_alloc = num_entities * sizeof( iBase_EntityHandle );
00167 int values_size;
00168 int result;
00169
00170 iMesh_getArrData( instance_, entities, num_entities, relation_tag, &values, &values_alloc, &values_size, &result );
00171 PROCESS_ERROR;
00172 RETURNR( iBase_SUCCESS );
00173 }
00174
00175 int MeshAssocPairSide::get_relation_side( iBase_EntitySetHandle* sets, int num_sets, void* values )
00176 {
00177 char* data = static_cast< char* >( values );
00178 int values_alloc = sizeof( iBase_EntityHandle );
00179 int values_size;
00180 int result;
00181
00182 for( int i = 0; i < num_sets; i++ )
00183 {
00184 iMesh_getEntSetData( instance_, sets[i], relation_tag, reinterpret_cast< void** >( &data ), &values_alloc,
00185 &values_size, &result );
00186 data += values_size;
00187 PROCESS_ERROR;
00188 }
00189 RETURNR( iBase_SUCCESS );
00190 }
00191
00192 int MeshAssocPairSide::set_relation_side( iBase_EntityHandle* entities, int num_entities, const void* values )
00193 {
00194 int result;
00195
00196 iMesh_setArrData( instance_, entities, num_entities, relation_tag, static_cast< const char* >( values ),
00197 num_entities * sizeof( iBase_EntityHandle ), &result );
00198 PROCESS_ERROR;
00199 RETURNR( iBase_SUCCESS );
00200 }
00201
00202 int MeshAssocPairSide::set_relation_side( iBase_EntitySetHandle* sets, int num_sets, const void* values )
00203 {
00204 const char* data = static_cast< const char* >( values );
00205 int size = sizeof( iBase_EntityHandle );
00206 int result;
00207
00208 for( int i = 0; i < num_sets; i++ )
00209 {
00210 iMesh_setEntSetData( instance_, sets[i], relation_tag, data, size, &result );
00211 data += size;
00212 PROCESS_ERROR;
00213 }
00214 RETURNR( iBase_SUCCESS );
00215 }
00216
00217 int MeshAssocPairSide::rmv_relation_side( iBase_EntityHandle* entities, int num_entities )
00218 {
00219 int result;
00220
00221 iMesh_rmvArrTag( instance_, entities, num_entities, relation_tag, &result );
00222 PROCESS_ERROR;
00223 RETURNR( iBase_SUCCESS );
00224 }
00225
00226 int MeshAssocPairSide::rmv_relation_side( iBase_EntitySetHandle* sets, int num_sets )
00227 {
00228 int result;
00229
00230 for( int i = 0; i < num_sets; i++ )
00231 {
00232 iMesh_rmvEntSetTag( instance_, sets[i], relation_tag, &result );
00233 PROCESS_ERROR;
00234 }
00235
00236 RETURNR( iBase_SUCCESS );
00237 }
00238
00239 int MeshAssocPairSide::get_iterator( iBase_EntitySetHandle set, iBase_EntityIterator* iter )
00240 {
00241 int result;
00242 int resilient = 0;
00243 iMesh_initEntIter( instance_, set, iBase_ALL_TYPES, iMesh_ALL_TOPOLOGIES, resilient, iter, &result );
00244 RETURNR( iBase_SUCCESS );
00245 }
00246
00247 int MeshAssocPairSide::get_gids( iBase_EntityHandle* entities, int num_entities, int* values )
00248 {
00249 int values_alloc = num_entities * sizeof( int );
00250 int values_size;
00251 int result;
00252
00253 iMesh_getArrData( instance_, entities, num_entities, gid_tag, &values, &values_alloc, &values_size, &result );
00254 PROCESS_ERROR;
00255 RETURNR( iBase_SUCCESS );
00256 }
00257
00258 int MeshAssocPairSide::get_gids( iBase_EntitySetHandle* sets, int num_sets, int* values )
00259 {
00260 char* data = reinterpret_cast< char* >( values );
00261 int values_alloc = sizeof( int );
00262 int values_size;
00263 int result;
00264
00265 for( int i = 0; i < num_sets; i++ )
00266 {
00267 iMesh_getEntSetData( instance_, sets[i], gid_tag, reinterpret_cast< void** >( &data ), &values_alloc,
00268 &values_size, &result );
00269 data += values_size;
00270 PROCESS_ERROR;
00271 }
00272 RETURNR( iBase_SUCCESS );
00273 }
00274
00275 int MeshAssocPairSide::get_dims( iBase_EntityHandle* entities, int num_entities, int* values )
00276 {
00277 int values_alloc = num_entities * sizeof( int );
00278 int values_size;
00279 int result;
00280
00281 iMesh_getArrData( instance_, entities, num_entities, dim_tag, &values, &values_alloc, &values_size, &result );
00282 PROCESS_ERROR;
00283 RETURNR( iBase_SUCCESS );
00284 }
00285
00286 int MeshAssocPairSide::get_dims( iBase_EntitySetHandle* sets, int num_sets, int* values )
00287 {
00288 char* data = reinterpret_cast< char* >( values );
00289 int values_alloc = sizeof( int );
00290 int values_size;
00291 int result;
00292
00293 for( int i = 0; i < num_sets; i++ )
00294 {
00295 iMesh_getEntSetData( instance_, sets[i], dim_tag, reinterpret_cast< void** >( &data ), &values_alloc,
00296 &values_size, &result );
00297 data += values_size;
00298 PROCESS_ERROR;
00299 }
00300 RETURNR( iBase_SUCCESS );
00301 }