cgma
|
#include <ImprintBoundaryTool.hpp>
Definition at line 95 of file ImprintBoundaryTool.hpp.
ImprintBoundaryTool::ImprintBoundaryTool | ( | RefFace * | ref_face_1, |
RefFace * | ref_face_2, | ||
double | tol = GEOMETRY_RESABS |
||
) |
Definition at line 46 of file ImprintBoundaryTool.cpp.
{ refFacePtr1 = ref_face_1; refFacePtr2 = ref_face_2; myTolerance = tol; modBound1 = CUBIT_FALSE; modBound2 = CUBIT_FALSE; allocatedPointData = new PointList; allocatedLineData = new SegList; allocatedPointLoops = new PointLoopList; allocatedLineLoops = new SegLoopList; allocatedMatchData = new DLIList<ImprintMatchData*>; allocatedRefEdge = new DLIList<RefEdge*>; }
Definition at line 65 of file ImprintBoundaryTool.cpp.
{ int ii; for ( ii = allocatedPointData->size(); ii > 0; ii-- ) delete allocatedPointData->pop(); delete allocatedPointData; for ( ii = allocatedLineData->size(); ii > 0; ii-- ) delete allocatedLineData->pop(); delete allocatedLineData; for ( ii = allocatedPointLoops->size(); ii > 0; ii-- ) delete allocatedPointLoops->pop(); delete allocatedPointLoops; for ( ii = allocatedLineLoops->size(); ii > 0; ii-- ) delete allocatedLineLoops->pop(); delete allocatedLineLoops; for ( ii = allocatedMatchData->size(); ii > 0; ii-- ) delete allocatedMatchData->pop(); delete allocatedMatchData; for ( ii = allocatedRefEdge->size(); ii > 0; ii-- ) { RefEdge *tmp_edge_ptr = allocatedRefEdge->pop(); if ( tmp_edge_ptr->num_ref_faces() == 0 ) { RefEntity *tmp_ent = CAST_TO(tmp_edge_ptr, RefEntity); GeometryQueryTool::instance()->delete_RefEntity(tmp_ent); } } }
CubitBoolean ImprintBoundaryTool::are_connected | ( | RefEntity * | ent_1, |
RefEntity * | ent_2, | ||
RefFace * | ref_face | ||
) | [private] |
Definition at line 3497 of file ImprintBoundaryTool.cpp.
{ RefEdge *curve_cur, *curve_nex; RefVertex *vert_cur, *vert_nex; curve_cur = CAST_TO(ent_1, RefEdge); curve_nex = CAST_TO(ent_2, RefEdge); vert_cur = CAST_TO(ent_1, RefVertex); vert_nex = CAST_TO(ent_2, RefVertex); //just do some sanity checking first. Really shouldn't happen... if ( !curve_cur && !vert_cur ) { assert(curve_cur || vert_cur); PRINT_ERROR("messed up logic!!!! in ImprintBoundaryTool::are_connected\n"); return CUBIT_FALSE; } if ( !curve_nex && !vert_nex ) { assert(curve_nex || vert_nex); PRINT_ERROR("messed up logic!!!! in ImprintBoundaryTool::are_connected\n"); return CUBIT_FALSE; } if ( curve_cur ) { if ( curve_cur == curve_nex ) return CUBIT_TRUE; if ( !vert_nex && curve_nex ) return CUBIT_FALSE; if ( vert_nex && !curve_nex ) { if ( curve_cur->start_vertex() == vert_nex || curve_cur->end_vertex() == vert_nex ) return CUBIT_TRUE; else return CUBIT_FALSE; } } else if ( vert_cur ) { if ( vert_nex == vert_cur ) return CUBIT_TRUE; if ( !curve_nex && vert_nex ) { if ( vert_nex == vert_cur ) { assert(0); PRINT_ERROR("Next and cur have same vertex in\n" "ImprintBoundaryTool::are_connected.\n"); return CUBIT_TRUE; } else if ( vert_cur->common_ref_edge(vert_nex, ref_face) ) return CUBIT_TRUE; else return CUBIT_FALSE; } if ( !vert_nex && curve_nex ) { if ( curve_nex->start_vertex() == vert_cur || curve_nex->end_vertex() == vert_cur ) return CUBIT_TRUE; else return CUBIT_FALSE; } } assert(0); PRINT_ERROR("ImprintBoundaryTool::are_connected failed\n"); return CUBIT_FALSE; }
CubitStatus ImprintBoundaryTool::case_0_2_equal | ( | ImprintLineSegment * | seg_1, |
ImprintLineSegment * | seg_2, | ||
ImprintPointData * | imp_point_0, | ||
ImprintPointData * | imp_point_1, | ||
ImprintPointData * | imp_point_2, | ||
ImprintPointData * | imp_point_3, | ||
MatchType | type_1, | ||
MatchType | type_3, | ||
IntersectResult & | int_result, | ||
ImprintLineSegment ** | new_segments | ||
) | [private] |
Definition at line 1793 of file ImprintBoundaryTool.cpp.
{ //Okay at this point we know that point_0 and point_2 are //equal, and we know that point_1 doesn't match an end_point. //We know then that this is either an L or a overlap-join. //Test to see if point_1 is on seg_2 or point_3 is on seg_1. //If neither then we have an L, other wise an overlap-join. CubitBoolean point_1_on_seg_2 =CUBIT_FALSE; CubitBoolean point_3_on_seg_1 =CUBIT_FALSE; if ( on_interior_segment(imp_point_1, seg_2) ) point_1_on_seg_2 = CUBIT_TRUE; if ( on_interior_segment(imp_point_3, seg_1) ) point_3_on_seg_1 = CUBIT_TRUE; if ( !point_1_on_seg_2 && !point_3_on_seg_1 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_2\n"); int_result = L_INTERSECT_0_2; set_type_for_L(imp_point_0, imp_point_2); return CUBIT_SUCCESS; } else if (point_1_on_seg_2 ) { if (type_1 == MATCH_1_6 ) { double dist_1 = (imp_point_1->coordinates() - seg_2->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_1, seg_2, point_on_seg_2); double dist_2 = (imp_point_1->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_2\n"); int_result = L_INTERSECT_0_2; set_type_for_L(imp_point_0, imp_point_2); return CUBIT_SUCCESS; } } else if (type_1 == MATCH_1_7 ) { double dist_1 = (imp_point_1->coordinates() - seg_2->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_1, seg_2, point_on_seg_2); double dist_2 = (imp_point_1->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_2\n"); int_result = L_INTERSECT_0_2; set_type_for_L(imp_point_0, imp_point_2); return CUBIT_SUCCESS; } } } else if (point_3_on_seg_1 ) { if (type_3 == MATCH_3_4 ) { double dist_1 = (imp_point_3->coordinates() - seg_1->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_3, seg_1, point_on_seg_1); double dist_2 = (imp_point_3->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_2\n"); int_result = L_INTERSECT_0_2; set_type_for_L(imp_point_0, imp_point_2); return CUBIT_SUCCESS; } } else if (type_3 == MATCH_3_5 ) { double dist_1 = (imp_point_3->coordinates() - seg_1->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_3, seg_1, point_on_seg_1); double dist_2 = (imp_point_3->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_2\n"); int_result = L_INTERSECT_0_2; set_type_for_L(imp_point_0, imp_point_2); return CUBIT_SUCCESS; } } } if ( point_1_on_seg_2 ) { //This is an overlap_join. PRINT_DEBUG_129("Found OVERALP_JOIN_02_1_3\n"); int_result = OVERLAP_JOIN_02_1_3; //Create the new segments, the first segment remains the same so //leave positions 0 and 1 empty. ImprintLineSegment *new_seg_2_1, *new_seg_1_3; //copy point 1 to use on segment 2 CubitVector closest_point; closest_point_seg( imp_point_1, seg_2, closest_point); ImprintPointData *new_point_1 = new ImprintPointData(imp_point_1, closest_point); new_point_1->owner(seg_2->owner()); allocatedPointData->append(new_point_1); if ( imp_point_1->is_owner_vertex() ) { new_point_1->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_1->get_point_type() != CREATE_NEW_VERTEX ) imp_point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_1->set_point_type(ON_BOTH_BOUNDARIES); imp_point_1->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_2_1 = new ImprintLineSegment(imp_point_2, new_point_1, seg_2->owner()); new_seg_1_3 = new ImprintLineSegment(new_point_1, imp_point_3, seg_2->owner()); new_segments[2] = new_seg_2_1; new_segments[3] = new_seg_1_3; allocatedLineData->append(new_segments[2]); allocatedLineData->append(new_segments[3]); //update the lists. update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( point_3_on_seg_1 ) { //This is an overlap_join. PRINT_DEBUG_129("Found OVERALP_JOIN_02_3_1\n"); int_result = OVERLAP_JOIN_02_3_1; //Create the new segments, the first segment remains the same so //leave positions 0 and 1 empty. ImprintLineSegment *new_seg_0_3, *new_seg_3_1; //copy point 3 to use on segment 1 CubitVector closest_point; closest_point_seg( imp_point_3, seg_1, closest_point); ImprintPointData *new_point_3 = new ImprintPointData(imp_point_3, closest_point); new_point_3->owner(seg_1->owner()); allocatedPointData->append(new_point_3); if ( imp_point_3->is_owner_vertex() ) { new_point_3->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_3->get_point_type() != CREATE_NEW_VERTEX ) imp_point_3->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_3->set_point_type(ON_BOTH_BOUNDARIES); imp_point_3->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_0_3 = new ImprintLineSegment(imp_point_0, new_point_3, seg_1->owner()); new_seg_3_1 = new ImprintLineSegment(new_point_3, imp_point_1, seg_1->owner()); new_segments[0] = new_seg_0_3; new_segments[1] = new_seg_3_1; allocatedLineData->append(new_segments[0]); allocatedLineData->append(new_segments[1]); //update the lists update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); seg_1->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else { //For this case we must have an L condition. set_type_for_L(imp_point_0, imp_point_2); PRINT_DEBUG_129("Found L_INTERSECT_0_2\n"); int_result = L_INTERSECT_0_2; return CUBIT_SUCCESS; } }
CubitStatus ImprintBoundaryTool::case_0_3_equal | ( | ImprintLineSegment * | seg_1, |
ImprintLineSegment * | seg_2, | ||
ImprintPointData * | imp_point_0, | ||
ImprintPointData * | imp_point_1, | ||
ImprintPointData * | imp_point_2, | ||
ImprintPointData * | imp_point_3, | ||
MatchType | type_1, | ||
MatchType | type_2, | ||
IntersectResult & | int_result, | ||
ImprintLineSegment ** | new_segments | ||
) | [private] |
Definition at line 1974 of file ImprintBoundaryTool.cpp.
{ //Okay at this point we know that point_0 and point_3 are //equal, and we know that point_1 doesn't match an end_point. //We know then that this is either an L or a overlap-join. //Test to see if point_1 is on seg_2 or point_2 is on seg_1. //If neither then we have an L, other wise an overlap-join. CubitBoolean point_1_on_seg_2 =CUBIT_FALSE; CubitBoolean point_2_on_seg_1 =CUBIT_FALSE; if ( on_interior_segment(imp_point_1, seg_2) ) point_1_on_seg_2 = CUBIT_TRUE; if ( on_interior_segment(imp_point_2, seg_1) ) point_2_on_seg_1 = CUBIT_TRUE; if ( !point_1_on_seg_2 && !point_2_on_seg_1 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_3\n"); int_result = L_INTERSECT_0_3; set_type_for_L(imp_point_0, imp_point_3); return CUBIT_SUCCESS; } else if (point_1_on_seg_2 ) { if (type_1 == MATCH_1_6 ) { double dist_1 = (imp_point_1->coordinates() - seg_2->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_1, seg_2, point_on_seg_2); double dist_2 = (imp_point_1->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_3\n"); int_result = L_INTERSECT_0_3; set_type_for_L(imp_point_0, imp_point_3); return CUBIT_SUCCESS; } } else if (type_1 == MATCH_1_7 ) { double dist_1 = (imp_point_1->coordinates() - seg_2->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_1, seg_2, point_on_seg_2); double dist_2 = (imp_point_1->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_3\n"); int_result = L_INTERSECT_0_3; set_type_for_L(imp_point_0, imp_point_3); return CUBIT_SUCCESS; } } } else if (point_2_on_seg_1 ) { if (type_2 == MATCH_2_4 ) { double dist_1 = (imp_point_2->coordinates() - seg_1->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_2, seg_1, point_on_seg_1); double dist_2 = (imp_point_2->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_3\n"); int_result = L_INTERSECT_0_3; set_type_for_L(imp_point_0, imp_point_3); return CUBIT_SUCCESS; } } else if (type_2 == MATCH_2_5 ) { double dist_1 = (imp_point_2->coordinates() - seg_1->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_2, seg_1, point_on_seg_1); double dist_2 = (imp_point_2->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_0_3\n"); int_result = L_INTERSECT_0_3; set_type_for_L(imp_point_0, imp_point_3); return CUBIT_SUCCESS; } } } if ( point_1_on_seg_2 ) { //This is an overlap_join. PRINT_DEBUG_129("Found OVERALP_JOIN_03_1_2\n"); //double dist = (imp_point_1->coordinates() - imp_point_2->coordinates()).length(); int_result = OVERLAP_JOIN_03_1_2; //Create the new segments, the first segment remains the same so //leave positions 0 and 1 empty. ImprintLineSegment *new_seg_2_1, *new_seg_1_3; //copy point 1 to use on segment 2 CubitVector closest_point; closest_point_seg( imp_point_1, seg_2, closest_point); ImprintPointData *new_point_1 = new ImprintPointData(imp_point_1, closest_point); new_point_1->owner(seg_2->owner()); allocatedPointData->append(new_point_1); if ( imp_point_1->is_owner_vertex() ) { new_point_1->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_1->get_point_type() != CREATE_NEW_VERTEX ) imp_point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_1->set_point_type(ON_BOTH_BOUNDARIES); imp_point_1->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_2_1 = new ImprintLineSegment(imp_point_2, new_point_1, seg_2->owner()); new_seg_1_3 = new ImprintLineSegment(new_point_1, imp_point_3, seg_2->owner()); new_segments[2] = new_seg_2_1; new_segments[3] = new_seg_1_3; allocatedLineData->append(new_segments[2]); allocatedLineData->append(new_segments[3]); //update the list. update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( point_2_on_seg_1 ) { //This is an overlap_join. PRINT_DEBUG_129("Found OVERALP_JOIN_03_2_1\n"); int_result = OVERLAP_JOIN_03_2_1; //Create the new segments, the first segment remains the same so //leave positions 0 and 1 empty. ImprintLineSegment *new_seg_0_2, *new_seg_2_1; //copy point 1 to use on segment 2 CubitVector closest_point; closest_point_seg( imp_point_2, seg_1, closest_point); ImprintPointData *new_point_2 = new ImprintPointData(imp_point_2, closest_point); new_point_2->owner(seg_1->owner()); allocatedPointData->append(new_point_2); if ( imp_point_2->is_owner_vertex() ) { new_point_2->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_2->get_point_type() != CREATE_NEW_VERTEX ) imp_point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_2->set_point_type(ON_BOTH_BOUNDARIES); imp_point_2->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_0_2 = new ImprintLineSegment(imp_point_0, new_point_2, seg_1->owner()); new_seg_2_1 = new ImprintLineSegment(new_point_2, imp_point_1, seg_1->owner()); new_segments[0] = new_seg_0_2; new_segments[1] = new_seg_2_1; allocatedLineData->append(new_segments[0]); allocatedLineData->append(new_segments[1]); //update the list. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); seg_1->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else { //For this case we must have an L condition. set_type_for_L(imp_point_0, imp_point_3); PRINT_DEBUG_129("Found L_INTERSECT_0_3\n"); int_result = L_INTERSECT_0_3; return CUBIT_SUCCESS; } }
CubitStatus ImprintBoundaryTool::case_1_2_equal | ( | ImprintLineSegment * | seg_1, |
ImprintLineSegment * | seg_2, | ||
ImprintPointData * | imp_point_0, | ||
ImprintPointData * | imp_point_1, | ||
ImprintPointData * | imp_point_2, | ||
ImprintPointData * | imp_point_3, | ||
MatchType | type_0, | ||
MatchType | type_3, | ||
IntersectResult & | int_result, | ||
ImprintLineSegment ** | new_segments | ||
) | [private] |
Definition at line 2158 of file ImprintBoundaryTool.cpp.
{ //Okay at this point we know that point_1 and point_2 are //equal, and we know that point_0 doesn't match an end_point. //We know then that this is either an L or a overlap-join. //Test to see if point_0 is on seg_2 or point_3 is on seg_1. //If neither then we have an L, other wise an overlap-join. CubitBoolean point_0_on_seg_2 =CUBIT_FALSE; CubitBoolean point_3_on_seg_1 =CUBIT_FALSE; if ( on_interior_segment(imp_point_0, seg_2) ) point_0_on_seg_2 = CUBIT_TRUE; if ( on_interior_segment(imp_point_3, seg_1) ) point_3_on_seg_1 = CUBIT_TRUE; if ( !point_0_on_seg_2 && !point_3_on_seg_1 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_2\n"); int_result = L_INTERSECT_1_2; set_type_for_L(imp_point_1, imp_point_2); return CUBIT_SUCCESS; } else if (point_0_on_seg_2 ) { if (type_0 == MATCH_0_6 ) { double dist_1 = (imp_point_0->coordinates() - seg_2->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_0, seg_2, point_on_seg_2); double dist_2 = (imp_point_0->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_2\n"); int_result = L_INTERSECT_1_2; set_type_for_L(imp_point_1, imp_point_2); return CUBIT_SUCCESS; } } else if (type_0 == MATCH_0_7 ) { double dist_1 = (imp_point_0->coordinates() - seg_2->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_0, seg_2, point_on_seg_2); double dist_2 = (imp_point_0->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_2\n"); int_result = L_INTERSECT_1_2; set_type_for_L(imp_point_1, imp_point_2); return CUBIT_SUCCESS; } } } else if (point_3_on_seg_1 ) { if (type_3 == MATCH_3_4 ) { double dist_1 = (imp_point_3->coordinates() - seg_1->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_3, seg_1, point_on_seg_1); double dist_2 = (imp_point_3->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_2\n"); int_result = L_INTERSECT_1_2; set_type_for_L(imp_point_1, imp_point_2); return CUBIT_SUCCESS; } } else if (type_3 == MATCH_3_5 ) { double dist_1 = (imp_point_3->coordinates() - seg_1->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_3, seg_1, point_on_seg_1); double dist_2 = (imp_point_3->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_2\n"); int_result = L_INTERSECT_1_2; set_type_for_L(imp_point_1, imp_point_2); return CUBIT_SUCCESS; } } } if ( point_0_on_seg_2 ) { //This is an overlap_join. PRINT_DEBUG_129("Found OVERALP_JOIN_12_0_3\n"); int_result = OVERLAP_JOIN_12_0_3; //Create the new segments, the first segment remains the same so //leave positions 0 and 1 empty. ImprintLineSegment *new_seg_2_0, *new_seg_0_3; //copy point 1 to use on segment 2 CubitVector closest_point; closest_point_seg( imp_point_0, seg_2, closest_point); ImprintPointData *new_point_0 = new ImprintPointData(imp_point_0, closest_point); new_point_0->owner(seg_2->owner()); allocatedPointData->append(new_point_0); if ( imp_point_0->is_owner_vertex() ) { new_point_0->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_0->get_point_type() != CREATE_NEW_VERTEX ) imp_point_0->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_0->set_point_type(ON_BOTH_BOUNDARIES); imp_point_0->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_2_0 = new ImprintLineSegment(imp_point_2, new_point_0, seg_2->owner()); new_seg_0_3 = new ImprintLineSegment(new_point_0, imp_point_3, seg_2->owner()); new_segments[2] = new_seg_2_0; new_segments[3] = new_seg_0_3; allocatedLineData->append(new_segments[2]); allocatedLineData->append(new_segments[3]); //update the list. update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( point_3_on_seg_1 ) { //This is an overlap_join. PRINT_DEBUG_129("Found OVERALP_JOIN_12_3_0\n"); int_result = OVERLAP_JOIN_12_3_0; //Create the new segments, the first segment remains the same so //leave positions 0 and 1 empty. ImprintLineSegment *new_seg_3_1, *new_seg_0_3; //copy point 3 to use on segment 1 CubitVector closest_point; closest_point_seg( imp_point_3, seg_1, closest_point); ImprintPointData *new_point_3 = new ImprintPointData(imp_point_3, closest_point); new_point_3->owner(seg_1->owner()); allocatedPointData->append(new_point_3); if ( imp_point_3->is_owner_vertex() ) { new_point_3->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_3->get_point_type() != CREATE_NEW_VERTEX ) imp_point_3->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_3->set_point_type(ON_BOTH_BOUNDARIES); imp_point_3->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_0_3 = new ImprintLineSegment(imp_point_0, new_point_3, seg_1->owner()); new_seg_3_1 = new ImprintLineSegment(new_point_3, imp_point_1, seg_1->owner()); new_segments[0] = new_seg_0_3; new_segments[1] = new_seg_3_1; allocatedLineData->append(new_segments[0]); allocatedLineData->append(new_segments[1]); //update the list. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); seg_1->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else { //For this case we must have an L condition. set_type_for_L(imp_point_1, imp_point_2); PRINT_DEBUG_129("Found L_INTERSECT_1_2\n"); int_result = L_INTERSECT_1_2; return CUBIT_SUCCESS; } }
CubitStatus ImprintBoundaryTool::case_1_3_equal | ( | ImprintLineSegment * | seg_1, |
ImprintLineSegment * | seg_2, | ||
ImprintPointData * | imp_point_0, | ||
ImprintPointData * | imp_point_1, | ||
ImprintPointData * | imp_point_2, | ||
ImprintPointData * | imp_point_3, | ||
MatchType | type_0, | ||
MatchType | type_2, | ||
IntersectResult & | int_result, | ||
ImprintLineSegment ** | new_segments | ||
) | [private] |
Definition at line 2489 of file ImprintBoundaryTool.cpp.
{ //Okay at this point we know that point_1 and point_3 are //equal, and we know that point_0 doesn't match an end_point. //We know then that this is either an L or a overlap-join. //Test to see if point_0 is on seg_2 or point_2 is on seg_1. //If neither then we have an L, other wise an overlap-join. //First test to see if they are are on the segments. CubitBoolean point_0_on_seg_2 =CUBIT_FALSE; CubitBoolean point_2_on_seg_1 =CUBIT_FALSE; if ( on_interior_segment(imp_point_0, seg_2) ) point_0_on_seg_2 = CUBIT_TRUE; if ( on_interior_segment(imp_point_2, seg_1) ) point_2_on_seg_1 = CUBIT_TRUE; if ( !point_0_on_seg_2 && !point_2_on_seg_1 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_3\n"); int_result = L_INTERSECT_1_3; set_type_for_L(imp_point_1, imp_point_3); return CUBIT_SUCCESS; } //Now resolve if there is a closer match to one of the other //points. else if (point_0_on_seg_2 ) { if (type_0 == MATCH_0_6 ) { double dist_1 = (imp_point_0->coordinates() - seg_2->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_0, seg_2, point_on_seg_2); double dist_2 = (imp_point_0->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_3\n"); int_result = L_INTERSECT_1_3; set_type_for_L(imp_point_1, imp_point_3); return CUBIT_SUCCESS; } } else if (type_0 == MATCH_0_7 ) { double dist_1 = (imp_point_0->coordinates() - seg_2->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_0, seg_2, point_on_seg_2); double dist_2 = (imp_point_0->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_3\n"); int_result = L_INTERSECT_1_3; set_type_for_L(imp_point_1, imp_point_3); return CUBIT_SUCCESS; } } } else if (point_2_on_seg_1 ) { if (type_2 == MATCH_2_4 ) { double dist_1 = (imp_point_2->coordinates() - seg_1->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_2, seg_1, point_on_seg_1); double dist_2 = (imp_point_2->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_3\n"); int_result = L_INTERSECT_1_3; set_type_for_L(imp_point_1, imp_point_3); return CUBIT_SUCCESS; } } else if (type_2 == MATCH_2_5 ) { double dist_1 = (imp_point_2->coordinates() - seg_1->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_2, seg_1, point_on_seg_1); double dist_2 = (imp_point_2->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) { PRINT_DEBUG_129("Found L_INTERSECT_1_3\n"); int_result = L_INTERSECT_1_3; set_type_for_L(imp_point_1, imp_point_3); return CUBIT_SUCCESS; } } } if ( point_0_on_seg_2 ) { //This is an overlap_join. PRINT_DEBUG_129("Found OVERLAP_JOIN_13_0_2\n"); int_result = OVERLAP_JOIN_13_0_2; //Create the new segments, the first segment remains the same so //leave positions 0 and 1 empty. ImprintLineSegment *new_seg_2_0, *new_seg_0_3; //copy point 0 to use on segment 2 CubitVector closest_point; closest_point_seg( imp_point_0, seg_2, closest_point); ImprintPointData *new_point_0 = new ImprintPointData(imp_point_0, closest_point); new_point_0->owner(seg_2->owner()); allocatedPointData->append(new_point_0); if ( imp_point_0->is_owner_vertex() ) { new_point_0->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_0->get_point_type() != CREATE_NEW_VERTEX ) imp_point_0->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_0->set_point_type(ON_BOTH_BOUNDARIES); imp_point_0->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_2_0 = new ImprintLineSegment(imp_point_2, new_point_0, seg_2->owner()); new_seg_0_3 = new ImprintLineSegment(new_point_0, imp_point_3, seg_2->owner()); new_segments[2] = new_seg_2_0; new_segments[3] = new_seg_0_3; allocatedLineData->append(new_segments[2]); allocatedLineData->append(new_segments[3]); //update the list. update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( point_2_on_seg_1 ) { //This is an overlap_join. PRINT_DEBUG_129("Found OVERLAP_JOIN_13_2_0\n"); int_result = OVERLAP_JOIN_13_2_0; //Create the new segments, the first segment remains the same so //leave positions 0 and 1 empty. ImprintLineSegment *new_seg_0_2, *new_seg_2_1; //copy point 2 to use on segment 1 CubitVector closest_point; closest_point_seg( imp_point_2, seg_1, closest_point); ImprintPointData *new_point_2 = new ImprintPointData(imp_point_2, closest_point); new_point_2->owner(seg_1->owner()); allocatedPointData->append(new_point_2); if ( imp_point_2->is_owner_vertex() ) { new_point_2->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_2->get_point_type() != CREATE_NEW_VERTEX ) imp_point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_2->set_point_type(ON_BOTH_BOUNDARIES); imp_point_2->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_0_2 = new ImprintLineSegment(imp_point_0, new_point_2, seg_1->owner()); new_seg_2_1 = new ImprintLineSegment(new_point_2, imp_point_1, seg_1->owner()); new_segments[0] = new_seg_0_2; new_segments[1] = new_seg_2_1; allocatedLineData->append(new_segments[0]); allocatedLineData->append(new_segments[1]); //update the list. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); seg_1->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else { //For this case we must have an L condition. set_type_for_L(imp_point_1, imp_point_3); PRINT_DEBUG_129("Found L_INTERSECT_1_3\n"); int_result = L_INTERSECT_1_3; return CUBIT_SUCCESS; } }
CubitBoolean ImprintBoundaryTool::closest_point_interior_seg | ( | ImprintPointData * | point, |
ImprintLineSegment * | line, | ||
CubitVector & | closest_point | ||
) | [private] |
Definition at line 2789 of file ImprintBoundaryTool.cpp.
{ //Find the closest point between this line and the point. double node[3]; double point_0[3], point_1[3]; CubitVector point_v = point->coordinates(); node[0] = point_v.x(); node[1] = point_v.y(); node[2] = point_v.z(); CubitVector start_v = line->get_start()->coordinates(); CubitVector end_v = line->get_end()->coordinates(); point_0[0] = start_v.x(); point_0[1] = start_v.y(); point_0[2] = start_v.z(); point_1[0] = end_v.x(); point_1[1] = end_v.y(); point_1[2] = end_v.z(); //use geometry_resabs rather than tolerance to get more accuracy. IntersectionTool new_tool(GEOMETRY_RESABS); double t; double dist = new_tool.distance_point_line(node, point_0, point_1, t); if ( dist < 0.0 ) { return CUBIT_FALSE; } else { CubitVector p_0_1 = end_v - start_v; closest_point = start_v + t*p_0_1; } return CUBIT_TRUE; }
CubitStatus ImprintBoundaryTool::closest_point_seg | ( | ImprintPointData * | point, |
ImprintLineSegment * | line, | ||
CubitVector & | closest_point | ||
) | [private] |
Definition at line 2824 of file ImprintBoundaryTool.cpp.
{ //Find the closest point between this line and the point. double node[3]; double point_0[3], point_1[3]; CubitVector point_v = point->coordinates(); node[0] = point_v.x(); node[1] = point_v.y(); node[2] = point_v.z(); CubitVector start_v = line->get_start()->coordinates(); CubitVector end_v = line->get_end()->coordinates(); point_0[0] = start_v.x(); point_0[1] = start_v.y(); point_0[2] = start_v.z(); point_1[0] = end_v.x(); point_1[1] = end_v.y(); point_1[2] = end_v.z(); //use geometry_resabs rather than tolerance to get more accuracy. IntersectionTool new_tool(GEOMETRY_RESABS); double t; double dist = new_tool.distance_point_line(node, point_0, point_1, t); if ( dist < 0.0 ) { //This happens if the point is beyond the line segment, in which //case we just want the closer end point. if ( t < 0.0 ) { closest_point = start_v; } else { closest_point = end_v; } } else { CubitVector p_0_1 = end_v - start_v; closest_point = start_v + t*p_0_1; } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::closest_point_seg | ( | CubitVector & | point_v, |
ImprintLineSegment * | line, | ||
CubitVector & | closest_point | ||
) | [private] |
Definition at line 2868 of file ImprintBoundaryTool.cpp.
{ //Find the closest point between this line and the point. double node[3]; double point_0[3], point_1[3]; node[0] = point_v.x(); node[1] = point_v.y(); node[2] = point_v.z(); CubitVector start_v = line->get_start()->coordinates(); CubitVector end_v = line->get_end()->coordinates(); point_0[0] = start_v.x(); point_0[1] = start_v.y(); point_0[2] = start_v.z(); point_1[0] = end_v.x(); point_1[1] = end_v.y(); point_1[2] = end_v.z(); //use geometry_resabs rather than tolerance to get more accuracy. IntersectionTool new_tool(GEOMETRY_RESABS); double t; double dist = new_tool.distance_point_line(node, point_0, point_1, t); if ( dist < 0.0 ) { //This happens if the point is beyond the line segment, in which //case we just want the closer end point. if ( t < 0.0 ) { closest_point = start_v; } else { closest_point = end_v; } } else { CubitVector p_0_1 = end_v - start_v; closest_point = start_v + t*p_0_1; } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::convert_to_lines | ( | PointLoopList & | boundary_point_loops, |
SegLoopList & | boundary_line_loops, | ||
RefFace * | ref_face, | ||
const CubitBoolean | boundary_1 | ||
) | [private] |
Definition at line 2912 of file ImprintBoundaryTool.cpp.
{ //This does more than just converts the boundary points to line segments. It also //Sets up a doubily linked list through the ImprintLineSegment data structure. //Calling codes need to make sure all this data is deleted. //This function also sets the PointType for each of the boundary points. This //will depend also on the boundary_1 flag. If we are doing boundary_1 then, //the flag will be true, otherwise it will be false. int ii, jj; PointList *point_list; SegList *segment_list; ImprintLineSegment *new_line, *prev = NULL; RefEntity *entity_start, *entity_end, *seg_owner; boundary_point_loops.reset(); PointType vertex_on_boundary, on_boundary; if ( boundary_1 ) { vertex_on_boundary = VERTEX_ON_BOUNDARY_1; on_boundary = ON_BOUNDARY_1; } else { vertex_on_boundary = VERTEX_ON_BOUNDARY_2; on_boundary = ON_BOUNDARY_2; } for ( ii = boundary_point_loops.size(); ii > 0; ii-- ) { point_list = boundary_point_loops.get_and_step(); segment_list = new SegList; prev = NULL; new_line = NULL; seg_owner = NULL; for ( jj = point_list->size(); jj > 0; jj-- ) { entity_start = point_list->get()->owner(); entity_end = point_list->next()->owner(); seg_owner = CAST_TO(entity_start, RefEdge); if ( seg_owner == NULL ) { seg_owner = CAST_TO(entity_end, RefEdge); if ( seg_owner == NULL ) { RefVertex *ref_vert_end = CAST_TO(entity_end, RefVertex); RefVertex *ref_vert_start = CAST_TO(entity_start, RefVertex); DLIList <RefEdge*> common_edges; ref_vert_start->common_ref_edges(ref_vert_end, common_edges, ref_face); if ( common_edges.size() == 0 ) { PRINT_ERROR("ImprintBoundaryTool::convert_to_lines having problem finding owner of boundary\n" "segment.\n"); return CUBIT_FAILURE; } if ( common_edges.size() == 1 ) seg_owner = common_edges.get(); else { //Now we have to decide which of these edges is the one. //Lets take a mid point on this segment and check the distances. //First find the mid_point of the line segment. CubitVector start = point_list->get()->coordinates(); CubitVector end = point_list->next()->coordinates(); CubitVector mid = (start+end)/2.0; CubitVector closest_point; //Now test the edges to see which is closest. RefEdge *closest_edge = NULL, *curr_ref_edge; double min_dist = CUBIT_DBL_MAX, dist; int kk; for ( kk = common_edges.size(); kk > 0; kk-- ) { curr_ref_edge = common_edges.get_and_step(); curr_ref_edge->closest_point(mid, closest_point); dist = (mid - closest_point).length_squared(); if ( dist < min_dist ) { min_dist = dist; closest_edge = curr_ref_edge; } } if ( closest_edge == NULL ) { PRINT_ERROR("Problems determining segment ownwership.\n" "Internal problem with virtual imprinting.\n"); boundary_line_loops.clean_out(); return CUBIT_FAILURE; } seg_owner = closest_edge; } } } new_line = new ImprintLineSegment( point_list->get(), point_list->next(), seg_owner); allocatedLineData->append(new_line); //Now for use later on, set the point type. This will be useful //when we get to the intersection parts. if ( CAST_TO(entity_start, RefEdge) != NULL ) { new_line->get_start()->set_point_type(on_boundary); } else { assert( CAST_TO(entity_start, RefVertex) != NULL ); new_line->get_start()->set_point_type(vertex_on_boundary); } if ( CAST_TO(entity_end, RefEdge) != NULL ) { new_line->get_end()->set_point_type(on_boundary); } else { assert( CAST_TO(entity_end, RefVertex) != NULL ); new_line->get_end()->set_point_type(vertex_on_boundary); } point_list->step(); segment_list->append(new_line); if ( prev != NULL ) { prev->set_next(new_line); new_line->set_prev(prev); } prev = new_line; } if ( prev != NULL ) { segment_list->reset(); assert(prev == segment_list->prev()); segment_list->prev()->set_next(segment_list->get()); segment_list->get()->set_prev(segment_list->prev()); assert(segment_list->get()->get_next() != NULL ); } if ( segment_list->size() ) { boundary_line_loops.append(segment_list); allocatedLineLoops->append(segment_list); } else delete segment_list; } return CUBIT_SUCCESS; }
RefEdge * ImprintBoundaryTool::create_virtual_edge | ( | RefVertex * | start, |
RefVertex * | end, | ||
DLIList< CubitVector * > & | interior_points | ||
) | [private] |
Determine if the match should be ingored or not (if creating the match would make the loop self intersect.)
Definition at line 5949 of file ImprintBoundaryTool.cpp.
{ //Create CubitPoints for all of these locations. DLIList<CubitPoint*> point_list; CubitPoint *start_p = (CubitPoint*) new CubitPointData(start->coordinates()); CubitPoint *end_p = (CubitPoint*) new CubitPointData(end->coordinates()); CubitPoint *new_point, *prev_point; int ii; CubitVector *curr_pos; interior_points.reset(); CubitFacetEdge *new_edge; prev_point = start_p; DLIList<CubitFacetEdge*> edge_list; point_list.append(start_p); for ( ii = 0; ii < interior_points.size(); ii++ ) { curr_pos = interior_points.get_and_step(); new_point = (CubitPoint*) new CubitPointData(*curr_pos); point_list.append(new_point); new_edge = (CubitFacetEdge*) new CubitFacetEdgeData(prev_point, new_point); edge_list.append(new_edge); prev_point = new_point; } //create the last edge. new_edge = (CubitFacetEdge*) new CubitFacetEdgeData(prev_point, end_p); point_list.append(end_p); edge_list.append(new_edge); CurveFacetEvalTool *curve_facet_tool = new CurveFacetEvalTool; CubitStatus status = curve_facet_tool->initialize( edge_list, point_list ); if ( status != CUBIT_SUCCESS ) { PRINT_ERROR("Error in creating new facet curve.\n"); return NULL; } bool start_vertex_is_free = true; if( start->num_parent_ref_entities() ) start_vertex_is_free = false; bool end_vertex_is_free = true; if( end->num_parent_ref_entities() ) end_vertex_is_free = false; DLIList<CoEdgeSM*> coedgesms; GeometryEntity *ge = start->get_geometry_entity_ptr(); TBPoint *start_psm = CAST_TO(ge, TBPoint); ge = end->get_geometry_entity_ptr(); TBPoint *end_psm = CAST_TO(ge, TBPoint); assert(start_psm && end_psm); FacetCurve *new_facet_curve = new FacetCurve(curve_facet_tool, start_psm, end_psm, coedgesms); if ( new_facet_curve == NULL ) { PRINT_ERROR("Error in creating new facet curve.\n"); assert(new_facet_curve != NULL); return (RefEdge*)NULL; } //if vertices are consumed....notify that they are gone. if( start_vertex_is_free ) AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOP_LEVEL_ENTITY_DESTRUCTED, start) ); if( end_vertex_is_free ) AppUtil::instance()->send_event(GeometryEvent(GeometryEvent::TOP_LEVEL_ENTITY_DESTRUCTED, end)); Curve *new_curve_ptr = (Curve*) new_facet_curve; return GeometryQueryTool::instance()->make_RefEdge(new_curve_ptr); }
RefVertex * ImprintBoundaryTool::create_virtual_vertex | ( | CubitVector & | pos | ) | [private] |
Definition at line 5932 of file ImprintBoundaryTool.cpp.
{ //Create a facet point first. TBPoint *new_point; if ( FacetModifyEngine::instance()->make_facet_point(pos, new_point) != CUBIT_SUCCESS ) { PRINT_ERROR("Vertex creation failed.\n"); return (RefVertex*)NULL; } return GeometryQueryTool::instance()->make_free_RefVertex(new_point); }
CubitStatus ImprintBoundaryTool::determine_on_boundary | ( | ImprintLineSegment * | seg_1, |
ImprintLineSegment * | seg_2, | ||
MatchType & | type_0, | ||
MatchType & | type_1, | ||
MatchType & | type_2, | ||
MatchType & | type_3 | ||
) | [private] |
Definition at line 2339 of file ImprintBoundaryTool.cpp.
{ //Find out if the points are on the boundary. Also use the matching informatin //previously calculated, since some of the nodes may match more closely with //other nodes on the boundary. For instance, if the boundary does a quick //reversal, a point may match an existing point better than here. //If the points should be on the segment, set the matchtype flags accordingly. ImprintPointData* imp_point_0,*imp_point_1,*imp_point_2,*imp_point_3; imp_point_0 = seg_1->get_start(); imp_point_1 = seg_1->get_end(); imp_point_2 = seg_2->get_start(); imp_point_3 = seg_2->get_end(); CubitBoolean point_0_on_seg_2 =CUBIT_FALSE; CubitBoolean point_1_on_seg_2 =CUBIT_FALSE; CubitBoolean point_2_on_seg_1 =CUBIT_FALSE; CubitBoolean point_3_on_seg_1 =CUBIT_FALSE; if ( on_interior_segment(imp_point_0, seg_2) ) point_0_on_seg_2 = CUBIT_TRUE; if ( on_interior_segment(imp_point_1, seg_2) ) point_1_on_seg_2 = CUBIT_TRUE; if ( on_interior_segment(imp_point_2, seg_1) ) point_2_on_seg_1 = CUBIT_TRUE; if ( on_interior_segment(imp_point_3, seg_1) ) point_3_on_seg_1 = CUBIT_TRUE; if ( point_0_on_seg_2 ) { if ( type_0 == MATCH_0_6 ) { double dist_1 = (imp_point_0->coordinates() - seg_2->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_0, seg_2, point_on_seg_2); double dist_2 = (imp_point_0->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) type_0 = NO_MATCH; else type_0 = ON_SEG_2; } else if (type_0 == MATCH_0_7 ) { double dist_1 = (imp_point_0->coordinates() - seg_2->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_0, seg_2, point_on_seg_2); double dist_2 = (imp_point_0->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) type_0 = NO_MATCH; else type_0 = ON_SEG_2; } else type_0 = ON_SEG_2; } if ( point_1_on_seg_2 ) { if ( type_1 == MATCH_1_6 ) { double dist_1 = (imp_point_1->coordinates() - seg_2->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_1, seg_2, point_on_seg_2); double dist_2 = (imp_point_1->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) type_1 = NO_MATCH; else type_1 = ON_SEG_2; } else if (type_1 == MATCH_1_7 ) { double dist_1 = (imp_point_1->coordinates() - seg_2->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_2; closest_point_interior_seg(imp_point_1, seg_2, point_on_seg_2); double dist_2 = (imp_point_1->coordinates() - point_on_seg_2).length_squared(); if ( dist_1 < dist_2 ) type_1 = NO_MATCH; else type_1 = ON_SEG_2; } else type_1 = ON_SEG_2; } if ( point_2_on_seg_1 ) { if ( type_2 == MATCH_2_4 ) { double dist_1 = (imp_point_2->coordinates() - seg_1->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_2, seg_1, point_on_seg_1); double dist_2 = (imp_point_2->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) type_2 = NO_MATCH; else type_2 = ON_SEG_1; } else if (type_2 == MATCH_2_5 ) { double dist_1 = (imp_point_2->coordinates() - seg_1->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_2, seg_1, point_on_seg_1); double dist_2 = (imp_point_2->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) type_2 = NO_MATCH; else type_2 = ON_SEG_1; } else type_2 = ON_SEG_1; } if ( point_3_on_seg_1 ) { if ( type_3 == MATCH_3_4 ) { double dist_1 = (imp_point_3->coordinates() - seg_1->get_prev()->get_start()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_3, seg_1, point_on_seg_1); double dist_2 = (imp_point_3->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) type_3 = NO_MATCH; else type_3 = ON_SEG_1; } else if (type_3 == MATCH_3_5 ) { double dist_1 = (imp_point_3->coordinates() - seg_1->get_next()->get_end()->coordinates()).length_squared(); CubitVector point_on_seg_1; closest_point_interior_seg(imp_point_3, seg_1, point_on_seg_1); double dist_2 = (imp_point_3->coordinates() - point_on_seg_1).length_squared(); if ( dist_1 < dist_2 ) type_3 = NO_MATCH; else type_3 = ON_SEG_1; } else type_3 = ON_SEG_1; } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::do_crossing | ( | ImprintPointData * | imp_point_0, |
ImprintPointData * | imp_point_1, | ||
ImprintPointData * | imp_point_2, | ||
ImprintPointData * | imp_point_3, | ||
ImprintLineSegment *& | seg_1, | ||
ImprintLineSegment * | seg_2, | ||
ImprintLineSegment ** | surf_1_loop_heads, | ||
int | num_loops_1, | ||
ImprintLineSegment ** | surf_2_loop_heads, | ||
int | num_loops_2, | ||
AbstractTree< ImprintLineSegment * > & | atree, | ||
CubitBoolean & | modified | ||
) | [private] |
Definition at line 5553 of file ImprintBoundaryTool.cpp.
{ //Okay, Test for the cross intersection. If this isnt' //within tolerance, then these two segments couldn't //posibly intersect! IntersectionTool int_tool(GEOMETRY_RESABS); //use GEOMETRY_RESABS //rather than myTolerance for calculations... CubitVector point_0 = imp_point_0->coordinates(); CubitVector point_1 = imp_point_1->coordinates(); CubitVector point_2 = imp_point_2->coordinates(); CubitVector point_3 = imp_point_3->coordinates(); CubitVector closest_point_seg_1, closest_point_seg_2; double sc, tc; CubitStatus stat = int_tool.closest_points_on_segments(point_0, point_1, point_2, point_3, closest_point_seg_1, closest_point_seg_2, sc, tc); if (stat != CUBIT_SUCCESS ) { PRINT_ERROR("Problems calculation closest points on " "segments for boundary imprinting.\n"); return CUBIT_FAILURE; } //Make sure the closest points aren't the end points. If they are //and we are within tolerance, it may be that the tolerance is too big //cause we shouldn't be at a cross if the closest point is an end point... if ( sc > 0. && sc < 1. && tc > 0. && tc < 1. && closest_point_seg_1.within_tolerance(closest_point_seg_2,myTolerance) ) { ImprintLineSegment *new_segments[4]; //okay, these guys actually do intersect! PRINT_DEBUG_129("Found CROSS_INTERSECT\n"); int debug = 0; if ( debug ) { GfxDebug::clear(); draw_point(imp_point_0); draw_point(imp_point_1); draw_point(imp_point_2); draw_point(imp_point_3); draw_seg(seg_1, CUBIT_RED_INDEX); draw_seg(seg_2, CUBIT_YELLOW_INDEX); GfxDebug::mouse_xforms(); } ImprintPointData *new_point_seg_1, *new_point_seg_2; new_point_seg_1 = new ImprintPointData(closest_point_seg_1.x(), closest_point_seg_1.y(), closest_point_seg_1.z()); allocatedPointData->append(new_point_seg_1); new_point_seg_1->owner(seg_1->owner()); new_point_seg_1->set_point_type(CREATE_NEW_VERTEX); new_point_seg_2 = new ImprintPointData(closest_point_seg_2.x(), closest_point_seg_2.y(), closest_point_seg_2.z()); allocatedPointData->append(new_point_seg_2); new_point_seg_2->owner(seg_2->owner()); new_point_seg_2->set_point_type(CREATE_NEW_VERTEX); new_point_seg_2->set_matching_point(new_point_seg_1); new_point_seg_1->set_matching_point(new_point_seg_2); new_segments[0] = new ImprintLineSegment(imp_point_0, new_point_seg_1, seg_1->owner()); new_segments[1] = new ImprintLineSegment(new_point_seg_1, imp_point_1, seg_1->owner()); new_segments[2] = new ImprintLineSegment(imp_point_2, new_point_seg_2, seg_2->owner()); new_segments[3] = new ImprintLineSegment(new_point_seg_2, imp_point_3, seg_2->owner()); allocatedLineData->append(new_segments[0]); allocatedLineData->append(new_segments[1]); allocatedLineData->append(new_segments[2]); allocatedLineData->append(new_segments[3]); //now update the lists. //update list 1. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); //update list 2. update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); //seg_1 and seg_2 will no longer be used seg_1->set_inactive(CUBIT_TRUE); seg_2->set_inactive(CUBIT_TRUE); //update the atree for the second surface. atree.remove(seg_2); atree.add(new_segments[2]); atree.add(new_segments[3]); //update the loop heads int jj; for (jj = 0; jj < num_loops_1;jj++ ) { if ( surf_1_loop_heads[jj] == seg_1 ) surf_1_loop_heads[jj] = new_segments[0]; } for (jj = 0; jj < num_loops_2;jj++ ) { if ( surf_2_loop_heads[jj] == seg_2 ) surf_2_loop_heads[jj] = new_segments[2]; } //now set seg_1 equal to new_segments[0] //so that we continue looping properly. seg_1 = new_segments[0]; modified = CUBIT_TRUE; } return CUBIT_SUCCESS; }
void ImprintBoundaryTool::draw_end | ( | ImprintLineSegment * | seg | ) | [private] |
Definition at line 4139 of file ImprintBoundaryTool.cpp.
{ ImprintPointData *end = seg->get_end(); CubitPoint *point = (CubitPoint*) end; PointType p_type = end->get_point_type(); int color; switch ( p_type ) { case VERTEX_ON_BOUNDARY_1: color = CUBIT_RED_INDEX; break; case VERTEX_ON_BOUNDARY_2: color = CUBIT_ORANGE_INDEX; break; case VERTEX_ON_BOTH_BOUNDARIES: color = CUBIT_MAGENTA_INDEX; break; case CREATE_NEW_VERTEX: color = CUBIT_CYAN_INDEX; break; case ON_BOUNDARY_1: color = CUBIT_GREEN_INDEX; break; case ON_BOUNDARY_2: color = CUBIT_YELLOW_INDEX; break; case ON_BOTH_BOUNDARIES: color = CUBIT_BLUE_INDEX; break; default: color = CUBIT_BROWN_INDEX; } int id_val = point->id(); GfxDebug::draw_label(id_val, point->x(), point->y(), point->z(), color); GfxDebug::flush(); }
void ImprintBoundaryTool::draw_loops | ( | PointLoopList & | boundary_loop | ) | [private] |
Definition at line 4085 of file ImprintBoundaryTool.cpp.
{ int ii, jj; PointList *point_list; ImprintPointData *imp_point; for (ii = 0; ii < boundary_loops.size(); ii++ ) { point_list = boundary_loops.get_and_step(); for ( jj = 0; jj < point_list->size(); jj++ ) { imp_point = point_list->get_and_step(); draw_point(imp_point); } } }
void ImprintBoundaryTool::draw_point | ( | ImprintPointData * | imp_point, |
int | color = -1 |
||
) | [private] |
Definition at line 4101 of file ImprintBoundaryTool.cpp.
{ CubitPoint *point = (CubitPoint*) imp_point; PointType p_type = imp_point->get_point_type(); if (color == -1 ) { switch ( p_type ) { case VERTEX_ON_BOUNDARY_1: color = CUBIT_RED_INDEX; break; case VERTEX_ON_BOUNDARY_2: color = CUBIT_ORANGE_INDEX; break; case VERTEX_ON_BOTH_BOUNDARIES: color = CUBIT_MAGENTA_INDEX; break; case CREATE_NEW_VERTEX: color = CUBIT_CYAN_INDEX; break; case ON_BOUNDARY_1: color = CUBIT_GREEN_INDEX; break; case ON_BOUNDARY_2: color = CUBIT_YELLOW_INDEX; break; case ON_BOTH_BOUNDARIES: color = CUBIT_BLUE_INDEX; break; default: color = CUBIT_BROWN_INDEX; } } // point->draw(color); int id_val = point->id(); GfxDebug::draw_label(id_val, point->x(), point->y(), point->z(), color); GfxDebug::flush(); }
void ImprintBoundaryTool::draw_seg | ( | ImprintLineSegment * | seg, |
int | color = -1 |
||
) | [private] |
Definition at line 4074 of file ImprintBoundaryTool.cpp.
{ CubitVector start_point = seg->get_start()->coordinates(); CubitVector end_point = seg->get_end()->coordinates(); if ( color == -1 ) color = CUBIT_GREEN_INDEX; GfxDebug::draw_line( start_point.x(),start_point.y(),start_point.z(), end_point.x(),end_point.y(),end_point.z(), color); GfxDebug::flush(); }
CubitStatus ImprintBoundaryTool::final_match | ( | ImprintLineSegment ** | surf_1_loop_heads, |
int | num_loops_1, | ||
ImprintLineSegment ** | surf_2_loop_heads, | ||
int | num_loops_2, | ||
AbstractTree< ImprintLineSegment * > & | atree_1, | ||
AbstractTree< ImprintLineSegment * > & | atree_2 | ||
) | [private] |
Definition at line 5017 of file ImprintBoundaryTool.cpp.
{ CubitStatus stat; //Match the points on surface 1 with the points on surface 2. //Resolve cases where more than 1 point match to another point. //Also resolve where a point on surface 1 matches with a segment //on surface 2. This will possibly alter the loop_heads of surface 2, //and the atree of surface2. stat = final_match_loop( surf_1_loop_heads, num_loops_1, surf_2_loop_heads, num_loops_2, atree_1, atree_2); if (stat != CUBIT_SUCCESS ) return stat; //Now match the points on surface 2 with surface 1. //This should go faster since hopefully they were done //at once. But there will be points that match with segments //that are left... //This will possibly alter the loop_heads of surface 1 and //the atree of surface1. stat = final_match_loop( surf_2_loop_heads, num_loops_2, surf_1_loop_heads, num_loops_1, atree_2, atree_1); if (stat != CUBIT_SUCCESS ) return stat; return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::final_match_loop | ( | ImprintLineSegment ** | surf_1_loop_heads, |
int | num_loops_1, | ||
ImprintLineSegment ** | surf_2_loop_heads, | ||
int | num_loops_2, | ||
AbstractTree< ImprintLineSegment * > & | atree_1, | ||
AbstractTree< ImprintLineSegment * > & | atree_2 | ||
) | [private] |
Definition at line 5049 of file ImprintBoundaryTool.cpp.
{ int ii; ImprintLineSegment *prev_seg, *curr_seg; CubitBoolean first = CUBIT_TRUE; ImprintPointData *start_point; DLIList<ImprintMatchData*> match_data_list; ImprintMatchData *start_match; CubitStatus stat; for(ii = 0; ii < num_loops_1; ii++ ) { prev_seg = surf_1_loop_heads[ii]->get_prev(); first = CUBIT_TRUE; while(prev_seg != surf_1_loop_heads[ii]->get_prev() || first ) { first = CUBIT_FALSE; curr_seg = prev_seg->get_next(); if ( DEBUG_FLAG(129) ) { draw_seg(curr_seg, CUBIT_GREEN_INDEX); } //Setup the next itteration. prev_seg = curr_seg; //Now on to the algorithm //Just check the start point for each segment (so that //we don't do each point more than once! start_point = curr_seg->get_start(); if ( start_point->get_matching_point() != NULL ) continue; //Get the match data. match_data_list.clean_out(); start_point->get_match_list(match_data_list); if ( match_data_list.size() == 0 ) start_match = NULL; else if ( match_data_list.size() == 1 ) start_match = match_data_list.get(); else { PRINT_ERROR("Unresolved match data in final match section. This\n" "is a bug!. Please report it.\n"); return CUBIT_FAILURE; } if ( start_match ) { CubitBoolean ignore = CUBIT_FALSE; if ( ignore_match(start_point, start_match, atree_1, ignore) != CUBIT_SUCCESS ) return CUBIT_FAILURE; if ( ignore ) continue; if ( start_match->get_closest_point() != NULL ) { stat = match_on_point(start_point, start_match, surf_2_loop_heads, num_loops_2, atree_2); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; } else if ( start_match->get_point_on() != NULL ) { //split the segment with start point and update //the loops heads for surf_2 if it is changed. stat = match_on_segment(start_point, start_match, surf_2_loop_heads, num_loops_2, atree_2); if ( stat != CUBIT_SUCCESS ) return stat; } else { //There really can't be anything else at this point. Either //it matches with a node, or it matches on a segment. PRINT_ERROR("Problems with point matching logic in imprinting.\n"); PRINT_ERROR("MatchData found without closest point or segment.\n"); PRINT_ERROR("Internal Imprint Problem, Please Report.\n"); return CUBIT_FAILURE; } } } } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::find_closest_points | ( | ImprintLineSegment * | curr_seg, |
ImprintLineSegment * | test_seg | ||
) | [private] |
Definition at line 4782 of file ImprintBoundaryTool.cpp.
{ //Given the two ImprintPointData *curr_data_a, *curr_data_b; curr_data_a = curr_seg->get_start(); curr_data_b = curr_seg->get_end(); ImprintMatchData *point_a_match = NULL; ImprintMatchData *point_b_match = NULL; CubitStatus stat1 = match_seg_points(curr_seg, test_seg, point_a_match, point_b_match); if ( stat1 != CUBIT_SUCCESS ) return stat1; if ( !curr_data_a->is_matched() && point_a_match != NULL ) curr_data_a->add_match_data(point_a_match); if ( !curr_data_b->is_matched() && point_b_match != NULL ) curr_data_b->add_match_data(point_b_match); return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::find_crossings | ( | ImprintLineSegment ** | surf_1_loop_heads, |
int | num_loops_1, | ||
ImprintLineSegment ** | surf_2_loop_heads, | ||
int | num_loops_2, | ||
AbstractTree< ImprintLineSegment * > & | atree | ||
) | [private] |
Definition at line 5482 of file ImprintBoundaryTool.cpp.
{ int ii, jj; ImprintLineSegment *curr_seg, *prev_seg, *test_seg; DLIList <ImprintLineSegment*> close_segments; CubitBoolean first = CUBIT_TRUE; CubitBox curr_box; ImprintPointData *imp_point_0, *imp_point_1; ImprintPointData *imp_point_2, *imp_point_3; for(ii = 0; ii < num_loops_1; ii++ ) { prev_seg = surf_1_loop_heads[ii]->get_prev(); first = CUBIT_TRUE; while(prev_seg != surf_1_loop_heads[ii]->get_prev() || first ) { first = CUBIT_FALSE; curr_seg = prev_seg->get_next(); if ( DEBUG_FLAG(129) ) { draw_seg(curr_seg, CUBIT_GREEN_INDEX); } //Setup the next itteration. prev_seg = curr_seg; curr_box = curr_seg->bounding_box(); close_segments.clean_out(); atree.find(curr_box, close_segments); imp_point_0 = curr_seg->get_start(); imp_point_1 = curr_seg->get_end(); for ( jj = 0; jj < close_segments.size(); jj++ ) { test_seg = close_segments.pop(); imp_point_2 = test_seg->get_start(); imp_point_3 = test_seg->get_end(); //don't test if these already match. if ( imp_point_0->get_matching_point() == imp_point_2 || imp_point_0->get_matching_point() == imp_point_3 || imp_point_1->get_matching_point() == imp_point_2 || imp_point_1->get_matching_point() == imp_point_3 ) continue; CubitBoolean modified = CUBIT_FALSE; //Test and resolve. Note that only one of the atrees //is getting updated (this atree is for surface 2. ) //The loop heads are updated, and curr_seg will //get modified if the a crossing intersect occurs. CubitStatus stat = do_crossing( imp_point_0, imp_point_1, imp_point_2, imp_point_3, curr_seg, test_seg, surf_1_loop_heads, num_loops_1, surf_2_loop_heads, num_loops_2, atree, modified ); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; if ( modified ) { //curr_seg was modified in the do_crossing (the original //was split.). Make sure we start again to check for //crossings with this item. To do that, set prev seg //to it's previous segment. The result is that the next //time through it will be curr_seg. prev_seg = curr_seg->get_prev(); } } } } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::find_graph_for_surf | ( | PointLoopList & | boundary_loops_1, |
PointLoopList & | boundary_loops_2, | ||
RefFace * | ref_face, | ||
PointLoopList & | part_segs, | ||
PointList & | partition_points, | ||
CubitBoolean | surf_1 | ||
) | [private] |
Definition at line 3067 of file ImprintBoundaryTool.cpp.
{ //Traverse the boundary_line_loops_2. //First search for intersections. If an intersection is found, //traverse from there until another intersection is found. //If no intersection is found for a loop, test to see if the //nodes lie inside the surface. If they do, then the intire loop //should be used for partitioning. int ii, jj; //ASSUME my boundary is loop_2. CubitBoolean start_recording = CUBIT_FALSE; CubitBoolean found_start = CUBIT_FALSE; PointList *loop_1_ptr, *loop_2_ptr, *new_part_line; ImprintPointData *curr_point, *next_point; for ( ii = boundary_loops_2.size(); ii > 0; ii-- ) { loop_2_ptr = boundary_loops_2.get_and_step(); start_recording = CUBIT_FALSE; new_part_line = NULL; found_start = CUBIT_FALSE; //find a good place to start. It messes things //up if we start the loop at a non-meeting spot. for ( jj = loop_2_ptr->size(); jj > 0; jj-- ) { curr_point = loop_2_ptr->get_and_step(); if ( curr_point->get_point_type() == CREATE_NEW_VERTEX || curr_point->get_point_type() == VERTEX_ON_BOTH_BOUNDARIES ) { loop_2_ptr->back(); found_start = CUBIT_TRUE; break; } } if ( found_start ) { for ( jj = loop_2_ptr->size(); jj > 0; jj-- ) { curr_point = loop_2_ptr->get_and_step(); next_point = loop_2_ptr->get(); if ( DEBUG_FLAG(129) ) draw_point(curr_point); if ( curr_point->get_point_type() == CREATE_NEW_VERTEX || curr_point->get_point_type() == VERTEX_ON_BOTH_BOUNDARIES ) { CubitStatus stat; //This section of the code just got too big. So it may change //the loop_2_ptr position, the loop counter jj and other things. stat = point_intersects_case( curr_point, next_point, ref_face, part_segs, new_part_line, start_recording, surf_1 ); if (CUBIT_SUCCESS != stat) { PRINT_ERROR("ImprintBoundaryTool::point_intersects_case failed.\n"); return stat; } } else { if (start_recording) { if ( !new_part_line ) { PRINT_ERROR("Bad Logic ImprintBoundaryTool::find_graph_for_surf.\n"); assert(new_part_line != NULL); return CUBIT_FAILURE; } CubitBox surf_box = ref_face->bounding_box(); CubitBox curr_box(curr_point->coordinates()); if( surf_box.overlap(myTolerance, curr_box ) && on_surface(curr_point, ref_face) ) { new_part_line->append(curr_point); if ( jj == 1 && (next_point->get_point_type() == CREATE_NEW_VERTEX || next_point->get_point_type() == VERTEX_ON_BOTH_BOUNDARIES) ) { //Do the last node since that is where we have to go to inorder //to stop the partitioning. jj++; } } else { //remove new_part_line from the part_segs list and //break out of this loop. part_segs.pop(); start_recording = CUBIT_FALSE; break; } } } } if ( start_recording ) { //This is bad news. We never should finish the loop and still //be recording... PRINT_ERROR("Bad Logic ImprintBoundaryTool::find_graph_for_surf.\n"); assert(!start_recording); return CUBIT_FAILURE; } } else { //Okay this is an interior hole to the ref_face. Just add the //entire loop. int mm; CubitBox surf_box = ref_face->bounding_box(); int debug = 0; if ( debug ) { GfxDebug::clear(); GfxDebug::draw_box(surf_box, CUBIT_RED_INDEX); GfxDebug::flush(); } CubitBox curr_box; //Getting the first point is important. Make //sure it is a vertex. CubitBoolean start = CUBIT_FALSE; for ( mm = loop_2_ptr->size(); mm > 0; mm-- ) { curr_point = loop_2_ptr->get_and_step(); curr_box.reset(curr_point->coordinates()); if ( debug ) { draw_point(curr_point); } if ( surf_box.overlap(myTolerance,curr_box) ) { if ( on_surface(curr_point, ref_face) && curr_point->is_owner_vertex() ) { loop_2_ptr->back(); start = CUBIT_TRUE; break; } } } if ( !start ) { //this loop has no affect on the surface. (no points //are on the boundary and are vertices...) continue; } else { new_part_line = new PointList; allocatedPointLoops->append(new_part_line); //Test one the nodes to see if they are interior to the surface. loop_2_ptr->get()->set_start_partition(); loop_2_ptr->get()->set_end_partition(); part_segs.append(new_part_line); CubitBoolean valid_loop = CUBIT_TRUE; for ( mm = loop_2_ptr->size(); mm > 0; mm-- ) { curr_point = loop_2_ptr->get_and_step(); curr_box.reset(curr_point->coordinates()); if ( surf_box.overlap(myTolerance, curr_box) ) { if ( on_surface(curr_point, ref_face) ) { new_part_line->append(curr_point); } else valid_loop = CUBIT_FALSE; } else valid_loop = CUBIT_FALSE; } if ( !valid_loop ) { //remove the part_line. The //entire loop must go into the surface. part_segs.pop(); } } //Otherwise just ignore this loop it has no affect on the ref_face. } } //Okay now go through and find the points that are needed to create as imprints on the boundary. for ( ii = boundary_loops_1.size(); ii > 0; ii-- ) { loop_1_ptr = boundary_loops_1.get_and_step(); for ( jj = loop_1_ptr->size(); jj > 0; jj-- ) { curr_point = loop_1_ptr->get_and_step(); if ( curr_point->get_point_type() == CREATE_NEW_VERTEX ) partition_points.append(curr_point); } } //Okay, we should be set now! return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::find_matching_points | ( | SegLoopList & | seg_loops, |
AbstractTree< ImprintLineSegment * > & | atree | ||
) | [private] |
Definition at line 4715 of file ImprintBoundaryTool.cpp.
{ //Loop over seg_loops. For each segment loop, find the closest matching point //from the segments in the atree. int ii, jj, kk; SegList *loop_ptr; ImprintLineSegment *curr_seg, *test_seg; ImprintPointData *imp_point_0, *imp_point_1; SegList close_segments; CubitBox curr_box; CubitStatus stat; for ( ii = 0; ii < seg_loops.size(); ii++ ) { loop_ptr = seg_loops.get_and_step(); for ( jj = 0; jj < loop_ptr->size(); jj++ ) { curr_seg = loop_ptr->get_and_step(); close_segments.clean_out(); curr_box = curr_seg->bounding_box(); atree.find(curr_box, close_segments); if ( close_segments.size() == 0 ) continue; for ( kk = 0; kk < close_segments.size(); kk++ ) { test_seg = close_segments.get_and_step(); stat = find_closest_points(curr_seg, test_seg); if (stat != CUBIT_SUCCESS ) return stat; } //Now given those closest points, //find the match for point 0. imp_point_0 = curr_seg->get_start(); if (!imp_point_0->is_matched() ) set_closest_point(imp_point_0); //Now given those closest points, //find the match for point 1. imp_point_1 = curr_seg->get_end(); if (!imp_point_1->is_matched() ) set_closest_point(imp_point_1); } } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::get_boundary_points | ( | RefFace * | ref_face, |
PointLoopList & | boundary_point_loops | ||
) | [private] |
Definition at line 205 of file ImprintBoundaryTool.cpp.
{ DLIList<DLIList<CoEdge*> > co_edge_loops; ref_face->co_edge_loops(co_edge_loops); int ii, jj; PointList *new_point_loop_ptr, tmp_point_list; RefEdge *ref_edge_ptr; CoEdge *co_edge_ptr; CubitStatus stat; CubitSense sense; RefEntity *temp_ref; RefVertex *temp_vert; for ( ii = co_edge_loops.size(); ii > 0; ii-- ) { DLIList <CoEdge*> &co_edge_list_ptr = co_edge_loops.get_and_step(); new_point_loop_ptr = new PointList; allocatedPointLoops->append(new_point_loop_ptr); for ( jj = co_edge_list_ptr.size(); jj > 0; jj-- ) { co_edge_ptr = co_edge_list_ptr.get_and_step(); ref_edge_ptr = co_edge_ptr->get_ref_edge_ptr(); tmp_point_list.clean_out(); stat = get_curve_facets( ref_edge_ptr, tmp_point_list ); PRINT_DEBUG_129("curve %d has %d points\n", ref_edge_ptr->id(), tmp_point_list.size()); if ( stat != CUBIT_SUCCESS ) { return CUBIT_FAILURE; } tmp_point_list.reset(); //the points are in order from start vertex to end vertex. //append them now according to the loop. //Assign the points to be part owned by the vertex, rather than the //curve. if ( ref_edge_ptr->start_vertex() != ref_edge_ptr->end_vertex() ) { ImprintPointData *temp_point = tmp_point_list.get(); CubitVector v1 = temp_point->coordinates(); CubitVector v2 = ref_edge_ptr->start_vertex()->coordinates(); if ( !v1.within_tolerance(v2, myTolerance) ) { PRINT_ERROR("Problem with surface geometry\n" "Check surface %d and %d, especially curve %d\n", refFacePtr1->id(), refFacePtr2->id(), ref_edge_ptr->id()); } temp_vert = ref_edge_ptr->start_vertex(); temp_ref = CAST_TO(temp_vert, RefEntity); temp_point->owner(temp_ref); temp_point = tmp_point_list.prev(); v1 = temp_point->coordinates(); v2 = ref_edge_ptr->end_vertex()->coordinates(); if (!v1.within_tolerance(v2, myTolerance)) { PRINT_ERROR("Problem with surface geometry\n" "Check surface %d and %d, especially curve %d\n", refFacePtr1->id(), refFacePtr2->id(), ref_edge_ptr->id()); return CUBIT_FAILURE; } temp_vert = ref_edge_ptr->end_vertex(); temp_ref = CAST_TO(temp_vert, RefEntity); temp_point->owner(temp_ref); } else { ImprintPointData *temp_point = tmp_point_list.get(); CubitVector v1 = temp_point->coordinates(); CubitVector v2 = ref_edge_ptr->start_vertex()->coordinates(); if ( !v1.about_equal(v2) ) { temp_point = tmp_point_list.prev(); v1 = temp_point->coordinates(); v2 = ref_edge_ptr->start_vertex()->coordinates(); assert(v1.about_equal(v2)); } temp_vert = ref_edge_ptr->end_vertex(); temp_ref = CAST_TO( temp_vert, RefEntity ); temp_point->owner(temp_ref); } tmp_point_list.reset(); sense = co_edge_ptr->get_sense(); if ( CUBIT_FORWARD != sense ) tmp_point_list.reverse(); //Now take off the last point as it is a duplicate with the //other list... tmp_point_list.reset(); if ( co_edge_list_ptr.size() != 1 ) tmp_point_list.pop(); (*new_point_loop_ptr) += tmp_point_list; if ( num_coedges_on_face(ref_edge_ptr, ref_face) > 1 ) { PRINT_ERROR("Surface %d has a sipe or hard line.\n" "Virtual imprinting does not support that type\n" "of surface.\n", ref_face->id()); return CUBIT_FAILURE; } } CubitVector curr, prev; for ( jj = new_point_loop_ptr->size(); jj > 0; jj-- ) { prev = new_point_loop_ptr->prev()->coordinates(); curr = new_point_loop_ptr->get_and_step()->coordinates(); if ( prev.about_equal(curr) ) { PRINT_DEBUG_129("Points within tolerance in boundaryloop.\n"); int debug = 0; if ( debug ) { GfxDebug::draw_point(new_point_loop_ptr->prev(3)->coordinates(), CUBIT_RED_INDEX); GfxDebug::draw_point(new_point_loop_ptr->prev(2)->coordinates(), CUBIT_YELLOW_INDEX); GfxDebug::draw_point(new_point_loop_ptr->prev()->coordinates(), CUBIT_BLUE_INDEX); GfxDebug::draw_point(new_point_loop_ptr->get()->coordinates(), CUBIT_GREEN_INDEX); } new_point_loop_ptr->back(); new_point_loop_ptr->remove(); } } boundary_point_loops.append(new_point_loop_ptr); } CubitVector curr1, curr2; int kk, ll; PointList *check_list; double min_dist = CUBIT_DBL_MAX; PointLoopList boundary_point_loops2 = boundary_point_loops; for ( ii = boundary_point_loops.size(); ii > 0; ii-- ) { new_point_loop_ptr = boundary_point_loops.get_and_step(); for ( kk = boundary_point_loops.size(); kk > 0; kk-- ) { check_list = boundary_point_loops2.get_and_step(); if ( new_point_loop_ptr == check_list ) continue; for ( jj = new_point_loop_ptr->size(); jj > 0; jj-- ) { curr1 = new_point_loop_ptr->get_and_step()->coordinates(); for ( ll = check_list->size(); ll > 0; ll-- ) { curr2 = check_list->get_and_step()->coordinates(); if (curr1.about_equal(curr2, myTolerance) ) { double dist = (curr1-curr2).length(); if ( dist < min_dist ) min_dist = dist; } } } } } if ( min_dist < CUBIT_DBL_MAX && min_dist < myTolerance ) { PRINT_INFO("Two loops on Surface %d are within tolerance of each other!\n", ref_face->id()); PRINT_INFO("Changing the tolerance to less than %f\n" "(the smallest distance between the two loops.)\n", min_dist); myTolerance = min_dist/4; PRINT_INFO("For surface %d and %d tolerance changed to %f\n", refFacePtr1->id(), refFacePtr2->id(), myTolerance); //return CUBIT_FAILURE; } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::get_curve_facets | ( | RefEdge * | curve, |
PointList & | segments | ||
) | [private] |
Definition at line 375 of file ImprintBoundaryTool.cpp.
{ // const double COS_ANGLE_TOL = 0.965925826289068312213715; // cos(15) // const double COS_ANGLE_TOL = 0.984807753012208020315654; // cos(10) //const double COS_ANGLE_TOL = 0.996194698091745545198705; // cos(5) GMem curve_graphics; //make this tol bigger than myTolerance, to //make sure the segments are larger than the tolerance. const double dist_tol = 2*myTolerance + .5*myTolerance;// + .05*myTolerance; //const double dist_tol_sqr = dist_tol*dist_tol; Curve* curve_ptr = curve->get_curve_ptr(); curve_ptr->get_geometry_query_engine()->get_graphics( curve_ptr, &curve_graphics ); GPoint* gp = curve_graphics.point_list(); ImprintPointData* last = new ImprintPointData( gp[0].x, gp[0].y, gp[0].z ); allocatedPointData->append(last); last->owner(dynamic_cast<RefEntity*>(curve)); CubitVector lastv = last->coordinates(); int num_points = curve_graphics.pointListCount; segments.append( last ); int ii; CubitBoolean remove_second_to_end = CUBIT_FALSE; for ( ii = 1; ii < num_points; ii++ ) { CubitVector pos( gp[ii].x, gp[ii].y, gp[ii].z ); CubitVector step1 = (pos - lastv); double len1 = step1.length(); if( len1 < dist_tol && ii != num_points - 1) continue; else if ( len1 < dist_tol && ii == num_points-1 ) { remove_second_to_end = CUBIT_TRUE; } last = new ImprintPointData( pos ); if ( DEBUG_FLAG(129) ) draw_point(last); allocatedPointData->append(last); last->owner(dynamic_cast<RefEntity*>(curve)); segments.append( last ); lastv = last->coordinates(); } // Now check if the segment list is reversed wrt the curve direction. segments.reset(); if ( remove_second_to_end ) { if ( segments.size() == 2 ) { PRINT_DEBUG_129("Tolerance size is small for imprinting\n" "(curve %d is small)\n", curve->id()); double leng = curve->measure(); if ( leng < myTolerance ) { PRINT_ERROR("Tolerance for surfaces %d and %d is too small.\n" "Curve %d is of size %f. Try making the tolerance\n" "1/4 of that value or (%f).\n", refFacePtr1->id(), refFacePtr2->id(), curve->id(), leng, leng/4.0); return CUBIT_FAILURE; } } else { //Remove the second to last one. To do //this efficiently (don't do remove), pop //the last one, then save that and //re-add it after poping the second one. ImprintPointData *temp = segments.pop(); segments.pop(); segments.append(temp); } } segments.reset(); if( curve->start_vertex() != curve->end_vertex() ) { CubitVector start_vec, end_vec; start_vec = curve->start_vertex()->coordinates(); end_vec = curve->end_vertex()->coordinates(); CubitVector start_seg = segments.get()->coordinates(); double dist_1 = (start_seg - start_vec).length_squared(); double dist_2 = (start_seg - end_vec).length_squared(); if ( dist_1 > dist_2 ) segments.reverse(); //Now make sure that the start and end vertices are "right-on" with //the facet representations... segments.reset(); start_seg = segments.get()->coordinates(); CubitVector end_seg = segments.prev()->coordinates(); //make sure the start and end positions match up "exactly" //with the vertex coordinates of the curves. The facets sometimes //aren't really "right-on" segments.get()->set(start_vec); segments.prev()->set(end_seg); } else { double u1, u2; u1 = curve->u_from_position( (segments.next(1)->coordinates()) ); u2 = curve->u_from_position( (segments.next(2)->coordinates()) ); if( (u2 < u1) && (curve->start_param() <= curve->end_param()) ) segments.reverse(); } //clean up the periodic curve case (last seg may be too small.) if ( curve->start_vertex() == curve->end_vertex() ) { segments.reset(); CubitVector start_v = segments.get()->coordinates(); CubitVector last_v = segments.prev()->coordinates(); double dist = (start_v - last_v).length(); if ( dist < dist_tol ) { //remove the last one. segments.pop(); } //now make sure the one vertex matches up "exactly" with the //first segement. segments.reset(); CubitVector start_vec = curve->start_vertex()->coordinates(); //replace start_seg with start_vec. segments.get()->set(start_vec); } //Make sure we don't have duplicate points. int jj; CubitVector curr, prev; for ( jj = segments.size(); jj > 0; jj-- ) { prev = segments.prev()->coordinates(); curr = segments.get_and_step()->coordinates(); if ( prev.about_equal(curr) ) { PRINT_DEBUG_129("Points on curve %d within tolerance...\n", curve->id()); segments.back(); segments.remove(); } } if ( segments.size() < 2 ) { PRINT_ERROR("Tolerance size is too small for imprinting\n" "(curve %d is small)\n", curve->id()); return CUBIT_FAILURE; } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::ignore_match | ( | ImprintPointData * | start_point, |
ImprintMatchData * | start_match, | ||
AbstractTree< ImprintLineSegment * > & | atree_1, | ||
CubitBoolean & | ignore | ||
) | [private] |
Definition at line 5699 of file ImprintBoundaryTool.cpp.
{ ignore = CUBIT_TRUE; //assume that start_point is in atree_1 (here 1 and 2 don't neccesaryily mean //loopFacePtr1 and loopFacePtr2 because this is called for both faces. //First determine what type of match, point to point or point to segment. if ( start_match->get_closest_point() != NULL ) { ImprintMatchData *temp_match; ImprintPointData *closest_point; DLIList <ImprintMatchData*> match_data_list; closest_point = start_match->get_closest_point(); closest_point->get_match_list(match_data_list); if ( match_data_list.size() == 1 ) { temp_match = match_data_list.get(); //if they match don't ignore this. if ( temp_match->get_closest_point() == start_point ) { ignore = CUBIT_FALSE; return CUBIT_SUCCESS; } else { //Now we have a conflict. Start matches with closest_point, //but closest_point doesn't match with start. //Find out if there is a segment in atree_1 that is closer //to closest_point. If there isn't, then we need to //match start with one of the two linesegments attached to closest //point. //If there is a closer line segment to closest_point, then don't //match. //First, define the search area as the area around the start_point. ImprintLineSegment *start_prev_seg = start_point->get_prev_seg(); ImprintLineSegment *start_next_seg = start_point->get_next_seg(); CubitBox curr_box = start_prev_seg->bounding_box(); curr_box |= start_next_seg->bounding_box(); DLIList<ImprintLineSegment*> closest_segments; atree_1.find(curr_box, closest_segments); //Find the segment that is closest to closest_point. ImprintLineSegment *closest_seg = NULL, *close_seg; double dist; double min_dist = CUBIT_DBL_MAX; int ii; CubitVector closest_vec, closest_point_vec = closest_point->coordinates(); for ( ii = closest_segments.size(); ii > 0; ii-- ) { close_seg = closest_segments.pop(); if ( !closest_point_seg(closest_point, close_seg, closest_vec) ) return CUBIT_FAILURE; dist = (closest_vec - closest_point_vec).length_squared(); if ( dist < min_dist ) { min_dist = dist; closest_seg = close_seg; } } if ( closest_seg == NULL ) { PRINT_ERROR("Couldn't find a closest segment.(bug)\n"); assert(closest_seg != NULL); return CUBIT_FAILURE; } if ( closest_seg != start_prev_seg || closest_seg != start_next_seg ) { //okay this we need to ignore. Just say start point doesn't match with anything. start_point->set_unmatched(); start_point->set_matching_point(NULL); ignore = CUBIT_TRUE; return CUBIT_SUCCESS; } else { //okay, now we actually want to match start point with one of the segments //attached to closest_point. ImprintLineSegment *next_close_seg, *prev_close_seg; next_close_seg = closest_point->get_next_seg(); prev_close_seg = closest_point->get_prev_seg(); //determine which is closer... CubitVector closest_next, closest_prev, start_vec = start_point->coordinates(); if ( !closest_point_seg(start_point, next_close_seg, closest_next) ) return CUBIT_FAILURE; if ( !closest_point_seg(start_point, prev_close_seg, closest_prev) ) return CUBIT_FAILURE; double dist_prev, dist_next; CubitVector point_on; dist_next = (start_vec - closest_next).length_squared(); dist_prev = (start_vec - closest_prev).length_squared(); closest_seg = NULL; if ( dist_next < dist_prev ) { closest_seg = next_close_seg; min_dist = dist_next; point_on = closest_next; } else { closest_seg = prev_close_seg; min_dist = dist_prev; point_on = closest_prev; } //make sure the point_on isn't the same location as the closest_point. CubitVector closest_point_vec = closest_point->coordinates(); if ( closest_point_vec.within_tolerance(point_on, myTolerance/10.0) ) { ignore = CUBIT_TRUE; start_point->set_unmatched(); start_point->set_matching_point(NULL); return CUBIT_SUCCESS; } //make sure point_on and start point are within tolerances. dist = (point_on - start_vec).length_squared(); if ( dist > myTolerance*myTolerance ) { PRINT_ERROR("Bad logic in ignore_match in ImprintImprintTool.\n"); assert(dist <= myTolerance*myTolerance); return CUBIT_FAILURE; } start_match->set_closest_point(NULL); start_point->set_matching_point(NULL); start_match->set_closest_dist(min_dist); start_match->set_point_on(point_on); start_match->set_closest_seg(closest_seg); ignore = CUBIT_FALSE; return CUBIT_SUCCESS; } } } else { if ( match_data_list.size() == 0 ) { ignore = CUBIT_TRUE; return CUBIT_SUCCESS; } else { PRINT_ERROR("More than one match in final match(%d).\n",match_data_list.size() ); PRINT_ERROR("This is a bug in loop imprinting, try reducing\n" "the size for decomposition.\n"); return CUBIT_FAILURE; } } } else if ( start_match->get_point_on() != NULL ) { if ( start_point->get_matching_point() ) { ImprintPointData *closest_point = start_point->get_matching_point(); if ( closest_point->get_matching_point() == start_point ) { ignore = CUBIT_TRUE; return CUBIT_SUCCESS; } } //this must mean we match on a segment. //Determine if there is a segment on 1, that is closer to this //point than start_point is. If there is, ignore this match. CubitVector point_on; point_on.set(*(start_match->get_point_on())); ImprintLineSegment *start_prev_seg = start_point->get_prev_seg(); ImprintLineSegment *start_next_seg = start_point->get_next_seg(); CubitBox curr_box = start_prev_seg->bounding_box(); curr_box |= start_next_seg->bounding_box(); DLIList<ImprintLineSegment*> closest_segments; atree_1.find(curr_box, closest_segments); //Find the segment that is closest to closest_point. ImprintLineSegment *closest_seg = NULL, *close_seg; double dist; double min_dist = CUBIT_DBL_MAX; int ii; //dflush(); CubitVector closest_vec; //CubitVector start_vec = start_point->coordinates(); // dclear(); // dseg(start_prev_seg); // dseg(start_next_seg); //dvec(point_on); //dmouse(); for ( ii = closest_segments.size(); ii > 0; ii-- ) { close_seg = closest_segments.pop(); if ( !closest_point_seg(point_on, close_seg, closest_vec) ) return CUBIT_FAILURE; dist = (closest_vec - point_on).length_squared(); if ( dist < min_dist ) { min_dist = dist; closest_seg = close_seg; } } if ( closest_seg == NULL ) { PRINT_ERROR("Couldn't find a closest segment.(bug)\n"); assert(closest_seg != NULL); return CUBIT_FAILURE; } if ( closest_seg == start_prev_seg || closest_seg == start_next_seg ) { ignore = CUBIT_FALSE; return CUBIT_SUCCESS; } else { ignore = CUBIT_TRUE; start_point->set_unmatched(); start_point->set_matching_point(NULL); return CUBIT_SUCCESS; } } return CUBIT_FAILURE; }
CubitStatus ImprintBoundaryTool::imprint | ( | DLIList< RefFace * > & | results, |
CubitBoolean | merge = CUBIT_FALSE |
||
) |
Definition at line 100 of file ImprintBoundaryTool.cpp.
{ CubitBox ref_box1 = refFacePtr1->bounding_box(); CubitBox ref_box2 = refFacePtr2->bounding_box(); if ( !ref_box1.overlap(myTolerance, ref_box2 ) ) return CUBIT_SUCCESS; if ( refFacePtr1->num_loops() == 0 || refFacePtr2->num_loops() == 0 ) { PRINT_WARNING("Virtual imprinting currently can't imprint\n" "surfaces that have no boundary curves (surfaces %d or %d\n" "has no boundary curves.\n", refFacePtr1->id(), refFacePtr2->id()); return CUBIT_SUCCESS; } if ( merge ) PRINT_WARNING("Can't merge while virtual imprinting yet.\n"); PRINT_DEBUG_129("Imprinting surfaces: %d and %d\n", refFacePtr1->id(), refFacePtr2->id() ); int debug5 = 0; if ( debug5) { GfxDebug::clear(); GfxDebug::draw_ref_face_edges(refFacePtr1, CUBIT_GREEN_INDEX); GfxDebug::draw_ref_face_edges(refFacePtr2, CUBIT_YELLOW_INDEX); GfxDebug::flush(); GfxDebug::mouse_xforms(); CubitMessage::instance()->debug_flag(129, CUBIT_TRUE); } int ii, jj; PointLoopList boundary_point_loops1; PointLoopList boundary_point_loops2; CubitStatus stat = get_boundary_points(refFacePtr1, boundary_point_loops1); if ( stat != CUBIT_SUCCESS ) return stat; stat = get_boundary_points(refFacePtr2, boundary_point_loops2); if ( stat != CUBIT_SUCCESS ) return stat; boundary_point_loops1.reset(); boundary_point_loops2.reset(); if ( DEBUG_FLAG(129) ) { //Drawing the boundary loops. GfxDebug::clear(); GfxDebug::flush(); PointList *point_list; for ( ii = boundary_point_loops1.size(); ii > 0; ii-- ) { point_list = boundary_point_loops1.get_and_step(); for ( jj = point_list->size(); jj > 0; jj-- ) { ImprintPointData *point = point_list->get_and_step(); //RefEntity *entity = point->owner(); draw_point(point); } } if (debug5) { GfxDebug::mouse_xforms(); GfxDebug::clear(); GfxDebug::draw_ref_face_edges(refFacePtr2); GfxDebug::flush(); } for ( ii = boundary_point_loops2.size(); ii > 0; ii-- ) { point_list = boundary_point_loops2.get_and_step(); for ( jj = point_list->size(); jj > 0; jj-- ) { ImprintPointData *point = point_list->get_and_step(); //RefEntity *entity = point->owner(); draw_point(point); } } if (debug5) { GfxDebug::mouse_xforms(); } } //Now intersect the two boundary loops. Either mark the nodes //that are intersecting, or insert new nodes into the boundary loops, //that intersect the boundaries. stat = imprint_boundaries( boundary_point_loops1, boundary_point_loops2, refFacePtr1, refFacePtr2, results); if ( results.size() == 0 ) { if ( modBound1 ) results.append(refFacePtr1); if ( modBound2 ) results.append(refFacePtr2); } if ( stat != CUBIT_SUCCESS ) { PRINT_ERROR("Imprinting Surface %d and %d failed\n", refFacePtr1->id(), refFacePtr2->id() ); return CUBIT_FAILURE; } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::imprint_boundaries | ( | PointLoopList & | boundary_loops_1, |
PointLoopList & | boundary_loops_2, | ||
RefFace * | ref_face_1, | ||
RefFace * | ref_face_2, | ||
DLIList< RefFace * > & | results | ||
) | [private] |
Definition at line 528 of file ImprintBoundaryTool.cpp.
{ int ii, jj; SegLoopList boundary_line_loops_1, boundary_line_loops_2; //Now convert the point lists to line segments. //REMEMBER, delete all the data from boundary_line_loops, the lists and the data... CubitStatus st = convert_to_lines( boundary_loops_1, boundary_line_loops_1, ref_face_1, CUBIT_TRUE); if ( st != CUBIT_SUCCESS ) { return CUBIT_FAILURE; } st = convert_to_lines( boundary_loops_2, boundary_line_loops_2, ref_face_2, CUBIT_FALSE); if ( st != CUBIT_SUCCESS ) { return CUBIT_FAILURE; } if ( boundary_line_loops_1.size() == 0 || boundary_line_loops_2.size() == 0 ) return CUBIT_FAILURE; //Do the actual intersecting and imprinting. Basically splits segments and //matches the points on the two boundaries. Also classifies the connections. CubitStatus stat = imprint_segments( boundary_line_loops_1, boundary_line_loops_2, boundary_loops_1, boundary_loops_2); if (stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; //Note that the boundary_line_loops are outof date at this point and shouldn't be used. //These lists are also stored in the allocatedLineLoops list and the memory will be //cleaned up in the destructor. Just clean them out to avoid useing the data. boundary_line_loops_1.clean_out(); boundary_line_loops_2.clean_out(); //Mark each node as to which loop its in and its position //for efficient searching. PointList *point_loop; for ( ii = 0; ii < boundary_loops_1.size(); ii++ ) { point_loop = boundary_loops_1.get_and_step(); int loop_size = point_loop->size(); for ( jj = 0; jj < loop_size; jj++ ) point_loop->get_and_step()->set_loop_pos(ii,jj, loop_size); } for ( ii = 0; ii < boundary_loops_2.size(); ii++ ) { point_loop = boundary_loops_2.get_and_step(); int loop_size = point_loop->size(); for ( jj = 0; jj < loop_size; jj++ ) point_loop->get_and_step()->set_loop_pos(ii,jj, loop_size); } //Now go through and find the curves that need to be created, and vertices //that need to be imprinted for each surface. PointLoopList part_segs_1, part_segs_2; PointList partition_points_1, partition_points_2; stat = find_graph_for_surf( boundary_loops_1, boundary_loops_2, ref_face_1, part_segs_1, partition_points_1, CUBIT_TRUE); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; stat = find_graph_for_surf( boundary_loops_2, boundary_loops_1, ref_face_2, part_segs_2, partition_points_2, CUBIT_FALSE); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; //Okay now go through and partition the boundaries. CubitBoolean mod_bound1, mod_bound2; stat = imprint_boundary_vertices( partition_points_1, mod_bound1); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; stat = imprint_boundary_vertices( partition_points_2, mod_bound2); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; //Now go through and paritition the surfaces. DLIList<RefFace*> results_1, results_2; stat = imprint_surface(ref_face_1, part_segs_1, results_1); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; stat = imprint_surface(ref_face_2, part_segs_2, results_2); if ( stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; if ( mod_bound1 || results_1.size() ) modBound1 = CUBIT_TRUE; if ( mod_bound2 || results_2.size() ) modBound2 = CUBIT_TRUE; results += results_1; results += results_2; return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::imprint_boundary_vertices | ( | PointList & | partition_points, |
CubitBoolean & | modified_boundary | ||
) | [private] |
Definition at line 3566 of file ImprintBoundaryTool.cpp.
{ ImprintPointData *curr_point; RefEntity *ref_ent; int ii; RefEdge *ref_edge, *edge1, *edge2; modified_boundary = CUBIT_FALSE; while( partition_points.size() > 0 ) { curr_point = partition_points.pop(); ref_ent = curr_point->owner(); ref_edge = CAST_TO(ref_ent, RefEdge); if ( ref_edge == NULL ) { PRINT_ERROR("Bad logic in point owners for ImprintBoundaryTool.\n"); assert(ref_edge != NULL); return CUBIT_FAILURE; } CubitVector part_vec = curr_point->coordinates(); CubitVector closest_point; ref_edge->closest_point(part_vec, closest_point); double dist = (part_vec - closest_point).length_squared(); if ( dist > myTolerance*myTolerance ) { PRINT_ERROR("Curve %d may have bad geometry.\n" "While try to partition the curve the move_to operation\n" "returned a move distance larger than the tolerance.\n" "Please try healing or using mesh based geometry for curve %d.\n", ref_edge->id(), ref_edge->id()); return CUBIT_FAILURE; } PRINT_DEBUG_129("Partitioning curve %d\n", ref_edge->id()); RefVertex *vtx_ptr= PartitionTool::instance()->partition(ref_edge, part_vec, edge1, edge2); if ( vtx_ptr == NULL ) { PRINT_ERROR("Partitioning curve failed.\n"); return CUBIT_FAILURE; } if ( edge1->measure() < myTolerance || edge2->measure() < myTolerance ) { PRINT_WARNING("Virtual imprinting created an edge smaller than\n" " the tolerance value. This could be an error.\n" " Check curve %d or %d, imprinting surfs %d and %d.\n", edge1->id(), edge2->id(), refFacePtr1->id(), refFacePtr2->id()); } modified_boundary = CUBIT_TRUE; curr_point->owner(vtx_ptr); //Now readjust owners cause they can change if we partition more //than one curve. for ( ii = partition_points.size(); ii > 0; ii-- ) { curr_point = partition_points.get_and_step(); if( curr_point->owner() == ref_ent ) { if ( on_curve(curr_point, edge1) ) curr_point->owner(dynamic_cast<RefEntity*>(edge1)); else curr_point->owner(dynamic_cast<RefEntity*>(edge2)); } } } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::imprint_segments | ( | SegLoopList & | boundary_line_loops_1, |
SegLoopList & | boundary_line_loops_2, | ||
PointLoopList & | boundary_loops_1, | ||
PointLoopList & | boundary_loops_2 | ||
) | [private] |
Definition at line 4602 of file ImprintBoundaryTool.cpp.
{ int ii, jj; ImprintLineSegment **surf_1_loop_heads, **surf_2_loop_heads; surf_1_loop_heads = new ImprintLineSegment*[boundary_line_loops_1.size()]; surf_2_loop_heads = new ImprintLineSegment*[boundary_line_loops_2.size()]; SegList *line_loop_1, *line_loop_2; ImprintLineSegment *curr_seg; for ( ii = 0; ii < boundary_line_loops_1.size(); ii++ ) { line_loop_1 = boundary_line_loops_1.get_and_step(); surf_1_loop_heads[ii] = line_loop_1->get(); } for ( ii = 0; ii < boundary_line_loops_2.size(); ii++ ) { line_loop_2 = boundary_line_loops_2.get_and_step(); surf_2_loop_heads[ii] = line_loop_2->get(); } KDDTree <ImprintLineSegment*> atree_1(myTolerance, true); KDDTree <ImprintLineSegment*> atree_2(myTolerance, true); //Insert all of the segments on for the boundary line loops into //their respective R-Tree. for ( ii = 0; ii < boundary_line_loops_1.size(); ii++ ) { line_loop_1 = boundary_line_loops_1.get_and_step(); for ( jj = 0; jj < line_loop_1->size(); jj++ ) { curr_seg = line_loop_1->get_and_step(); atree_1.add(curr_seg); } } atree_1.balance(); for ( ii = 0; ii < boundary_line_loops_2.size(); ii++ ) { line_loop_2 = boundary_line_loops_2.get_and_step(); for ( jj = 0; jj < line_loop_2->size(); jj++ ) { curr_seg = line_loop_2->get_and_step(); atree_2.add(curr_seg); } } atree_2.balance(); //Now for each segment on boundary 1, find the closest segments on //boundary 2. Determine for each point on boundary 1 the closest //point on boundary 2 if it is within tolerance. Set this //data in the pointmatched data in ImprintPointData. CubitStatus stat = find_matching_points(boundary_line_loops_1, atree_2 ); if ( stat != CUBIT_SUCCESS ) return stat; //Now for each segment on boundary 2, find the closest segments on //boundary 1. Determine for each point on boundary 2 the closest //point on boundary 1 if it is within tolerance. Set this //data in the pointmatched data in ImprintPointData. stat = find_matching_points(boundary_line_loops_2, atree_1 ); if ( stat != CUBIT_SUCCESS ) return stat; //Now we need to go over each node on the boundaries and resolve //descripensies. Find nodes that match each other and set them //to match each other. Also at this time. Nodes that have //closest points on the interior of a segment will get the //segment split. Also as segments are modified, update the //atree. int num_loops_1 = boundary_line_loops_1.size(); int num_loops_2 = boundary_line_loops_2.size(); stat = final_match( surf_1_loop_heads, num_loops_1, surf_2_loop_heads, num_loops_2, atree_1, atree_2); if ( stat != CUBIT_SUCCESS ) return stat; //Unfortunately, we are not done. We now need to find //cross intersections. These are where two segments of different //surfaces intersect. They don't intersect at the points themselves, //so they weren't captured previously. If I could do this in any other //part of the previous code, I would. I just can't figure out //how to do it without sacrificing robustness. //Note that only atree_2 is passed in. After this point, //atree_1 will be out of date. stat = find_crossings(surf_1_loop_heads, num_loops_1, surf_2_loop_heads, num_loops_2, atree_2); if ( stat != CUBIT_SUCCESS ) return stat; //Recaputure the linked list into the DLIList structure. update_boundary_loops( boundary_loops_1, surf_1_loop_heads); update_boundary_loops( boundary_loops_2, surf_2_loop_heads); delete [] surf_1_loop_heads; delete [] surf_2_loop_heads; stat = resolve_on_boundaries( boundary_loops_1, boundary_loops_2); if ( stat != CUBIT_SUCCESS ) return stat; if ( DEBUG_FLAG(129) ) { GfxDebug::clear(); draw_loops(boundary_loops_1); draw_loops(boundary_loops_2); GfxDebug::mouse_xforms(); } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::imprint_surface | ( | RefFace * | ref_face, |
PointLoopList & | part_segs, | ||
DLIList< RefFace * > & | results | ||
) | [private] |
Definition at line 3635 of file ImprintBoundaryTool.cpp.
{ //Now go through and create refedges for partitioning. int ii, jj, counter; DLIList<RefFace*> tmp_results; DLIList<RefEdge*> ref_edges; ImprintPointData *start_imp, *end_imp, *curr_imp, *matching_start, *matching_end; PointList *loop_ptr; DLIList<CubitVector*> curve_vectors; CubitBoolean first_on_loop; RefVertex *prev_end; RefVertex *first_v_on_loop = NULL; for ( ii = part_segs.size(); ii > 0; ii-- ) { loop_ptr = part_segs.get_and_step(); loop_ptr->reset(); first_on_loop = CUBIT_TRUE; prev_end = NULL; first_v_on_loop = NULL; for ( jj = loop_ptr->size(); jj > 0; jj-- ) { start_imp = loop_ptr->get_and_step(); if ( !start_imp->is_owner_vertex() ) { PRINT_ERROR("Bad logic in imprint_surface for ImprintBoundaryTool\n"); assert( start_imp->is_owner_vertex() ); return CUBIT_FAILURE; } end_imp = NULL; curve_vectors.clean_out(); counter = 0; //For the last point, only create another edge if the //the start is also an end... if ( jj == 1 && loop_ptr->get()->get_end_partition() != CUBIT_TRUE ) continue; //Loop until we get to the end of the partition or //till we have to create a new ref_edge. while( loop_ptr->get()->get_end_partition() != CUBIT_TRUE ) { counter++; curr_imp = loop_ptr->get_and_step(); if (curr_imp->is_owner_vertex()) { end_imp = curr_imp; counter--; loop_ptr->back(); break; } else { CubitVector *temp = new CubitVector(curr_imp->coordinates()); curve_vectors.append(temp); } } jj -= counter; CubitBoolean verts_same = CUBIT_FALSE; if ( end_imp == NULL ) { if ( loop_ptr->get()->get_end_partition() == CUBIT_TRUE ) { //Do this last segment. This means that we have a complete loop //for partitioning. end_imp = loop_ptr->get(); if ( curve_vectors.size() == loop_ptr->size() - 1) verts_same = CUBIT_TRUE; } else { //Either we have a screw-up or we have //a periodic boundary. //Lets say end_imp is the last in the loop. loop_ptr->reset(); end_imp = loop_ptr->prev(); //Now make sure that end_imp and start_imp are connected. RefEntity *ent_1 = start_imp->owner(); RefEntity *ent_2 = end_imp->owner(); if ( are_connected( ent_1, ent_2, ref_face ) ) { verts_same = CUBIT_TRUE; end_imp = start_imp; } else { PRINT_ERROR("Problems extracting parition edge in ImprintBoundaryTool.\n"); return CUBIT_FAILURE; } } } //Create vertices from the first and last vectors. CubitVector tmp_vec = start_imp->coordinates(); matching_start = start_imp->get_matching_point(); if ( matching_start != NULL ) { //use this location instead. This should be on //the other boundary and will insure that the point // intersects it... tmp_vec = matching_start->coordinates(); } RefVertex *first_ref = create_virtual_vertex(tmp_vec); //It is tempting to update the start_imp's owner at this point, //but DON'T. These vertices belong to this surfaces boundary. The //start_imp really belongs to the other boundary that is intersecting //with this boundary. If you change the owner, you'll end up merging //vertices accross boundaries. Don't do that... RefVertex *last_ref=NULL; if ( verts_same ) { last_ref = first_ref; prev_end = last_ref; } else { tmp_vec = end_imp->coordinates(); matching_end = end_imp->get_matching_point(); if ( matching_end != NULL ) { //use this location instead. This should be on //the other boundary and will insure that the point // intersects it... tmp_vec = matching_end->coordinates(); } last_ref = create_virtual_vertex(tmp_vec); //again don't update the end_imp owner either., see above comment. } assert( first_ref && last_ref ); RefEdge *ref_edge = NULL; //if curve_vectors is empty, this is just a straight line //curve. ref_edge = create_virtual_edge(first_ref, last_ref, curve_vectors); allocatedRefEdge->append(ref_edge); int tt; for ( tt = curve_vectors.size(); tt > 0; tt-- ) delete curve_vectors.pop(); if ( ref_edge == NULL ) { PRINT_ERROR("Problem creating virtual edge in imprinting.\n"); return CUBIT_FAILURE; } ref_edges.append(ref_edge); if ( first_on_loop ) { first_on_loop = CUBIT_FALSE; //merge the start_imp's vertex with it's matching vertex. matching_start = start_imp->get_matching_point(); if ( matching_start != NULL ) { RefEntity *other_ent = matching_start->owner(); RefVertex *matching_vert = CAST_TO(other_ent, RefVertex); if ( matching_vert == NULL ) { PRINT_ERROR("Problems mergeing partition to boundary on imprint.\n"); assert(matching_vert != NULL); return CUBIT_FAILURE; } CubitBoolean kept_1 = CUBIT_TRUE; CubitStatus temp_stat = merge_vertices(matching_vert, first_ref, kept_1); if ( temp_stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; RefVertex *owner_v = kept_1 ? matching_vert : first_ref; //Update the matching_start cause the matching imprint point data IS on //this boundary. (which is why we had to merge with it!). matching_start->owner(owner_v); if ( start_imp->get_start_partition() && start_imp->get_end_partition() ) first_v_on_loop = owner_v; } else first_v_on_loop = first_ref; } else if ( prev_end && last_ref != first_ref) { //merge the prev_end vert and first_ref verts. CubitBoolean kept_1 = CUBIT_TRUE; CubitStatus temp_stat = merge_vertices(prev_end, first_ref, kept_1); if ( temp_stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; prev_end = kept_1 ? prev_end : first_ref; //Don't update any imprint point data owners, nothing changed for this //boundary. } if ( last_ref != first_ref ) prev_end = last_ref; } //Merge the end vertex to the boundary. loop_ptr->reset(); end_imp = loop_ptr->prev(); if ( end_imp->is_owner_vertex() && (end_imp->get_point_type() == CREATE_NEW_VERTEX || end_imp->get_point_type() == VERTEX_ON_BOTH_BOUNDARIES ) && end_imp->get_matching_point() ) { matching_end = end_imp->get_matching_point(); RefEntity *other_ent = matching_end->owner(); RefVertex *matching_vert = CAST_TO(other_ent, RefVertex); //use prev_end, hope its still valid!!! assert(prev_end != NULL); RefVertex *end_vertex = prev_end; if ( matching_vert == NULL || end_vertex == NULL ) { PRINT_ERROR("Problems mergeing partition to boundary on imprint.\n"); assert(matching_vert != NULL); assert(end_vertex != NULL); return CUBIT_FAILURE; } CubitBoolean kept_1 = CUBIT_TRUE; CubitStatus temp_stat = merge_vertices(matching_vert, end_vertex, kept_1); if ( temp_stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; RefVertex *owner_v = kept_1 ? matching_vert : end_vertex; //Again just update the matching_end since it is on this boundary. matching_end->owner(owner_v); } else if ( loop_ptr->get()->get_start_partition() && loop_ptr->get()->get_end_partition() ) { assert(first_v_on_loop != NULL); //Merge the prev_end and this vertex. CubitBoolean kept_1; CubitStatus temp_stat = merge_vertices(first_v_on_loop, prev_end, kept_1); if ( temp_stat != CUBIT_SUCCESS ) return CUBIT_FAILURE; } } CubitStatus stat; //Okay, these should all be merged properly and ready to partition! if ( ref_edges.size() > 0 ) { //Make sure that either the ref_edge_list touches the boundary at least //twice or is a complete loop... if ( valid_partition( ref_edges, ref_face ) ) { PRINT_DEBUG_129("Partitioning surface %d\n", ref_face->id()); int tmp_debug = 0; if (tmp_debug) { GfxDebug::clear(); GfxDebug::draw_ref_face(ref_face); int oo; for (oo=0; oo < ref_edges.size(); oo++ ) GfxDebug::draw_ref_edge(ref_edges.next(oo), CUBIT_RED_INDEX); GfxDebug::flush(); GfxDebug::mouse_xforms(); } stat = PartitionTool::instance()->partition(ref_face, ref_edges, tmp_results, CUBIT_FALSE, NULL, CUBIT_TRUE); if ( stat != CUBIT_SUCCESS ) { PRINT_ERROR("Partitioning surface %d failed\n", ref_face->id()); return stat; } else { results += tmp_results; } } } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::intersect_segments | ( | ImprintLineSegment * | seg_1, |
ImprintLineSegment * | seg_2, | ||
IntersectResult & | int_result, | ||
ImprintLineSegment ** | new_segments | ||
) | [private] |
Definition at line 633 of file ImprintBoundaryTool.cpp.
{ int ii; //initialize the results first. for ( ii = 0; ii < 4; ii++) new_segments[ii] = NULL; ImprintPointData* imp_point_0 = seg_1->get_start(); ImprintPointData* imp_point_1 = seg_1->get_end(); ImprintPointData* imp_point_2 = seg_2->get_start(); ImprintPointData* imp_point_3 = seg_2->get_end(); int debug4 = 0; if ( debug4 ) { draw_point(imp_point_0); draw_point(imp_point_1); draw_point(imp_point_2); draw_point(imp_point_3); } int debug = 0; //First go through and test the end points. //This will test for cases L_INTERSECT, and SEGS_EQUAL, and OVERLAP_JOIN. MatchType type_0, type_1, type_2, type_3; CubitStatus stat1 = match_points(seg_1, seg_2,type_0, type_1, type_2, type_3); //First handle the basic stuff; if ( type_0 == MATCH_0_2 && type_1 == MATCH_1_3 && type_2 == MATCH_0_2 && type_3 == MATCH_1_3 ) { imp_point_0->set_matching_point(imp_point_2); imp_point_2->set_matching_point(imp_point_0); imp_point_1->set_matching_point(imp_point_3); imp_point_3->set_matching_point(imp_point_1); //These segments are equal. set_type_for_equal(imp_point_0, imp_point_2, imp_point_1, imp_point_3); int_result = SEGS_EQUAL_0_2; PRINT_DEBUG_129("Found SEGS_EQUAL_0_2\n"); return CUBIT_SUCCESS; } else if ( type_0 == MATCH_0_3 && type_1 == MATCH_1_2 && type_3 == MATCH_0_3 && type_2 == MATCH_1_2 ) { imp_point_0->set_matching_point(imp_point_3); imp_point_3->set_matching_point(imp_point_0); imp_point_1->set_matching_point(imp_point_2); imp_point_2->set_matching_point(imp_point_1); //These segments are equal. set_type_for_equal(imp_point_0, imp_point_3, imp_point_1, imp_point_2); int_result = SEGS_EQUAL_0_3; PRINT_DEBUG_129("Found SEGS_EQUAL_0_3\n"); return CUBIT_SUCCESS; } else if ( type_0 == MATCH_0_2 && type_2 == MATCH_0_2 && (type_1 == NO_MATCH || type_1 == MATCH_1_6 || type_1 == MATCH_1_7) && (type_3 == NO_MATCH || type_3 == MATCH_3_4 || type_3 == MATCH_3_5) ) { imp_point_0->set_matching_point(imp_point_2); imp_point_2->set_matching_point(imp_point_0); return case_0_2_equal(seg_1, seg_2, imp_point_0, imp_point_1, imp_point_2, imp_point_3, type_1, type_3, int_result, new_segments); } else if ( type_0 == MATCH_0_3 && type_3 == MATCH_0_3 && (type_1 == NO_MATCH || type_1 == MATCH_1_6 || type_1 == MATCH_1_7) && (type_2 == NO_MATCH || type_2 == MATCH_2_4 || type_2 == MATCH_2_5) ) { imp_point_0->set_matching_point(imp_point_3); imp_point_3->set_matching_point(imp_point_0); return case_0_3_equal(seg_1, seg_2, imp_point_0, imp_point_1, imp_point_2, imp_point_3, type_1, type_2, int_result, new_segments); } else if ( type_1 == MATCH_1_2 && type_2 == MATCH_1_2 && (type_0 == NO_MATCH || type_0 == MATCH_0_6 || type_0 == MATCH_0_7) && (type_3 == NO_MATCH || type_3 == MATCH_3_4 || type_3 == MATCH_3_5) ) { imp_point_1->set_matching_point(imp_point_2); imp_point_2->set_matching_point(imp_point_1); return case_1_2_equal(seg_1, seg_2, imp_point_0, imp_point_1, imp_point_2, imp_point_3, type_0, type_3, int_result, new_segments); } else if ( type_1 == MATCH_1_3 && type_3 == MATCH_1_3 && (type_0 == NO_MATCH || type_0 == MATCH_0_6 || type_0 == MATCH_0_7) && (type_2 == NO_MATCH || type_2 == MATCH_2_4 || type_2 == MATCH_2_5) ) { imp_point_1->set_matching_point(imp_point_3); imp_point_3->set_matching_point(imp_point_1); return case_1_3_equal(seg_1, seg_2, imp_point_0, imp_point_1, imp_point_2, imp_point_3, type_0, type_2, int_result, new_segments); } else if ( type_0 != NO_MATCH || type_1 != NO_MATCH || type_2 != NO_MATCH || type_3 != NO_MATCH ) { if ( type_0 == MATCH_0_2 || type_0 == MATCH_0_3 || type_1 == MATCH_1_2 || type_1 == MATCH_1_3 || type_2 == MATCH_1_2 || type_2 == MATCH_0_2 || type_3 == MATCH_0_3 || type_3 == MATCH_1_3 ) { if (debug ) { draw_point(imp_point_0); draw_point(imp_point_1); draw_point(imp_point_2); draw_point(imp_point_3); draw_point(seg_1->get_prev()->get_start()); draw_point(seg_1->get_next()->get_end()); draw_point(seg_2->get_prev()->get_start()); draw_point(seg_2->get_next()->get_end()); GfxDebug::mouse_xforms(); } if ( type_1 == MATCH_1_2 && type_2 == MATCH_1_2 && imp_point_1->get_matching_point() == imp_point_2 ) { if ( type_0 == MATCH_0_3 && type_3 == MATCH_3_5 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else if ( type_3 == MATCH_0_3 && type_0 == MATCH_0_7 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else { if (( type_0 == MATCH_0_2 || type_3 == MATCH_1_3 ) || ( type_0 == MATCH_0_3 && type_3 == MATCH_3_4 ) || ( type_0 == MATCH_0_7 && type_3 == MATCH_0_3 ) || ( type_0 == MATCH_0_6 && type_3 == MATCH_0_3 ) || ( type_0 == MATCH_0_3 && type_3 == MATCH_3_5 ) ) { //This means that 0 and 2 are within tolerance //but 1 and 2 are closer. For now just ignore this... //or... //This means that 1 and 3 are within tolerance //but 1 and 2 are closer. For now just ignore this... imp_point_1->set_matching_point(imp_point_2); imp_point_2->set_matching_point(imp_point_1); return case_1_2_equal(seg_1, seg_2, imp_point_0, imp_point_1, imp_point_2, imp_point_3, type_0, type_3, int_result, new_segments); } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } } else if ( type_0 == MATCH_0_3 && type_3 == MATCH_0_3 && imp_point_0->get_matching_point() == imp_point_3 ) { if ( type_1 == MATCH_1_2 && type_2 == MATCH_2_4 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else if ( type_2 == MATCH_1_2 && type_1 == MATCH_1_7 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else { if (( type_1 == MATCH_1_3 || type_2 == MATCH_0_2 ) || ( type_1 == MATCH_1_2 && type_2 == MATCH_2_5 ) || ( type_1 == MATCH_1_2 && type_2 == MATCH_2_4 ) || ( type_1 == MATCH_1_6 && type_2 == MATCH_1_2 ) || ( type_1 == MATCH_1_7 && type_2 == MATCH_1_2 ) ) { //This means that 1 and 3 are within tolerance //but 0 and 3 are closer. For now just ignore this... //or... //This means that 0 and 2 are within tolerance //but 0 and 3 are closer. For now just ignore this... imp_point_0->set_matching_point(imp_point_3); imp_point_3->set_matching_point(imp_point_0); return case_0_3_equal(seg_1, seg_2, imp_point_0, imp_point_1, imp_point_2, imp_point_3, type_1, type_2, int_result, new_segments); } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } } else if ( type_1 == MATCH_1_3 && type_3 == MATCH_1_3 && imp_point_1->get_matching_point() == imp_point_3 ) { if ( type_0 == MATCH_0_2 && type_2 == MATCH_2_5 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else if ( type_2 == MATCH_0_2 && type_0 == MATCH_0_7 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else { if (( type_0 == MATCH_0_3 || type_2 == MATCH_1_2 ) || ( type_0 == MATCH_0_2 && type_2 == MATCH_2_4 ) || ( type_0 == MATCH_0_2 && type_2 == MATCH_2_5 ) || ( type_0 == MATCH_0_6 && type_2 == MATCH_0_2 ) || ( type_0 == MATCH_0_7 && type_2 == MATCH_0_2 ) ) { //This means that 0 and 3 are within tolerance //but 1 and 3 are closer. For now just ignore this... //or... //This means that 1 and 2 are within tolerance //but 1 and 3 are closer. For now just ignore this... imp_point_1->set_matching_point(imp_point_3); imp_point_3->set_matching_point(imp_point_1); return case_1_3_equal(seg_1, seg_2, imp_point_0, imp_point_1, imp_point_2, imp_point_3, type_0, type_2, int_result, new_segments); } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } } else if ( type_0 == MATCH_0_2 && type_2 == MATCH_0_2 && imp_point_0->get_matching_point() == imp_point_2 ) { if ( type_1 == MATCH_1_3 && type_3 == MATCH_3_4 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else if ( type_3 == MATCH_1_3 && type_1 == MATCH_1_6 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else { if (( type_1 == MATCH_1_2 || type_3 == MATCH_0_3 ) || ( type_1 == MATCH_1_3 && type_3 == MATCH_3_5) || ( type_1 == MATCH_1_3 && type_3 == MATCH_3_4) || ( type_1 == MATCH_1_6 && type_3 == MATCH_1_3) || ( type_1 == MATCH_1_7 && type_3 == MATCH_1_3) ) { //This means that 0 and 3 are within tolerance //but 0 and 2 are closer. For now just ignore this... //or... //This means that 1 and 2 are within tolerance //but 0 and 2 are closer. For now just ignore this... imp_point_0->set_matching_point(imp_point_2); imp_point_2->set_matching_point(imp_point_0); return case_0_2_equal(seg_1, seg_2, imp_point_0, imp_point_1, imp_point_2, imp_point_3, type_1, type_3, int_result, new_segments); } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } } else if ( type_0 == MATCH_0_2 || ( type_0 == MATCH_0_3 && (type_2 != MATCH_0_2 && type_3 != MATCH_0_3 ) ) ) { if ( type_2 != MATCH_1_2 && type_3 != MATCH_1_3 && type_1 != MATCH_1_2 && type_1 != MATCH_1_3 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } else if ( type_1 == MATCH_1_2 || ( type_1 == MATCH_1_3 && (type_2 != MATCH_1_2 && type_3 != MATCH_1_3 ) ) ) { if ( type_2 != MATCH_0_2 && type_3 != MATCH_0_3 && type_0 != MATCH_0_2 && type_1 != MATCH_0_3 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } else if ( type_2 == MATCH_0_2 || ( type_2 == MATCH_1_2 && (type_0 != MATCH_0_2 && type_1 != MATCH_1_2) ) ) { if ( type_0 != MATCH_0_2 && type_1 != MATCH_1_2 && type_3 != MATCH_0_3 && type_3 != MATCH_1_3 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } else if ( type_3 == MATCH_0_3 || ( type_3 == MATCH_1_3 && (type_0 != MATCH_0_3 && type_1 != MATCH_1_3) ) ) { if ( type_0 != MATCH_0_3 && type_1 != MATCH_1_3 && type_2 != MATCH_0_2 && type_2 != MATCH_1_2 ) { int_result = NO_INTERSECT; return CUBIT_SUCCESS; } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } else { PRINT_ERROR("Problems with tolerance. (Need special match code.)\n"); return CUBIT_FAILURE; } } } //At this point we know that none of the end points of the //line segements are within tolerance. The remaining possibilities //Are: T_INTERSECT, OVERLAP_PART, OVERLAP_ALL, or CROSS_INTERSECT. CubitBoolean point_0_on_seg_2 = CUBIT_FALSE; CubitBoolean point_1_on_seg_2 = CUBIT_FALSE; CubitBoolean point_2_on_seg_1 = CUBIT_FALSE; CubitBoolean point_3_on_seg_1 = CUBIT_FALSE; //Test to get the correct values for these flags. From the above //flags we can figure out everything except for CROSS_INTERSECT. stat1 = determine_on_boundary( seg_1, seg_2, type_0, type_1, type_2, type_3 ); if ( stat1 != CUBIT_SUCCESS ) return stat1; if ( type_0 == ON_SEG_2 ) point_0_on_seg_2 = CUBIT_TRUE; if ( type_1 == ON_SEG_2 ) point_1_on_seg_2 = CUBIT_TRUE; if ( type_2 == ON_SEG_1 ) point_2_on_seg_1 = CUBIT_TRUE; if ( type_3 == ON_SEG_1 ) point_3_on_seg_1 = CUBIT_TRUE; //Okay, test for T_INTERSECT. if ( point_0_on_seg_2 && !point_1_on_seg_2 && !point_2_on_seg_1 && !point_3_on_seg_1 ) { PRINT_DEBUG_129("Found T_INTERSECT_0\n"); int_result = T_INTERSECT_0; //split seg_2 ImprintLineSegment *new_seg_2_0, *new_seg_0_3; //copy imp_point_0 to use it in list 2. CubitVector closest_point; closest_point_seg( imp_point_0, seg_2, closest_point); ImprintPointData *new_point_0 = new ImprintPointData(imp_point_0, closest_point); new_point_0->owner(seg_2->owner()); allocatedPointData->append(new_point_0); //set the point type to be so we create a vertex here. new_point_0->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_0->is_owner_vertex() && imp_point_0->get_point_type() != CREATE_NEW_VERTEX ) imp_point_0->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); else imp_point_0->set_point_type(CREATE_NEW_VERTEX); new_seg_2_0 = new ImprintLineSegment(imp_point_2, new_point_0, seg_2->owner()); new_seg_0_3 = new ImprintLineSegment(new_point_0, imp_point_3, seg_2->owner()); allocatedLineData->append(new_seg_2_0); allocatedLineData->append(new_seg_0_3); new_segments[2] = new_seg_2_0; new_segments[3] = new_seg_0_3; //update the linked list. update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( point_1_on_seg_2 && !point_0_on_seg_2 && !point_2_on_seg_1 && !point_3_on_seg_1 ) { //split seg_2 PRINT_DEBUG_129("Found T_INTERSECT_1\n"); int_result = T_INTERSECT_1; ImprintLineSegment *new_seg_2_1, *new_seg_1_3; //copy imp_point_1 to use it in list 2. CubitVector closest_point; closest_point_seg( imp_point_1, seg_2, closest_point); ImprintPointData *new_point_1 = new ImprintPointData(imp_point_1, closest_point); new_point_1->owner(seg_2->owner()); allocatedPointData->append(new_point_1); //set the point type to be so we create a vertex here. new_point_1->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_1->is_owner_vertex() && imp_point_1->get_point_type() != CREATE_NEW_VERTEX ) imp_point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); else imp_point_1->set_point_type(CREATE_NEW_VERTEX); new_seg_2_1 = new ImprintLineSegment(imp_point_2, new_point_1, seg_2->owner()); new_seg_1_3 = new ImprintLineSegment(new_point_1, imp_point_3, seg_2->owner()); allocatedLineData->append(new_seg_2_1); allocatedLineData->append(new_seg_1_3); new_segments[2] = new_seg_2_1; new_segments[3] = new_seg_1_3; //update the linked list update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( point_2_on_seg_1 && !point_0_on_seg_2 && !point_1_on_seg_2 && !point_3_on_seg_1 ) { PRINT_DEBUG_129("Found T_INTERSECT_2\n"); int_result = T_INTERSECT_2; //split seg_1 ImprintLineSegment *new_seg_0_2, *new_seg_2_1; //copy imp_point_2 to use it in list 1. CubitVector closest_point; closest_point_seg( imp_point_2, seg_1, closest_point); ImprintPointData *new_point_2 = new ImprintPointData(imp_point_2, closest_point); new_point_2->owner(seg_1->owner()); allocatedPointData->append(new_point_2); //set the point type to be so we create a vertex here. new_point_2->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_2->is_owner_vertex() && imp_point_2->get_point_type() != CREATE_NEW_VERTEX ) imp_point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); else imp_point_2->set_point_type(CREATE_NEW_VERTEX); new_seg_0_2 = new ImprintLineSegment(imp_point_0, new_point_2, seg_1->owner()); new_seg_2_1 = new ImprintLineSegment(new_point_2, imp_point_1, seg_1->owner()); allocatedLineData->append(new_seg_0_2); allocatedLineData->append(new_seg_2_1); new_segments[0] = new_seg_0_2; new_segments[1] = new_seg_2_1; //update the linked list update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); seg_1->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( point_3_on_seg_1 && !point_0_on_seg_2 && !point_1_on_seg_2 && !point_2_on_seg_1 ) { PRINT_DEBUG_129("Found T_INTERSECT_3\n"); int_result = T_INTERSECT_3; //split seg_1 //copy imp_point_3 to use it in list 1. CubitVector closest_point; closest_point_seg( imp_point_3, seg_1, closest_point); ImprintPointData *new_point_3 = new ImprintPointData(imp_point_3, closest_point); new_point_3->owner(seg_1->owner()); allocatedPointData->append(new_point_3); //set the point type to be so we create a vertex here. new_point_3->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_3->is_owner_vertex() && imp_point_3->get_point_type() != CREATE_NEW_VERTEX ) imp_point_3->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); else imp_point_3->set_point_type(CREATE_NEW_VERTEX); ImprintLineSegment *new_seg_0_3, *new_seg_3_1; new_seg_0_3 = new ImprintLineSegment(imp_point_0, new_point_3, seg_1->owner()); new_seg_3_1 = new ImprintLineSegment(new_point_3, imp_point_1, seg_1->owner()); allocatedLineData->append(new_seg_0_3); allocatedLineData->append(new_seg_3_1); new_segments[0] = new_seg_0_3; new_segments[1] = new_seg_3_1; //update the linked list update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); seg_1->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } //Okay, we are done with T intersections, it now must be one //of the remaining overlaps (part or all.) or the cross intersection. //First test for the part overlaps. if ( point_1_on_seg_2 && point_2_on_seg_1 && !point_0_on_seg_2 && !point_3_on_seg_1 ) { PRINT_DEBUG_129("Found OVEVERLAP_PART_0_3\n"); int_result = OVERLAP_PART_0_3; ImprintLineSegment *new_seg_0_2, *new_seg_2_1; ImprintLineSegment *new_seg_2_1_v2, *new_seg_1_3; //Copy point 2 to use on seg_1 CubitVector closest_point; closest_point_seg( imp_point_2, seg_1, closest_point); ImprintPointData *new_point_2 = new ImprintPointData(imp_point_2, closest_point); new_point_2->owner(seg_1->owner()); allocatedPointData->append(new_point_2); if ( imp_point_2->is_owner_vertex() ) { new_point_2->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_2->get_point_type() != CREATE_NEW_VERTEX ) imp_point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_2->set_point_type(ON_BOTH_BOUNDARIES); imp_point_2->set_point_type(ON_BOTH_BOUNDARIES); } //split both segs 1 and 2. new_seg_0_2 = new ImprintLineSegment(imp_point_0, new_point_2, seg_1->owner()); new_seg_2_1 = new ImprintLineSegment(new_point_2, imp_point_1, seg_1->owner()); allocatedLineData->append(new_seg_0_2); allocatedLineData->append(new_seg_2_1); //Copy point 1 to use on seg_2 closest_point_seg( imp_point_1, seg_2, closest_point); ImprintPointData *new_point_1 = new ImprintPointData(imp_point_1, closest_point); new_point_1->owner(seg_2->owner()); allocatedPointData->append(new_point_1); if ( imp_point_1->is_owner_vertex() ) { new_point_1->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_1->get_point_type() != CREATE_NEW_VERTEX ) imp_point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else new_point_1->set_point_type(ON_BOTH_BOUNDARIES); new_seg_2_1_v2 = new ImprintLineSegment(imp_point_2, new_point_1, seg_2->owner()); new_seg_1_3 = new ImprintLineSegment(new_point_1, imp_point_3, seg_2->owner()); allocatedLineData->append(new_seg_2_1_v2); allocatedLineData->append(new_seg_1_3); new_segments[0] = new_seg_0_2; new_segments[1] = new_seg_2_1; new_segments[2] = new_seg_2_1_v2; new_segments[3] = new_seg_1_3; //now update both linked lists. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_1->set_inactive(CUBIT_TRUE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( point_1_on_seg_2 && !point_2_on_seg_1 && !point_0_on_seg_2 && point_3_on_seg_1 ) { PRINT_DEBUG_129("Found OVEVERLAP_PART_0_2\n"); int_result = OVERLAP_PART_0_2; ImprintLineSegment *new_seg_0_3, *new_seg_3_1; ImprintLineSegment *new_seg_2_1, *new_seg_1_3; //Copy point 2 to use on seg_1 CubitVector closest_point; closest_point_seg( imp_point_3, seg_1, closest_point); ImprintPointData *new_point_3 = new ImprintPointData(imp_point_3, closest_point); new_point_3->owner(seg_1->owner()); allocatedPointData->append(new_point_3); int debug1 = 0; if ( debug1 ) { GfxDebug::clear(); draw_seg(seg_1); draw_seg(seg_2); draw_point(imp_point_0); draw_point(imp_point_1); draw_point(imp_point_2); draw_point(imp_point_3); GfxDebug::mouse_xforms(); } if ( imp_point_3->is_owner_vertex() ) { new_point_3->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_3->get_point_type() != CREATE_NEW_VERTEX ) imp_point_3->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_3->set_point_type(ON_BOTH_BOUNDARIES); imp_point_3->set_point_type(ON_BOTH_BOUNDARIES); } //split both segs 1 and 2. new_seg_0_3 = new ImprintLineSegment(imp_point_0, new_point_3, seg_1->owner()); new_seg_3_1 = new ImprintLineSegment(new_point_3, imp_point_1, seg_1->owner()); allocatedLineData->append(new_seg_0_3); allocatedLineData->append(new_seg_3_1); //Copy point 1 to use on seg_2 closest_point_seg( imp_point_1, seg_2, closest_point); ImprintPointData *new_point_1 = new ImprintPointData(imp_point_1, closest_point); new_point_1->owner(seg_2->owner()); allocatedPointData->append(new_point_1); if ( imp_point_1->is_owner_vertex() ) { new_point_1->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_1->get_point_type() != CREATE_NEW_VERTEX ) imp_point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else new_point_1->set_point_type(ON_BOTH_BOUNDARIES); new_seg_2_1 = new ImprintLineSegment(imp_point_2, new_point_1, seg_2->owner()); new_seg_1_3 = new ImprintLineSegment(new_point_1, imp_point_3, seg_2->owner()); allocatedLineData->append(new_seg_2_1); allocatedLineData->append(new_seg_1_3); new_segments[0] = new_seg_0_3; new_segments[1] = new_seg_3_1; new_segments[2] = new_seg_2_1; new_segments[3] = new_seg_1_3; //now update both linked lists. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_1->set_inactive(CUBIT_TRUE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( !point_1_on_seg_2 && !point_2_on_seg_1 && point_0_on_seg_2 && point_3_on_seg_1 ) { PRINT_DEBUG_129("Found OVERLAP_PART_1_2\n"); int_result = OVERLAP_PART_1_2; ImprintLineSegment *new_seg_0_3, *new_seg_3_1; ImprintLineSegment *new_seg_2_0, *new_seg_0_3_v2; //Copy point_3 to use on seg 1. CubitVector closest_point; closest_point_seg( imp_point_3, seg_1, closest_point); ImprintPointData *new_point_3 = new ImprintPointData(imp_point_3, closest_point); new_point_3->owner(seg_1->owner()); allocatedPointData->append(new_point_3); if ( imp_point_3->is_owner_vertex() ) { new_point_3->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_3->get_point_type() != CREATE_NEW_VERTEX ) imp_point_3->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_3->set_point_type(ON_BOTH_BOUNDARIES); imp_point_3->set_point_type(ON_BOTH_BOUNDARIES); } //split both segs 1 and 2. new_seg_0_3 = new ImprintLineSegment(imp_point_0, new_point_3, seg_1->owner()); new_seg_3_1 = new ImprintLineSegment(new_point_3, imp_point_1, seg_1->owner()); allocatedLineData->append(new_seg_0_3); allocatedLineData->append(new_seg_3_1); //Copy point_0 to use on seg 2. closest_point_seg( imp_point_0, seg_2, closest_point); ImprintPointData *new_point_0 = new ImprintPointData(imp_point_0, closest_point); new_point_0->owner(seg_2->owner()); allocatedPointData->append(new_point_0); if ( imp_point_0->is_owner_vertex() ) { new_point_0->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_0->get_point_type() != CREATE_NEW_VERTEX ) imp_point_0->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_0->set_point_type(ON_BOTH_BOUNDARIES); imp_point_0->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_2_0 = new ImprintLineSegment(imp_point_2, new_point_0, seg_2->owner()); new_seg_0_3_v2 = new ImprintLineSegment(new_point_0, imp_point_3, seg_2->owner()); allocatedLineData->append(new_seg_2_0); allocatedLineData->append(new_seg_0_3_v2); new_segments[0] = new_seg_0_3; new_segments[1] = new_seg_3_1; new_segments[2] = new_seg_2_0; new_segments[3] = new_seg_0_3_v2; //update both lists. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_1->set_inactive(CUBIT_TRUE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else if ( !point_1_on_seg_2 && point_2_on_seg_1 && point_0_on_seg_2 && !point_3_on_seg_1 ) { PRINT_DEBUG_129("Found OVERLAP_PART_1_3\n"); int_result = OVERLAP_PART_1_3; ImprintLineSegment *new_seg_0_2, *new_seg_2_1; ImprintLineSegment *new_seg_2_0, *new_seg_0_3; //Copy point_3 to use on seg 1. CubitVector closest_point; closest_point_seg( imp_point_2, seg_1, closest_point); ImprintPointData *new_point_2 = new ImprintPointData(imp_point_2, closest_point); new_point_2->owner(seg_1->owner()); allocatedPointData->append(new_point_2); if ( imp_point_2->is_owner_vertex() ) { new_point_2->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_2->get_point_type() != CREATE_NEW_VERTEX ) imp_point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_2->set_point_type(ON_BOTH_BOUNDARIES); imp_point_2->set_point_type(ON_BOTH_BOUNDARIES); } //split both segs 1 and 2. new_seg_0_2 = new ImprintLineSegment(imp_point_0, new_point_2, seg_1->owner()); new_seg_2_1 = new ImprintLineSegment(new_point_2, imp_point_1, seg_1->owner()); allocatedLineData->append(new_seg_0_2); allocatedLineData->append(new_seg_2_1); //Copy point_0 to use on seg 2. closest_point_seg( imp_point_0, seg_2, closest_point); ImprintPointData *new_point_0 = new ImprintPointData(imp_point_0, closest_point); new_point_0->owner(seg_2->owner()); allocatedPointData->append(new_point_0); if ( imp_point_0->is_owner_vertex() ) { new_point_0->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_0->get_point_type() != CREATE_NEW_VERTEX ) imp_point_0->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_0->set_point_type(ON_BOTH_BOUNDARIES); imp_point_0->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_2_0 = new ImprintLineSegment(imp_point_2, new_point_0, seg_2->owner()); new_seg_0_3 = new ImprintLineSegment(new_point_0, imp_point_3, seg_2->owner()); allocatedLineData->append(new_seg_2_0); allocatedLineData->append(new_seg_0_3); new_segments[0] = new_seg_0_2; new_segments[1] = new_seg_2_1; new_segments[2] = new_seg_2_0; new_segments[3] = new_seg_0_3; //update both lists. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); seg_1->set_inactive(CUBIT_TRUE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } //Now test for the overlap all conditions. else if ( !point_0_on_seg_2 && !point_1_on_seg_2 && point_2_on_seg_1 && point_3_on_seg_1 ) { //First we know that for either of the next cases, we //have to copy points 2 and 3, do that first then //decide the particular intersection case. //copy points 2 and 3 to use on segment 1. CubitVector closest_point; closest_point_seg( imp_point_2, seg_1, closest_point); ImprintPointData *new_point_2 = new ImprintPointData(imp_point_2, closest_point); new_point_2->owner(seg_1->owner()); allocatedPointData->append(new_point_2); if ( imp_point_2->is_owner_vertex() ) { new_point_2->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_2->get_point_type() != CREATE_NEW_VERTEX ) imp_point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_2->set_point_type(ON_BOTH_BOUNDARIES); imp_point_2->set_point_type(ON_BOTH_BOUNDARIES); } closest_point_seg( imp_point_3, seg_1, closest_point); ImprintPointData *new_point_3 = new ImprintPointData(imp_point_3, closest_point); new_point_3->owner(seg_1->owner()); allocatedPointData->append(new_point_3); if ( imp_point_3->is_owner_vertex() ) { new_point_3->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_3->get_point_type() != CREATE_NEW_VERTEX ) imp_point_3->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); imp_point_3->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_3->set_point_type(ON_BOTH_BOUNDARIES); imp_point_3->set_point_type(ON_BOTH_BOUNDARIES); } //IMPORTANT: Now breaking up the line segments is special for the //overlap all case. This is the one situation where //the one exterior segment gets broken into *3* new segments. //Every other instance in this function only breaks each segment //into two... //To distinguish between OVERLAP_ALL_0_2_3_1 and OVERLAP_ALL_0_3_2_1, //test to see which value is closer to point_0 (2 or 3). CubitVector point_0 = imp_point_0->coordinates(); CubitVector point_2 = imp_point_2->coordinates(); CubitVector point_3 = imp_point_3->coordinates(); double dist_1_sq = (point_0 - point_2).length_squared(); double dist_2_sq = (point_0 - point_3).length_squared(); if ( dist_1_sq < dist_2_sq ) { PRINT_DEBUG_129("Found OVERLAP_ALL_0_2_3_1\n"); int_result = OVERLAP_ALL_0_2_3_1; ImprintLineSegment *new_seg_0_2, *new_seg_2_3, *new_seg_3_1; //split seg_1 new_seg_0_2 = new ImprintLineSegment(imp_point_0, new_point_2, seg_1->owner()); //Yes this is really just a copy of seg_2, but do it this //way to make the data separate. new_seg_2_3 = new ImprintLineSegment(new_point_2, new_point_3, seg_1->owner()); new_seg_3_1 = new ImprintLineSegment(new_point_3, imp_point_1, seg_1->owner()); allocatedLineData->append(new_seg_0_2); allocatedLineData->append(new_seg_2_3); allocatedLineData->append(new_seg_3_1); new_segments[0] = new_seg_0_2; new_segments[1] = new_seg_2_3; new_segments[2] = new_seg_3_1; //Don't use the update_list function here //since this is our special case... //update list 1. //prev new_seg_0_2->set_prev(seg_1->get_prev()); seg_1->get_prev()->set_next(new_seg_0_2); //next new_seg_0_2->set_next(new_seg_2_3); new_seg_2_3->set_prev(new_seg_0_2); new_seg_2_3->set_next(new_seg_3_1); new_seg_3_1->set_prev(new_seg_2_3); new_seg_3_1->set_next(seg_1->get_next()); seg_1->get_next()->set_prev(new_seg_3_1); //seg_1 will no longer be used seg_1->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else { PRINT_DEBUG_129("Found OVERLAP_ALL_0_3_2_1\n"); int_result = OVERLAP_ALL_0_3_2_1; ImprintLineSegment *new_seg_0_3, *new_seg_3_2, *new_seg_2_1; new_seg_0_3 = new ImprintLineSegment(imp_point_0, new_point_3, seg_1->owner()); new_seg_3_2 = new ImprintLineSegment(new_point_3, new_point_2, seg_1->owner()); new_seg_2_1 = new ImprintLineSegment(new_point_2, imp_point_1, seg_1->owner()); allocatedLineData->append(new_seg_0_3); allocatedLineData->append(new_seg_3_2); allocatedLineData->append(new_seg_2_1); new_segments[0] = new_seg_0_3; new_segments[1] = new_seg_3_2; new_segments[2] = new_seg_2_1; //don't use special function since this is special case. //update list 1 //prev new_seg_0_3->set_prev(seg_1->get_prev()); seg_1->get_prev()->set_next(new_seg_0_3); //next new_seg_0_3->set_next(new_seg_3_2); new_seg_3_2->set_prev(new_seg_0_3); new_seg_3_2->set_next(new_seg_2_1); new_seg_2_1->set_prev(new_seg_3_2); new_seg_2_1->set_next(seg_1->get_next()); seg_1->get_next()->set_prev(new_seg_2_1); //seg_1 will no longer be used seg_1->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } } else if ( point_0_on_seg_2 && point_1_on_seg_2 && !point_2_on_seg_1 && !point_3_on_seg_1 ) { //First we know that for either of the next cases, we //have to copy points 0 and 1, do that first then //decide the particular intersection case. //copy points 0 and 1 to use on segment 2. CubitVector closest_point; closest_point_seg( imp_point_0, seg_2, closest_point); ImprintPointData *new_point_0 = new ImprintPointData(imp_point_0, closest_point); new_point_0->owner(seg_2->owner()); allocatedPointData->append(new_point_0); if ( imp_point_0->is_owner_vertex() ) { new_point_0->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_0->get_point_type() != CREATE_NEW_VERTEX ) imp_point_0->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_0->set_point_type(ON_BOTH_BOUNDARIES); imp_point_0->set_point_type(ON_BOTH_BOUNDARIES); } closest_point_seg( imp_point_1, seg_2, closest_point); ImprintPointData *new_point_1 = new ImprintPointData(imp_point_1, closest_point); new_point_1->owner(seg_2->owner()); allocatedPointData->append(new_point_1); if ( imp_point_1->is_owner_vertex() ) { new_point_1->set_point_type(CREATE_NEW_VERTEX); if ( imp_point_1->get_point_type() != CREATE_NEW_VERTEX ) imp_point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point_1->set_point_type(ON_BOTH_BOUNDARIES); imp_point_1->set_point_type(ON_BOTH_BOUNDARIES); } //IMPORTANT: Now breaking up the line segments is special for the //overlap all case. This is the one situation where //the one exterior segment gets broken into *3* new segments. //Every other instance in this function only breaks each segment //into two... //To distinguish between OVERLAP_ALL_2_0_1_3 and OVERLAP_ALL_2_1_0_3, //test to see which value is closer to point_2 (0 or 1). CubitVector point_0 = imp_point_0->coordinates(); CubitVector point_1 = imp_point_1->coordinates(); CubitVector point_2 = imp_point_2->coordinates(); double dist_1_sq = (point_2 - point_0).length_squared(); double dist_2_sq = (point_2 - point_1).length_squared(); if ( dist_1_sq < dist_2_sq ) { PRINT_DEBUG_129("Found OVERLAP_ALL_2_0_1_3\n"); int_result = OVERLAP_ALL_2_0_1_3; ImprintLineSegment *new_seg_2_0, *new_seg_0_1, *new_seg_1_3; new_seg_2_0 = new ImprintLineSegment(imp_point_2, new_point_0, seg_2->owner()); //Yes this is really just a copy of seg_2, but do it this //way to make the data separate. new_seg_0_1 = new ImprintLineSegment(new_point_0, new_point_1, seg_2->owner()); new_seg_1_3 = new ImprintLineSegment(new_point_1, imp_point_3, seg_2->owner()); allocatedLineData->append(new_seg_2_0); allocatedLineData->append(new_seg_0_1); allocatedLineData->append(new_seg_1_3); new_segments[1] = new_seg_2_0; new_segments[2] = new_seg_0_1; new_segments[3] = new_seg_1_3; //Don't use update list function since this is special case. //update list 2. //prev new_seg_2_0->set_prev(seg_2->get_prev()); seg_2->get_prev()->set_next(new_seg_2_0); //next new_seg_2_0->set_next(new_seg_0_1); new_seg_0_1->set_prev(new_seg_2_0); new_seg_0_1->set_next(new_seg_1_3); new_seg_1_3->set_prev(new_seg_0_1); new_seg_1_3->set_next(seg_2->get_next()); seg_2->get_next()->set_prev(new_seg_1_3); //seg_2 will no longer be used seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else { PRINT_DEBUG_129("Found OVERLAP_ALL_2_1_0_3\n"); int_result = OVERLAP_ALL_2_1_0_3; ImprintLineSegment *new_seg_2_1, *new_seg_1_0, *new_seg_0_3; new_seg_2_1 = new ImprintLineSegment(imp_point_2, new_point_1, seg_2->owner()); new_seg_1_0 = new ImprintLineSegment(new_point_1, new_point_0, seg_2->owner()); new_seg_0_3 = new ImprintLineSegment(new_point_0, imp_point_3, seg_2->owner()); allocatedLineData->append(new_seg_2_1); allocatedLineData->append(new_seg_1_0); allocatedLineData->append(new_seg_0_3); new_segments[1] = new_seg_2_1; new_segments[2] = new_seg_1_0; new_segments[3] = new_seg_0_3; //Don't use update_list function since this is special case. //update list 2. //prev new_seg_2_1->set_prev(seg_2->get_prev()); seg_2->get_prev()->set_next(new_seg_2_1); //next new_seg_2_1->set_next(new_seg_1_0); new_seg_1_0->set_prev(new_seg_2_1); new_seg_1_0->set_next(new_seg_0_3); new_seg_0_3->set_prev(new_seg_1_0); new_seg_0_3->set_next(seg_2->get_next()); seg_2->get_next()->set_prev(new_seg_0_3); //seg_2 will no longer be used seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } } if ( point_0_on_seg_2 || point_1_on_seg_2 || point_2_on_seg_1 || point_3_on_seg_1 ) { PRINT_ERROR("Intersection problem, case not handled.\n"); return CUBIT_FAILURE; } //Okay, finally test for the cross intersection. If this isnt' //within tolerance, then these two segments couldn't //posibly intersect! IntersectionTool int_tool(GEOMETRY_RESABS); //use GEOMETRY_RESABS //rather than myTolerance for calculations... CubitVector point_0 = imp_point_0->coordinates(); CubitVector point_1 = imp_point_1->coordinates(); CubitVector point_2 = imp_point_2->coordinates(); CubitVector point_3 = imp_point_3->coordinates(); CubitVector closest_point_seg_1, closest_point_seg_2; double sc, tc; CubitStatus stat = int_tool.closest_points_on_segments(point_0, point_1, point_2, point_3, closest_point_seg_1, closest_point_seg_2, sc, tc); if (stat != CUBIT_SUCCESS ) { PRINT_ERROR("Problems calculation closest points on " "segments for boundary imprinting.\n"); return CUBIT_FAILURE; } //Make sure the closest points aren't the end points. If they are //and we are within tolerance, it may be that the tolerance is too big //cause we shouldn't be at a cross if the closest point is an end point... if ( sc > 0. && sc < 1. && tc > 0. && tc < 1. && closest_point_seg_1.within_tolerance(closest_point_seg_2,myTolerance) ) { //okay, these guys actually do intersect! PRINT_DEBUG_129("Found CROSS_INTERSECT\n"); int_result = CROSS_INTERSECT; ImprintPointData *new_point_seg_1, *new_point_seg_2; new_point_seg_1 = new ImprintPointData(closest_point_seg_1.x(), closest_point_seg_1.y(), closest_point_seg_1.z()); allocatedPointData->append(new_point_seg_1); new_point_seg_1->owner(seg_1->owner()); new_point_seg_1->set_point_type(CREATE_NEW_VERTEX); new_point_seg_2 = new ImprintPointData(closest_point_seg_2.x(), closest_point_seg_2.y(), closest_point_seg_2.z()); allocatedPointData->append(new_point_seg_2); new_point_seg_2->owner(seg_2->owner()); new_point_seg_2->set_point_type(CREATE_NEW_VERTEX); new_point_seg_2->set_matching_point(new_point_seg_1); new_point_seg_1->set_matching_point(new_point_seg_2); new_segments[0] = new ImprintLineSegment(imp_point_0, new_point_seg_1, seg_1->owner()); new_segments[1] = new ImprintLineSegment(new_point_seg_1, imp_point_1, seg_1->owner()); new_segments[2] = new ImprintLineSegment(imp_point_2, new_point_seg_2, seg_2->owner()); new_segments[3] = new ImprintLineSegment(new_point_seg_2, imp_point_3, seg_2->owner()); allocatedLineData->append(new_segments[0]); allocatedLineData->append(new_segments[1]); allocatedLineData->append(new_segments[2]); allocatedLineData->append(new_segments[3]); //now update the lists. //update list 1. update_list(new_segments, seg_1, seg_2, CUBIT_TRUE); //update list 2. update_list(new_segments, seg_1, seg_2, CUBIT_FALSE); //seg_1 and seg_2 will no longer be used seg_1->set_inactive(CUBIT_TRUE); seg_2->set_inactive(CUBIT_TRUE); return CUBIT_SUCCESS; } else { //All that for nothing! Some how I need to find this out //earlier to avoid all the comparisions... Will have //to check at least for the intersection though.. PRINT_DEBUG_129("Found NO_INTERSECT\n"); int_result = NO_INTERSECT; return CUBIT_SUCCESS; } }
void ImprintBoundaryTool::just_match_two_points | ( | ImprintPointData * | point_1, |
ImprintPointData * | point_2 | ||
) | [private] |
Definition at line 5442 of file ImprintBoundaryTool.cpp.
{ //Okay, we need to match up point_2 and //point_1. //Set the actual matching point for the imprinting //algorithm point_1->set_matching_point(point_2); point_2->set_matching_point(point_1); //Clear out the possible match lists. if ( point_1->id() == 681 || point_1->id() == 150 ) { int temp = 0; temp++; } if ( point_1->is_owner_vertex() && !point_2->is_owner_vertex() ) { point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); point_2->set_point_type(CREATE_NEW_VERTEX); } else if(!point_1->is_owner_vertex() && point_2->is_owner_vertex() ) { point_1->set_point_type(CREATE_NEW_VERTEX); point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else if ( point_1->is_owner_vertex() && point_2->is_owner_vertex() ) { point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else // Both aren't vertices... { point_1->set_point_type(ON_BOTH_BOUNDARIES); point_2->set_point_type(ON_BOTH_BOUNDARIES); } }
CubitStatus ImprintBoundaryTool::match_on_point | ( | ImprintPointData * | start_point, |
ImprintMatchData * | start_match, | ||
ImprintLineSegment ** | loop_heads, | ||
int | num_loops, | ||
AbstractTree< ImprintLineSegment * > & | atree_2 | ||
) | [private] |
Definition at line 5138 of file ImprintBoundaryTool.cpp.
{ //This point matches with a point on the other boundary. Find //the other point, and make sure that the other point, also //matches with start_point. If it doesn't, it is that the tolerance //is big for the features and that we have points that match up //improperly. ImprintMatchData *temp_match; ImprintPointData *closest_point; DLIList <ImprintMatchData*> match_data_list; closest_point = start_match->get_closest_point(); closest_point->get_match_list(match_data_list); if ( match_data_list.size() == 1 ) { temp_match = match_data_list.get(); if ( temp_match->get_closest_point() == start_point ) { //Great. We have a solid match. Setup the data //structure. just_match_two_points(start_point, closest_point); } else { // start_point is point D. //Basically there can be one of two conditions. //1) A--------------------------------------B // C----------D------------------------------E //This condition, D is within tolerance of A, but //A's closest point is C. To resolve this, we need //to match D with the segment A-B. // //2) // D // / // / // E-----------C------- // B----------A--------------F //For this condition, D matches with A, but A matches //with the C. This case we want to ignore. ImprintLineSegment *line_seg = temp_match->get_closest_seg(); if ( line_seg == NULL ) { PRINT_ERROR("Bad logic in ImprintBoundaryTool::match_point, bug...\n"); assert(line_seg != NULL); return CUBIT_FAILURE; } ImprintPointData *point_D = start_point; //ImprintPointData *point_A = closest_point; ImprintPointData *point_C = temp_match->get_closest_point(); //Find if D and C are on the same segment. If they //are assume we have condition 1, else assume condition 2. ImprintLineSegment *prev_seg = line_seg->get_prev(); ImprintLineSegment *next_seg = line_seg->get_next(); CubitBoolean ignore = CUBIT_TRUE; if ( (point_D == prev_seg->get_start() || point_D == prev_seg->get_end() ) && (point_C == prev_seg->get_start() || point_C == prev_seg->get_end() ) ) { ignore = CUBIT_FALSE; } else if ((point_D == line_seg->get_start() || point_D == line_seg->get_end() ) && (point_C == line_seg->get_start() || point_C == line_seg->get_end() ) ) { ignore = CUBIT_FALSE; } else if ((point_D == next_seg->get_start() || point_D == next_seg->get_end() ) && (point_C == next_seg->get_start() || point_C == next_seg->get_end() ) ) { ignore = CUBIT_FALSE; } // if ( ignore ) // start_point->set_unmatched(); if ( !ignore ) { line_seg = start_match->get_closest_seg(); ImprintLineSegment *other_seg; if ( closest_point == line_seg->get_start() ) other_seg = line_seg->get_prev(); else other_seg = line_seg->get_next(); //Find out which segment start_point is closest to. CubitVector close_1, close_2, start_v = start_point->coordinates(); CubitBoolean on_line_seg = CUBIT_FALSE; CubitBoolean on_other_seg = CUBIT_FALSE; if ( closest_point_interior_seg(start_point, line_seg, close_1 ) ) { if ( start_v.within_tolerance(close_1, myTolerance) ) on_line_seg = CUBIT_TRUE; } if ( closest_point_interior_seg(start_point, other_seg, close_2 ) ) { if ( start_v.within_tolerance(close_2, myTolerance) ) on_other_seg = CUBIT_TRUE; } ImprintLineSegment *the_seg = NULL; CubitVector the_point; if ( on_line_seg && !on_other_seg ) { the_seg = line_seg; the_point = close_1; } else if ( !on_line_seg && on_other_seg ) { the_seg = other_seg; the_point = close_2; } else if ( on_line_seg && on_other_seg ) { double dist_1 = (start_v-close_1).length_squared(); double dist_2 = (start_v-close_2).length_squared(); if ( dist_1 < dist_2 ) { the_seg = line_seg; the_point = close_1; } else { the_seg = other_seg; the_point = close_2; } } if ( the_point.within_tolerance(closest_point->coordinates(), GEOMETRY_RESABS*500 ) ) { PRINT_ERROR("The tolerance is too large for virtual imprinting\n" "Surface %d and %d\n", refFacePtr1->id(), refFacePtr2->id()); return CUBIT_FAILURE; } start_match->set_closest_point(NULL); start_match->set_closest_seg(the_seg); start_match->set_point_on(the_point); return match_on_segment(start_point, start_match, loop_heads, num_loops, atree_2); } } } else { if ( match_data_list.size() == 0 ) return CUBIT_SUCCESS; else { PRINT_ERROR("More than one match in final match(%d).\n",match_data_list.size() ); PRINT_ERROR("This is a bug in virtual imprinting, try reducing\n" "the tolerance.\n"); return CUBIT_FAILURE; } } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::match_on_segment | ( | ImprintPointData * | start_point, |
ImprintMatchData * | start_match, | ||
ImprintLineSegment ** | loop_heads, | ||
int | num_loops, | ||
AbstractTree< ImprintLineSegment * > & | atree_2 | ||
) | [private] |
Definition at line 5303 of file ImprintBoundaryTool.cpp.
{ //Closest point is on a segment on the other boundary. //Split that segment at the closest point. //Adjust the data... ImprintLineSegment *new_seg_1,*new_seg_2; ImprintLineSegment* closest_seg = start_match->get_closest_seg(); CubitVector closest_vec(*(start_match->get_point_on())); ImprintPointData *new_point = new ImprintPointData(start_point, closest_vec); allocatedPointData->append(new_point); new_point->owner(closest_seg->owner()); if ( start_point->is_owner_vertex() ) { new_point->set_point_type(CREATE_NEW_VERTEX); if ( start_point->get_point_type() != CREATE_NEW_VERTEX ) start_point->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { new_point->set_point_type(ON_BOTH_BOUNDARIES); start_point->set_point_type(ON_BOTH_BOUNDARIES); } new_seg_1 = new ImprintLineSegment( closest_seg->get_start(), new_point, closest_seg->owner()); new_seg_2 = new ImprintLineSegment( new_point, closest_seg->get_end(), closest_seg->owner()); allocatedLineData->append(new_seg_1); allocatedLineData->append(new_seg_2); //update the linked list structure to leave out the closest_seg //but include the new segs instead. update_linked_list(closest_seg, new_seg_1, new_seg_2); //update the ImprintMatchData that reference the closest_seg //to reference new_seg_1 or new_seg_2. CubitStatus stat = update_seg_matches(closest_seg, new_seg_1, new_seg_2, start_match); if ( stat != CUBIT_SUCCESS ) return stat; closest_seg->set_inactive(CUBIT_TRUE); int jj; for (jj = 0; jj < num_loops; jj++ ) { if ( loop_heads[jj] == closest_seg ) loop_heads[jj] = new_seg_1; } //update the atree. atree_2.remove(closest_seg); atree_2.add(new_seg_1); atree_2.add(new_seg_2); return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::match_points | ( | ImprintLineSegment * | seg_1, |
ImprintLineSegment * | seg_2, | ||
MatchType & | type_0, | ||
MatchType & | type_1, | ||
MatchType & | type_2, | ||
MatchType & | type_3 | ||
) | [private] |
Definition at line 4382 of file ImprintBoundaryTool.cpp.
{ ImprintPointData *imp_point_0, *imp_point_1, *imp_point_2, *imp_point_3; ImprintPointData *imp_point_4, *imp_point_5, *imp_point_6, *imp_point_7; ImprintLineSegment *prev_seg_1 = seg_1->get_prev(); ImprintLineSegment *next_seg_1 = seg_1->get_next(); ImprintLineSegment *prev_seg_2 = seg_2->get_prev(); ImprintLineSegment *next_seg_2 = seg_2->get_next(); imp_point_0 = seg_1->get_start(); imp_point_1 = seg_1->get_end(); imp_point_4 = prev_seg_1->get_start(); imp_point_5 = next_seg_1->get_end(); imp_point_2 = seg_2->get_start(); imp_point_3 = seg_2->get_end(); imp_point_6 = prev_seg_2->get_start(); imp_point_7 = next_seg_2->get_end(); CubitVector point_0, point_1, point_2, point_3; CubitVector point_4, point_5, point_6, point_7; point_0 = imp_point_0->coordinates(); point_1 = imp_point_1->coordinates(); point_2 = imp_point_2->coordinates(); point_3 = imp_point_3->coordinates(); point_4 = imp_point_4->coordinates(); point_5 = imp_point_5->coordinates(); point_6 = imp_point_6->coordinates(); point_7 = imp_point_7->coordinates(); //There are four possible matches for each of the points (0,1,2,and3). //Find out which ones match. CubitBoolean match_02=CUBIT_FALSE, match_03=CUBIT_FALSE, match_06=CUBIT_FALSE, match_07=CUBIT_FALSE; CubitBoolean match_12=CUBIT_FALSE, match_13=CUBIT_FALSE, match_16=CUBIT_FALSE, match_17=CUBIT_FALSE; CubitBoolean match_24=CUBIT_FALSE, match_25=CUBIT_FALSE; CubitBoolean match_34=CUBIT_FALSE, match_35=CUBIT_FALSE; //compute the matching. if (point_0.within_tolerance(point_2, myTolerance) ) match_02=CUBIT_TRUE; if (point_0.within_tolerance(point_3, myTolerance) ) match_03=CUBIT_TRUE; if (point_0.within_tolerance(point_6, myTolerance) ) match_06=CUBIT_TRUE; if (point_0.within_tolerance(point_7, myTolerance) ) match_07=CUBIT_TRUE; if (point_1.within_tolerance(point_2, myTolerance) ) match_12=CUBIT_TRUE; if (point_1.within_tolerance(point_3, myTolerance) ) match_13=CUBIT_TRUE; if (point_1.within_tolerance(point_6, myTolerance) ) match_16=CUBIT_TRUE; if (point_1.within_tolerance(point_7, myTolerance) ) match_17=CUBIT_TRUE; if (point_2.within_tolerance(point_4, myTolerance) ) match_24=CUBIT_TRUE; if (point_2.within_tolerance(point_5, myTolerance) ) match_25=CUBIT_TRUE; if (point_3.within_tolerance(point_4, myTolerance) ) match_34=CUBIT_TRUE; if (point_3.within_tolerance(point_5, myTolerance) ) match_35=CUBIT_TRUE; //Now for those that match, compute the distances. double dist_02 = 0.0, dist_03 = 0.0, dist_06 = 0.0, dist_07 = 0.0; double dist_12 = 0.0, dist_13 = 0.0, dist_16 = 0.0, dist_17 = 0.0; double dist_24 = 0.0, dist_25 = 0.0; double dist_34 = 0.0, dist_35 = 0.0; if ( match_02 ) dist_02 = (point_0-point_2).length_squared(); if ( match_03 ) dist_03 = (point_0-point_3).length_squared(); if ( match_06 ) dist_06 = (point_0-point_6).length_squared(); if ( match_07 ) dist_07 = (point_0-point_7).length_squared(); if ( match_12 ) dist_12 = (point_1-point_2).length_squared(); if ( match_13 ) dist_13 = (point_1-point_3).length_squared(); if ( match_16 ) dist_16 = (point_1-point_6).length_squared(); if ( match_17 ) dist_17 = (point_1-point_7).length_squared(); if ( match_24 ) dist_24 = (point_2-point_4).length_squared(); if ( match_25 ) dist_25 = (point_2-point_5).length_squared(); if ( match_34 ) dist_34 = (point_3-point_4).length_squared(); if ( match_35 ) dist_35 = (point_3-point_5).length_squared(); //Okay, determine the solution by finding the closest //points, and then determining the final four results; //point 0 double min_dist = CUBIT_DBL_MAX; type_0 = NO_MATCH; type_1 = NO_MATCH; type_2 = NO_MATCH; type_3 = NO_MATCH; if ( match_02 && dist_02 < min_dist ) { min_dist = dist_02; type_0 = MATCH_0_2; } if ( match_03 && dist_03 < min_dist ) { min_dist = dist_03; type_0 = MATCH_0_3; } if ( match_06 && dist_06 < min_dist ) { min_dist = dist_06; type_0 = MATCH_0_6; } if ( match_07 && dist_07 < min_dist ) { min_dist = dist_07; type_0 = MATCH_0_7; } //point 1 min_dist = CUBIT_DBL_MAX; type_1 = NO_MATCH; if ( match_12 && dist_12 < min_dist ) { min_dist = dist_12; type_1 = MATCH_1_2; } if ( match_13 && dist_13 < min_dist ) { min_dist = dist_13; type_1 = MATCH_1_3; } if ( match_16 && dist_16 < min_dist ) { min_dist = dist_16; type_1 = MATCH_1_6; } if ( match_17 && dist_17 < min_dist ) { min_dist = dist_17; type_1 = MATCH_1_7; } //point 2 min_dist = CUBIT_DBL_MAX; type_2 = NO_MATCH; if ( match_02 && dist_02 < min_dist ) { min_dist = dist_02; type_2 = MATCH_0_2; } if ( match_12 && dist_12 < min_dist ) { min_dist = dist_12; type_2 = MATCH_1_2; } if ( match_24 && dist_24 < min_dist ) { min_dist = dist_24; type_2 = MATCH_2_4; } if ( match_25 && dist_25 < min_dist ) { min_dist = dist_25; type_2 = MATCH_2_5; } //point 3 min_dist = CUBIT_DBL_MAX; type_3 = NO_MATCH; if ( match_03 && dist_03 < min_dist ) { min_dist = dist_03; type_3 = MATCH_0_3; } if ( match_13 && dist_13 < min_dist ) { min_dist = dist_13; type_3 = MATCH_1_3; } if ( match_34 && dist_34 < min_dist ) { min_dist = dist_34; type_3 = MATCH_3_4; } if ( match_35 && dist_35 < min_dist ) { min_dist = dist_35; type_3 = MATCH_3_5; } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::match_seg_points | ( | ImprintLineSegment * | seg_1, |
ImprintLineSegment * | seg_2, | ||
ImprintMatchData *& | point_0_match, | ||
ImprintMatchData *& | point_1_match | ||
) | [private] |
Definition at line 4804 of file ImprintBoundaryTool.cpp.
{ ImprintPointData *imp_point_0, *imp_point_1, *imp_point_2, *imp_point_3; imp_point_0 = seg_1->get_start(); imp_point_1 = seg_1->get_end(); imp_point_2 = seg_2->get_start(); imp_point_3 = seg_2->get_end(); CubitVector point_0, point_1, point_2, point_3; point_0 = imp_point_0->coordinates(); point_1 = imp_point_1->coordinates(); point_2 = imp_point_2->coordinates(); point_3 = imp_point_3->coordinates(); CubitBoolean dont_test_0 = imp_point_0->is_matched(); CubitBoolean dont_test_1 = imp_point_1->is_matched(); point_0_match = NULL; point_1_match = NULL; if ( dont_test_0 && dont_test_1 ) return CUBIT_SUCCESS; int debug = 0; if ( debug ) { draw_seg(seg_1, CUBIT_GREEN_INDEX); draw_seg(seg_2, CUBIT_YELLOW_INDEX); draw_point(imp_point_0, CUBIT_GREEN_INDEX); draw_point(imp_point_1, CUBIT_GREEN_INDEX); draw_point(imp_point_2, CUBIT_YELLOW_INDEX); draw_point(imp_point_3, CUBIT_YELLOW_INDEX); GfxDebug::mouse_xforms(); } //There are four possible matches for each of the points (0,1,2,and3). //Find out which ones match. CubitBoolean match_02=CUBIT_FALSE, match_03=CUBIT_FALSE; CubitBoolean match_12=CUBIT_FALSE, match_13=CUBIT_FALSE; //compute the matching. if ( !dont_test_0 ) { if (point_0.within_tolerance(point_2, myTolerance) ) match_02=CUBIT_TRUE; if (point_0.within_tolerance(point_3, myTolerance) ) match_03=CUBIT_TRUE; } if ( !dont_test_1 ) { if (point_1.within_tolerance(point_2, myTolerance) ) match_12=CUBIT_TRUE; if (point_1.within_tolerance(point_3, myTolerance) ) match_13=CUBIT_TRUE; } //Now for those that match, compute the distances. double dist_02 = 0.0, dist_03 = 0.0; double dist_12 = 0.0, dist_13 = 0.0; if ( match_02 ) dist_02 = (point_0-point_2).length_squared(); if ( match_03 ) dist_03 = (point_0-point_3).length_squared(); if ( match_12 ) dist_12 = (point_1-point_2).length_squared(); if ( match_13 ) dist_13 = (point_1-point_3).length_squared(); if ( match_02 && match_03 ) { if ( dist_02 < dist_03 ) match_03 = CUBIT_FALSE; else match_02 = CUBIT_FALSE; } if ( match_12 && match_13 ) { if ( dist_12 < dist_13 ) match_13 = CUBIT_FALSE; else match_12 = CUBIT_FALSE; } //Now find the closest points on the segment. CubitBoolean on_interior_0 = CUBIT_FALSE; CubitBoolean on_interior_1 = CUBIT_FALSE; CubitVector closest_point_0, closest_point_1; if ( !dont_test_0 && closest_point_interior_seg(imp_point_0, seg_2, closest_point_0 ) ) { if ( point_0.within_tolerance(closest_point_0, myTolerance) ) { //There is a close point on the interior. on_interior_0 = CUBIT_TRUE; } } if ( !dont_test_1 && closest_point_interior_seg(imp_point_1, seg_2, closest_point_1 ) ) { //This means the closest_point is perpendicular //to the segment. Now test if the point is within //tolerance. if ( point_1.within_tolerance(closest_point_1, myTolerance) ) { //There is a close point on the interior. on_interior_1 = CUBIT_TRUE; } } //point 0 //double min_dist = CUBIT_DBL_MAX; point_0_match = NULL; point_1_match = NULL; if ( match_02 ) { point_0_match = new ImprintMatchData; if ( on_interior_0 ) { //set the distance to be equal to the //distance to the closest_point_0 and point_0 rather //than 2 and 0. 0 and 2 should snap together but //for finding the min distance, we want to make sure //we get the closest segment. dist_02 = (point_0 - closest_point_0).length_squared(); } allocatedMatchData->append(point_0_match); point_0_match->set_closest_point(imp_point_2); point_0_match->set_closest_dist(dist_02); point_0_match->set_closest_seg(seg_2); seg_2->add_match_data(point_0_match); } else if ( match_03 ) { point_0_match = new ImprintMatchData; if ( on_interior_0 ) { //set the distance to be equal to the //distance to the closest_point_0 and point_0 rather //than 3 and 0. 0 and 3 should snap together but //for finding the min distance, we want to make sure //we get the closest segment. dist_03 = (point_0 - closest_point_0).length_squared(); } allocatedMatchData->append(point_0_match); point_0_match->set_closest_point(imp_point_3); point_0_match->set_closest_dist(dist_03); point_0_match->set_closest_seg(seg_2); seg_2->add_match_data(point_0_match); } else if ( on_interior_0 && !match_02 && !match_03 ) { double dist = (point_0 - closest_point_0).length_squared(); point_0_match = new ImprintMatchData; allocatedMatchData->append(point_0_match); point_0_match->set_closest_seg(seg_2); seg_2->add_match_data(point_0_match); point_0_match->set_point_on(closest_point_0); point_0_match->set_closest_dist(dist); } if ( match_12 ) { point_1_match = new ImprintMatchData; if ( on_interior_1 ) { //set the distance to be equal to the //distance to the closest_point_1 and point_1 rather //than 2 and 1. 1 and 2 should snap together but //for finding the min distance, we want to make sure //we get the closest segment. dist_12 = (point_1 - closest_point_1).length_squared(); } allocatedMatchData->append(point_1_match); point_1_match->set_closest_point(imp_point_2); point_1_match->set_closest_dist(dist_12); point_1_match->set_closest_seg(seg_2); seg_2->add_match_data(point_1_match); } else if ( match_13 ) { point_1_match = new ImprintMatchData; if ( on_interior_1 ) { //set the distance to be equal to the //distance to the closest_point_1 and point_1 rather //than 3 and 1. 1 and 3 should snap together but //for finding the min distance, we want to make sure //we get the closest segment. dist_13 = (point_1 - closest_point_1).length_squared(); } allocatedMatchData->append(point_1_match); point_1_match->set_closest_point(imp_point_3); point_1_match->set_closest_dist(dist_13); point_1_match->set_closest_seg(seg_2); seg_2->add_match_data(point_1_match); } else if ( on_interior_1 && !match_12 && !match_13 ) { double dist = (point_1 - closest_point_1).length_squared(); //double debug_dist = (point_0 - point_2).length(); point_1_match = new ImprintMatchData; allocatedMatchData->append(point_1_match); point_1_match->set_closest_seg(seg_2); point_1_match->set_point_on(closest_point_1); point_1_match->set_closest_dist(dist); seg_2->add_match_data(point_1_match); } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::merge_vertices | ( | DLIList< RefVertex * > & | ref_verts | ) | [private] |
Definition at line 4044 of file ImprintBoundaryTool.cpp.
{ //This is simply a function to reduce code bloat... double tol_factor = myTolerance / GEOMETRY_RESABS; double old_geometry_factor = GeometryQueryTool::get_geometry_factor(); GeometryQueryTool::set_geometry_factor( tol_factor ); //merge the vertices to get a connected intersection graph. CubitStatus stat = MergeTool::instance()->merge_refvertices( ref_verts ); GeometryQueryTool::set_geometry_factor( old_geometry_factor ); if ( stat != CUBIT_SUCCESS ) return stat; return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::merge_vertices | ( | RefVertex * | ref_vertex1, |
RefVertex * | ref_vertex2, | ||
CubitBoolean & | kept_1 | ||
) | [private] |
Definition at line 4057 of file ImprintBoundaryTool.cpp.
{ //force merge the vertices RefVertex* result = MergeTool::instance()-> force_merge( ref_vertex1, ref_vertex2 ); if (result == ref_vertex1) kept_1 = CUBIT_TRUE; else if(result == ref_vertex2) kept_1 = CUBIT_FALSE; else return CUBIT_FAILURE; return CUBIT_SUCCESS; }
CubitBoolean ImprintBoundaryTool::modified_bound_1 | ( | ) | [inline] |
Definition at line 519 of file ImprintBoundaryTool.hpp.
{return modBound1;}
CubitBoolean ImprintBoundaryTool::modified_bound_2 | ( | ) | [inline] |
Definition at line 521 of file ImprintBoundaryTool.hpp.
{return modBound2;}
int ImprintBoundaryTool::num_coedges_on_face | ( | RefEdge * | edge_ptr, |
RefFace * | ref_face | ||
) | [private] |
Definition at line 4587 of file ImprintBoundaryTool.cpp.
{ DLIList <CoEdge*> coedges; edge_ptr->co_edges(coedges); int ii; int count = 0; for ( ii = coedges.size(); ii > 0; ii-- ) { if ( coedges.get_and_step()->get_ref_face() == ref_face ) count++; } return count; }
CubitBoolean ImprintBoundaryTool::on_curve | ( | ImprintPointData * | point, |
RefEdge * | ref_edge | ||
) | [private] |
Definition at line 3470 of file ImprintBoundaryTool.cpp.
{ CubitBoolean on_boundary = CUBIT_FALSE; //Determine if the vertex is on the curve within the feature size... CubitVector vert_point = point->coordinates(); CubitVector point_on = point->coordinates(); //Move the point to the curve and check the distance. ref_edge->closest_point_trimmed(vert_point, point_on); CubitVector distance = vert_point - point_on; double leng = distance.length(); if ( leng < myTolerance ) { on_boundary = CUBIT_TRUE; } return on_boundary; }
CubitBoolean ImprintBoundaryTool::on_interior_segment | ( | ImprintPointData * | point, |
ImprintLineSegment * | line | ||
) | [private] |
Definition at line 2774 of file ImprintBoundaryTool.cpp.
{ //Find the closest point on the line segement. CubitVector closest_point; CubitBoolean on_interior = closest_point_interior_seg( point, line, closest_point); if (!on_interior ) return CUBIT_FALSE; CubitVector my_point = point->coordinates(); if ( my_point.within_tolerance( closest_point, myTolerance ) ) return CUBIT_TRUE; else return CUBIT_FALSE; }
CubitBoolean ImprintBoundaryTool::on_surface | ( | ImprintPointData * | point, |
RefFace * | ref_face | ||
) | [private] |
Definition at line 3445 of file ImprintBoundaryTool.cpp.
{ //Determine if the vertex is on the curve within the feature size... CubitVector vert_point = point->coordinates(); CubitVector point_on = vert_point; //Move the point to the curve and check the distance. ref_face->find_closest_point_trimmed(vert_point, point_on); if ( vert_point.within_tolerance(point_on, myTolerance) ) return CUBIT_TRUE; else return CUBIT_FALSE; }
CubitBoolean ImprintBoundaryTool::on_surface | ( | CubitVector & | vert_point, |
RefFace * | ref_face | ||
) | [private] |
Definition at line 3458 of file ImprintBoundaryTool.cpp.
{ //Determine if the vertex is on the curve within the feature size... CubitVector point_on = vert_point; //Move the point to the curve and check the distance. ref_face->find_closest_point_trimmed(vert_point, point_on); if ( vert_point.within_tolerance(point_on, myTolerance) ) return CUBIT_TRUE; else return CUBIT_FALSE; }
CubitStatus ImprintBoundaryTool::point_intersects_case | ( | ImprintPointData * | curr_point, |
ImprintPointData * | next_point, | ||
RefFace * | ref_face, | ||
PointLoopList & | part_segs, | ||
PointList *& | new_part_line, | ||
CubitBoolean & | start_recording, | ||
CubitBoolean | surf_1 | ||
) | [private] |
Definition at line 3273 of file ImprintBoundaryTool.cpp.
{ PointType vertex_my_boundary = surf_1 ? VERTEX_ON_BOUNDARY_2 : VERTEX_ON_BOUNDARY_1; PointType edge_my_boundary = surf_1 ? ON_BOUNDARY_2 : ON_BOUNDARY_1; CubitBoolean do_nothing = CUBIT_FALSE; ImprintPointData *match_point_cur, *match_point_nex; if ( !start_recording ) { //Okay. This is an intersection. The possible outcomes are: //1) This is the end of a paritition :-> do nothing. //2) This is the begining of a short partition (one segment) //3) This is the begining of a parition :-> start recording it. //4) This is a vertex imprint from our surface. :-> do nothing. //For case 1 resolution, we need to test to see if the next node is either: // a) on the boundary of both surf 1 and surf 2. // b) outside surf 1 and not intersecting surf_1's boundary. // If case a, then we need to find out if its matching point // and the matching point of the next point are on the same // segment. //For case 2, we need to test the underlying refentities to //see if we really are splitting a surface or on a the boundary. //For case 3, we need to test the next node to see if it is //only on loop 2's boundary and INTERIOR to the ref_face. //For case 4, that will be the counter examples of case 3 or //rather when their interior or refentity traversals fail. //Also if the next node is on both boundaries but not as //a vertex. This is a simple overlap. //Both points are vertices. Need to find out if this is a //single segment split or on the boundary. if ( next_point->get_point_type() == CREATE_NEW_VERTEX || next_point->get_point_type() == VERTEX_ON_BOTH_BOUNDARIES ) { //To decifer, determine this from the topology of the points //these match with on boundary 1. match_point_cur = curr_point->get_matching_point(); match_point_nex = next_point->get_matching_point(); int list_id_1 = match_point_cur->get_loop_pos(); int list_id_2 = match_point_nex->get_loop_pos(); if ( list_id_1 == 0 ) { if (list_id_2 == match_point_nex->get_loop_size() - 1 ) { //okay force this to work, we just went around the loop. list_id_2 = 1; } } if ( list_id_2 == 0 ) { if (list_id_1 == match_point_nex->get_loop_size() - 1 ) { //okay force this to work, we just went around the loop. list_id_1 = 1; } } int diff; if ( list_id_1 > list_id_2 ) diff = list_id_1 - list_id_2; else diff = list_id_2 - list_id_1; if ( (match_point_cur->get_list_loop_pos() == match_point_nex->get_list_loop_pos()) && diff == 1 ) { //CASE 1 //This is the case that curr_point and next_point are //both create vertices or matched with vertices. //If the points that they match with, are also right //next to each other, then don't partition them since //they all match prefectly. do_nothing = CUBIT_TRUE; } else { //Also, this may be a case where the one boundary is //curved and the segment croses the curve portion. //We'll have to do a surface check mid-way through //the segment. CubitVector p0 = curr_point->coordinates(); CubitVector p1 = next_point->coordinates(); CubitVector point_q = p0 + (p1-p0)*.5; if ( on_surface(point_q, ref_face) ) { //CASE 2 //So they aren't connected. This means that //we need to have a single segment where we //partition with just these two points. new_part_line = new PointList; allocatedPointLoops->append(new_part_line); new_part_line->append(curr_point); new_part_line->append(next_point); curr_point->set_start_partition(); next_point->set_end_partition(); part_segs.append(new_part_line); new_part_line = NULL; do_nothing = CUBIT_TRUE; } else do_nothing = CUBIT_TRUE; } } else if ( next_point->get_point_type() == ON_BOTH_BOUNDARIES ) { //CASE 4. //hmmm. This has got to be a simple imprint so do nothing here. do_nothing = CUBIT_TRUE; } else if ( next_point->get_point_type() == edge_my_boundary || next_point->get_point_type() == vertex_my_boundary ) { //We need to test to see if this point is on the ref_face or not. //If it is, then we need to start recording. If it //isn't then we can do nothing. if ( on_surface(next_point, ref_face) ) //CASE 3 start_recording = CUBIT_TRUE; else //CASE 4 do_nothing = CUBIT_TRUE; } else { PRINT_ERROR("Bad Logic ImprintBoundaryTool::find_graph_for_surf.\n"); assert(0); return CUBIT_FAILURE; } if ( do_nothing ) return CUBIT_SUCCESS; assert(start_recording); //Okay start recording. Create a new list. Put the curr_point //into that list and continue. curr_point->set_start_partition(); new_part_line = new PointList; allocatedPointLoops->append(new_part_line); new_part_line->append(curr_point); part_segs.append(new_part_line); } else { //Now we need to terminate the recording. curr_point->set_end_partition(); if ( !curr_point->get_start_partition() ) { new_part_line->append(curr_point); } else{ //case where circle loop imprints an edge at just one point. //do nothing. } new_part_line = NULL; start_recording = CUBIT_FALSE; } return CUBIT_SUCCESS; }
CubitBoolean ImprintBoundaryTool::resolve_match_conflict_other | ( | ImprintPointData * | this_point, |
ImprintPointData * | other, | ||
CubitBoolean | this_is_1 | ||
) | [private] |
Definition at line 4239 of file ImprintBoundaryTool.cpp.
{ CubitVector other_v = other->coordinates(); CubitVector coords = this_point->coordinates(); ImprintPointData *conflict_match = other->get_matching_point(); CubitVector c_match_vec = conflict_match->coordinates(); double dist_1 = (other_v - c_match_vec).length_squared(); double dist_2 = (other_v - coords).length_squared(); if ( dist_1 < dist_2 ) //this says leave it alone, and don't match these two. { //The conflict match and other should be left matching. Don't //match this_point and other... return CUBIT_FALSE; } else { //Okay we need to clean this up. //It used to be that conflict_match and other were paired //up. But now we need to undo that and match other and this_point. //To do that find out what the correct PointType setting should be //for conflict_match. Try setting it back to its original. RefEntity* owner_conflict = conflict_match->owner(); //Use the this_is_1 flag. Assume conflict_match and //this_point are on the same boundary. if( CAST_TO(owner_conflict, RefEdge) ) { if ( this_is_1 ) conflict_match->set_point_type(ON_BOUNDARY_1); else conflict_match->set_point_type(ON_BOUNDARY_2); } else if ( CAST_TO(owner_conflict, RefVertex) ) { if ( this_is_1 ) conflict_match->set_point_type(VERTEX_ON_BOUNDARY_1); else conflict_match->set_point_type(VERTEX_ON_BOUNDARY_2); } else { PRINT_ERROR("Problems resolving matching point type.\n"); return CUBIT_FALSE; } //Now do the same thing for other. Clean it back to its //preset types. (except use the opposite of this_is_1 flag //since it is on the other boundary of this_point.) RefEntity* owner_other = other->owner(); if( CAST_TO(owner_other,RefEdge) ) { if ( this_is_1 ) other->set_point_type(ON_BOUNDARY_2); else other->set_point_type(ON_BOUNDARY_1); } else if ( CAST_TO(owner_other,RefVertex)) { if ( this_is_1 ) other->set_point_type(VERTEX_ON_BOUNDARY_2); else other->set_point_type(VERTEX_ON_BOUNDARY_1); } else { PRINT_ERROR("Problems resolving matching point type.\n"); return CUBIT_FALSE; } return CUBIT_TRUE; } }
CubitBoolean ImprintBoundaryTool::resolve_match_conflict_this | ( | ImprintPointData * | this_point, |
ImprintPointData * | other, | ||
CubitBoolean | this_is_1 | ||
) | [private] |
Definition at line 4311 of file ImprintBoundaryTool.cpp.
{ ImprintPointData *conflict_match = this_point->get_matching_point(); CubitVector other_v = other->coordinates(); CubitVector coords = this_point->coordinates(); CubitVector c_match_vec = conflict_match->coordinates(); double dist_1 = (coords - c_match_vec).length_squared(); double dist_2 = (coords - other_v).length_squared(); if ( dist_1 < dist_2 ) //this says leave it alone, and don't match these two. { //The conflict match and this_point should be left matching. Don't //match this_point and other... return CUBIT_FALSE; } else { //Okay we need to clean this up. //It used to be that conflict_match and this_point were paired //up. But now we need to undo that and match other and this_point. //To do that find out what the correct PointType setting should be //for conflict_match. Try setting it back to its original. RefEntity* owner_conflict = conflict_match->owner(); //Use the this_is_1 flag. Assume conflict_match and //other are on the same boundary. if( CAST_TO(owner_conflict,RefEdge) ) { if ( this_is_1 ) conflict_match->set_point_type(ON_BOUNDARY_2); else conflict_match->set_point_type(ON_BOUNDARY_1); } else if ( CAST_TO(owner_conflict,RefVertex) ) { if ( this_is_1 ) conflict_match->set_point_type(VERTEX_ON_BOUNDARY_2); else conflict_match->set_point_type(VERTEX_ON_BOUNDARY_1); } else { PRINT_ERROR("Problems resolving matching point type.\n"); return CUBIT_FALSE; } //Now do the same thing for this_point. Clean it back to its //preset types. (except use the opposite of this_is_1 flag //since it is on the other boundary of this_point.) RefEntity* owner_this = this_point->owner(); if( CAST_TO(owner_this,RefEdge)) { if ( this_is_1 ) this_point->set_point_type(ON_BOUNDARY_1); else this_point->set_point_type(ON_BOUNDARY_2); } else if (CAST_TO(owner_this,RefVertex) ) { if ( this_is_1 ) this_point->set_point_type(VERTEX_ON_BOUNDARY_1); else this_point->set_point_type(VERTEX_ON_BOUNDARY_2); } else { PRINT_ERROR("Problems resolving matching point type.\n"); return CUBIT_FALSE; } return CUBIT_TRUE; } }
CubitStatus ImprintBoundaryTool::resolve_on_boundaries | ( | PointLoopList & | boundary_loops_1, |
PointLoopList & | boundary_loops_2 | ||
) | [private] |
Definition at line 4175 of file ImprintBoundaryTool.cpp.
{ int ii, jj; PointList *loop_ptr; ImprintPointData *curr_point, *next_point, *prev_point, *matching_point; //loop around the boundaries, if the point goes from on both boundaries to just on boundary, //then we know we need to create a vertex there. for ( ii = boundary_loops_1.size(); ii > 0; ii-- ) { loop_ptr = boundary_loops_1.get_and_step(); for ( jj = loop_ptr->size(); jj > 0; jj-- ) { curr_point = loop_ptr->get_and_step(); if ( curr_point->get_point_type() == ON_BOTH_BOUNDARIES ) { next_point = loop_ptr->get(); prev_point = loop_ptr->prev(2); if ( (next_point->get_point_type() == ON_BOUNDARY_1 || next_point->get_point_type() == VERTEX_ON_BOUNDARY_1) || (prev_point->get_point_type() == ON_BOUNDARY_1 || prev_point->get_point_type() == VERTEX_ON_BOUNDARY_1 ) ) { curr_point->set_point_type(CREATE_NEW_VERTEX); //If curr_point is on both boundaries, then the //matching point cant be a vertex either so //create a new vertex there too. matching_point =curr_point->get_matching_point(); matching_point->set_point_type(CREATE_NEW_VERTEX); } } } } for ( ii = boundary_loops_2.size(); ii > 0; ii-- ) { loop_ptr = boundary_loops_2.get_and_step(); for ( jj = loop_ptr->size(); jj > 0; jj-- ) { curr_point = loop_ptr->get_and_step(); if ( curr_point->get_point_type() == ON_BOTH_BOUNDARIES ) { next_point = loop_ptr->get(); prev_point = loop_ptr->prev(2); if ( (next_point->get_point_type() == ON_BOUNDARY_2 || next_point->get_point_type() == VERTEX_ON_BOUNDARY_2) || (prev_point->get_point_type() == ON_BOUNDARY_2 || prev_point->get_point_type() == VERTEX_ON_BOUNDARY_2 ) ) { curr_point->set_point_type(CREATE_NEW_VERTEX); //If curr_point is on both boundaries, then the //matching point cant be a vertex either so //create a new vertex there too. matching_point =curr_point->get_matching_point(); matching_point->set_point_type(CREATE_NEW_VERTEX); } } } } return CUBIT_SUCCESS; }
void ImprintBoundaryTool::set_closest_point | ( | ImprintPointData * | imp_point_0 | ) | [private] |
Definition at line 4760 of file ImprintBoundaryTool.cpp.
{ DLIList <ImprintMatchData*> closest_points; int kk; imp_point_0->get_match_list(closest_points); double min_dist = CUBIT_DBL_MAX; ImprintMatchData *closest_point = NULL, *close_point; for ( kk = 0; kk < closest_points.size(); kk++ ) { close_point = closest_points.get_and_step(); if ( close_point->get_closest_dist() < min_dist ) { min_dist = close_point->get_closest_dist(); closest_point = close_point; } } if ( closest_point ) { imp_point_0->set_matched(closest_point); } }
CubitStatus ImprintBoundaryTool::set_type_for_equal | ( | ImprintPointData * | pair_1_1, |
ImprintPointData * | pair_1_2, | ||
ImprintPointData * | pair_2_1, | ||
ImprintPointData * | pair_2_2 | ||
) | [private] |
Definition at line 2674 of file ImprintBoundaryTool.cpp.
{ //These segments are equal. //Set the point types accoridingly. if ( pair_1_1->is_owner_vertex() && !pair_1_2->is_owner_vertex() ) { pair_1_2->set_point_type(CREATE_NEW_VERTEX); if ( pair_1_1->get_point_type() != CREATE_NEW_VERTEX ) pair_1_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else if (!pair_1_1->is_owner_vertex() && pair_1_2->is_owner_vertex() ) { pair_1_1->set_point_type(CREATE_NEW_VERTEX); if ( pair_1_2->get_point_type() != CREATE_NEW_VERTEX ) pair_1_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else if ( pair_1_1->is_owner_vertex() && pair_1_2->is_owner_vertex() ) { if ( pair_1_1->get_point_type() != CREATE_NEW_VERTEX ) pair_1_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); if (pair_1_2->get_point_type() != CREATE_NEW_VERTEX ) pair_1_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { pair_1_1->set_point_type(ON_BOTH_BOUNDARIES); pair_1_2->set_point_type(ON_BOTH_BOUNDARIES); } if ( pair_2_1->is_owner_vertex() && !pair_2_2->is_owner_vertex() ) { pair_2_2->set_point_type(CREATE_NEW_VERTEX); if ( pair_2_1->get_point_type() != CREATE_NEW_VERTEX ) pair_2_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else if (!pair_2_1->is_owner_vertex() && pair_2_2->is_owner_vertex() ) { pair_2_1->set_point_type(CREATE_NEW_VERTEX); if ( pair_2_2->get_point_type() != CREATE_NEW_VERTEX ) pair_2_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else if ( pair_2_1->is_owner_vertex() && pair_2_2->is_owner_vertex() ) { if ( pair_2_1->get_point_type() != CREATE_NEW_VERTEX ) pair_2_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); if ( pair_2_2->get_point_type() != CREATE_NEW_VERTEX ) pair_2_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { pair_2_1->set_point_type(ON_BOTH_BOUNDARIES); pair_2_2->set_point_type(ON_BOTH_BOUNDARIES); } return CUBIT_SUCCESS; }
CubitStatus ImprintBoundaryTool::set_type_for_L | ( | ImprintPointData * | imp_point_1, |
ImprintPointData * | imp_point_2 | ||
) | [private] |
Definition at line 2737 of file ImprintBoundaryTool.cpp.
{ CubitBoolean owner_vert_1 = imp_point_1->is_owner_vertex(); CubitBoolean owner_vert_2 = imp_point_2->is_owner_vertex(); if ( owner_vert_1 && !owner_vert_2 ) { imp_point_2->set_point_type(CREATE_NEW_VERTEX); if (imp_point_1->get_point_type() != CREATE_NEW_VERTEX ) imp_point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else if (!owner_vert_1 && owner_vert_2 ) { imp_point_1->set_point_type(CREATE_NEW_VERTEX); if (imp_point_2->get_point_type() != CREATE_NEW_VERTEX ) imp_point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else if ( owner_vert_1 && owner_vert_2 ) { //Only make them verts on both boundaries if //they aready all vertices. Their owner could //have been set previously by some other intersection //like a cross or a T. It is important that points //that need vertices on them end up being marked //as a vertex on the other boundary... if(imp_point_1->get_point_type() != CREATE_NEW_VERTEX ) imp_point_1->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); if(imp_point_2->get_point_type() != CREATE_NEW_VERTEX ) imp_point_2->set_point_type(VERTEX_ON_BOTH_BOUNDARIES); } else { imp_point_1->set_point_type(ON_BOTH_BOUNDARIES); imp_point_2->set_point_type(ON_BOTH_BOUNDARIES); } return CUBIT_SUCCESS; }
void ImprintBoundaryTool::update_boundary_loops | ( | PointLoopList & | boundary_loops, |
ImprintLineSegment ** | surf_loop_heads | ||
) | [private] |
Definition at line 5671 of file ImprintBoundaryTool.cpp.
{ int ii; PointList *point_loop; ImprintLineSegment *prev_seg, *seg; CubitBoolean first = CUBIT_TRUE; boundary_loops.reset(); for ( ii = 0; ii < boundary_loops.size(); ii++ ) { point_loop = boundary_loops.get_and_step(); point_loop->clean_out(); //now from the linked list get the line loop. prev_seg = surf_loop_heads[ii]->get_prev(); first = CUBIT_TRUE; while( prev_seg != surf_loop_heads[ii]->get_prev() || first ) { first = CUBIT_FALSE; seg = prev_seg->get_next(); point_loop->append(seg->get_end()); if ( DEBUG_FLAG(129) ) draw_end(seg); prev_seg = seg; } } }
void ImprintBoundaryTool::update_linked_list | ( | ImprintLineSegment * | old_seg, |
ImprintLineSegment * | new_seg_1, | ||
ImprintLineSegment * | new_seg_2 | ||
) | [private] |
void ImprintBoundaryTool::update_list | ( | ImprintLineSegment ** | new_segments, |
ImprintLineSegment * | seg_1, | ||
ImprintLineSegment * | seg_2, | ||
const CubitBoolean | list_1 | ||
) | [private] |
Definition at line 1769 of file ImprintBoundaryTool.cpp.
{ if (list_1) { new_segments[0]->set_prev(seg_1->get_prev()); seg_1->get_prev()->set_next(new_segments[0]); new_segments[0]->set_next(new_segments[1]); new_segments[1]->set_prev(new_segments[0]); new_segments[1]->set_next(seg_1->get_next()); seg_1->get_next()->set_prev(new_segments[1]); } else { new_segments[2]->set_prev(seg_2->get_prev()); seg_2->get_prev()->set_next(new_segments[2]); new_segments[2]->set_next(new_segments[3]); new_segments[3]->set_prev(new_segments[2]); new_segments[3]->set_next(seg_2->get_next()); seg_2->get_next()->set_prev(new_segments[3]); } }
CubitStatus ImprintBoundaryTool::update_seg_matches | ( | ImprintLineSegment * | old_seg, |
ImprintLineSegment * | new_seg_1, | ||
ImprintLineSegment * | new_seg_2, | ||
ImprintMatchData * | curr_match_data | ||
) | [private] |
Definition at line 5363 of file ImprintBoundaryTool.cpp.
{ DLIList <ImprintMatchData*> seg_match_data; old_seg->get_match_data(seg_match_data); if ( seg_match_data.size() == 0 ) return CUBIT_SUCCESS; //get the equation of the line. CubitVector split_coord = new_seg_1->get_end()->coordinates(); CubitVector start_v = old_seg->get_start()->coordinates(); CubitVector end_v = old_seg->get_end()->coordinates(); CubitVector diff_end_start = end_v - start_v; double dot1 = diff_end_start%diff_end_start; if ( dot1 > -CUBIT_RESABS && dot1 < CUBIT_RESABS ) { //This is bad. It means that the start and end //vectors are really close together. PRINT_ERROR("Segment used for imprinting is corrupted.\n"); PRINT_ERROR("Internal Imprint Problem, Please Report.\n"); return CUBIT_FAILURE; } CubitVector diff_split_start = split_coord - start_v; double split_t = (diff_split_start%diff_end_start)/dot1; int ii; ImprintMatchData *match_data; CubitVector *closest_point, diff_curr_start, temp_v; double curr_t; for ( ii = seg_match_data.size(); ii > 0; ii-- ) { match_data = seg_match_data.get_and_step(); if ( match_data == curr_match_data ) continue; closest_point = match_data->get_point_on(); if (closest_point == NULL ) { temp_v = match_data->get_closest_point()->coordinates(); closest_point = &temp_v; } //Find the parametric position on the old_seg for this //point. diff_curr_start = (*closest_point) - start_v; curr_t = (diff_curr_start%diff_end_start)/dot1; if ( curr_t < split_t ) { match_data->set_closest_seg(new_seg_1); new_seg_1->add_match_data(match_data); } else if (curr_t > split_t ) { match_data->set_closest_seg(new_seg_2); new_seg_2->add_match_data(match_data); } else { //hmm two match datas at the same point. That is //an error. PRINT_ERROR("Bad logic in match data.\n"); PRINT_ERROR("Internal Imprint Problem, Please Report.\n"); return CUBIT_FAILURE; } } return CUBIT_SUCCESS; }
CubitBoolean ImprintBoundaryTool::valid_partition | ( | DLIList< RefEdge * > & | ref_edges, |
RefFace * | ref_face | ||
) | [private] |
Definition at line 3898 of file ImprintBoundaryTool.cpp.
{ //Test to make sure the vertices of the ref_edges hit at least twice //on the boundary of the ref_face_ptr. DLIList <RefVertex*> boundary_verts; RefEdge *curr_edge; RefVertex *ref_vert1, *ref_vert2; int ii; //int vert_boundary_count = 0; for ( ii = ref_edges.size(); ii > 0; ii-- ) { curr_edge = ref_edges.get_and_step(); ref_vert1 = curr_edge->start_vertex(); ref_vert2 = curr_edge->end_vertex(); if ( ref_vert1 == ref_vert2 ) continue; if ( ref_vert1->num_ref_edges() < 2 ) return CUBIT_FALSE; if ( ref_vert1->num_ref_faces() > 0) boundary_verts.append(ref_vert1); if ( ref_vert2->num_ref_edges() < 2 ) return CUBIT_FALSE; if ( ref_vert2->num_ref_faces() > 0 ) boundary_verts.append(ref_vert2); } if ( ref_face->num_loops() > 1 ) { //Walk on the surface. Determine if this partition is //creating a sipeish partition. We can't handle that right //now. //Start with a boundary_vert. Determine the loop that it is //on. Go on it accross the imprint. Find its imprint. DLIList <Loop*> loop_list; DLIList <RefEdge*> ref_edge_list; Loop *start_loop = NULL; while (boundary_verts.size()) { ref_vert1 = boundary_verts.pop(); loop_list.clean_out(); ref_vert1->loops(loop_list); for ( ii = loop_list.size(); ii > 0; ii-- ) { if ( loop_list.get()->get_ref_face_ptr() == ref_face ) break; else loop_list.step(); } if ( loop_list.get()->get_ref_face_ptr() != ref_face ) { PRINT_ERROR("Problems in valid partition logic..."); return CUBIT_FALSE; } start_loop = loop_list.get(); do { loop_list.clean_out(); ref_edge_list.clean_out(); ref_vert1->ref_edges(ref_edge_list); //Find the ref_edge that has no surfaces. for ( ii = ref_edge_list.size(); ii > 0; ii--) { if ( ref_edge_list.get()->num_ref_faces() == 0 ) break; else ref_edge_list.step(); } if ( ref_edge_list.get()->num_ref_faces() != 0 ) { PRINT_ERROR("Problems in valid partition logic..."); return CUBIT_FALSE; } curr_edge = ref_edge_list.get(); if ( curr_edge->start_vertex() == curr_edge->end_vertex() ) continue; if ( curr_edge->start_vertex() == ref_vert1 ) ref_vert2 = curr_edge->end_vertex(); else ref_vert2 = curr_edge->start_vertex(); if ( ref_vert2->num_ref_faces() > 0 ) { //This is a boundary vert. Remove it... if ( !boundary_verts.move_to(ref_vert2) ) { //If this has already been removed, //then we have a bad partition. return CUBIT_FALSE; } boundary_verts.remove(ref_vert2); loop_list.clean_out(); ref_vert2->loops(loop_list); for ( ii = loop_list.size(); ii > 0; ii-- ) { if ( loop_list.get()->get_ref_face_ptr() == ref_face ) break; else loop_list.step(); } if ( loop_list.get()->get_ref_face_ptr() != ref_face ) { PRINT_ERROR("Problems in valid partition logic..."); return CUBIT_FALSE; } if ( loop_list.get() == start_loop ) { //This isn't a bad partition. Break out to the outer loop. //The partition splits its own loop which is fine... break; } else if ( loop_list.get() != start_loop && boundary_verts.size() == 0 ) { return CUBIT_FALSE; } //Okay, find a vertex on this loop that is a partition vertex. DLIList <RefVertex*> ref_vertices; loop_list.get()->ref_vertices(ref_vertices); for ( ii = ref_vertices.size(); ii > 0; ii-- ) { ref_vert1 = ref_vertices.get_and_step(); if ( ref_vert1 != ref_vert2 && boundary_verts.move_to(ref_vert1) ) { break; } } if ( ref_vert1 == ref_vert2 || !boundary_verts.move_to(ref_vert1) ) { //if the vert had been removed or we have a loop //this is a bad partition. return CUBIT_FALSE; } //ref_vert1 is now set to continue on... boundary_verts.remove(ref_vert1); } else ref_vert1 = ref_vert2; } while (ref_vert1 != NULL ); } } return CUBIT_TRUE; }
SegList* ImprintBoundaryTool::allocatedLineData [private] |
Definition at line 106 of file ImprintBoundaryTool.hpp.
Definition at line 108 of file ImprintBoundaryTool.hpp.
Definition at line 109 of file ImprintBoundaryTool.hpp.
PointList* ImprintBoundaryTool::allocatedPointData [private] |
Definition at line 105 of file ImprintBoundaryTool.hpp.
Definition at line 107 of file ImprintBoundaryTool.hpp.
DLIList<RefEdge*>* ImprintBoundaryTool::allocatedRefEdge [private] |
Definition at line 110 of file ImprintBoundaryTool.hpp.
CubitBoolean ImprintBoundaryTool::modBound1 [private] |
Definition at line 101 of file ImprintBoundaryTool.hpp.
CubitBoolean ImprintBoundaryTool::modBound2 [private] |
Definition at line 102 of file ImprintBoundaryTool.hpp.
double ImprintBoundaryTool::myTolerance [private] |
Definition at line 98 of file ImprintBoundaryTool.hpp.
RefFace* ImprintBoundaryTool::refFacePtr1 [private] |
Definition at line 99 of file ImprintBoundaryTool.hpp.
RefFace* ImprintBoundaryTool::refFacePtr2 [private] |
Definition at line 100 of file ImprintBoundaryTool.hpp.