X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_SketchBuilder.cpp;h=880273df25fe4665fa09d37cd3649dfca5df5be9;hb=f0cec241aae9ca16d86e166f45cb5c4987d2c792;hp=5098b37408ecc68e2c8b3da52f77f057d408947c;hpb=7c9ccdad0d724dc43d6d1af52452bffc7b87be2b;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp index 5098b3740..880273df2 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp @@ -19,11 +19,14 @@ #include #include +#include -static TopoDS_Vertex findStartVertex(const TopoDS_Face& aFace) +static TopoDS_Vertex findStartVertex(const TopoDS_Shape& theShape) { - TopExp_Explorer anExp(aFace, TopAbs_VERTEX); + 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)); TopoDS_Vertex aCurrent; @@ -32,10 +35,10 @@ static TopoDS_Vertex findStartVertex(const TopoDS_Face& aFace) 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; } @@ -86,43 +89,54 @@ void GeomAlgoAPI_SketchBuilder::createFaces( if (aFClass.PerformInfinitePoint() == TopAbs_IN) continue; - // to make faces equal on different platforms, we will find - // a vertex with greater coordinates and start wire from it - TopoDS_Vertex aStartVertex = findStartVertex(aFace); - TopoDS_Wire aNewWire; - aBuilder.MakeWire(aNewWire); - std::list aSkippedEdges; - bool aStartFound = false; - - // remove internal edges from faces and make wire start from found vertex - TopExp_Explorer anExp(aFace, TopAbs_EDGE); - for (; anExp.More(); anExp.Next()) { - if (anExp.Current().Orientation() == TopAbs_INTERNAL) - continue; - if (!aStartFound) { - const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current()); - TopoDS_Vertex aV1, aV2; - TopExp::Vertices(anEdge, aV1, aV2); - if (aV1.IsSame(aStartVertex) == Standard_True) - aStartFound = true; - else - aSkippedEdges.push_back(anEdge); - } - if (aStartFound) - aBuilder.Add(aNewWire, anExp.Current()); - } - // add skipped edges to the end of wire - std::list::const_iterator aSkIt = aSkippedEdges.begin(); - for (; aSkIt != aSkippedEdges.end(); ++aSkIt) - aBuilder.Add(aNewWire, *aSkIt); - // rebuild face TopoDS_Face aNewFace; aBuilder.MakeFace(aNewFace, aPlane, Precision::Confusion()); - aBuilder.Add(aNewFace, aNewWire); - aFace = aNewFace; + + // iterate on wires + TopExp_Explorer aWireExp(aFace, TopAbs_WIRE); + for (; aWireExp.More(); aWireExp.Next()) { + TopoDS_Wire aWire = TopoDS::Wire(aWireExp.Current()); + + // to make faces equal on different platforms, we will find + // a vertex with greater coordinates and start wire from it + TopoDS_Vertex aStartVertex = findStartVertex(aWire); + + TopoDS_Wire aNewWire; + aBuilder.MakeWire(aNewWire); + std::list aSkippedEdges; + bool aStartFound = false; + + // remove internal edges from faces and make wire start from found vertex + TopExp_Explorer anExp(aWire, TopAbs_EDGE); + for (; anExp.More(); anExp.Next()) { + if (anExp.Current().Orientation() == TopAbs_INTERNAL) + continue; + if (!aStartFound) { + const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current()); + TopoDS_Vertex aV1, aV2; + TopExp::Vertices(anEdge, aV1, aV2, Standard_True); + if (aV1.IsSame(aStartVertex) == Standard_True) + aStartFound = true; + else + aSkippedEdges.push_back(anEdge); + } + if (aStartFound) + aBuilder.Add(aNewWire, anExp.Current()); + } + // add skipped edges to the end of wire + std::list::const_iterator aSkIt = aSkippedEdges.begin(); + for (; aSkIt != aSkippedEdges.end(); ++aSkIt) + aBuilder.Add(aNewWire, *aSkIt); + + // check the wire is empty + anExp.Init(aNewWire, TopAbs_EDGE); + if (anExp.More()) + aBuilder.Add(aNewFace, aNewWire); + } // store face + aFace = aNewFace; std::shared_ptr aResFace(new GeomAPI_Shape); aResFace->setImpl(new TopoDS_Face(aFace)); theResultFaces.push_back(aResFace);