]> OCCT Git - occt-copy.git/commitdiff
0025583: Wrong solid is considered as valid by checkshape
authornbv <nbv@opencascade.com>
Thu, 11 Dec 2014 12:28:08 +0000 (15:28 +0300)
committernbv <nbv@opencascade.com>
Mon, 29 Dec 2014 09:42:17 +0000 (12:42 +0300)
Limitation tolerance value for checking if wire is closed in 2D-space of its face.

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..4ccb36185ce72bcc414d0b4a0ef5923fe062ac4c 100644 (file)
@@ -394,69 +394,84 @@ 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());
+  const Standard_Real aFactor = 0.01;
+  Standard_Real dumax = (aFaceSurface.LastUParameter() - aFaceSurface.FirstUParameter());
+  Standard_Real dvmax = (aFaceSurface.LastVParameter() - aFaceSurface.FirstVParameter());
   Standard_Real dumin = Abs(thePnt.X() - thePntRef.X());
   Standard_Real dvmin = Abs(thePnt.Y() - thePntRef.Y());
   
-  if((dumin < dumax) && (dvmin < dvmax))
+  if((dumin < (aFactor*dumax)) && (dvmin < (aFactor*dvmax)))
     return Standard_True;
 
+  dumin = dumax;
+  dvmin = dvmax;
+
+  dumax = dvmax = aTol3d;
+
+
 #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;
-    }
+  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;
 
-  dumax = aFaceSurface.UResolution(aTol3d);
-  dvmax = aFaceSurface.VResolution(aTol3d);
+  dumax = aFaceSurface.UResolution(dumax);
+  dvmax = aFaceSurface.VResolution(dvmax);
 
-  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(dumax >= dumin)
+  {//Singular case
+    dumax = 0.0;
+  }
+
+  if(dvmax >= dvmin)
+  {//Singular case
+    dvmax = 0.0;
+  }
 
+  cout << "aTol3d = " << aTol3d <<"; URes = " << dumax << "; VRes = " << dvmax    << endl;
+  cout << "thePnt(" << thePnt.X() << "; " << thePnt.Y() << ")"                    << endl;
+  cout << "thePntRef(" << thePntRef.X() << "; " << thePntRef.Y() << ")"           << endl;
 #else
-  dumax = aFaceSurface.UResolution(aTol3d);
-  dvmax = aFaceSurface.VResolution(aTol3d);
+  dumax = aFaceSurface.UResolution(dumax);
+  dvmax = aFaceSurface.VResolution(dvmax);
+
+  if(dumax >= dumin)
+  {//Singular case
+    dumax = 0.0;
+  }
+
+  if(dvmax >= dvmin)
+  {//Singular case
+    dvmax = 0.0;
+  }
 #endif
 
-  Standard_Real aTol2d = 2*Max(        dumax, dvmax);
+  Standard_Real aTol2d = 2*Max(dumax, dvmax);
   
 #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);
@@ -466,18 +481,15 @@ Standard_Boolean IsDistanceIn2DTolerance (const BRepAdaptor_Surface& aFaceSurfac
     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 = " << 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;
 #endif
 
   return Standard_False;
@@ -606,7 +618,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 +657,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 +1678,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 )