cgma
|
#include <PartitionTool.hpp>
Public Member Functions | |
virtual RefVertex * | partition (RefEdge *edge_ptr, const CubitVector &split_point, RefEdge *&first_new_edge, RefEdge *&second_new_edge, CubitBoolean ignore_mesh=CUBIT_FALSE) |
virtual RefVertex * | partition (RefEdge *edge_ptr, const CubitVector &split_point, DLIList< RefEdge * > &result_edges, CubitBoolean ignore_mesh=CUBIT_FALSE) |
virtual RefFace * | insert_edge (RefFace *face_ptr, DLIList< CubitVector * > &segments, CubitBoolean is_meshed, DLIList< RefEdge * > &created_curves, int level_of_recursion=0, const double *tolerance_length=NULL) |
virtual CubitStatus | insert_edge (DLIList< RefFace * > &input_faces, DLIList< CubitVector * > &segments, DLIList< RefFace * > &result_faces, DLIList< RefEdge * > &created_edges, CubitBoolean do_split_curves=CUBIT_FALSE) |
virtual CubitStatus | partition (RefFace *face_ptr, RefEdge *edge_ptr, RefFace *&new_face1, RefFace *&new_face2, CubitBoolean) |
virtual CubitStatus | partition (RefFace *face_ptr, DLIList< RefEdge * > &split_edges, RefFace *&first_new_face, RefFace *&second_new_face, CubitBoolean ignore_mesh=CUBIT_FALSE) |
virtual CubitStatus | partition (RefVolume *vol_ptr, DLIList< RefFace * > &split_faces, RefVolume *&first_new_volume, RefVolume *&second_new_volume, CubitBoolean ignore_mesh=CUBIT_FALSE) |
virtual CubitStatus | partition (RefVolume *vol_ptr, DLIList< CubitFacet * > &split_faces, RefVolume *&first_new_volume, RefVolume *&second_new_volume, DLIList< RefFace * > &new_surfaces, CubitBoolean ignore_mesh=CUBIT_FALSE) |
CubitStatus | destroy_volume_partition (RefVolume *partition) |
CubitStatus | partition (RefEdge *edge_ptr, DLIList< CubitVector * > &split_points, DLIList< RefEdge * > &new_edges, CubitBoolean ignore_mesh=CUBIT_FALSE) |
CubitStatus | partition (RefEdge *edge_ptr, DLIList< CubitVector * > &split_points, DLIList< RefVertex * > &new_vertices, DLIList< RefEdge * > &new_edges, CubitBoolean ignore_mesh=CUBIT_FALSE) |
CubitStatus | partition_face_by_curves (RefFace *face_ptr, const DLIList< Curve * > &split_curves, DLIList< RefFace * > &result_faces, CubitBoolean do_split_curves=CUBIT_FALSE, DLIList< RefEdge * > *new_edges=NULL, CubitBoolean ignore_mesh=CUBIT_FALSE) |
CubitStatus | partition (RefFace *face_ptr, const DLIList< RefEdge * > &split_edges, DLIList< RefFace * > &result_faces, CubitBoolean do_split_curves=CUBIT_FALSE, DLIList< RefEdge * > *new_edges=NULL, CubitBoolean ignore_mesh=CUBIT_FALSE) |
RefEdge * | unpartition (RefEdge *first_partition_edge, RefEdge *second_partition_edge) |
RefFace * | unpartition (RefFace *first_partition_face, RefFace *second_partition_face) |
RefVolume * | unpartition (RefVolume *first_partition_volume, RefVolume *second_partition_volume) |
RefVolume * | unpartition (DLIList< RefVolume * > &partition_volumes) |
virtual CubitStatus | unpartitionAll (DLIList< RefEdge * > &partition_edges, DLIList< RefEdge * > &restored_edges) |
virtual CubitStatus | unpartitionAll (DLIList< RefFace * > &partition_faces, DLIList< RefFace * > &restored_faces) |
virtual CubitStatus | unpartitionAll (DLIList< RefVolume * > &partition_vols, DLIList< RefVolume * > &restored_vols) |
RefVertex * | make_point_curve (RefFace *ref_face, const CubitVector &position) |
CubitStatus | make_point_curves (RefFace *ref_face, DLIList< CubitVector > &position, DLIList< RefVertex * > &new_vertices) |
virtual | ~PartitionTool () |
virtual CubitStatus | can_remove (RefVertex *vertex) |
virtual CubitStatus | can_remove (RefEdge *edge) |
virtual CubitStatus | can_remove (RefFace *face) |
int | get_faceting_tolerance () |
Static Public Member Functions | |
static PartitionTool * | instance () |
Protected Member Functions | |
PartitionTool () | |
DLIList< Surface * > * | group_merged_surfaces (DLIList< RefFace * > &face_list, int &num_result_sets) |
Static Protected Attributes | |
static PartitionTool * | instance_ = NULL |
Private Member Functions | |
void | notify_partition (DLIList< RefEntity * > &partitioning_entities, BasicTopologyEntity *first_partitioned_entity, BasicTopologyEntity *second_partitioned_entity, BasicTopologyEntity *old_entity) |
CubitStatus | commonGroupingEntities (BasicTopologyEntity *first_bte_ptr, BasicTopologyEntity *secnd_bte_ptr, GroupingEntity *&first_gpe_ptr, GroupingEntity *&second_gpe_ptr) const |
Private Attributes | |
int | facetingTolerance |
Definition at line 34 of file PartitionTool.hpp.
PartitionTool::~PartitionTool | ( | ) | [virtual] |
Definition at line 119 of file PartitionTool.cpp.
{ instance_ = NULL; }
PartitionTool::PartitionTool | ( | ) | [protected] |
Definition at line 115 of file PartitionTool.cpp.
{ facetingTolerance = 10; }
CubitStatus PartitionTool::can_remove | ( | RefVertex * | vertex | ) | [virtual] |
Definition at line 2175 of file PartitionTool.cpp.
{ return CUBIT_SUCCESS; }
CubitStatus PartitionTool::can_remove | ( | RefEdge * | edge | ) | [virtual] |
Definition at line 2176 of file PartitionTool.cpp.
{ return CUBIT_SUCCESS; }
CubitStatus PartitionTool::can_remove | ( | RefFace * | face | ) | [virtual] |
Definition at line 2177 of file PartitionTool.cpp.
{ return CUBIT_SUCCESS; }
CubitStatus PartitionTool::commonGroupingEntities | ( | BasicTopologyEntity * | first_bte_ptr, |
BasicTopologyEntity * | secnd_bte_ptr, | ||
GroupingEntity *& | first_gpe_ptr, | ||
GroupingEntity *& | second_gpe_ptr | ||
) | const [private] |
CubitStatus PartitionTool::destroy_volume_partition | ( | RefVolume * | partition | ) |
Definition at line 1803 of file PartitionTool.cpp.
{ Body* body = volume->get_body_ptr(); PartitionLump* lump = dynamic_cast<PartitionLump*>(volume->get_lump_ptr()); if( !lump ) return CUBIT_FAILURE; CubitStatus result = PartitionEngine::instance().destroy_lump(lump); TopologyBridge* tb = body->bridge_manager()->topology_bridge(); GeometryQueryTool::instance()->make_Body(dynamic_cast<BodySM*>(tb)); return result; }
int PartitionTool::get_faceting_tolerance | ( | ) | [inline] |
Definition at line 262 of file PartitionTool.hpp.
{return facetingTolerance;}
DLIList< Surface * > * PartitionTool::group_merged_surfaces | ( | DLIList< RefFace * > & | face_list, |
int & | num_result_sets | ||
) | [protected] |
Definition at line 743 of file PartitionTool.cpp.
{ // make sure all surfaces are merged the same number of times int i; num_result_sets = 0; int bridge_count = face_list.get()->bridge_manager()->number_of_bridges(); for ( i = face_list.size(); i--; ) if( face_list.step_and_get()->bridge_manager()->number_of_bridges() != bridge_count ) return 0; // get the bridge list (merged Surface*) for the first RefFace DLIList<Surface*>* results = new DLIList<Surface*>[bridge_count]; DLIList<Lump*> surf_owners(bridge_count); face_list.reset(); RefFace* face = face_list.get_and_step(); DLIList<TopologyBridge*> bridge_list(bridge_count); face->bridge_manager()->get_bridge_list(bridge_list); // get the list of lumps involved in the merge from the first RefFace bridge_list.reset(); DLIList<Lump*> lump_list; for ( i = 0; i < bridge_list.size(); i++ ) { Surface* surface = dynamic_cast<Surface*>(bridge_list.get_and_step()); assert(!!surface); lump_list.clean_out(); surface->lumps(lump_list); Lump* lump = 0; if ( lump_list.size() > 1 ) { delete [] results; return 0; } else if (lump_list.size()) lump = lump_list.get(); if( surf_owners.is_in_list( lump ) ) { delete [] results; return 0; } surf_owners.append(lump); results[i].append(surface); } // add the rest of the Surfaces into separate lists according to // the Lump they belong to for ( i = 1; i < face_list.size(); i++ ) { face = face_list.get_and_step(); bridge_list.clean_out(); face->bridge_manager()->get_bridge_list(bridge_list); bridge_list.reset(); for ( int j = bridge_list.size(); j--; ) { Surface* surface = dynamic_cast<Surface*>(bridge_list.get_and_step()); assert(!!surface); lump_list.clean_out(); surface->lumps(lump_list); Lump* lump = 0; if ( lump_list.size() > 1 ) { delete [] results; return 0; } else if (lump_list.size()) lump = lump_list.get(); if ( !surf_owners.move_to(lump) || results[surf_owners.get_index()].size() != i ) { delete [] results; return 0; } results[surf_owners.get_index()].append(surface); } } // return the number of sets - one set for each Lump that was // involved in the merge num_result_sets = bridge_count; return results; }
RefFace * PartitionTool::insert_edge | ( | RefFace * | face_ptr, |
DLIList< CubitVector * > & | segments, | ||
CubitBoolean | is_meshed, | ||
DLIList< RefEdge * > & | created_curves, | ||
int | level_of_recursion = 0 , |
||
const double * | tolerance_length = NULL |
||
) | [virtual] |
Definition at line 413 of file PartitionTool.cpp.
{ int i,j,k; const double TOL_SQR = GEOMETRY_RESABS*GEOMETRY_RESABS; DLIList<Body*> bodies; face_ptr->bodies(bodies); CubitStatus status = CUBIT_SUCCESS; //Partition edges first if (CUBIT_FALSE == is_meshed) { DLIList<RefEdge*> edge_list; face_ptr->ref_edges(edge_list); CubitVector pos = *segments.get(); CubitVector closest; RefEdge * the_edge = NULL; DLIList <CubitVector *> vect_list; DLIList<RefEdge*> temp_list; int count = 0; for (i = 0 ; count < 2 && i < segments.size(); i++) { for (j = 0; j < edge_list.size(); j++) { the_edge = edge_list.get_and_step(); the_edge->closest_point_trimmed(pos, closest); if ( (pos - closest).length_squared() > TOL_SQR ) continue; //closest point need to be on the edge /* the_edge->get_graphics(polyline, 0.0); int size = polyline.point_list_size(); GPoint* pts = polyline.point_list(); CubitVector pt1(pts[0]); CubitVector pt2(pts[1]); CubitBox edge_box (pt1, pt2); if (size > 1) { for (k = 2; k < size; k ++) { CubitVector pt3(pts[k]); CubitVector pt4(pts[k-1]); CubitBox box2(pt4, pt3); edge_box |= box2; } } CubitBox position_box(closest); if (size == 1 || (size > 1 && !position_box.overlap(0, edge_box))) continue; */ CubitBox position_box(closest); CubitBox edge_box = the_edge->bounding_box(); if (!position_box.overlap(GEOMETRY_RESABS, edge_box)) // if (!position_box.overlap(0, edge_box)) continue; delete segments.change_to(new CubitVector (closest)); if((the_edge->start_coordinates() - closest).length_squared() < TOL_SQR ||(the_edge->end_coordinates() - closest).length_squared() < TOL_SQR) break; vect_list.clean_out(); vect_list.append(&closest); temp_list.clean_out(); status = partition(the_edge, vect_list, temp_list); // explicitly test for status here if (CUBIT_SUCCESS != status) { PRINT_ERROR("PartitionTool::insert_edge failed at partition...\n"); } // I've seen cases where the resulting partition position is not // what we passed in so look at the resulting curves and get // the end point that is closest to the point we used for // partitioning the curve. double smallest_dist_sq = CUBIT_DBL_MAX; RefVertex *closest_vert = NULL; for(k=temp_list.size(); k--;) { RefEdge *current_edge = temp_list.get_and_step(); RefVertex *start_vert = current_edge->start_vertex(); RefVertex *end_vert = current_edge->end_vertex(); double len_sq = (start_vert->coordinates()-closest).length_squared(); if(len_sq < smallest_dist_sq) { smallest_dist_sq = len_sq; closest_vert = start_vert; } len_sq = (end_vert->coordinates()-closest).length_squared(); if(len_sq < smallest_dist_sq) { smallest_dist_sq = len_sq; closest_vert = end_vert; } } if(closest_vert) delete segments.change_to(new CubitVector(closest_vert->coordinates())); temp_list.remove(the_edge); DLIList<RefEntity*> ref_list; CAST_LIST_TO_PARENT(temp_list, ref_list); notify_partition( ref_list, the_edge, temp_list.get(), the_edge ); //need to debug later if this happens. if (CUBIT_SUCCESS != status) { PRINT_ERROR("PartitionTool::insert_edge failed at assert...\n"); } assert (CUBIT_SUCCESS == status); edge_list.remove(the_edge); count ++; break; } pos = *segments.step_and_get(); } } if( CubitUndo::get_undo_enabled() ) { DLIList<RefFace*> tmp_face_list(1); tmp_face_list.append( face_ptr ); CubitUndo::save_state_with_cubit_file( tmp_face_list ); } DLIList<TopologyBridge*> bridge_list; face_ptr->bridge_manager()->get_bridge_list( bridge_list ); bridge_list.reset(); bridge_list.step(); for( i = bridge_list.size(); i > 1; i-- ) face_ptr->bridge_manager()->remove_bridge( bridge_list.get_and_step() ); bridge_list.reset(); DLIList<Surface*> result_surfaces; DLIList<Curve*> curves(2), new_curves;; DLIList<Surface*> curve_surfs(2); int removed_composite_curve = 0; for( i = bridge_list.size(); i>0; i--) { Surface* old_surf = dynamic_cast<Surface*>(bridge_list.get_and_step()); Surface* new_surf = PartitionEngine::instance(). insert_curve( old_surf, segments, curves, tolerance_length ); // do it twice in case the segments changed during the first insert_curve // because the segments intersect with the old_surf boundary. This is to // ensure that new vertices are generated at those intersecting points. if (!new_surf && level_of_recursion == 0) { level_of_recursion++; RefFace *return_face = insert_edge( face_ptr, segments, CUBIT_FALSE, new_edges, level_of_recursion); if( CubitUndo::get_undo_enabled() && return_face == NULL ) CubitUndo::remove_last_undo(); return return_face; } if(!new_surf) { CompositeSurface* cs = dynamic_cast<CompositeSurface*>(old_surf); if(cs) { Surface *tmp_srf = cs->get_surface(0); GeometryQueryEngine *gqe = tmp_srf->get_geometry_query_engine(); double tmp_tol = gqe->get_sme_resabs_tolerance(); DLIList<Curve*> hidden_curves; cs->get_hidden_curves(hidden_curves); int k; for(k=hidden_curves.size(); k--;) { Curve *cur_curve = hidden_curves.get_and_step(); CubitVector start_vec, end_vec; double min, max; IntersectionTool int_tool; int curve_on_polyline = 1; cur_curve->get_param_range(min, max); cur_curve->position_from_u(min, start_vec); if(!int_tool.point_on_polyline(start_vec, segments, &tmp_tol)) curve_on_polyline = 0; if(curve_on_polyline) { cur_curve->position_from_u(max, end_vec); if(!int_tool.point_on_polyline(end_vec, segments, &tmp_tol)) curve_on_polyline = 0; } if(curve_on_polyline) { int num_mid_pts = 2; double dt = ((double)(max-min))/((double)(num_mid_pts+1)); double cur_t = min + dt; int n; CubitVector cur_vec; for(n=0; n<num_mid_pts && curve_on_polyline; ++n) { cur_curve->position_from_u(cur_t, cur_vec); if(!int_tool.point_on_polyline(cur_vec, segments, &tmp_tol)) curve_on_polyline = 0; cur_t += dt; } } if(curve_on_polyline) { DLIList<Curve*> cur_curve_crvs; CompositeCurve *ccurve = dynamic_cast<CompositeCurve*>(cur_curve); if(ccurve) { int f, num_crvs = ccurve->num_curves(); for(f=0; f<num_crvs; ++f) cur_curve_crvs.append(ccurve->get_curve(f)); } else { cur_curve_crvs.append(cur_curve); } CompositeEngine::instance().restore_curve(cur_curve); ccurve = dynamic_cast<CompositeCurve*>(cur_curve_crvs.get()->owner()); if(ccurve) { cur_curve_crvs.clean_out(); cur_curve_crvs.append(ccurve); } removed_composite_curve = 1; int y, z; for(z=cur_curve_crvs.size(); z--;) { cur_curve = cur_curve_crvs.get_and_step(); DLIList<TopologyBridge*> pts; cur_curve->get_children_virt(pts); for(y=pts.size(); y--;) { DLIList<TopologyBridge*> crvs; pts.get()->get_parents_virt(crvs); if(crvs.size() == 2) { TopologyBridge *other_curve; if(crvs.get() == cur_curve) other_curve = crvs.step_and_get(); else other_curve = crvs.get(); int p; for(p=curves.size(); p--;) { if(curves.get() == other_curve) { CompositeEngine::instance().remove_point(dynamic_cast<TBPoint*>(pts.get())); curves.remove(curves.get()); p = 0; } else curves.step(); } } pts.step(); } } } } } } if ( !curves.size() && !removed_composite_curve ) { status = CUBIT_FAILURE; break; } for ( int j = curves.size(); j--; ) { curve_surfs.clean_out(); curves.step_and_get()->surfaces(curve_surfs); result_surfaces.merge_unique(curve_surfs); } new_curves += curves; curves.clean_out(); } for( i = bodies.size(); i--; ) { Body* body = bodies.get_and_step(); GeometryQueryTool::instance()->make_Body(body->get_body_sm_ptr()); } DLIList<RefFace*> result_faces; for( i = result_surfaces.size(); i--; ) result_faces.append( GeometryQueryTool::instance()->make_RefFace( result_surfaces.get_and_step() ) ); MergeTool::instance()->merge_reffaces( result_faces ); result_faces.clean_out(); for( i = result_surfaces.size(); i--; ) result_faces.append_unique( dynamic_cast<RefFace*>(result_surfaces.get_and_step()->topology_entity()) ); result_faces.move_to( face_ptr ); RefFace* result = result_faces.size() ? result_faces.next() : 0; if(!result && removed_composite_curve) result = face_ptr; for( i = new_curves.size(); i--; ) { Curve* curve = new_curves.get_and_step(); RefEdge* new_edge = dynamic_cast<RefEdge*>(curve->topology_entity()); new_edges.append_unique(new_edge); } if ( !removed_composite_curve && !new_edges.size() ) { if( CubitUndo::get_undo_enabled() ) CubitUndo::remove_last_undo(); return 0; } DLIList<RefEntity*> ref_list; CAST_LIST_TO_PARENT(new_edges, ref_list); notify_partition( ref_list, face_ptr, result, face_ptr ); if( CubitUndo::get_undo_enabled() && status == CUBIT_FAILURE ) CubitUndo::remove_last_undo(); return status ? result : 0; }
CubitStatus PartitionTool::insert_edge | ( | DLIList< RefFace * > & | input_faces, |
DLIList< CubitVector * > & | segments, | ||
DLIList< RefFace * > & | result_faces, | ||
DLIList< RefEdge * > & | created_edges, | ||
CubitBoolean | do_split_curves = CUBIT_FALSE |
||
) | [virtual] |
Definition at line 834 of file PartitionTool.cpp.
{ int i, j, w, set_count; const double TOL_SQR = GEOMETRY_RESABS*GEOMETRY_RESABS; // group surfaces by Lump DLIList<Surface*> *surface_sets = group_merged_surfaces( input_faces, set_count ); if( !surface_sets ) { PRINT_ERROR("Failed to group merged Surfaces in PartitionTool::insert_edge()\n"); return CUBIT_FAILURE; } input_faces.reset(); if(do_split_curves) { for ( w = input_faces.size(); w--; ) { RefFace* face_ptr = input_faces.get_and_step(); DLIList<RefEdge*> edge_list; face_ptr->ref_edges(edge_list); CubitVector pos = *segments.get(); CubitVector closest; RefEdge * the_edge = NULL; DLIList <CubitVector *> vect_list; DLIList<RefEdge*> temp_list; int count = 0; for (i = 0 ; count < 2 && i < segments.size(); i++) { for (j = 0; j < edge_list.size(); j++) { the_edge = edge_list.get_and_step(); the_edge->closest_point_trimmed(pos, closest ); if ( (pos - closest).length_squared() > TOL_SQR ) continue; //closest point need to be on the edge /* the_edge->get_graphics(polyline, 0.0); int size = polyline.point_list_size(); GPoint* pts = polyline.point_list(); CubitVector pt1(pts[0]); CubitVector pt2(pts[1]); CubitBox edge_box (pt1, pt2); if (size > 1) { for (k = 2; k < size; k ++) { CubitVector pt3(pts[k]); CubitVector pt4(pts[k-1]); CubitBox box2(pt4, pt3); edge_box |= box2; } } CubitBox position_box(closest); if (size == 1 || (size > 1 && !position_box.overlap(0, edge_box))) continue; */ CubitBox position_box(closest); CubitBox edge_box = the_edge->bounding_box(); if (!position_box.overlap(0, edge_box)) continue; delete segments.change_to(new CubitVector (closest)); if((the_edge->start_coordinates() - closest).length_squared() < TOL_SQR ||(the_edge->end_coordinates() - closest).length_squared() < TOL_SQR) break; vect_list.clean_out(); vect_list.append(&closest); CubitStatus status = partition(the_edge, vect_list, temp_list); //need to debug later if this happens. //assert (CUBIT_SUCCESS == status); if( CUBIT_FAILURE == status ) return status; edge_list.remove(the_edge); count ++; break; } pos = *segments.step_and_get(); } } } input_faces.reset(); // unmerge all the surfaces by removing all but the first Lump's // surfaces from the bridge manager DLIList<TopologyBridge*> bridge_list; DLIList<Surface*> surf_list; for ( i = input_faces.size(); i--; ) { RefFace* face_ptr = input_faces.get_and_step(); bridge_list.clean_out(); face_ptr->bridge_manager()->get_bridge_list( bridge_list ); CAST_LIST( bridge_list, surf_list, Surface ); surf_list -= surface_sets[0]; for ( int j = surf_list.size(); j--; ) face_ptr->bridge_manager()->remove_bridge( surf_list.get_and_step() ); } // perform the partition operation - insert curve - on each Lump's set of surfaces DLIList<Surface*> new_surfs, all_new_surfs; DLIList<Curve*> new_curves, all_new_curves; CubitStatus result = CUBIT_SUCCESS; for ( i = 0; i < set_count; i++ ) { new_surfs.clean_out(); new_curves.clean_out(); if ( !PartitionEngine::instance(). insert_curve( surface_sets[i], segments, new_surfs, new_curves ) ) result = CUBIT_FAILURE; all_new_surfs += new_surfs; all_new_curves += new_curves; } delete [] surface_sets; // Do not create a new body in the failure case if (CUBIT_FAILURE == result) return result; // get the list of all bodies involved in the partition operation DLIList<Body*> bodies, all_bodies; for ( i = input_faces.size(); i--; ) { bodies.clean_out(); input_faces.step_and_get()->bodies( bodies ); all_bodies.merge_unique(bodies); } for( i = all_bodies.size(); i--; ) { Body* body = all_bodies.get_and_step(); BodySM* bodysm = dynamic_cast<BodySM*>(body->bridge_manager()->topology_bridge()); if( bodysm ) GeometryQueryTool::instance()->make_Body( bodysm ); } // re-merge if surfaces were merged before the partition operation if( set_count > 1 ) { DLIList<RefFace*> result_faces; for( i = all_new_surfs.size(); i--; ) result_faces.append( GeometryQueryTool::instance()->make_RefFace( all_new_surfs.get_and_step() ) ); MergeTool::instance()->merge_reffaces( result_faces ); } output_faces.clean_out(); //make sure you are dealing with top-level TopologyBridges here, //ones that have a BridgeManager as the TBOwner. for( i = all_new_surfs.size(); i--; ) { Surface *new_surface = all_new_surfs.get_and_step(); RefFace *new_face = dynamic_cast<RefFace*>(new_surface->topology_entity()); if( new_face ) output_faces.append_unique( new_face ); else { DLIList<TopologyBridge*> bridges; PartitionEngine::instance().get_tbs_with_bridge_manager_as_owner(new_surface, bridges ); if( bridges.size() == 0 ) CompositeEngine::instance().get_tbs_with_bridge_manager_as_owner( new_surface, bridges ); Surface *tmp_surf = NULL; if( bridges.get() ) tmp_surf = static_cast<Surface*>(bridges.get()); if( tmp_surf ) { new_face = dynamic_cast<RefFace*>(tmp_surf->topology_entity()); output_faces.append_unique( new_face ); } } } output_faces.merge_unique(input_faces); for( i = all_new_curves.size(); i--; ) { Curve* curve = all_new_curves.get_and_step(); new_edges.append( dynamic_cast<RefEdge*>(curve->topology_entity()) ); } return result; }
PartitionTool * PartitionTool::instance | ( | void | ) | [inline, static] |
Definition at line 318 of file PartitionTool.hpp.
{ if( instance_ == NULL ) instance_ = new PartitionTool(); return instance_; }
RefVertex * PartitionTool::make_point_curve | ( | RefFace * | ref_face, |
const CubitVector & | position | ||
) |
Definition at line 1173 of file PartitionTool.cpp.
{ DLIList<CubitVector> positions(1); DLIList<RefVertex*> results(1); positions.append(position); if( CubitUndo::get_undo_enabled() ) CubitUndo::save_state_with_cubit_file( face_ptr ); if (make_point_curves(face_ptr, positions, results) && results.size()) return results.get(); else { if( CubitUndo::get_undo_enabled() ) CubitUndo::remove_last_undo(); return 0; } }
CubitStatus PartitionTool::make_point_curves | ( | RefFace * | ref_face, |
DLIList< CubitVector > & | position, | ||
DLIList< RefVertex * > & | new_vertices | ||
) |
Definition at line 1039 of file PartitionTool.cpp.
{ int i, j; DLIList<TopologyBridge*> bridge_list; DLIList<Surface*> surface_list; DLIList<TBPoint*> new_points; CubitStatus rval = CUBIT_SUCCESS; // Get list of surfaces from RefFace face_ptr->bridge_manager()->get_bridge_list( bridge_list ); CAST_LIST(bridge_list, surface_list, Surface); assert(bridge_list.size() == surface_list.size()); surface_list.reset(); if( CubitUndo::get_undo_enabled() ) { DLIList<RefFace*> tmp_faces(1); tmp_faces.append( face_ptr ); CubitUndo::save_state_with_cubit_file( tmp_faces ); } // For each position in the list positions.reset(); for (i = positions.size(); i--; ) { CubitVector pos = positions.get_and_step(); RefVertex* result_vtx = 0; RefEdge* point_curve = 0; CubitSense bridge_sense = CUBIT_UNKNOWN; // Create point-curve on each surface surface_list.last(); for (j = surface_list.size(); j--; ) { Surface *new_surf, *old_surf = surface_list.step_and_get(); TBPoint* new_pt = PartitionEngine::instance(). insert_point_curve( old_surf, pos, new_surf ); if (!new_pt) { PRINT_ERROR("Error imprint surface at position (%f,%f,%f)\n", pos.x(), pos.y(), pos.z()); rval = CUBIT_FAILURE; continue; } // If surface was replaced with a virtual surface, update // the list new_points.append(new_pt); surface_list.change_to(new_surf); // Merge each result point into a single RefVertex if (!result_vtx) result_vtx = GeometryQueryTool::instance()->make_RefVertex(new_pt); else if (!new_pt->owner()) result_vtx->bridge_manager()->add_bridge(new_pt); // Merge each result point-curve into a single RefEdge. // If the result was not a point-curve (input position was // on some existing point or curve), just let the merge // code clean up, merging/unmerging depending on tolerance. bridge_list.clean_out(); new_pt->get_parents(bridge_list); if (bridge_list.size() != 1) continue; Curve* curve = dynamic_cast<Curve*>(bridge_list.get()); if (curve->geometry_type() != POINT_CURVE_TYPE) continue; if (!point_curve) { bridge_sense = new_surf->bridge_sense(); if (curve->bridge_sense() != bridge_sense) curve->reverse_bridge_sense(); RefEdge::suppress_edge_length_warning(true); point_curve = GeometryQueryTool::instance()->make_RefEdge(curve); RefEdge::suppress_edge_length_warning(false); } else if(!curve->owner()) { point_curve->bridge_manager()->add_bridge(curve); CubitSense merge_sense = new_surf->bridge_sense() == bridge_sense ? CUBIT_FORWARD : CUBIT_REVERSED ; if (curve->bridge_sense() != merge_sense) curve->reverse_bridge_sense(); } } } // Update DAG topoloy for TB changes DLIList<RefFace*> result_faces; surface_list.reset(); for (i = surface_list.size(); i--; ) { RefFace* face = GeometryQueryTool::instance() ->make_RefFace(surface_list.get_and_step()); result_faces.append_unique(face); } // Attempt to re-merge anything that was unmerged // during DAG update if( result_faces.size() > 1 ) { MergeTool::instance()->merge_reffaces( result_faces ); } // Get list of RefVertices that were actually created after // all the merging, unmerging, re-merging, etc. new_points.reset(); for (i = new_points.size(); i--; ) new_vertices.append( dynamic_cast<RefVertex*>(new_points.get_and_step()->topology_entity())); if (new_vertices.size() > 1) new_vertices.uniquify_ordered(); if( CubitUndo::get_undo_enabled() && new_points.size() == 0 ) CubitUndo::remove_last_undo(); return rval; }
void PartitionTool::notify_partition | ( | DLIList< RefEntity * > & | partitioning_entities, |
BasicTopologyEntity * | first_partitioned_entity, | ||
BasicTopologyEntity * | second_partitioned_entity, | ||
BasicTopologyEntity * | old_entity | ||
) | [private] |
Definition at line 2032 of file PartitionTool.cpp.
{ int i; // are the first and second entities unique? int first_unique = first_partitioned_entity != old_entity && first_partitioned_entity != NULL; int second_unique = second_partitioned_entity != first_partitioned_entity && second_partitioned_entity != old_entity && second_partitioned_entity != NULL; // add unique entities to graphics // attach names to entities. if ( first_unique ) { RefEntityName::instance() ->copy_refentity_names( old_entity, first_partitioned_entity ); } if ( second_unique ) { RefEntityName::instance() ->copy_refentity_names( old_entity, second_partitioned_entity ); } // notify observers of this AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::GEOMETRY_TOPOLOGY_MODIFIED, old_entity)); // notify containing entities BasicTopologyEntity* entity_ptr = old_entity; if( first_unique ) entity_ptr = first_partitioned_entity; else if( second_unique ) entity_ptr = second_partitioned_entity; DLIList<RefFace*> face_list; RefFace *ref_face; DLIList<RefVolume*> vol_list; RefVolume *ref_volume; DLIList<Body*> body_list; Body *body; DLIList<RefEdge*> ref_edges; DLIList<RefVertex*> ref_verts; int has_parents = CUBIT_TRUE; int dim = entity_ptr->dimension(); switch ( dim ) { case 0: // ? // no break case 1: // does old_entity still have pointers to the ref_faces? entity_ptr->ref_faces( face_list ); if ( face_list.size() == 0 && dim == 1 ) has_parents = CUBIT_FALSE; for( i = face_list.size(); i > 0; i-- ) { ref_face = face_list.get_and_step(); AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOPOLOGY_MODIFIED, ref_face)); } if( first_partitioned_entity ) first_partitioned_entity->ref_vertices( ref_verts ); if( second_partitioned_entity ) second_partitioned_entity->ref_vertices( ref_verts ); for( i=0; i<ref_verts.size(); i++ ) AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::VIRTUAL_STATUS_CHANGED, ref_verts[i])); // no break case 2: entity_ptr->ref_volumes( vol_list ); if ( vol_list.size() == 0 && dim == 2 ) has_parents = CUBIT_FALSE; for( i = vol_list.size(); i > 0; i-- ) { ref_volume = vol_list.get_and_step(); AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOPOLOGY_MODIFIED, ref_volume)); } if( first_partitioned_entity ) { first_partitioned_entity->ref_vertices( ref_verts ); first_partitioned_entity->ref_edges( ref_edges ); } if( second_partitioned_entity ) { second_partitioned_entity->ref_vertices( ref_verts ); second_partitioned_entity->ref_edges( ref_edges ); } for( i=0; i<ref_verts.size(); i++ ) AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::VIRTUAL_STATUS_CHANGED, ref_verts[i])); for( i=0; i<ref_edges.size(); i++ ) AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::VIRTUAL_STATUS_CHANGED, ref_edges[i])); // no break case 3: entity_ptr->bodies( body_list ); if ( body_list.size() == 0 && dim == 3 ) has_parents = CUBIT_FALSE; for( i = body_list.size(); i > 0; i-- ) { body = body_list.get_and_step(); AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOPOLOGY_MODIFIED, body)); } break; default: break; } if( !has_parents ) { // TODO -- should call GMT::make_free_RefEdge where appropriate or // GQE could be changed to recoginize it is making a free RefEdge. // When that is done, we no longer need these calls to the static observers. if( second_unique ) { AppUtil::instance()->send_event( GeometryEvent(GeometryEvent::FREE_REF_ENTITY_GENERATED, second_partitioned_entity)); } if( first_unique ) { AppUtil::instance()->send_event( GeometryEvent(GeometryEvent::FREE_REF_ENTITY_GENERATED, first_partitioned_entity)); } } }
RefVertex * PartitionTool::partition | ( | RefEdge * | edge_ptr, |
const CubitVector & | split_point, | ||
RefEdge *& | first_new_edge, | ||
RefEdge *& | second_new_edge, | ||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) | [virtual] |
Definition at line 133 of file PartitionTool.cpp.
{ int i, j; first_new_edge = second_new_edge = NULL; CubitBoolean is_free_curve = edge_ptr->num_parent_ref_entities() == 0 ? CUBIT_TRUE : CUBIT_FALSE; DLIList<RefFace*> faces; edge_ptr->ref_faces( faces ); RefVertex* input_start_vtx = edge_ptr->start_vertex(); RefVertex* input_end_vtx = edge_ptr->end_vertex(); // partition each merged curve in the refedge DLIList<TopologyBridge*> bridge_list, curve_bridges, coedge_bridges, point_bridges; edge_ptr->bridge_manager()->get_bridge_list( bridge_list ); RefVertex* new_vertex = 0; for( i = bridge_list.size(); i--; ) { Curve* curve_ptr = dynamic_cast<Curve*>(bridge_list.get_and_step()); double u = curve_ptr->u_from_position( split_point ); TBPoint* pt = PartitionEngine::instance().insert_point( curve_ptr, u ); if( !pt ) { // try to back out any partitions we've already made. bridge_list.clean_out(); if( new_vertex ) { new_vertex->bridge_manager()->get_bridge_list(bridge_list); new_vertex->deactivated(CUBIT_TRUE); } while( bridge_list.size() ) PartitionEngine::instance().remove_point( dynamic_cast<PartitionPoint*>(bridge_list.pop()) ); break; } if( new_vertex ) new_vertex->bridge_manager()->add_bridge( pt ); else new_vertex = GeometryQueryTool::instance()->make_RefVertex(pt); } if (!new_vertex) // failed -- no curves split return 0; // Get two "new" RefEdges to work with RefEdge* new_edges[2]; // two refedges split from input refedge RefVertex* vertices[2]; // the to-be other RefVertex on each edge (not new_vtx) bool start_vtx[2]; // for the first curve, is new_vtx the start of that curve CubitSense senses[2]; // bridge sense for first curve in each refedge // For each of two curves adjacent to the first split point TBPoint* point = new_vertex->get_point_ptr(); point->get_parents(curve_bridges); assert(curve_bridges.size() == 2); curve_bridges.reset(); for (i = 0; i < 2; i++) { Curve* curve = dynamic_cast<Curve*>(curve_bridges.get_and_step()); new_edges[i] = dynamic_cast<RefEdge*>(curve->topology_entity()); // need to create new RefEdge if (!new_edges[i]) { if (curve->bridge_sense() == CUBIT_REVERSED) curve->reverse_bridge_sense(); // clear bridge sense if(is_free_curve) new_edges[i] = GeometryQueryTool::instance()->make_free_RefEdge(curve); else new_edges[i] = GeometryQueryTool::instance()->make_RefEdge(curve); } // get other vertex on refedge, save to use in determining // which curve pairs should merge. bridge_list.clean_out(); curve->get_children(bridge_list); bridge_list.move_to(point); bridge_list.reset(); if (bridge_list.get() == point) start_vtx[i] = true; else if(bridge_list.step_and_get() == point) start_vtx[i] = false; else assert(0); // populate arrays with necessary info to determine relative // sense of other curves to be merged with this one. vertices[i] = dynamic_cast<RefVertex*>(bridge_list.next()->topology_entity()); senses[i] = curve->bridge_sense(); } // Merge remaining curve pairs into the two refedges point_bridges.clean_out(); new_vertex->bridge_manager()->get_bridge_list(point_bridges); point_bridges.move_to(point); assert(point_bridges.get() == point); for (i = point_bridges.size() - 1; i--; ) // for each pair of curves { TopologyBridge* point_bridge = point_bridges.step_and_get(); curve_bridges.clean_out(); point_bridge->get_parents(curve_bridges); assert(curve_bridges.size() == 2); while (curve_bridges.size()) // for each curve in the pair { Curve* curve = dynamic_cast<Curve*>(curve_bridges.pop()); bridge_list.clean_out(); curve->get_children(bridge_list); bridge_list.reset(); bool is_start = false; if (bridge_list.get() == point_bridge) is_start = true; else if(bridge_list.step_and_get() == point_bridge) is_start = false; else assert(0); // bad bridge connectivity RefVertex* vtx = dynamic_cast<RefVertex*>(bridge_list.next()->topology_entity()); for (j = 0; j < 2 && vertices[j] != vtx; j++); if (j == 2) continue; // can't merge -- something went wrong if (vertices[0] == vertices[1]) // closed curve, need to do geometric check { CubitVector center = curve->center_point(); double d1 = (center - new_edges[0]->center_point()).length_squared(); double d2 = (center - new_edges[1]->center_point()).length_squared(); j = d1 < d2 ? 0 : 1; } RefEdge* edge = new_edges[j]; if (curve->topology_entity() != edge) // if not already merged ... { if (curve->bridge_manager()) // if in a different edge, unmerge curve->bridge_manager()->remove_bridge(curve); curve->get_parents(coedge_bridges); // need to unmerge coedges too while (coedge_bridges.size()) { TopologyBridge* coe_bridge = coedge_bridges.pop(); if (coe_bridge->owner()) coe_bridge->bridge_manager()->remove_bridge(coe_bridge); } edge->bridge_manager()->add_bridge(curve); // merge } // set relative sense bool edge_reversed = (is_start != start_vtx[j]); bool curv_reversed = curve->bridge_sense() != senses[j]; if (edge_reversed != curv_reversed) curve->reverse_bridge_sense(); } } // Rebuild TopologyEntity topology for( i = faces.size(); i--; ) { RefFace* face = faces.get_and_step(); bridge_list.clean_out(); face->bridge_manager()->get_bridge_list(bridge_list); assert(bridge_list.size()); for (int j = bridge_list.size(); j--; ) { TopologyBridge* bridge = bridge_list.get_and_step(); Surface* surf = dynamic_cast<Surface*>(bridge); assert(!!surf); GeometryQueryTool::instance()->make_RefFace(surf); } } // tweak some stuff so the resulting RefEdges have the same // sense as the input RefEdge. // Get the edges in the order we want. // If curve was not closed, put whichever contains the original start vertex first. if (input_start_vtx != input_end_vtx) i = new_edges[0]->other_vertex(input_start_vtx) ? 0 : 1; //If closed, sense of original edge didn't change so use that to determine the order else if (new_edges[0] == edge_ptr) i = new_edges[0]->start_vertex() == input_start_vtx ? 0 : 1; else i = new_edges[1]->start_vertex() == input_start_vtx ? 1 : 0; first_new_edge = new_edges[i]; second_new_edge = new_edges[1-i]; DLIList<RefEntity*> vtx_list; vtx_list.append(new_vertex); notify_partition( vtx_list, first_new_edge, second_new_edge, edge_ptr ); // Adjust sense of new RefEdge // The sense of the input edge should not have changed, so don't mess with // it. Flip the new edge if it doesn't end with the correct vertex. if (first_new_edge != edge_ptr && first_new_edge->start_vertex() != input_start_vtx) { first_new_edge->reverse_tangent(); } if (second_new_edge != edge_ptr && second_new_edge->end_vertex() != input_end_vtx) { second_new_edge->reverse_tangent(); } PRINT_DEBUG_76("First new curve is %d, second new curve is %d.\n", first_new_edge ? first_new_edge->id() : 0, second_new_edge ? second_new_edge->id() : 0 ); return new_vertex; }
RefVertex * PartitionTool::partition | ( | RefEdge * | edge_ptr, |
const CubitVector & | split_point, | ||
DLIList< RefEdge * > & | result_edges, | ||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) | [virtual] |
Definition at line 348 of file PartitionTool.cpp.
CubitStatus PartitionTool::partition | ( | RefFace * | face_ptr, |
RefEdge * | edge_ptr, | ||
RefFace *& | new_face1, | ||
RefFace *& | new_face2, | ||
CubitBoolean | |||
) | [virtual] |
Definition at line 371 of file PartitionTool.cpp.
{ PRINT_DEBUG_86( "PT: PartitionTool::partition( RefFace %d, RefEdge %d )\n", face_ptr->id(), edge_ptr->id() ); new_face1 = new_face2 = 0; DLIList<CubitVector*> segments; DLIList<RefEdge*> new_edges; GMem edge_facets; Curve* curve = edge_ptr->get_curve_ptr(); if( ! curve->get_geometry_query_engine()->get_graphics( curve, &edge_facets, facetingTolerance ) ) { return CUBIT_FAILURE; } int j; //Use the exact end points to avoid precision problems with faceting. CubitVector start_coord = edge_ptr->start_vertex()->coordinates(); CubitVector end_coord = edge_ptr->end_vertex()->coordinates(); segments.append( new CubitVector ( start_coord ) ); for( j = 1; j < (edge_facets.pointListCount-1); j++ ) { segments.append( new CubitVector( edge_facets.point_list()[j].x, edge_facets.point_list()[j].y, edge_facets.point_list()[j].z ) ); } segments.append( new CubitVector ( end_coord ) ); new_face2 = insert_edge( face_ptr, segments, CUBIT_TRUE, new_edges ); new_face1 = face_ptr; while( segments.size() ) delete segments.pop(); return new_face2 ? CUBIT_SUCCESS : CUBIT_FAILURE; }
CubitStatus PartitionTool::partition | ( | RefFace * | face_ptr, |
DLIList< RefEdge * > & | split_edges, | ||
RefFace *& | first_new_face, | ||
RefFace *& | second_new_face, | ||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) | [virtual] |
Definition at line 1664 of file PartitionTool.cpp.
{ DLIList<RefFace*> result_faces; CubitStatus result = partition( face, edges, result_faces, im ); result_faces.reset(); new1 = result_faces.get_and_step(); new2 = result_faces.get_and_step(); return result; }
CubitStatus PartitionTool::partition | ( | RefVolume * | vol_ptr, |
DLIList< RefFace * > & | split_faces, | ||
RefVolume *& | first_new_volume, | ||
RefVolume *& | second_new_volume, | ||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) | [virtual] |
Definition at line 1689 of file PartitionTool.cpp.
{ int i; Lump* lump = volume_ptr->get_lump_ptr(); DLIList<Surface*> surface_list; for( i = split_faces.size(); i--; ) surface_list.append(split_faces.step_and_get()->get_surface_ptr()); DLIList<Lump*> result_list; for( i = surface_list.size(); result_list.size() < 2 && i--; ) { Lump* result = PartitionEngine::instance(). insert_surface( surface_list.step_and_get(), lump ); if(!result) { RefFace* face = dynamic_cast<RefFace*>(surface_list.get()->topology_entity()); PRINT_ERROR("Insertion of surface %d into volume %d failed.\n", face ? face->id() : 0, volume_ptr->id() ); continue; } lump = result; result_list.append_unique(lump); } DLIList<Body*> body_list; volume_ptr->bodies(body_list); assert(body_list.size() == 1); Body* body_ptr = body_list.get(); BodySM* bodysm = body_ptr->get_body_sm_ptr(); GeometryQueryTool::instance()->make_Body(bodysm); result_list.reset(); if( ! result_list.size() ) return CUBIT_FAILURE; first_new_volume = volume_ptr; second_new_volume = dynamic_cast<RefVolume*>(result_list.get()->topology_entity()); return CUBIT_SUCCESS; }
CubitStatus PartitionTool::partition | ( | RefVolume * | vol_ptr, |
DLIList< CubitFacet * > & | split_faces, | ||
RefVolume *& | first_new_volume, | ||
RefVolume *& | second_new_volume, | ||
DLIList< RefFace * > & | new_surfaces, | ||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) | [virtual] |
Definition at line 1736 of file PartitionTool.cpp.
{ Lump* lump = volume_ptr->get_lump_ptr(); Surface* result = PartitionEngine::instance(). insert_surface( split_faces, lump ); DLIList<Body*> body_list; volume_ptr->bodies(body_list); assert(body_list.size() == 1); Body* body_ptr = body_list.get(); BodySM* bodysm = body_ptr->get_body_sm_ptr(); GeometryQueryTool::instance()->make_Body(bodysm); if( ! result ) { PRINT_ERROR("Failed to insert faceted surface into volume %d\n", volume_ptr->id()); return CUBIT_FAILURE; } RefFace* result_face = dynamic_cast<RefFace*>(result->topology_entity()); assert(!!result_face); new_surfaces.append(result_face); DLIList<RefVolume*> face_vols; result_face->ref_volumes(face_vols); face_vols.reset(); first_new_volume = face_vols.get(); second_new_volume = face_vols.next(); if ( DEBUG_FLAG(88) ) { GfxDebug::display_all(); if( PartitionSurface* ps = dynamic_cast<PartitionSurface*>(result) ) ps->draw_facets(CUBIT_GREEN_INDEX); DLIList<RefEdge*> edges; DLIList<RefFace*> faces; result_face->ref_edges(edges); for ( int i = edges.size(); i--; ) { faces.clean_out(); RefEdge* edge = edges.get_and_step(); edge->ref_faces(faces); if ( faces.size() > 1 ) GfxDebug::highlight_ref_edge( edge ); } GfxDebug::flush(); } return CUBIT_SUCCESS; }
CubitStatus PartitionTool::partition | ( | RefEdge * | edge_ptr, |
DLIList< CubitVector * > & | split_points, | ||
DLIList< RefEdge * > & | new_edges, | ||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) |
Definition at line 1219 of file PartitionTool.cpp.
{ DLIList<RefVertex*> new_vertices; return partition( edge_ptr, split_points, new_vertices, new_edges, ignore_mesh ); }
CubitStatus PartitionTool::partition | ( | RefEdge * | edge_ptr, |
DLIList< CubitVector * > & | split_points, | ||
DLIList< RefVertex * > & | new_vertices, | ||
DLIList< RefEdge * > & | new_edges, | ||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) |
Definition at line 1228 of file PartitionTool.cpp.
{ if( split_points.size() < 1 ) return CUBIT_FAILURE; CubitStatus result = CUBIT_SUCCESS; RefVertex* new_vtx = 0; if( split_points.size() == 1 ) { RefEdge *edge1_ptr = 0, *edge2_ptr = 0; new_vtx = partition( edge_ptr, *(split_points.get()), edge1_ptr, edge2_ptr, ignore_mesh ); if( !new_vtx ) return CUBIT_FAILURE; new_vertices.append(new_vtx); if( edge1_ptr ) new_edges.append( edge1_ptr ); if( edge2_ptr ) new_edges.append( edge2_ptr ); return CUBIT_SUCCESS; } int i, j, count = split_points.size(); CubitVector** vtx_array = new CubitVector*[count]; double* param_array = new double[count]; for( i = 0; i < count; i++ ) { vtx_array[i] = split_points.get_and_step(); param_array[i] = edge_ptr->u_from_position( *(vtx_array[i]) ); } for( i = 0; i < count - 1; i++ ) { int index = i; for( j = i + 1; j < count; j++ ) if( param_array[j] < param_array[index] ) index = j; double temp_dbl = param_array[i]; CubitVector* temp_vtx = vtx_array[i]; param_array[i] = param_array[index]; vtx_array[i] = vtx_array[index]; param_array[index] = temp_dbl; vtx_array[index] = temp_vtx; } delete [] param_array; RefVertex* end_vtx = edge_ptr->end_vertex(); for( i = 0; i < count; i++ ) { RefEdge *first_new_edge, *secnd_new_edge; new_vtx = partition( edge_ptr, *(vtx_array[i]), first_new_edge, secnd_new_edge, ignore_mesh ); if( ! new_vtx ) { result = CUBIT_FAILURE; continue; } new_vertices.append(new_vtx); if( ! secnd_new_edge ) secnd_new_edge = edge_ptr; if( NULL == secnd_new_edge->other_vertex(end_vtx) ) { edge_ptr = first_new_edge; new_edges.append( secnd_new_edge ); } else { edge_ptr = secnd_new_edge; new_edges.append( first_new_edge ); } } new_edges.append( edge_ptr ); delete [] vtx_array; return result; }
CubitStatus PartitionTool::partition | ( | RefFace * | face_ptr, |
const DLIList< RefEdge * > & | split_edges, | ||
DLIList< RefFace * > & | result_faces, | ||
CubitBoolean | do_split_curves = CUBIT_FALSE , |
||
DLIList< RefEdge * > * | new_edges = NULL , |
||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) |
Definition at line 1639 of file PartitionTool.cpp.
{ int i; CubitStatus status = CUBIT_SUCCESS; // get the curves out of the edge list DLIList<Curve*> split_curves; for (i = 0; i < split_edges.size(); i++ ) { RefEdge* edge = split_edges.next(i); split_curves.append( edge->get_curve_ptr() ); } // partition based on the Curves status = partition_face_by_curves( face_to_split, split_curves, result_set, do_split_curves, new_edges ); return status; }
CubitStatus PartitionTool::partition_face_by_curves | ( | RefFace * | face_ptr, |
const DLIList< Curve * > & | split_curves, | ||
DLIList< RefFace * > & | result_faces, | ||
CubitBoolean | do_split_curves = CUBIT_FALSE , |
||
DLIList< RefEdge * > * | new_edges = NULL , |
||
CubitBoolean | ignore_mesh = CUBIT_FALSE |
||
) |
Definition at line 1475 of file PartitionTool.cpp.
{ int i, j, numpts; CubitStatus status = CUBIT_SUCCESS; bool some_success = false; DLIList<RefEdge*> new_edge_list; DLIList<RefFace*> faces[2]; DLIList<CubitVector*> segments; GMem gmem; if( CubitUndo::get_undo_enabled() ) { DLIList<RefFace*> tmp_ref_face_list(1); tmp_ref_face_list.append( face_to_split ); CubitUndo::save_state_with_cubit_file( tmp_ref_face_list ); } faces[0].append( face_to_split ); for (i = 0; i < split_curves.size(); i++ ) { Curve* curve = split_curves.next(i); GeometryQueryEngine* engine = curve->get_geometry_query_engine(); if (!engine->get_graphics( curve, &gmem, facetingTolerance )) { status = CUBIT_FAILURE; continue; } numpts = gmem.pointListCount; /* This code causes a failure in virtual imprint because it compares against the number of graphics curve facets. I think this is wrong but for now I will comment out this code. In the end, I think that partitioning should not be done on the faceted model. If this hasn't been addressed in 6 months just kill this code. KGM 1/5/06 // arbitrary # of subdivisions = 20 --KGM const double NUM_SEGS = 20.0; // if the graphics facets give too many points // (which happens if the model is large right now) // trim it to some more reasonable number if ( numpts > static_cast<int>(NUM_SEGS) ) { // this independent of the curve sense double t0 = curve->start_param(); double t1 = curve->end_param(); double inc = (t1 - t0)/NUM_SEGS; double t; CubitVector* p1; for (t = t0; t < t1; t+= inc) { p1 = new CubitVector; CubitStatus status = curve->position_from_u( t, *p1 ); if (status == CUBIT_SUCCESS) segments.append( p1 ); } // make sure the end point is EXACTLY represented p1 = new CubitVector; CubitStatus status = curve->position_from_u( t1, *p1 ); if (status == CUBIT_SUCCESS) { segments.append( p1 ); } else { PRINT_ERROR("Bad end point evaluation on curve\n"); } bool tmp_debug = false; if ( tmp_debug ) // KGM { for ( int i = 0; i < segments.size(); i++ ) { CubitVector* point = segments.get_and_step(); GfxDebug::draw_point( *point, CUBIT_RED_INDEX ); } GfxDebug::flush(); } } else */ { if (curve->bridge_sense() == CUBIT_REVERSED) { CubitVector* p1 = new CubitVector; curve->position_from_u( curve->end_param(), *p1 ); segments.append( p1 ); } else { CubitVector* p1 = new CubitVector; curve->position_from_u( curve->start_param(), *p1 ); segments.append( p1 ); } --numpts; for (j = 1; j < numpts; j++) { const GPoint& p = gmem.point_list()[j]; segments.append( new CubitVector( p.x, p.y, p.z ) ); } if (curve->bridge_sense() == CUBIT_REVERSED) { CubitVector* p1 = new CubitVector; curve->position_from_u( curve->start_param(), *p1 ); segments.append( p1 ); } else { CubitVector* p1 = new CubitVector; curve->position_from_u( curve->end_param(), *p1 ); segments.append( p1 ); } } int index = i % 2; status = insert_edge( faces[index], segments, faces[1-index], new_edge_list, do_split_curves ); if (status) { some_success = true; if (new_edges) *new_edges += new_edge_list; } else { faces[1-index] = faces[index]; } while (segments.size()) delete segments.pop(); } result_set = faces[split_curves.size()%2]; //surface might not have gotton split if( CubitUndo::get_undo_enabled() && result_set.size() == 1) CubitUndo::remove_last_undo(); if( some_success ) return CUBIT_SUCCESS; else return CUBIT_FAILURE; }
RefEdge* PartitionTool::unpartition | ( | RefEdge * | first_partition_edge, |
RefEdge * | second_partition_edge | ||
) |
RefFace* PartitionTool::unpartition | ( | RefFace * | first_partition_face, |
RefFace * | second_partition_face | ||
) |
RefVolume* PartitionTool::unpartition | ( | RefVolume * | first_partition_volume, |
RefVolume * | second_partition_volume | ||
) |
RefVolume* PartitionTool::unpartition | ( | DLIList< RefVolume * > & | partition_volumes | ) |
CubitStatus PartitionTool::unpartitionAll | ( | DLIList< RefEdge * > & | partition_edges, |
DLIList< RefEdge * > & | restored_edges | ||
) | [virtual] |
Definition at line 1318 of file PartitionTool.cpp.
{ int i; DLIList<RefVertex*> vertex_list, tmp_list; for ( i = partition_edges.size(); i--; ) { tmp_list.clean_out(); partition_edges.step_and_get()->ref_vertices( tmp_list ); vertex_list += tmp_list; } for ( i = vertex_list.size(); i--; ) vertex_list.step_and_get()->marked(0); for ( i = vertex_list.size(); i--; ) { RefVertex* vtx = vertex_list.step_and_get(); vtx->marked( vtx->marked() + 1 ); } for ( i = vertex_list.size(); i--; ) { RefVertex* vtx = vertex_list.step_and_get(); TBPoint* pt = vtx->get_point_ptr(); CompositePoint* comp = dynamic_cast<CompositePoint*>(pt); if ( comp ) pt = comp->get_point(); PartitionPoint* part = dynamic_cast<PartitionPoint*>(pt); if( vtx->marked() != 2 || !can_remove(vtx) || !part || part->real_point() ) vertex_list.change_to(0); vtx->marked(0); } vertex_list.remove_all_with_value(0); if (vertex_list.size() == 0) return CUBIT_SUCCESS; RefEdge* edge; std::vector< TDUPtr<RefEdge> > result_list; for ( i = vertex_list.size(); i--; ) { edge = CompositeTool::instance() ->remove_vertex( vertex_list.get_and_step(), true ); if ( edge ) { result_list.push_back( edge ); } } unsigned int j; for ( j = 0; j < result_list.size(); j++ ) if( result_list[j] ) restored_edges.append_unique( result_list[j].ptr() ); return restored_edges.size() ? CUBIT_SUCCESS : CUBIT_FAILURE; }
CubitStatus PartitionTool::unpartitionAll | ( | DLIList< RefFace * > & | partition_faces, |
DLIList< RefFace * > & | restored_faces | ||
) | [virtual] |
Definition at line 1387 of file PartitionTool.cpp.
{ DLIList<TopologyEntity*> query_input, query_output; CAST_LIST_TO_PARENT( partition_faces, query_input ); ModelQueryEngine::instance()->query_model( query_input, DagType::co_edge_type(), query_output ); DLIList<CoEdge*> coedge_list; DLIList<RefEdge*> refedge_list; CAST_LIST( query_output, coedge_list, CoEdge ); assert( query_output.size() == coedge_list.size() ); int i; for ( i = coedge_list.size(); i--; ) refedge_list.append( coedge_list.step_and_get()->get_ref_edge_ptr() ); for ( i = refedge_list.size(); i--; ) refedge_list.step_and_get()->marked(0); for ( i = refedge_list.size(); i--; ) { RefEdge* edge = refedge_list.step_and_get(); edge->marked( edge->marked() + 1 ); } for ( i = refedge_list.size(); i--; ) { RefEdge* edge = refedge_list.step_and_get(); PartPTCurve* point_curve = dynamic_cast<PartPTCurve*>(edge->get_curve_ptr()); SegmentedCurve* seg_curve = dynamic_cast<SegmentedCurve*>(edge->get_curve_ptr()); if((point_curve || (seg_curve && edge->marked() == 2)) && can_remove(edge)) { // Try to remove this partition. } else { // Don't try to remove this partition. refedge_list.change_to(0); } edge->marked(0); } refedge_list.remove_all_with_value(0); if (refedge_list.size() == 0) return CUBIT_SUCCESS; RefFace* face; std::vector< TDUPtr<RefFace> > result_list; DLIList<TopologyBridge*> bridge_list; for ( i = refedge_list.size(); i--; ) { bool is_partition = false; RefEdge* edge = refedge_list.get_and_step(); edge->bridge_manager()->get_bridge_list( bridge_list ); while ( bridge_list.size() ) { TopologyBridge* bridge = bridge_list.pop(); if ( dynamic_cast<PartitionEntity*>(bridge) ) { is_partition = true; break; } CompositeCurve* comp = dynamic_cast<CompositeCurve*>(bridge); if ( comp ) { for ( int j = 0; j < comp->num_curves(); j++ ) bridge_list.append(comp->get_curve(j)); } } if ( !is_partition ) continue; face = CompositeTool::instance()->remove_edge( edge, true ); if ( face ) { result_list.push_back( face ); } } unsigned int j; for ( j = 0; j < result_list.size(); j++ ) if( result_list[j] ) restored_faces.append_unique( result_list[j].ptr() ); return restored_faces.size() ? CUBIT_SUCCESS : CUBIT_FAILURE; }
CubitStatus PartitionTool::unpartitionAll | ( | DLIList< RefVolume * > & | partition_vols, |
DLIList< RefVolume * > & | restored_vols | ||
) | [virtual] |
Definition at line 1815 of file PartitionTool.cpp.
{ int i; if (!passed_list.size()) return CUBIT_FAILURE; // Get owning body DLIList<Body*> body_list; Body* body_ptr = 0; for( i = passed_list.size(); i--; ) { RefVolume* vol_ptr = passed_list.step_and_get(); body_list.clean_out(); vol_ptr->bodies(body_list); assert(body_list.size() == 1); if( !body_ptr ) body_ptr = body_list.get(); else if( body_ptr != body_list.get() ) { PRINT_ERROR("Invalid volume list passed to PartitionTool::unpartition.\n" "All volumes must belong to the same body.\n"); return CUBIT_FAILURE; } } // Get lump list and real, partitioned lump DLIList<PartitionLump*> lump_list; TopologyBridge* real_lump = 0; for( i = passed_list.size(); i--; ) { Lump* lump = passed_list.step_and_get()->get_lump_ptr(); PartitionLump* partlump = dynamic_cast<PartitionLump*>(lump); if( !partlump ) { PRINT_ERROR("Invalid volume list passed to PartitionTool::unpartition.\n" "Volume %d is not a partition.\n", passed_list.get()->id()); return CUBIT_FAILURE; } if( !real_lump ) real_lump = partlump->partitioned_entity(); else if( real_lump != partlump->partitioned_entity() ) { PRINT_ERROR("Invalid volume list passed to PartitionTool::unpartition.\n" "All volumes must be partitions of the same real volume.\n"); return CUBIT_FAILURE; } lump_list.append(partlump); } // Find all faces volumes have in common DLIList<RefFace*> all_faces, vol_faces; passed_list.last(); for( i = passed_list.size(); i--; ) { vol_faces.clean_out(); passed_list.step_and_get()->ref_faces( vol_faces ); all_faces += vol_faces; } for( i = all_faces.size(); i--; ) all_faces.step_and_get()->marked(-1); for( i = all_faces.size(); i--; ) { RefFace* face = all_faces.step_and_get(); face->marked( face->marked() + 1 ); } for( i = all_faces.size(); i--; ) if( all_faces.step_and_get()->marked() ) all_faces.get()->marked(0); else all_faces.change_to(0); all_faces.remove_all_with_value(0); for( i = all_faces.size(); i--; ) if ( !can_remove( all_faces.step_and_get() ) ) all_faces.change_to(0); all_faces.remove_all_with_value(0); // Find all partition surfaces DLIList<PartitionSurface*> psurf_list; DLIList<TopologyBridge*> bridge_list; for( i = all_faces.size(); i--; ) { bridge_list.clean_out(); all_faces.step_and_get()->bridge_manager()->get_bridge_list(bridge_list); for( int j = bridge_list.size(); j--; ) { PartitionSurface* psurf = dynamic_cast<PartitionSurface*>(bridge_list.step_and_get()); if(psurf && psurf->partitioned_entity() == real_lump) { psurf_list.append(psurf); } } } // Remove partitioning surfaces for( i = psurf_list.size(); i--; ) { PartitionSurface* surf = psurf_list.step_and_get(); DLIList<Lump*> lumps; surf->lumps(lumps); assert(lumps.size() > 0 && lumps.size() <= 2); // should be one or two surfs RefVolume* volume1 = NULL; RefVolume* volume2 = NULL; lumps.reset(); if(lumps.size() == 2) { TopologyEntity *topo = lumps.get_and_step()->topology_entity(); volume1 = CAST_TO(topo, RefVolume); assert(volume1 != NULL); topo = lumps.get_and_step()->topology_entity(); volume2 = CAST_TO(topo, RefVolume); assert(volume2 != NULL); } //RefFace* face = dynamic_cast<RefFace*>(surf->owner()); Lump* lump = PartitionEngine::instance().remove_surface(surf); if( !lump ) { RefFace* face = dynamic_cast<RefFace*>(surf->topology_entity()); PRINT_ERROR("Failed to remove surface %d\n", face ? face->id() : 0); } else { RefVolume *survivor = dynamic_cast<RefVolume*>(lump->topology_entity()); RefVolume *dead = lumps.size() < 2 ? 0 : survivor == volume1 ? volume2 : volume1; CompositeTool::instance()->update_combined_vols( survivor, dead ); } } // Find a surviving volume to return for ( i = passed_list.size(); i--; ) { if( passed_list.step_and_get()->get_lump_ptr() ) { restored_list.append( passed_list.get() ); } } // update DAG and return BodySM* bodysm = body_ptr->get_body_sm_ptr(); GeometryQueryTool::instance()->make_Body(bodysm); GeometryQueryTool::instance()->cleanout_deactivated_geometry(); return CUBIT_SUCCESS;; }
int PartitionTool::facetingTolerance [private] |
Definition at line 305 of file PartitionTool.hpp.
PartitionTool * PartitionTool::instance_ = NULL [static, protected] |
Definition at line 266 of file PartitionTool.hpp.