From e0bcefe2bd98153ac001f4ea16ab013831fb0994 Mon Sep 17 00:00:00 2001 From: jgv Date: Thu, 28 May 2015 17:43:49 +0300 Subject: [PATCH] 0026185: BRepOffsetAPI_MakeOffset: regressions on some customer's cases --- src/BRepFill/BRepFill_OffsetWire.cxx | 5 +- src/BRepFill/BRepFill_TrimEdgeTool.cdl | 4 +- src/BRepFill/BRepFill_TrimEdgeTool.cxx | 20 +++++++- src/Bisector/Bisector_Bisec.cdl | 4 +- src/Bisector/Bisector_Bisec.cxx | 2 + src/Bisector/Bisector_BisecAna.cdl | 5 +- src/Bisector/Bisector_BisecAna.cxx | 67 ++++++++++++++++---------- src/MAT2d/MAT2d_Tool2d.cxx | 14 +++++- 8 files changed, 89 insertions(+), 32 deletions(-) diff --git a/src/BRepFill/BRepFill_OffsetWire.cxx b/src/BRepFill/BRepFill_OffsetWire.cxx index c8d81b284e..98a48315e5 100755 --- a/src/BRepFill/BRepFill_OffsetWire.cxx +++ b/src/BRepFill/BRepFill_OffsetWire.cxx @@ -915,6 +915,9 @@ void BRepFill_OffsetWire::PerformWithBiLo // MapNodeVertex,VE); } + if (myJoinType == GeomAbs_Intersection) + StartOnEdge = EndOnEdge = 0; + //--------------------------------------------- // Construction of geometries. //--------------------------------------------- @@ -927,7 +930,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 c7d1189d8f..7c265f864e 100755 --- a/src/BRepFill/BRepFill_TrimEdgeTool.cdl +++ b/src/BRepFill/BRepFill_TrimEdgeTool.cdl @@ -32,7 +32,8 @@ uses Curve from Geom2d, Geometry from Geom2d, SequenceOfPnt from TColgp, - Curve from Geom2dAdaptor + Curve from Geom2dAdaptor, + JoinType from GeomAbs is Create @@ -45,6 +46,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 9a64bc6ee4..2d6accb50e 100755 --- a/src/BRepFill/BRepFill_TrimEdgeTool.cxx +++ b/src/BRepFill/BRepFill_TrimEdgeTool.cxx @@ -306,7 +306,8 @@ static void EvalParametersBis(const Geom2dAdaptor_Curve& Bis, void BRepFill_TrimEdgeTool::IntersectWith(const TopoDS_Edge& Edge1, const TopoDS_Edge& Edge2, - TColgp_SequenceOfPnt& Params) + const GeomAbs_JoinType theJoinType, + TColgp_SequenceOfPnt& Params) { Params.Clear(); @@ -484,6 +485,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 2173d0ce80..2d3247b4cc 100755 --- a/src/Bisector/Bisector_Bisec.cdl +++ b/src/Bisector/Bisector_Bisec.cdl @@ -50,7 +50,8 @@ 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; @@ -62,6 +63,7 @@ is 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 ); diff --git a/src/Bisector/Bisector_Bisec.cxx b/src/Bisector/Bisector_Bisec.cxx index cd418ac6f9..ee469abcbd 100755 --- a/src/Bisector/Bisector_Bisec.cxx +++ b/src/Bisector/Bisector_Bisec.cxx @@ -81,6 +81,7 @@ void Bisector_Bisec::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 ) { @@ -110,6 +111,7 @@ void Bisector_Bisec::Perform(const Handle(Geom2d_Curve)& afirstcurve , afirstvector , asecondvector , adirection , + ajointype , tolerance , oncurve ); UFirst = BisAna->ParameterOfStartPoint(); diff --git a/src/Bisector/Bisector_BisecAna.cdl b/src/Bisector/Bisector_BisecAna.cdl index d4935e00e9..52de2dd254 100755 --- a/src/Bisector/Bisector_BisecAna.cdl +++ b/src/Bisector/Bisector_BisecAna.cdl @@ -30,6 +30,7 @@ inherits uses Shape from GeomAbs, CurveType from GeomAbs, + JoinType from GeomAbs, Curve from Geom2d, Geometry from Geom2d, TrimmedCurve from Geom2d, @@ -52,6 +53,7 @@ is 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 ); @@ -128,7 +130,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 51735cf7c7..eac140a608 100755 --- a/src/Bisector/Bisector_BisecAna.cxx +++ b/src/Bisector/Bisector_BisecAna.cxx @@ -81,7 +81,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; @@ -158,30 +159,33 @@ 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; } @@ -203,6 +207,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 ) { @@ -632,14 +637,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); + } } } } @@ -721,7 +738,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 8e149853ad..097c72f97a 100755 --- a/src/MAT2d/MAT2d_Tool2d.cxx +++ b/src/MAT2d/MAT2d_Tool2d.cxx @@ -349,7 +349,7 @@ void MAT2d_Tool2d::CreateBisector(const Handle(MAT_Bisector)& abisector) GeomPnt (abisector->IssuePoint()), GeomVec (abisector->FirstVector()), GeomVec (abisector->SecondVector()), - theDirection,tolerance,ontheline); + theDirection,theJoinType,tolerance,ontheline); } else if(type1 == STANDARD_TYPE(Geom2d_CartesianPoint) && type2 == STANDARD_TYPE(Geom2d_CartesianPoint)) { @@ -658,6 +658,16 @@ Standard_Boolean MAT2d_Tool2d::IsSameDistance ( Standard_Real EpsDist = MAT2d_TOLCONF*100. ; Distance = Dist(1); + if (theJoinType == GeomAbs_Intersection && + 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))) @@ -1075,7 +1085,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()); -- 2.39.5