From 62f225930c5f2e08882ac6ba5a39a1dfeb15290f Mon Sep 17 00:00:00 2001 From: gka Date: Thu, 24 Oct 2013 11:48:44 +0400 Subject: [PATCH] 0024206: Exception is raised in the STEP loopback tests. Fixed several cases of potentially uninitialized variables in Shape Healing. Corrections to avoid warning for unused variable distmini and to avoid regression for case bug22805 --- src/ShapeAnalysis/ShapeAnalysis_Curve.cxx | 62 ++++--- src/ShapeFix/ShapeFix_EdgeProjAux.cxx | 188 ++++++++++++---------- 2 files changed, 146 insertions(+), 104 deletions(-) diff --git a/src/ShapeAnalysis/ShapeAnalysis_Curve.cxx b/src/ShapeAnalysis/ShapeAnalysis_Curve.cxx index 9ec8432646..4553e4212e 100755 --- a/src/ShapeAnalysis/ShapeAnalysis_Curve.cxx +++ b/src/ShapeAnalysis/ShapeAnalysis_Curve.cxx @@ -176,27 +176,46 @@ Standard_Real ShapeAnalysis_Curve::Project(const Adaptor3d_Curve& C3D, const Standard_Boolean AdjustToEnds) const { + Standard_Real uMin = C3D.FirstParameter(); Standard_Real uMax = C3D.LastParameter(); - Standard_Real distmin; - if (!Precision::IsInfinite(uMin)||!Precision::IsInfinite(uMax)) { - Standard_Real prec = ( AdjustToEnds ? preci : Precision::Confusion() ); //:j8 abv 10 Dec 98: tr10_r0501_db.stp #9423: protection against densing of points near one end - gp_Pnt LowBound = C3D.Value(uMin); - gp_Pnt HigBound = C3D.Value(uMax); - distmin = LowBound.Distance(P3D); - if (distmin <= prec) { - param = uMin; - proj = LowBound; - return distmin; - } - distmin = HigBound.Distance(P3D); - if (distmin <= prec) { - param = uMax; - proj = HigBound; - return distmin; - } + + if (Precision::IsInfinite(uMin) && Precision::IsInfinite(uMax)) + return ProjectAct(C3D, P3D, preci, proj, param); + + Standard_Real distmin_L = Precision::Infinite(), distmin_H = Precision::Infinite(); + Standard_Real prec = ( AdjustToEnds ? preci : Precision::Confusion() ); //:j8 abv 10 Dec 98: tr10_r0501_db.stp #9423: protection against densing of points near one end + gp_Pnt LowBound = C3D.Value(uMin); + gp_Pnt HigBound = C3D.Value(uMax); + distmin_L = LowBound.Distance(P3D); + distmin_H = HigBound.Distance(P3D); + + if (distmin_L <= prec) { + param = uMin; + proj = LowBound; + return distmin_L; } - return ProjectAct(C3D, P3D, preci, proj, param); + + if (distmin_H <= prec) { + param = uMax; + proj = HigBound; + return distmin_H; + } + + Standard_Real distProj = ProjectAct(C3D, P3D, preci, proj, param); + if( distProj < distmin_L + Precision::Confusion() && distProj < distmin_H + Precision::Confusion()) + return distProj; + + if( distmin_L < distmin_H) + { + param = uMin; + proj = LowBound; + return distmin_L; + } + param = uMax; + proj = HigBound; + return distmin_H; + } //======================================================================= @@ -212,6 +231,7 @@ Standard_Real ShapeAnalysis_Curve::ProjectAct(const Adaptor3d_Curve& C3D, { Standard_Boolean OK = Standard_False; + param = 0.; try { OCC_CATCH_SIGNALS Extrema_ExtPC myExtPC(P3D,C3D); @@ -234,11 +254,11 @@ Standard_Real ShapeAnalysis_Curve::ProjectAct(const Adaptor3d_Curve& C3D, Standard_Failure::Caught()->Print(cout); cout << endl; #endif } - + //szv#4:S4163:12Mar99 moved Standard_Real uMin = C3D.FirstParameter(), uMax = C3D.LastParameter(); Standard_Boolean closed = Standard_False; // si on franchit les bornes ... - Standard_Real distmin = RealLast(), valclosed = 0.; + Standard_Real distmin = Precision::Infinite(), valclosed = 0.; Standard_Real aModParam = param; Standard_Real aModMin = distmin; @@ -386,7 +406,7 @@ Standard_Real ShapeAnalysis_Curve::NextProject(const Standard_Real paramPrev, { Standard_Real uMin = (cf < cl ? cf : cl); Standard_Real uMax = (cf < cl ? cl : cf); - Standard_Real distmin; + Standard_Real distmin = Precision::Infinite(); if (C3D->IsKind(STANDARD_TYPE(Geom_BoundedCurve))) { Standard_Real prec = ( AdjustToEnds ? preci : Precision::Confusion() ); //:j8 abv 10 Dec 98: tr10_r0501_db.stp #9423: protection against densing of points near one end gp_Pnt LowBound = C3D->Value(uMin); diff --git a/src/ShapeFix/ShapeFix_EdgeProjAux.cxx b/src/ShapeFix/ShapeFix_EdgeProjAux.cxx index 5243b03789..1d9da03b92 100755 --- a/src/ShapeFix/ShapeFix_EdgeProjAux.cxx +++ b/src/ShapeFix/ShapeFix_EdgeProjAux.cxx @@ -81,6 +81,7 @@ void ShapeFix_EdgeProjAux::Init (const TopoDS_Face& F, { myFace = F; myEdge = E; + myFirstParam = myLastParam = 0.; myFirstDone = myLastDone = Standard_False; } @@ -232,7 +233,8 @@ void ShapeFix_EdgeProjAux::Init2d (const Standard_Real preci) Handle(Geom_Surface) theSurface = BRep_Tool::Surface(myFace); Handle(Geom2d_Curve) theCurve2d = BRep_Tool::CurveOnSurface(myEdge, myFace, cf, cl); if ( theCurve2d.IsNull() ) return; //:r5 abv 6 Apr 99: ec_turbine-A.stp, #4313 - + myFirstParam = cf; + myLastParam = cl; TopoDS_Vertex V1,V2; TopExp::Vertices(myEdge, V1, V2); gp_Pnt Pt1,Pt2; @@ -248,34 +250,34 @@ void ShapeFix_EdgeProjAux::Init2d (const Standard_Real preci) Pt1 = BRep_Tool::Pnt(V1); Pt2 = BRep_Tool::Pnt(V2); } -//:S4136 Standard_Real preci = BRepAPI::Precision(); + //:S4136 Standard_Real preci = BRepAPI::Precision(); //pdn to manage degenerated case if (V1.IsSame(V2)) { Handle(ShapeAnalysis_Surface) stsu = new ShapeAnalysis_Surface (theSurface); gp_Pnt2d aPt1,aPt2; Standard_Real firstpar,lastpar; if (stsu->DegeneratedValues(Pt1,preci,aPt1,aPt2,firstpar,lastpar)){ - + if(theCurve2d->IsKind(STANDARD_TYPE(Geom2d_Line))) { - if (aPt1.IsEqual(theCurve2d->Value(firstpar),preci) && - aPt2.IsEqual(theCurve2d->Value(lastpar),preci)){ - myFirstParam = firstpar; - myLastParam = lastpar; - myFirstDone = myLastDone = Standard_True; - return; - } + if (aPt1.IsEqual(theCurve2d->Value(firstpar),preci) && + aPt2.IsEqual(theCurve2d->Value(lastpar),preci)){ + myFirstParam = firstpar; + myLastParam = lastpar; + myFirstDone = myLastDone = Standard_True; + return; + } } #ifdef DEBUG else cout <<"Other type of deg curve"<FirstParameter(); cl = theCurve2d->LastParameter(); //pdn cutting pcurve by suface bounds @@ -284,60 +286,60 @@ void ShapeFix_EdgeProjAux::Init2d (const Standard_Real preci) Standard_Real uf,ul,vf,vl; theSurface->Bounds(uf,ul,vf,vl); if(!Precision::IsInfinite(uf)&&!Precision::IsInfinite(ul)&& - !Precision::IsInfinite(vf)&&!Precision::IsInfinite(vl)) { - Standard_Real cfi,cli; - Handle(Geom2d_Line) lin = Handle(Geom2d_Line)::DownCast(theCurve2d); - gp_Pnt2d pnt = lin->Location(); - gp_Dir2d dir = lin->Direction(); - if (dir.Y()==0) { - parU = Standard_True; - cfi = (uf-pnt.X())/dir.X(); - cli = (ul-pnt.X())/dir.X(); - } - else if (dir.X()==0) { - parV = Standard_True; - cfi = (vf-pnt.Y())/dir.Y(); - cli = (vl-pnt.Y())/dir.Y(); - } - else {//common case - Standard_Real xfi, xli, yfi, yli; - xfi = (uf-pnt.X())/dir.X(); - xli = (ul-pnt.X())/dir.X(); - yfi = (vf-pnt.Y())/dir.Y(); - yli = (vl-pnt.Y())/dir.Y(); - if (dir.X()*dir.Y() > 0) { - cfi = (Abs(xli-xfi) < Abs(xli-yfi)? xfi : yfi); - cli = (Abs(xfi-xli) < Abs(xfi-yli)? xli : yli); - } else { - cfi = (Abs(xli-xfi) < Abs(xli-yli)? xfi : yli); - cli = (Abs(yli-xli) < Abs(yli-yfi)? xli : yfi); - } - } - if (cfi < cli) { cf = cfi; cl = cli; } - else { cf = cli; cl = cfi; } + !Precision::IsInfinite(vf)&&!Precision::IsInfinite(vl)) { + Standard_Real cfi,cli; + Handle(Geom2d_Line) lin = Handle(Geom2d_Line)::DownCast(theCurve2d); + gp_Pnt2d pnt = lin->Location(); + gp_Dir2d dir = lin->Direction(); + if (dir.Y()==0) { + parU = Standard_True; + cfi = (uf-pnt.X())/dir.X(); + cli = (ul-pnt.X())/dir.X(); + } + else if (dir.X()==0) { + parV = Standard_True; + cfi = (vf-pnt.Y())/dir.Y(); + cli = (vl-pnt.Y())/dir.Y(); + } + else {//common case + Standard_Real xfi, xli, yfi, yli; + xfi = (uf-pnt.X())/dir.X(); + xli = (ul-pnt.X())/dir.X(); + yfi = (vf-pnt.Y())/dir.Y(); + yli = (vl-pnt.Y())/dir.Y(); + if (dir.X()*dir.Y() > 0) { + cfi = (Abs(xli-xfi) < Abs(xli-yfi)? xfi : yfi); + cli = (Abs(xfi-xli) < Abs(xfi-yli)? xli : yli); + } else { + cfi = (Abs(xli-xfi) < Abs(xli-yli)? xfi : yli); + cli = (Abs(yli-xli) < Abs(yli-yfi)? xli : yfi); + } + } + if (cfi < cli) { cf = cfi; cl = cli; } + else { cf = cli; cl = cfi; } } else if(!Precision::IsInfinite(uf)&&!Precision::IsInfinite(ul)){ - Handle(Geom2d_Line) lin = Handle(Geom2d_Line)::DownCast(theCurve2d); - gp_Dir2d dir = lin->Direction(); - if (dir.X()!=0) { - if (dir.Y()==0) parU = Standard_True; - gp_Pnt2d pnt = lin->Location(); //szv#4:S4163:12Mar99 moved - Standard_Real cfi = (uf-pnt.X())/dir.X(); - Standard_Real cli = (ul-pnt.X())/dir.X(); - if (cfi < cli) { cf = cfi; cl = cli; } - else { cf = cli; cl = cfi; } - } - else { - cf=-10000; - cl= 10000; - } + Handle(Geom2d_Line) lin = Handle(Geom2d_Line)::DownCast(theCurve2d); + gp_Dir2d dir = lin->Direction(); + if (dir.X()!=0) { + if (dir.Y()==0) parU = Standard_True; + gp_Pnt2d pnt = lin->Location(); //szv#4:S4163:12Mar99 moved + Standard_Real cfi = (uf-pnt.X())/dir.X(); + Standard_Real cli = (ul-pnt.X())/dir.X(); + if (cfi < cli) { cf = cfi; cl = cli; } + else { cf = cli; cl = cfi; } + } + else { + cf=-10000; + cl= 10000; + } } else { - cf=-10000; - cl= 10000; - //pdn not cutted by bounds + cf=-10000; + cl= 10000; + //pdn not cutted by bounds #ifdef DEBUG - cout<<"Infinite Surface"< preci) return; + //if distance is infinite then projection is not performed + if( Precision::IsInfinite(dist)) + { + myFirstDone = Standard_False; + myLastDone = Standard_False; + return; + } + + if (dist > preci) + return; dist = sac.Project(COnS,Pt2,preci,pnt,w2,Standard_False); - if (dist > preci) return; - + if( Precision::IsInfinite(dist)) + { + myLastDone = Standard_False; + return; + } + if (dist > preci) + return; + if(fabs(w1 - w2) < Precision::PConfusion()) + { + if(!theSurface->IsUPeriodic() && !theSurface->IsVPeriodic()) + return; + } myFirstParam = w1; myLastParam = w2; myFirstDone = myLastDone = Standard_True; @@ -387,14 +409,14 @@ void ShapeFix_EdgeProjAux::Init2d (const Standard_Real preci) if ( COnS.Value(Uinf).Distance ( COnS.Value(Usup) ) < Precision::Confusion() ) { // 18.11.2002 SKL OCC630 compare values with tolerance Precision::PConfusion() instead of "==" if ( Abs(myFirstParam-Uinf) < ::Precision::PConfusion() && - Abs(myLastParam-Uinf) < ::Precision::PConfusion() ) - myLastParam = w2 = Usup; + Abs(myLastParam-Uinf) < ::Precision::PConfusion() ) + myLastParam = w2 = Usup; // 18.11.2002 SKL OCC630 compare values with tolerance Precision::PConfusion() instead of "==" else if ( Abs(myFirstParam-Usup) < ::Precision::PConfusion() && - Abs(myLastParam-Usup) < ::Precision::PConfusion() ) - myFirstParam = w1 = Uinf; + Abs(myLastParam-Usup) < ::Precision::PConfusion() ) + myFirstParam = w1 = Uinf; } - + //pdn adjust parameters in periodic case if(parU || parV) { Standard_Real uf,ul,vf,vl; @@ -416,24 +438,24 @@ void ShapeFix_EdgeProjAux::Init2d (const Standard_Real preci) if(w1>w2) { if(w2 > wmid) myFirstParam -= period; else if (w1 > wmid) - UpdateParam2d(theCurve2d); + UpdateParam2d(theCurve2d); else { - myLastParam+=period; + myLastParam+=period; #ifdef DEBUG - cout <<" Added"< wmid) { - myLastParam -=period; - UpdateParam2d(theCurve2d); + myLastParam -=period; + UpdateParam2d(theCurve2d); #ifdef DEBUG - cout <<" Added & Inverted"<