]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Update split shape for correct processing of closed edges
authorazv <azv@opencascade.com>
Tue, 26 Jul 2016 08:06:54 +0000 (11:06 +0300)
committerazv <azv@opencascade.com>
Tue, 26 Jul 2016 08:06:54 +0000 (11:06 +0300)
src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp

index 6fa8f4b3167757d7731e7ecfa05c87175d513841..247e6126e7a4eb58a28fd89cac9d150ac7a25545 100644 (file)
@@ -21,6 +21,7 @@
 #include <BRepAlgo_FaceRestrictor.hxx>
 #include <BRepBndLib.hxx>
 #include <BRepBuilderAPI_FindPlane.hxx>
+#include <BRepBuilderAPI_MakeEdge.hxx>
 #include <BRepBuilderAPI_MakeFace.hxx>
 #include <BRepCheck_Analyzer.hxx>
 #include <BRepExtrema_DistShapeShape.hxx>
@@ -676,7 +677,21 @@ void GeomAlgoAPI_ShapeTools::splitShape(const std::shared_ptr<GeomAPI_Shape>& th
 {
   // General Fuse to split edge by vertices
   BOPAlgo_Builder aBOP;
-  const TopoDS_Edge& aBaseEdge = theBaseShape->impl<TopoDS_Edge>();
+  TopoDS_Edge aBaseEdge = theBaseShape->impl<TopoDS_Edge>();
+  // Rebuild closed edge to place vertex to one of split points.
+  // This will prevent edge to be split on seam vertex.
+  if (BRep_Tool::IsClosed(aBaseEdge))
+  {
+    Standard_Real aFirst, aLast;
+    Handle(Geom_Curve) aCurve = BRep_Tool::Curve(aBaseEdge, aFirst, aLast);
+
+    std::set<std::shared_ptr<GeomAPI_Pnt> >::const_iterator aPIt = thePoints.begin();
+    gp_Pnt aPoint((*aPIt)->x(), (*aPIt)->y(), (*aPIt)->z());
+
+    TopAbs_Orientation anOrientation = aBaseEdge.Orientation();
+    aBaseEdge = BRepBuilderAPI_MakeEdge(aCurve, aPoint, aPoint).Edge();
+    aBaseEdge.Orientation(anOrientation);
+  }
   aBOP.AddArgument(aBaseEdge);
 
   std::set<std::shared_ptr<GeomAPI_Pnt> >::const_iterator aPtIt = thePoints.begin();