cgma
|
#include <GeometryUtil.hpp>
Definition at line 40 of file GeometryUtil.hpp.
GeometryUtil::GeometryUtil | ( | ) | [protected] |
Definition at line 778 of file GeometryUtil.cpp.
{ default_angle_tol = CUBIT_PI / 20; default_midpoint_tol = CUBIT_DBL_MAX; surface_cpu_time = 0.0; other_cpu_time = 0.0; }
CubitStatus GeometryUtil::check_valid_chain | ( | DLIList< RefEdge * > & | ref_edge_list, |
DLIList< RefVertex * > & | problem_vertices | ||
) |
Definition at line 1504 of file GeometryUtil.cpp.
{ CubitStatus status = CUBIT_SUCCESS; DLIList<RefEdge*> connected_edges; RefEdge* ref_edge_ptr; RefVertex* vertex_start, *vertex_end; for( int i=0; i<ref_edge_list.size(); i++ ) { ref_edge_ptr = ref_edge_list.get_and_step(); connected_edges.clean_out(); vertex_start = ref_edge_ptr->start_vertex(); find_connected_ref_edges( vertex_start , ref_edge_list, connected_edges ); if( connected_edges.size() != 1 && connected_edges.size() != 2 ) { status = CUBIT_FAILURE; problem_vertices.append_unique( ref_edge_ptr->start_vertex() ); } connected_edges.clean_out(); vertex_end = ref_edge_ptr->end_vertex(); find_connected_ref_edges( vertex_end , ref_edge_list, connected_edges ); if( connected_edges.size() != 1 && connected_edges.size() != 2 ) { status = CUBIT_FAILURE; problem_vertices.append_unique( ref_edge_ptr->end_vertex() ); } } return status; }
CubitStatus GeometryUtil::check_valid_chain_by_coord | ( | DLIList< RefEdge * > & | ref_edge_list, |
DLIList< RefVertex * > & | problem_vertices | ||
) |
Definition at line 1216 of file GeometryUtil.cpp.
{ CubitStatus status = CUBIT_SUCCESS; DLIList<RefEdge*> connected_edges; RefEdge* ref_edge_ptr; CubitVector vector_start, vector_end; for( int i=0; i<ref_edge_list.size(); i++ ) { ref_edge_ptr = ref_edge_list.get_and_step(); connected_edges.clean_out(); vector_start = ref_edge_ptr->start_coordinates(); find_connected_ref_edges_by_coord( vector_start , ref_edge_list, connected_edges ); if( connected_edges.size() != 1 && connected_edges.size() != 2 ) { status = CUBIT_FAILURE; problem_vertices.append_unique( ref_edge_ptr->start_vertex() ); } connected_edges.clean_out(); vector_end = ref_edge_ptr->end_coordinates(); find_connected_ref_edges_by_coord( vector_end , ref_edge_list, connected_edges ); if( connected_edges.size() != 1 && connected_edges.size() != 2 ) { status = CUBIT_FAILURE; problem_vertices.append_unique( ref_edge_ptr->end_vertex() ); } } return status; }
CubitStatus GeometryUtil::check_valid_loop | ( | DLIList< RefEdge * > & | ref_edge_list, |
DLIList< RefVertex * > & | problem_vertices | ||
) |
Definition at line 1541 of file GeometryUtil.cpp.
{ CubitStatus status = CUBIT_SUCCESS; DLIList<RefEdge*> connected_edges; RefEdge* ref_edge_ptr; RefVertex* vertex_start; RefVertex* vertex_end; for( int i=0; i<ref_edge_list.size(); i++ ) { ref_edge_ptr = ref_edge_list.get_and_step(); connected_edges.clean_out(); vertex_start = ref_edge_ptr->start_vertex(); find_connected_ref_edges( vertex_start , ref_edge_list, connected_edges ); if( connected_edges.size() != 2 ) { status = CUBIT_FAILURE; problem_vertices.append_unique( ref_edge_ptr->start_vertex() ); } connected_edges.clean_out(); vertex_end = ref_edge_ptr->end_vertex(); find_connected_ref_edges( vertex_end , ref_edge_list, connected_edges ); if( connected_edges.size() != 2 ) { status = CUBIT_FAILURE; problem_vertices.append_unique( ref_edge_ptr->end_vertex() ); } } return status; }
CubitStatus GeometryUtil::check_valid_loop_by_coord | ( | DLIList< RefEdge * > & | ref_edge_list, |
DLIList< RefVertex * > & | problem_vertices | ||
) |
Definition at line 1253 of file GeometryUtil.cpp.
{ CubitStatus status = CUBIT_SUCCESS; DLIList<RefEdge*> connected_edges; RefEdge* ref_edge_ptr; CubitVector vector_start, vector_end; for( int i=0; i<ref_edge_list.size(); i++ ) { ref_edge_ptr = ref_edge_list.get_and_step(); connected_edges.clean_out(); vector_start = ref_edge_ptr->start_coordinates(); find_connected_ref_edges_by_coord( vector_start , ref_edge_list, connected_edges ); if( connected_edges.size() != 2 ) { status = CUBIT_FAILURE; problem_vertices.append_unique( ref_edge_ptr->start_vertex() ); } connected_edges.clean_out(); vector_end = ref_edge_ptr->end_coordinates(); find_connected_ref_edges_by_coord( vector_end , ref_edge_list, connected_edges ); if( connected_edges.size() != 2 ) { status = CUBIT_FAILURE; problem_vertices.append_unique( ref_edge_ptr->end_vertex() ); } } return status; }
CoEdge * GeometryUtil::closest_face_coedge | ( | RefFace * | face_ptr, |
const CubitVector & | from_pt, | ||
CoEdge *& | other_coedge, | ||
CubitVector * | closest_pt = NULL |
||
) |
Definition at line 499 of file GeometryUtil.cpp.
{ static CoEdgeDataList* coe_array = NULL; static int coe_array_size = 0; const double ressqr = GEOMETRY_RESABS * GEOMETRY_RESABS; DLIList<CoEdge*> coedge_list; coedge_list.clean_out(); int i; CubitVector closest_pt, current_pt; double current_dst, closest_dst; CoEdge* closest_coedge = 0; face_ptr->co_edges( coedge_list ); //Make sure we have enough space in the array int count = coedge_list.size(); if( coe_array_size < count ) { if( coe_array ) delete [] coe_array; coe_array = new CoEdgeDataList[count]; coe_array_size = count; } //remove from consideration any coedges for which the RefEdge occurs //more than once on the face. for( i = coedge_list.size(); i > 0; i-- ) coedge_list.get_and_step()->get_ref_edge_ptr()->marked( 0 ); for( i = coedge_list.size(); i > 0; i-- ) { RefEdge* edge_ptr = coedge_list.get_and_step()->get_ref_edge_ptr(); edge_ptr->marked( edge_ptr->marked() + 1 ); } //Start at one of the coedges we want to remove. coedge_list.reset(); for( i = coedge_list.size(); i > 0; i-- ) if( coedge_list.get()->get_ref_edge_ptr()->marked() > 1 ) break; else coedge_list.step(); //Populate the array with the coedges we want to keep. count = 0; int last_mark = 0; for( i = coedge_list.size(); i > 0; i-- ) { RefEdge* edge_ptr = coedge_list.get()->get_ref_edge_ptr(); if( edge_ptr->marked() == 1 ) { coe_array[count].coe_ptr = coedge_list.get(); coe_array[count].curve_ptr = edge_ptr->get_curve_ptr(); coe_array[count].box_dist_sqr = coe_array[count].curve_ptr->bounding_box().distance_squared(from_pt); coe_array[count].mark = 0; count++; } else if( count == 0 ) last_mark = 1; else coe_array[count-1].mark = 1; edge_ptr->marked(0); coedge_list.step(); } if( last_mark == 0 ) coe_array[count-1].mark = 1; //Find the first bounding box that the point is within int current_coe = -1; for( i = 0; (i < count) && (current_coe < 0); i++ ) if( coe_array[i].box_dist_sqr < ressqr ) current_coe = i; //If the point wasn't in any bounding box, choose the closest one closest_dst = CUBIT_DBL_MAX; if( current_coe < 0 ) for( i = 0; i < count; i++ ) if( coe_array[i].box_dist_sqr < closest_dst ) { closest_dst = coe_array[i].box_dist_sqr; current_coe = i; } //Start by assuming that the curve we found above is the closest closest_coedge = coe_array[current_coe].coe_ptr; coe_array[current_coe].curve_ptr->closest_point_trimmed( from_pt, closest_pt ); closest_dst = ( from_pt - closest_pt ).length_squared(); other_coedge = 0; int start = current_coe; current_coe = ( current_coe + 1 ) % count; //Now look for a closer curve while( start != current_coe ) { if( coe_array[current_coe].box_dist_sqr <= (closest_dst+GEOMETRY_RESABS) ) { coe_array[current_coe].curve_ptr ->closest_point_trimmed( from_pt, current_pt ); current_dst = ( from_pt - current_pt ).length_squared(); if( (closest_pt - current_pt).length_squared() < ressqr ) { if( current_dst < closest_dst ) { closest_dst = current_dst; closest_pt = current_pt; other_coedge = coe_array[current_coe].coe_ptr; } else { other_coedge = coe_array[current_coe].coe_ptr; } // other_index = current_coe; } else if( current_dst < closest_dst ) { closest_coedge = coe_array[current_coe].coe_ptr; closest_dst = current_dst; closest_pt = current_pt; other_coedge = 0; // closest_index = current_coe; // other_index = -1; } } current_coe = ( current_coe + 1 ) % count; } //make sure we have things in the correct order if( other_coedge ) { RefEdge* closest_edge = closest_coedge->get_ref_edge_ptr(); RefEdge* other_edge = other_coedge->get_ref_edge_ptr(); RefVertex* common = closest_edge->common_ref_vertex( other_edge ); if( ! common ) other_coedge = 0; else if( closest_coedge->get_sense() == CUBIT_FORWARD ) { if( closest_edge->start_vertex() == common ) { CoEdge* tmp = closest_coedge; closest_coedge = other_coedge; other_coedge = tmp; } } else if( closest_coedge->get_sense() == CUBIT_REVERSED ) { if( closest_edge->end_vertex() == common ) { CoEdge* tmp = closest_coedge; closest_coedge = other_coedge; other_coedge = tmp; } } } if( closest ) *closest = closest_pt; return closest_coedge; }
CoEdge * GeometryUtil::closest_loop_coedge | ( | Loop * | loop_ptr, |
const CubitVector & | from_pt, | ||
CoEdge *& | other_coedge, | ||
CubitVector * | closest_pt = NULL |
||
) |
Definition at line 303 of file GeometryUtil.cpp.
{ static CoEdgeDataList* coe_array = NULL; static int coe_array_size = 0; const double ressqr = CUBIT_RESABS * CUBIT_RESABS; DLIList<CoEdge*> coedge_list; coedge_list.clean_out(); int i; CubitVector closest_pt, current_pt; double current_dst, closest_dst; CoEdge* closest_coedge = 0; //We need the ordered coedges so that we can make sure that, when //we pass back other_coedge, it is the coedge following the returned //coedge in the loop, and not the other way around. loop_ptr->ordered_co_edges( coedge_list ); //Make sure we have enough space in the array int count = coedge_list.size(); if( coe_array_size < count ) { if( coe_array ) delete [] coe_array; coe_array = new CoEdgeDataList[count]; coe_array_size = count; } //remove from consideration any coedges for which the RefEdge occurs //more than once on the face. for( i = coedge_list.size(); i > 0; i-- ) coedge_list.get_and_step()->get_ref_edge_ptr()->marked( 0 ); for( i = coedge_list.size(); i > 0; i-- ) { RefEdge* edge_ptr = coedge_list.get_and_step()->get_ref_edge_ptr(); edge_ptr->marked( edge_ptr->marked() + 1 ); } //Start at one of the coedges we want to remove. coedge_list.reset(); for( i = coedge_list.size(); i > 0; i-- ) if( coedge_list.get()->get_ref_edge_ptr()->marked() > 1 ) break; else coedge_list.step(); //Populate the array with the coedges we want to keep. count = 0; int last_mark = 0; for( i = coedge_list.size(); i > 0; i-- ) { RefEdge* edge_ptr = coedge_list.get()->get_ref_edge_ptr(); if( edge_ptr->marked() == 1 ) { coe_array[count].coe_ptr = coedge_list.get(); coe_array[count].curve_ptr = edge_ptr->get_curve_ptr(); coe_array[count].box_dist_sqr = coe_array[count].curve_ptr->bounding_box().distance_squared(from_pt); coe_array[count].mark = 0; count++; } else if( count == 0 ) last_mark = 1; else coe_array[count-1].mark = 1; edge_ptr->marked(0); coedge_list.step(); } if( last_mark == 0 ) coe_array[count-1].mark = 1; //Do we have any coedges left? if( count == 0 ) return 0; //Find the first bounding box that the point is within int current_coe = -1; for( i = 0; (i < count) && (current_coe < 0); i++ ) if( coe_array[i].box_dist_sqr < CUBIT_RESABS ) current_coe = i; //If the point wasn't in any bounding box, choose the closest one closest_dst = CUBIT_DBL_MAX; if( current_coe < 0 ) for( i = 0; i < count; i++ ) if( coe_array[i].box_dist_sqr < closest_dst ) { closest_dst = coe_array[i].box_dist_sqr; current_coe = i; } //Start by assuming that the curve we found above is the closest closest_coedge = coe_array[current_coe].coe_ptr; coe_array[current_coe].curve_ptr->closest_point_trimmed( from_pt, closest_pt ); closest_dst = ( from_pt - closest_pt ).length_squared(); other_coedge = 0; int start = current_coe; int closest_index = start; int other_index = -1; current_coe = ( current_coe + 1 ) % count; //Now look for a closer curve while( start != current_coe ) { if( coe_array[current_coe].box_dist_sqr <= (closest_dst+GEOMETRY_RESABS) ) { coe_array[current_coe].curve_ptr ->closest_point_trimmed( from_pt, current_pt ); current_dst = ( from_pt - current_pt ).length_squared(); if( (closest_pt - current_pt).length_squared() < ressqr ) { if( current_dst < closest_dst ) { closest_dst = current_dst; closest_pt = current_pt; other_coedge = coe_array[current_coe].coe_ptr; } else { other_coedge = coe_array[current_coe].coe_ptr; } other_index = current_coe; } else if( current_dst < closest_dst ) { closest_coedge = coe_array[current_coe].coe_ptr; closest_dst = current_dst; closest_pt = current_pt; other_coedge = 0; closest_index = current_coe; other_index = -1; } } current_coe = ( current_coe + 1 ) % count; } //make sure we have things in the correct order if( other_coedge ) { RefVertex* common = closest_coedge->get_ref_edge_ptr()-> common_ref_vertex( other_coedge->get_ref_edge_ptr() ); if( ! common ) other_coedge = 0; } CubitBoolean swap = CUBIT_FALSE; if( other_coedge ) { if( ((closest_index + 1)%count) == other_index ) swap = CUBIT_FALSE; else if( ((other_index+1)%count) == closest_index ) swap = CUBIT_TRUE; else { //locate the start and end of the subsection of the loop int begin, end; if( closest_index < other_index ) { begin = closest_index; end = other_index; } else { begin = other_index; end = closest_index; } while( (begin > 0) && (coe_array[begin-1].mark != 1) ) begin--; while( (end < count) && (coe_array[end].mark != 1) ) end++; if( (closest_index == begin) && (other_index == end) ) swap = CUBIT_TRUE; else swap = CUBIT_FALSE; } } if( swap ) { CoEdge* tmp = other_coedge; other_coedge = closest_coedge; closest_coedge = tmp; } if( closest ) *closest = closest_pt; return closest_coedge; }
CubitStatus GeometryUtil::closest_point_trimmed | ( | RefFace * | face_ptr, |
const CubitVector & | from_pt, | ||
CubitVector & | result_pt, | ||
CubitPointContainment * | cont = 0 |
||
) |
CubitStatus GeometryUtil::closest_shell_coface | ( | Shell * | shell_ptr, |
const CubitVector & | from_pt, | ||
DLIList< CoFace * > & | result_set, | ||
CubitVector * | closest_pt = NULL |
||
) |
Definition at line 797 of file GeometryUtil.cpp.
{ static DLIList<CoFace*> coface_list, shell_cofaces; coface_list.clean_out(); shell_cofaces.clean_out(); result_set.clean_out(); int i; CubitVector closest_pt, current_pt; CoFace *current_cof; double current_dst, closest_dst; shell_ptr->co_faces( shell_cofaces ); //remove from consideration any cofaces for which the RefFace occurs //more than once on the Shell. for( i = shell_cofaces.size(); i > 0; i-- ) shell_cofaces.get_and_step()->get_ref_face_ptr()->marked( 0 ); for( i = shell_cofaces.size(); i > 0; i-- ) { RefFace* face_ptr = shell_cofaces.get_and_step()->get_ref_face_ptr(); face_ptr->marked( face_ptr->marked() + 1 ); } for( i = shell_cofaces.size(); i > 0; i-- ) { CoFace* cof_ptr = shell_cofaces.get_and_step(); if( cof_ptr->get_ref_face_ptr()->marked() == 1 ) coface_list.append( cof_ptr ); } for( i = shell_cofaces.size(); i > 0; i-- ) shell_cofaces.get_and_step()->get_ref_face_ptr()->marked( 0 ); if( !coface_list.size() ) return CUBIT_FAILURE; current_cof = coface_list.get_and_step(); current_cof->get_ref_face_ptr()-> find_closest_point_trimmed( from_pt, closest_pt ); closest_dst = ( from_pt - closest_pt ).length_squared(); result_set.append( current_cof ); for( i = coface_list.size(); i > 1; i-- ) { current_cof = coface_list.get_and_step(); current_cof->get_ref_face_ptr()-> find_closest_point_trimmed( from_pt, current_pt ); current_dst = ( from_pt - current_pt ).length_squared(); if( fabs( current_dst - closest_dst ) < CUBIT_RESABS ) { result_set.append( current_cof ); } else if( current_dst < closest_dst ) { result_set.clean_out(); result_set.append( current_cof ); closest_dst = current_dst; closest_pt = current_pt; } } if( closest != NULL ) *closest = closest_pt; return CUBIT_SUCCESS; }
static void GeometryUtil::delete_instance | ( | ) | [inline, static] |
Definition at line 52 of file GeometryUtil.hpp.
RefEdge * GeometryUtil::find_connected_ref_edge | ( | RefVertex * | ref_vertex_ptr, |
DLIList< RefEdge * > & | ref_edge_list, | ||
int & | start_flg | ||
) |
Definition at line 1291 of file GeometryUtil.cpp.
{ RefEdge* ref_edge; DLIList<RefEdge*> tmp_list = ref_edge_list; tmp_list.reset(); for( int i=0; i<tmp_list.size(); i++ ) { ref_edge = tmp_list.get_and_step(); if( ref_edge->start_vertex() == ref_vertex_ptr ) { start_flg = 1; return ref_edge; } if( ref_edge->end_vertex() == ref_vertex_ptr ) { start_flg = 0; return ref_edge; } } return NULL; }
RefEdge * GeometryUtil::find_connected_ref_edge_by_coord | ( | CubitVector & | coords, |
DLIList< RefEdge * > & | ref_edge_list, | ||
int & | start_flg | ||
) |
Definition at line 977 of file GeometryUtil.cpp.
{ RefEdge* ref_edge; DLIList<RefEdge*> tmp_list = ref_edge_list; ref_edge = ref_edge_list.get(); GeometryQueryEngine* gqe_ptr = ref_edge->get_geometry_query_engine(); double tol = gqe_ptr->get_sme_resabs_tolerance(); tmp_list.reset(); for( int i=0; i<tmp_list.size(); i++ ) { ref_edge = tmp_list.get_and_step(); if( ref_edge->start_coordinates().within_tolerance( coords, tol ) ) { start_flg = 1; return ref_edge; } if( ref_edge->end_coordinates().within_tolerance( coords, tol ) ) { start_flg = 0; return ref_edge; } } return NULL; }
void GeometryUtil::find_connected_ref_edges | ( | RefVertex * | ref_vertex_ptr, |
DLIList< RefEdge * > & | ref_edge_list, | ||
DLIList< RefEdge * > & | connected_edges_list | ||
) |
Definition at line 1319 of file GeometryUtil.cpp.
{ RefEdge* ref_edge; DLIList<RefEdge*> tmp_list = ref_edge_list; tmp_list.reset(); for( int i=0; i<tmp_list.size(); i++ ) { ref_edge = tmp_list.get_and_step(); if( ref_edge->start_vertex() == ref_vertex_ptr ) connected_edges_list.append_unique( ref_edge ); if( ref_edge->end_vertex() == ref_vertex_ptr ) connected_edges_list.append_unique( ref_edge ); } }
void GeometryUtil::find_connected_ref_edges_by_coord | ( | CubitVector & | coords, |
DLIList< RefEdge * > & | ref_edge_list, | ||
DLIList< RefEdge * > & | connected_edges_list | ||
) |
Definition at line 1009 of file GeometryUtil.cpp.
{ RefEdge* ref_edge; DLIList<RefEdge*> tmp_list = ref_edge_list; ref_edge = ref_edge_list.get(); GeometryQueryEngine* gqe_ptr = ref_edge->get_geometry_query_engine(); double tol = gqe_ptr->get_sme_resabs_tolerance(); tmp_list.reset(); for( int i=0; i<tmp_list.size(); i++ ) { ref_edge = tmp_list.get_and_step(); if( ref_edge->start_coordinates().within_tolerance( coords, tol ) ) connected_edges_list.append_unique( ref_edge ); if( ref_edge->end_coordinates().within_tolerance( coords, tol ) ) connected_edges_list.append_unique( ref_edge ); } }
CubitStatus GeometryUtil::form_ref_edge_chain | ( | DLIList< RefEdge * > & | ref_edge_list | ) |
Definition at line 1383 of file GeometryUtil.cpp.
{ if( ref_edge_list.size() == 1 ) return CUBIT_SUCCESS; int i; int start_flg = 0; RefVertex* ref_vertex_start, *ref_vertex_end; RefEdge* curr_edge; RefEdge* next_edge; DLIList<RefEdge*> temp_list = ref_edge_list; DLIList<RefEdge*> ordered_list; // Start vertex must be attached to only one ref_edge in our list. // Otherwise this is really a loop, which is still okay // Search to find the starting edge RefEdge* start_edge = NULL; for( i=0; i<temp_list.size(); i++ ) { curr_edge = temp_list.get(); // Since DLList doesn't allow a NULL item DLIList<RefEdge*> temp_list2; temp_list2 = temp_list; temp_list2.remove( curr_edge ); // Next item becomes current item // get the vectors to start and end ref_vertex_start = curr_edge->start_vertex(); ref_vertex_end = curr_edge->end_vertex(); if( !find_connected_ref_edge( ref_vertex_start, temp_list2, start_flg ) || !find_connected_ref_edge( ref_vertex_end, temp_list2, start_flg ) ) { start_edge = curr_edge; //temp_list.change_to( curr_edge ); break; } } temp_list.reset(); if( start_edge == NULL ) start_edge = ref_edge_list.get(); curr_edge = start_edge; ordered_list.append( curr_edge ); temp_list.move_to( start_edge ); temp_list.remove(); next_edge = temp_list.get(); // Attempt to use second edge in list as second edge in chain to // preserve original chain direction. RefEdge* next_edge_tmp = NULL; RefEdge* next_edge_tmp2 = NULL; // Check start first - if this fails check end next so chain order // will be established properly. ref_vertex_start = curr_edge->start_vertex(); next_edge_tmp = find_connected_ref_edge( ref_vertex_start, temp_list, start_flg ); if( next_edge_tmp != next_edge ) { ref_vertex_end = curr_edge->end_vertex(); next_edge_tmp2 = find_connected_ref_edge( ref_vertex_end, temp_list, start_flg ); } if( next_edge_tmp2 ) next_edge_tmp = next_edge_tmp2; if( next_edge_tmp ) { curr_edge = next_edge_tmp; ordered_list.append( next_edge_tmp ); temp_list.remove( next_edge_tmp ); } else { return CUBIT_FAILURE; } while( temp_list.size() ) { if( start_flg ) // Curr edge was found on prev start, so use end 1st { ref_vertex_end = curr_edge->end_vertex(); next_edge = find_connected_ref_edge( ref_vertex_end, temp_list, start_flg ); } else { ref_vertex_start = curr_edge->start_vertex(); next_edge = find_connected_ref_edge( ref_vertex_start, temp_list, start_flg ); } if( next_edge ) { curr_edge = next_edge; ordered_list.append( next_edge ); temp_list.remove( next_edge ); } else { return CUBIT_FAILURE; } } ref_edge_list.clean_out(); ref_edge_list = ordered_list; // Validate the chain DLIList<RefVertex*> problem_vertices; return check_valid_chain( ref_edge_list, problem_vertices ); }
CubitStatus GeometryUtil::form_ref_edge_chain_by_coord | ( | DLIList< RefEdge * > & | ref_edge_list | ) |
Definition at line 1093 of file GeometryUtil.cpp.
{ if( ref_edge_list.size() == 1 ) return CUBIT_SUCCESS; int i; int start_flg = 0; CubitVector vector_start, vector_end; RefEdge* curr_edge; RefEdge* next_edge; DLIList<RefEdge*> temp_list = ref_edge_list; DLIList<RefEdge*> ordered_list; // Start vertex must be attached to only one ref_edge in our list. // Otherwise this is really a loop, which is still okay // Search to find the starting edge RefEdge* start_edge = NULL; for( i=0; i<temp_list.size(); i++ ) { curr_edge = temp_list.get(); // Since DLList doesn't allow a NULL item DLIList<RefEdge*> temp_list2; temp_list2 = temp_list; temp_list2.remove( curr_edge ); // Next item becomes current item // get the vectors to start and end vector_start = curr_edge->start_coordinates(); vector_end = curr_edge->end_coordinates(); if( !find_connected_ref_edge_by_coord( vector_start , temp_list2, start_flg ) || !find_connected_ref_edge_by_coord( vector_end, temp_list2, start_flg ) ) { start_edge = curr_edge; //temp_list.change_to( curr_edge ); break; } } temp_list.reset(); if( start_edge == NULL ) start_edge = ref_edge_list.get(); curr_edge = start_edge; ordered_list.append( curr_edge ); temp_list.move_to( start_edge ); temp_list.remove(); next_edge = temp_list.get(); // Attempt to use second edge in list as second edge in chain to // preserve original chain direction. RefEdge* next_edge_tmp = NULL; RefEdge* next_edge_tmp2 = NULL; // Check start first - if this fails check end next so chain order // will be established properly. vector_start = curr_edge->start_coordinates(); next_edge_tmp = find_connected_ref_edge_by_coord( vector_start, temp_list, start_flg ); if( next_edge_tmp != next_edge ) { vector_end = curr_edge->end_coordinates(); next_edge_tmp2 = find_connected_ref_edge_by_coord( vector_end, temp_list, start_flg ); } if( next_edge_tmp2 ) next_edge_tmp = next_edge_tmp2; if( next_edge_tmp ) { curr_edge = next_edge_tmp; ordered_list.append( next_edge_tmp ); temp_list.remove( next_edge_tmp ); } else { return CUBIT_FAILURE; } while( temp_list.size() ) { if( start_flg ) // Curr edge was found on prev start, so use end 1st { vector_end = curr_edge->end_coordinates(); next_edge = find_connected_ref_edge_by_coord( vector_end , temp_list, start_flg ); } else { vector_start = curr_edge->start_coordinates(); next_edge = find_connected_ref_edge_by_coord( vector_start , temp_list, start_flg ); } if( next_edge ) { curr_edge = next_edge; ordered_list.append( next_edge ); temp_list.remove( next_edge ); } else { return CUBIT_FAILURE; } } ref_edge_list.clean_out(); ref_edge_list = ordered_list; // Validate the chain DLIList<RefVertex*> problem_vertices; return check_valid_chain_by_coord( ref_edge_list, problem_vertices ); }
CubitStatus GeometryUtil::form_ref_edge_loop | ( | DLIList< RefEdge * > & | ref_edge_list | ) |
Definition at line 1340 of file GeometryUtil.cpp.
{ int i; if( ref_edge_list.size() == 0 ) return CUBIT_FAILURE; if( ref_edge_list.size() == 1 ) { double period; if( ref_edge_list.get()->is_periodic( period ) ) return CUBIT_SUCCESS; } // First form a chain (which can be a loop) if( form_ref_edge_chain( ref_edge_list ) == CUBIT_FAILURE ) return CUBIT_FAILURE; // Now check to make sure a valid loop was formed. For a valid loop // every vertex must have exactly 2 edges connected to it. The only // exception is a periodic curve where there is only one vertex, which // was checked for before. DLIList<RefEdge*> connected_edges; RefEdge* ref_edge_ptr; for( i=0; i<ref_edge_list.size(); i++ ) { ref_edge_ptr = ref_edge_list.get_and_step(); connected_edges.clean_out(); find_connected_ref_edges( ref_edge_ptr->start_vertex(), ref_edge_list, connected_edges ); if( connected_edges.size() != 2 ) return CUBIT_FAILURE; connected_edges.clean_out(); find_connected_ref_edges( ref_edge_ptr->end_vertex(), ref_edge_list, connected_edges ); if( connected_edges.size() != 2 ) return CUBIT_FAILURE; } return CUBIT_SUCCESS; }
CubitStatus GeometryUtil::form_ref_edge_loop_by_coord | ( | DLIList< RefEdge * > & | ref_edge_list | ) |
Definition at line 1034 of file GeometryUtil.cpp.
{ int i; if( ref_edge_list.size() == 0 ) return CUBIT_FAILURE; if( ref_edge_list.size() == 1 ) { double period; if( ref_edge_list.get()->is_periodic( period ) ) return CUBIT_SUCCESS; else { // Could be a spline RefEdge *ref_edge_ptr = ref_edge_list.get(); GeometryQueryEngine* gqe_ptr = ref_edge_ptr->get_geometry_query_engine(); double tol = gqe_ptr->get_sme_resabs_tolerance(); if( ref_edge_ptr->start_coordinates().within_tolerance( ref_edge_ptr->end_coordinates(), tol ) ) return CUBIT_SUCCESS; } return CUBIT_FAILURE; } // First form a chain (which can be a loop) if( form_ref_edge_chain_by_coord( ref_edge_list ) == CUBIT_FAILURE ) return CUBIT_FAILURE; // Now check to make sure a valid loop was formed. For a valid loop // every vertex must have exactly 2 edges connected to it. The only // exception is a periodic curve where there is only one vertex, which // was checked for before. DLIList<RefEdge*> connected_edges; RefEdge* ref_edge_ptr; CubitVector vector; for( i=0; i<ref_edge_list.size(); i++ ) { ref_edge_ptr = ref_edge_list.get_and_step(); connected_edges.clean_out(); vector = ref_edge_ptr->start_coordinates(); find_connected_ref_edges_by_coord( vector , ref_edge_list, connected_edges ); if( connected_edges.size() != 2 ) return CUBIT_FAILURE; connected_edges.clean_out(); vector = ref_edge_ptr->end_coordinates(); find_connected_ref_edges_by_coord( vector , ref_edge_list, connected_edges ); if( connected_edges.size() != 2 ) return CUBIT_FAILURE; } return CUBIT_SUCCESS; }
CubitBoolean GeometryUtil::inside_of_curve | ( | const CubitVector & | curve_tangent, |
const CubitVector & | curve_position, | ||
const CubitVector & | surf_position, | ||
const CubitVector & | surf_normal | ||
) | [protected] |
Definition at line 954 of file GeometryUtil.cpp.
{ CubitVector cross = tangent * ( surf_pos - curve_pos ); double sum = (cross + normal).length_squared(); double diff = (cross - normal).length_squared(); return (sum < diff) ? CUBIT_FALSE : CUBIT_TRUE; }
static GeometryUtil* GeometryUtil::instance | ( | ) | [inline, static] |
Definition at line 47 of file GeometryUtil.hpp.
{ if( instance_ == NULL ) instance_ = new GeometryUtil; return instance_; }
CubitBoolean GeometryUtil::is_point_on_face | ( | RefFace * | ref_face_ptr, |
const CubitVector & | point, | ||
CubitBoolean | check_on_surface = CUBIT_TRUE |
||
) |
CubitBoolean GeometryUtil::is_position_in_volume | ( | const CubitVector & | position, |
RefVolume * | ref_volume_ptr, | ||
CubitVector * | closest_on_bounary = NULL |
||
) |
CubitBoolean GeometryUtil::is_position_within_loop | ( | const CubitVector & | position, |
Loop * | loop_ptr, | ||
CubitVector * | closest_on_loop = NULL , |
||
CubitVector * | normal = NULL |
||
) |
Definition at line 61 of file GeometryUtil.cpp.
{ CubitVector surf_point, normal, pt_on_curve; if( passed_normal ) { surf_point = position; normal = *passed_normal; } else { loop_ptr->get_ref_face_ptr()->get_surface_ptr()-> closest_point( position, &surf_point, &normal ); } CoEdge* other_coedge = 0; CoEdge* closest_coedge = closest_loop_coedge( loop_ptr, position, other_coedge, &pt_on_curve ); //If we got back NULL, either the loop has no CoEdges, or all Curves //occur multiple times. if( !closest_coedge ) return CUBIT_TRUE; if( closest_on_loop ) *closest_on_loop = pt_on_curve; CubitVector coe_normal, coe_cross, tangent1, tangent2, junk; if( ! other_coedge ) { Curve* curve_ptr = closest_coedge->get_ref_edge_ptr()->get_curve_ptr(); double u = curve_ptr->u_from_position( pt_on_curve ); /**** Special case: closest point on loop at G1 discontinuity ****/ if( curve_ptr->G1_discontinuous( u, &tangent1, &tangent2 ) ) { if( closest_coedge->get_sense() == CUBIT_REVERSED ) { tangent1 *= -1.0; tangent2 *= -1.0; } loop_ptr->get_ref_face_ptr()->get_surface_ptr()-> closest_point( pt_on_curve, NULL, &coe_normal ); coe_cross = tangent1 * tangent2; double sum = (coe_cross + coe_normal).length_squared(); double diff = (coe_cross - coe_normal).length_squared(); CubitBoolean inside1 = inside_of_curve( tangent1, pt_on_curve, surf_point, normal ); CubitBoolean inside2 = inside_of_curve( tangent2, pt_on_curve, surf_point, normal ); if( (sum > diff) || (diff < CUBIT_DBL_MIN) ) //discontinuity is at a convexity { //the point must be inside of both sub-edges return (inside1 && inside2) ? CUBIT_TRUE : CUBIT_FALSE; } else //discontinuity is at a concavity { //the point must be inside of one of the sub-edges return (inside1 || inside2) ? CUBIT_TRUE : CUBIT_FALSE; } } else /**** This is the normal, non-special case part ****/ { curve_ptr->closest_point( pt_on_curve, junk, &tangent1 ); if( closest_coedge->get_sense() == CUBIT_REVERSED ) tangent1 *= -1.0; return inside_of_curve( tangent1, pt_on_curve, surf_point, normal ); } } /**** Special case: closest point on loop at vertex ****/ else { Curve* curve1_ptr = closest_coedge->get_ref_edge_ptr()->get_curve_ptr(); Curve* curve2_ptr = other_coedge->get_ref_edge_ptr()->get_curve_ptr(); curve1_ptr->closest_point( pt_on_curve, junk, &tangent1 ); curve2_ptr->closest_point( pt_on_curve, junk, &tangent2 ); if( closest_coedge->get_sense() == CUBIT_REVERSED ) tangent1 *= -1.0; if( other_coedge->get_sense() == CUBIT_REVERSED ) tangent2 *= -1.0; loop_ptr->get_ref_face_ptr()->get_surface_ptr()-> closest_point( pt_on_curve, NULL, &coe_normal ); coe_cross = tangent1 * tangent2; double sum = (coe_cross + coe_normal).length_squared(); double diff = (coe_cross - coe_normal).length_squared(); CubitBoolean inside1 = inside_of_curve( tangent1, pt_on_curve, surf_point, normal ); CubitBoolean inside2 = inside_of_curve( tangent2, pt_on_curve, surf_point, normal ); if( (sum > diff) || (diff < CUBIT_DBL_MIN) ) //the common vertex is at a convexity { //the point must be inside of both coedges return (inside1 && inside2) ? CUBIT_TRUE : CUBIT_FALSE; } else //the common vertex is at a concavity { //the point must be inside of one of the coedges return (inside1 || inside2) ? CUBIT_TRUE : CUBIT_FALSE; } } }
CubitBoolean GeometryUtil::is_position_within_shell | ( | const CubitVector & | position, |
Shell * | shell_ptr, | ||
CubitVector * | closest_on_shell = NULL |
||
) |
Definition at line 875 of file GeometryUtil.cpp.
{ DLIList<CoFace*> result_cofaces; CubitVector closest_pt; closest_shell_coface( shell_ptr, position, result_cofaces, &closest_pt ); if( closest_on_shell ) *closest_on_shell = closest_pt; //test each resulting coface CubitVector vector_to_surf = closest_pt - position; for( int i = result_cofaces.size(); i > 0; i-- ) { CoFace* coface_ptr = result_cofaces.get_and_step(); RefFace* ref_face_ptr = coface_ptr->get_ref_face_ptr(); CubitVector normal = ref_face_ptr->normal_at( closest_pt ); if( coface_ptr->get_sense() == CUBIT_REVERSED ) normal *= -1.0; double sum = (normal + vector_to_surf).length_squared(); double diff = (normal - vector_to_surf).length_squared(); if( diff > sum ) return CUBIT_FALSE; } return CUBIT_TRUE; }
CubitBoolean GeometryUtil::is_shell_a_void | ( | Shell * | shell_ptr | ) |
Definition at line 912 of file GeometryUtil.cpp.
{ assert( shell_ptr != 0 ); DLIList<CoFace*> shell_cofaces; CubitBox box = shell_ptr->bounding_box(); double box_diag = box.diagonal().length(); double epsilon = box_diag / 1000; CubitVector base_point( box.minimum() ); CubitVector opposite_point; CubitVector point, normal; closest_shell_coface( shell_ptr, base_point, shell_cofaces, &point ); base_point = point; if( !shell_cofaces.size() ) return CUBIT_TRUE; CoFace* coface_ptr = shell_cofaces.get(); normal = coface_ptr->get_ref_face_ptr()->normal_at( base_point ); if( coface_ptr->get_sense() == CUBIT_REVERSED ) normal *= -1.0; normal.length( box_diag ); opposite_point = base_point + normal; closest_shell_coface( shell_ptr, opposite_point, shell_cofaces, &point ); return (base_point - point).length() < epsilon ? CUBIT_FALSE : CUBIT_TRUE; }
void GeometryUtil::list_SM_topology | ( | TopologyBridge * | bridge, |
int | depth | ||
) | [static] |
Definition at line 3185 of file GeometryUtil.cpp.
{ int counts[8] = {0,0,0,0,0,0,0,0}; const char* names[8] = {"BodySM","Lump","ShellSM", "Surface", "LoopSM", "CoEdgeSM", "Curve", "Point"}; list_SM_topology( bridge, depth, 0, counts ); for( int i = 0; i < 8; i++ ) if( counts[i] == 1 ) PRINT_INFO("%d %s, ", counts[i], names[i] ); else if( counts[i] > 1 ) PRINT_INFO("%d %ss, ", counts[i], names[i] ); PRINT_INFO("\n"); }
void GeometryUtil::list_SM_topology | ( | TopologyBridge * | bridge, |
int | depth, | ||
int | indent, | ||
int | counts[8] | ||
) | [static, protected] |
Definition at line 3200 of file GeometryUtil.cpp.
{ DLIList<TopologyBridge*> relatives; if( depth < 0 ) { bridge->get_parents( relatives ); relatives.reset(); for( int i = relatives.size(); i--; ) list_SM_topology( relatives.get_and_step(), depth+1, indent+1, counts ); } int index = print_topo_bridge( bridge, indent ); if( index >= 0 && index <= 8 ) counts[index]++; if( depth > 0 ) { bridge->get_children( relatives ); relatives.reset(); for( int i = relatives.size(); i--; ) list_SM_topology( relatives.get_and_step(), depth-1, indent+1, counts ); } }
double GeometryUtil::loop_area | ( | Loop * | loop_ptr | ) |
CubitStatus GeometryUtil::make_linearized_curve | ( | Surface * | surface_ptr, |
const CubitVector & | start_pt, | ||
const CubitVector & | end_pt, | ||
DLIList< CubitVector * > & | segment_points, | ||
double | arc_angle_tol = CUBIT_DBL_MAX , |
||
double | midpoint_dist_tol = CUBIT_DBL_MAX , |
||
const CubitVector * | mid_point = NULL |
||
) |
int GeometryUtil::print_topo_bridge | ( | TopologyBridge * | bridge, |
int | indent | ||
) | [static, protected] |
Definition at line 3226 of file GeometryUtil.cpp.
{ const char* label = bridge ? typeid(*bridge).name() : "(null)"; #ifdef __GNUC__ while( isdigit(*label) ) label++; #endif int index = -1; if( dynamic_cast<BodySM*>(bridge) ) index = 0; else if( dynamic_cast<Lump*>(bridge) ) index = 1; else if( dynamic_cast<ShellSM*>(bridge) ) index = 2; else if( dynamic_cast<Surface*>(bridge) ) index = 3; else if( dynamic_cast<LoopSM*>(bridge) ) index = 4; else if( dynamic_cast<CoEdgeSM*>(bridge) ) index = 5; else if( dynamic_cast<Curve*>(bridge) ) index = 6; else if( dynamic_cast<TBPoint*>(bridge) ) index = 7; CubitString name(""); RefEntity* re = 0; if( bridge && (re = dynamic_cast<RefEntity*>(bridge->topology_entity())) ) name = re->entity_name(); PRINT_INFO("%*s%s 0x%lx (%s)\n", indent*3, "", label, (long)bridge, name.c_str()); return index; }
CubitStatus GeometryUtil::recursive_make_curve | ( | Surface * | surface_ptr, |
const CubitVector & | start_pt, | ||
const CubitVector & | end_pt, | ||
DLIList< CubitVector * > & | segment_points, | ||
double | arc_angle_tol, | ||
double | midpoint_dist_tol | ||
) | [protected] |
Definition at line 676 of file GeometryUtil.cpp.
{ if( midpoint_dist_tol < GEOMETRY_RESABS ) midpoint_dist_tol = GEOMETRY_RESABS; CubitVector seg_mid_point, mid_point, mid_pt_norm; CubitVector start_pt_norm, end_pt_norm, tangent; double angle = arc_angle_tol; double midpt_dist = midpoint_dist_tol; seg_mid_point = (start_pt + end_pt) / 2; surface_ptr->closest_point_trimmed( seg_mid_point, mid_point ); surface_ptr->closest_point( mid_point, NULL, &mid_pt_norm ); surface_ptr->closest_point( start_pt, NULL, &start_pt_norm ); surface_ptr->closest_point( end_pt, NULL, &end_pt_norm ); tangent = start_pt - end_pt; if( tangent.length() < GEOMETRY_RESABS ) { PRINT_DEBUG_86( "Solution for polyline on surface not converging.\n" "GeometryUtil::recursive_make_curve(..) returning " "FAILURE.\n"); return CUBIT_FAILURE; } CubitBoolean split = CUBIT_FALSE; if( !split && ( midpoint_dist_tol < CUBIT_DBL_MAX ) ) { midpt_dist = (seg_mid_point - mid_point).length(); if( midpt_dist > midpoint_dist_tol ) { split = CUBIT_TRUE; } } if( !split && (arc_angle_tol < (CUBIT_PI / 2)) ) { double seg_angle, half1_angle, half2_angle, sum; seg_angle = fabs( tangent.vector_angle( start_pt_norm, end_pt_norm ) ); half1_angle = fabs((start_pt-mid_point). vector_angle( start_pt_norm, mid_pt_norm )); half2_angle = fabs((end_pt-mid_point). vector_angle( end_pt_norm, mid_pt_norm )); sum = half1_angle + half2_angle; angle = seg_angle > sum ? seg_angle : sum; if( angle > arc_angle_tol ) { split = CUBIT_TRUE; } } if( split ) { if( DEBUG_FLAG(86) ) { GfxDebug::draw_label( ++linearized_curve_debug_count_, float(mid_point.x()), float(mid_point.y()), float(mid_point.z()), CUBIT_WHITE_INDEX ); GfxDebug::flush(); } double start_len = (start_pt - mid_point).length(); double end_len = (end_pt - mid_point).length(); double half_tol = 0.5 * midpoint_dist_tol; if( ((start_len < half_tol) && (end_len < half_tol)) || (start_len < GEOMETRY_RESABS) || (end_len < GEOMETRY_RESABS) ) return CUBIT_SUCCESS; CubitStatus status; status = recursive_make_curve( surface_ptr, start_pt, mid_point, segment_points, arc_angle_tol, midpoint_dist_tol ); segment_points.append( new CubitVector( mid_point ) ); if( status != CUBIT_SUCCESS ) return status; status = recursive_make_curve( surface_ptr, mid_point, end_pt, segment_points, arc_angle_tol, midpoint_dist_tol ); return status; } return CUBIT_SUCCESS; }
CubitBoolean GeometryUtil::valid_edge | ( | RefEdge * | edge_ptr, |
CubitBoolean | print_error = CUBIT_TRUE |
||
) |
Definition at line 1587 of file GeometryUtil.cpp.
{ RefVertex* start_vertex = edge_ptr->start_vertex(); RefVertex* end_vertex = edge_ptr->end_vertex(); CubitBoolean result = CUBIT_TRUE; if (!edge_ptr->get_curve_ptr()) { if (print_error) PRINT_ERROR("Curve %d does not have a TopologyBridge.\n", edge_ptr->id()); return CUBIT_FALSE; } else if(!start_vertex) { if (print_error) PRINT_ERROR("Curve %d has no start vertex.\n", edge_ptr->id()); return CUBIT_FALSE; } else if(!end_vertex) { if (print_error) PRINT_ERROR("Curve %d has no end vertex.\n", edge_ptr->id()); return CUBIT_FALSE; } else if (!start_vertex->get_point_ptr()) { if (print_error) PRINT_ERROR("Vertex %d has no Point.\n", start_vertex->id()); return CUBIT_FALSE; } else if (!end_vertex->get_point_ptr()) { if (print_error) PRINT_ERROR("Vertex %d has no Point.\n", end_vertex->id()); return CUBIT_FALSE; } else if (edge_ptr->get_curve_ptr()->geometry_type() == POINT_CURVE_TYPE) { if (start_vertex != end_vertex) { if (print_error) PRINT_ERROR("Curve %d is a point-curve but has different " "vertices (%d and %d).\n", edge_ptr->id(), start_vertex->id(), end_vertex->id()); result = CUBIT_FALSE; } } else { double u_start = edge_ptr->start_param(); double u_end = edge_ptr->end_param(); double period; CubitBoolean periodic = edge_ptr->is_periodic( period ); if( start_vertex == end_vertex ) { if( !periodic && print_error ) PRINT_WARNING("Curve %d is closed but not periodic.\n",edge_ptr->id()); } double u_start_vtx = edge_ptr->u_from_position( start_vertex->coordinates() ); double u_end_vtx = edge_ptr->u_from_position( end_vertex->coordinates() ); if (periodic) { // For a periodic curve the point perp operation could return u_start or // u_end for both start_vertex and end_vertex so try to put everything // in the range from u_start to u_end and recognize cases where u_start_vtx // equals u_end by accident (and vice versa). if (period > 0.0) { // Logically, if u_start_vtx >= u_end... while (u_start_vtx > u_end - CUBIT_RESABS) u_start_vtx -= period; // Logically, if u_start_vtx < u_start... while (u_start_vtx < u_start - CUBIT_RESABS) u_start_vtx += period; // Logically, if u_end_vtx > u_end... while (u_end_vtx > u_end + CUBIT_RESABS) u_end_vtx -= period; // Logically, if u_end_vtx <= u_start... while (u_end_vtx < u_start + CUBIT_RESABS) u_end_vtx += period; } else if (period < 0.0) { // Logically, if u_start_vtx <= u_end ... while (u_start_vtx < u_end + CUBIT_RESABS) u_start_vtx += period; // Logically, if u_start_vtx > u_start... while (u_start_vtx > u_start + CUBIT_RESABS) u_start_vtx -= period; // Logically, if u_end_vtx < u_end... while (u_end_vtx < u_end - CUBIT_RESABS) u_end_vtx += period; // Logically, if u_end_vtx >= u_start... while (u_end_vtx > u_start - CUBIT_RESABS) u_end_vtx -= period; } } if( (fabs( u_start_vtx - u_start ) > CUBIT_RESABS) && print_error ) PRINT_WARNING("Vertex %d does not appear to be at the start of curve %d.\n", start_vertex->id(), edge_ptr->id() ); if( (fabs( u_end_vtx - u_end ) > CUBIT_RESABS) && print_error ) PRINT_WARNING("Vertex %d does not appear to be at the end of curve %d.\n", end_vertex->id(), edge_ptr->id() ); double u_diff = u_start - u_end; double u_diff_vtx = u_start_vtx - u_end_vtx; if( (u_diff * u_diff_vtx) < 0 ) { if( print_error ) { PRINT_ERROR("Vertices on curve %d appear to be in the wrong order.\n", edge_ptr->id()); PRINT_INFO("\tstart_param = %f, end_param = %f, u(start_vtx) = %f, " "u(end_vtx) = %f\n",u_start,u_end,u_start_vtx,u_end_vtx); } result = CUBIT_FALSE; } double step = (u_end - u_start) / 100.; if( step > 0.0 ) { if( step < CUBIT_RESABS ) step = CUBIT_RESABS; if( (u_start + step) > u_end ) step = u_end - u_start; } else { if( step > -CUBIT_RESABS ) step = -CUBIT_RESABS; if( (u_start + step) < u_end ) step = u_end - u_start; } CubitVector closest, tangent, next_pos; edge_ptr->closest_point( start_vertex->coordinates(), closest, &tangent ); /* This fails a lot with spline curves, so skip it. double distance = (start_vertex->coordinates() - closest).length(); if( (distance > GEOMETRY_RESABS) && print_error ) { PRINT_WARNING("Vertex %d of curve %d does not appear to lie on the curve.\n", start_vertex->id(), edge_ptr->id() ); } */ edge_ptr->position_from_u( u_start + step, next_pos ); next_pos -= closest; if( tangent.length_squared() < CUBIT_RESABS ) { if( print_error ) PRINT_ERROR("Zero-length tangent vector returned at start of curve %d\n", edge_ptr->id()); result = CUBIT_FALSE; } else if( next_pos.length_squared() < CUBIT_RESABS ) { if( print_error ) PRINT_WARNING("Distance for delta-u of %f in [%f,%f] near start" " of curve %d appears to be zero.\n", step, u_start, u_end, edge_ptr->id()); } else if( tangent.interior_angle( next_pos ) > (90. - CUBIT_RESABS) ) { if( print_error ) PRINT_ERROR("The tangent at the start of curve %d appears " "to be in the wrong direction.\n",edge_ptr->id()); result = CUBIT_FALSE; } edge_ptr->closest_point( end_vertex->coordinates(), closest, &tangent ); /* This fails a lot with spline curves, so skip it. distance = (end_vertex->coordinates() - closest).length(); if( (distance > GEOMETRY_RESABS) && print_error ) { PRINT_WARNING("Vertex %d of curve %d does not appear to lie on the curve.\n", end_vertex->id(), edge_ptr->id() ); } */ edge_ptr->position_from_u( u_end - step, next_pos ); next_pos = closest - next_pos; if( tangent.length_squared() < CUBIT_RESABS ) { if( print_error ) PRINT_ERROR("Zero-length tangent vector returned at end of %d\n", edge_ptr->id()); result = CUBIT_FALSE; } else if( next_pos.length_squared() < CUBIT_RESABS ) { if( print_error ) PRINT_WARNING("Distance for delta-u of %f in [%f,%f] near end" " of curve %d appears to be zero.\n", step, u_start, u_end, edge_ptr->id()); } else if( tangent.interior_angle( next_pos ) > (90. - CUBIT_RESABS) ) { if( print_error ) PRINT_ERROR("The tangent at the end of curve %d appears " "to be in the wrong direction.\n",edge_ptr->id()); result = CUBIT_FALSE; } } return result; }
CubitBoolean GeometryUtil::valid_loop_coedges | ( | Loop * | loop_ptr, |
CubitBoolean | print_error = CUBIT_TRUE |
||
) |
Definition at line 1792 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; RefFace* loop_owner = loop_ptr->get_ref_face_ptr(); int surf_id = loop_owner ? loop_owner->id() : 0; if( !loop_ptr->get_loop_sm_ptr() && print_error ) { PRINT_WARNING("Loop in Surface %d has no OSME pointer.\n",surf_id); } DLIList<CoEdge*> coedge_list; CubitStatus status = loop_ptr->ordered_co_edges( coedge_list ); if( ! status ) { if( print_error ) PRINT_ERROR("Query for loop coedges failed!\n"); return CUBIT_FALSE; } if( coedge_list.size() < 2 ) return CUBIT_TRUE; CoEdge* prev_coedge = coedge_list.get_and_step(); RefEdge* prev_edge = prev_coedge->get_ref_edge_ptr(); for( int i = coedge_list.size(); i > 0; i-- ) { CoEdge* curr_coedge = coedge_list.get_and_step(); RefEdge* curr_edge = curr_coedge->get_ref_edge_ptr(); if (!curr_edge) { if (print_error) PRINT_ERROR("CoEdge in surface %d has no Curve.\n", surf_id); result = CUBIT_FAILURE; continue; } if( !curr_coedge->get_co_edge_sm_ptr() && print_error ) { PRINT_WARNING("CoEdge between surface %d and curve %d has " "no OSME pointer.\n", surf_id, curr_edge->id() ); } RefVertex* common = curr_edge->common_ref_vertex( prev_edge ); if( !common ) { if( print_error ) PRINT_ERROR("Curves %d and %d are ajacent in a Loop on surface %d, " "but do not have a common vertex.\n", prev_edge->id(), curr_edge->id(), surf_id ); result = CUBIT_FALSE; } RefVertex* start_vtx = 0; CubitSense sense = curr_coedge->get_sense(); switch( sense ) { case CUBIT_FORWARD: start_vtx = curr_edge->start_vertex(); break; case CUBIT_REVERSED: start_vtx = curr_edge->end_vertex(); break; case CUBIT_UNKNOWN: default: start_vtx = 0; break; } RefVertex* end_vtx = 0; switch( prev_coedge->get_sense() ) { case CUBIT_FORWARD: end_vtx = prev_edge->end_vertex(); break; case CUBIT_REVERSED: end_vtx = prev_edge->start_vertex(); break; default: break; } if( start_vtx == NULL ) { if( print_error ) PRINT_ERROR("Curve %d has an unknown sense on surface %d.\n", curr_edge->id(), surf_id ); result = CUBIT_FALSE; } else if( start_vtx != end_vtx ) { if( print_error ) PRINT_ERROR("The sense of curve %d (%s) on surface %d appears " "to be incorrect with respect to the previous curve " "in the loop (curve %d).\n", curr_edge->id(), sense == CUBIT_FORWARD ? "forward" : "reverse", surf_id, prev_edge->id() ); result = CUBIT_FALSE; } prev_edge = curr_edge; prev_coedge = curr_coedge; } return result; }
CubitBoolean GeometryUtil::valid_shell_cofaces | ( | Shell * | shell_ptr, |
CubitBoolean | print_error = CUBIT_TRUE |
||
) |
Definition at line 1900 of file GeometryUtil.cpp.
{ DLIList<CoFace*> coface_list, ajacent_cofaces; DLIList<CoEdge*> coedge_list; shell_ptr->co_faces( coface_list ); CubitBoolean result = CUBIT_TRUE; RefVolume* vol_ptr = shell_ptr->get_ref_volume_ptr(); int vol_id = vol_ptr ? vol_ptr->id() : 0; if( ! shell_ptr->get_shell_sm_ptr() && print_error) { PRINT_WARNING("Shell in volume %d has no OSME pointer.\n",vol_id); } while( coface_list.size() > 0 ) { CoFace* coface_ptr = coface_list.pop(); RefFace* face_ptr = coface_ptr->get_ref_face_ptr(); if( !face_ptr ) { if( print_error ) PRINT_ERROR("Encountered a CoFace without a RefFace in volume %d.\n",vol_id); result = CUBIT_FALSE; continue; } if (face_ptr->is_nonmanifold(shell_ptr)) { continue; } CubitSense sense = coface_ptr->get_sense(); if( sense == CUBIT_UNKNOWN ) { if( print_error ) PRINT_ERROR("Surface %d has an unknown sense with respect to volume %d.\n", face_ptr->id(), vol_id ); result = CUBIT_FALSE; continue; } coedge_list.clean_out(); face_ptr->co_edges( coedge_list ); for( int i = coedge_list.size(); i > 0; i-- ) { CoEdge* coedge_ptr = coedge_list.get_and_step(); RefEdge* edge_ptr = coedge_ptr->get_ref_edge_ptr(); if( !edge_ptr ) { result = CUBIT_FALSE; if( print_error ) PRINT_ERROR("CoEdge @ %p in Surface %d has no Curve!\n", (void*)coedge_ptr, face_ptr->id() ); continue; } ajacent_cofaces.clean_out(); edge_ptr->co_faces( ajacent_cofaces ); ajacent_cofaces.intersect( coface_list ); CubitSense coedge_sense = coedge_ptr->get_sense(); if( coedge_sense == CUBIT_UNKNOWN ) { if( print_error ) PRINT_ERROR("CoEdge connecting Curve %d to surface %d " "has UNKNOWN sense.\n",edge_ptr->id(), face_ptr->id() ); result = CUBIT_FALSE; continue; } if( (ajacent_cofaces.size() > 1) && print_error ) { PRINT_WARNING("Non-manifold topology at curve %d on volume %d " "may result in false errors being reported.\n", edge_ptr->id(), vol_id ); } for( int j = ajacent_cofaces.size(); j > 0; j-- ) { CoFace* other_coface = ajacent_cofaces.get_and_step(); RefFace* other_face = other_coface->get_ref_face_ptr(); if( ! other_face ) { if( print_error ) PRINT_ERROR("Encountered a CoFace on volume %d that does not " "have a RefFace!\n",vol_id); result = CUBIT_FALSE; continue; } CubitSense other_coedge_sense = edge_ptr->sense( other_face ); if( other_coedge_sense == CUBIT_UNKNOWN ) { if( print_error ) PRINT_ERROR("Curve %d has unknown sense with respect to " "surface %d.\n",edge_ptr->id(), other_face->id() ); result = CUBIT_FALSE; continue; } CubitSense other_sense = other_coface->get_sense(); if( other_sense == CUBIT_UNKNOWN ) { if( print_error ) PRINT_ERROR("Surface %d has an unknown sense with respect " "to volume %d.\n", other_face->id(), vol_id ); result = CUBIT_FALSE; continue; } if( ((sense == other_sense) && (coedge_sense == other_coedge_sense)) ||((sense != other_sense) && (coedge_sense != other_coedge_sense)) ) { if( print_error ) PRINT_ERROR("Incompatible CoFace senses found at curve %d in " "volume %d.\n" " Surface CoFace Sense CoEdge Sense\n" " ------- ------------ ------------\n" " %7d %12s %12s\n %7d %12s %12s\n", edge_ptr->id(), vol_id, face_ptr->id(), sense == CUBIT_FORWARD ? "forward" : "reverse", coedge_sense == CUBIT_FORWARD ? "forward" : "reverse", other_face->id(), other_sense == CUBIT_FORWARD ? "forward" : "reverse", other_coedge_sense == CUBIT_FORWARD ? "forward" : "reverse"); result = CUBIT_FALSE; } } // end for( j ) } // end for( i ) } // end while( coface_list.size() ) return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | DLIList< RefEntity * > & | entity_list, |
CubitBoolean | print_error = CUBIT_TRUE |
||
) |
Definition at line 2174 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; DLIList<Body*> body_list; DLIList<RefVolume*> vol_list, child_vols ; DLIList<RefFace*> face_list, child_faces; DLIList<RefEdge*> edge_list, child_edges; DLIList<RefVertex*> vtx_list, child_vtx; CAST_LIST( entity_list, body_list, Body ); CAST_LIST( entity_list, vol_list , RefVolume); CAST_LIST( entity_list, face_list, RefFace ); CAST_LIST( entity_list, edge_list, RefEdge ); CAST_LIST( entity_list, vtx_list , RefVertex); int i; for( i = body_list.size(); i--; ) { Body* body_ptr = body_list.get_and_step(); if( !valid_sm_topology( body_ptr, print_error ) ) result = CUBIT_FALSE; child_vols.clean_out(); body_ptr->ref_volumes( child_vols ); vol_list.merge_unique( child_vols ); } for( i = vol_list.size(); i--; ) { RefVolume* vol_ptr = vol_list.get_and_step(); if( !valid_sm_topology( vol_ptr, print_error ) ) result = CUBIT_FALSE; child_faces.clean_out(); vol_ptr->ref_faces( child_faces ); face_list.merge_unique( child_faces ); } for( i = face_list.size(); i--; ) { RefFace* face_ptr = face_list.get_and_step(); if( !valid_sm_topology( face_ptr, print_error ) ) result = CUBIT_FALSE; child_edges.clean_out(); face_ptr->ref_edges( child_edges ); edge_list.merge_unique( child_edges ); } for( i = edge_list.size(); i--; ) { RefEdge* edge_ptr = edge_list.get_and_step(); if( !valid_sm_topology( edge_ptr, print_error ) ) result = CUBIT_FALSE; child_vtx.clean_out(); edge_ptr->ref_vertices( child_vtx ); vtx_list.merge_unique( child_vtx ); } for( i = vtx_list.size(); i--; ) if( !valid_sm_topology(vtx_list.get_and_step(), print_error ) ) result = CUBIT_FALSE; return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | Body * | body_ptr, |
CubitBoolean | |||
) |
Definition at line 2233 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; int i; // This function checks for extraneous links in the VGI between // the passed body and its child volumes. To check for missing // links, use valid_sm_topology(RefVolume*). DLIList<RefVolume*> vol_list; body_ptr->ref_volumes( vol_list ); // Get all child TopologyBridges DLIList<TopologyBridge*> body_bridges, lump_bridges, temp_list; body_ptr->bridge_manager()->get_bridge_list( body_bridges ); if ( body_bridges.size() != 1 ) { PRINT_ERROR("%s (Body %d) has %d attached BodySM(s).\n", body_ptr->entity_name().c_str(), body_ptr->id(), body_bridges.size() ); result = CUBIT_FALSE; } for( i = body_bridges.size(); i > 0; i-- ) { TopologyBridge* bodysm = body_bridges.get_and_step(); temp_list.clean_out(); bodysm->get_children( temp_list ); lump_bridges.merge_unique( temp_list ); } // Check that each child VGI RefVolume has atleast one // TopologyBridge in the list we got from the solid modeler. for( i = vol_list.size(); i > 0; i-- ) { RefVolume* vol_ptr = vol_list.get_and_step(); temp_list.clean_out(); vol_ptr->bridge_manager()->get_bridge_list( temp_list ); temp_list.intersect( lump_bridges ); if( temp_list.size() == 0 ) { if( print ) PRINT_ERROR( "Extraneous VGI link between %s and %s.\n", body_ptr->entity_name().c_str(), vol_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } for( i = lump_bridges.size(); i--; ) { TopologyBridge* lump = lump_bridges.get_and_step(); TopologyEntity* owner = lump->topology_entity(); RefVolume* vol_ptr = dynamic_cast<RefVolume*>(owner); if( ! vol_ptr ) { if( print ) PRINT_ERROR( "No RefVolume for Lump %p in %s\n", (void*)lump, body_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | RefVolume * | vol_ptr, |
CubitBoolean | |||
) |
Definition at line 2299 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; int i; // This method checks for // a.) Missing links between the passed RefVolume and its parent Body(s) // b.) Extraneous links between the RefVolume and its child shell(s) // c.) Invalid Shells by calling valid_sm_topology(Shell*) DLIList<Body*> body_list; vol_ptr->bodies( body_list ); DLIList<Shell*> shell_list; vol_ptr->shells( shell_list ); DLIList<TopologyBridge*> vol_bridges, shell_bridges, temp_list; vol_ptr->bridge_manager()->get_bridge_list( vol_bridges ); if ( vol_bridges.size() != 1 ) { PRINT_ERROR("%s (RefVolume %d) has %d attached Lump(s).\n", vol_ptr->entity_name().c_str(), vol_ptr->id(), vol_bridges.size() ); result = CUBIT_FALSE; } for( i = vol_bridges.size(); i > 0; i-- ) { TopologyBridge* lump = vol_bridges.get_and_step(); // Check for missing links between this RefVolume and parent Body(s) temp_list.clean_out(); lump->get_parents( temp_list ); for( int j = temp_list.size(); j > 0; j-- ) { TopologyBridge* bodysm = temp_list.get_and_step(); TopologyEntity* te_ptr = bodysm->topology_entity(); Body* body_ptr = CAST_TO( te_ptr, Body ); CubitString body_name; const char* body_str = "PARENT BODY"; if( body_ptr ) { body_name = body_ptr->entity_name(); body_str = body_name.c_str(); } if( (body_ptr == NULL) || !body_list.is_in_list(body_ptr) ) { if( print ) PRINT_ERROR( "Missing VGI link between %s and %s\n", body_str, vol_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } // Build ShellSM list for next part temp_list.clean_out(); lump->get_children( temp_list ); shell_bridges.merge_unique( temp_list ); } // Check for extraneous VGI links between this RefVolume and child Shell(s) for( i = shell_list.size(); i > 0; i-- ) { Shell* shell_ptr = shell_list.get_and_step(); temp_list.clean_out(); shell_ptr->bridge_manager()->get_bridge_list( temp_list ); temp_list.intersect( shell_bridges ); if( temp_list.size() == 0 ) { DLIList<RefFace*> shell_faces; shell_ptr->ref_faces( shell_faces ); CubitString face_name; const char* face_str = "NO REFFACE"; if( shell_faces.size() ) { face_name = shell_faces.get()->entity_name(); face_str = face_name.c_str(); } if( print ) PRINT_ERROR( "Extraneous VGI link between %s and Shell with %s.\n", vol_ptr->entity_name().c_str(), face_str ); result = CUBIT_FALSE; } } for( i = shell_bridges.size(); i--; ) { TopologyBridge* shell = shell_bridges.get_and_step(); TopologyEntity* owner = shell->topology_entity(); Shell* shell_ptr = dynamic_cast<Shell*>(owner); if( ! shell_ptr ) { if( print ) PRINT_ERROR( "No Shell for ShellSM %p in %s\n", (void*)shell, vol_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } for( i = shell_list.size(); i > 0; i-- ) if( !valid_sm_topology( shell_list.get_and_step(), print ) ) result = CUBIT_FALSE; return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | Shell * | shell_ptr, |
CubitBoolean | |||
) |
Definition at line 2406 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; int i; // This method checks for // a.) Missing links between the passed Shell and its parent RefVolume(s) // b.) Extraneous links between the Shell and its child RefFace(s) DLIList<RefVolume*> vol_list; shell_ptr->ref_volumes( vol_list ); DLIList<RefFace*> face_list; shell_ptr->ref_faces( face_list ); DLIList<TopologyBridge*> shell_bridges, face_bridges, temp_list; shell_ptr->bridge_manager()->get_bridge_list( shell_bridges ); if ( shell_bridges.size() != 1 ) { PRINT_ERROR("Shell %p (in Volume %d) has %d attached ShellSM(s).\n", (void*)shell_ptr, shell_ptr->get_ref_volume_ptr() ? shell_ptr->get_ref_volume_ptr()->id() : 0, shell_bridges.size() ); result = CUBIT_FALSE; } for( i = shell_bridges.size(); i > 0; i-- ) { TopologyBridge* shellsm = shell_bridges.get_and_step(); // Check for missing links between this Shell and parent RefVolume(s) temp_list.clean_out(); shellsm->get_parents( temp_list ); if (temp_list.size() != 1) { PRINT_ERROR("Bad SolidModel Topology!\n"); PRINT_ERROR("ShellSM %p in Shell %p (in Volume %d) has %d parent Lumps.\n", (void*)shellsm, (void*)shell_ptr, shell_ptr->get_ref_volume_ptr() ? shell_ptr->get_ref_volume_ptr()->id() : 0, temp_list.size() ); } else { TopologyBridge* lump = temp_list.get_and_step(); TopologyEntity* te_ptr = lump->topology_entity(); RefVolume* vol_ptr = CAST_TO( te_ptr, RefVolume ); if( (vol_ptr == NULL) || !vol_list.is_in_list(vol_ptr) ) { DLIList<RefFace*> faces; shell_ptr->ref_faces( faces ); CubitString vol_name, face_name; const char* vol_str = "PARENT VOLUME"; const char* face_str = "NO REFFACES"; if( vol_ptr ) { vol_name = vol_ptr->entity_name(); vol_str = vol_name.c_str(); } if( faces.size() ) { face_name = faces.get()->entity_name(); face_str = face_name.c_str(); } if( print ) PRINT_ERROR( "Missing VGI link between %s and Shell with %s\n", vol_str, face_str ); result = CUBIT_FALSE; } } // Build Surface list for next part temp_list.clean_out(); shellsm->get_children( temp_list ); face_bridges.merge_unique( temp_list ); } // Check for extraneous VGI links between this Shell and child RefFaces(s) for( i = face_list.size(); i > 0; i-- ) { RefFace* face_ptr = face_list.get_and_step(); temp_list.clean_out(); face_ptr->bridge_manager()->get_bridge_list( temp_list ); temp_list.intersect( face_bridges ); if( temp_list.size() == 0 ) { DLIList<RefFace*> faces; shell_ptr->ref_faces( faces ); CubitString face_name; const char* face_str = "NO REFFACES"; if( faces.size() ) { face_name = faces.get()->entity_name(); face_str = face_name.c_str(); } if( print ) PRINT_ERROR( "Extraneous VGI link between Shell with %s and %s.\n", face_str, face_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } for( i = face_bridges.size(); i--; ) { TopologyBridge* surface = face_bridges.get_and_step(); TopologyEntity* owner = surface->topology_entity(); RefFace* face_ptr = dynamic_cast<RefFace*>(owner); if( ! face_ptr ) { if( print ) PRINT_ERROR( "No RefFace for Surface %p in Shell %p in %s\n", (void*)surface, (void*)shell_ptr, vol_list.size() ? vol_list.get()->entity_name().c_str() : "NO REFVOLUME" ); result = CUBIT_FALSE; } } return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | RefFace * | face_ptr, |
CubitBoolean | |||
) |
Definition at line 2527 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; int i; // This method checks for // a.) Missing links between the passed RefFace and its parent Shell(s) // b.) Extraneous links between the RefFace and its child Loop(s) // c.) Invalid Loops by calling valid_sm_topology(Loop*) DLIList<Shell*> shell_list; face_ptr->shells( shell_list ); DLIList<Loop*> loop_list; face_ptr->loops( loop_list ); DLIList<TopologyBridge*> face_bridges, loop_bridges, temp_list; face_ptr->bridge_manager()->get_bridge_list( face_bridges ); if ( face_bridges.size() == 0 ) { PRINT_ERROR("%s (RefFace %d) has no attached Surface(s).\n", face_ptr->entity_name().c_str(), face_ptr->id() ); result = CUBIT_FALSE; } for( i = face_bridges.size(); i > 0; i-- ) { TopologyBridge* surf = face_bridges.get_and_step(); // Check for missing links between this RefFace and parent Shell(s) temp_list.clean_out(); surf->get_parents( temp_list ); for( int j = temp_list.size(); j > 0; j-- ) { TopologyBridge* shellsm = temp_list.get_and_step(); TopologyEntity* te_ptr = shellsm->topology_entity(); Shell* shell_ptr = CAST_TO( te_ptr, Shell ); if( (shell_ptr == NULL) || !shell_list.is_in_list(shell_ptr) ) { DLIList<RefVolume*> vols; if( shell_ptr != NULL ) shell_ptr->ref_volumes( vols ); CubitString vol_name; const char* vol_str = "PARENT REFVOLUME"; if( vols.size() ) { vol_name = vols.get()->entity_name(); vol_str = vol_name.c_str(); } if( print ) PRINT_ERROR( "Missing VGI link between Shell with %s and %s\n", vol_str, face_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } // Build LoopSM list for next part temp_list.clean_out(); surf->get_children( temp_list ); loop_bridges.merge_unique( temp_list ); } // Check for extraneous VGI links between this RefFace and child Loop(s) for( i = loop_list.size(); i > 0; i-- ) { Loop* loop_ptr = loop_list.get_and_step(); temp_list.clean_out(); loop_ptr->bridge_manager()->get_bridge_list( temp_list ); temp_list.intersect( loop_bridges ); if( temp_list.size() == 0 ) { DLIList<RefEdge*> edges; loop_ptr->ref_edges( edges ); CubitString edge_name; const char* edge_str = "NO REFEDGE"; if( edges.size() ) { edge_name = edges.get()->entity_name(); edge_str = edge_name.c_str(); } if( print ) PRINT_ERROR( "Extraneous VGI link between %s and Loop with %s.\n", face_ptr->entity_name().c_str(), edge_str ); result = CUBIT_FALSE; } } for( i = loop_bridges.size(); i--; ) { TopologyBridge* loop = loop_bridges.get_and_step(); TopologyEntity* owner = loop->topology_entity(); Loop* loop_ptr = dynamic_cast<Loop*>(owner); if( ! loop_ptr ) { if( print ) PRINT_ERROR( "No Loop for LoopSM %p in %s\n", (void*)loop, face_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } for( i = loop_list.size(); i > 0; i-- ) if( !valid_sm_topology( loop_list.get_and_step(), print ) ) result = CUBIT_FALSE; return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | Loop * | loop_ptr, |
CubitBoolean | |||
) |
Definition at line 2637 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; CoEdge* coedge_ptr; int i; // This method checks for // a.) Missing links between the passed Loop and its parent RefFace(s) // b.) Extraneous links between the Loop and its child CoEdge(s) // c.) Invalid CoEdges by calling valid_sm_topology(CoEdge*) // d.) CoEdgeSMs w/out CoEdges // e.) Correct CoEdge order given CoEdgeSM order. DLIList<RefFace*> face_list; loop_ptr->ref_faces( face_list ); DLIList<CoEdge*> coedge_list; loop_ptr->co_edges( coedge_list ); DLIList<TopologyBridge*> loop_bridges, coedge_bridges, temp_list; loop_ptr->bridge_manager()->get_bridge_list( loop_bridges ); if ( loop_bridges.size() == 0 ) { PRINT_ERROR("Loop %p (in surface %d) has no attached LoopSM(s).\n", (void*)loop_ptr, loop_ptr->get_ref_face_ptr() ? loop_ptr->get_ref_face_ptr()->id() : 0 ); result = CUBIT_FALSE; } for( i = loop_bridges.size(); i > 0; i-- ) { TopologyBridge* loopsm = loop_bridges.get_and_step(); // Check for missing links between this Loop and parent RefFace(s) temp_list.clean_out(); loopsm->get_parents( temp_list ); for( int j = temp_list.size(); j > 0; j-- ) { TopologyBridge* surf = temp_list.get_and_step(); TopologyEntity* te_ptr = surf->topology_entity(); RefFace* face_ptr = CAST_TO( te_ptr, RefFace ); if( (face_ptr == NULL) || !face_list.is_in_list(face_ptr) ) { DLIList<RefEdge*> edges; loop_ptr->ref_edges( edges ); CubitString face_name; CubitString edge_name; const char* face_str = "PARENT REFFACE"; const char* edge_str = "NO REFEDGES"; if( face_ptr ) { face_name = face_ptr->entity_name(); face_str = face_name.c_str(); } if( edges.size() ) { edge_name = edges.get()->entity_name(); edge_str = edge_name.c_str(); } if( print ) PRINT_ERROR( "Missing VGI link between %s and Loop with %s\n", face_str, edge_str); result = CUBIT_FALSE; } } // Build CoEdgeSM list for next part temp_list.clean_out(); loopsm->get_children( temp_list ); coedge_bridges.merge_unique( temp_list ); } // Check for extraneous VGI links between this Loop and child CoEdge(s) for( i = coedge_list.size(); i > 0; i-- ) { coedge_ptr = coedge_list.get_and_step(); temp_list.clean_out(); coedge_ptr->bridge_manager()->get_bridge_list( temp_list ); temp_list.intersect( coedge_bridges ); if( temp_list.size() == 0 ) { DLIList<RefEdge*> edges; DLIList<RefFace*> faces; loop_ptr->ref_faces( faces ); coedge_ptr->ref_edges( edges ); CubitString face_name; CubitString edge_name; const char* face_str = "NO REFFACE"; const char* edge_str = "NO REFEDGE"; if( faces.size() ) { face_name = faces.get()->entity_name(); face_str = face_name.c_str(); } if( edges.size() ) { edge_name = edges.get()->entity_name(); edge_str = edge_name.c_str(); } if( print ) PRINT_ERROR( "Extraneous VGI link between Loop in %s and CoEdge with %s.\n", face_str, edge_str ); result = CUBIT_FALSE; } } // Check for missing CoedgeSMs for( i = coedge_bridges.size(); i--; ) { TopologyBridge* coedge = coedge_bridges.get_and_step(); TopologyEntity* owner = coedge->topology_entity(); coedge_ptr = dynamic_cast<CoEdge*>(owner); if( ! coedge_ptr ) { CubitString face_name = "NO REFFACE"; if( face_list.size() ) face_name = face_list.get()->entity_name(); if( print ) PRINT_ERROR( "No CoEdge for CoEdgeSM %p in Loop %p in %s\n", (void*)coedge, (void*)loop_ptr, face_name.c_str() ); result = CUBIT_FALSE; } } for( i = coedge_list.size(); i > 0; i-- ) if( !valid_sm_topology( coedge_list.get_and_step(), print ) ) result = CUBIT_FALSE; if( !result ) return result; RefFace* face_ptr = loop_ptr->get_ref_face_ptr(); CubitString face_name_str; const char* face_str_ptr = "NO PARENT REFFACE"; if( face_ptr ) { face_name_str = face_ptr->entity_name(); face_str_ptr = face_name_str.c_str(); } // Check correct order of CoEdges for( i = loop_bridges.size(); i--; ) { TopologyBridge* loopsm_ptr = loop_bridges.get_and_step(); coedge_bridges.clean_out(); loopsm_ptr->get_children( coedge_bridges ); if( coedge_bridges.size() != coedge_list.size() ) { if( print ) PRINT_ERROR( "Loop %p in %s has %d coedges, while LoopSM %p has %d coedgesms.\n", (void*)loop_ptr, face_str_ptr, coedge_list.size(), (void*)loopsm_ptr, coedge_bridges.size() ); result = CUBIT_FAILURE; continue; } // Remaining code checks the order of coedges in the loop. // There is no wrong order if only one or two coedges. if( coedge_bridges.size() <= 2 ) continue; coedge_bridges.reset(); coedge_ptr = dynamic_cast<CoEdge*>(coedge_bridges.get()->topology_entity()); if( !coedge_list.move_to( coedge_ptr ) ) continue; coedge_ptr = dynamic_cast<CoEdge*>(coedge_bridges.next()->topology_entity()); if( coedge_list.next() != coedge_ptr && coedge_list.prev() != coedge_ptr ) { if( print ) PRINT_ERROR( "Order of CoEdges in Loop %p in %s is incorrect w.r.t. LoopSM %p.\n", (void*)loop_ptr, face_str_ptr, (void*)loopsm_ptr); result = CUBIT_FAILURE; continue; } bool loop_reversed = false; TopologyBridge* coedge_bridge; if( coedge_list.prev() == coedge_ptr ) { coedge_bridge = coedge_bridges.get(); coedge_bridges.reverse(); coedge_bridges.move_to(coedge_bridge); loop_reversed = true; } for( int j = coedge_bridges.size(); j--; ) { coedge_bridge = coedge_bridges.get_and_step(); coedge_ptr = coedge_list.get_and_step(); if( coedge_bridge->topology_entity() != coedge_ptr ) { if( print ) PRINT_ERROR( "Order of CoEdges in Loop %p in %s is incorrect w.r.t. loopsm %p.\n", (void*)loop_ptr, face_str_ptr, (void*)loopsm_ptr); result = CUBIT_FAILURE; break; } } temp_list.clean_out(); loopsm_ptr->get_parents(temp_list); if (temp_list.size() != 1) continue; bool surf_reversed = (temp_list.get()->bridge_sense() == CUBIT_REVERSED); if (surf_reversed != loop_reversed) { result = CUBIT_FAILURE; if (print) PRINT_ERROR( "Loop %p in %s is reversed w.r.t. loopsm %p.\n", (void*)loop_ptr, face_str_ptr, (void*)loopsm_ptr); } } return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | CoEdge * | coedge_ptr, |
CubitBoolean | |||
) |
Definition at line 2860 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; int i; // This method checks for // a.) Missing links between the passed CoEdge and its parent Loop(s) // b.) Extraneous links between the Loop and its child RefEdge(s) DLIList<Loop*> loop_list; coedge_ptr->loops( loop_list ); DLIList<RefEdge*> edge_list; coedge_ptr->ref_edges( edge_list ); DLIList<TopologyBridge*> coedge_bridges, edge_bridges, temp_list; coedge_ptr->bridge_manager()->get_bridge_list( coedge_bridges ); if ( coedge_bridges.size() == 0 ) { if (print) PRINT_ERROR( "CoEdge %p (curve %d %s in surface %d) has no attached CoEdgeSM(s).\n", (void*)coedge_ptr, coedge_ptr->get_ref_edge_ptr() ? coedge_ptr->get_ref_edge_ptr()->id() : 0, coedge_ptr->get_sense() == CUBIT_FORWARD ? "FORWARD" : coedge_ptr->get_sense() == CUBIT_REVERSED ? "REVERSED" : "UNKNOWN", coedge_ptr->get_ref_face() ? coedge_ptr->get_ref_face()->id() : 0 ); result = CUBIT_FALSE; } for( i = coedge_bridges.size(); i > 0; i-- ) { CoEdgeSM* coedgesm = dynamic_cast<CoEdgeSM*>(coedge_bridges.get_and_step()); // Check for missing links between this CoEdge and parent Loop(s) temp_list.clean_out(); coedgesm->get_parents( temp_list ); if (temp_list.size() != 1) { PRINT_ERROR( "Bad SolidModel topology. CoEdgeSM %p in CoEdge %p " "(curve %d %s in surface %d) has %d parent LoopSMs.\n", (void*)coedgesm, (void*)coedge_ptr, coedge_ptr->get_ref_edge_ptr() ? coedge_ptr->get_ref_edge_ptr()->id() : 0, coedge_ptr->get_sense() == CUBIT_FORWARD ? "FORWARD" : coedge_ptr->get_sense() == CUBIT_REVERSED ? "REVERSED" : "UNKNOWN", coedge_ptr->get_ref_face() ? coedge_ptr->get_ref_face()->id() : 0, temp_list.size() ); continue; } TopologyBridge* loopsm = temp_list.get_and_step(); TopologyEntity* te_ptr = loopsm->topology_entity(); Loop* loop_ptr = CAST_TO( te_ptr, Loop ); if( !loop_ptr ) { const char* edge_str = "NO REFEDGE"; CubitString edge_name; DLIList<RefEdge*> edges; coedge_ptr->ref_edges( edges ); if( edges.size() ) { edge_name = edges.get()->entity_name(); edge_str = edge_name.c_str(); } if( print ) PRINT_ERROR( "Missing VGI Entity for LoopSM %p. Discovered on CoEdge with %s\n", (void*)loopsm, edge_str ); result = CUBIT_FALSE; } else if( !loop_list.is_in_list(loop_ptr) ) { DLIList<RefFace*> faces; DLIList<RefEdge*> edges; loop_ptr->ref_faces( faces ); coedge_ptr->ref_edges( edges ); CubitString face_name, edge_name; const char* face_str = "NO REFFACE"; const char* edge_str = "NO REFEDGE"; if( faces.size() ) { face_name = faces.get()->entity_name(); face_str = face_name.c_str(); } if( edges.size() ) { edge_name = edges.get()->entity_name(); edge_str = edge_name.c_str(); } if( print ) PRINT_ERROR( "Missing VGI link between Loop in %s and CoEdge with %s\n", face_str, edge_str ); result = CUBIT_FALSE; } // Build curve list for next part temp_list.clean_out(); coedgesm->get_children( temp_list ); edge_bridges.merge_unique( temp_list ); // Get curve and surface connected by this CoEdgeSM if (temp_list.size() != 1) // should never happen! continue; TopologyBridge* curv_bridge = temp_list.get(); temp_list.clean_out(); loopsm->get_parents(temp_list); if (temp_list.size() != 1) // should never happen! continue; TopologyBridge* surf_bridge = temp_list.get(); bool curv_reversed = curv_bridge->bridge_sense() == CUBIT_REVERSED; bool surf_reversed = surf_bridge->bridge_sense() == CUBIT_REVERSED; bool want_reversed = curv_reversed != surf_reversed; bool are_reversed = coedgesm->sense() != coedge_ptr->get_sense(); if (want_reversed != are_reversed) { result = CUBIT_FAILURE; if (print) PRINT_ERROR( "CoEdge %p (curve %d %s in surface %d) has wrong sense w.r.t CoEdgeSM.\n", (void*)coedge_ptr, coedge_ptr->get_ref_edge_ptr() ? coedge_ptr->get_ref_edge_ptr()->id() : 0, coedge_ptr->get_sense() == CUBIT_FORWARD ? "FORWARD" : coedge_ptr->get_sense() == CUBIT_REVERSED ? "REVERSED" : "UNKNOWN", coedge_ptr->get_ref_face() ? coedge_ptr->get_ref_face()->id() : 0 ); } } // Check for extraneous VGI links between this CoEdge and child RefEdge(s) for( i = edge_list.size(); i > 0; i-- ) { RefEdge* edge_ptr = edge_list.get_and_step(); temp_list.clean_out(); edge_ptr->bridge_manager()->get_bridge_list( temp_list ); temp_list.intersect( edge_bridges ); if( temp_list.size() == 0 ) { DLIList<RefEdge*> edges; coedge_ptr->ref_edges( edges ); CubitString edge_name; const char* edge_str = "NO REFEDGE"; if( edges.size() ) { edge_name = edges.get()->entity_name(); edge_str = edge_name.c_str(); } if( print ) PRINT_ERROR( "Extraneous VGI link between CoEdge with %s and %s.\n", edge_str, edge_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } for( i = edge_bridges.size(); i--; ) { TopologyBridge* curve = edge_bridges.get_and_step(); TopologyEntity* owner = curve->topology_entity(); RefEdge* edge_ptr = dynamic_cast<RefEdge*>(owner); if( ! edge_ptr ) { DLIList<RefFace*> faces; coedge_ptr->ref_faces( faces ); CubitString face_name = "NO REFFACE"; if( faces.size() ) face_name = faces.get()->entity_name(); if( print ) PRINT_ERROR( "No RefEdge for Curve %p in CoEdge %p in %s\n", (void*)curve, (void*)coedge_ptr, face_name.c_str() ); result = CUBIT_FALSE; } } return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | RefEdge * | edge_ptr, |
CubitBoolean | |||
) |
Definition at line 3035 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; int i; // This method checks for // a.) Missing links between the passed RefEdge and its parent CoEdge(s) // b.) Extraneous links between the RefEdge and its child vert(ex/ices) DLIList<CoEdge*> coedge_list; edge_ptr->co_edges( coedge_list ); DLIList<RefVertex*> vtx_list; edge_ptr->ref_vertices( vtx_list ); DLIList<TopologyBridge*> edge_bridges, vtx_bridges, temp_list; edge_ptr->bridge_manager()->get_bridge_list( edge_bridges ); if ( edge_bridges.size() == 0 ) { PRINT_ERROR("%s (RefEdge %d) has no attached Curve(s).\n", edge_ptr->entity_name().c_str(), edge_ptr->id()); result = CUBIT_FALSE; } for( i = edge_bridges.size(); i > 0; i-- ) { TopologyBridge* curve = edge_bridges.get_and_step(); // Check for missing links between this RefEdge and parent CoEdge(s) temp_list.clean_out(); curve->get_parents( temp_list ); for( int j = temp_list.size(); j > 0; j-- ) { TopologyBridge* coedgesm = temp_list.get_and_step(); TopologyEntity* te_ptr = coedgesm->topology_entity(); CoEdge* coedge_ptr = CAST_TO( te_ptr, CoEdge ); if( (coedge_ptr == NULL) || !coedge_list.is_in_list(coedge_ptr) ) { DLIList<RefFace*> faces; if( coedge_ptr ) coedge_ptr->ref_faces( faces ); CubitString face_name; const char* face_str = "NO REFFACE"; if( faces.size() ) { face_name = faces.get()->entity_name(); face_str = face_name.c_str(); } if( print ) PRINT_ERROR( "Missing VGI link between CoEdge with %s and %s\n", face_str, edge_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } // Build Point list for next part temp_list.clean_out(); curve->get_children( temp_list ); vtx_bridges.merge_unique( temp_list ); } // Check for extraneous VGI links between this RefEdge and child RefVert(s) for( i = vtx_list.size(); i > 0; i-- ) { RefVertex* vtx_ptr = vtx_list.get_and_step(); temp_list.clean_out(); vtx_ptr->bridge_manager()->get_bridge_list( temp_list ); temp_list.intersect( vtx_bridges ); if( temp_list.size() == 0 ) { if( print ) PRINT_ERROR( "Extraneous VGI link between %s and %s.\n", edge_ptr->entity_name().c_str(), vtx_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } for( i = vtx_bridges.size(); i--; ) { TopologyBridge* point = vtx_bridges.get_and_step(); TopologyEntity* owner = point->topology_entity(); RefVertex* vtx_ptr = dynamic_cast<RefVertex*>(owner); if( ! vtx_ptr ) { if( print ) PRINT_ERROR( "No RefVertex for Point %p in %s\n", (void*)point, edge_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } return result; }
CubitBoolean GeometryUtil::valid_sm_topology | ( | RefVertex * | vtx_ptr, |
CubitBoolean | |||
) |
Definition at line 3132 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; int i; // This method checks for // a.) Missing links between the RefVertex and its parent RefEdge(s) DLIList<RefEdge*> edge_list; vtx_ptr->ref_edges( edge_list ); DLIList<TopologyBridge*> vtx_bridges, temp_list; vtx_ptr->bridge_manager()->get_bridge_list( vtx_bridges ); if ( vtx_bridges.size() == 0 ) { PRINT_ERROR("%s (RefVertex %d) has no attached Point(s).\n", vtx_ptr->entity_name().c_str(), vtx_ptr->id()); result = CUBIT_FALSE; } for( i = vtx_bridges.size(); i > 0; i-- ) { TopologyBridge* point = vtx_bridges.get_and_step(); // Check for missing links between this RefVertex and parent RefEdge(s) temp_list.clean_out(); point->get_parents( temp_list ); for( int j = temp_list.size(); j > 0; j-- ) { TopologyBridge* curve = temp_list.get_and_step(); TopologyEntity* te_ptr = curve->topology_entity(); RefEdge* edge_ptr = CAST_TO( te_ptr, RefEdge ); if( !edge_ptr ) { if( print ) PRINT_ERROR( "Missing VGI Entity for Curve %p. Discovered as parent of %s\n", (void*)curve, vtx_ptr->entity_name().c_str() ); result = CUBIT_FAILURE; } else if( !edge_list.is_in_list(edge_ptr) ) { if( print ) PRINT_ERROR( "Missing VGI link between %s and %s\n", edge_ptr->entity_name().c_str(), vtx_ptr->entity_name().c_str() ); result = CUBIT_FALSE; } } } return result; }
CubitBoolean GeometryUtil::valid_topology | ( | TopologyEntity * | topo_ptr, |
CubitBoolean | print_error = CUBIT_TRUE , |
||
DLIList< TopologyEntity * > * | invalid_list = NULL |
||
) |
Definition at line 2038 of file GeometryUtil.cpp.
{ CubitBoolean result = CUBIT_TRUE; DLIList<Shell*> shell_list; DLIList<Loop*> loop_list; DLIList<RefEdge*> edge_list; Shell* shell_ptr; Loop* loop_ptr; RefEdge* edge_ptr; int i; if( CAST_TO( topo_ptr, Body ) || CAST_TO( topo_ptr, CoVolume ) || CAST_TO( topo_ptr, RefVolume ) ) { shell_list.clean_out(); topo_ptr->shells( shell_list ); for( i = shell_list.size(); i > 0; i-- ) { shell_ptr = shell_list.get_and_step(); if( ! valid_shell_cofaces( shell_ptr, print_error ) ) { if( invalid_list ) invalid_list->append( shell_ptr ); result = CUBIT_FALSE; } } } if(CAST_TO( topo_ptr, Body ) || CAST_TO( topo_ptr, CoVolume ) || CAST_TO( topo_ptr, RefVolume ) || CAST_TO( topo_ptr, Shell ) ) { shell_ptr = CAST_TO( topo_ptr, Shell ); if( shell_ptr && !valid_shell_cofaces( shell_ptr, print_error ) ) { if( invalid_list ) invalid_list->append( shell_ptr ); result = CUBIT_FALSE; } } if(CAST_TO( topo_ptr, Body ) || CAST_TO( topo_ptr, CoVolume ) || CAST_TO( topo_ptr, RefVolume ) || CAST_TO( topo_ptr, Shell ) || CAST_TO( topo_ptr, CoFace ) || CAST_TO( topo_ptr, RefFace ) ) { loop_list.clean_out(); topo_ptr->loops( loop_list ); for( i = loop_list.size(); i > 0; i-- ) { loop_ptr = loop_list.get_and_step(); if( ! valid_loop_coedges( loop_ptr, print_error ) ) { if( invalid_list ) invalid_list->append( loop_ptr ); result = CUBIT_FALSE; } } } if(CAST_TO( topo_ptr, Body ) || CAST_TO( topo_ptr, CoVolume ) || CAST_TO( topo_ptr, RefVolume ) || CAST_TO( topo_ptr, Shell ) || CAST_TO( topo_ptr, CoFace ) || CAST_TO( topo_ptr, RefFace ) || CAST_TO( topo_ptr, Loop ) ) { loop_ptr = CAST_TO( topo_ptr, Loop ); if( loop_ptr && !valid_loop_coedges( loop_ptr, print_error ) ) { if( invalid_list ) invalid_list->append( loop_ptr ); result = CUBIT_FALSE; } } if(CAST_TO( topo_ptr, Body ) || CAST_TO( topo_ptr, CoVolume ) || CAST_TO( topo_ptr, RefVolume ) || CAST_TO( topo_ptr, Shell ) || CAST_TO( topo_ptr, CoFace ) || CAST_TO( topo_ptr, RefFace ) || CAST_TO( topo_ptr, Loop ) || CAST_TO( topo_ptr, CoEdge ) ) { edge_list.clean_out(); topo_ptr->ref_edges( edge_list ); for( i = edge_list.size(); i > 0; i-- ) { edge_ptr = edge_list.get_and_step(); if( !valid_edge( edge_ptr, print_error ) ) { if( invalid_list ) invalid_list->append( edge_ptr ); result = CUBIT_FALSE; } } } if(CAST_TO( topo_ptr, Body ) || CAST_TO( topo_ptr, CoVolume ) || CAST_TO( topo_ptr, RefVolume ) || CAST_TO( topo_ptr, Shell ) || CAST_TO( topo_ptr, CoFace ) || CAST_TO( topo_ptr, RefFace ) || CAST_TO( topo_ptr, Loop ) || CAST_TO( topo_ptr, CoEdge ) || CAST_TO( topo_ptr, RefEdge ) ) { edge_ptr = CAST_TO( topo_ptr, RefEdge ); if( edge_ptr && !valid_edge( edge_ptr, print_error ) ) { if( invalid_list ) invalid_list->append( edge_ptr ); result = CUBIT_FALSE; } } else if( CAST_TO( topo_ptr, Chain ) || CAST_TO( topo_ptr, CoVertex ) || CAST_TO( topo_ptr, RefVertex ) ) ;//Do nothing else { if( print_error ) PRINT_WARNING("Unknown entity type '%s' passed to GeometryUtil::" "valid_topology(..).\n",topo_ptr->class_name() ); } return result; }
Definition at line 44 of file GeometryUtil.hpp.
Definition at line 45 of file GeometryUtil.hpp.
GeometryUtil * GeometryUtil::instance_ = NULL [static, private] |
Definition at line 397 of file GeometryUtil.hpp.
int GeometryUtil::linearized_curve_debug_count_ [private] |
Definition at line 399 of file GeometryUtil.hpp.
double GeometryUtil::other_cpu_time |
Definition at line 104 of file GeometryUtil.hpp.
Definition at line 103 of file GeometryUtil.hpp.