X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROData%2FHYDROData_TopoCurve.cxx;h=abe49f37865a10e5c4d88a03a67c2cb828485c1b;hb=6e864f284319c3e57ba99b17384dfa13b853c0bf;hp=449db4c98fa9a81764bcd38ef5a20ecef6ae5b2c;hpb=c9bbaf3e757559646f7b9aefea06ef56fe919f0e;p=modules%2Fhydro.git diff --git a/src/HYDROData/HYDROData_TopoCurve.cxx b/src/HYDROData/HYDROData_TopoCurve.cxx index 449db4c9..abe49f37 100644 --- a/src/HYDROData/HYDROData_TopoCurve.cxx +++ b/src/HYDROData/HYDROData_TopoCurve.cxx @@ -97,7 +97,7 @@ template static void InsertAfter( const ItemType& theValue, std::list& theList) { - std::list::iterator aEIt2 = thePosition; + typename std::list::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::iterator aLastEIt = myEdges.end(); if (aEIt != aFirstEIt && aEIt != aLastEIt) { - std::list* aEdges = !IsClosed() ? &theCurve.myEdges : &myEdges; + std::list* aEdges = !isClosed ? &theCurve.myEdges : &myEdges; aEdges->splice(aEdges->begin(), myEdges, aEIt, aLastEIt); } } @@ -567,8 +573,18 @@ void HYDROData_TopoCurve::Cut( std::list::iterator aEIt = aCurves[0].myEdges.begin(); std::deque >::const_iterator aPLIt = theParameters.begin(); for (std::deque >::const_iterator aLastPLIt = - theParameters.end(); aPLIt != aLastPLIt; ++aEIt, ++aPLIt) + theParameters.end(); aPLIt != aLastPLIt; ++aPLIt) { + TopoDS_Edge aNextEdge; + { + std::list::iterator aNextEIt = aEIt; + ++aNextEIt; + if (aNextEIt != aCurves[aCI].myEdges.end()) + { + aNextEdge = *aNextEIt; + } + } + for (Iterator, std::list::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::const_iterator aLastEIt = myEdges.end(); std::list::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& theValues) const +bool HYDROData_TopoCurve::ValuesInKnots(std::list& theValues) const { std::list::const_iterator aLastEIt = myEdges.end(); std::list::const_iterator aEIt = myEdges.begin();