Salome HOME
Fixed validators for Boolean and Intersection
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_SketchBuilder.cpp
index a36b784ef46a675c111ace26e111fe2e56417236..880273df25fe4665fa09d37cd3649dfca5df5be9 100644 (file)
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 
 #include <list>
+#include <cmath>
 
 
 static TopoDS_Vertex findStartVertex(const TopoDS_Shape& theShape)
 {
+  static const double aTol = Precision::PConfusion();
+
   TopExp_Explorer anExp(theShape, TopAbs_VERTEX);
   TopoDS_Vertex aStart = TopoDS::Vertex(anExp.Current());
   gp_Pnt aStartPnt(BRep_Tool::Pnt(aStart));
@@ -32,10 +35,10 @@ static TopoDS_Vertex findStartVertex(const TopoDS_Shape& theShape)
   for (anExp.Next(); anExp.More(); anExp.Next()) {
     aCurrent = TopoDS::Vertex(anExp.Current());
     aCurrentPnt = BRep_Tool::Pnt(aCurrent);
-    if ((aCurrentPnt.X() > aStartPnt.X()) ||
-        (aCurrentPnt.X() == aStartPnt.X() && aCurrentPnt.Y() > aStartPnt.Y()) ||
-        (aCurrentPnt.X() == aStartPnt.X() && aCurrentPnt.Y() == aStartPnt.Y() &&
-            aCurrentPnt.Z() > aStartPnt.Z())) {
+    if ((aCurrentPnt.X() > aStartPnt.X() + aTol) ||
+        (aCurrentPnt.X() > aStartPnt.X() - aTol && aCurrentPnt.Y() > aStartPnt.Y() + aTol) ||
+        (aCurrentPnt.X() > aStartPnt.X() - aTol && aCurrentPnt.Y() > aStartPnt.Y() - aTol &&
+            aCurrentPnt.Z() > aStartPnt.Z() + aTol)) {
       aStart = aCurrent;
       aStartPnt = aCurrentPnt;
     }
@@ -112,7 +115,7 @@ void GeomAlgoAPI_SketchBuilder::createFaces(
         if (!aStartFound) {
           const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current());
           TopoDS_Vertex aV1, aV2;
-          TopExp::Vertices(anEdge, aV1, aV2);
+          TopExp::Vertices(anEdge, aV1, aV2, Standard_True);
           if (aV1.IsSame(aStartVertex) == Standard_True)
             aStartFound = true;
           else
@@ -126,7 +129,10 @@ void GeomAlgoAPI_SketchBuilder::createFaces(
       for (; aSkIt != aSkippedEdges.end(); ++aSkIt)
         aBuilder.Add(aNewWire, *aSkIt);
 
-      aBuilder.Add(aNewFace, aNewWire);
+      // check the wire is empty
+      anExp.Init(aNewWire, TopAbs_EDGE);
+      if (anExp.More())
+        aBuilder.Add(aNewFace, aNewWire);
     }
 
     // store face