]> OCCT Git - occt-copy.git/commitdiff
0025583: Wrong solid is considered as valid by checkshape CR25583_1
authornbv <nbv@opencascade.com>
Fri, 16 Jan 2015 07:43:12 +0000 (10:43 +0300)
committerapv <apv@opencascade.com>
Fri, 23 Jan 2015 16:28:58 +0000 (19:28 +0300)
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.

src/BRepCheck/BRepCheck_Wire.cxx
tests/de/step_1/J6
tests/de/step_1/ZJ7

index c0f192b85c4db97e3f3746ad2e7f2308f45477c2..1e3adce56f194de467ffcf1ca9235c160de30391 100644 (file)
@@ -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 ?)"<<endl;
     cout.flush();
-    }
+  }
 #endif
 
-  //Standard_Real Dist = thePntRef.Distance(thePnt);
-  Standard_Real Dist = Max(dumin, dvmin);
+  //Standard_Real aDist = thePntRef.Distance(thePnt);
+  Standard_Real aDist = Max(aDist2dU, aDist2dV);
   
-  if (Dist < aTol2d)
+  if (aDist < aTol2d)
     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 << "* Dist = " << Dist        << " > 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);
index 7a3cd8e2a1943d5bc575639eb171b44bf514cdee..519bc02c22d5ed13f3fcacc093b13e9025b126a9 100755 (executable)
@@ -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 )
index e905630e20be5a52a7fa8946b72564e74bb54e5d..9112ee3adb5e9be58efe6a6d8318873006d87251 100644 (file)
@@ -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 )