int AssocPair::set_relation(iBase_EntityHandle ent1, iBase_EntityHandle ent2) { if (entOrSet[0] == iRel_SET || entOrSet[1] == iRel_SET) ERRORR(iBase_FAILURE, "Invalid relation type"); // check that if we're passing in an ent for a 'both'-type // assoc, there's already a set associated to the other ent iBase_EntityHandle tmp_ent; if (entOrSet[0] == iRel_BOTH && relSides[1]->get_relation_side(&ent2, 1, &tmp_ent) != iBase_SUCCESS) ERRORR(iBase_FAILURE, "Couldn't find associated set on left side"); if (entOrSet[1] == iRel_BOTH && relSides[0]->get_relation_side(&ent1, 1, &tmp_ent) != iBase_SUCCESS) ERRORR(iBase_FAILURE, "Couldn't find associated set on right side"); // set ent1 => ent2 if (relStatus[0] == iRel_ACTIVE) CHK_ERRORR( relSides[0]->set_relation_side(&ent1, 1, &ent2) ); // set ent1 <= ent2 if (relStatus[1] == iRel_ACTIVE) CHK_ERRORR( relSides[1]->set_relation_side(&ent2, 1, &ent1) ); RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_iterator(iBase_EntitySetHandle set, iBase_EntityIterator *iter) { int result; iGeom_initEntIter(instance_, set, iBase_ALL_TYPES, iter, &result); RETURNR(iBase_SUCCESS); }
int AssocPair::set_relation(iBase_EntitySetHandle set1, iBase_EntityHandle ent2) { if (entOrSet[0] == iRel_ENTITY || entOrSet[1] == iRel_SET) ERRORR(iBase_FAILURE, "Invalid relation type"); // check that if we're passing in an ent for a 'both'-type // assoc, there's already a set associated to the other ent iBase_EntityHandle tmp_ent; if (entOrSet[1] == iRel_BOTH && relSides[0]->get_relation_side(&set1, 1, &tmp_ent) != iBase_SUCCESS) ERRORR(iBase_FAILURE, "Couldn't find associated set on right side"); // set set1 => ent2 if (relStatus[0] == iRel_ACTIVE) CHK_ERRORR( relSides[0]->set_relation_side(&set1, 1, &ent2) ); // set ent1 <= set2 if (relStatus[1] == iRel_ACTIVE) CHK_ERRORR( relSides[1]->set_relation_side(&ent2, 1, &set1) ); // if the left side is a 'both'-type association, set the contents of set1 // to point to ent2 as well if (entOrSet[0] == iRel_BOTH) CHK_ERRORR( populate_recursive(0, set1, ent2) ); RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_all_sets(iBase_EntitySetHandle **sets, int *sets_alloc, int *sets_size) { int result; iGeom_getEntSets(instance_, 0, 0, sets, sets_alloc, sets_size, &result); PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::rmv_relation_side(iBase_EntityHandle *entities, int num_entities) { int result; iGeom_rmvArrTag(instance_, entities, num_entities, relation_tag, &result); PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
int AssocPair::change_type(int iface_no, iRel_RelationType type) { if (entOrSet[iface_no] == type) RETURNR(iBase_SUCCESS); if (entOrSet[iface_no] == iRel_ENTITY || type == iRel_ENTITY) ERRORR(iBase_FAILURE, "Can only change type from \"set\" to \"both\", or " "vice-versa"); entOrSet[iface_no] = type; if (relStatus[iface_no] != iRel_ACTIVE) RETURNR(iBase_SUCCESS); iBase_EntitySetHandle *sets = NULL; int set_alloc = 0, set_size; CHK_ERRORR( relSides[iface_no]->get_related_sets(&sets, &set_alloc, &set_size) ); if (type == iRel_BOTH) { if (entOrSet[!iface_no] == iRel_ENTITY) { std::vector<iBase_EntityHandle> related_ents(set_size); CHK_ERRORR( relSides[iface_no]->get_relation_side(sets, set_size, &related_ents[0]) ); for (int i = 0; i < set_size; i++) CHK_ERRORR( populate_recursive(iface_no, sets[i], related_ents[i]) ); } else { std::vector<iBase_EntitySetHandle> related_sets(set_size); CHK_ERRORR( relSides[iface_no]->get_relation_side(sets, set_size, &related_sets[0]) ); for (int i = 0; i < set_size; i++) CHK_ERRORR( populate_recursive(iface_no, sets[i], related_sets[i]) ); } } else if (type == iRel_SET) { for (int i = 0; i < set_size; i++) CHK_ERRORR( unpopulate_recursive(iface_no, sets[i]) ); } free(sets); RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::set_relation_side(iBase_EntityHandle *entities, int num_entities, const void *values) { int result; iGeom_setArrData(instance_, entities, num_entities, relation_tag, static_cast<const char*>(values), num_entities*sizeof(iBase_EntityHandle), &result); PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
int AssocPair::get_relation(int iface_no, iBase_EntitySetHandle *sets, int num_sets, iBase_EntityIterator *tag_values) { std::vector<iBase_EntitySetHandle> sets2(num_sets); CHK_ERRORR( get_relation(iface_no, sets, num_sets, &sets2[0]) ); for(int i=0; i<num_sets; i++) CHK_ERRORR( relSides[iface_no]->get_iterator(sets2[i], &tag_values[i]) ); RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::rmv_relation_side(iBase_EntitySetHandle *sets, int num_sets) { int result; for (int i = 0; i < num_sets; i++) { iGeom_rmvEntSetTag(instance_, sets[i], relation_tag, &result); PROCESS_ERROR; } RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::destroy_relation_side() { if (relation_tag) { int result; iGeom_destroyTag(instance_, relation_tag, true, &result); relation_tag = NULL; PROCESS_ERROR; } RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_relation_side(iBase_EntityHandle *entities, int num_entities, void *values) { int values_alloc = num_entities * sizeof(iBase_EntityHandle); int values_size; int result; iGeom_getArrData(instance_, entities, num_entities, relation_tag, &values, &values_alloc, &values_size, &result); PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_ents_dims(iBase_EntityHandle *entities, int entities_size, int **ent_types, int *ent_types_alloc, int *ent_types_size) { int result; iGeom_getArrType(instance_, entities, entities_size, ent_types, ent_types_alloc, ent_types_size, &result); PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
int AssocPair::unpopulate_recursive(int iface_no, iBase_EntitySetHandle set) { iBase_EntityHandle *entities = NULL; int entities_alloc = 0, entities_size; 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) ); free(entities); RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_all_entities(int dimension, iBase_EntityHandle **entities, int *entities_alloc, int *entities_size) { int this_type = (dimension == -1 ? iBase_ALL_TYPES : dimension); int result; iGeom_getEntities(instance_, 0, this_type, entities, entities_alloc, entities_size, &result); PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_gids(iBase_EntityHandle *entities, int num_entities, int *values) { int values_alloc = num_entities * sizeof(int); int values_size; int result; iGeom_getArrData(instance_, entities, num_entities, gid_tag, reinterpret_cast<void**>(&values), &values_alloc, &values_size, &result); PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::set_relation_side(iBase_EntitySetHandle *sets, int num_sets, const void *values) { const char *data = static_cast<const char*>(values); int size = sizeof(iBase_EntityHandle); int result; for (int i = 0; i < num_sets; i++) { iGeom_setEntSetData(instance_, sets[i], relation_tag, data, size, &result); data += size; PROCESS_ERROR; } RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::create_relation_side() { int result; std::stringstream ss; ss << RELATION_TAG_NAME << id; std::string rel_tag_name(ss.str()); iGeom_getTagHandle(instance_, rel_tag_name.c_str(), &relation_tag, &result, rel_tag_name.size()); if (result == iBase_TAG_NOT_FOUND) { iGeom_createTag(instance_, rel_tag_name.c_str(), 1, iBase_ENTITY_HANDLE, &relation_tag, &result, rel_tag_name.size()); } PROCESS_ERROR; RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_gids(iBase_EntitySetHandle *sets, int num_sets, int *values) { char *data = reinterpret_cast<char*>(values); int values_alloc = sizeof(int); int values_size; int result; for (int i = 0; i < num_sets; i++) { iGeom_getEntSetData(instance_, sets[i], gid_tag, reinterpret_cast<void**>(&data), &values_alloc, &values_size, &result); data += values_size; PROCESS_ERROR; } RETURNR(iBase_SUCCESS); }
int AssocPair::populate_recursive(int iface_no, iBase_EntitySetHandle set, iBase_EntitySetHandle related_set) { iBase_EntityHandle *entities = NULL; int entities_alloc, entities_size; CHK_ERRORR( relSides[iface_no]->get_entities(-1, set, &entities, &entities_alloc, &entities_size) ); for (int i = 0; i < entities_size; i++) CHK_ERRORR( relSides[iface_no]->set_relation_side(entities+i, 1, &related_set) ); free(entities); RETURNR(iBase_SUCCESS); }
int AssocPair::set_relation(iBase_EntitySetHandle set1, iBase_EntitySetHandle set2) { if (entOrSet[0] == iRel_ENTITY || entOrSet[1] == iRel_ENTITY) ERRORR(iBase_FAILURE, "Invalid relation type"); // set set1 => set2 if (relStatus[0] == iRel_ACTIVE) CHK_ERRORR( relSides[0]->set_relation_side(&set1, 1, &set2) ); // set set1 <= set2 if (relStatus[1] == iRel_ACTIVE) CHK_ERRORR( relSides[1]->set_relation_side(&set2, 1, &set1) ); // if either side is a 'both'-type association, set the contents of set1 // to point to set2 as well (and/or vice-versa) if (entOrSet[0] == iRel_BOTH) CHK_ERRORR( populate_recursive(0, set1, set2) ); if (entOrSet[1] == iRel_BOTH) CHK_ERRORR( populate_recursive(1, set2, set1) ); RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_related_sets(iBase_EntitySetHandle ** /*sets*/, int * /*sets_alloc*/, int * /*sets_size*/) { RETURNR(iBase_FAILURE); }
int AssocPair::change_status(int iface_no, iRel_RelationStatus status) { if (relStatus[iface_no] == status) RETURNR(iBase_SUCCESS); relStatus[iface_no] = status; if (status == iRel_NOTEXIST) { // Destroy the assoc tag CHK_ERRORR( relSides[iface_no]->destroy_relation_side() ); } else if (status == iRel_INACTIVE) { // Create the assoc tag CHK_ERRORR( relSides[iface_no]->create_relation_side() ); } // Update the assoc tag else if (status == iRel_ACTIVE) { CHK_ERRORR( relSides[iface_no]->destroy_relation_side() ); CHK_ERRORR( relSides[iface_no]->create_relation_side() ); if (entOrSet[!iface_no] == iRel_ENTITY) { iBase_EntityHandle *entities = NULL; int ent_alloc = 0, ent_size; CHK_ERRORR( relSides[!iface_no]->get_related_ents(&entities, &ent_alloc, &ent_size) ); if (entOrSet[iface_no] == iRel_ENTITY) { std::vector<iBase_EntityHandle> related_ents(ent_size); int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_ents[0]); if (result == iBase_SUCCESS) { if (iface_no == 0) for (int i = 0; i < ent_size; i++) CHK_ERRORR( set_relation(related_ents[i], entities[i]) ); else for (int i = 0; i < ent_size; i++) CHK_ERRORR( set_relation(entities[i], related_ents[i]) ); } } else { std::vector<iBase_EntitySetHandle> related_sets(ent_size); int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_sets[0]); if (result == iBase_SUCCESS) { if (iface_no == 0) for (int i = 0; i < ent_size; i++) CHK_ERRORR( set_relation(related_sets[i], entities[i]) ); else for (int i = 0; i < ent_size; i++) CHK_ERRORR( set_relation(entities[i], related_sets[i]) ); } } free(entities); } else { iBase_EntitySetHandle *sets = NULL; int set_alloc = 0, set_size; CHK_ERRORR( relSides[!iface_no]->get_related_sets(&sets, &set_alloc, &set_size) ); if (entOrSet[iface_no] == iRel_ENTITY) { std::vector<iBase_EntityHandle> related_ents(set_size); int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_ents[0]); if (result == iBase_SUCCESS) { if (iface_no == 0) for (int i = 0; i < set_size; i++) CHK_ERRORR( set_relation(related_ents[i], sets[i]) ); else for (int i = 0; i < set_size; i++) CHK_ERRORR( set_relation(sets[i], related_ents[i]) ); } } else { std::vector<iBase_EntitySetHandle> related_sets(set_size); int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_sets[0]); if (result == iBase_SUCCESS) { if (iface_no == 0) for (int i = 0; i < set_size; i++) CHK_ERRORR( set_relation(related_sets[i], sets[i]) ); else for (int i = 0; i < set_size; i++) CHK_ERRORR( set_relation(sets[i], related_sets[i]) ); } } free(sets); } } else { ERRORR(iBase_INVALID_ARGUMENT, "Invalid argument for relation status"); } RETURNR(iBase_SUCCESS); }
int GeomAssocPairSide::get_dims(iBase_EntitySetHandle * /*sets*/, int /*num_sets*/, int * /*values*/) { RETURNR(iBase_FAILURE); }
int GeomAssocPairSide::get_dims(iBase_EntityHandle *entities, int num_entities, int *values) { RETURNR(iBase_FAILURE); }
int GeomAssocPairSide::get_dims(iBase_EntitySetHandle *sets, int num_sets, int *values) { RETURNR(iBase_FAILURE); }
int GeomAssocPairSide::get_related_ents(iBase_EntityHandle ** /*entities*/, int * /*entities_alloc*/, int * /*entities_size*/) { RETURNR(iBase_FAILURE); }