|
cgma
|
#include <CACompositeVG.hpp>
Public Member Functions | |
| CACompositeVG (RefEntity *, const CubitSimpleAttrib &) | |
| virtual | ~CACompositeVG () |
| CubitStatus | actuate () |
| CubitStatus | update () |
| CubitStatus | reset () |
| CubitSimpleAttrib | cubit_simple_attrib () |
| CubitSimpleAttrib | cubit_simple_attrib (CubitString) |
| int | int_attrib_type () |
| int | composite_id () |
| void | composite_id (int id) |
| void | check_child_cacvgs (RefEntity *new_entity) |
Private Attributes | |
| int | compositeId |
| DLIList< int > | subEntityIds |
Definition at line 20 of file CACompositeVG.hpp.
| CACompositeVG::CACompositeVG | ( | RefEntity * | owner, |
| const CubitSimpleAttrib & | simple_attrib | ||
| ) |
Definition at line 25 of file CACompositeVG.cpp.
: CubitAttrib(owner) { compositeId = -1; if(!simple_attrib.isEmpty()) { // generate a simple attribute containing the data in this CA const std::vector<int>& i_list = simple_attrib.int_data_list(); // (no string) // now the integers // compositeId, numSubEntities compositeId = i_list[0]; int numSubEntities = i_list[1]; int i; for (i = 0; i < numSubEntities; i++) { subEntityIds.append(i_list[i+2]); } // If we are constructing from a CubitSimpleAttrib, // then this attrib is already written has_written(CUBIT_TRUE); } }
| virtual CACompositeVG::~CACompositeVG | ( | ) | [inline, virtual] |
Definition at line 35 of file CACompositeVG.hpp.
{};
| CubitStatus CACompositeVG::actuate | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 95 of file CACompositeVG.cpp.
{
// actuate this CA
if (has_actuated() == CUBIT_TRUE) return CUBIT_SUCCESS;
// actuate all the unique id attribute first, since CA_COMPOSITE_VG
// depends on CA_UNIQUEID
CAUniqueId::actuate_all();
// now, gather up all the sub entities; if they're not all around,
// exit without setting the actuate flag
DLIList<ToolDataUser*> tdu_list;
int i;
subEntityIds.reset();
CubitBoolean all_actuated = CUBIT_TRUE;
DLIList<CACompositeVG*> comp_attribs;
for (i = subEntityIds.size(); i > 0; i--) {
ToolDataUser *tdu = TDUniqueId::find_td_unique_id(subEntityIds.get_and_step());
if (tdu != NULL) tdu_list.append(tdu);
else {
// put this CA on a list for future actuation
//has_actuated( CUBIT_FALSE );
bool result = CADeferredAttrib::add_unactuated_ca(this);
if (true == result) {
PRINT_DEBUG_90("Can't actuate composite vg attrib on %s %d; adding to unactuated "
"list.\n",
attrib_owner()->class_name(), attrib_owner()->id());
}
return CUBIT_FAILURE;
}
//The portion of code below examines the entities that this entity will be
//composited with. If the CACompositeVG attribute on these entities-to-be-composited
//do not have their 'has_actuated' variable set to TRUE, then this Composite attribute
//is not ready to be actuated. All entities-to-be-composited must have their
//'has_actuated' flag set to TRUE to be ready to be composited
RefEntity *ref_entity = CAST_TO( tdu, RefEntity );
if( ref_entity == NULL )
return CUBIT_FAILURE;
else
{
CACompositeVG *comp_vg_attrib = (CACompositeVG *) ref_entity->get_cubit_attrib(CA_COMPOSITE_VG);
if( comp_vg_attrib )
{
comp_attribs.append( comp_vg_attrib );
if( ref_entity == attrib_owner() ) //skip owner of this attribute..it will be actuated in a minute
continue;
if( !comp_vg_attrib->has_actuated() )
all_actuated = CUBIT_FALSE;
continue;
}
else
{
all_actuated = CUBIT_FALSE;
continue;
}
}
}
has_actuated( CUBIT_TRUE );
//if all sub entities CACompositeVG attribs haven't been here,
//set this one and get out
if( all_actuated == CUBIT_FALSE )
return CUBIT_SUCCESS;
// ok, we've got a list of tdu's; cast to list of ref edges or faces (currently
// the only entities we know how to composite)
DLIList<RefEdge*> ref_edges;
CAST_LIST(tdu_list, ref_edges, RefEdge);
DLIList<RefFace*> ref_faces;
CAST_LIST(tdu_list, ref_faces, RefFace);
// do a little error checking: the entities should all be the same type, and
// should be either ref edges or ref faces
if ((ref_edges.size() > 0 && ref_faces.size() > 0) ||
(ref_edges.size() > 0 && ref_edges.size() != tdu_list.size()) ||
(ref_faces.size() > 0 && ref_faces.size() != tdu_list.size())) {
PRINT_ERROR("Entities for composite containing %s %d not all the same.\n",
attrib_owner()->class_name(), attrib_owner()->id());
return CUBIT_FAILURE;
}
else if (ref_edges.size() == 0 && ref_faces.size() == 0) {
PRINT_ERROR("Can't find any faces or edges for composite containing %s %d.\n",
attrib_owner()->class_name(), attrib_owner()->id());
return CUBIT_FAILURE;
}
// first, check to see that we can composite these entities; if
// not, return without setting actuated flag; this CA will get
// re-actuated if a parent gets composited or partitioned.
DLIList<BasicTopologyEntity*> bte_list;
if (ref_edges.size() > 0) {
CAST_LIST_TO_PARENT(ref_edges, bte_list);
}
else {
CAST_LIST_TO_PARENT(ref_faces, bte_list);
}
if (!CompositeTool::instance()->okayToComposite(bte_list, NULL, NULL, CUBIT_FALSE))
{
for( int k = comp_attribs.size(); k--; )
comp_attribs.get_and_step()->has_actuated( CUBIT_FALSE );
has_actuated( CUBIT_FALSE );
return CUBIT_FAILURE;
}
// ok, we can build the composite
RefEntity *new_entity = NULL;
if (ref_edges.size() > 0) {
PRINT_DEBUG_90("Creating composite edge from %d edges\n",
ref_edges.size());
//need to get the RefEdge that owns this attribute
RefEdge *edge_to_keep= NULL;
edge_to_keep = CAST_TO( attrib_owner(), RefEdge );
if( edge_to_keep == NULL )
return CUBIT_FAILURE;
new_entity = CompositeTool::instance()->composite(ref_edges, NULL, edge_to_keep);
new TDUniqueId(new_entity, compositeId);
CADeferredAttrib::owner_created(new_entity, compositeId);
}
else if (ref_faces.size() > 0) {
PRINT_DEBUG_90("Creating composite face from %d faces\n",
ref_faces.size());
//need to get the RefFace that owns this attribute
RefFace *face_to_keep = NULL;
face_to_keep = CAST_TO( attrib_owner(), RefFace );
if( face_to_keep == NULL )
return CUBIT_FAILURE;
new_entity = CompositeTool::instance()->composite(ref_faces, face_to_keep);
new TDUniqueId(new_entity, compositeId);
CADeferredAttrib::owner_created(new_entity, compositeId);
}
else {
// shouldn't get here
assert(CUBIT_FALSE);
}
/*
// otherwise, we're done
// set the actuated flag for all the CACVG's for this composite
for (i = tdu_list.size(); i > 0; i--) {
RefEntity *entity;
if (ref_faces.size() > 0) entity = ref_faces.get_and_step();
else entity = ref_edges.get_and_step();
CACompositeVG *cacvg = (CACompositeVG *) entity->get_cubit_attrib(CA_COMPOSITE_VG);
assert(cacvg != 0);
cacvg->has_actuated(CUBIT_TRUE);
}
*/
// ok, we've composited; now check for CACVG's on any children, and
// call actuate functions on those if they exist
check_child_cacvgs(new_entity);
return CUBIT_SUCCESS;
}
| void CACompositeVG::check_child_cacvgs | ( | RefEntity * | new_entity | ) |
Definition at line 264 of file CACompositeVG.cpp.
{
// check the new entity's children for CACVG's, and actuate those
// if they exist
DLIList<RefEntity*> children;
new_entity->get_child_ref_entities(children);
DLIList<CubitAttrib*> ca_list;
// get the CA list first, then actuate; if we looped over entities,
// actuating as we went, some entities might eventually be gone
// when we got to them
int i;
for (i = children.size(); i > 0; i--) {
RefEntity *child = children.get_and_step();
child->find_cubit_attrib_type(CA_COMPOSITE_VG, ca_list);
}
//get unactuated deferred attribs
DLIList<CubitAttrib*> unact_deferred_attribs;
unact_deferred_attribs = CADeferredAttrib::get_unactuated_deferred_attribs();
for (i = ca_list.size(); i > 0; i--)
{
CubitAttrib *ca_ptr = ca_list.get();
if (ca_ptr->has_actuated() == CUBIT_TRUE)
ca_list.remove();
else
ca_list.step();
}
// for the same reason, don't delete until we've gone through the list
for (i = ca_list.size(); i > 0; i--) {
CubitAttrib *ca_ptr = ca_list.get();
//don't try and actuate unactuated deferred attribs.....wait till later
if( unact_deferred_attribs.move_to( ca_ptr ) )
{
ca_list.remove();
continue;
}
if (ca_ptr->delete_attrib() == CUBIT_FALSE &&
ca_ptr->has_actuated() == CUBIT_FALSE)
{
ca_ptr->actuate();
}
// remove undeletable attribs from the list so we don't delete them later
if (ca_ptr->delete_attrib() == CUBIT_FALSE)
ca_list.remove();
else
ca_list.step();
}
for (i = ca_list.size(); i > 0; i--)
delete ca_list.get_and_step();
}
| int CACompositeVG::composite_id | ( | ) | [inline] |
Definition at line 50 of file CACompositeVG.hpp.
{return compositeId;};
| void CACompositeVG::composite_id | ( | int | id | ) | [inline] |
Definition at line 51 of file CACompositeVG.hpp.
{compositeId = id;};
| CubitSimpleAttrib CACompositeVG::cubit_simple_attrib | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 73 of file CACompositeVG.cpp.
{
// generate a simple attribute containing the data in this CA
std::vector<CubitString> cs_list;
std::vector<int> i_list;
// first the string
cs_list.push_back(att_internal_name());
// now the integers
// compositeId, numSubEntities
i_list.push_back(compositeId);
i_list.push_back(subEntityIds.size());
int i;
subEntityIds.reset();
for (i = subEntityIds.size(); i > 0; i--)
i_list.push_back(subEntityIds.get_and_step());
return CubitSimpleAttrib(&cs_list, NULL, &i_list);
}
| int CACompositeVG::int_attrib_type | ( | ) | [inline, virtual] |
| CubitStatus CACompositeVG::reset | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 62 of file CACompositeVG.cpp.
{
// reset the info on this CACVG; don't reset info on underlying
// entities, since the lists on this CACVG get *assigned* to that
// entity and not *appended*
compositeId = -1;
subEntityIds.clean_out();
return CUBIT_SUCCESS;
}
| CubitStatus CACompositeVG::update | ( | ) | [virtual] |
Implements CubitAttrib.
Definition at line 55 of file CACompositeVG.cpp.
{
hasUpdated = CUBIT_TRUE;
delete_attrib(CUBIT_TRUE);
return CUBIT_SUCCESS;
}
int CACompositeVG::compositeId [private] |
Definition at line 25 of file CACompositeVG.hpp.
DLIList<int> CACompositeVG::subEntityIds [private] |
Definition at line 28 of file CACompositeVG.hpp.