![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "AssocPair.hpp"
00002
00003 #include
00004
00005 #include "Lasso.hpp"
00006
00007 #ifdef ENABLE_IGEOM
00008 #include "GeomAssocPairSide.hpp"
00009 #endif
00010 #ifdef ENABLE_FBIGEOM
00011 #include "FBGeomAssocPairSide.hpp"
00012 #endif
00013 #ifdef ENABLE_IMESH
00014 #include "MeshAssocPairSide.hpp"
00015 #endif
00016
00017 int AssocPair::currId = 0;
00018
00019 AssocPair::AssocPair( iRel_Instance p_instance,
00020 iBase_Instance iface0,
00021 iRel_RelationType ent_or_set0,
00022 iRel_IfaceType type0,
00023 iRel_RelationStatus p_status0,
00024 iBase_Instance iface1,
00025 iRel_RelationType ent_or_set1,
00026 iRel_IfaceType type1,
00027 iRel_RelationStatus p_status1 )
00028 : instance( p_instance )
00029 {
00030 pairId = currId++;
00031
00032 iBase_Instance ifaces[] = { iface0, iface1 };
00033 iRel_IfaceType types[] = { type0, type1 };
00034 for( int i = 0; i < 2; i++ )
00035 {
00036 switch( types[i] )
00037 {
00038 #ifdef ENABLE_IGEOM
00039 case iRel_IGEOM_IFACE:
00040 relSides[i] = new GeomAssocPairSide( instance, ifaces[i], pairId );
00041 break;
00042 #endif
00043 #ifdef ENABLE_FBIGEOM
00044 case iRel_FBIGEOM_IFACE:
00045 relSides[i] = new FBGeomAssocPairSide( instance, ifaces[i], pairId );
00046 break;
00047 #endif
00048 #ifdef ENABLE_IMESH
00049 case iRel_IMESH_IFACE:
00050 relSides[i] = new MeshAssocPairSide( instance, ifaces[i], pairId );
00051 break;
00052 #endif
00053 default:
00054 relSides[i] = NULL;
00055 }
00056 }
00057
00058 entOrSet[0] = ent_or_set0;
00059 entOrSet[1] = ent_or_set1;
00060 relStatus[0] = p_status0;
00061 relStatus[1] = p_status1;
00062 }
00063
00064 AssocPair::~AssocPair()
00065 {
00066 for( int i = 0; i < 2; i++ )
00067 delete relSides[i];
00068 }
00069
00070 int AssocPair::get_all_entities( int iface_no,
00071 int dimension,
00072 iBase_EntityHandle** entities,
00073 int* entities_alloc,
00074 int* entities_size )
00075 {
00076 return relSides[iface_no]->get_all_entities( dimension, entities, entities_alloc, entities_size );
00077 }
00078
00079 int AssocPair::get_all_sets( int iface_no, iBase_EntitySetHandle** sets, int* sets_alloc, int* sets_size )
00080 {
00081 return relSides[iface_no]->get_all_sets( sets, sets_alloc, sets_size );
00082 }
00083
00084 int AssocPair::get_entities( int iface_no,
00085 int dimension,
00086 iBase_EntitySetHandle set_handle,
00087 iBase_EntityHandle** entities,
00088 int* entities_alloc,
00089 int* entities_size )
00090 {
00091 return relSides[iface_no]->get_entities( dimension, set_handle, entities, entities_alloc, entities_size );
00092 }
00093
00094 int AssocPair::get_ents_dims( int iface_no,
00095 iBase_EntityHandle* entities,
00096 int entities_size,
00097 int** ent_types,
00098 int* ent_types_alloc,
00099 int* ent_types_size )
00100 {
00101 return relSides[iface_no]->get_ents_dims( entities, entities_size, ent_types, ent_types_alloc, ent_types_size );
00102 }
00103
00104 int AssocPair::set_relation( iBase_EntityHandle ent1, iBase_EntityHandle ent2 )
00105 {
00106 if( entOrSet[0] == iRel_SET || entOrSet[1] == iRel_SET ) ERRORR( iBase_FAILURE, "Invalid relation type" );
00107
00108 // check that if we're passing in an ent for a 'both'-type
00109 // assoc, there's already a set associated to the other ent
00110 iBase_EntityHandle tmp_ent;
00111 if( entOrSet[0] == iRel_BOTH && relSides[1]->get_relation_side( &ent2, 1, &tmp_ent ) != iBase_SUCCESS )
00112 ERRORR( iBase_FAILURE, "Couldn't find associated set on left side" );
00113 if( entOrSet[1] == iRel_BOTH && relSides[0]->get_relation_side( &ent1, 1, &tmp_ent ) != iBase_SUCCESS )
00114 ERRORR( iBase_FAILURE, "Couldn't find associated set on right side" );
00115
00116 // set ent1 => ent2
00117 if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &ent1, 1, &ent2 ) );
00118
00119 // set ent1 <= ent2
00120 if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &ent2, 1, &ent1 ) );
00121
00122 RETURNR( iBase_SUCCESS );
00123 }
00124
00125 int AssocPair::set_relation( iBase_EntityHandle ent1, iBase_EntitySetHandle set2 )
00126 {
00127 if( entOrSet[0] == iRel_SET || entOrSet[1] == iRel_ENTITY ) ERRORR( iBase_FAILURE, "Invalid relation type" );
00128
00129 // check that if we're passing in an ent for a 'both'-type
00130 // assoc, there's already a set associated to the other ent
00131 iBase_EntityHandle tmp_ent;
00132 if( entOrSet[0] == iRel_BOTH && relSides[1]->get_relation_side( &set2, 1, &tmp_ent ) != iBase_SUCCESS )
00133 ERRORR( iBase_FAILURE, "Couldn't find associated set on left side" );
00134
00135 // set ent1 => set2
00136 if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &ent1, 1, &set2 ) );
00137
00138 // set ent1 <= set2
00139 if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &set2, 1, &ent1 ) );
00140
00141 // if the right side is a 'both'-type association, set the contents of set2
00142 // to point to ent1 as well
00143 if( entOrSet[1] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 1, set2, ent1 ) );
00144
00145 RETURNR( iBase_SUCCESS );
00146 }
00147
00148 int AssocPair::set_relation( iBase_EntitySetHandle set1, iBase_EntityHandle ent2 )
00149 {
00150 if( entOrSet[0] == iRel_ENTITY || entOrSet[1] == iRel_SET ) ERRORR( iBase_FAILURE, "Invalid relation type" );
00151
00152 // check that if we're passing in an ent for a 'both'-type
00153 // assoc, there's already a set associated to the other ent
00154 iBase_EntityHandle tmp_ent;
00155 if( entOrSet[1] == iRel_BOTH && relSides[0]->get_relation_side( &set1, 1, &tmp_ent ) != iBase_SUCCESS )
00156 ERRORR( iBase_FAILURE, "Couldn't find associated set on right side" );
00157
00158 // set set1 => ent2
00159 if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &set1, 1, &ent2 ) );
00160
00161 // set ent1 <= set2
00162 if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &ent2, 1, &set1 ) );
00163
00164 // if the left side is a 'both'-type association, set the contents of set1
00165 // to point to ent2 as well
00166 if( entOrSet[0] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 0, set1, ent2 ) );
00167
00168 RETURNR( iBase_SUCCESS );
00169 }
00170
00171 int AssocPair::set_relation( iBase_EntitySetHandle set1, iBase_EntitySetHandle set2 )
00172 {
00173 if( entOrSet[0] == iRel_ENTITY || entOrSet[1] == iRel_ENTITY ) ERRORR( iBase_FAILURE, "Invalid relation type" );
00174
00175 // set set1 => set2
00176 if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &set1, 1, &set2 ) );
00177
00178 // set set1 <= set2
00179 if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &set2, 1, &set1 ) );
00180
00181 // if either side is a 'both'-type association, set the contents of set1
00182 // to point to set2 as well (and/or vice-versa)
00183 if( entOrSet[0] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 0, set1, set2 ) );
00184 if( entOrSet[1] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 1, set2, set1 ) );
00185
00186 RETURNR( iBase_SUCCESS );
00187 }
00188
00189 int AssocPair::get_relation( int iface_no,
00190 iBase_EntityHandle* entities,
00191 int num_entities,
00192 iBase_EntityHandle* tag_values )
00193 {
00194 if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
00195 if( entOrSet[!iface_no] != iRel_ENTITY ) // other iface is sets
00196 ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected EntitySet, got Entity" );
00197
00198 return relSides[iface_no]->get_relation_side( entities, num_entities, tag_values );
00199 }
00200
00201 int AssocPair::get_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets, iBase_EntityHandle* tag_values )
00202 {
00203 if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
00204 if( entOrSet[!iface_no] != iRel_ENTITY ) // other iface is sets
00205 ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected EntitySet, got Entity" );
00206
00207 return relSides[iface_no]->get_relation_side( sets, num_sets, tag_values );
00208 }
00209
00210 int AssocPair::get_relation( int iface_no,
00211 iBase_EntityHandle* entities,
00212 int num_entities,
00213 iBase_EntitySetHandle* tag_values )
00214 {
00215 if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
00216 if( entOrSet[!iface_no] == iRel_ENTITY ) // other iface is not sets
00217 ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected Entity, got EntitySet" );
00218
00219 return relSides[iface_no]->get_relation_side( entities, num_entities, tag_values );
00220 }
00221
00222 int AssocPair::get_relation( int iface_no,
00223 iBase_EntitySetHandle* sets,
00224 int num_sets,
00225 iBase_EntitySetHandle* tag_values )
00226 {
00227 if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
00228 if( entOrSet[!iface_no] == iRel_ENTITY ) // other iface is not sets
00229 ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected Entity, got EntitySet" );
00230
00231 return relSides[iface_no]->get_relation_side( sets, num_sets, tag_values );
00232 }
00233
00234 int AssocPair::get_relation( int iface_no,
00235 iBase_EntityHandle* entities,
00236 int num_entities,
00237 iBase_EntityIterator* tag_values )
00238 {
00239 std::vector< iBase_EntitySetHandle > sets( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &sets[0] ) );
00240
00241 for( int i = 0; i < num_entities; i++ )
00242 CHK_ERRORR( relSides[i]->get_iterator( sets[i], &tag_values[i] ) );
00243
00244 RETURNR( iBase_SUCCESS );
00245 }
00246
00247 int AssocPair::get_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets, iBase_EntityIterator* tag_values )
00248 {
00249 std::vector< iBase_EntitySetHandle > sets2( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &sets2[0] ) );
00250
00251 for( int i = 0; i < num_sets; i++ )
00252 CHK_ERRORR( relSides[iface_no]->get_iterator( sets2[i], &tag_values[i] ) );
00253
00254 RETURNR( iBase_SUCCESS );
00255 }
00256
00257 int AssocPair::rmv_relation( int iface_no, iBase_EntityHandle* entities, int num_entities )
00258 {
00259 if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
00260
00261 // TODO: handle "both" case
00262
00263 // Remove the opposite side first
00264 if( relStatus[!iface_no] == iRel_ACTIVE )
00265 {
00266 if( entOrSet[!iface_no] == iRel_ENTITY )
00267 {
00268 std::vector< iBase_EntityHandle > other_entities( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &other_entities[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_entities[0], num_entities ) );
00269 }
00270 else
00271 {
00272 std::vector< iBase_EntitySetHandle > other_sets( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &other_sets[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_sets[0], num_entities ) );
00273 }
00274 }
00275
00276 return relSides[iface_no]->rmv_relation_side( entities, num_entities );
00277 }
00278
00279 int AssocPair::rmv_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets )
00280 {
00281 if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
00282
00283 // TODO: handle "both" case
00284
00285 // Remove the opposite side first
00286 if( relStatus[!iface_no] == iRel_ACTIVE )
00287 {
00288 if( entOrSet[!iface_no] == iRel_ENTITY )
00289 {
00290 std::vector< iBase_EntityHandle > other_entities( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &other_entities[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_entities[0], num_sets ) );
00291 }
00292 else
00293 {
00294 std::vector< iBase_EntitySetHandle > other_sets( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &other_sets[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_sets[0], num_sets ) );
00295 }
00296 }
00297
00298 return relSides[iface_no]->rmv_relation_side( sets, num_sets );
00299 }
00300
00301 int AssocPair::get_gids( int iface_no, iBase_EntityHandle* entities, int num_entities, int* tag_values )
00302 {
00303 return relSides[iface_no]->get_gids( entities, num_entities, tag_values );
00304 }
00305
00306 int AssocPair::get_gids( int iface_no, iBase_EntitySetHandle* sets, int num_sets, int* tag_values )
00307 {
00308 return relSides[iface_no]->get_gids( sets, num_sets, tag_values );
00309 }
00310
00311 int AssocPair::get_dims( int iface_no, iBase_EntityHandle* entities, int num_entities, int* tag_values )
00312 {
00313 return relSides[iface_no]->get_dims( entities, num_entities, tag_values );
00314 }
00315
00316 int AssocPair::get_dims( int iface_no, iBase_EntitySetHandle* sets, int num_sets, int* tag_values )
00317 {
00318 return relSides[iface_no]->get_dims( sets, num_sets, tag_values );
00319 }
00320
00321 int AssocPair::change_type( int iface_no, iRel_RelationType type )
00322 {
00323 if( entOrSet[iface_no] == type ) RETURNR( iBase_SUCCESS );
00324 if( entOrSet[iface_no] == iRel_ENTITY || type == iRel_ENTITY )
00325 ERRORR( iBase_FAILURE, "Can only change type from \"set\" to \"both\", or "
00326 "vice-versa" );
00327
00328 entOrSet[iface_no] = type;
00329 if( relStatus[iface_no] != iRel_ACTIVE ) RETURNR( iBase_SUCCESS );
00330
00331 iBase_EntitySetHandle* sets = NULL;
00332 int set_alloc = 0, set_size;CHK_ERRORR( relSides[iface_no]->get_related_sets( &sets, &set_alloc, &set_size ) );
00333 if( type == iRel_BOTH )
00334 {
00335 if( entOrSet[!iface_no] == iRel_ENTITY )
00336 {
00337 std::vector< iBase_EntityHandle > related_ents( set_size );CHK_ERRORR( relSides[iface_no]->get_relation_side( sets, set_size, &related_ents[0] ) );
00338
00339 for( int i = 0; i < set_size; i++ )
00340 CHK_ERRORR( populate_recursive( iface_no, sets[i], related_ents[i] ) );
00341 }
00342 else
00343 {
00344 std::vector< iBase_EntitySetHandle > related_sets( set_size );CHK_ERRORR( relSides[iface_no]->get_relation_side( sets, set_size, &related_sets[0] ) );
00345
00346 for( int i = 0; i < set_size; i++ )
00347 CHK_ERRORR( populate_recursive( iface_no, sets[i], related_sets[i] ) );
00348 }
00349 }
00350 else if( type == iRel_SET )
00351 {
00352 for( int i = 0; i < set_size; i++ )
00353 CHK_ERRORR( unpopulate_recursive( iface_no, sets[i] ) );
00354 }
00355
00356 free( sets );
00357 RETURNR( iBase_SUCCESS );
00358 }
00359
00360 int AssocPair::change_status( int iface_no, iRel_RelationStatus status )
00361 {
00362 if( relStatus[iface_no] == status ) RETURNR( iBase_SUCCESS );
00363
00364 relStatus[iface_no] = status;
00365
00366 if( status == iRel_NOTEXIST )
00367 {
00368 // Destroy the assoc tag
00369 CHK_ERRORR( relSides[iface_no]->destroy_relation_side() );
00370 }
00371 else if( status == iRel_INACTIVE )
00372 {
00373 // Create the assoc tag
00374 CHK_ERRORR( relSides[iface_no]->create_relation_side() );
00375 }
00376 // Update the assoc tag
00377 else if( status == iRel_ACTIVE )
00378 {
00379 CHK_ERRORR( relSides[iface_no]->destroy_relation_side() );CHK_ERRORR( relSides[iface_no]->create_relation_side() );
00380
00381 if( entOrSet[!iface_no] == iRel_ENTITY )
00382 {
00383 iBase_EntityHandle* entities = NULL;
00384 int ent_alloc = 0, ent_size;
00385
00386 CHK_ERRORR( relSides[!iface_no]->get_related_ents( &entities, &ent_alloc, &ent_size ) );
00387 if( entOrSet[iface_no] == iRel_ENTITY )
00388 {
00389 std::vector< iBase_EntityHandle > related_ents( ent_size );
00390 int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_ents[0] );
00391
00392 if( result == iBase_SUCCESS )
00393 {
00394 if( iface_no == 0 )
00395 for( int i = 0; i < ent_size; i++ )
00396 CHK_ERRORR( set_relation( related_ents[i], entities[i] ) );
00397 else
00398 for( int i = 0; i < ent_size; i++ )
00399 CHK_ERRORR( set_relation( entities[i], related_ents[i] ) );
00400 }
00401 }
00402 else
00403 {
00404 std::vector< iBase_EntitySetHandle > related_sets( ent_size );
00405 int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_sets[0] );
00406
00407 if( result == iBase_SUCCESS )
00408 {
00409 if( iface_no == 0 )
00410 for( int i = 0; i < ent_size; i++ )
00411 CHK_ERRORR( set_relation( related_sets[i], entities[i] ) );
00412 else
00413 for( int i = 0; i < ent_size; i++ )
00414 CHK_ERRORR( set_relation( entities[i], related_sets[i] ) );
00415 }
00416 }
00417
00418 free( entities );
00419 }
00420 else
00421 {
00422 iBase_EntitySetHandle* sets = NULL;
00423 int set_alloc = 0, set_size;
00424
00425 CHK_ERRORR( relSides[!iface_no]->get_related_sets( &sets, &set_alloc, &set_size ) );
00426 if( entOrSet[iface_no] == iRel_ENTITY )
00427 {
00428 std::vector< iBase_EntityHandle > related_ents( set_size );
00429 int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_ents[0] );
00430
00431 if( result == iBase_SUCCESS )
00432 {
00433 if( iface_no == 0 )
00434 for( int i = 0; i < set_size; i++ )
00435 CHK_ERRORR( set_relation( related_ents[i], sets[i] ) );
00436 else
00437 for( int i = 0; i < set_size; i++ )
00438 CHK_ERRORR( set_relation( sets[i], related_ents[i] ) );
00439 }
00440 }
00441 else
00442 {
00443 std::vector< iBase_EntitySetHandle > related_sets( set_size );
00444 int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_sets[0] );
00445
00446 if( result == iBase_SUCCESS )
00447 {
00448 if( iface_no == 0 )
00449 for( int i = 0; i < set_size; i++ )
00450 CHK_ERRORR( set_relation( related_sets[i], sets[i] ) );
00451 else
00452 for( int i = 0; i < set_size; i++ )
00453 CHK_ERRORR( set_relation( sets[i], related_sets[i] ) );
00454 }
00455 }
00456
00457 free( sets );
00458 }
00459 }
00460 else
00461 {
00462 ERRORR( iBase_INVALID_ARGUMENT, "Invalid argument for relation status" );
00463 }
00464
00465 RETURNR( iBase_SUCCESS );
00466 }
00467
00468 bool AssocPair::equivalent( iBase_Instance iface0, iBase_Instance iface1, bool* order_switched )
00469 {
00470 if( iface0 == relSides[0]->instance() && iface1 == relSides[1]->instance() )
00471 {
00472 if( order_switched ) *order_switched = false;
00473 return true;
00474 }
00475 else if( iface0 == relSides[1]->instance() && iface1 == relSides[0]->instance() )
00476 {
00477 if( order_switched ) *order_switched = true;
00478 return true;
00479 }
00480 else
00481 return false;
00482 }
00483
00484 bool AssocPair::equivalent( iRel_IfaceType type0, iRel_IfaceType type1, bool* order_switched )
00485 {
00486 if( type0 == relSides[0]->type() && type1 == relSides[1]->type() )
00487 {
00488 if( order_switched ) *order_switched = false;
00489 return true;
00490 }
00491 else if( type0 == relSides[1]->type() && type1 == relSides[0]->type() )
00492 {
00493 if( order_switched ) *order_switched = true;
00494 return true;
00495 }
00496 else
00497 return false;
00498 }
00499
00500 bool AssocPair::contains( iBase_Instance iface )
00501 {
00502 return ( iface == relSides[0]->instance() || iface == relSides[1]->instance() );
00503 }
00504
00505 int AssocPair::populate_recursive( int iface_no, iBase_EntitySetHandle set, iBase_EntityHandle related_ent )
00506 {
00507 iBase_EntityHandle* entities = NULL;
00508 int entities_alloc = 0, entities_size;
00509
00510 CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );
00511
00512 for( int i = 0; i < entities_size; i++ )
00513 CHK_ERRORR( relSides[iface_no]->set_relation_side( entities + i, 1, &related_ent ) );
00514
00515 free( entities );
00516 RETURNR( iBase_SUCCESS );
00517 }
00518
00519 int AssocPair::populate_recursive( int iface_no, iBase_EntitySetHandle set, iBase_EntitySetHandle related_set )
00520 {
00521 iBase_EntityHandle* entities = NULL;
00522 int entities_alloc, entities_size;
00523
00524 CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );
00525
00526 for( int i = 0; i < entities_size; i++ )
00527 CHK_ERRORR( relSides[iface_no]->set_relation_side( entities + i, 1, &related_set ) );
00528
00529 free( entities );
00530 RETURNR( iBase_SUCCESS );
00531 }
00532
00533 int AssocPair::unpopulate_recursive( int iface_no, iBase_EntitySetHandle set )
00534 {
00535 iBase_EntityHandle* entities = NULL;
00536 int entities_alloc = 0, entities_size;
00537
00538 CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );CHK_ERRORR( relSides[iface_no]->rmv_relation_side( entities, entities_size ) );
00539
00540 free( entities );
00541 RETURNR( iBase_SUCCESS );
00542 }