From 7c9ccdad0d724dc43d6d1af52452bffc7b87be2b Mon Sep 17 00:00:00 2001 From: azv Date: Wed, 20 Jan 2016 10:18:20 +0300 Subject: [PATCH] Make SketchBuilder more deterministic --- src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp | 72 +++++++++++++++---- src/ModelAPI/Test/Test1064.py | 2 +- src/PythonAPI/examples/Platine.py | 6 +- 3 files changed, 62 insertions(+), 18 deletions(-) diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp index 9713fda50..5098b3740 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_SketchBuilder.cpp @@ -12,11 +12,36 @@ #include #include #include +#include #include #include #include #include +#include + + +static TopoDS_Vertex findStartVertex(const TopoDS_Face& aFace) +{ + TopExp_Explorer anExp(aFace, TopAbs_VERTEX); + TopoDS_Vertex aStart = TopoDS::Vertex(anExp.Current()); + gp_Pnt aStartPnt(BRep_Tool::Pnt(aStart)); + TopoDS_Vertex aCurrent; + gp_Pnt aCurrentPnt; + + 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())) { + aStart = aCurrent; + aStartPnt = aCurrentPnt; + } + } + return aStart; +} void GeomAlgoAPI_SketchBuilder::createFaces( const std::shared_ptr& theOrigin, @@ -61,24 +86,43 @@ void GeomAlgoAPI_SketchBuilder::createFaces( if (aFClass.PerformInfinitePoint() == TopAbs_IN) continue; - // remove internal edges from faces + // 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()) + for (; anExp.More(); anExp.Next()) { if (anExp.Current().Orientation() == TopAbs_INTERNAL) - break; - if (anExp.More()) { - TopoDS_Face aNewFace; - aBuilder.MakeFace(aNewFace, aPlane, Precision::Confusion()); - TopoDS_Wire aWire; - aBuilder.MakeWire(aWire); - for (anExp.ReInit(); anExp.More(); anExp.Next()) - if (anExp.Current().Orientation() != TopAbs_INTERNAL) - aBuilder.Add(aWire, anExp.Current()); - aBuilder.Add(aNewFace, aWire); - aFace = aNewFace; + 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; - // Store face + // store face std::shared_ptr aResFace(new GeomAPI_Shape); aResFace->setImpl(new TopoDS_Face(aFace)); theResultFaces.push_back(aResFace); diff --git a/src/ModelAPI/Test/Test1064.py b/src/ModelAPI/Test/Test1064.py index e5c24f218..c73dfd17d 100644 --- a/src/ModelAPI/Test/Test1064.py +++ b/src/ModelAPI/Test/Test1064.py @@ -73,7 +73,7 @@ aSession.setActiveDocument(aPartSet) aPlane = aPartSet.addFeature("Plane") aPlane.string("CreationMethod").setValue("PlaneByFaceAndDistance") aPlane.real("distance").setValue(0) -aPlane.selection("planeFace").selectSubShape("face", "Part_1/Extrusion_1_1/LateralFace_2") +aPlane.selection("planeFace").selectSubShape("face", "Part_1/Extrusion_1_1/LateralFace_3") aSession.finishOperation() #========================================================================= diff --git a/src/PythonAPI/examples/Platine.py b/src/PythonAPI/examples/Platine.py index 96afd1ac0..063e2c639 100644 --- a/src/PythonAPI/examples/Platine.py +++ b/src/PythonAPI/examples/Platine.py @@ -54,7 +54,7 @@ def vertical_body(): def bottom_body(): # Create XOY sketch - sketch = model.addSketch(part, "Extrusion_1_1/LateralFace_5") + sketch = model.addSketch(part, "Extrusion_1_1/LateralFace_4") # Create base polygon points = [(0, 0), (0, L), (P, L), (P, 16 + 16), (P - 20, 16 + 16), (P - 20, 16), (P, 16), (P, 0)] @@ -87,7 +87,7 @@ def bottom_body(): sketch.setCoincident(arc.endPoint(), h1.startPoint()) # Binding - left_e = sketch.addLine("Extrusion_1_1/LateralFace_5&Extrusion_1_1/ToFace_1") + left_e = sketch.addLine("Extrusion_1_1/LateralFace_4&Extrusion_1_1/ToFace_1") sketch.setCoincident(left_e.startPoint(), left.endPoint()) sketch.setCoincident(left_e.endPoint(), left.startPoint()) @@ -162,7 +162,7 @@ def body_3(): def body_4(): # Create XOZ 2nd sketch - sketch = model.addSketch(part, "Boolean_2_1/Modified_7") + sketch = model.addSketch(part, "Boolean_2_1/Modified_8") # Create base polygon points = [(0, 0), (0, 1), (1, 0)] -- 2.39.2