]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
refs #625: Fatal error as result of show split polyline
authorabk <abk@opencascade.com>
Fri, 10 Jul 2015 17:35:04 +0000 (20:35 +0300)
committerabk <abk@opencascade.com>
Fri, 10 Jul 2015 17:35:04 +0000 (20:35 +0300)
The reasons of the error - the incorrect cuttings of a topological curve by parameters and a parameter - were corrected.

src/HYDROData/HYDROData_TopoCurve.cxx

index 86c0cf82d73b9ed2270c13f4ad2894c4785e56a7..abe49f37865a10e5c4d88a03a67c2cb828485c1b 100644 (file)
@@ -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);
   }
 }
@@ -569,7 +575,16 @@ void HYDROData_TopoCurve::Cut(
   for (std::deque<std::list<double> >::const_iterator aLastPLIt =
     theParameters.end(); aPLIt != aLastPLIt; ++aPLIt)
   {
-    const int aSize = aCurves[aCI].myEdges.size();
+    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)
     {
@@ -587,7 +602,8 @@ void HYDROData_TopoCurve::Cut(
         aEIt = aCurves[aCI].myEdges.begin();
       }
     }
-    if (aCurves[aCI].myEdges.size() == aSize)
+
+    if (!aNextEdge.IsNull() && !aEIt->IsEqual(aNextEdge))
     {
       ++aEIt;
     }