Salome HOME
Merge branch 'BR_v14_rc' of ssh://git.salome-platform.org/modules/hydro into BR_v14_rc
[modules/hydro.git] / src / HYDROData / HYDROData_TopoCurve.cxx
index 449db4c98fa9a81764bcd38ef5a20ecef6ae5b2c..abe49f37865a10e5c4d88a03a67c2cb828485c1b 100644 (file)
@@ -97,7 +97,7 @@ template<typename ItemType> static void InsertAfter(
   const ItemType& theValue,
   std::list<ItemType>& theList)
 {
-  std::list<ItemType>::iterator aEIt2 = thePosition;
+  typename std::list<ItemType>::iterator aEIt2 = thePosition;
   if (++aEIt2 != theList.end())
   {
     theList.insert(aEIt2, theValue);
@@ -498,6 +498,7 @@ void HYDROData_TopoCurve::Cut(
   {
     aParamI ^= 1;
   }
+  const bool isClosed = IsClosed();
   if (aParamI < 0)
   {
     aEdge.Orientation(TopAbs_FORWARD);
@@ -530,16 +531,21 @@ void HYDROData_TopoCurve::Cut(
     InsertAfter(aEIt, aEParts[1 - aFirstPI], myEdges);
     ++aEIt;
   }
-  else if (aParamI > 0)
+  else
   {
-    ++aEIt;
+    TopoDS_Edge aNewEdge = ReplaceVertex(aEdge, (aParamI == 0) ? false : true);
+    *aEIt = aNewEdge;
+    if (aParamI > 0)
+    {
+      ++aEIt;
+    }
   }
 
   // Calculate the curve parts.
   std::list<TopoDS_Edge>::iterator aLastEIt = myEdges.end();
   if (aEIt != aFirstEIt && aEIt != aLastEIt)
   {
-    std::list<TopoDS_Edge>* aEdges = !IsClosed() ? &theCurve.myEdges : &myEdges;
+    std::list<TopoDS_Edge>* aEdges = !isClosed ? &theCurve.myEdges : &myEdges;
     aEdges->splice(aEdges->begin(), myEdges, aEIt, aLastEIt);
   }
 }
@@ -567,8 +573,18 @@ void HYDROData_TopoCurve::Cut(
   std::list<TopoDS_Edge>::iterator aEIt = aCurves[0].myEdges.begin();
   std::deque<std::list<double> >::const_iterator aPLIt = theParameters.begin();
   for (std::deque<std::list<double> >::const_iterator aLastPLIt =
-    theParameters.end(); aPLIt != aLastPLIt; ++aEIt, ++aPLIt)
+    theParameters.end(); aPLIt != aLastPLIt; ++aPLIt)
   {
+    TopoDS_Edge aNextEdge;
+    {
+      std::list<TopoDS_Edge>::iterator aNextEIt = aEIt;
+      ++aNextEIt;
+      if (aNextEIt != aCurves[aCI].myEdges.end())
+      {
+        aNextEdge = *aNextEIt;
+      }
+    }
+
     for (Iterator<std::list<double>, std::list<double>::const_iterator> aPIt(
       *aPLIt, (aEIt->Orientation() != TopAbs_REVERSED)); aPIt.More(); ++aPIt)
     {
@@ -586,6 +602,11 @@ void HYDROData_TopoCurve::Cut(
         aEIt = aCurves[aCI].myEdges.begin();
       }
     }
+
+    if (!aNextEdge.IsNull() && !aEIt->IsEqual(aNextEdge))
+    {
+      ++aEIt;
+    }
   }
   theCurves.push_back(aCurves[aCI]);
 }
@@ -791,7 +812,7 @@ bool HYDROData_TopoCurve::Connect(
           return false;
         }
 
-        HYDROData_TopoCurve aECurve = BRepBuilderAPI_MakeEdge(aBSpline);
+        HYDROData_TopoCurve aECurve = BRepBuilderAPI_MakeEdge(aBSpline).Edge();
         aCurve2.Merge(aOrder, aECurve);
       }
       aCurve2.Merge(aOrder, *this);
@@ -808,9 +829,10 @@ bool HYDROData_TopoCurve::Connect(
   return true;
 }
 
-bool HYDROData_TopoCurve::BSplinePiecewiseCurve(
+int HYDROData_TopoCurve::BSplinePiecewiseCurve(
   const double theDeflection, HYDROData_TopoCurve& theCurve) const
 {
+  int aPieceCount = 0;
   std::list<TopoDS_Edge>::const_iterator aLastEIt = myEdges.end();
   std::list<TopoDS_Edge>::const_iterator aEIt = myEdges.begin();
   TopoDS_Vertex aEndVertex;
@@ -821,7 +843,7 @@ bool HYDROData_TopoCurve::BSplinePiecewiseCurve(
       ::BSpline(BRepAdaptor_Curve(*aEIt), theDeflection);
     if (aBSpline.IsNull())
     {
-      return false;
+      return 0;
     }
 
     if (aEIt->Orientation() == TopAbs_REVERSED)
@@ -844,6 +866,7 @@ bool HYDROData_TopoCurve::BSplinePiecewiseCurve(
     }
     BRep_Builder().Add(aEdge, aVertex);
     theCurve.myEdges.push_back(aEdge);
+    aPieceCount += aBSpline->NbKnots() - 1;
     aPrevEdge = aEdge;
   }
 
@@ -854,10 +877,10 @@ bool HYDROData_TopoCurve::BSplinePiecewiseCurve(
       aCurve.Value(aCurve.LastParameter()), Precision::Confusion());
   }
   BRep_Builder().Add(aPrevEdge, aEndVertex.Oriented(TopAbs_REVERSED));
-  return true;
+  return aPieceCount;
 }
 
-bool HYDROData_TopoCurve::ValuesInKnots(std::deque<gp_XYZ>& theValues) const
+bool HYDROData_TopoCurve::ValuesInKnots(std::list<gp_XYZ>& theValues) const
 {
   std::list<TopoDS_Edge>::const_iterator aLastEIt = myEdges.end();
   std::list<TopoDS_Edge>::const_iterator aEIt = myEdges.begin();