diff --git a/src/BRepFill/BRepFill_OffsetWire.cxx b/src/BRepFill/BRepFill_OffsetWire.cxx index 926c880dc0..d26c261c7b 100644 --- a/src/BRepFill/BRepFill_OffsetWire.cxx +++ b/src/BRepFill/BRepFill_OffsetWire.cxx @@ -900,6 +900,9 @@ void BRepFill_OffsetWire::PerformWithBiLo // MapNodeVertex,VE); } + if (myJoinType == GeomAbs_Intersection) + StartOnEdge = EndOnEdge = 0; + //--------------------------------------------- // Construction of geometries. //--------------------------------------------- @@ -912,7 +915,7 @@ void BRepFill_OffsetWire::PerformWithBiLo // Construction of vertices on edges parallel to the spine. //----------------------------------------------------------- - Trim.IntersectWith(E [0], E [1], Params); + Trim.IntersectWith(E [0], E [1], myJoinType, Params); for (Standard_Integer s = 1; s <= Params.Length(); s++) { TopoDS_Vertex VC; diff --git a/src/BRepFill/BRepFill_TrimEdgeTool.cdl b/src/BRepFill/BRepFill_TrimEdgeTool.cdl index 491e6d9aa7..0e8d174afd 100644 --- a/src/BRepFill/BRepFill_TrimEdgeTool.cdl +++ b/src/BRepFill/BRepFill_TrimEdgeTool.cdl @@ -26,7 +26,8 @@ uses Curve from Geom2d, Geometry from Geom2d, SequenceOfPnt from TColgp, - Curve from Geom2dAdaptor + Curve from Geom2dAdaptor, + JoinType from GeomAbs is Create @@ -39,6 +40,7 @@ is IntersectWith( me : in out; Edge1 , Edge2 : Edge from TopoDS; + theJoinType : JoinType from GeomAbs; Params : in out SequenceOfPnt from TColgp) is static; diff --git a/src/BRepFill/BRepFill_TrimEdgeTool.cxx b/src/BRepFill/BRepFill_TrimEdgeTool.cxx index 89d90ee1ad..689b2079e8 100644 --- a/src/BRepFill/BRepFill_TrimEdgeTool.cxx +++ b/src/BRepFill/BRepFill_TrimEdgeTool.cxx @@ -303,8 +303,9 @@ static void EvalParametersBis(const Geom2dAdaptor_Curve& Bis, //======================================================================= void BRepFill_TrimEdgeTool::IntersectWith(const TopoDS_Edge& Edge1, - const TopoDS_Edge& Edge2, - TColgp_SequenceOfPnt& Params) + const TopoDS_Edge& Edge2, + const GeomAbs_JoinType theJoinType, + TColgp_SequenceOfPnt& Params) { Params.Clear(); @@ -553,6 +554,23 @@ void BRepFill_TrimEdgeTool::IntersectWith(const TopoDS_Edge& Edge1, Points2.Remove(Params.Length()+1, Points2.Length()); } + NbPoints = Params.Length(); + + if (NbPoints > 0 && theJoinType == GeomAbs_Intersection) + { + //Remove all vertices with non-minimal parameter + Standard_Integer imin = 1; + for (i = 2; i <= NbPoints; i++) + if (Params(i).X() < Params(imin).X()) + imin = i; + gp_Pnt Pnt1 = Params(imin); + gp_Pnt Pnt2 = Points2(imin); + Params.Clear(); + Points2.Clear(); + Params.Append(Pnt1); + Points2.Append(Pnt2); + } + NbPoints = Params.Length(); for ( i = 1; i <= NbPoints; i++) { PSeq = Params(i); diff --git a/src/Bisector/Bisector_Bisec.cdl b/src/Bisector/Bisector_Bisec.cdl index 114526a408..18a99705af 100644 --- a/src/Bisector/Bisector_Bisec.cdl +++ b/src/Bisector/Bisector_Bisec.cdl @@ -45,20 +45,22 @@ uses Point from Geom2d , Pnt2d from gp , Vec2d from gp , - Integer from Standard + Integer from Standard, + JoinType from GeomAbs is Create returns Bisec from Bisector; Perform(me : in out ; - Cu1 : Curve from Geom2d ; - Cu2 : Curve from Geom2d ; - P : Pnt2d from gp ; - V1 : Vec2d from gp ; - V2 : Vec2d from gp ; - Sense : Real from Standard ; - Tolerance : Real from Standard ; - oncurve : Boolean from Standard = Standard_True ); + Cu1 : Curve from Geom2d ; + Cu2 : Curve from Geom2d ; + P : Pnt2d from gp ; + V1 : Vec2d from gp ; + V2 : Vec2d from gp ; + Sense : Real from Standard ; + ajointype : JoinType from GeomAbs ; + Tolerance : Real from Standard ; + oncurve : Boolean from Standard = Standard_True ); --- Purpose : Performs the bisecting line between the curves -- and . diff --git a/src/Bisector/Bisector_Bisec.cxx b/src/Bisector/Bisector_Bisec.cxx index 6c45534aff..9262b91599 100644 --- a/src/Bisector/Bisector_Bisec.cxx +++ b/src/Bisector/Bisector_Bisec.cxx @@ -73,13 +73,14 @@ Bisector_Bisec::Bisector_Bisec() //=========================================================================== void Bisector_Bisec::Perform(const Handle(Geom2d_Curve)& afirstcurve , - const Handle(Geom2d_Curve)& asecondcurve , - const gp_Pnt2d& apoint , - const gp_Vec2d& afirstvector , - const gp_Vec2d& asecondvector , - const Standard_Real adirection , - const Standard_Real tolerance , - const Standard_Boolean oncurve ) + const Handle(Geom2d_Curve)& asecondcurve , + const gp_Pnt2d& apoint , + const gp_Vec2d& afirstvector , + const gp_Vec2d& asecondvector , + const Standard_Real adirection , + const GeomAbs_JoinType ajointype , + const Standard_Real tolerance , + const Standard_Boolean oncurve ) { Handle(Standard_Type) Type1 = afirstcurve ->DynamicType(); Handle(Standard_Type) Type2 = asecondcurve->DynamicType(); @@ -149,18 +150,19 @@ void Bisector_Bisec::Perform(const Handle(Geom2d_Curve)& afirstcurve , //------------------------------------------------------------------ // Analytic Bissectrice. //------------------------------------------------------------------ - Handle(Bisector_BisecAna) BisAna = new Bisector_BisecAna(); - BisAna->Perform(afirstcurve1 , - asecondcurve1 , - apoint , - afirstvector , - asecondvector , - adirection , - tolerance , - oncurve ); - UFirst = BisAna->ParameterOfStartPoint(); - ULast = BisAna->ParameterOfEndPoint(); - Bis = BisAna; + Handle(Bisector_BisecAna) BisAna = new Bisector_BisecAna(); + BisAna->Perform(afirstcurve1 , + asecondcurve1 , + apoint , + afirstvector , + asecondvector , + adirection , + ajointype , + tolerance , + oncurve ); + UFirst = BisAna->ParameterOfStartPoint(); + ULast = BisAna->ParameterOfEndPoint(); + Bis = BisAna; } else { Standard_Boolean IsLine = Standard_False; diff --git a/src/Bisector/Bisector_BisecAna.cdl b/src/Bisector/Bisector_BisecAna.cdl index db5248e2bb..231e41c909 100644 --- a/src/Bisector/Bisector_BisecAna.cdl +++ b/src/Bisector/Bisector_BisecAna.cdl @@ -27,6 +27,7 @@ inherits uses Shape from GeomAbs, CurveType from GeomAbs, + JoinType from GeomAbs, Curve from Geom2d, Geometry from Geom2d, TrimmedCurve from Geom2d, @@ -43,14 +44,15 @@ is Create returns BisecAna; Perform(me : mutable ; - Cu1 : Curve from Geom2d ; - Cu2 : Curve from Geom2d ; - P : Pnt2d from gp ; - V1 : Vec2d from gp ; - V2 : Vec2d from gp ; - Sense : Real from Standard ; - Tolerance : Real from Standard ; - oncurve : Boolean from Standard = Standard_True ); + Cu1 : Curve from Geom2d ; + Cu2 : Curve from Geom2d ; + P : Pnt2d from gp ; + V1 : Vec2d from gp ; + V2 : Vec2d from gp ; + Sense : Real from Standard ; + jointype : JoinType from GeomAbs ; + Tolerance : Real from Standard ; + oncurve : Boolean from Standard = Standard_True ); --- Purpose : Performs the bisecting line between the curves -- and . @@ -125,7 +127,8 @@ is Sense : Real from Standard ; U : out Real from Standard ; sense : out Boolean from Standard ; - ok : out Boolean from Standard ) + ok : out Boolean from Standard ; + IsBisecOfTwoLines : Boolean from Standard = Standard_False) --- Purpose : Returns the distance between the point

and -- the bisecting . diff --git a/src/Bisector/Bisector_BisecAna.cxx b/src/Bisector/Bisector_BisecAna.cxx index ce42c1ab83..a5c05f0649 100644 --- a/src/Bisector/Bisector_BisecAna.cxx +++ b/src/Bisector/Bisector_BisecAna.cxx @@ -76,7 +76,8 @@ Standard_Real Bisector_BisecAna::Distance ( const Standard_Real adirection, Standard_Real& aparameter, Standard_Boolean& asense, - Standard_Boolean& astatus) + Standard_Boolean& astatus, + Standard_Boolean IsBisecOfTwoLines) { astatus = Standard_True; @@ -153,30 +154,36 @@ Standard_Real Bisector_BisecAna::Distance ( else { asense = Standard_True; -// Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 Begin -// Replacement of -1.E-8 for a tolerance 1.e-4 - Standard_Real aTol = 1.e-4; - - if ((afirstdir^secdirrev)*adirection < -0.1) { // input - if((afirstdir^tangdir)*adirection < aTol && - (secdirrev^tangdir)*adirection < aTol) asense = Standard_False; - } - else if((afirstdir^secdirrev)*adirection > 0.1) { // output - if((afirstdir^tangdir)*adirection < aTol || - (secdirrev^tangdir)*adirection < aTol) asense = Standard_False; - } - else { // flat - if (afirstdir.Dot(secdirrev) > 0.) { // tangent - if ((afirstdir^tangdir)*adirection < 0.) asense = Standard_False; + if (!IsBisecOfTwoLines) + { + // Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 Begin + // Replacement of -1.E-8 for a tolerance 1.e-4 + Standard_Real aTol = 1.e-4; + + if ((afirstdir^secdirrev)*adirection < -0.1) { // input + if((afirstdir^tangdir)*adirection < aTol && + (secdirrev^tangdir)*adirection < aTol) + asense = Standard_False; } - else{ // turn back -// Modified by Sergey KHROMOV - Thu Oct 31 14:16:53 2002 -// if ((afirstdir.Dot(tangdir))*adirection > 0.) asense = Standard_False; - if (afirstdir.Dot(tangdir) < 0.) asense = Standard_False; -// Modified by Sergey KHROMOV - Thu Oct 31 14:16:54 2002 + else if((afirstdir^secdirrev)*adirection > 0.1) { // output + if((afirstdir^tangdir)*adirection < aTol || + (secdirrev^tangdir)*adirection < aTol) + asense = Standard_False; } + else { // flat + if (afirstdir.Dot(secdirrev) > 0.) { // tangent + if ((afirstdir^tangdir)*adirection < 0.) + asense = Standard_False; + } + else{ // turn back + // Modified by Sergey KHROMOV - Thu Oct 31 14:16:53 2002 + // if ((afirstdir.Dot(tangdir))*adirection > 0.) asense = Standard_False; + if (afirstdir.Dot(tangdir) < 0.) asense = Standard_False; + // Modified by Sergey KHROMOV - Thu Oct 31 14:16:54 2002 + } + } + // Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 End } -// Modified by Sergey KHROMOV - Tue Oct 22 16:35:51 2002 End } return distance; } @@ -198,6 +205,7 @@ void Bisector_BisecAna::Perform(const Handle(Geom2d_Curve)& afirstcurve , const gp_Vec2d& afirstvector , const gp_Vec2d& asecondvector , const Standard_Real adirection , + const GeomAbs_JoinType ajointype , const Standard_Real tolerance , const Standard_Boolean oncurve ) { @@ -625,14 +633,26 @@ void Bisector_BisecAna::Perform(const Handle(Geom2d_Curve)& afirstcurve , } else if (type == GccInt_Par) { bisectorcurve = new Geom2d_Parabola(TheSol->Parabola()); + Standard_Real FocalLength = ((Handle(Geom2d_Parabola)&)bisectorcurve)->Focal(); + Standard_Real secondparameter = Precision::Infinite(); if (!thesense) + { + if (ajointype == GeomAbs_Intersection && + 4.*FocalLength < firstparameter) //first parameter is too far from peak of parabola + secondparameter = 0.; thebisector = new Geom2d_TrimmedCurve(bisectorcurve, firstparameter, - - Precision::Infinite()); + -secondparameter); + } else + { + if (ajointype == GeomAbs_Intersection && + firstparameter < -4.*FocalLength) //first parameter is too far from peak of parabola + secondparameter = 0.; thebisector = new Geom2d_TrimmedCurve(bisectorcurve, firstparameter, - Precision::Infinite()); + secondparameter); + } } } } @@ -714,7 +734,7 @@ void Bisector_BisecAna::Perform(const Handle(Geom2d_Curve)& afirstcurve , else distanceptsol = Distance(apoint,solution, afirstvector,asecondvector, - adirection,parameter,sense,ok); + adirection,parameter,sense,ok, Standard_True); // Modified by skv - Tue Feb 15 17:51:29 2005 Integration End if (ok || !oncurve) { thesense = sense; diff --git a/src/MAT2d/MAT2d_Tool2d.cxx b/src/MAT2d/MAT2d_Tool2d.cxx index 733b6a899b..37dcb55331 100644 --- a/src/MAT2d/MAT2d_Tool2d.cxx +++ b/src/MAT2d/MAT2d_Tool2d.cxx @@ -351,12 +351,12 @@ void MAT2d_Tool2d::CreateBisector(const Handle(MAT_Bisector)& abisector) #endif if(type1 != STANDARD_TYPE(Geom2d_CartesianPoint) && - type2 != STANDARD_TYPE(Geom2d_CartesianPoint)) { - bisector.Perform(item1,item2, - GeomPnt (abisector->IssuePoint()), - GeomVec (abisector->FirstVector()), - GeomVec (abisector->SecondVector()), - theDirection,tolerance,ontheline); + type2 != STANDARD_TYPE(Geom2d_CartesianPoint)) { + bisector.Perform(item1,item2, + GeomPnt (abisector->IssuePoint()), + GeomVec (abisector->FirstVector()), + GeomVec (abisector->SecondVector()), + theDirection,theJoinType,tolerance,ontheline); } else if(type1 == STANDARD_TYPE(Geom2d_CartesianPoint) && type2 == STANDARD_TYPE(Geom2d_CartesianPoint)) { @@ -721,10 +721,20 @@ Standard_Boolean MAT2d_Tool2d::IsSameDistance ( Standard_Real EpsDist = MAT2d_TOLCONF*300. ; Distance = Dist(1); - for (Standard_Integer i = 1; i <= 4; i++){ if (theJoinType == GeomAbs_Intersection && - Precision::IsInfinite(Dist(i))) - continue; + Precision::IsInfinite(Distance)) + { + for (Standard_Integer i = 2; i <= 4; i++) + if (!Precision::IsInfinite(Dist(i))) + { + Distance = Dist(i); + break; + } + } + for (Standard_Integer i = 1; i <= 4; i++){ + if (theJoinType == GeomAbs_Intersection && + Precision::IsInfinite(Dist(i))) + continue; if (Abs(Dist(i) - Distance) > EpsDist) { Distance = Precision::Infinite(); return Standard_False; @@ -1168,7 +1178,7 @@ void MAT2d_Tool2d::BisecFusion(const Standard_Integer I1, Handle(Bisector_BisecCC) BCC1 = Handle(Bisector_BisecCC)::DownCast(Bisector1->BasisCurve()); Bis.Perform(BCC1->Curve(2), BCC1->Curve(1), P2, VBid, VBid, - theDirection, Tolerance, Standard_False); + theDirection, theJoinType, Tolerance, Standard_False); Bisector1 = Handle(Geom2d_TrimmedCurve)::DownCast(Bis.Value()); BCC1 = Handle(Bisector_BisecCC) ::DownCast(Bisector1->BasisCurve()); diff --git a/tests/bugs/modalg_5/bug25298_09 b/tests/bugs/modalg_5/bug25298_09 index f6897d077f..a94e40277a 100755 --- a/tests/bugs/modalg_5/bug25298_09 +++ b/tests/bugs/modalg_5/bug25298_09 @@ -17,7 +17,7 @@ if [catch { mkoffset resoffset pp 1 -1. i } ] { } else { renamevar resoffset_1 result - set length 42 + set length 39.5 set nb_v_good 6 set nb_e_good 7 diff --git a/tests/bugs/modalg_6/bug26185_1 b/tests/bugs/modalg_6/bug26185_1 new file mode 100644 index 0000000000..375e5282f7 --- /dev/null +++ b/tests/bugs/modalg_6/bug26185_1 @@ -0,0 +1,13 @@ +puts "========" +puts "OCC26185" +puts "========" +puts "" +################################################################## +# BRepOffsetAPI_MakeOffset: regressions on some customer's cases +################################################################## + +smallview +restore [locate_data_file OCC26185_wrong2.brep] a +openoffset res a 1 -5. i +fit +set only_screen_axo 1 diff --git a/tests/bugs/modalg_6/bug26185_2 b/tests/bugs/modalg_6/bug26185_2 new file mode 100644 index 0000000000..536f425ade --- /dev/null +++ b/tests/bugs/modalg_6/bug26185_2 @@ -0,0 +1,13 @@ +puts "========" +puts "OCC26185" +puts "========" +puts "" +################################################################## +# BRepOffsetAPI_MakeOffset: regressions on some customer's cases +################################################################## + +smallview +restore [locate_data_file OCC26185_newOffset_1.brep] a +openoffset res a 1 -0.6 i +fit +set only_screen_axo 1 diff --git a/tests/bugs/modalg_6/bug26185_3 b/tests/bugs/modalg_6/bug26185_3 new file mode 100644 index 0000000000..b6ae309009 --- /dev/null +++ b/tests/bugs/modalg_6/bug26185_3 @@ -0,0 +1,13 @@ +puts "========" +puts "OCC26185" +puts "========" +puts "" +################################################################## +# BRepOffsetAPI_MakeOffset: regressions on some customer's cases +################################################################## + +smallview +restore [locate_data_file OCC26185_v6_Arcs.brep] a +mkoffset res a 1 -5. i +fit +set only_screen_axo 1 diff --git a/tests/bugs/modalg_6/bug26185_4 b/tests/bugs/modalg_6/bug26185_4 new file mode 100644 index 0000000000..f56886bc93 --- /dev/null +++ b/tests/bugs/modalg_6/bug26185_4 @@ -0,0 +1,14 @@ +puts "========" +puts "OCC26185" +puts "========" +puts "" +################################################################## +# BRepOffsetAPI_MakeOffset: regressions on some customer's cases +################################################################## + +smallview +restore [locate_data_file OCC26185_wrong1.brep] a +mkoffset res_1 a 1 -5. i +mkoffset res_2 a 1 5. i +fit +set only_screen_axo 1 diff --git a/tests/bugs/modalg_6/bug26185_5 b/tests/bugs/modalg_6/bug26185_5 new file mode 100644 index 0000000000..502b46f0bd --- /dev/null +++ b/tests/bugs/modalg_6/bug26185_5 @@ -0,0 +1,13 @@ +puts "========" +puts "OCC26185" +puts "========" +puts "" +################################################################## +# BRepOffsetAPI_MakeOffset: regressions on some customer's cases +################################################################## + +smallview +restore [locate_data_file OCC26185_offsetcircles.brep] a +mkoffset res a 2 -2. i +fit +set only_screen_axo 1 diff --git a/tests/bugs/modalg_6/bug26185_6 b/tests/bugs/modalg_6/bug26185_6 new file mode 100644 index 0000000000..d441025824 --- /dev/null +++ b/tests/bugs/modalg_6/bug26185_6 @@ -0,0 +1,13 @@ +puts "========" +puts "OCC26185" +puts "========" +puts "" +################################################################## +# BRepOffsetAPI_MakeOffset: regressions on some customer's cases +################################################################## + +smallview +restore [locate_data_file OCC26185_linesSet.brep] a +openoffset res a 10 2. i +fit +set only_screen_axo 1 diff --git a/tests/bugs/modalg_6/bug26185_7 b/tests/bugs/modalg_6/bug26185_7 new file mode 100644 index 0000000000..3c13417a6b --- /dev/null +++ b/tests/bugs/modalg_6/bug26185_7 @@ -0,0 +1,14 @@ +puts "========" +puts "OCC26185" +puts "========" +puts "" +################################################################## +# BRepOffsetAPI_MakeOffset: regressions on some customer's cases +################################################################## + +smallview +restore [locate_data_file OCC26185_v6_LineArc.brep] a +mkoffset res_1 a 1 -5. i +mkoffset res_2 a 1 5. i +fit +set only_screen_axo 1