cgma
CompositeTool Class Reference

#include <CompositeTool.hpp>

List of all members.

Public Member Functions

virtual ~CompositeTool ()
virtual RefEdgecomposite (DLIList< RefEdge * > &list, RefVertex *keep_vertex=NULL, RefEdge *survivor=NULL)
virtual RefFacecomposite (DLIList< RefFace * > &list, RefFace *survivor=NULL)
virtual RefVolumecomposite (DLIList< RefVolume * > &list, Body **composite_body=0)
virtual Bodycomposite (DLIList< Body * > &list)
virtual CubitStatus uncomposite (RefEdge *composite_edge, DLIList< RefEdge * > *restored_edges=NULL)
virtual CubitStatus uncomposite (RefFace *composite_face, DLIList< RefFace * > *restored_faces=NULL, bool force_unmerge=false)
virtual CubitStatus uncomposite (RefVolume *composite_vol, DLIList< RefVolume * > *restored_vols=NULL)
virtual CubitStatus uncomposite (Body *composite_body, DLIList< Body * > *restored_bodies=NULL)
CubitBoolean isComposite (const BasicTopologyEntity *bte_ptr) const
CubitBoolean isComposite (const GeometryEntity *ge_ptr) const
CubitStatus composite (DLIList< RefEdge * > &edges_to_composite, DLIList< RefEdge * > &new_edge_list, DLIList< RefVertex * > *vertices_to_keep=NULL, double max_angle=3.15)
CubitStatus composite (DLIList< RefFace * > &faces_to_composite, DLIList< RefFace * > &result_faces, double max_angle=4.0)
RefFacecomposite (DLIList< RefFace * > &faces_to_composite, DLIList< RefEdge * > &result_edges, DLIList< RefVertex * > *vertices_to_keep=NULL, double max_vertex_angle=0.26)
CubitStatus composite (DLIList< RefFace * > &faces_to_composite, DLIList< RefFace * > &result_faces, DLIList< RefEdge * > &result_edges, double max_curve_angle=2.0, DLIList< RefVertex * > *vertices_to_keep=NULL, double max_vtx_angle=0.26)
CubitBoolean okayToComposite (DLIList< BasicTopologyEntity * > &bte_list, DLIList< BasicTopologyEntity * > *boundary=NULL, DLIList< BasicTopologyEntity * > *internal=NULL, bool print_errors=true, bool force_same_parent=false) const
RefEdgeremove_vertex (RefVertex *vertex, bool remove_partitions=false, bool update_dag=true, RefEdge *survivor=NULL)
RefFaceremove_edge (RefEdge *edge, bool remove_partitions=false, bool update_dag=true, RefFace *survivor=NULL)
RefVolumeremove_face (RefFace *face, bool remove_partitions=false, bool update_dag=true)

Static Public Member Functions

static CompositeToolinstance ()
static CubitStatus classify_children (DLIList< BasicTopologyEntity * > &bte_list, DLIList< BasicTopologyEntity * > &boundary_children, DLIList< BasicTopologyEntity * > &internal_children, DLIList< BasicTopologyEntity * > &unknown_children)

Protected Member Functions

virtual CubitStatus update_combined_vols (RefVolume *keep, RefVolume *dead)
virtual CubitStatus update_combined_faces (RefFace *keep, RefEdge *dead, RefFace *delete_face)
virtual CubitStatus update_combined_edges (RefEdge *keep, RefEdge *dead, int keep_interval, double keep_size, FirmnessType keep_interval_type, SizeIntervalType keep_size_type)
virtual CubitStatus determine_combined_edges_interval_or_size (RefEdge *edge_1, RefEdge *edge_2, int &result_interval, double &result_size, FirmnessType &interval_keep_type, SizeIntervalType &size_keep_type)
 CompositeTool ()
CubitStatus removeOldTopology (BasicTopologyEntity *composite)
CubitVector tangent (RefEdge *edge_ptr, RefVertex *vtx_ptr) const
CubitStatus fast_edge_sort (DLIList< RefEdge * > &edge_list, bool valence2_vertices) const
CubitStatus restore_merged_point (TBPoint *point, DLIList< RefFace * > &update, bool force=false)
CubitStatus stitch_points (TBPoint *pt1, TBPoint *pt2)
CubitStatus stitch_curves (Curve *cv1, Curve *cv2)

Static Protected Attributes

static CompositeToolinstance_ = NULL

Friends

class PartitionTool

Detailed Description

Definition at line 19 of file CompositeTool.hpp.


Constructor & Destructor Documentation

Definition at line 77 of file CompositeTool.cpp.

{
  assert( instance_ == this );
  instance_ = NULL;
}

Definition at line 63 of file CompositeTool.cpp.

{
}

Member Function Documentation

CubitStatus CompositeTool::classify_children ( DLIList< BasicTopologyEntity * > &  bte_list,
DLIList< BasicTopologyEntity * > &  boundary_children,
DLIList< BasicTopologyEntity * > &  internal_children,
DLIList< BasicTopologyEntity * > &  unknown_children 
) [static]

Definition at line 1248 of file CompositeTool.cpp.

{
  DLIList<RefEntity*> ref_entity_list, all_children;
  RefEntity *child_ptr, *parent_ptr;
  BasicTopologyEntity* bte_ptr;
  int i, j;
  for( i = bte_list.size(); i > 0; i-- )
  {
    ref_entity_list.clean_out();
    bte_list.get_and_step()->get_child_ref_entities( ref_entity_list );
    all_children.merge_unique( ref_entity_list );
  }
  for( i = all_children.size(); i > 0; i-- )
  {
    ref_entity_list.clean_out();
    child_ptr = all_children.get_and_step();
    child_ptr->get_parent_ref_entities( ref_entity_list );
    
    int parent_count = 0;
    for( j = ref_entity_list.size(); j > 0; j-- )
    {
      parent_ptr = ref_entity_list.get_and_step();
      bte_ptr = CAST_TO( parent_ptr, BasicTopologyEntity );
      if( bte_list.move_to( bte_ptr ) ) parent_count++;
    }
    
    bte_ptr = CAST_TO( child_ptr, BasicTopologyEntity );
    if( parent_count == 1 )
      boundary_children.append( bte_ptr );
    else if( parent_count == ref_entity_list.size() )
      interior_children.append( bte_ptr );
    else
      unknown_children.append( bte_ptr );
  }
  return CUBIT_SUCCESS;
}
RefEdge * CompositeTool::composite ( DLIList< RefEdge * > &  list,
RefVertex keep_vertex = NULL,
RefEdge survivor = NULL 
) [virtual]

Definition at line 92 of file CompositeTool.cpp.

{
  int i;
  DLIList<RefVertex*> vertex_list;
  DLIList<RefEdge*> modified_edges;
  
  for( i = edge_list.size(); i--; )
  {
    RefEdge* edge = edge_list.get_and_step();
    RefVertex* start_vtx = edge->start_vertex();
    RefVertex* end_vtx = edge->end_vertex();
    start_vtx->marked(0);
    end_vtx->marked(0);
    vertex_list.append( start_vtx );
    vertex_list.append( end_vtx );
  }
  for( i = vertex_list.size(); i--; )
  {
    RefVertex* vtx = vertex_list.get_and_step();
    vtx->marked( vtx->marked() + 1 );
  }
  // Check for edges that will have both vertices removed.
  // If any exist then we want to set the flag to have the
  // DAG updated after each vertex is removed.  Otherwise
  // things get left in a bad state.
  bool update_dag = false;
  for(i=edge_list.size(); i>0; i--)
  {
    RefEdge* edge = edge_list.get_and_step();
    if(edge->start_vertex()->marked() == 2 &&
       edge->end_vertex()->marked() == 2)
    {
      update_dag = true;
      i=0;
    }
  }
  for( i = vertex_list.size(); i--; )
    if( vertex_list.step_and_get()->marked() == 2 )
      vertex_list.get()->marked(0);
    else
      vertex_list.change_to( 0 );
  vertex_list.remove_all_with_value(0);
  
  if ( keep && vertex_list.move_to(keep) )
    vertex_list.remove();
  
  if( vertex_list.size() == 0 )
  {
    PRINT_ERROR("Cannot create any composites from passed curves.\n");
    return 0;
  }
  vertex_list.reset();
  RefEdge* result = 0;
  DLIList<RefEdge*> vtx_edges;
  for( i = vertex_list.size(); i--; )
  {
    RefVertex* vtx = vertex_list.get_and_step();
    vtx_edges.clean_out();
    vtx->ref_edges(vtx_edges);
    //check to make sure that the two edges resides on the same surface(s)
    if ( vtx_edges.size() == 2 )
    {
      RefEdge* first_edge = vtx_edges.get();
      RefEdge* second_edge = vtx_edges.step_and_get();
      DLIList <RefFace*> common_faces;
      int size = first_edge->common_ref_faces(second_edge, common_faces);
      if (first_edge->num_ref_faces() != second_edge->num_ref_faces() ||
          size != first_edge->num_ref_faces())
      {
         PRINT_INFO("Curve %d and curve %d don't reside on the same surfaces.\n", first_edge->id(), second_edge->id());
         continue;
      }
    
      result = remove_vertex( vtx, false, update_dag, survivor );
      if (result)
      {
        // First remove any edges from the list that got destroyed in the
        // last remove_vertex operation.
        if(result == first_edge && modified_edges.move_to(second_edge))
        {
          modified_edges.remove();
        }
        else if(result == second_edge && modified_edges.move_to(first_edge))
        {
          modified_edges.remove();
        }
        modified_edges.append_unique(result);
      }
    }  
  }
  
  for ( i = modified_edges.size(); i--; )
    if ( ! modified_edges.step_and_get()->get_curve_ptr() )
      modified_edges.change_to(0);
  modified_edges.remove_all_with_value(0);
  
  result = modified_edges.size() ? modified_edges.get() : 0;

  DLIList<Surface*> update_surfaces, curve_surfaces;
  DLIList<TopologyBridge*> curve_bridges;
  for ( i = modified_edges.size(); i--; )
  {
    RefEdge* edge = modified_edges.get_and_step();
    edge->set_id( RefEntityFactory::instance()->next_ref_edge_id() );
    edge->bridge_manager()->get_bridge_list(curve_bridges);
    curve_bridges.reset();
    for (int j = curve_bridges.size(); j--; )
    {
      curve_surfaces.clean_out();
      curve_bridges.get_and_step()->surfaces(curve_surfaces);
      update_surfaces.merge_unique(curve_surfaces);
    }
  }

  update_surfaces.reset();
  for ( i = update_surfaces.size(); i--; )
  {
    GeometryQueryTool::instance()->make_RefFace(update_surfaces.get_and_step());
  }
  assert( !(survivor && survivor->deactivated()) );
  DAG::instance()->cleanout_deactivated_DAG_nodes();

  return result;
}
RefFace * CompositeTool::composite ( DLIList< RefFace * > &  list,
RefFace survivor = NULL 
) [virtual]

Definition at line 503 of file CompositeTool.cpp.

{
  int i;
  DLIList<RefFace*> modified_faces;

    // Get all edges in the faces in face_list
  DLIList<TopologyEntity*> query_input(face_list.size()), query_output;
  CAST_LIST_TO_PARENT(face_list, query_input);
  ModelQueryEngine::instance()
    ->query_model( query_input, DagType::ref_edge_type(), query_output );
  DLIList<RefEdge*> edge_list(query_output.size());
  CAST_LIST(query_output, edge_list, RefEdge);
  
    // Remove all edges that don't occur in exactly two faces in list
  edge_list.last();
  DLIList<CoEdge*> coedges;
  for (i = edge_list.size(); i--; )
  {
    RefEdge* edge = edge_list.step_and_get();
    coedges.clean_out();
    edge->co_edges(coedges);
    if (coedges.size() == 2)
    {
      RefFace* face1 = coedges.get()->get_ref_face();
      RefFace* face2 = coedges.next()->get_ref_face();
      // Check to make sure both faces are in the faces we are compositing
      // and also make sure the faces are not the same otherwise we
      // will composite out hardlines in one of the faces.
      if (face1 != face2 &&
        face_list.is_in_list(face1) && face_list.is_in_list(face2))
        continue;
    }
    
    edge_list.change_to(0);
  }
  edge_list.remove_all_with_value(0);
  
  if( edge_list.size() == 0 )
  {
    PRINT_ERROR("Cannot create composites from the specified surfaces.\n");
    return 0;
  } 

  edge_list.reset();
  for( i = edge_list.size(); i--; )
  {
    RefEdge* edge = edge_list.get_and_step();
    RefFace* face = remove_edge( edge, false, false, keep_face );      
    if (face)
      modified_faces.append_unique(face);
  }
  
  for ( i = modified_faces.size(); i--; )
    if( ! modified_faces.step_and_get()->get_surface_ptr() )
      modified_faces.change_to(0);
  modified_faces.remove_all_with_value(0);  
  
  RefFace* result = modified_faces.size() ? modified_faces.get() : 0;

#ifdef ALPHA_TREADSWEEP
  // Make sure names from all of the faces get added to the
  // list of names in the result.
  if(result)
  {
    for(i=face_list.size(); i--;)
    {
      RefFace *cur_face = face_list.get_and_step();
      if(cur_face != result)
      {
        result->merge_entity_names(cur_face);
      }
    }
  }
#endif

  DLIList<RefVolume*> vol_list, surf_vols;
  for ( i = modified_faces.size(); i--; )
  {
    RefFace* face = modified_faces.get_and_step();
    face->set_id( RefEntityFactory::instance()->next_ref_face_id() );
    surf_vols.clean_out();
    face->ref_volumes(surf_vols);
    vol_list.merge_unique(surf_vols);
  }
  
  vol_list.reset();
  for ( i = vol_list.size(); i--; )
  {
    RefVolume* vol = vol_list.get_and_step();
    Lump* lump = vol->get_lump_ptr();
    GeometryQueryTool::instance()->make_Body(lump->bodysm());
  }
  assert( !(keep_face && keep_face->deactivated()) );
  DAG::instance()->cleanout_deactivated_DAG_nodes();

  return result;
}
RefVolume * CompositeTool::composite ( DLIList< RefVolume * > &  list,
Body **  composite_body = 0 
) [virtual]

Definition at line 787 of file CompositeTool.cpp.

{
  int i;
  DLIList<RefVolume*> modified_vols;
  DLIList<Body*> input_bodies;
  for (i = volumes.size(); i--; )
    input_bodies.append_unique( volumes.get_and_step()->get_body_ptr() );

    // Get all faces in the volumes
  DLIList<TopologyEntity*> query_input(volumes.size()), query_output;
  CAST_LIST_TO_PARENT(volumes, query_input);
  ModelQueryEngine::instance()
    ->query_model( query_input, DagType::ref_face_type(), query_output );
  DLIList<RefFace*> faces(query_output.size());
  CAST_LIST(query_output, faces, RefFace);
  
    // Remove all faces that don't occur in exactly two volumes in list
  faces.last();
  DLIList<CoFace*> cofaces;
  for (i = faces.size(); i--; )
  {
    RefFace* face = faces.step_and_get();
    cofaces.clean_out();
    face->co_faces(cofaces);
    if (cofaces.size() == 2)
    {
      RefVolume* vol1 = cofaces.get()->get_ref_volume();
      RefVolume* vol2 = cofaces.next()->get_ref_volume();
      if (volumes.is_in_list(vol1) && volumes.is_in_list(vol2))
        continue;
    }
    
    faces.change_to(0);
  }
  faces.remove_all_with_value(0);
  
  if( faces.size() == 0 )
  {
    PRINT_ERROR("Cannot create composites from the specified volumes.\n");
    return 0;
  }
  
  faces.reset();
  for( i = faces.size(); i--; )
  {
    RefFace* face = faces.get_and_step();
    RefVolume* vol = remove_face( face, false, false );
    if (vol)
      modified_vols.append_unique(vol);
  }
  
  for ( i = modified_vols.size(); i--; )
    if( ! modified_vols.step_and_get()->get_lump_ptr() )
      modified_vols.change_to(0);
  modified_vols.remove_all_with_value(0);  
  
  RefVolume* result = modified_vols.size() ? modified_vols.get() : 0;
  for ( i = modified_vols.size(); i--; )
  {
    RefVolume* vol = modified_vols.get_and_step();
    vol->set_id( RefEntityFactory::instance()->next_ref_volume_id() );
  }
  
  input_bodies.reset();
  for ( i = input_bodies.size(); i--; )
  {
    Body* body = input_bodies.get_and_step();
    BodySM* sm = body->get_body_sm_ptr();
    if (sm)
      GeometryQueryTool::instance()->make_Body(sm);
    else
      GeometryQueryTool::instance()->destroy_dead_entity( body );
  }
  DAG::instance()->cleanout_deactivated_DAG_nodes();
   
  if (body_ptr)
    *body_ptr = result->get_body_ptr();
  return result;
}
Body * CompositeTool::composite ( DLIList< Body * > &  list) [virtual]

Definition at line 1053 of file CompositeTool.cpp.

{
  return 0;
}
CubitStatus CompositeTool::composite ( DLIList< RefEdge * > &  edges_to_composite,
DLIList< RefEdge * > &  new_edge_list,
DLIList< RefVertex * > *  vertices_to_keep = NULL,
double  max_angle = 3.15 
)

Definition at line 1829 of file CompositeTool.cpp.

{
  new_edge_list.clean_out();
  double min_cos_angle = cos( max_curve_angle );
  int i;
  
  //check for duplicates
  DLIList<RefEdge*> edges_to_composite;
  for( i = edges.size(); i > 0; i-- )
  {
    RefEdge* edge_ptr = edges.get_and_step();
    if( ! edges_to_composite.append_unique( edge_ptr ) )
    {
      PRINT_WARNING("Duplicate curve %d in list of curves to composite.\n",
        edge_ptr->id());
    }
  }
  
  
  if( edges_to_composite.size() < 2 ) return CUBIT_SUCCESS;
  
  fast_edge_sort( edges_to_composite, true );
  
  //look for a place to start (a point that we cannot 
  //composite across.)

  RefVertex *vtx_ptr;
  RefEdge* first_edge;
  DLIList<RefEdge*> vertex_edges;

  edges_to_composite.last();
  RefEdge* prev_edge = edges_to_composite.get();
  edges_to_composite.reset();
  
  for( i = edges_to_composite.size(); i >= 0; i-- )
  {
    first_edge = edges_to_composite.get_and_step();
    vtx_ptr = first_edge->common_ref_vertex( prev_edge );
    if( ! vtx_ptr ) break;
    
    vertex_edges.clean_out();
    vtx_ptr->ref_edges( vertex_edges );
    vertex_edges.remove( first_edge );
    vertex_edges.remove( prev_edge );
    if( vertex_edges.size() > 0 ) break;
    
    prev_edge = first_edge;
  }
  
  if( i < 0 ) //if all the edges get composited into one
  {
    edges_to_composite.reset();
    first_edge = edges_to_composite.get();
  }
    
  //composite chains of consecutive edges
  
  edges_to_composite.move_to( first_edge );
  DLIList<RefEdge*> edge_list, sublist;
  int edge_count = edges_to_composite.size();
  while( edge_count > 0 )
  {
    edge_list.clean_out();
    RefEdge* edge_ptr = edges_to_composite.get_and_step();
    edge_list.append( edge_ptr );
    edge_count--;
    
    //Find a chain of connected edges that can form a 
    //topologically valid composite.
    
    while( edge_count > 0 )
    {
      RefEdge* next_edge = edges_to_composite.get();
      vtx_ptr = edge_ptr->common_ref_vertex( next_edge );
      if( ! vtx_ptr ) break;
      
      vertex_edges.clean_out();
      vtx_ptr->ref_edges( vertex_edges );
      vertex_edges.remove( edge_ptr );
      vertex_edges.remove( next_edge );
      if( vertex_edges.size() > 0 ) break;
      
      edge_ptr = next_edge;
      edges_to_composite.step();
      edge_list.append( edge_ptr );
      edge_count--;
    }
      
    if( edge_list.size() == 1 ) continue;
    assert( edge_list.size() );
    
    //Now split that chain of edges further based on
    //user-specified constraints (vertices and/or angle.)
    //This is done seperatly from the above loop to handle
    //cases where the edge_list forms a closed loop, and the
    //user specified one position on that loop to keep.
    
    //Find a start point in the chain.
    edge_list.last();
    edge_ptr = edge_list.get();
    edge_list.reset();
    RefVertex* keep_vertex = 0;
    if( edge_ptr->common_ref_vertex( edge_list.get() ) )
    //if we have a closed loop
    {
      edge_ptr = edge_list.get_and_step();
      for( i = edge_list.size(); i > 0; i-- )
      {
        RefEdge* next_edge = edge_list.get();
        vtx_ptr = edge_ptr->common_ref_vertex( next_edge );
        assert( vtx_ptr != 0 );
        
        if( vertices_to_keep && vertices_to_keep->is_in_list( vtx_ptr ) )
        {
          keep_vertex = vtx_ptr;
          break;
        }
        CubitVector cur_tan = tangent( edge_ptr, vtx_ptr ) * -1.0;
        CubitVector next_tan = tangent( next_edge, vtx_ptr );
        double cos_angle = (cur_tan % next_tan) / 
                       (cur_tan.length() * next_tan.length());
        if( cos_angle < min_cos_angle )
        {
          keep_vertex = vtx_ptr;
          break;
        }
        
        edge_ptr = next_edge;
        edge_list.step();
      }
    }
    
    //If we didn't find any split locations, that's okay.
    //We'll let the compositing code choose which vertex to keep.
    
    int subcount = edge_list.size();
    while( subcount > 0 )
    {
      sublist.clean_out();
      edge_ptr = edge_list.get_and_step();
      subcount--;
      sublist.append( edge_ptr );
      
      while( subcount > 0 )
      {
        RefEdge* next_edge = edge_list.get();
        vtx_ptr = edge_ptr->common_ref_vertex( next_edge );
        assert( vtx_ptr != 0 );
        
        if( vertices_to_keep && vertices_to_keep->is_in_list( vtx_ptr ) )
        {
          keep_vertex = vtx_ptr;
          break;
        }
        CubitVector cur_tan = tangent( edge_ptr, vtx_ptr ) * -1.0;
        CubitVector next_tan = tangent( next_edge, vtx_ptr );
        double cos_angle = (cur_tan % next_tan) / 
                        (cur_tan.length() * next_tan.length());
        if( cos_angle < min_cos_angle )
        {
          keep_vertex = vtx_ptr;
          break;
        }
        
        edge_ptr = next_edge;
        edge_list.step();
        subcount--;
        sublist.append( edge_ptr );
      }
      
    
      if( sublist.size() > 1 )
      {
        edge_ptr = composite( sublist, keep_vertex );
        if( ! edge_ptr ) return CUBIT_FAILURE;
        new_edge_list.append( edge_ptr );
      }
    }
  }
  
  return CUBIT_SUCCESS;
}
CubitStatus CompositeTool::composite ( DLIList< RefFace * > &  faces_to_composite,
DLIList< RefFace * > &  result_faces,
double  max_angle = 4.0 
)

Definition at line 2197 of file CompositeTool.cpp.

{
  int i;
  DLIList<CoEdge*> coedges(2);
  double cos_max_angle = cos( max_angle );
  CubitStatus result = CUBIT_SUCCESS;
  
  DLIList<BasicTopologyEntity*> input, boundary, internal, other;
  CAST_LIST_TO_PARENT( faces_to_composite, input );
  classify_children( input, boundary, internal, other );
  DLIList<RefEdge*> internal_edges(internal.size());
  CAST_LIST( internal, internal_edges, RefEdge );
  if ( !internal_edges.size() )
    return CUBIT_FAILURE;
    
    // Group faces into sets to be composited
  
  std::vector< DLIList<RefFace*> > face_sets;
  for ( i = faces_to_composite.size(); i--; )
    faces_to_composite.get_and_step()->marked(0);
  
  while ( internal_edges.size() )
  {
    RefEdge* edge = internal_edges.pop();
    coedges.clean_out();
    edge->co_edges(coedges);
    if ( coedges.size() != 2 )
      continue;
    
    CoEdge* coedge1 = coedges.get_and_step();
    CoEdge* coedge2 = coedges.get_and_step();
    RefFace* face1 = coedge1->get_ref_face();
    RefFace* face2 = coedge2->get_ref_face();
    
    if ( max_angle < 4.0 )
    {
      CubitVector point, norm1, norm2;
      bool reversed = coedge1->get_sense() == coedge2->get_sense();

      edge->position_from_fraction( 0.33, point );
      norm1 = face1->normal_at( point );
      norm2 = face2->normal_at( point );
      if ( reversed ) norm2 *= -1.0;
      double cos_angle = (norm1 % norm2)/(norm1.length()*norm2.length());
      if ( cos_angle < cos_max_angle )
        continue;

      edge->position_from_fraction( 0.67, point );
      norm1 = face1->normal_at( point );
      norm2 = face2->normal_at( point );
      if ( reversed ) norm2 *= -1.0;
      cos_angle = (norm1 % norm2)/(norm1.length()*norm2.length());
      if ( cos_angle < cos_max_angle )
        continue;
    }
    
    if ( face1->marked() && face2->marked() )
    {
      if ( face1->marked() != face2->marked() )
      {
        DLIList<RefFace*>& merge_set = face_sets[face2->marked()-1];
        face_sets[face1->marked()-1] += merge_set;
        while( merge_set.size() )
          merge_set.pop()->marked( face1->marked() );
      }
    }
    else if ( face2->marked() )
    {
      face1->marked(face2->marked());
      face_sets[face2->marked()-1].append(face1);
    }
    else
    {
      if ( !face1->marked() )
      {
        face_sets.push_back(DLIList<RefFace*>());
        face1->marked(face_sets.size());
        face_sets[face1->marked()-1].append(face1);
      }
      face2->marked(face1->marked());
      face_sets[face1->marked()-1].append(face2);
    }
  }
  
    // clear all marks
  std::vector< DLIList<RefFace*> >::iterator s_itor;
  for ( s_itor = face_sets.begin(); s_itor != face_sets.end(); ++s_itor )
  {
    for ( i = s_itor->size(); i--; )
      s_itor->get_and_step()->marked(0);
  }

    // composite faces
  for ( s_itor = face_sets.begin(); s_itor != face_sets.end(); ++s_itor )
  {
    if ( s_itor->size() < 2 )
      continue;
    
    RefFace* comp = composite(*s_itor);
    if ( comp )
      new_composites.append(comp);
    else
      result = CUBIT_FAILURE;
  }

  return result;
}
RefFace * CompositeTool::composite ( DLIList< RefFace * > &  faces_to_composite,
DLIList< RefEdge * > &  result_edges,
DLIList< RefVertex * > *  vertices_to_keep = NULL,
double  max_vertex_angle = 0.26 
)

Definition at line 2316 of file CompositeTool.cpp.

{
  result_edges.clean_out();
  RefFace* result = composite( faces_to_composite );
  if( ! result ) return 0;
  
  DLIList<RefEdge*> face_edges;
  result->ref_edges( face_edges );
  composite( face_edges, result_edges, vertices_to_keep, max_vertex_angle );
  
  return result;
}
CubitStatus CompositeTool::composite ( DLIList< RefFace * > &  faces_to_composite,
DLIList< RefFace * > &  result_faces,
DLIList< RefEdge * > &  result_edges,
double  max_curve_angle = 2.0,
DLIList< RefVertex * > *  vertices_to_keep = NULL,
double  max_vtx_angle = 0.26 
)

Definition at line 2341 of file CompositeTool.cpp.

{
  result_faces.clean_out();
  result_edges.clean_out();
  
  CubitStatus status = 
    composite( faces_to_composite, result_faces, max_curve_angle );
  if( ! status ) return status;
  
  DLIList<TopologyEntity*> query_input, query_output;
  CAST_LIST_TO_PARENT( result_faces, query_input );
  ModelQueryEngine::instance()->
    query_model( query_input, DagType::ref_edge_type(), query_output );
  
  DLIList<RefEdge*> edge_list;
  CAST_LIST( query_output, edge_list, RefEdge );
  
  return composite( edge_list, result_edges, vertices_to_keep, max_vtx_angle );
}
CubitStatus CompositeTool::determine_combined_edges_interval_or_size ( RefEdge edge_1,
RefEdge edge_2,
int &  result_interval,
double &  result_size,
FirmnessType interval_keep_type,
SizeIntervalType size_keep_type 
) [protected, virtual]

Definition at line 2437 of file CompositeTool.cpp.

{return CUBIT_SUCCESS;}
CubitStatus CompositeTool::fast_edge_sort ( DLIList< RefEdge * > &  edge_list,
bool  valence2_vertices 
) const [protected]

Definition at line 2042 of file CompositeTool.cpp.

{
  int i;
  if( edge_list.size() < 2 ) return CUBIT_SUCCESS;
  
  //make sure all RefEdges are initially marked as zero.
  DLIList<RefVertex*> vtx_list(2), all_vertices(edge_list.size() * 2);
  DLIList<RefEdge*> vertex_edges;
  RefEdge* edge_ptr;
  RefVertex* vtx_ptr;
  for( i = edge_list.size(); i > 0; i-- )
  {
    edge_ptr = edge_list.get_and_step();
    vtx_list.clean_out();
    edge_ptr->ref_vertices( vtx_list );
    for( int j = vtx_list.size(); j > 0; j-- )
    {
      vtx_ptr = vtx_list.get_and_step();
      vtx_ptr->marked( 0 );
    }
  }
  for( i = edge_list.size(); i > 0; i-- )
  {
    edge_ptr = edge_list.get_and_step();
    vtx_list.clean_out();
    edge_ptr->ref_vertices( vtx_list );
    for( int j = vtx_list.size(); j > 0; j-- )
    {
      vtx_ptr = vtx_list.get_and_step();
      if( vtx_ptr->marked() ) continue;
    
      all_vertices.append( vtx_ptr );
      vtx_ptr->marked( 1 );

      vertex_edges.clean_out();
      vtx_ptr->ref_edges( vertex_edges );
      for( int k = vertex_edges.size(); k > 0; k-- )
        vertex_edges.get_and_step()->marked( 0 );
    }
  }
  
  //now mark all of the edges in the edge list with a 1
  for( i = edge_list.size(); i > 0; i-- )
    edge_list.get_and_step()->marked( 1 );
    
  DLIList<RefEdge*> sorted_edge_list( edge_list.size() );
  
  int passes = 0;
  while( sorted_edge_list.size() < edge_list.size() ) 
  {
    passes++;
    RefVertex* start_vtx = 0;
    RefEdge* start_edge = 0;
    
    //choose a start_vtx and start_edge
    for( i = all_vertices.size(); i > 0; i-- )
    {
      vtx_ptr = all_vertices.get_and_step();
      //if( ! vtx_ptr->marked() ) continue;
      
      int edge_count = 0;
      vertex_edges.clean_out();
      vtx_ptr->ref_edges( vertex_edges );
      for( int j = vertex_edges.size(); j > 0; j-- )
      {
        edge_ptr = vertex_edges.get_and_step();
        if( edge_ptr->marked() )
        {
          start_edge = edge_ptr;
          edge_count++;
          if( (edge_count > 1) || (valence2_vertices && vertex_edges.size() > 2) ) 
            break;
          // If the vertex has more than two edges, consider it a 
          // valid starting point for the search because it will not
          // be possible to create a composite across that vertex
          // anyway.
        }
      }
      if( edge_count == 1 )
      {
        start_vtx = vtx_ptr;
        break;
      }
    }
    
    //If we have a circular loop, choose any vertex as the start vertex
    if( ! start_vtx )
    {
      start_edge = 0;
      all_vertices.reset();
      for( i = all_vertices.size(); ! start_edge && (i > 0); i-- )
      {
        start_vtx = all_vertices.get_and_step();
        vertex_edges.clean_out();
        start_vtx->ref_edges( vertex_edges );
        for( int j = vertex_edges.size(); j > 0; j-- )
        {
          edge_ptr = vertex_edges.get_and_step();
          if( edge_ptr->marked() )
          {
            start_edge = edge_ptr;
            break;
          }
        }
        if( start_vtx->marked() ) break;
      }
    }

    assert( start_edge != 0 );
    assert( start_vtx != 0 );


    start_vtx->marked( 0 );
    edge_ptr = start_edge;
    vtx_ptr = start_vtx;
    
    do
    {
      sorted_edge_list.append( edge_ptr );
      edge_ptr->marked( 0 );
      
      RefVertex* next_vtx = edge_ptr->other_vertex( vtx_ptr );
      next_vtx->marked( 0 );
      
      vertex_edges.clean_out();
      next_vtx->ref_edges( vertex_edges );
      RefEdge* next_edge = 0;
      
      if( !valence2_vertices || vertex_edges.size() < 3 )
      {
        for( i = vertex_edges.size(); i > 0; i-- )
        {
          RefEdge* edge2_ptr = vertex_edges.get_and_step();
          if( edge2_ptr->marked() )
          {
            next_edge = edge2_ptr;
            break;
          }
        }
      }
      
      edge_ptr = next_edge;
      vtx_ptr = next_vtx;
    } while( edge_ptr );
  }
  
  assert( sorted_edge_list.size() == edge_list.size() );
  
  edge_list.clean_out();
  edge_list = sorted_edge_list;
  return (passes == 1) ? CUBIT_SUCCESS : CUBIT_FAILURE;
}
CompositeTool * CompositeTool::instance ( void  ) [inline, static]

Definition at line 234 of file CompositeTool.hpp.

{
  return (instance_ != NULL ) ? instance_ : instance_ = new CompositeTool();
}
CubitBoolean CompositeTool::isComposite ( const BasicTopologyEntity bte_ptr) const [inline]

Definition at line 250 of file CompositeTool.hpp.

{
  return bte_ptr ? isComposite(bte_ptr->get_geometry_entity_ptr()) : CUBIT_FALSE;
}
CubitBoolean CompositeTool::isComposite ( const GeometryEntity ge_ptr) const [inline]

Definition at line 240 of file CompositeTool.hpp.

{
  if( dynamic_cast<const CompositeSurface*>(ge_ptr) ||
      dynamic_cast<const CompositeCurve*>(ge_ptr) ||
      dynamic_cast<const CompositePoint*>(ge_ptr) )
    return CUBIT_TRUE;
  return CUBIT_FALSE;
}
CubitBoolean CompositeTool::okayToComposite ( DLIList< BasicTopologyEntity * > &  bte_list,
DLIList< BasicTopologyEntity * > *  boundary = NULL,
DLIList< BasicTopologyEntity * > *  internal = NULL,
bool  print_errors = true,
bool  force_same_parent = false 
) const

Definition at line 1068 of file CompositeTool.cpp.

{
  //check that all entities are of the same type
  bte_list.reset();
  DagType type = bte_list.get_and_step()->dag_type();
  if( (type != DagType::ref_face_type()) && 
      (type != DagType::ref_edge_type()) && 
      (type != DagType::ref_volume_type()) )
  {
    if (print_errors) 
      PRINT_ERROR("Invalid entities passed to CompositeTool::okayToComposite().\n");
    return CUBIT_FALSE;
  }
  int i;
  for( i = bte_list.size(); i > 1; i-- )
  {
    if( bte_list.get_and_step()->dag_type() != type )
    {
      if (print_errors) PRINT_ERROR("Cannot combine entities of different dimensionality.\n");
      return CUBIT_FALSE;
    }
  }
  
  //check that all entities are C0-continous
  DLIList<RefEntity*> unchecked_entities, current_entities,
                  next_entities, child_entities, temp_list ;
  CAST_LIST_TO_PARENT( bte_list, unchecked_entities);
  current_entities.append( unchecked_entities.pop() );

  while( current_entities.size() > 0 )
  {
    next_entities.clean_out();
    child_entities.clean_out();

    
    // Get all adjacent entities
    for( i = current_entities.size(); i > 0; i-- )
    {
      temp_list.clean_out();
      current_entities.get_and_step()->get_child_ref_entities( temp_list );
      child_entities.merge_unique( temp_list );
    }

    for( i = child_entities.size(); i > 0; i-- )
    {
      temp_list.clean_out();
      child_entities.get_and_step()->get_parent_ref_entities( temp_list );
      next_entities.merge_unique( temp_list );
    }
    
    temp_list.clean_out();
    for( i = next_entities.size(); i > 0; i-- )
    {
      RefEntity* entity_ptr = next_entities.get_and_step();

      if( unchecked_entities.move_to( entity_ptr ) )
      {
        temp_list.append( entity_ptr );
        unchecked_entities.extract();
      }
    }
    current_entities = temp_list;
  }
  if( unchecked_entities.size() == 1 )
  {
    if (print_errors) 
    {
      PRINT_ERROR("%s is not connected to any others.\n",
        unchecked_entities.get()->entity_name().c_str() );
      if( unchecked_entities.get()->dag_type() == DagType::ref_volume_type() )
        PRINT_ERROR("\tTry merging first.\n");
    }
    return CUBIT_FALSE;
  }
  else if( unchecked_entities.size() > 1 )
  {
    if (print_errors) {
      PRINT_ERROR("Entities \n");
      for( i = unchecked_entities.size(); i > 0; i-- )
        PRINT_INFO("%d, ",unchecked_entities.get_and_step()->id());
      PRINT_INFO("do not appear to be connected to the others.\n");
    }
    
    return CUBIT_FALSE;
  }
  
  //Check that all common children have at most two
  //parents (and those parents are in the list of entities to
  //composite).
  unchecked_entities.clean_out();
  child_entities.clean_out();
  CAST_LIST_TO_PARENT( bte_list, unchecked_entities);
  for( i = unchecked_entities.size(); i > 0; i-- )
  {
    temp_list.clean_out();
    unchecked_entities.get_and_step()->get_child_ref_entities( temp_list );
    child_entities.merge_unique( temp_list );
  }
  
  DLIList<SenseEntity*> sense_entity_list;
  for( i = child_entities.size(); i > 0; i-- )
  {
    int parent_count = 0;
    current_entities.clean_out();
    RefEntity* child_ptr = child_entities.step_and_get();
    sense_entity_list.clean_out();
    CAST_TO(child_ptr,BasicTopologyEntity)->get_sense_entity_list( sense_entity_list );
    for( int k = sense_entity_list.size(); k > 0; k-- )
      current_entities.append( sense_entity_list.get_and_step()->
        get_grouping_entity_ptr()->get_basic_topology_entity_ptr() );
    for( int j = current_entities.size(); j> 0; j-- )
      if( unchecked_entities.move_to( current_entities.get_and_step() ) )
        parent_count++;
    switch( parent_count )
    {
      case 0:
//        assert( parent_count != 0 ); break;
        return CUBIT_FALSE;
      case 1:
        if( boundary != NULL ) boundary->
          append( CAST_TO( child_entities.get(), BasicTopologyEntity) );
        break;
      case 2:
        if( current_entities.size() != 2 )
        {
          if (print_errors) PRINT_ERROR("Child entity %d cannot be removed.\n",
                                        child_entities.get()->id() );
          return CUBIT_FALSE;
        }
        if( internal != NULL ) internal->
          append( CAST_TO( child_entities.get(), BasicTopologyEntity) );
        break;
      default:
        if (print_errors) PRINT_ERROR("Entities are not simply connected.\n");
        return CUBIT_FALSE;
    }
  }
  
    //Check that all entities to merge are common to all parent grouping entities.
  if( force_same_parents )
  {
    assert( type.functional_type() == DagType::BasicTopologyEntity_TYPE );
    const DagType type_2 = DagType( type.dimension(), DagType::GroupingEntity_TYPE );
    DLIList<TopologyEntity*> first_entity_parents, current_entity_parents;
    bte_list.reset();
    ModelQueryEngine::instance()->query_model( 
      *(bte_list.get_and_step()), type_2, first_entity_parents ); 

    for( i = bte_list.size(); i > 1; i-- )
    {
      current_entity_parents.clean_out();
      ModelQueryEngine::instance()->query_model(
        *(bte_list.get_and_step()), type_2, current_entity_parents );

      if( current_entity_parents != first_entity_parents )  
      {
        if (print_errors) PRINT_ERROR("All entities to be combined must have common "
                                      "topological parents.\n");
        return CUBIT_FALSE;
      }
    }
  }
    
  return CUBIT_TRUE;
}
RefFace * CompositeTool::remove_edge ( RefEdge edge,
bool  remove_partitions = false,
bool  update_dag = true,
RefFace survivor = NULL 
)

Definition at line 611 of file CompositeTool.cpp.

{
  int i;

  DLIList<CoEdge*> edge_coedges;
  edge->co_edges(edge_coedges);
  if (edge_coedges.size() != 2 && 
     (edge->get_curve_ptr()->geometry_type() != POINT_CURVE_TYPE ||
      edge_coedges.size() != 1))
  {
    PRINT_ERROR("Cannot composite over %d-valent curve %d (%s)\n",
      edge_coedges.size(), edge->id(), edge->entity_name().c_str());
    return NULL;
  }

  DLIList<TopologyBridge*> curves(edge->bridge_manager()->number_of_bridges());
  edge->bridge_manager()->get_bridge_list( curves );

  DLIList<Surface*> surfaces;
  assert(curves.size());
  curves.get()->surfaces( surfaces );
  if ( surfaces.size() > 2  || surfaces.size() < 1 )
  {
    PRINT_ERROR("Cannot composite over %d-valence curve %d\n",
      surfaces.size(), edge->id() );
    return 0;
  }
    
  RefFace* face = 0;

  // These will be the two RefFaces associated with the two 
  // surfaces being composited.  We need to store them before we
  // get to the call to remove_curve because after that we won't
  // have access to both of them and we need to pass both of them
  // down to update_combined_faces.
  RefFace *face1 = NULL;
  RefFace *face2 = NULL;
    
  std::vector<CubitString> names_to_add;
  curves.reset();
  Surface* surface = 0;
  for( i = curves.size(); i--; )
  {
    Curve* curve = dynamic_cast<Curve*>(curves.get_and_step());

      // get the two Surfaces that will be involved in the composite operation
      // when the curve is removed
    DLIList<Surface*> surfs;
    curve->surfaces(surfs);
    assert(surfs.size() > 0  && surfs.size() <= 2);  // should be one or two surfs
    face1 = dynamic_cast<RefFace*>(surfs.get()->topology_entity());
    face2 = dynamic_cast<RefFace*>(surfs.next()->topology_entity());

    //Save the names and ids
    surfs.get()->set_saved_id(face1->id());
    DLIList<CubitString> tmp_names;
    face1->entity_names( tmp_names );        
    surfs.get()->set_saved_names( tmp_names.as_vector() );
    std::vector<CubitString> face1_names = tmp_names.as_vector();
    tmp_names.clean_out();       
    face1->remove_entity_names();
    
    surfs.next()->set_saved_id(face2->id());
    face2->entity_names( tmp_names );        
    surfs.next()->set_saved_names( tmp_names.as_vector() );
    std::vector<CubitString> face2_names = tmp_names.as_vector();
    tmp_names.clean_out();       
    face2->remove_entity_names();

      // if only one surface, the edge should be internal to a composite surface
    surfs.reset();

      // Composite the surfaces
    Surface* result = 0;
    PartitionCurve* partcurve = 0;
    if ( !(partcurve = dynamic_cast<SegmentedCurve*>(curve)) )
      partcurve = dynamic_cast<PartPTCurve*>(curve);
    
    Surface* keep = 0;
    if (keep_face) {
      if (surfs.get()->owner() == keep_face->bridge_manager())
        keep = surfs.get();
      else if (surfs.next()->owner() == keep_face->bridge_manager())
        keep = surfs.next();
    }
    if( remove_partitions && partcurve )
      result = PartitionEngine::instance().remove_curve( partcurve );
    if( !result )
      result = CompositeEngine::instance().remove_curve( curve, remove_partitions, keep );

    if( !result )
    {
      //reapply names
      for( int i=face1_names.size(); i--; )
        face1->entity_name( face1_names[i] );
      for( int i=face2_names.size(); i--; )
        face2->entity_name( face2_names[i] );

      PRINT_ERROR("Failed to remove curve %d\n",edge->id());
      break;
    }
    else if( !face )  // get surviving refface
    {
      face = dynamic_cast<RefFace*>(result->topology_entity());
    }
    
    else  // merge resulting composites into surviving refface
    {
      RefFace* old_face = dynamic_cast<RefFace*>(result->topology_entity());
      if( old_face != face )
      {
        if( old_face )
          old_face->bridge_manager()->remove_bridge( result );
        face->bridge_manager()->add_bridge( result );                
      }
    }
    
    names_to_add.insert(names_to_add.end(), face1_names.begin(), face1_names.end() );
    names_to_add.insert(names_to_add.end(), face2_names.begin(), face2_names.end() );
      
    if( result )
      surface = result;
  }
  
  if( !surface )
  {
    PRINT_ERROR("Failed to remove curve %d\n", edge->id() );
    return 0;
  }
  
  RefFace* result = dynamic_cast<RefFace*>(surface->topology_entity());
  assert( result == face );

  //append all names to this ref entity
  for (size_t k = 0; k < names_to_add.size(); k++)
    result->entity_name( names_to_add[k] );

    // notify observers that one face is being composited into another

  // We need to pass the result face and also the one that wasn't chosen
  // as the result face.
  RefFace *delete_face = face1;
  if(result == delete_face)
    delete_face = face2;
  update_combined_faces( result, edge, delete_face );
  
  if ( update_dag )
  {
    DLIList<RefVolume*> modified_volumes;
    result->ref_volumes(modified_volumes);
    for( i = modified_volumes.size(); i--; )
    {
      RefVolume* volume = modified_volumes.get_and_step();
      Lump* lump = volume->get_lump_ptr();
      GeometryQueryTool::instance()->make_Body(lump->bodysm());
    }

    assert( !(keep_face && keep_face->deactivated()) );
    DAG::instance()->cleanout_deactivated_DAG_nodes();
  }
  
  return result;
}
RefVolume * CompositeTool::remove_face ( RefFace face,
bool  remove_partitions = false,
bool  update_dag = true 
)

Definition at line 877 of file CompositeTool.cpp.

{
  int i;

  DLIList<RefVolume*> vol_list(2);
  face->ref_volumes( vol_list );

  DLIList<CoFace*> face_cofaces;
  face->co_faces(face_cofaces);
  if (face_cofaces.size() != 2)
  {
    PRINT_ERROR("Cannot composite over %d-valent surface %d (%s)\n",
      face_cofaces.size(), face->id(), face->entity_name().c_str());
    return NULL;
  }

  DLIList<TopologyBridge*> surfs(face->bridge_manager()->number_of_bridges());
  face->bridge_manager()->get_bridge_list( surfs );
  
    // Seam topology
  Surface *surf1 = 0, *surf2 = 0;
  if (surfs.size()  == 2)
  {
    surfs.reset();
    surf1 = dynamic_cast<Surface*>(surfs.get());
    surf2 = dynamic_cast<Surface*>(surfs.next());
    
    DLIList<RefEdge*> edge_list;
    DLIList<TopologyBridge*> bridges, ptcurves;
    DLIList<Surface*> surfaces;
    face->ref_edges( edge_list );
    while( edge_list.size() )
    {
      RefEdge* edge = edge_list.pop();
      edge->bridge_manager()->get_bridge_list( bridges );
      TopologyBridge *curve1 = 0, *curve2 = 0;
      while (bridges.size())
      {
        TopologyBridge* curve = bridges.pop();
        surfaces.clean_out();
        curve->surfaces( surfaces );
        if (surfaces.is_in_list(surf1))
          curve1 = curve;
        if (surfaces.is_in_list(surf2))
          curve2 = curve;
      }
      
      assert(curve1 && curve2);
      if (curve1 == curve2)
        continue;
      
      for (int i = 0; i < 2; i++)
      {
        RefVertex* vtx = i ? edge->end_vertex() : edge->start_vertex();
        vtx->bridge_manager()->get_bridge_list( bridges );
        TopologyBridge *point1 = 0, *point2 = 0;
        while (bridges.size())
        {
          TopologyBridge* point = bridges.pop();
          ptcurves.clean_out();
          point->get_parents(ptcurves);
          if (ptcurves.is_in_list( curve1 ))
            point1 = point;
          if (ptcurves.is_in_list( curve2 ))
            point2 = point;
        }
        
        if (point1 != point2)
          CompositeEngine::instance().stitch_points( 
            dynamic_cast<TBPoint*>(point1), 
            dynamic_cast<TBPoint*>(point2) );
      }
      
      CompositeEngine::instance().stitch_curves( 
            dynamic_cast<Curve*>(curve1), 
            dynamic_cast<Curve*>(curve2) );
    }
  }
  else if (surfs.size() == 1)
  {
     surf1 = dynamic_cast<Surface*>(surfs.get());
     surf2 = 0;
  }
  else
  {
    return 0;
  }

  DLIList<Lump*> lumps, tmp;
  surf1->lumps( lumps );
  if (surf2)
  {
    surf2->lumps(tmp);
    lumps.merge_unique(tmp);
  }
  if ( lumps.size() > 2  || lumps.size() < 1 )
  {
    PRINT_ERROR("Cannot composite over %d-valence surface %d\n",
      lumps.size(), face->id() );
    return 0;
  }
    
    // get the two Lumps that will be involved in the composite operation
    // when the surface is removed
  Lump* lump = 0;
  RefVolume *tmp_vol = dynamic_cast<RefVolume*>(lumps.get()->topology_entity());
  lumps.get()->set_saved_id( tmp_vol->id() );
  DLIList<CubitString> names;
  tmp_vol->entity_names( names );
  lumps.get()->set_saved_names( names.as_vector() );
  names.clean_out();  

  tmp_vol = dynamic_cast<RefVolume*>(lumps.get()->topology_entity());
  lumps.next()->set_saved_id( tmp_vol->id() );
  tmp_vol->entity_names( names );
  lumps.next()->set_saved_names( names.as_vector() );

    // if only one lump, the surface should be internal to a composite lump
  lumps.reset();

    // Composite the lumps
  PartitionSurface* partsurf = dynamic_cast<PartitionSurface*>(surf1);
  if( surf1 == surf2 && remove_partitions && partsurf )
    lump = PartitionEngine::instance().remove_surface( partsurf );
  if( !lump )
    lump = CompositeEngine::instance().remove_surface( surf1, surf2, remove_partitions );

  if( !lump )
  {
    PRINT_ERROR("Failed to remove surface %d\n",face->id());
    return 0;
  }
  
  RefVolume* result = dynamic_cast<RefVolume*>(lump->topology_entity());
  
    // notify observers that one face is being composited into another
  RefVolume* dead_vol =0;
  if (vol_list.size() > 1)
  {
    vol_list.move_to( result );
    dead_vol = vol_list.next();
  }
  update_combined_vols( result, dead_vol );
  
  if ( update_dag )
  {
    DLIList<Body*> modified_bodies;
    result->bodies(modified_bodies);
    for( i = modified_bodies.size(); i--; )
    {
      Body* body = modified_bodies.get_and_step();
      BodySM* sm = body->get_body_sm_ptr();
      if (sm)
        GeometryQueryTool::instance()->make_Body(sm);
      else
        GeometryQueryTool::instance()->destroy_dead_entity( body );
    }

    DAG::instance()->cleanout_deactivated_DAG_nodes();
  }
  
  return result;
}
RefEdge * CompositeTool::remove_vertex ( RefVertex vertex,
bool  remove_partitions = false,
bool  update_dag = true,
RefEdge survivor = NULL 
)

Definition at line 229 of file CompositeTool.cpp.

{
  DLIList<RefEdge*> vertex_edges;
  int i;
  
    // Get two ref-edges
  vertex->ref_edges( vertex_edges );
  if ( vertex_edges.size() != 2 )
  {
    PRINT_ERROR("Cannot composite over valence-%d vertex.\n", vertex_edges.size());
    return 0;
  }
  
  DLIList<TopologyBridge*> point_bridges;
  DLIList<CoEdgeSM*> coedgesms;
    
  RefEdge *edge = 0, *refedge1 = 0, *refedge2 = 0;
  point_bridges.clean_out();
  vertex->bridge_manager()->get_bridge_list( point_bridges );
    

  int result_interval=-1;
  double result_size=-1;
  SizeIntervalType  result_size_type=NOT_SET; 
  FirmnessType  result_count_type=LIMP; 

  std::vector<CubitString> names_to_add;
  Curve* end_result = 0;
  point_bridges.reset();
  while( point_bridges.size() )
  {
    Curve* result_curve = 0;
    TBPoint* point = dynamic_cast<TBPoint*>(point_bridges.pop());

      // get the RefEdges that will be joined when the vertex is removed
    DLIList<Curve*> curves;
    point->curves(curves);
    curves.reset();
    
    if (curves.size() == 0)  // merged free vertex -- ignore it
      continue;

      // If only one curve, need to stitch point with some other
      // point in same vertex.
    if (curves.size() == 1) {
    
      /* Stitching code not complete.  Fail for now. */
      return 0;
      
      /*
      Curve* first_curve = curves.pop();
    
      TBPoint* other = 0;
      for ( i = point_bridges.size(); i--; ) {
        TBPoint* temp = dynamic_cast<TBPoint*>(point_bridges.step_and_get());
        curves.clean_out();
        temp->curves(curves);
        if ( curves.size() == 1 && curves.get()->owner() != first_curve->owner() ) 
        {
          point_bridges.extract();
          other = temp;
          break;
        }
      }
    
      if (!other)
        return 0;
      
      point = CompositeEngine::instance().stitch_points(point, other);
      if (!point)
        return 0;
        
      curves.append(first_curve);
      
      */
    } // end if (curves.size() == 1)
    

   // assert(curves.size() == 2);
    if(curves.size() != 2)
    {
      break;
    }


    TopologyEntity* topo = curves.get()->topology_entity();
    refedge1 = CAST_TO(topo, RefEdge);
    assert(refedge1 != NULL);
    curves.get()->set_saved_id(refedge1->id());
    DLIList<CubitString> tmp_names;
    std::vector<CubitString> edge1_names;
    refedge1->entity_names( tmp_names );
    curves.get()->set_saved_names( tmp_names.as_vector() );
    for( int i=tmp_names.size(); i--; )
      edge1_names.push_back( tmp_names.get_and_step() );
    tmp_names.clean_out();
    refedge1->remove_entity_names();

    topo = curves.next()->topology_entity();
    refedge2 = CAST_TO(topo, RefEdge);
    assert(refedge2 != NULL);   
    curves.next()->set_saved_id(refedge2->id());
    std::vector<CubitString> edge2_names;
    refedge2->entity_names( tmp_names );
    curves.next()->set_saved_names( tmp_names.as_vector() );
    for( int i=tmp_names.size(); i--; )
      edge2_names.push_back( tmp_names.get_and_step() );
    refedge2->remove_entity_names();



    determine_combined_edges_interval_or_size( refedge1,refedge2,result_interval,result_size,result_count_type,result_size_type); 


    Curve* keep = 0;
    if (keep_edge) 
    {
      if (keep_edge->bridge_manager() == curves.get()->owner())
        keep = curves.get();
      else if (keep_edge->bridge_manager() == curves.next()->owner())
        keep = curves.next();
    }

      // remove the point to make the composite curve
    PartitionPoint* part = dynamic_cast<PartitionPoint*>(point);
    if( remove_partitions && part )
      result_curve = PartitionEngine::instance().remove_point( part );
    if ( !result_curve )
      result_curve = CompositeEngine::instance().remove_point( point, remove_partitions, keep );

    if( !result_curve )
    {
      //reapply names
      for( int i=edge1_names.size(); i--; )
        refedge1->entity_name( edge1_names[i] );
      for( int i=edge2_names.size(); i--; )
        refedge2->entity_name( edge2_names[i] );

      PRINT_ERROR("Failed to remove vertex %d\n", vertex->id() );
      break;
    }
    else if( !edge )
    {
      edge = dynamic_cast<RefEdge*>(result_curve->topology_entity());     
    }
    else
    {
      if( result_curve->owner() )
        result_curve->owner()->remove_bridge( result_curve );
      edge->bridge_manager()->add_bridge( result_curve );
        
      Curve* curve = edge->get_curve_ptr();
      bool geom_sense = curve->relative_sense( result_curve ) == CUBIT_FORWARD;
      bool bridge_sense = curve->bridge_sense() == result_curve->bridge_sense();
      if( geom_sense != bridge_sense )
        result_curve->reverse_bridge_sense();

      coedgesms.clean_out();
      result_curve->coedgesms( coedgesms );
      while( coedgesms.size() )
      { 
        CoEdgeSM* coe = coedgesms.pop();
        if( coe->owner() )
          coe->owner()->remove_bridge( coe );
      }
    }

    names_to_add.insert(names_to_add.end(), edge1_names.begin(), edge1_names.end() );
    names_to_add.insert(names_to_add.end(), edge2_names.begin(), edge2_names.end() );
    
    if ( result_curve )
      end_result = result_curve;
  }
  
  RefEdge* result = NULL;
  if(end_result)
    result = dynamic_cast<RefEdge*>(end_result->topology_entity());
    
  RefEdge* dead = NULL;
  if(result)
  {
    // notify observers that one edge is being composited into another
    // TODO - make a simple function for this notification since it is  times????
    dead = result != refedge1 ? refedge1 : result != refedge2 ? refedge2 : 0;
    update_combined_edges( result, dead ,result_interval,result_size,result_count_type,result_size_type);

    //append all names to this ref entity
    for (size_t k = 0; k < names_to_add.size(); k++)
      result->entity_name( names_to_add[k] );
    
  }

  if ( result && update_dag )
  {
    CubitBoolean flag = CGMApp::instance()->attrib_manager()->auto_actuate_flag(CA_MERGE_PARTNER);
    CGMApp::instance()->attrib_manager()->set_auto_actuate_flag(CA_MERGE_PARTNER, CUBIT_TRUE);
    
    DLIList<RefFace*> parent_faces;
    result->ref_faces( parent_faces );
    
    for( i = parent_faces.size(); i--; )
    {
      Surface* surf = parent_faces.get_and_step()->get_surface_ptr();
      GeometryQueryTool::instance()->make_RefFace( surf );
    }
    if ( !parent_faces.size() && end_result) // free curves
    {
      RefEdge* edge = GeometryQueryTool::instance()->make_RefEdge(end_result);
      RefEdge* dead = edge == refedge1 ? refedge2 : edge == refedge2 ? refedge1 : 0;
      assert( dead && !dead->get_curve_ptr() );
      dead->remove_from_DAG();
    }
    assert( !(keep_edge && keep_edge->deactivated()) );
    DAG::instance()->cleanout_deactivated_DAG_nodes();
    CGMApp::instance()->attrib_manager()->set_auto_actuate_flag(CA_MERGE_PARTNER, flag);
  }

  
  return result;
}
CubitStatus CompositeTool::restore_merged_point ( TBPoint point,
DLIList< RefFace * > &  update,
bool  force = false 
) [protected]

Definition at line 1393 of file CompositeTool.cpp.

{
  int i;
  
  HiddenEntitySet* hs = dynamic_cast<HiddenEntitySet*>(hidden_pt->owner());
  if (!hs)
    return CUBIT_FAILURE;
  CompositeCurve* owner = dynamic_cast<CompositeCurve*>(hs->owner());
  if (!owner)
    return CUBIT_FAILURE;
  
  RefEdge* old_edge = dynamic_cast<RefEdge*>(owner->topology_entity());
  int num_curves;
  DLIList<TopologyBridge*> curve_bridges;
  if (old_edge)
  {
    num_curves = old_edge->bridge_manager()->number_of_bridges();
    old_edge->bridge_manager()->get_bridge_list(curve_bridges);
  }
  else
  {
    num_curves = 1;
    curve_bridges.append(owner);
  }
     
  DLIList<CompositeCurve*> curves(num_curves);
  CAST_LIST(curve_bridges, curves, CompositeCurve);
  DLIList<TBPoint*> points(curves.size());
  
  assert(curves.is_in_list(owner));
  CubitVector position = hidden_pt->coordinates();
  
  DLIList<TBPoint*> curve_pts;
  curves.reset();
  GeometryQueryTool* gqt = GeometryQueryTool::instance();
  double factor = gqt->get_geometry_factor();
  for ( i = curves.size(); i--; )
  {
    curve_pts.clean_out();
    curves.get_and_step()->get_hidden_points(curve_pts);
    for (int j = curve_pts.size(); j--; )
    {
      TBPoint* curve_pt = curve_pts.get_and_step();
      if (gqt->about_spatially_equal(position, curve_pt->coordinates(), factor))
      {
        points.append(curve_pt);
        break;
      }
    }
  }
  
  if (!force && points.size() != curve_bridges.size())
  {
    RefEdge* edge = dynamic_cast<RefEdge*>(owner->topology_entity());
    PRINT_ERROR("Cannot restore vertex hidden by curve %d without unmerging "
                "curve and possibly adjacent surfaces.  Use the 'force' "
                "option to force unmerging of geometry.\n", edge ? edge->id() : 0);
    return CUBIT_FAILURE;
  }
  
  points.last();
  for ( i = points.size(); i--; )
  {
    TBPoint* pt = points.step_and_get();
    if (CompositePoint* cp = dynamic_cast<CompositePoint*>(pt))
      pt = cp->get_point();
    
    if (!CompositeEngine::instance().restore_point(pt))
      points.change_to(0);
    else if (CompositePoint* cp = dynamic_cast<CompositePoint*>(pt->owner()))
      points.change_to(cp);
    else
      points.change_to(pt);
  }
  points.remove_all_with_value(0);
  
  if (!points.size())
    return CUBIT_FAILURE;
  
  points.reset();
  RefVertex* new_vtx = gqt->make_RefVertex(points.get());
  for ( i = points.size(); i--; )
  {
    TBPoint* pt = points.get_and_step();
    if (pt->owner())
      assert(pt->topology_entity() == new_vtx);
    else
      new_vtx->bridge_manager()->add_bridge(pt);
  }
          
  CubitVector center_1, center_2;
  DLIList<TopologyBridge*> pt_curves(2);
  points.reset();
  points.get()->get_parents(pt_curves);
  
    // Ignore composite point-curves.  They are transient and will be
    // deleted later.  Don't try to create RefEdges for them now.
  if (pt_curves.size() != 2)
  {
#ifndef NDEBUG
    assert(pt_curves.size() == 1);
    CompositeCurve* ccurve = dynamic_cast<CompositeCurve*>(pt_curves.get());
    assert(ccurve->num_curves() == 0 && ccurve->geometry_type() == POINT_CURVE_TYPE );
#endif
    return CUBIT_SUCCESS;
  }
  
  dynamic_cast<Curve*>(pt_curves.get())->position_from_fraction(0.5, center_1);
  dynamic_cast<Curve*>(pt_curves.next())->position_from_fraction(0.5, center_2);
  
  DLIList<Curve*> new_edge_1_curves(points.size()), 
                  new_edge_2_curves(points.size());
  
  points.reset();
  for ( i = points.size(); i--; )
  {
    pt_curves.clean_out();
    points.get_and_step()->get_parents(pt_curves);
    assert(pt_curves.size() == 2);
    Curve* curve_1 = dynamic_cast<Curve*>(pt_curves.get());
    Curve* curve_2 = dynamic_cast<Curve*>(pt_curves.next());
    CubitVector ptc1, ptc2;
    curve_1->position_from_fraction( 0.5, ptc1 );
    curve_2->position_from_fraction( 0.5, ptc2 );
    bool close1 = (center_1 - ptc1).length_squared() < (center_2 - ptc1).length_squared();
    bool close2 = (center_1 - ptc2).length_squared() < (center_2 - ptc2).length_squared();
    if (close1 && !close2)
    {
      new_edge_1_curves.append(curve_1);
      new_edge_2_curves.append(curve_2);
    }
    else if (!close1 && close2)
    {
      new_edge_2_curves.append(curve_1);
      new_edge_1_curves.append(curve_2);
    }
    else
    {
      assert(close1 != close2);
    }
  }

  for ( i = 0; i < 2; i++ )
  {
    int j;
    DLIList<Curve*>& new_edge_curves = i ? new_edge_2_curves : new_edge_1_curves;
    DLIList<Curve*>& otr_edge_curves = i ? new_edge_1_curves : new_edge_2_curves;
    RefEdge* new_edge = 0;
    new_edge_curves.reset();
    for (j = new_edge_curves.size(); j--; )
    {
      Curve* curve = new_edge_curves.get_and_step();
      if (curve->owner())
      {
        RefEdge* edge = dynamic_cast<RefEdge*>(curve->topology_entity());
        assert(!!edge);
        if (!otr_edge_curves.is_in_list(edge->get_curve_ptr()))
          new_edge = edge;
      }
    }
    if (!new_edge)
    {
      Curve* curve = new_edge_curves.get();
      if (curve->owner())
        curve->owner()->remove_bridge(curve);
      new_edge = gqt->make_RefEdge(curve);
    }
  
    Curve* first = new_edge->get_curve_ptr();
    for (j = new_edge_curves.size(); j--; )
    {
      Curve* curve = new_edge_curves.get_and_step();
      if (curve->owner())
      {
        if (curve->topology_entity() == new_edge)
          continue;
        else
          curve->owner()->remove_bridge(curve);
      }
      
      bool reversed = first->relative_sense(curve) == CUBIT_REVERSED;
      bool saved = first->bridge_sense() == curve->bridge_sense();
      if (reversed == saved)
        curve->reverse_bridge_sense();
      new_edge->bridge_manager()->add_bridge(curve);
    }
  }
  
  if (old_edge)
  {
    DLIList<RefFace*> face_list;
    old_edge->ref_faces(face_list);
    modified += face_list;
  }
  return CUBIT_SUCCESS;
}
CubitStatus CompositeTool::stitch_curves ( Curve cv1,
Curve cv2 
) [protected]

Definition at line 2378 of file CompositeTool.cpp.

{
  if ( cv1->owner() && cv2->owner() && cv1->owner() != cv2->owner() )
    return CUBIT_FAILURE;
  
  DLIList<TopologyBridge*> points;
  TBPoint *start1, *end1, *start2, *end2;

  points.clean_out();
  cv1->get_children( points );
  points.reset();
  start1 = dynamic_cast<TBPoint*>(points.get_and_step());
  end1 = dynamic_cast<TBPoint*>(points.get_and_step());

  points.clean_out();
  cv2->get_children( points );
  points.reset();
  start2 = dynamic_cast<TBPoint*>(points.get_and_step());
  end2 = dynamic_cast<TBPoint*>(points.get_and_step());
  
  assert( start1 && start2 && end1 && end2 );
  
  if ( (start1 == end1) != (start2 == end2) )
    return CUBIT_FAILURE;
  
  if ( start1 == end2 || start1->owner() == end2->owner() )
    std::swap(start2, end2);
  
  if ( (start1->owner() != start2->owner()) || (end1->owner() != end2->owner()) )
    return CUBIT_FAILURE;
  
  if ( start1 != start2 && !stitch_points( start1, start2 ) )
    return CUBIT_FAILURE;
  
  if ( start1 != end1 && end1 != end2 && !stitch_points( end1, end2 ) )
    return CUBIT_FAILURE;
  
  CompositeCurve* result = CompositeEngine::instance().stitch_curves( cv1, cv2 );
  return result ? CUBIT_SUCCESS : CUBIT_FAILURE;
}
CubitStatus CompositeTool::stitch_points ( TBPoint pt1,
TBPoint pt2 
) [protected]

Definition at line 2369 of file CompositeTool.cpp.

{
  if ( pt1->owner() && pt2->owner() && pt1->owner() != pt2->owner() )
    return CUBIT_FAILURE;
  
  CompositePoint* result = CompositeEngine::instance().stitch_points( pt1, pt2 );
  return result ? CUBIT_SUCCESS : CUBIT_FAILURE;
}
CubitVector CompositeTool::tangent ( RefEdge edge_ptr,
RefVertex vtx_ptr 
) const [protected]

Definition at line 2024 of file CompositeTool.cpp.

{
  CubitVector result;
  edge_ptr->tangent( vtx_ptr->coordinates(), result );
  if( vtx_ptr == edge_ptr->end_vertex() )
    result *= -1;
  return result;
} 
CubitStatus CompositeTool::uncomposite ( RefEdge composite_edge,
DLIList< RefEdge * > *  restored_edges = NULL 
) [virtual]

Definition at line 1301 of file CompositeTool.cpp.

{
  int i;
  DLIList<TBPoint*> hidden_points;
  DLIList<RefFace*> face_list;
  DLIList<Curve*> curve_list;
  
  composite_edge->ref_faces( face_list );
  
  if( composite_edge->bridge_manager()->number_of_bridges() != 1 )
  {
    PRINT_ERROR("Curve %d is a merged curve.  Unmerge before removing composite.\n",
      composite_edge->id() );
    return CUBIT_FAILURE;
  }
  
  CompositeCurve* curve_ptr = dynamic_cast<CompositeCurve*>(composite_edge->get_curve_ptr());
  if( !curve_ptr )
    return CUBIT_FAILURE;
  
  for( i = 0; i < curve_ptr->num_curves(); i++ )  
    curve_list.append( curve_ptr->get_curve(i) );

  //remove all names off this ref entity
  composite_edge->remove_entity_names();
  
  curve_ptr->get_hidden_points( hidden_points );
  CubitStatus result = CUBIT_SUCCESS;
  hidden_points.reset();
  for( i = hidden_points.size(); i--; )
  {
    //remove attributes off the hidden points
    CompositeEngine::strip_attributes( hidden_points.get() );

    if( ! CompositeEngine::instance().
      restore_point( hidden_points.get_and_step() ) )
      result = CUBIT_FAILURE;
  }
  
  DLIList<TopologyBridge*> bridge_list;
  composite_edge->bridge_manager()->get_bridge_list(bridge_list);
  int smallest_id = 0;
  for ( i = bridge_list.size(); i--; )
  {
    GeometryEntity* geom_ptr = dynamic_cast<GeometryEntity*>(bridge_list.get_and_step());
    int saved_id = geom_ptr->get_saved_id();
    if ( saved_id && (!smallest_id || saved_id < smallest_id) &&
         !RefEntityFactory::instance()->get_ref_edge(saved_id) )
      smallest_id = saved_id;
  }
  if ( smallest_id && composite_edge->id() != smallest_id )
    composite_edge->set_id( smallest_id );

  
  for( i = face_list.size(); i--; ) 
  {
    Surface* surf = face_list.get_and_step()->get_surface_ptr();
    GeometryQueryTool::instance()->make_RefFace( surf );
  }
  for( i = face_list.size(); i--; )
    GeometryQueryTool::instance()->destroy_dead_entity( face_list.get_and_step() );
  
  for( i = curve_list.size(); i--; )
  {
    //remove attributes off the underlying curves
    Curve *tmp_curve = curve_list.get_and_step();
    CompositeEngine::strip_attributes( tmp_curve );

    BridgeManager* bm = dynamic_cast<BridgeManager*>(tmp_curve->owner());
    RefEdge* edge = bm ? dynamic_cast<RefEdge*>(bm->topology_entity()) : 0;
    if( restored_edges )
      restored_edges->append( edge );
    std::vector<CubitString> underlying_names;
    tmp_curve->get_saved_names( underlying_names );
    for (size_t k = 0; k < underlying_names.size(); k++)
      edge->entity_name( underlying_names[k] );
  }
    
  return result;
}
CubitStatus CompositeTool::uncomposite ( RefFace composite_face,
DLIList< RefFace * > *  restored_faces = NULL,
bool  force_unmerge = false 
) [virtual]

Definition at line 1608 of file CompositeTool.cpp.

{
  int i;
  DLIList<Curve*> hidden_curves;
  DLIList<RefVolume*> vol_list;
  DLIList<Surface*> surface_list;
  
  composite_face->ref_volumes( vol_list );
  
  if( composite_face->bridge_manager()->number_of_bridges() != 1 )
  {
    PRINT_ERROR("Surface %d is a merged curve.  Unmerge before removing composite.\n",
      composite_face->id() );
    return CUBIT_FAILURE;
  }
  
  CompositeSurface* surf_ptr = dynamic_cast<CompositeSurface*>(composite_face->get_surface_ptr());
  if( !surf_ptr )
    return CUBIT_FAILURE;

  //remove all names off this ref entity
  composite_face->remove_entity_names();
  
  for( i = 0; i < surf_ptr->num_surfs(); i++ )
    surface_list.append( surf_ptr->get_surface(i) );
  
  surf_ptr->get_hidden_curves( hidden_curves );
  CubitStatus result = CUBIT_SUCCESS;
  hidden_curves.reset();
  DLIList<TopologyBridge*> points(2);
  DLIList<RefFace*> modified_faces;
  for( i = hidden_curves.size(); i--; )
  {
    //remove attributes off the hidden curves 
    CompositeEngine::strip_attributes( hidden_curves.get() );

    Curve* curve = hidden_curves.get_and_step();

    if(DEBUG_FLAG(87))
    {
      GMem gmem;
      curve->get_geometry_query_engine()->get_graphics(curve,&gmem);
      GfxDebug::draw_polyline(gmem.point_list(),gmem.pointListCount,CUBIT_RED_INDEX);
      GfxDebug::flush();
    }

    curve->get_children(points, true);
    while (points.size())
    {
      TBPoint* pt = dynamic_cast<TBPoint*>(points.pop());

      //remove attributes off the underlying points 
      CompositeEngine::strip_attributes( pt ); 

      HiddenEntitySet* hs = dynamic_cast<HiddenEntitySet*>(pt->owner());
      if (hs && dynamic_cast<CompositeCurve*>(hs->owner()))
      {
        if (!restore_merged_point(pt, modified_faces, force_unmerge))
        {
          PRINT_ERROR("Failed to restore hidden vertex.\n");
          result = CUBIT_FAILURE;
          break;
        }
      }
    }
    
    if (!result)
      break;
    
    if( ! CompositeEngine::instance().restore_curve( curve ) )
      result = CUBIT_FAILURE;
  }
  
  if (modified_faces.size())
  {
    DLIList<TopologyEntity*> query_input(modified_faces.size());
    CAST_LIST_TO_PARENT(modified_faces, query_input);
    DLIList<TopologyEntity*> query_output;
    ModelQueryEngine::instance()->
      query_model(query_input,DagType::ref_volume_type(),query_output);
    while(query_output.size())
      vol_list.append_unique(dynamic_cast<RefVolume*>(query_output.pop()));
  }
                                 
  
  DLIList<TopologyBridge*> bridge_list;
  composite_face->bridge_manager()->get_bridge_list(bridge_list);
  int smallest_id = 0;
  for ( i = bridge_list.size(); i--; )
  {
    GeometryEntity* geom_ptr = dynamic_cast<GeometryEntity*>(bridge_list.get_and_step());
    int saved_id = geom_ptr->get_saved_id();
    if ( saved_id && (!smallest_id || saved_id < smallest_id) &&
         !RefEntityFactory::instance()->get_ref_face(saved_id) )
      smallest_id = saved_id;
  }
  if ( smallest_id && composite_face->id() != smallest_id )
    composite_face->set_id( smallest_id );
  
  for( i = vol_list.size(); i--; )
  {
    Lump* lump= dynamic_cast<Lump*>(
      vol_list.get_and_step()->bridge_manager()->topology_bridge() );
    GeometryQueryTool::instance()->make_Body( lump->bodysm() );
  }
  for( i = vol_list.size(); i--; )
    GeometryQueryTool::instance()->destroy_dead_entity( vol_list.get_and_step() );
  
  for( i = surface_list.size(); i--; )
  {
    Surface *tmp_surf = surface_list.get_and_step();
    //remove attributes off the surfaces 
    CompositeEngine::strip_attributes( tmp_surf ); 

    BridgeManager* bm = dynamic_cast<BridgeManager*>(tmp_surf->owner());
    RefFace* face = bm ? dynamic_cast<RefFace*>(bm->topology_entity()) : 0;
    if( restored_faces )
      restored_faces->append( face );
    std::vector<CubitString> underlying_names;
    tmp_surf->get_saved_names( underlying_names );
    for (size_t k = 0; k < underlying_names.size(); k++)
      face->entity_name( underlying_names[k] );
  }
  
  return result;
}
CubitStatus CompositeTool::uncomposite ( RefVolume composite_vol,
DLIList< RefVolume * > *  restored_vols = NULL 
) [virtual]

Definition at line 1747 of file CompositeTool.cpp.

{
  int i;
  DLIList<Surface*> hidden_surfs;
  DLIList<Body*> body_list;
  DLIList<Lump*> lump_list;
  
  composite_vol->bodies( body_list );
  
  CompositeLump* lump_ptr = dynamic_cast<CompositeLump*>(composite_vol->get_lump_ptr());
  if( !lump_ptr )
    return CUBIT_FAILURE;
  
  for( i = 0; i < lump_ptr->num_lumps(); i++ )
    lump_list.append( lump_ptr->get_lump(i) );
  
  lump_ptr->get_hidden_surfaces( hidden_surfs );
  CubitStatus result = CUBIT_SUCCESS;
  hidden_surfs.reverse();
  while( hidden_surfs.size() )
  {
    Surface* surf = hidden_surfs.pop();
    Surface* stitch = 0;
    if( ! CompositeEngine::instance().restore_surface( surf, stitch ) )
      result = CUBIT_FAILURE;
    if (stitch)
      hidden_surfs.remove( stitch );
  }
  
  int saved_id = composite_vol->get_lump_ptr()->get_saved_id();
  if (saved_id && saved_id < composite_vol->id() &&
      !RefEntityFactory::instance()->get_ref_volume(saved_id))
    composite_vol->set_id( saved_id );
  
  for( i = body_list.size(); i--; )
    GeometryQueryTool::instance()->make_Body( body_list.get_and_step()->get_body_sm_ptr() );
  for( i = body_list.size(); i--; )
    GeometryQueryTool::instance()->destroy_dead_entity( body_list.get_and_step() );
  
  if( restored_vols )
  {
    for( i = lump_list.size(); i--; )
    {
      TBOwner* owner = lump_list.get_and_step()->owner();
      if (BridgeManager* bm = dynamic_cast<BridgeManager*>(owner))
        restored_vols->append( dynamic_cast<RefVolume*>(bm->topology_entity()) );
      else if (CompositeLump* lump = dynamic_cast<CompositeLump*>(owner))
        restored_vols->append_unique( dynamic_cast<RefVolume*>(lump->topology_entity() ) );
    }
  }
  
  return result;
}
CubitStatus CompositeTool::uncomposite ( Body composite_body,
DLIList< Body * > *  restored_bodies = NULL 
) [virtual]

Definition at line 1811 of file CompositeTool.cpp.

{
  return CUBIT_FAILURE;
}
CubitStatus CompositeTool::update_combined_edges ( RefEdge keep,
RefEdge dead,
int  keep_interval,
double  keep_size,
FirmnessType  keep_interval_type,
SizeIntervalType  keep_size_type 
) [protected, virtual]

Definition at line 2435 of file CompositeTool.cpp.

  {return CUBIT_SUCCESS;}
CubitStatus CompositeTool::update_combined_faces ( RefFace keep,
RefEdge dead,
RefFace delete_face 
) [protected, virtual]

Definition at line 2433 of file CompositeTool.cpp.

  {return CUBIT_SUCCESS;}
CubitStatus CompositeTool::update_combined_vols ( RefVolume keep,
RefVolume dead 
) [protected, virtual]

Definition at line 2431 of file CompositeTool.cpp.

  {return CUBIT_SUCCESS;}

Friends And Related Function Documentation

friend class PartitionTool [friend]

Definition at line 21 of file CompositeTool.hpp.


Member Data Documentation

CompositeTool * CompositeTool::instance_ = NULL [static, protected]

Definition at line 228 of file CompositeTool.hpp.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines