cgma
|
#include <CAGroup.hpp>
Definition at line 17 of file CAGroup.hpp.
CAGroup::CAGroup | ( | RefEntity * | new_attrib_owner, |
const CubitSimpleAttrib & | csa_ptr | ||
) |
Definition at line 28 of file CAGroup.cpp.
: CubitAttrib(new_attrib_owner) { initialize(); if(!csa_ptr.isEmpty()) { const std::vector<int>& i_list = csa_ptr.int_data_list(); const std::vector<CubitString>& cs_list = csa_ptr.string_data_list(); // first, the ints int offset = 0; int num_groups = i_list[offset++]; // groupID int i; for (i = num_groups; i > 0; i--) groupID.append(i_list[offset++]); // uniqueID for (i = num_groups; i > 0; i--) uniqueID.append(i_list[offset++]); // sequenceNumbers for (i = num_groups; i > 0; i--) sequenceNumbers.append(i_list[offset++]); // numOwningGroups for (i = num_groups; i > 0; i--) numOwningGroups.append(i_list[offset++]); // total number of owning groups int total_owning_groups = i_list[offset++]; // owningGroupID for (i = total_owning_groups; i > 0; i--) owningGroupID.append(i_list[offset++]); // owningUniqueID for (i = total_owning_groups; i > 0; i--) owningUniqueID.append(i_list[offset++]); // owningSequenceNumbers for (i = total_owning_groups; i > 0; i--) owningSequenceNumbers.append(i_list[offset++]); // ancestor groups added after first implementation of CAGroup, // therefore not all attributes may have ancestor groups // setting total_ancestor_groups to zero first will short-circuit // loops below if there aren't any ancestor groups, so no need for // an 'if' statement // total number of ancestor groups int total_ancestor_groups = 0; if (i_list.size() > (size_t)(4*num_groups + 3*total_owning_groups + 2)) total_ancestor_groups = i_list[offset++]; // ancestorGroupID for (i = total_ancestor_groups; i > 0; i--) ancestorGroupID.append(i_list[offset++]); // ancestorUniqueID for (i = total_ancestor_groups; i > 0; i--) ancestorUniqueID.append(i_list[offset++]); // ancestorOwnedGroupUid for (i = total_ancestor_groups; i > 0; i--) ancestorOwnedGroupUid.append(i_list[offset++]); // ancestorSequenceNumbers for (i = total_ancestor_groups; i > 0; i--) ancestorSequenceNumbers.append(i_list[offset++]); // now, doubles (none) // now, strings // attribute internal name (just pop the list) offset = 1; // groupNames for (i = num_groups; i > 0; i--) groupNames.append(cs_list[offset++]); // owningGroupNames for (i = total_owning_groups; i > 0; i--) owningGroupNames.append(cs_list[offset++]); // ancestorGroupName for (i = total_ancestor_groups; i > 0; i--) ancestorGroupName.append(cs_list[offset++]); // ok, we're done } }
CAGroup::~CAGroup | ( | ) | [virtual] |
Definition at line 128 of file CAGroup.cpp.
{ }
CubitStatus CAGroup::actuate | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 147 of file CAGroup.cpp.
{ if (hasActuated == CUBIT_TRUE) return CUBIT_SUCCESS; // need to reset all the lists to keep them in sync groupID.reset(); uniqueID.reset(); groupNames.reset(); sequenceNumbers.reset(); owningGroupID.reset(); owningUniqueID.reset(); owningGroupNames.reset(); owningSequenceNumbers.reset(); numOwningGroups.reset(); // go through all the groups on this CA int i; for (i = groupID.size(); i > 0; i--) { // pop the data for this group off the lists int group_id = groupID.get_and_step(); int unique_id = uniqueID.get_and_step(); CubitString group_name = groupNames.get_and_step(); int seq_num = sequenceNumbers.get_and_step(); RefGroup *ref_group = assign_group(attribOwnerEntity, group_id, unique_id, group_name, seq_num); // check for groups owning this group int owning_groups = numOwningGroups.get_and_step(); for (int j = owning_groups; j > 0; j--) { int owning_group_id = owningGroupID.get_and_step(); int owning_unique_id = owningUniqueID.get_and_step(); CubitString owning_group_name = owningGroupNames.get_and_step(); seq_num = owningSequenceNumbers.get_and_step(); assign_group(ref_group, owning_group_id, owning_unique_id, owning_group_name, seq_num); } } // loop over all groups in this CAGroup // now do ancestors ancestorGroupID.reset(); ancestorUniqueID.reset(); ancestorOwnedGroupUid.reset(); ancestorGroupName.reset(); ancestorSequenceNumbers.reset(); for (i = ancestorGroupID.size(); i > 0; i--) { /*RefGroup *ancestor_group = */ assign_ancestor_group(ancestorGroupID.get_and_step(), ancestorUniqueID.get_and_step(), ancestorGroupName.get_and_step(), ancestorOwnedGroupUid.get_and_step(), ancestorSequenceNumbers.get_and_step()); } deleteAttrib = CUBIT_TRUE; hasActuated = CUBIT_TRUE; return CUBIT_SUCCESS; }
RefGroup * CAGroup::assign_ancestor_group | ( | const int | ancestor_id, |
const int | ancestor_uid, | ||
const CubitString & | ancestor_name, | ||
const int | owned_group_uid, | ||
const int | seq_num | ||
) |
Definition at line 265 of file CAGroup.cpp.
{ // for each call of this function, we: // - get an ancestor group with ancestor_id, ancestor_uid and // ancestor_name (make one if it doesn't exist) // - add group with owned_group_uid to that ancestor group // (owned_group_uid should exist, error if not) // search for the group corresponding to this id and unique id RefGroup* ancestor_group = NULL; RefGroup *owned_group = NULL; CubitBoolean ancestor_id_exists = CUBIT_FALSE; RefGroup *ref_group = GeometryQueryTool::instance()->get_last_ref_group(); for(int i = GeometryQueryTool::instance()->num_ref_groups(); i > 0 && (!ancestor_group || !owned_group); i--) { ref_group = GeometryQueryTool::instance()->get_next_ref_group(); if(ref_group->id() == ancestor_id) { ancestor_id_exists = CUBIT_TRUE; } ToolData *td_temp = ref_group->get_TD(&TDCAGE::is_cage); TDCAGE *td_cagroup = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL); if (td_cagroup != NULL && td_cagroup->unique_id() == ancestor_uid) { ancestor_group = ref_group; } if (td_cagroup != NULL && td_cagroup->unique_id() == owned_group_uid) { owned_group = ref_group; } } assert(owned_group != 0); if (!ancestor_group) { // make a new group, and assign id and unique id // also assign group name ancestor_group = RefEntityFactory::instance()->construct_RefGroup(); ; if(!ancestor_id_exists) { ancestor_group->set_id(0); ancestor_group->set_id(ancestor_id); } else PRINT_INFO("Creating group %d to hold attribute group %d\n", ancestor_group->id(), ancestor_id); // put a td on this new group with the right unique_id TDCAGE *td_cagroup = new TDCAGE(ancestor_uid); ancestor_group->add_TD(td_cagroup); // add the owned group to the group and name the group ancestor_group->entity_name(ancestor_name); } // add the entity to the group with the proper sequence number TDCAGE::insert_entity(owned_group, seq_num, ancestor_group); return ancestor_group; }
RefGroup * CAGroup::assign_group | ( | RefEntity * | owned_entity, |
const int | group_id, | ||
const int | unique_id, | ||
const CubitString & | group_name, | ||
const int | seq_num | ||
) |
Definition at line 214 of file CAGroup.cpp.
{ RefGroup* parent_group = NULL; CubitBoolean group_id_exists = CUBIT_FALSE; // search for the group corresponding to this id and unique id RefGroup *ref_group = GeometryQueryTool::instance()->get_last_ref_group(); for(int i = GeometryQueryTool::instance()->num_ref_groups(); i > 0 && !parent_group; i--) { ref_group = GeometryQueryTool::instance()->get_next_ref_group(); if(ref_group->id() == group_id) { group_id_exists = CUBIT_TRUE; } ToolData *td_temp = ref_group->get_TD(&TDCAGE::is_cage); TDCAGE *td_cagroup = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL); if (td_cagroup != NULL && td_cagroup->unique_id() == unique_id) parent_group = ref_group; } if(!parent_group) { // else make a new group, and assign id and unique id // also assign group name parent_group = RefEntityFactory::instance()->construct_RefGroup(); if(!group_id_exists) { parent_group->set_id(0); parent_group->set_id(group_id); } else PRINT_INFO("Creating group %d to hold attribute group %d\n", parent_group->id(), group_id); // put a td on this new group with the right unique_id TDCAGE *td_cagroup = new TDCAGE(unique_id); parent_group->add_TD(td_cagroup); // add the attribOwnerEntity to the group and name the group parent_group->entity_name(group_name); } // add the entity to the group with the proper sequence number TDCAGE::insert_entity(owned_entity, seq_num, parent_group); return parent_group; }
void CAGroup::build_ancestor_list | ( | RefGroup * | parent_ref_group | ) |
Definition at line 488 of file CAGroup.cpp.
{ DLIList<RefGroup*> ancestor_ref_group_list; RefGroup::get_groups_within(parent_ref_group, ancestor_ref_group_list, CUBIT_FALSE); // now, recursively work on ancestor list, adding owning group id, // uid and name, and owned group uid, to lists ToolData *td_temp = parent_ref_group->get_TD(&TDCAGE::is_cage); TDCAGE *td_parent = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL); for (int j = ancestor_ref_group_list.size(); j > 0; j--) { RefGroup *ancestor = ancestor_ref_group_list.get_and_step(); td_temp = ancestor->get_TD(&TDCAGE::is_cage); TDCAGE *td_cagroup = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL); if (td_cagroup == NULL) { #if defined _WIN32 || defined CUBIT_LINUX td_cagroup = new TDCAGE(rand()); #else td_cagroup = new TDCAGE((int)lrand48()); #endif ancestor->add_TD(td_cagroup); td_cagroup->initialize_group_sequence_list(ancestor); } ancestorGroupID.append(ancestor->id()); ancestorUniqueID.append(td_cagroup->unique_id()); ancestorGroupName.append(ancestor->entity_name()); ancestorOwnedGroupUid.append(td_parent->unique_id()); // get and append the sequence number of the group in the parent // group int seq_number = td_parent->td_sequence_number(ancestor); assert(seq_number != -1); ancestorSequenceNumbers.append(seq_number); build_ancestor_list(ancestor); } }
CubitSimpleAttrib CAGroup::cubit_simple_attrib | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 527 of file CAGroup.cpp.
{ std::vector<CubitString> cs_list; std::vector<double> d_list; std::vector<int> i_list; // first, the ints // groupID groupID.reset(); i_list.push_back(groupID.size()); int i; for (i = groupID.size(); i > 0; i--) i_list.push_back(groupID.get_and_step()); // uniqueID uniqueID.reset(); for (i = uniqueID.size(); i > 0; i--) i_list.push_back(uniqueID.get_and_step()); // sequenceNumbers sequenceNumbers.reset(); for (i = sequenceNumbers.size(); i > 0; i--) i_list.push_back(sequenceNumbers.get_and_step()); // numOwningGroups numOwningGroups.reset(); for (i = numOwningGroups.size(); i > 0; i--) i_list.push_back(numOwningGroups.get_and_step()); // size of owningGroupID i_list.push_back(owningGroupID.size()); // owningGroupID owningGroupID.reset(); for (i = owningGroupID.size(); i > 0; i--) i_list.push_back(owningGroupID.get_and_step()); // owningUniqueID owningUniqueID.reset(); for (i = owningUniqueID.size(); i > 0; i--) i_list.push_back(owningUniqueID.get_and_step()); // owningSequenceNumbers owningSequenceNumbers.reset(); for (i = owningSequenceNumbers.size(); i > 0; i--) i_list.push_back(owningSequenceNumbers.get_and_step()); // size of ancestorGroupID i_list.push_back(ancestorGroupID.size()); // ancestorGroupID ancestorGroupID.reset(); for (i = ancestorGroupID.size(); i > 0; i--) i_list.push_back(ancestorGroupID.get_and_step()); // ancestorUniqueID ancestorUniqueID.reset(); for (i = ancestorUniqueID.size(); i > 0; i--) i_list.push_back(ancestorUniqueID.get_and_step()); // ancestorOwnedGroupUid ancestorOwnedGroupUid.reset(); for (i = ancestorOwnedGroupUid.size(); i > 0; i--) i_list.push_back(ancestorOwnedGroupUid.get_and_step()); // ancestorSequenceNumbers ancestorSequenceNumbers.reset(); for (i = ancestorSequenceNumbers.size(); i > 0; i--) i_list.push_back(ancestorSequenceNumbers.get_and_step()); // now, doubles (none) // now, strings // attribute internal name cs_list.push_back(att_internal_name()); // groupNames groupNames.reset(); for (i = groupID.size(); i > 0; i--) cs_list.push_back(groupNames.get_and_step()); // owningGroupNames owningGroupNames.reset(); for (i = owningGroupNames.size(); i > 0; i--) cs_list.push_back(owningGroupNames.get_and_step()); // ancestorGroupName ancestorGroupName.reset(); for (i = ancestorGroupName.size(); i > 0; i--) cs_list.push_back(ancestorGroupName.get_and_step()); return CubitSimpleAttrib(&cs_list, &d_list, &i_list); }
void CAGroup::has_written | ( | CubitBoolean | set_has_written | ) | [virtual] |
Reimplemented from CubitAttrib.
Definition at line 621 of file CAGroup.cpp.
{ //- overloaded has_written function, resets td_cage on owner if (has_written == CUBIT_TRUE && hasWritten == CUBIT_FALSE) // reset the td_cage on the owner attribOwnerEntity->delete_TD(&TDCAGE::is_cage); hasWritten = has_written; }
virtual CubitBoolean CAGroup::has_written | ( | ) | const [inline, virtual] |
void CAGroup::initialize | ( | ) |
Definition at line 132 of file CAGroup.cpp.
{ if(initialize_rand == CUBIT_TRUE) { #if defined _WIN32 || defined CUBIT_LINUX srand((unsigned)time(NULL)); #else srand48(time(NULL)); #endif initialize_rand = CUBIT_FALSE; } }
int CAGroup::int_attrib_type | ( | ) | [inline, virtual] |
CubitStatus CAGroup::reset | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 447 of file CAGroup.cpp.
{ groupID.clean_out(); //- group ids containing attribOwnerEntity uniqueID.clean_out(); //- unique ids of groups containing attribOwnerEntity groupNames.clean_out(); //- names of groups containing attribOwnerEntity sequenceNumbers.clean_out(); //- sequence numbers of this entity in the groups numOwningGroups.clean_out(); //- for each group in groupID, number of groups owning those groups owningGroupID.clean_out(); //- group ids containing groups containing attribOwnerEntity owningUniqueID.clean_out(); //- unique ids of groups containing groups containing attribOwnerEntity owningGroupNames.clean_out(); //- names of groups containing groups containing attribOwnerEntity owningSequenceNumbers.clean_out(); //- sequence numbers of groups in owning groups //- for each ancestor (a group which owns only other groups, with those //- those groups owning only other groups), we store the group id, uid, //- name, and the uid of the owned group to which this is an ancestor ancestorGroupID.clean_out(); ancestorUniqueID.clean_out(); ancestorGroupName.clean_out(); ancestorOwnedGroupUid.clean_out(); ancestorSequenceNumbers.clean_out(); return CUBIT_SUCCESS; }
CubitStatus CAGroup::update | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 334 of file CAGroup.cpp.
{ if (hasUpdated) return CUBIT_SUCCESS; // set the updated flag hasUpdated = CUBIT_TRUE; // get the groups containing attribOwnerEntity RefGroup* ref_group; DLIList<RefGroup*> ref_group_list; int i; RefGroup::get_groups_within(attribOwnerEntity, ref_group_list, CUBIT_FALSE); if( ref_group_list.size() == 0) { delete_attrib(CUBIT_TRUE); return CUBIT_SUCCESS; } // else, this entity is owned by groups RefGroup* parent_ref_group; // get a td_cage onto the attribOwnerEntity, to keep sequence numbers // for the owning groups TDCAGE *td_entity = (TDCAGE *) attribOwnerEntity->get_TD(&TDCAGE::is_cage); if (!td_entity) { td_entity = new TDCAGE(-1); attribOwnerEntity->add_TD(td_entity); } // now, initialize that tdcage td_entity->initialize_group_sequence_list(attribOwnerEntity); // ok, now write the data for the groups to this attribute for(i = ref_group_list.size(); i > 0; i--) { // get the refgroup which gets assigned to this CAGroup ref_group = ref_group_list.get_and_step(); // First, make sure there's a TDCAGE on the RefGroup ToolData *td_temp = ref_group->get_TD(&TDCAGE::is_cage); TDCAGE *td_cagroup = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL); if (td_cagroup == NULL) { #if defined _WIN32 || defined CUBIT_LINUX td_cagroup = new TDCAGE(rand()); #else td_cagroup = new TDCAGE((int)lrand48()); #endif ref_group->add_TD(td_cagroup); td_cagroup->initialize_group_sequence_list(ref_group); } // append to this CAGroup the id and the unique id of the group; // also append the group name groupID.append(ref_group->id()); uniqueID.append(td_cagroup->unique_id()); groupNames.append(ref_group->entity_name()); // get and append the sequence number of the attribOwnerEntity // in this group int seq_number = td_entity->td_sequence_number(ref_group); assert(seq_number != -1); sequenceNumbers.append(seq_number); // check this group for containing (parent) groups DLIList<RefGroup*> parent_ref_group_list; RefGroup::get_groups_within(ref_group, parent_ref_group_list, CUBIT_FALSE); // append the number of parent groups to the right list numOwningGroups.append(parent_ref_group_list.size()); // for each parent group, do essentially the same thing, adding the // data to the owningGroup lists for(int j = parent_ref_group_list.size(); j>0; j--) { parent_ref_group = parent_ref_group_list.get_and_step(); td_temp = parent_ref_group->get_TD(&TDCAGE::is_cage); TDCAGE *td_parent = (td_temp ? CAST_TO(td_temp, TDCAGE) : NULL); if (td_parent == NULL) { #if defined _WIN32 || defined CUBIT_LINUX td_parent = new TDCAGE(rand()); #else td_parent = new TDCAGE((int)lrand48()); #endif parent_ref_group->add_TD(td_parent); td_parent->initialize_group_sequence_list(parent_ref_group); } // append to this CAGroup the id and the unique id of the group; // also append the group name owningGroupID.append(parent_ref_group->id()); owningUniqueID.append(td_parent->unique_id()); owningGroupNames.append(parent_ref_group->entity_name()); // get and append the sequence number of the group in the parent // group seq_number = td_cagroup->td_sequence_number(parent_ref_group); assert(seq_number != -1); owningSequenceNumbers.append(seq_number); // finally, build a list of distant ancestors, in case there are // groups more than twice removed from any real entities; make // it a recursive function, so that it goes all the way up the chain // of ancestors build_ancestor_list(parent_ref_group); } // loop over parent groups } // loop over groups containing attribOwnerEntity return CUBIT_SUCCESS; }
DLIList<int> CAGroup::ancestorGroupID [private] |
Definition at line 52 of file CAGroup.hpp.
DLIList<CubitString> CAGroup::ancestorGroupName [private] |
Definition at line 54 of file CAGroup.hpp.
DLIList<int> CAGroup::ancestorOwnedGroupUid [private] |
Definition at line 55 of file CAGroup.hpp.
DLIList<int> CAGroup::ancestorSequenceNumbers [private] |
Definition at line 56 of file CAGroup.hpp.
DLIList<int> CAGroup::ancestorUniqueID [private] |
Definition at line 53 of file CAGroup.hpp.
DLIList<int> CAGroup::groupID [private] |
Definition at line 22 of file CAGroup.hpp.
DLIList<CubitString> CAGroup::groupNames [private] |
Definition at line 28 of file CAGroup.hpp.
CubitBoolean CAGroup::initialize_rand = CUBIT_TRUE [static, private] |
Definition at line 58 of file CAGroup.hpp.
DLIList<int> CAGroup::numOwningGroups [private] |
Definition at line 34 of file CAGroup.hpp.
DLIList<int> CAGroup::owningGroupID [private] |
Definition at line 37 of file CAGroup.hpp.
DLIList<CubitString> CAGroup::owningGroupNames [private] |
Definition at line 43 of file CAGroup.hpp.
DLIList<int> CAGroup::owningSequenceNumbers [private] |
Definition at line 46 of file CAGroup.hpp.
DLIList<int> CAGroup::owningUniqueID [private] |
Definition at line 40 of file CAGroup.hpp.
DLIList<int> CAGroup::sequenceNumbers [private] |
Definition at line 31 of file CAGroup.hpp.
DLIList<int> CAGroup::uniqueID [private] |
Definition at line 25 of file CAGroup.hpp.