|
cgma
|
Functions | |
| CubitStatus | remove_blend (RefFace *ref_face, DLIList< CubitVector > &locations, DLIList< RefFace * > &composite_faces) |
| CubitStatus | remove_blends (DLIList< RefFace * > &ref_face_list, int num_segs, double fraction, double distance, RefEdge *from_curve_ptr, DLIList< RefVertex * > &corner_vertex_list, DLIList< RefVertex * > &through_vertex_list, RefEdge *curve_dir_ptr, CubitBoolean preview_flg, DLIList< CubitVector * > &locations, DLIList< RefFace * > &composite_faces) |
| CubitStatus RemoveBlends::remove_blend | ( | RefFace * | ref_face, |
| DLIList< CubitVector > & | locations, | ||
| DLIList< RefFace * > & | composite_faces | ||
| ) |
Definition at line 29 of file RemoveBlends.cpp.
{
CubitStatus result = CUBIT_SUCCESS;
int i;
locations.reset();
RefFace* the_face = ref_face;
if (the_face && VirtualQueryEngine::is_virtual(the_face))
{
PRINT_WARNING ("Can not collapse a virtual surface.\n");
return CUBIT_FAILURE;
}
// Find the curve to split along.
SplitSurfaceTool sst;
DLIList<DLIList<CubitVector*>*> vec_lists;
DLIList<Curve*> curve_list;
DLIList<CubitVector*> *vec_list = new DLIList<CubitVector*>;
vec_list->append( new CubitVector( locations.get_and_step() ) );
vec_list->append( new CubitVector( locations.get_and_step() ) );
vec_lists.append( vec_list );
sst.calculate_split_curves(the_face, vec_lists, curve_list);
//int num_segs = 2;
//double fraction =.5;
//double distance = -1.;
//RefEdge* from_curve_ptr = 0;
//DLIList<RefVertex*> corner_vertex_list;
//DLIList<RefVertex*> through_vertex_list;
//RefEdge *curve_dir_ptr = 0;
//CubitBoolean preview_flg = false;
//CubitBoolean create_ref_edges_flg = false;
//CubitBoolean just_curves_flg = false;
//DLIList<DLIList<Curve*>*> curve_lists_list;
// sst.calculate_split_curves(ref_face_list, num_segs, fraction, distance,
// from_curve_ptr, corner_vertex_list, through_vertex_list,
// curve_dir_ptr,
// preview_flg, create_ref_edges_flg, just_curves_flg,
// curve_lists_list );
//partition the_face
DLIList<RefEdge*> new_edges;
DLIList<RefFace*> result_faces;
result = PartitionTool::instance()->
partition_face_by_curves( the_face, curve_list, result_faces, CUBIT_TRUE, &new_edges );
// clean up curves
while (curve_list.size())
{
Curve* curve = curve_list.pop();
if (curve)
{
GeometryQueryEngine* gqe = curve->get_geometry_query_engine();
gqe->delete_solid_model_entities(curve);
}
}
if( result == CUBIT_FAILURE )
{
PRINT_ERROR("Failed to partition surface %d into 2 distinct pieces\n", the_face->id());
return result;
}
// We MUST clean up an ambiguous partition.
if (new_edges.size() > 1)
{
PRINT_ERROR("Attempted to partition surface %d more than 2 parts,\n"
"Ambiguous surface collapse. Collapse failed.\n",
the_face->id());
DLIList<RefFace*> orig_faces;
PartitionTool::instance()->unpartitionAll(result_faces, orig_faces);
DLIList<RefEdge*> edges, edge_results;
edges.clean_out();
// We started out with one face, we should the same face back
assert( the_face == orig_faces.next(0) );
the_face->ref_edges( edges );
// Do a quick sort to find the PartitionCurves
for ( i = edges.size(); i--; )
{
if ( !dynamic_cast<PartitionCurve*>(edges.step_and_get()->get_curve_ptr()))
edges.change_to(0);
}
edges.remove_all_with_value(0);
// Now remove the partitioned edges
// TODO: what if we are collapsing with an adjacent partitioned surface.
// What happens to the partitioned edges?
if ( edges.size() )
PartitionTool::instance()->unpartitionAll(edges, edge_results);
return CUBIT_FAILURE;
}
if (result_faces.size() < 2)
{
PRINT_WARNING("Surface %d has been improperly partitioned,\n"
"Ambiguous surface collapse. Collapse failed.\n",
the_face->id());
return result;
}
//if(new_face == the_face)
// new_face = GeometryQueryTool::instance()->get_last_ref_face ();
new_edges.clean_out();
//Re-composite surfaces
DLIList<RefFace*> composite_result_faces;
DLIList<RefFace*> remaining_faces;
DLIList<RefFace*> surf_list;
DLIList<int> id_list;
RefFace* face_to_composite = NULL;
RefFace* temp_face = NULL;
RefFace* second_face = NULL;
RefFace* composite_face = NULL;
int num_common_edge1, num_common_edge2;
int size;
int composite_count = 0;
while (0 < (composite_faces.size() + remaining_faces.size()))
{
if(composite_count == 2)
break;
size = composite_faces.size();
if( size > 0)
{
composite_faces.reset();
face_to_composite = composite_faces.get();
composite_faces.remove(face_to_composite);
}
else
{
remaining_faces.reset();
face_to_composite = remaining_faces.get();
remaining_faces.remove(face_to_composite);
}
if (NULL != second_face)
{
num_common_edge1 = second_face->common_ref_edges(face_to_composite,
new_edges);
new_edges.clean_out();
if (num_common_edge1 == 0)
continue;
if (NULL == composite_face)
num_common_edge2 = 0;
else
num_common_edge2 = composite_face->
common_ref_edges(face_to_composite, new_edges);
new_edges.clean_out();
}
else
{
if (NULL == result_faces[0])
num_common_edge1 = 0;
else
{
num_common_edge1 = result_faces[0]->common_ref_edges(face_to_composite,
new_edges);
new_edges.clean_out();
}
if(NULL == result_faces[1])
num_common_edge2 = 0;
else
{
num_common_edge2 = result_faces[1]->common_ref_edges(face_to_composite,
new_edges);
new_edges.clean_out();
}
}
if (num_common_edge1 == 0 && num_common_edge2 == 0)
continue;
else if(num_common_edge1 == 0 || num_common_edge2 == 0 || size == 0)
{
surf_list.clean_out();
if (NULL != second_face)
surf_list.append(second_face);
else if (num_common_edge2 == 0 || size == 0)
{
temp_face = result_faces[0];
second_face = result_faces[1];
surf_list.append(temp_face);
}
else
{
temp_face = result_faces[1];
second_face = result_faces[0];
surf_list.append(temp_face);
}
surf_list.append(face_to_composite);
// composite the surfaces together
CompositeTool::instance()->composite(surf_list, composite_result_faces);
composite_count++;
if( composite_result_faces.size() > 0 )
{
DLIList<RefEdge*> surface_edges, new_edge_list;
remaining_faces.clean_out();
for( i = 0; i < composite_result_faces.size(); i++)
{
// now composite together the edges of the new surface
surface_edges.clean_out();
composite_result_faces.get_and_step()->ref_edges( surface_edges );
new_edge_list.clean_out();
CompositeTool::instance()->composite( surface_edges, new_edge_list);
// keep the lists coherent
composite_face = composite_result_faces.pop();
composite_faces.remove(composite_face);
id_list.append( composite_face->id() );
}
}
else
PRINT_ERROR("Composite surface %d and surface %d failed.\n",
temp_face->id(), face_to_composite->id());
}
else
remaining_faces.append(face_to_composite);
}
if (id_list.size() > 0)
CubitUtil::list_entity_ids("Created composite surfaces ", id_list );
return result;
}
| CubitStatus RemoveBlends::remove_blends | ( | DLIList< RefFace * > & | ref_face_list, |
| int | num_segs, | ||
| double | fraction, | ||
| double | distance, | ||
| RefEdge * | from_curve_ptr, | ||
| DLIList< RefVertex * > & | corner_vertex_list, | ||
| DLIList< RefVertex * > & | through_vertex_list, | ||
| RefEdge * | curve_dir_ptr, | ||
| CubitBoolean | preview_flg, | ||
| DLIList< CubitVector * > & | locations, | ||
| DLIList< RefFace * > & | composite_faces | ||
| ) |
Definition at line 270 of file RemoveBlends.cpp.
{
CubitStatus result = CUBIT_SUCCESS;
int i;
if (ref_face_list.size() <= 1)
{
PRINT_WARNING ("Must specify a chain of surfaces.\n");
return CUBIT_FAILURE;
}
locations.reset();
// check and make sure that we aren't splitting virtual surfaces (yet)
for (i = 0; i < ref_face_list.size(); i++)
{
RefFace* the_face = ref_face_list.get_and_step();
if (the_face && VirtualQueryEngine::is_virtual(the_face))
{
PRINT_WARNING ("Can not collapse a virtual surface.\n");
return CUBIT_FAILURE;
}
}
// Find the curve to split along.
SplitSurfaceTool sst;
DLIList<DLIList<CubitVector*>*> vec_lists;
DLIList<Curve*>* curve_list;
DLIList<DLIList<Curve*>*> curve_lists_list;
DLIList<CubitVector*> *vec_list = new DLIList<CubitVector*>;
vec_list->append( new CubitVector( *locations.get_and_step() ) );
vec_list->append( new CubitVector( *locations.get_and_step() ) );
vec_lists.append( vec_list );
CubitBoolean create_ref_edges_flg = false;
CubitBoolean just_curves_flg = false;
sst.calculate_split_curves(ref_face_list, num_segs, fraction, distance,
from_curve_ptr, corner_vertex_list, through_vertex_list,
curve_dir_ptr,
preview_flg, create_ref_edges_flg, just_curves_flg,
curve_lists_list );
//partition the_face
DLIList<RefEdge*> new_edges;
DLIList<RefFace*> result_faces;
RefFace* the_face;
DLIList<int> id_list;
for (i = 0; i < ref_face_list.size(); i++)
{
// get the face and the curves that split this face
the_face = ref_face_list.get_and_step();
curve_list = curve_lists_list.get_and_step();
result = PartitionTool::instance()->
partition_face_by_curves( the_face, *curve_list, result_faces, CUBIT_FALSE, &new_edges );
if( result == CUBIT_FAILURE )
return result;
if (new_edges.size() > 1)
{
PRINT_WARNING("Surface %d has been partitioned into more than 2 parts,\n"
"Ambiguous surface collapse.\n",
the_face->id());
return result;
}
new_edges.clean_out();
//Re-composite surfaces
DLIList<RefFace*> composite_result_faces;
DLIList<RefFace*> remaining_faces;
DLIList<RefFace*> surf_list;
RefFace* face_to_composite = NULL;
RefFace* temp_face = NULL;
RefFace* second_face = NULL;
RefFace* composite_face = NULL;
int num_common_edge1, num_common_edge2;
int size;
int composite_count = 0;
while (0 < (composite_faces.size() + remaining_faces.size()))
{
if(composite_count == 2)
break;
size = composite_faces.size();
if( size > 0)
{
composite_faces.reset();
face_to_composite = composite_faces.get();
composite_faces.remove(face_to_composite);
}
else
{
remaining_faces.reset();
face_to_composite = remaining_faces.get();
remaining_faces.remove(face_to_composite);
}
if (NULL != second_face)
{
num_common_edge1 = second_face->common_ref_edges(face_to_composite,
new_edges);
new_edges.clean_out();
if (num_common_edge1 == 0)
continue;
if (NULL == composite_face)
num_common_edge2 = 0;
else
num_common_edge2 = composite_face->
common_ref_edges(face_to_composite, new_edges);
new_edges.clean_out();
}
else
{
if (NULL == result_faces[0])
num_common_edge1 = 0;
else
{
num_common_edge1 = result_faces[0]->common_ref_edges(face_to_composite,
new_edges);
new_edges.clean_out();
}
if(NULL == result_faces[1])
num_common_edge2 = 0;
else
{
num_common_edge2 = result_faces[1]->common_ref_edges(face_to_composite,
new_edges);
new_edges.clean_out();
}
}
if (num_common_edge1 == 0 && num_common_edge2 == 0)
continue;
else if(num_common_edge1 == 0 || num_common_edge2 == 0 || size == 0)
{
surf_list.clean_out();
if (NULL != second_face)
surf_list.append(second_face);
else if (num_common_edge2 == 0 || size == 0)
{
temp_face = result_faces[0];
second_face = result_faces[1];
surf_list.append(temp_face);
}
else
{
temp_face = result_faces[1];
second_face = result_faces[0];
surf_list.append(temp_face);
}
surf_list.append(face_to_composite);
// composite the surfaces together
CompositeTool::instance()->composite(surf_list, composite_result_faces);
composite_count++;
if( composite_result_faces.size() > 0 )
{
DLIList<RefEdge*> surface_edges, new_edge_list;
remaining_faces.clean_out();
for( i = 0; i < composite_result_faces.size(); i++)
{
// now composite together the edges of the new surface
surface_edges.clean_out();
composite_result_faces.get_and_step()->ref_edges( surface_edges );
new_edge_list.clean_out();
CompositeTool::instance()->composite( surface_edges, new_edge_list);
// keep the lists coherent
composite_face = composite_result_faces.pop();
composite_faces.remove(composite_face);
id_list.append( composite_face->id() );
}
}
PRINT_ERROR("Composite surface %d and surface %d failed.\n",
temp_face->id(), face_to_composite->id());
}
}
}
if (id_list.size() > 0)
CubitUtil::list_entity_ids("Created composite surfaces ", id_list );
return result;
}