|
cgma
|
#include <CAMergePartner.hpp>
Public Member Functions | |
| CAMergePartner (RefEntity *, const CubitSimpleAttrib &) | |
| void | initialize () |
| virtual | ~CAMergePartner () |
| CubitStatus | actuate () |
| CubitStatus | actuate_list (DLIList< RefEntity * >) |
| CubitStatus | update () |
| CubitStatus | reset () |
| CubitSimpleAttrib | cubit_simple_attrib () |
| CubitSimpleAttrib | cubit_simple_attrib (CubitString) |
| int | merge_id () |
| int | int_attrib_type () |
| CubitSense | bridge_sense () |
| void | merge_prepare (DLIList< RefEntity * > &merge_list) |
| virtual void | print () |
Static Public Member Functions | |
| static void | set_survivor (CubitSimpleAttrib &csa, int is_survivor) |
| static CubitBoolean | is_survivor (const CubitSimpleAttrib &csa) |
| static void | set_bridge_sense (CubitSimpleAttrib &csa, CubitSense sense) |
| static CubitSense | get_bridge_sense (const CubitSimpleAttrib &csa_ptr) |
| static void | set_saved_id (CubitSimpleAttrib &csa, int id) |
| static int | get_saved_id (const CubitSimpleAttrib &csa) |
Private Attributes | |
| int | mergeID |
| int | isSurvivor |
| CubitSense | bridge_sense_ |
Definition at line 19 of file CAMergePartner.hpp.
| CAMergePartner::CAMergePartner | ( | RefEntity * | new_attrib_owner, |
| const CubitSimpleAttrib & | csa_ptr | ||
| ) |
Definition at line 32 of file CAMergePartner.cpp.
: CubitAttrib(new_attrib_owner) { initialize(); if(!csa_ptr.isEmpty()) { int i_temp = csa_ptr.int_data_list()[0]; mergeID = i_temp; if( csa_ptr.int_data_list().size() > 1 ) { i_temp = csa_ptr.int_data_list()[1]; switch( i_temp ) { case -1: bridge_sense_ = CUBIT_REVERSED; break; case 1: bridge_sense_ = CUBIT_FORWARD; break; case 0: bridge_sense_ = CUBIT_UNKNOWN; break; default: bridge_sense_ = CUBIT_UNKNOWN; assert(0); } } } }
| CAMergePartner::~CAMergePartner | ( | ) | [virtual] |
Definition at line 55 of file CAMergePartner.cpp.
{
//
mergeID = 0;
}
| CubitStatus CAMergePartner::actuate | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 70 of file CAMergePartner.cpp.
{
hasActuated = CUBIT_TRUE;
return CUBIT_SUCCESS;
//We don't need to actuate this attribute here since the merging
//happens in GeometryQueryTool::check_mergeable_refentity.
/*
if (hasActuated == CUBIT_TRUE) return CUBIT_SUCCESS;
BasicTopologyEntity * bte_ptr = CAST_TO(attribOwnerEntity,BasicTopologyEntity);
if (bte_ptr == NULL || bte_ptr->deactivated() == CUBIT_TRUE)
return CUBIT_FAILURE;
DLIList<RefEntity*> merge_list;
//merge_prepare(merge_list);
merge_list.append_unique(attribOwnerEntity);
CubitStatus result = CUBIT_SUCCESS;
if (merge_list.size() > 1)
result = (NULL == MergeTool::instance()->force_merge(merge_list))
? CUBIT_FAILURE : CUBIT_SUCCESS;
if( result )
{
hasActuated = CUBIT_TRUE;
}
return result; */
}
| CubitStatus CAMergePartner::actuate_list | ( | DLIList< RefEntity * > | entity_list | ) | [virtual] |
Reimplemented from CubitAttrib.
Definition at line 161 of file CAMergePartner.cpp.
{
// given a list of ref entities (usually all entities of a given type),
// actuate the camp's on those entities
RefEntity *ref_ent, *keeper;
DLIList<CubitAttrib*> ca_list;
DLIList<TopologyBridge*> bridge_list(entity_list.size());
SDLCAMergePartnerList sorted_camp_list;
int i;
for(i = entity_list.size(); i > 0; i--)
{
ref_ent = entity_list.get_and_step();
ca_list.clean_out();
ref_ent->find_cubit_attrib_type(CA_MERGE_PARTNER, ca_list);
assert(ca_list.size() < 2); // There should only be one
// merge partner per entity
if(ca_list.size() > 0)
{
CAMergePartner* attrib = dynamic_cast<CAMergePartner*>(ca_list.get());
sorted_camp_list.append( attrib );
TopologyEntity* te = dynamic_cast<TopologyEntity*>(ref_ent);
TopologyBridge* bridge = te->bridge_manager()->topology_bridge();
bridge_list.append(bridge);
}
}
sorted_camp_list.sort();
sorted_camp_list.reset();
if (DEBUG_FLAG(90)) {
for (i = sorted_camp_list.size(); i > 0; i--) {
CAMergePartner *camp_ptr = sorted_camp_list.get_and_step();
ref_ent = camp_ptr->attrib_owner();
PRINT_DEBUG_90("%s %d, unique id = %d\n", ref_ent->class_name(),
ref_ent->id(), camp_ptr->merge_id());
}
}
// now go through all the camp's for the entity list; peel off
// camp's with the same id, and merge the associated entities together
while (sorted_camp_list.size() > 0)
{
DLIList<RefEntity*> refent_list;
DLIList<CubitAttrib*> camp_list;
keeper = NULL;
// get the next list of entities with the same camp id
sorted_camp_list.last();
CAMergePartner *camp_ptr = sorted_camp_list.remove();
sorted_camp_list.back();
camp_list.append(camp_ptr);
int current_id = camp_ptr->merge_id();
while (sorted_camp_list.size() > 0 &&
sorted_camp_list.get()->merge_id() == current_id) {
camp_list.append(sorted_camp_list.remove());
sorted_camp_list.back();
}
if (camp_list.size() == 1) continue;
CubitBoolean has_actuated = camp_list.get()->has_actuated();
// check the has actuated flag; if one is set, they all should be;
// also, compile list of ref entities while we're at it
for (current_id = camp_list.size(); current_id > 0; current_id--) {
ref_ent = camp_list.get()->attrib_owner();
refent_list.append(ref_ent);
if (!keeper || ref_ent->id() < keeper->id()) keeper = ref_ent;
assert(camp_list.get()->has_actuated() == has_actuated);
camp_list.step();
}
// if they have already actuated, go on to next ones
if (has_actuated == CUBIT_TRUE) continue;
// otherwise merge
if(refent_list.size() > 1)
MergeTool::instance()->force_merge(refent_list);
// remove the cubit attribute from the surviving parent
keeper->remove_cubit_attrib(CA_MERGE_PARTNER);
} // loop over existing camp's
return CUBIT_SUCCESS;
}
| CubitSense CAMergePartner::bridge_sense | ( | ) | [inline] |
Definition at line 56 of file CAMergePartner.hpp.
{ return bridge_sense_; }
| CubitSimpleAttrib CAMergePartner::cubit_simple_attrib | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 276 of file CAMergePartner.cpp.
{
std::vector<CubitString> cs_list;
std::vector<double> d_list;
std::vector<int> i_list;
i_list.push_back(mergeID);
cs_list.push_back(att_internal_name());
return CubitSimpleAttrib(&cs_list, &d_list, &i_list);
}
| CubitSense CAMergePartner::get_bridge_sense | ( | const CubitSimpleAttrib & | csa_ptr | ) | [static] |
Definition at line 346 of file CAMergePartner.cpp.
{
const std::vector<int>& data = csa.int_data_list();
if( data.size() >= 2)
{
int i = data[1];
switch(i) {
case 1: return CUBIT_FORWARD;
case -1: return CUBIT_REVERSED;
default: assert(0); // if -DNDEBUG, fall through to unknown
case 0: return CUBIT_UNKNOWN;
}
}
return CUBIT_UNKNOWN;
}
| int CAMergePartner::get_saved_id | ( | const CubitSimpleAttrib & | csa | ) | [static] |
Definition at line 385 of file CAMergePartner.cpp.
{
//get the list we want to modify from the CSA
const std::vector<int>& data = csa.int_data_list();
if (data.size() < 3)
return 0;
return data[2];
}
| void CAMergePartner::initialize | ( | ) |
Definition at line 62 of file CAMergePartner.cpp.
{
mergeID = -1;
bridge_sense_ = CUBIT_UNKNOWN;
isSurvivor = 0;
}
| int CAMergePartner::int_attrib_type | ( | ) | [inline, virtual] |
Implements CubitAttrib.
Definition at line 53 of file CAMergePartner.hpp.
{return CA_MERGE_PARTNER;}
| CubitBoolean CAMergePartner::is_survivor | ( | const CubitSimpleAttrib & | csa | ) | [static] |
Definition at line 333 of file CAMergePartner.cpp.
{
const std::vector<int>& data = csa.int_data_list();
if( data.size() >= 4)
{
int i = data[3];
if( i == 1 )
return true;
}
return false;
}
| int CAMergePartner::merge_id | ( | ) | [inline] |
Definition at line 51 of file CAMergePartner.hpp.
{return mergeID;}
| void CAMergePartner::merge_prepare | ( | DLIList< RefEntity * > & | merge_list | ) |
Definition at line 102 of file CAMergePartner.cpp.
{
DLIList<CubitAttrib*> my_ca_list;
CAMergePartner *my_camp_ptr;
RefEntity* re_ptr;
// get all the merge partner attributes that are on my owner
attribOwnerEntity->find_cubit_attrib_type(CA_MERGE_PARTNER, my_ca_list);
merge_list.clean_out();
DLIList<ToolDataUser*> td_list, temp_td_list;
int i;
for (i = my_ca_list.size(); i > 0; i--)
{
my_camp_ptr = CAST_TO(my_ca_list.get(),CAMergePartner);
my_ca_list.step();
td_list.clean_out();
// get all the objects with this unique id (which is also the merge id)
TDUniqueId::find_td_unique_id(my_camp_ptr->merge_id(), temp_td_list);
td_list += temp_td_list;
}
// now put those entities into the merge_list
for (i = td_list.size(); i > 0; i--)
{
re_ptr = CAST_TO(td_list.get(), RefEntity);
if (re_ptr)
{
CubitAttrib *tmp_attrib = re_ptr->get_cubit_attrib( CA_MERGE_PARTNER, CUBIT_FALSE );
if( tmp_attrib )
merge_list.append(re_ptr);
}
td_list.step();
}
// Now get bridge sense for each entity in list.
// Add this entity to list, too.
merge_list.append( attribOwnerEntity );
for( i = merge_list.size(); i--; )
{
RefEntity* ent = merge_list.get_and_step();
TopologyEntity* te = dynamic_cast<TopologyEntity*>(ent);
if( te->bridge_manager()->number_of_bridges() != 1 )
continue;
my_ca_list.clean_out();
ent->find_cubit_attrib_type(CA_MERGE_PARTNER, my_ca_list);
assert( my_ca_list.size() < 2);
if( !my_ca_list.size() )
continue;
my_camp_ptr = dynamic_cast<CAMergePartner*>(my_ca_list.get());
if( my_camp_ptr->bridge_sense() == CUBIT_UNKNOWN )
continue;
}
merge_list.pop(); // take attribOwnerEntity back off list
return;
}
| void CAMergePartner::print | ( | ) | [virtual] |
Reimplemented from CubitAttrib.
Definition at line 398 of file CAMergePartner.cpp.
{
PRINT_INFO("Attribute MERGE_PARTNER, %s %d: mergeId = %d, sense = %d.\n",
attribOwnerEntity->class_name(), attribOwnerEntity->id(),
mergeID, bridge_sense_);
}
| CubitStatus CAMergePartner::reset | ( | ) | [inline, virtual] |
Implements CubitAttrib.
Definition at line 77 of file CAMergePartner.hpp.
{
mergeID = -1;
hasUpdated = CUBIT_FALSE;
hasActuated = CUBIT_FALSE;
hasWritten = CUBIT_FALSE;
deleteAttrib = CUBIT_FALSE;
bridge_sense_ = CUBIT_UNKNOWN;
return CUBIT_SUCCESS;
}
| void CAMergePartner::set_bridge_sense | ( | CubitSimpleAttrib & | csa, |
| CubitSense | sense | ||
| ) | [static] |
Definition at line 305 of file CAMergePartner.cpp.
{
//encode/decode sense as:
// CUBIT_FORWARD : 1
// CUBIT_REVERSE : -1
// CUBIT_UNKNOWN : 0
int i = 0;
switch( sense ) {
case CUBIT_FORWARD : i = 1; break;
case CUBIT_REVERSED : i = -1; break;
case CUBIT_UNKNOWN : i = 0; break;
default: assert(0);
}
//get the list we want to modify from the CSA
std::vector<int>& data = csa.int_data_list();
//change or append?
if( data.size() >= 2 )
{
data[1] = i;
}
else
{
assert( data.size() == 1 );
data.push_back(i);
}
}
| void CAMergePartner::set_saved_id | ( | CubitSimpleAttrib & | csa, |
| int | id | ||
| ) | [static] |
Definition at line 363 of file CAMergePartner.cpp.
{
//get the list we want to modify from the CSA
std::vector<int>& data = csa.int_data_list();
// ID goes after bridge sense, so save bridge sense first
if (data.size() == 1)
set_bridge_sense( csa, CUBIT_UNKNOWN );
// change?
if (data.size() > 2 )
{
data[2] = id;
}
// set?
else
{
assert(data.size() == 2);
data.push_back(id);
}
}
| void CAMergePartner::set_survivor | ( | CubitSimpleAttrib & | csa, |
| int | is_survivor | ||
| ) | [static] |
Definition at line 288 of file CAMergePartner.cpp.
{
//get the list we want to modify from the CSA
std::vector<int>& data = csa.int_data_list();
//change or append?
if( data.size() >= 4 )
{
data[3] = is_survivor;
}
else
{
assert( data.size() == 3 );
data.push_back(is_survivor);
}
}
| CubitStatus CAMergePartner::update | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 248 of file CAMergePartner.cpp.
{
if (hasUpdated) return CUBIT_SUCCESS;
// set the updated flag
hasUpdated = CUBIT_TRUE;
BasicTopologyEntity* bte_ptr = CAST_TO(attribOwnerEntity, BasicTopologyEntity);
if( (bte_ptr == NULL) || (dynamic_cast<RefVolume*>(bte_ptr) != NULL))
{
delete_attrib(CUBIT_TRUE);
}
else if( (bte_ptr->bridge_manager()->number_of_bridges() == 1) &&
(bte_ptr->bridge_manager()->topology_bridge()->bridge_sense() != CUBIT_REVERSED) )
{
delete_attrib(CUBIT_TRUE);
}
else
{
// get the merge id from the TDUniqueId for the owner entity
mergeID = TDUniqueId::get_unique_id(attribOwnerEntity);
bridge_sense_ = CUBIT_UNKNOWN;
isSurvivor = 0;
}
return CUBIT_SUCCESS;
}
CubitSense CAMergePartner::bridge_sense_ [private] |
Definition at line 27 of file CAMergePartner.hpp.
int CAMergePartner::isSurvivor [private] |
Definition at line 26 of file CAMergePartner.hpp.
int CAMergePartner::mergeID [private] |
Definition at line 23 of file CAMergePartner.hpp.