]> OCCT Git - occt-copy.git/commitdiff
0023731: The shape obtained by stepread is valid in terms of checkshape but it is...
authornbv <nbv@opencascade.com>
Tue, 3 Dec 2013 12:05:46 +0000 (16:05 +0400)
committerasuraven <asuraven@opencascade.com>
Wed, 7 Apr 2021 16:05:19 +0000 (19:05 +0300)
1. New status "BrepCheck_CollapsedEdge" is added.
2. Draw command "tolsphere": draws a sphere with center in given vertex, radius is tolerance of given vertex.
3. test case added
4. Small correction of output of "checkshape" command result.

src/BRepCheck/BRepCheck.cxx
src/BRepCheck/BRepCheck_Analyzer.cxx
src/BRepCheck/BRepCheck_Edge.cxx
src/BRepTest/BRepTest_CheckCommands.cxx
src/BRepTest/BRepTest_PrimitiveCommands.cxx
tests/bugs/modalg_5/bug23731 [new file with mode: 0644]

index e057a54588dd739ea96587755982f11eff27f528..dc72f6a94f63a7764f695b2055b071db04c82f6b 100644 (file)
@@ -42,7 +42,7 @@ void BRepCheck::Add(BRepCheck_ListOfStatus& lst, const BRepCheck_Status stat)
     }
     else {
       if (it.Value() == stat) {
-        return;
+       return;
       }
       it.Next();
     }
@@ -55,15 +55,15 @@ void BRepCheck::Add(BRepCheck_ListOfStatus& lst, const BRepCheck_Status stat)
 //purpose  : 
 //=======================================================================
 Standard_Boolean BRepCheck::SelfIntersection(const TopoDS_Wire& W,
-          const TopoDS_Face& myFace,
-          TopoDS_Edge& RetE1,
-          TopoDS_Edge& RetE2)
+                                            const TopoDS_Face& myFace,
+                                            TopoDS_Edge& RetE1,
+                                            TopoDS_Edge& RetE2)
 {
   Handle(BRepCheck_Wire) chkw = new BRepCheck_Wire(W);
   BRepCheck_Status stat = chkw->SelfIntersect(myFace,RetE1,RetE2);
   return (stat == BRepCheck_SelfIntersectingWire);
 }
-
+                                 
 //=======================================================================
 //function : PrecCurve
 //purpose  : 
@@ -129,7 +129,7 @@ Standard_Real BRepCheck::PrecSurface(const Handle(Adaptor3d_Surface)& aAHSurf)
 //purpose  : 
 //=======================================================================
 void BRepCheck::Print(const BRepCheck_Status stat,
-                      Standard_OStream& OS)
+                     Standard_OStream& OS)
 {
 
   switch (stat) {
@@ -244,6 +244,10 @@ void BRepCheck::Print(const BRepCheck_Status stat,
   case BRepCheck_EnclosedRegion:
     OS << "BRepCheck_EnclosedRegion\n";
     break;
+  case BRepCheck_CollapsedEdge:
+    OS << "BRepCheck_CollapsedEdge\n";
+    break;
+
   default:
     break;
   }
index a4aee46d21a91feb262a27492e7a6156f32076bc..68e9b82183ec16c164fadbe62aa4aece2838a68f 100644 (file)
@@ -40,7 +40,7 @@
 //purpose  : 
 //=======================================================================
 void BRepCheck_Analyzer::Init(const TopoDS_Shape& S,
-         const Standard_Boolean B)
+                             const Standard_Boolean B)
 {
   if (S.IsNull()) {
     throw Standard_NullObject();
@@ -55,7 +55,7 @@ void BRepCheck_Analyzer::Init(const TopoDS_Shape& S,
 //purpose  : 
 //=======================================================================
 void BRepCheck_Analyzer::Put(const TopoDS_Shape& S,
-                             const Standard_Boolean B)
+                            const Standard_Boolean B)
 {
   if (!myMap.IsBound(S)) {
     Handle(BRepCheck_Result) HR;
@@ -114,7 +114,7 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S)
     // modified by NIZHNY-MKK  Wed May 19 16:56:16 2004.BEGIN
     // There is no need to check anything.
     //       if (myShape.IsSame(S)) {
-    //  myMap(S)->Blind();
+    //         myMap(S)->Blind();
     //       }
     // modified by NIZHNY-MKK  Wed May 19 16:56:23 2004.END
   
@@ -123,6 +123,48 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S)
     {
       Handle(BRepCheck_Result)& aRes = myMap(S);
 
+      try
+      {
+        BRepCheck_Status ste = Handle(BRepCheck_Edge)::
+          DownCast(aRes)->CheckTolerance(TopoDS::Edge(S));
+
+        if(ste != BRepCheck_NoError)
+        {
+          Handle(BRepCheck_Edge)::DownCast(aRes)->SetStatus(ste);
+          break;
+        }
+      }
+      catch(Standard_Failure)
+      {
+#ifdef DEB
+        cout<<"BRepCheck_Analyzer : ";
+        Standard_Failure::Caught()->Print(cout);  
+        cout<<endl;
+#endif
+        if ( ! myMap(S).IsNull() )
+        {
+          myMap(S)->SetFailStatus(S);
+        }
+
+        if ( ! aRes.IsNull() )
+        {
+          aRes->SetFailStatus(exp.Current());
+          aRes->SetFailStatus(S);
+        }
+      }
+
+      TopTools_MapOfShape MapS;
+
+      for (exp.Init(S,TopAbs_VERTEX);exp.More(); exp.Next())
+      {
+        const TopoDS_Shape& aVertex = exp.Current();
+        try
+        {
+          OCC_CATCH_SIGNALS
+          if (MapS.Add(aVertex))
+            myMap(aVertex)->InContext(S);
+        }
+      }
       try
       {
         BRepCheck_Status ste = Handle(BRepCheck_Edge)::
@@ -143,13 +185,16 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S)
         if ( ! myMap(S).IsNull() )
         {
           myMap(S)->SetFailStatus(S);
-        }
 
-        if ( ! aRes.IsNull() )
-        {
-          aRes->SetFailStatus(S);
-        }
-      }
+          Handle(BRepCheck_Result) aRes = myMap(aVertex);
+
+          if ( ! aRes.IsNull() ) 
+          {
+            aRes->SetFailStatus(aVertex);
+            aRes->SetFailStatus(S);
+          }
+
+    }
 
       TopTools_MapOfShape MapS;
       
@@ -256,6 +301,12 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S)
                   performwire = Standard_False;
                   break;
                 }
+
+                //if(ste == BRepCheck_CollapsedEdge)
+                //{
+                //  isInvalidTolerance = Standard_True;
+                //  break;
+                //}
               }
             }
           }
@@ -392,15 +443,15 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S)
 
   case TopAbs_SOLID:
     {
-      exp.Init(S,TopAbs_SHELL);
+    exp.Init(S,TopAbs_SHELL);
       for (; exp.More(); exp.Next())
         {
-          const TopoDS_Shape& aShell=exp.Current();
+      const TopoDS_Shape& aShell=exp.Current();
           try 
             {
-              OCC_CATCH_SIGNALS
-                myMap(aShell)->InContext(S);
-            }
+       OCC_CATCH_SIGNALS
+       myMap(aShell)->InContext(S);
+      }
           catch(Standard_Failure const& anException) {
 #ifdef OCCT_DEBUG
               std::cout<<"BRepCheck_Analyzer : ";
@@ -410,19 +461,19 @@ void BRepCheck_Analyzer::Perform(const TopoDS_Shape& S)
               (void)anException;
               if ( ! myMap(S).IsNull() )
                 {
-                  myMap(S)->SetFailStatus(S);
-                }
+         myMap(S)->SetFailStatus(S);
+       }
               
-              //
-              Handle(BRepCheck_Result) aRes = myMap(aShell);
+       //
+       Handle(BRepCheck_Result) aRes = myMap(aShell);
               if (!aRes.IsNull() )
                 {
-                  aRes->SetFailStatus(exp.Current());
-                  aRes->SetFailStatus(S);
-                }
+         aRes->SetFailStatus(exp.Current());
+         aRes->SetFailStatus(S);
+       }
             }//catch(Standard_Failure)
         }//for (; exp.More(); exp.Next())
-    }
+      }
   break;//case TopAbs_SOLID
   default:
     break;
@@ -496,10 +547,10 @@ Standard_Boolean BRepCheck_Analyzer::ValidSub
 //  for (TopExp_Explorer exp(S,SubType);exp.More(); exp.Next()) {
     const Handle(BRepCheck_Result)& RV = myMap(exp.Current());
     for (RV->InitContextIterator();
-         RV->MoreShapeInContext(); 
-         RV->NextShapeInContext()) {
+        RV->MoreShapeInContext(); 
+        RV->NextShapeInContext()) {
       if (RV->ContextualShape().IsSame(S)) {
-        break;
+       break;
       }
     }
 
@@ -507,7 +558,7 @@ Standard_Boolean BRepCheck_Analyzer::ValidSub
 
     for (itl.Initialize(RV->StatusOnShape()); itl.More(); itl.Next()) {
       if (itl.Value() != BRepCheck_NoError) {
-        return Standard_False;
+       return Standard_False;
       }
     }
   }
index 72c322ab880953e5b14657539e56be8eac7f8f61..adb4194522f25f77c99c1e76de04447976e665d3 100644 (file)
 #include <BRep_PolygonOnTriangulation.hxx>
 #include <BRep_TEdge.hxx>
 #include <BRep_TFace.hxx>
+
+#include <BRepAdaptor_Curve.hxx>
+
+#include <BRep_CurveRepresentation.hxx>
+#include <BRep_ListOfCurveRepresentation.hxx>
+#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx>
+#include <BRep_GCurve.hxx>
+#include <BRep_CurveOnSurface.hxx>
+
 #include <BRep_Tool.hxx>
 #include <BRepAdaptor_Curve.hxx>
 #include <BRepCheck.hxx>
 #include <Geom_Curve.hxx>
 #include <Geom_Plane.hxx>
 #include <Geom_RectangularTrimmedSurface.hxx>
+
+#include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
+
 #include <Geom_Surface.hxx>
 #include <Geom_TrimmedCurve.hxx>
 #include <Geom2d_TrimmedCurve.hxx>
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Shape.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <Precision.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT(BRepCheck_Edge,BRepCheck_Result)
+//Golden ratio
+static const Standard_Real  GoldRatio = (sqrt(5.0)-1)/2.0;
+
+static const Standard_Real  DivPoints[] = {
+                                            GoldRatio,
+                                            1.0-GoldRatio,
+                                            4.0*GoldRatio-2.0,
+                                            3.0-4.0*GoldRatio,
+                                            0.5
+                                          };
+
+static const Standard_Integer maxNIter = sizeof(DivPoints)/sizeof(DivPoints[0]);
+
 
 //modified by NIZNHY-PKV Thu May 05 09:01:57 2011f
 static 
   Standard_Boolean Validate(const Adaptor3d_Curve&,
-  const Adaptor3d_CurveOnSurface&,
-  const Standard_Real,
-  const Standard_Boolean);
+                           const Adaptor3d_CurveOnSurface&,
+                           const Standard_Real,
+                           const Standard_Boolean);
+
 static
   void PrintProblematicPoint(const gp_Pnt&,
-  const Standard_Real,
-  const Standard_Real);
+                            const Standard_Real,
+                            const Standard_Real);
 
 static
   Standard_Real Prec(const Adaptor3d_Curve& aAC3D,
-  const Adaptor3d_CurveOnSurface& aACS);
+                    const Adaptor3d_CurveOnSurface& aACS);
 
 //static Standard_Boolean Validate(const Adaptor3d_Curve&,
 //                              const Adaptor3d_Curve&,
@@ -118,27 +147,27 @@ void BRepCheck_Edge::Minimum()
     Standard_Boolean unique = Standard_True;
     // Search for a 3D reference. If no existent one, creates it with the 
     // first encountered CurveOnSurf; if multiple, chooses the first one...
-
+    
     Standard_Boolean Degenerated = TE->Degenerated();
     Standard_Boolean SameParameter = TE->SameParameter();
     Standard_Boolean SameRange = TE->SameRange();
     if (!SameRange && SameParameter) {
       BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
     }
-    //    Handle(Geom_Curve) C3d;
+//    Handle(Geom_Curve) C3d;
 
     while (itcr.More()) {
       const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
       if (cr->IsCurve3D()) {
-        if (!exist) {
-          exist = Standard_True;
-        }
-        else {
-          unique = Standard_False;
-        }
-        if (myCref.IsNull() && !cr->Curve3D().IsNull()) {
-          myCref = cr;
-        }
+       if (!exist) {
+         exist = Standard_True;
+       }
+       else {
+         unique = Standard_False;
+       }
+       if (myCref.IsNull() && !cr->Curve3D().IsNull()) {
+         myCref = cr;
+       }
       }
       itcr.Next();
     }
@@ -154,12 +183,12 @@ void BRepCheck_Edge::Minimum()
     if (myCref.IsNull() && !Degenerated) {
       itcr.Initialize(TE->Curves());
       while (itcr.More()) {
-        const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
-        if (cr->IsCurveOnSurface()) {
-          myCref = cr;
-          break;
-        }
-        itcr.Next();
+       const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
+       if (cr->IsCurveOnSurface()) {
+         myCref = cr;
+         break;
+       }
+       itcr.Next();
       }
     }
     else if (!myCref.IsNull() && Degenerated){
@@ -172,24 +201,24 @@ void BRepCheck_Edge::Minimum()
       Standard_Real First,Last;
       GCref->Range(First,Last);
       if (Last<=First) {
-        myCref.Nullify();
-        BRepCheck::Add(lst,BRepCheck_InvalidRange);
+       myCref.Nullify();
+       BRepCheck::Add(lst,BRepCheck_InvalidRange);
       }
       else {
-        if (myCref->IsCurve3D()) {
+       if (myCref->IsCurve3D()) {
           // eap 6 Jun 2002 occ332
           // better transform C3d instead of transforming Surf upto C3d initial location,
           // on transformed BSpline surface 'same parameter' may seem wrong
           TopLoc_Location L = myShape.Location() * myCref->Location();
-          Handle(Geom_Curve) C3d = Handle(Geom_Curve)::DownCast
-            (myCref->Curve3D()->Transformed
-            (/*myCref->Location()*/L.Transformation()));
+         Handle(Geom_Curve) C3d = Handle(Geom_Curve)::DownCast
+           (myCref->Curve3D()->Transformed
+            (/*myCref->Location()*/L.Transformation()));
           Standard_Boolean IsPeriodic = C3d->IsPeriodic();
           Standard_Real aPeriod = RealLast();
           if(IsPeriodic)
           {
             aPeriod = C3d->Period();
-          }
+       }
           Standard_Real f = C3d->FirstParameter(), l = C3d->LastParameter();
           if (C3d->DynamicType() == STANDARD_TYPE(Geom_TrimmedCurve))
           {
@@ -219,11 +248,11 @@ void BRepCheck_Edge::Minimum()
             myHCurve = new GeomAdaptor_Curve(GAC3d);
           }
         }
-        else { // curve on surface
-          Handle(Geom_Surface) Sref = myCref->Surface();
-          Sref = Handle(Geom_Surface)::DownCast
-            (Sref->Transformed(myCref->Location().Transformation()));
-          const Handle(Geom2d_Curve)& PCref = myCref->PCurve();
+       else { // curve on surface
+         Handle(Geom_Surface) Sref = myCref->Surface();
+         Sref = Handle(Geom_Surface)::DownCast
+           (Sref->Transformed(myCref->Location().Transformation()));
+         const Handle(Geom2d_Curve)& PCref = myCref->PCurve();
           Standard_Boolean IsPeriodic = PCref->IsPeriodic();
           Standard_Real aPeriod = RealLast();
           if(IsPeriodic)
@@ -257,12 +286,12 @@ void BRepCheck_Edge::Minimum()
             Handle(GeomAdaptor_Surface) GAHSref = new GeomAdaptor_Surface(Sref);
             Handle(Geom2dAdaptor_Curve) GHPCref = 
               new Geom2dAdaptor_Curve(PCref,First,Last);
-            Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref);
+         Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref);
             myHCurve = new Adaptor3d_CurveOnSurface(ACSref);
-          }
-        }
+       }
       }
     }
+    }
     if (lst.IsEmpty()) {
       lst.Append(BRepCheck_NoError);
     }
@@ -289,7 +318,7 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
   Standard_Real Tol = BRep_Tool::Tolerance(TopoDS::Edge(myShape));
 
   TopAbs_ShapeEnum styp = S.ShapeType();
-  //  for (TopExp_Explorer exp(S,TopAbs_EDGE); exp.More(); exp.Next()) {
+//  for (TopExp_Explorer exp(S,TopAbs_EDGE); exp.More(); exp.Next()) {
   TopExp_Explorer exp(S,TopAbs_EDGE) ;
   for ( ; exp.More(); exp.Next()) {
     if (exp.Current().IsSame(myShape)) {
@@ -300,29 +329,35 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
     BRepCheck::Add(lst,BRepCheck_SubshapeNotInShape);
     return;
   }
-
+  
   switch (styp) 
   {
   case TopAbs_WIRE:
     {
+      //if (CheckTolerance(TopoDS::Edge(myShape)) == BRepCheck_CollapsedEdge)
+      //{
+      //  BRepCheck::Add(lst,BRepCheck_CollapsedEdge);
+      //  return;
+      //}
     }
     break;
 
   case TopAbs_FACE:
     if (!myCref.IsNull()) {
-
+      
       Standard_Boolean SameParameter = TE->SameParameter();
       Standard_Boolean SameRange = TE->SameRange();
-      //  Modified by skv - Tue Apr 27 11:48:13 2004 Begin
+
+//  Modified by skv - Tue Apr 27 11:48:13 2004 Begin
       if (!SameParameter || !SameRange) {
-        if (!SameParameter)
-          BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
-        if (!SameRange)
-          BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag);
+       if (!SameParameter)
+         BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
+       if (!SameRange)
+         BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag);
 
-        return;
+       return;
       }
-      //  Modified by skv - Tue Apr 27 11:48:14 2004 End
+//  Modified by skv - Tue Apr 27 11:48:14 2004 End
       Standard_Real First = myHCurve->FirstParameter();
       Standard_Real Last  = myHCurve->LastParameter();
 
@@ -338,12 +373,12 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
       BRep_ListIteratorOfListOfCurveRepresentation itcr(TE->Curves());
       Standard_Real eps = Precision::PConfusion();
       while (itcr.More()) {
-        const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
-        if (cr != myCref && cr->IsCurveOnSurface(Su,L)) {
-          pcurvefound = Standard_True;
+       const Handle(BRep_CurveRepresentation)& cr = itcr.Value();
+       if (cr != myCref && cr->IsCurveOnSurface(Su,L)) {
+         pcurvefound = Standard_True;
           Handle(BRep_GCurve) GC (Handle(BRep_GCurve)::DownCast (cr));
-          Standard_Real f,l;
-          GC->Range(f,l);
+         Standard_Real f,l;
+         GC->Range(f,l);
           Standard_Real ff = f, ll = l;
           if(myCref->IsCurve3D())
           {
@@ -351,13 +386,13 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
             ll = myCref->Curve3D()->TransformedParameter(l, Etrsf);
           }
           // gka OCC
-          //  Modified by skv - Tue Apr 27 11:50:35 2004 Begin
+//  Modified by skv - Tue Apr 27 11:50:35 2004 Begin
           if (Abs(ff-First) > eps ||
               Abs(ll-Last)  > eps) {
-              BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag);
-              BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
-          }
-          //  Modified by skv - Tue Apr 27 11:50:37 2004 End
+           BRepCheck::Add(lst,BRepCheck_InvalidSameRangeFlag);
+           BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
+         }
+//  Modified by skv - Tue Apr 27 11:50:37 2004 End
           //
           const Handle(Geom2d_Curve)& pc = cr->PCurve();
           Standard_Boolean IsPeriodic = pc->IsPeriodic();
@@ -389,95 +424,95 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
             return;
           }
 
-          if (myGctrl) {
-            Handle(Geom_Surface) Sb = cr->Surface();
-            Sb = Handle(Geom_Surface)::DownCast
-              //             (Su->Transformed(L.Transformation()));
-              (Su->Transformed(/*L*/(Floc * TFloc).Transformation()));
-            Handle(Geom2d_Curve) PC = cr->PCurve();
+         if (myGctrl) {
+           Handle(Geom_Surface) Sb = cr->Surface();
+           Sb = Handle(Geom_Surface)::DownCast
+//           (Su->Transformed(L.Transformation()));
+             (Su->Transformed(/*L*/(Floc * TFloc).Transformation()));
+           Handle(Geom2d_Curve) PC = cr->PCurve();
             Handle(GeomAdaptor_Surface) GAHS = new GeomAdaptor_Surface(Sb);
             Handle(Geom2dAdaptor_Curve) GHPC = new Geom2dAdaptor_Curve(PC,f,l);
-            Adaptor3d_CurveOnSurface ACS(GHPC,GAHS);
+           Adaptor3d_CurveOnSurface ACS(GHPC,GAHS);
             Standard_Boolean ok = Validate (*myHCurve, ACS, Tol, SameParameter);
-            if (!ok) {
-              if (cr->IsCurveOnClosedSurface()) {
-                BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
-              }
-              else {
-                BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
-              }
-              //  Modified by skv - Tue Apr 27 11:53:00 2004 Begin
-              BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
-              //             if (SameParameter) {
-              //               BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
-              //             }
-              //  Modified by skv - Tue Apr 27 11:53:01 2004 End
-            }
-            if (cr->IsCurveOnClosedSurface()) {
+           if (!ok) {
+             if (cr->IsCurveOnClosedSurface()) {
+               BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
+             }
+             else {
+               BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
+             }
+//  Modified by skv - Tue Apr 27 11:53:00 2004 Begin
+             BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
+//           if (SameParameter) {
+//             BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
+//           }
+//  Modified by skv - Tue Apr 27 11:53:01 2004 End
+           }
+           if (cr->IsCurveOnClosedSurface()) {
               GHPC->Load(cr->PCurve2(),f,l); // same bounds
               ACS.Load(GHPC, GAHS); // sans doute inutile
               ok = Validate(*myHCurve,ACS,Tol,SameParameter);
-              if (!ok) {
-                BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
-                //  Modified by skv - Tue Apr 27 11:53:20 2004 Begin
-                if (SameParameter) {
-                  BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
-                }
-                //  Modified by skv - Tue Apr 27 11:53:23 2004 End
-              }
-            }
-          }
-        }
-        itcr.Next();
+             if (!ok) {
+               BRepCheck::Add(lst,BRepCheck_InvalidCurveOnClosedSurface);
+//  Modified by skv - Tue Apr 27 11:53:20 2004 Begin
+               if (SameParameter) {
+                 BRepCheck::Add(lst,BRepCheck_InvalidSameParameterFlag);
+               }
+//  Modified by skv - Tue Apr 27 11:53:23 2004 End
+             }
+           }
+         }
+       }
+       itcr.Next();
       }
 
       if (!pcurvefound) {
-        Handle(Geom_Plane) P;
-        Handle(Standard_Type) dtyp = Su->DynamicType();
-        if (dtyp == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
-          P = Handle(Geom_Plane)::DownCast
-            (Handle(Geom_RectangularTrimmedSurface)::
-            DownCast(Su)->BasisSurface());
-        }
-        else {
-          P = Handle(Geom_Plane)::DownCast(Su);
-        }
-        if (P.IsNull()) { // not a plane
-          BRepCheck::Add(lst,BRepCheck_NoCurveOnSurface);
-        }
-        else { // on fait la projection a la volee, comme BRep_Tool
-          // plan en position
-          if (myGctrl) {
-            P = Handle(Geom_Plane)::
-              DownCast(P->Transformed(/*L*/(Floc * TFloc).Transformation()));// eap occ332
-            //on projette Cref sur ce plan
+       Handle(Geom_Plane) P;
+       Handle(Standard_Type) dtyp = Su->DynamicType();
+       if (dtyp == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
+         P = Handle(Geom_Plane)::DownCast
+           (Handle(Geom_RectangularTrimmedSurface)::
+            DownCast(Su)->BasisSurface());
+       }
+       else {
+         P = Handle(Geom_Plane)::DownCast(Su);
+       }
+       if (P.IsNull()) { // not a plane
+         BRepCheck::Add(lst,BRepCheck_NoCurveOnSurface);
+       }
+       else { // on fait la projection a la volee, comme BRep_Tool
+         // plan en position
+         if (myGctrl) {
+           P = Handle(Geom_Plane)::
+             DownCast(P->Transformed(/*L*/(Floc * TFloc).Transformation()));// eap occ332
+           //on projette Cref sur ce plan
             Handle(GeomAdaptor_Surface) GAHS = new GeomAdaptor_Surface(P);
 
             // Dub - Normalement myHCurve est une GeomAdaptor_Curve
             Handle(GeomAdaptor_Curve) Gac = Handle(GeomAdaptor_Curve)::DownCast(myHCurve);
             Handle(Geom_Curve) C3d = Gac->Curve();
-            Handle(Geom_Curve) ProjOnPlane = 
-              GeomProjLib::ProjectOnPlane(new Geom_TrimmedCurve(C3d,First,Last),
-              P, P->Position().Direction(),
-              Standard_True);
+           Handle(Geom_Curve) ProjOnPlane = 
+             GeomProjLib::ProjectOnPlane(new Geom_TrimmedCurve(C3d,First,Last),
+                                         P, P->Position().Direction(),
+                                         Standard_True);
             Handle(GeomAdaptor_Curve) aHCurve = 
               new GeomAdaptor_Curve(ProjOnPlane);
 
-            ProjLib_ProjectedCurve proj(GAHS,aHCurve);
-            Handle(Geom2d_Curve) PC = Geom2dAdaptor::MakeCurve(proj);
+           ProjLib_ProjectedCurve proj(GAHS,aHCurve);
+           Handle(Geom2d_Curve) PC = Geom2dAdaptor::MakeCurve(proj);
             Handle(Geom2dAdaptor_Curve) GHPC = 
               new Geom2dAdaptor_Curve(PC,
-              myHCurve->FirstParameter(),
-              myHCurve->LastParameter());
-
-            Adaptor3d_CurveOnSurface ACS(GHPC,GAHS);
+                                      myHCurve->FirstParameter(),
+                                      myHCurve->LastParameter());
 
+           Adaptor3d_CurveOnSurface ACS(GHPC,GAHS);
+           
             Standard_Boolean ok = Validate (*myHCurve, ACS, Tol,Standard_True); // voir dub...
-            if (!ok) {
-              BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
-            }
-          }
-        }
+           if (!ok) {
+             BRepCheck::Add(lst,BRepCheck_InvalidCurveOnSurface);
+           }
+         }
+       }
       }
     }
     break;
@@ -487,22 +522,22 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
       Standard_Integer nbconnection = 0;
       //TopExp_Explorer exp;
       for (exp.Init(S,TopAbs_FACE); exp.More(); exp.Next()) {
-        const TopoDS_Face& fac = TopoDS::Face(exp.Current());
-        TopExp_Explorer exp2;
-        for (exp2.Init(fac,TopAbs_EDGE); exp2.More(); exp2.Next()) {
-          if (exp2.Current().IsSame(myShape)) {
-            nbconnection++;
-          }
-        }
+       const TopoDS_Face& fac = TopoDS::Face(exp.Current());
+       TopExp_Explorer exp2;
+       for (exp2.Init(fac,TopAbs_EDGE); exp2.More(); exp2.Next()) {
+         if (exp2.Current().IsSame(myShape)) {
+           nbconnection++;
+         }
+       }
       }
       if (nbconnection < 2 && !TE->Degenerated()) {
-        BRepCheck::Add(myMap(S),BRepCheck_FreeEdge);
+       BRepCheck::Add(myMap(S),BRepCheck_FreeEdge);
       }
       else if (nbconnection > 2) {
-        BRepCheck::Add(myMap(S),BRepCheck_InvalidMultiConnexity);
+       BRepCheck::Add(myMap(S),BRepCheck_InvalidMultiConnexity);
       }
       else {
-        BRepCheck::Add(myMap(S),BRepCheck_NoError);
+       BRepCheck::Add(myMap(S),BRepCheck_NoError);
       }
     }
     break;
@@ -522,12 +557,12 @@ void BRepCheck_Edge::InContext(const TopoDS_Shape& S)
 
 void BRepCheck_Edge::Blind()
 {
-  //  Modified by skv - Tue Apr 27 11:36:01 2004 Begin
-  // The body of this function is removed because of its useless.
+//  Modified by skv - Tue Apr 27 11:36:01 2004 Begin
+// The body of this function is removed because of its useless.
   if (!myBlind) {
     myBlind = Standard_True;
   }
-  //  Modified by skv - Tue Apr 27 11:36:02 2004 End
+//  Modified by skv - Tue Apr 27 11:36:02 2004 End
 }
 
 
@@ -556,12 +591,14 @@ Standard_Boolean BRepCheck_Edge::GeometricControls() const
 //function :   SetStatus
 //purpose  : 
 //=======================================================================
+
 void BRepCheck_Edge::SetStatus(const BRepCheck_Status theStatus)
 {
-  BRepCheck::Add(myMap(myShape),theStatus);
+    BRepCheck::Add(myMap(myShape),theStatus);
 }
 
 
+
 //=======================================================================
 //function : Tolerance
 //purpose  : 
@@ -591,13 +628,13 @@ Standard_Real BRepCheck_Edge::Tolerance()
       //// modified by jgv, 20.03.03 ////
       TopLoc_Location Loc = myShape.Location() * cr->Location();
       Handle(Geom_Curve) C3d = Handle(Geom_Curve)::DownCast
-        (cr->Curve3D()->Transformed( Loc.Transformation() ));
+       (cr->Curve3D()->Transformed( Loc.Transformation() ));
       ///////////////////////////////////
       GeomAdaptor_Curve GAC3d(C3d,First,Last);
       it=iRep;
       if (iRep>1) {
-        theRep(iRep)=theRep(1);
-        it=1;
+       theRep(iRep)=theRep(1);
+       it=1;
       }
       theRep(it) = new GeomAdaptor_Curve(GAC3d);
       iRep++;
@@ -605,11 +642,11 @@ Standard_Real BRepCheck_Edge::Tolerance()
     else if (cr->IsCurveOnSurface()) {
       {
         Handle(Geom_Surface) Sref = cr->Surface();
-        //// modified by jgv, 20.03.03 ////
-        TopLoc_Location Loc = myShape.Location() * cr->Location();
+       //// modified by jgv, 20.03.03 ////
+       TopLoc_Location Loc = myShape.Location() * cr->Location();
         Sref = Handle(Geom_Surface)::DownCast
           (Sref->Transformed( Loc.Transformation() ));
-        ///////////////////////////////////
+       ///////////////////////////////////
         const Handle(Geom2d_Curve)& PCref = cr->PCurve();
         Handle(GeomAdaptor_Surface) GAHSref = new GeomAdaptor_Surface(Sref);
         Handle(Geom2dAdaptor_Curve) GHPCref = 
@@ -619,17 +656,17 @@ Standard_Real BRepCheck_Edge::Tolerance()
         iRep++;
       }
       if (cr->IsCurveOnClosedSurface()) {
-        Handle(Geom_Surface) Sref = cr->Surface();
-        Sref = Handle(Geom_Surface)::DownCast
-          (Sref->Transformed(cr->Location().Transformation()));
-        const Handle(Geom2d_Curve)& PCref = cr->PCurve2();
+       Handle(Geom_Surface) Sref = cr->Surface();
+       Sref = Handle(Geom_Surface)::DownCast
+         (Sref->Transformed(cr->Location().Transformation()));
+       const Handle(Geom2d_Curve)& PCref = cr->PCurve2();
         Handle(GeomAdaptor_Surface) GAHSref = new GeomAdaptor_Surface(Sref);
         Handle(Geom2dAdaptor_Curve) GHPCref = 
           new Geom2dAdaptor_Curve(PCref,First,Last);
-        Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref);
+       Adaptor3d_CurveOnSurface ACSref(GHPCref,GAHSref);
         theRep(iRep) = new Adaptor3d_CurveOnSurface(ACSref);
-        iRep++;
-        nbRep++;
+       iRep++;
+       nbRep++;
       }
     }
     else {
@@ -778,14 +815,94 @@ BRepCheck_Status BRepCheck_Edge::
   return BRepCheck_NoError;
 }
 
+//=======================================================================
+//function : CheckTolerance
+//purpose  : Cheks, if theEdge lies entirely into sphere, center of which
+//            is middle point of line segment, which joins first and last 
+//            vertex of an edge, and radius is aTol (see function's body).
+//=======================================================================
+BRepCheck_Status BRepCheck_Edge::CheckTolerance(const TopoDS_Edge& theEdge)
+{
+  BRepCheck_Status aStatus = BRepCheck_NoError;
+  Standard_Real aTol1 = 1.0e-7, aTol2 = 1.0e-7;
+  
+  if(BRep_Tool::Degenerated(theEdge))
+  {
+    aStatus = BRepCheck_NoError;
+    return aStatus;
+  }
+
+  TopoDS_Vertex aV1 = TopExp::FirstVertex(theEdge),
+                aV2 = TopExp::LastVertex(theEdge);
+
+  if(aV2.IsNull() || aV1.IsNull())
+  {
+    aStatus = BRepCheck_NoError;
+    return aStatus;
+  }
+
+  gp_Pnt aPnt1, aPnt2;
+
+  aPnt1 = BRep_Tool::Pnt(aV1);
+  aPnt2 = BRep_Tool::Pnt(aV2);
+
+  aTol1 = BRep_Tool::Tolerance(aV1);
+  aTol2 = BRep_Tool::Tolerance(aV2);
+
+  if( Precision::IsInfinite(aTol1) ||
+      Precision::IsInfinite(aTol2))
+  {
+    aStatus = BRepCheck_CollapsedEdge;
+    return aStatus;
+  }
+
+  Standard_Real st = aTol1 + aTol2;
+
+  if(aPnt1.SquareDistance(aPnt2) >= st*st)
+  {
+    aStatus = BRepCheck_NoError;
+    return aStatus;
+  }
+
+  gp_Pnt aPn( (aPnt1.X() + aPnt2.X())/2.0,
+              (aPnt1.Y() + aPnt2.Y())/2.0,
+              (aPnt1.Z() + aPnt2.Z())/2.0);
+
+  
+  const Standard_Real aTol = Max(aTol1,aTol2) + aPnt1.Distance(aPnt2)/2.0;
+  const Standard_Real aTols = aTol*aTol;
+
+  BRepAdaptor_Curve BACurve(theEdge);
+
+  const Standard_Real aFirst = BACurve.FirstParameter(), 
+                      aLast  =  BACurve.LastParameter();
+
+  const Standard_Real dParam = aLast - aFirst;
+
+  for(Standard_Integer i = 0; i < maxNIter; i++)
+  {
+    const Standard_Real ParOnC = aFirst + DivPoints[i]*dParam;
+
+    gp_Pnt pt = BACurve.Value(ParOnC);
+    if((aPn.SquareDistance(pt) >= aTols))
+    {
+      aStatus = BRepCheck_NoError;
+      return aStatus;
+    }
+  }
+
+  aStatus = BRepCheck_CollapsedEdge;
+  return aStatus;
+}
+
 //=======================================================================
 //function : Validate
 //purpose  : 
 //=======================================================================
 Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
-  const Adaptor3d_CurveOnSurface& Other,
-  const Standard_Real Tol,
-  const Standard_Boolean SameParameter)
+                         const Adaptor3d_CurveOnSurface& Other,
+                         const Standard_Real Tol,
+                         const Standard_Boolean SameParameter)
 {
   Standard_Boolean  Status, proj; 
   Standard_Real aPC, First, Last, Error;
@@ -812,17 +929,17 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
     Tol2=Tol2*Tol2;
     //Tol2=Tol*Tol;
     //modified by NIZNHY-PKV Thu May 05 09:06:47 2011t
-
+    
     for (i = 0; i < NCONTROL; ++i) {
       prm = ((NCONTROL-1-i)*First + i*Last)/(NCONTROL-1);
       pref = CRef.Value(prm);
       pother = Other.Value(prm);
       if (pref.SquareDistance(pother) > Tol2) {
-        problematic_point = pref ;
-        Status = Standard_False;
-        Error  = pref.Distance(pother);
-        PrintProblematicPoint(problematic_point, Error, Tol);
-        return Status;
+       problematic_point = pref ;
+       Status = Standard_False;
+       Error  = pref.Distance(pother);
+       PrintProblematicPoint(problematic_point, Error, Tol);
+       return Status;
         //goto FINISH ;
       }
     }
@@ -863,37 +980,37 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
       gp_Pnt pother = Other.Value(oprm);
       refd.Perform(pother,rprm);
       if (!refd.IsDone() || refd.SquareDistance() > Tol * Tol) {
-        problematic_point = pref ;
-        Status = Standard_False ;
-        if (refd.IsDone()) {
-          Error = sqrt (refd.SquareDistance());
-        }
-        else {
-          Error = RealLast();
-        }
-        PrintProblematicPoint(problematic_point, Error, Tol);
-        return Status;
+       problematic_point = pref ;
+       Status = Standard_False ;
+       if (refd.IsDone()) {
+         Error = sqrt (refd.SquareDistance());
+       }
+       else {
+         Error = RealLast();
+       }
+       PrintProblematicPoint(problematic_point, Error, Tol);
+       return Status;
         //goto FINISH ;
       }
       otherd.Perform(pref,oprm);
       if (!otherd.IsDone() || otherd.SquareDistance() > Tol * Tol) {
-        problematic_point = pref ;
-        Status = Standard_False ;
-        if (otherd.IsDone()) {
-          Error = sqrt (otherd.SquareDistance());
-        }
-        else {
-          Error = RealLast();
-        }
-        PrintProblematicPoint(problematic_point, Error, Tol);
-        return Status;
-        //goto FINISH ;
+       problematic_point = pref ;
+       Status = Standard_False ;
+       if (otherd.IsDone()) {
+         Error = sqrt (otherd.SquareDistance());
+       }
+       else {
+         Error = RealLast();
+       }
+       PrintProblematicPoint(problematic_point, Error, Tol);
+       return Status;
+       //goto FINISH ;
       }
     }
   }
 
   return Status ;
-
+  
 }
 
 //=======================================================================
@@ -901,14 +1018,14 @@ Standard_Boolean Validate(const Adaptor3d_Curve& CRef,
 //purpose  : 
 //=======================================================================
 Standard_Real Prec(const Adaptor3d_Curve& aAC3D,
-                   const Adaptor3d_CurveOnSurface& aACS)
+                  const Adaptor3d_CurveOnSurface& aACS)
 {
   Standard_Real aXEmax, aXC, aXS;
   const Handle(Adaptor3d_Surface)& aAHS = aACS.GetSurface();
   //
   aXC = BRepCheck::PrecCurve(aAC3D);
   aXS = BRepCheck::PrecSurface(aAHS);
-  aXEmax = (aXC>aXS) ? aXC: aXS;
+  aXEmax=(aXC>aXS) ? aXC: aXS;
   return aXEmax;
 }
 
@@ -918,8 +1035,8 @@ Standard_Real Prec(const Adaptor3d_Curve& aAC3D,
 //=======================================================================
 #ifdef OCCT_DEBUG
 void PrintProblematicPoint(const gp_Pnt& problematic_point,
-  const Standard_Real Error,
-  const Standard_Real Tol)
+                          const Standard_Real Error,
+                          const Standard_Real Tol)
 {
   std::cout << " **** probleme de SameParameter au point :" << std::endl;
   std::cout << "         " << problematic_point.Coord(1) << " " 
@@ -928,8 +1045,8 @@ void PrintProblematicPoint(const gp_Pnt& problematic_point,
 }
 #else
 void PrintProblematicPoint(const gp_Pnt&,
-  const Standard_Real,
-  const Standard_Real)
+                          const Standard_Real,
+                          const Standard_Real)
 {
 }
 #endif
index deb880998b94624240d0b66a2d5f111145afe700..c1eecc34e2161466c58f51d9d32330e5864b5556 100644 (file)
@@ -516,6 +516,31 @@ void ContextualDump(Draw_Interpretor& theCommands,
 static void FillProblems(const BRepCheck_Status stat,
                          Handle(TColStd_HArray1OfInteger)& NbProblems)
 {
+  case BRepCheck_CollapsedEdge:
+    NbProblems->SetValue(13,NbProblems->Value(13)+1); break;
+    NbProblems->SetValue(14,NbProblems->Value(14)+1); break;
+    NbProblems->SetValue(15,NbProblems->Value(15)+1); break;
+    NbProblems->SetValue(16,NbProblems->Value(16)+1); break;
+    NbProblems->SetValue(17,NbProblems->Value(17)+1); break;
+    NbProblems->SetValue(18,NbProblems->Value(18)+1); break;
+    NbProblems->SetValue(19,NbProblems->Value(19)+1); break;
+    NbProblems->SetValue(20,NbProblems->Value(20)+1); break;
+    NbProblems->SetValue(21,NbProblems->Value(21)+1); break;
+    NbProblems->SetValue(22,NbProblems->Value(22)+1); break;
+    NbProblems->SetValue(23,NbProblems->Value(23)+1); break;
+    NbProblems->SetValue(24,NbProblems->Value(24)+1); break;
+    NbProblems->SetValue(25,NbProblems->Value(25)+1); break;
+    NbProblems->SetValue(26,NbProblems->Value(26)+1); break;
+    NbProblems->SetValue(27,NbProblems->Value(27)+1); break;
+    NbProblems->SetValue(28,NbProblems->Value(28)+1); break;
+    NbProblems->SetValue(29,NbProblems->Value(29)+1); break;
+    NbProblems->SetValue(30,NbProblems->Value(30)+1); break;
+    NbProblems->SetValue(31,NbProblems->Value(31)+1); break;
+    NbProblems->SetValue(32,NbProblems->Value(32)+1); break;
+  case BRepCheck_InvalidToleranceValue:
+    NbProblems->SetValue(33,NbProblems->Value(33)+1); break;
+  case BRepCheck_CheckFail:
+    NbProblems->SetValue(34,NbProblems->Value(34)+1); break;
 
   const Standard_Integer anID = static_cast<Standard_Integer> (stat);
 
@@ -524,7 +549,7 @@ static void FillProblems(const BRepCheck_Status stat,
 
   NbProblems->SetValue(anID, NbProblems->Value(anID)+1);
 
-}
+  }
 
 
 //=======================================================================
@@ -655,9 +680,78 @@ void StructuralDump(Draw_Interpretor& theCommands,
   GetProblemShapes(theAna, theShape, sl, NbProblems);
   theMap.Clear();
   
+  if(NbProblems->Value(13)>0)
+    theCommands<<"  Edge is collapsed in vertex............... "<<NbProblems->Value(13)<<"\n";
+    //cout<<"  Invalid Degenerated Flag ................. "<<NbProblems->Value(12)<<endl;
+  if(NbProblems->Value(14)>0)
+    theCommands<<"  Free Edge ................................ "<<NbProblems->Value(14)<<"\n";
+    //cout<<"  Free Edge ................................ "<<NbProblems->Value(14)<<endl;
+  if(NbProblems->Value(15)>0)
+    theCommands<<"  Invalid MultiConnexity ................... "<<NbProblems->Value(15)<<"\n";
+    //cout<<"  Invalid MultiConnexity ................... "<<NbProblems->Value(15)<<endl;
+  if(NbProblems->Value(16)>0)
+    theCommands<<"  Invalid Range ............................ "<<NbProblems->Value(16)<<"\n";
+    //cout<<"  Invalid Range ............................ "<<NbProblems->Value(16)<<endl;
+  if(NbProblems->Value(17)>0)
+    theCommands<<"  Empty Wire ............................... "<<NbProblems->Value(17)<<"\n";
+    //cout<<"  Empty Wire ............................... "<<NbProblems->Value(17)<<endl;
+  if(NbProblems->Value(18)>0)
+    theCommands<<"  Redundant Edge ........................... "<<NbProblems->Value(18)<<"\n";
+    //cout<<"  Redundant Edge ........................... "<<NbProblems->Value(18)<<endl;
+  if(NbProblems->Value(19)>0)
+    theCommands<<"  Self Intersecting Wire ................... "<<NbProblems->Value(19)<<"\n";
+    //cout<<"  Self Intersecting Wire ................... "<<NbProblems->Value(19)<<endl;
+  if(NbProblems->Value(20)>0)
+    theCommands<<"  No Surface ............................... "<<NbProblems->Value(20)<<"\n";
+    //cout<<"  No Surface ............................... "<<NbProblems->Value(20)<<endl;
+  if(NbProblems->Value(21)>0)
+    theCommands<<"  Invalid Wire ............................. "<<NbProblems->Value(21)<<"\n";
+    //cout<<"  Invalid Wire ............................. "<<NbProblems->Value(21)<<endl;
+  if(NbProblems->Value(22)>0)
+    theCommands<<"  Redundant Wire ........................... "<<NbProblems->Value(22)<<"\n";
+    //cout<<"  Redundant Wire ........................... "<<NbProblems->Value(22)<<endl;
+  if(NbProblems->Value(23)>0)
+    theCommands<<"  Intersecting Wires ....................... "<<NbProblems->Value(23)<<"\n";
+    //cout<<"  Intersecting Wires ....................... "<<NbProblems->Value(23)<<endl;
+  if(NbProblems->Value(24)>0)
+    theCommands<<"  Invalid Imbrication of Wires ............. "<<NbProblems->Value(24)<<"\n";
+    //cout<<"  Invalid Imbrication of Wires ............. "<<NbProblems->Value(24)<<endl;
+  if(NbProblems->Value(25)>0)
+    theCommands<<"  Empty Shell .............................. "<<NbProblems->Value(25)<<"\n";
+    //cout<<"  Empty Shell .............................. "<<NbProblems->Value(25)<<endl;
+  if(NbProblems->Value(26)>0)
+    theCommands<<"  Redundant Face ........................... "<<NbProblems->Value(26)<<"\n";
+    //cout<<"  Redundant Face ........................... "<<NbProblems->Value(26)<<endl;
+  if(NbProblems->Value(27)>0)
+    theCommands<<"  Unorientable Shape ....................... "<<NbProblems->Value(27)<<"\n";
+    //cout<<"  Unorientable Shape ....................... "<<NbProblems->Value(27)<<endl;
+  if(NbProblems->Value(28)>0)
+    theCommands<<"  Not Closed ............................... "<<NbProblems->Value(28)<<"\n";
+    //cout<<"  Not Closed ............................... "<<NbProblems->Value(28)<<endl;
+  if(NbProblems->Value(29)>0)
+    theCommands<<"  Not Connected ............................ "<<NbProblems->Value(29)<<"\n";
+    //cout<<"  Not Connected ............................ "<<NbProblems->Value(29)<<endl;
+  if(NbProblems->Value(30)>0)
+    theCommands<<"  Subshape not in Shape .................... "<<NbProblems->Value(30)<<"\n";
+    //cout<<"  Subshape not in Shape .................... "<<NbProblems->Value(30)<<endl;
+  if(NbProblems->Value(31)>0)
+    theCommands<<"  Bad Orientation .......................... "<<NbProblems->Value(31)<<"\n";
+    //cout<<"  Bad Orientation .......................... "<<NbProblems->Value(31)<<endl;
+  if(NbProblems->Value(32)>0)
+    theCommands<<"  Bad Orientation of Subshape .............. "<<NbProblems->Value(32)<<"\n";
+    //cout<<"  Bad Orientation of Subshape .............. "<<NbProblems->Value(32)<<endl;
+  if(NbProblems->Value(33)>0)
+    theCommands<<"  Invalid tolerance value................... "<<NbProblems->Value(33)<<"\n";
+    //cout<<"  checkshape failure......... .............. "<<NbProblems->Value(33)<<endl;
+  if(NbProblems->Value(34)>0)
+    theCommands<<"  checkshape failure......... .............. "<<NbProblems->Value(34)<<"\n";
+    //cout<<"  checkshape failure......... .............. "<<NbProblems->Value(34)<<endl;
   Standard_Integer aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidPointOnCurve);
   if(NbProblems->Value(aProblemID) > 0)
     theCommands<<"  Invalid Point on Curve ................... "<<NbProblems->Value(aProblemID)<<"\n";
+  if(NbProblems->Value(34)>0)
+    theCommands<<"  checkshape failure........................ "<<NbProblems->Value(34)<<"\n";
+    //cout<<"  checkshape failure......... .............. "<<NbProblems->Value(32)<<endl;
 
   aProblemID = static_cast<Standard_Integer>(BRepCheck_InvalidPointOnCurveOnSurface);
   if(NbProblems->Value(aProblemID)>0)
@@ -1082,7 +1176,7 @@ static Standard_Integer shapeG1continuity (Draw_Interpretor& di, Standard_Intege
   face1=TopoDS::Face(It.Value());
   It.Next();
   face2=TopoDS::Face(It.Value());
-
+    
   Standard_Boolean IsSeam = face1.IsEqual(face2);
     
 // calcul des deux pcurves 
@@ -1129,13 +1223,13 @@ static Standard_Integer shapeG1continuity (Draw_Interpretor& di, Standard_Intege
   { 
   case 7  : epsG1 = Draw::Atof(a[6]);
     Standard_FALLTHROUGH
-  case 6  : epsC0 = Draw::Atof(a[5]);
+      case 6  : epsC0   = Draw::Atof(a[5]);
     Standard_FALLTHROUGH
-  case 5  : epsnl = Draw::Atof(a[4]);
+      case 5  : epsnl    = Draw::Atof(a[4]);
     Standard_FALLTHROUGH
   case 4  : break;
-  default : return 1;
-  }
+      default : return 1;
+    }
 
 
   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
@@ -1263,11 +1357,11 @@ static Standard_Integer shapeG0continuity (Draw_Interpretor& di, Standard_Intege
   { 
   case 6  : epsC0   = Draw::Atof(a[5]);
     Standard_FALLTHROUGH
-  case 5  : epsnl    = Draw::Atof(a[4]);
+      case 5  : epsnl    = Draw::Atof(a[4]);
     Standard_FALLTHROUGH
   case 4  : break;
-  default : return 1;
-  }
+      default : return 1;
+    }
 
   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
   Standard_Boolean isconti = Standard_True;
@@ -1389,20 +1483,20 @@ static Standard_Integer shapeG2continuity (Draw_Interpretor& di, Standard_Intege
   nbeval = (Standard_Integer ) Draw::Atof( a[3]);
 
   switch(n)
-  { 
-  case 9  :  maxlen = Draw::Atof(a[8]);
+    
+      case 9  :  maxlen   = Draw::Atof(a[8]);
     Standard_FALLTHROUGH
-  case 8   : percent = Draw::Atof(a[7]);      
+      case 8   : percent   = Draw::Atof(a[7]);      
     Standard_FALLTHROUGH
-  case 7   : epsG1 = Draw::Atof(a[6]);
+      case 7   : epsG1 = Draw::Atof(a[6]);
     Standard_FALLTHROUGH
-  case 6  :  epsC0 = Draw::Atof(a[5]);
+      case 6  :  epsC0   = Draw::Atof(a[5]);
     Standard_FALLTHROUGH
-  case 5  :  epsnl = Draw::Atof(a[4]);
+      case 5  :  epsnl   = Draw::Atof(a[4]);
     Standard_FALLTHROUGH
   case 4  : break;
-  default : return 1;
-  }
+      default : return 1;
+    }
 
 
   Standard_Real pard1, parf1, U, Uf, deltaU, nb = 0;
index 3ad36cedf7df20b3c9a4d2288359cb9a80461de2..4e6f7525b1327fb48b2c81247d60d692133b7b2a 100644 (file)
 #include <Draw_Interpretor.hxx>
 #include <Draw_Appli.hxx>
 #include <DrawTrSurf.hxx>
+#include <TopExp.hxx>
+#include <TopoDS.hxx>
 #include <TopoDS_Solid.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Edge.hxx>
 #include <BRep_Builder.hxx>
 #include <BRepBuilderAPI.hxx>
 #include <BRepPreviewAPI_MakeBox.hxx>
@@ -118,7 +122,7 @@ static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char**
         aParams.SetY (Draw::Atof(a[anArgIter + 4]));
         aParams.SetZ (Draw::Atof(a[anArgIter + 5]));
         anArgIter += 5;
-      }
+  }
 
       else if (aCountReal == 3)
       {
@@ -126,7 +130,7 @@ static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char**
         aParams.SetY (Draw::Atof(a[anArgIter + 1]));
         aParams.SetZ (Draw::Atof(a[anArgIter + 2]));
         anArgIter += 2;
-      }
+  }
       else
       {
         Message::SendFail() << "Syntax error";
@@ -159,7 +163,7 @@ static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char**
     }
 
     S = aPreview;
-    DBRep::Set(a[1],S);
+  DBRep::Set(a[1],S);
   }
   else
   {
@@ -383,6 +387,78 @@ static Standard_Integer torus(Draw_Interpretor& , Standard_Integer n, const char
   return 0;
 }
 
+//=======================================================================
+//function : DrawTolerance
+//purpose  : 
+//=======================================================================
+static Standard_Integer DrawTolerance(Draw_Interpretor& theDI, Standard_Integer theNArg, const char** a)
+{
+  if(theNArg != 3)
+  {
+    theDI << "use toolsphere name vertex\\edge\n";
+    return 1;
+  }
+
+  TopoDS_Shape aS = DBRep::Get(a[2]);
+  if(aS.IsNull())
+  {
+    theDI << "No source shape found\n";
+    return 1;
+  }
+
+  Standard_Real aRadius;
+  gp_Pnt aCenter;
+
+  switch(aS.ShapeType())
+  {
+  case TopAbs_VERTEX:
+    {
+      TopoDS_Vertex aV = TopoDS::Vertex(aS);
+      aRadius = BRep_Tool::Tolerance(aV);
+      aCenter = BRep_Tool::Pnt(aV);
+    }
+    break;
+  case TopAbs_EDGE:
+    {
+      TopoDS_Edge anE = TopoDS::Edge(DBRep::Get(a[2]));
+      TopoDS_Vertex aV1 = TopExp::FirstVertex(anE),
+                  aV2 = TopExp::LastVertex(anE);
+
+      Standard_Real aTol1 = BRep_Tool::Tolerance(aV1);
+      Standard_Real aTol2 = BRep_Tool::Tolerance(aV2);
+
+      if( Precision::IsInfinite(aTol1) ||
+          Precision::IsInfinite(aTol2))
+      {
+        theDI << "Tolerance is infinity\n";
+        return 0;
+      }
+
+      gp_Pnt aPnt1 = BRep_Tool::Pnt(aV1);
+      gp_Pnt aPnt2 = BRep_Tool::Pnt(aV2);
+      
+      aCenter = gp_Pnt( (aPnt1.X() + aPnt2.X())/2.0,
+                        (aPnt1.Y() + aPnt2.Y())/2.0,
+                        (aPnt1.Z() + aPnt2.Z())/2.0);
+
+      aRadius = Max(aTol1,aTol2) + aPnt1.Distance(aPnt2)/2.0;
+    }
+    break;
+  default:
+    {
+      theDI << "Enter a vertex or an edge (see help)\n";
+      return 1;
+    }
+  }
+
+  TopoDS_Solid S = BRepPrimAPI_MakeSphere(aCenter,aRadius);
+
+  DBRep::Set(a[1],S);
+  return 0;
+}
+
+
+
 
 
 //=======================================================================
@@ -459,6 +535,9 @@ void  BRepTest::PrimitiveCommands(Draw_Interpretor& theCommands)
                   "\n\t\t: - angle2 second angle to create a torus ring segment"
                   "\n\t\t: - angle  angle to create a torus pipe segment",
                   __FILE__, torus, g);
+  theCommands.Add("tolsphere", "toolsphere name vertex\\edge (if vertex is given, center of sphere is the \"vertex\", "
+    "radius is a tolerance of vertex; if edge is given, sphere is built, which is determined in "
+    "BRepCheck_Edge::CheckTolerance(...) function)",__FILE__,DrawTolerance,g);
 }
 
 
diff --git a/tests/bugs/modalg_5/bug23731 b/tests/bugs/modalg_5/bug23731
new file mode 100644 (file)
index 0000000..a408ef7
--- /dev/null
@@ -0,0 +1,24 @@
+puts "============"
+puts "CR23731"
+puts "============"
+puts ""
+######################################################
+# The shape obtained by stepread is valid in terms of checkshape but it is not valid in terms of usability.
+######################################################
+
+catch { pload XDE }
+
+set filepath [locate_data_file OCC6289.stp]
+stepread $filepath a *
+
+explode a_1 f
+
+renamevar a_1_24 result
+
+smallview
+donly result
+fit
+
+set square 1
+
+set only_screen_axo 1