From: nbv Date: Fri, 16 Jan 2015 07:43:12 +0000 (+0300) Subject: 0025583: Wrong solid is considered as valid by checkshape X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=e4f0e428d01baf0c2f82c5b2386d3abcd9b0aa00;p=occt-copy.git 0025583: Wrong solid is considered as valid by checkshape 1. Limitation tolerance value for checking if wire is closed in 2D-space of its face. 2. Some test cases were updated according to their new behavior. --- diff --git a/src/BRepCheck/BRepCheck_Wire.cxx b/src/BRepCheck/BRepCheck_Wire.cxx index c0f192b85c..1e3adce56f 100644 --- a/src/BRepCheck/BRepCheck_Wire.cxx +++ b/src/BRepCheck/BRepCheck_Wire.cxx @@ -394,94 +394,85 @@ Standard_Boolean IsDistanceIn3DTolerance (const gp_Pnt& thePnt_f, } //======================================================================= -//function : IsDistanceIn3DTolerance +//function : IsDistanceIn2DTolerance //purpose : //======================================================================= static Standard_Boolean IsDistanceIn2DTolerance (const BRepAdaptor_Surface& aFaceSurface, const gp_Pnt2d& thePnt, const gp_Pnt2d& thePntRef, - const Standard_Real aTol3d, -#ifdef OCCT_DEBUG - const Standard_Boolean PrintWarnings = Standard_True) -#else - const Standard_Boolean = Standard_True) -#endif + const Standard_Real aTol3d) { - Standard_Real dumax = 0.01 * (aFaceSurface.LastUParameter() - aFaceSurface.FirstUParameter()); - Standard_Real dvmax = 0.01 * (aFaceSurface.LastVParameter() - aFaceSurface.FirstVParameter()); - Standard_Real dumin = Abs(thePnt.X() - thePntRef.X()); - Standard_Real dvmin = Abs(thePnt.Y() - thePntRef.Y()); + const Standard_Real aFactor = 0.01; + const Standard_Real aDeltaUPar = (aFaceSurface.LastUParameter() - + aFaceSurface.FirstUParameter()); + const Standard_Real aDeltaVPar = (aFaceSurface.LastVParameter() - + aFaceSurface.FirstVParameter()); + const Standard_Real aDist2dU = Abs(thePnt.X() - thePntRef.X()); + const Standard_Real aDist2dV = Abs(thePnt.Y() - thePntRef.Y()); - if((dumin < dumax) && (dvmin < dvmax)) + if((aDist2dU < (aFactor*aDeltaUPar)) && (aDist2dV < (aFactor*aDeltaVPar))) return Standard_True; -#ifdef OCCT_DEBUG - if(PrintWarnings) - { - cout << endl; - cout << "--------Function IsDistanceIn2DTolerance(...)----------" << endl; - cout << "--- BRepCheck Wire: Not closed in 2D" << endl; - cout << "*****************************************************" << endl; - cout << "*dumin = " << dumin << "; dumax = " << dumax << endl; - cout << "* dvmin = " << dvmin << "; dvmax = " << dvmax << endl; - cout << "* (dumin > dumax) or (dvmin > dvmax)." << endl; - cout << "*****************************************************" << endl; - cout << endl; - cout << "UFirst = " << aFaceSurface.FirstUParameter(); - cout << "; ULast = " << aFaceSurface.LastUParameter() << endl; - cout << "VFirst = " << aFaceSurface.FirstVParameter(); - cout << "; VLast = " << aFaceSurface.LastVParameter() << endl; - } + Standard_Real aUTol = aFaceSurface.UResolution(aTol3d); + Standard_Real aVTol = aFaceSurface.VResolution(aTol3d); - dumax = aFaceSurface.UResolution(aTol3d); - dvmax = aFaceSurface.VResolution(aTol3d); +#ifdef OCCT_DEBUG + cout << endl; + cout << "--------Function IsDistanceIn2DTolerance(...)----------" << endl; + cout << "--- BRepCheck Wire: Not closed in 2D" << endl; + cout << "*****************************************************" << endl; + cout << "*aDist2dU = " << aDist2dU << "; aDeltaUPar = " << aFactor*aDeltaUPar << endl; + cout << "* aDist2dV = " << aDist2dV << "; aDeltaVPar = " << aFactor*aDeltaVPar << endl; + cout << "* (aDist2dU > aDeltaUPar) or (aDist2dV > aDeltaVPar)." << endl; + cout << "*****************************************************" << endl; + cout << endl; + cout << "UFirst = " << aFaceSurface.FirstUParameter(); + cout << "; ULast = " << aFaceSurface.LastUParameter() << endl; + cout << "VFirst = " << aFaceSurface.FirstVParameter(); + cout << "; VLast = " << aFaceSurface.LastVParameter() << endl; + cout << "thePnt(" << thePnt.X() << "; " << thePnt.Y() << ")" << endl; + cout << "thePntRef(" << thePntRef.X() << "; " << thePntRef.Y() << ")" << endl; +#endif - if(PrintWarnings) - { - cout << "aTol3d = " << aTol3d <<"; URes = " << dumax << "; VRes = " << dvmax << endl; - cout << "thePnt(" << thePnt.X() << "; " << thePnt.Y() << ")" << endl; - cout << "thePntRef(" << thePntRef.X() << "; " << thePntRef.Y() << ")" << endl; - } + if(aUTol >= aDeltaUPar) + {//Singular case + aUTol = 0.0; + } -#else - dumax = aFaceSurface.UResolution(aTol3d); - dvmax = aFaceSurface.VResolution(aTol3d); -#endif + if(aVTol >= aDeltaVPar) + {//Singular case + aVTol = 0.0; + } - Standard_Real aTol2d = 2*Max( dumax, dvmax); + Standard_Real aTol2d = 2*Max(aUTol, aVTol); #ifdef OCCT_DEBUG - if((aTol2d <= 0.0) && (PrintWarnings)) - { + if(aTol2d <= 0.0) + { cout<<"BRepCheck_Wire : UResolution and VResolution = 0.0 (Face too small ?)"< Tol2d = " << aTol2d << endl; - cout << "*****************************************************" << endl; - cout << "aTol3d = " << aTol3d <<"; URes = " << dumax << "; VRes = " << dvmax << endl; - cout << "thePnt(" << thePnt.X() << "; " << thePnt.Y() << ")" << endl; - cout << "thePntRef(" << thePntRef.X() << "; " << thePntRef.Y() << ")" << endl; - } + cout << endl; + cout << "--------Function IsDistanceIn2DTolerance(...)----------" << endl; + cout << "--- BRepCheck Wire: Not closed in 2d" << endl; + cout << "*****************************************************" << endl; + cout << "* Dist = " << aDist << " > Tol2d = " << aTol2d << endl; + cout << "*****************************************************" << endl; + cout << "aTol3d = " << aTol3d <<"; URes = " << aUTol << "; VRes = " << aVTol << endl; #endif return Standard_False; - } +} //======================================================================= //function : Closed2d @@ -606,7 +597,22 @@ BRepCheck_Status BRepCheck_Wire::Closed2d(const TopoDS_Face& theFace, // aUResol = 2*aFaceSurface.UResolution(aTol); // aVResol = 2*aFaceSurface.VResolution(aTol); + Standard_Real aTol3d = Max(BRep_Tool::Tolerance(aFirstVertex),BRep_Tool::Tolerance(aWireExp.CurrentVertex())); + // get first point + if(aNbFoundEdges == 1) + { + BRep_Tool::UVPoints(aFirstEdge, theFace, aP_first, aP_last); + if(!IsDistanceIn2DTolerance(aFaceSurface, aP_first, aP_last, aTol3d)) + { + aClosedStat = BRepCheck_NotClosed; + + if (Update) + BRepCheck::Add(myMap(myShape),aClosedStat); + + return aClosedStat; + } + } if (aFirstEdge.Orientation() == TopAbs_REVERSED) BRep_Tool::UVPoints(aFirstEdge, theFace, aP_temp, aP_first); else @@ -630,8 +636,6 @@ BRepCheck_Status BRepCheck_Wire::Closed2d(const TopoDS_Face& theFace, // if (dfUDist > aUResol || dfVDist > aVResol) // { - Standard_Real aTol3d = Max(BRep_Tool::Tolerance(aFirstVertex),BRep_Tool::Tolerance(aWireExp.CurrentVertex())); - gp_Pnt aPntRef = BRep_Tool::Pnt(aFirstVertex); gp_Pnt aPnt = BRep_Tool::Pnt(aWireExp.CurrentVertex()); @@ -1653,7 +1657,7 @@ void ChoixUV(const TopoDS_Vertex& theVertex, aParam =(aVOrientation != anE.Orientation()) ? aFirstParam : aLastParam; aPnt = C2d->Value(aParam); - if(!IsDistanceIn2DTolerance(aFaceSurface, aPnt, aPntRef, aTol3d, Standard_False)) + if(!IsDistanceIn2DTolerance(aFaceSurface, aPnt, aPntRef, aTol3d)) continue; CurveDirForParameter(C2d, aParam, aPnt, aDer); diff --git a/tests/de/step_1/J6 b/tests/de/step_1/J6 index 7a3cd8e2a1..519bc02c22 100755 --- a/tests/de/step_1/J6 +++ b/tests/de/step_1/J6 @@ -1,5 +1,7 @@ # !!!! This file is generated automatically, do not edit manually! See end script puts "TODO CR23096 ALL: STATSHAPE : Faulty" +puts "TODO CR12345 ALL: CHECKSHAPE : Faulty" + set LinuxDiff 2 set LinuxFaulties {STATSHAPE} @@ -8,7 +10,7 @@ set filename bm1_pe_t4.stp set ref_data { DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 ) TPSTAT : Faulties = 0 ( 2 ) Warnings = 19 ( 27 ) Summary = 19 ( 29 ) -CHECKSHAPE : Wires = 2 ( 3 ) Faces = 2 ( 3 ) Shells = 0 ( 0 ) Solids = 0 ( 0 ) +CHECKSHAPE : Wires = 4 ( 3 ) Faces = 4 ( 3 ) Shells = 0 ( 0 ) Solids = 0 ( 0 ) NBSHAPES : Solid = 0 ( 0 ) Shell = 13 ( 12 ) Face = 16 ( 15 ) Summary = 154 ( 151 ) STATSHAPE : Solid = 0 ( 0 ) Shell = 13 ( 12 ) Face = 16 ( 15 ) FreeWire = 0 ( 0 ) FreeEdge = 0 ( 0 ) SharedEdge = 59 ( 60 ) TOLERANCE : MaxTol = 1562.051497 ( 1562.051497 ) AvgTol = 192.5735494 ( 206.7634854 ) diff --git a/tests/de/step_1/ZJ7 b/tests/de/step_1/ZJ7 index e905630e20..9112ee3adb 100644 --- a/tests/de/step_1/ZJ7 +++ b/tests/de/step_1/ZJ7 @@ -4,7 +4,7 @@ set filename bm1_pe_fuel.stp set ref_data { DATA : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 ) TPSTAT : Faulties = 0 ( 0 ) Warnings = 8 ( 8 ) Summary = 8 ( 8 ) -CHECKSHAPE : Wires = 0 ( 0 ) Faces = 0 ( 0 ) Shells = 0 ( 0 ) Solids = 0 ( 0 ) +CHECKSHAPE : Wires = 4 ( 4 ) Faces = 4 ( 4 ) Shells = 0 ( 0 ) Solids = 0 ( 0 ) NBSHAPES : Solid = 0 ( 0 ) Shell = 6 ( 6 ) Face = 10 ( 10 ) Summary = 89 ( 89 ) STATSHAPE : Solid = 0 ( 0 ) Shell = 6 ( 6 ) Face = 10 ( 10 ) FreeWire = 0 ( 0 ) FreeEdge = 0 ( 0 ) SharedEdge = 34 ( 34 ) TOLERANCE : MaxTol = 112.7632273 ( 112.7632273 ) AvgTol = 20.07582429 ( 20.07582429 )