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