Пример #1
0
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);
}
Пример #2
0
int GeomAssocPairSide::get_iterator(iBase_EntitySetHandle set,
                                    iBase_EntityIterator *iter)
{
  int result;
  iGeom_initEntIter(instance_, set, iBase_ALL_TYPES, iter, &result);
  RETURNR(iBase_SUCCESS);
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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);
}
Пример #6
0
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);
}
Пример #7
0
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);
}
Пример #8
0
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);
}
Пример #9
0
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);
}
Пример #10
0
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);
}
Пример #11
0
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);
}
Пример #12
0
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);
}
Пример #13
0
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);
}
Пример #14
0
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);
}
Пример #15
0
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);
}
Пример #16
0
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);
}
Пример #17
0
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);
}
Пример #18
0
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);
}
Пример #19
0
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);
}
Пример #20
0
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);
}
Пример #21
0
int GeomAssocPairSide::get_related_sets(iBase_EntitySetHandle ** /*sets*/,
                                        int * /*sets_alloc*/, int * /*sets_size*/)
{
  RETURNR(iBase_FAILURE);
}
Пример #22
0
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);
}
Пример #23
0
int GeomAssocPairSide::get_dims(iBase_EntitySetHandle * /*sets*/, int /*num_sets*/,
                                int * /*values*/)
{
  RETURNR(iBase_FAILURE);
}
Пример #24
0
int GeomAssocPairSide::get_dims(iBase_EntityHandle *entities, int num_entities,
                                int *values)
{
  RETURNR(iBase_FAILURE);
}
Пример #25
0
int GeomAssocPairSide::get_dims(iBase_EntitySetHandle *sets, int num_sets,
                                int *values)
{
  RETURNR(iBase_FAILURE);
}
Пример #26
0
int GeomAssocPairSide::get_related_ents(iBase_EntityHandle ** /*entities*/,
                                        int * /*entities_alloc*/, int * /*entities_size*/)
{
  RETURNR(iBase_FAILURE);
}