return aWire;
}
-void HYDROData_TopoCurve::Cut(
+bool HYDROData_TopoCurve::Cut(
const std::list<TopoDS_Edge>::iterator& theEdgePosition,
const double theParameter,
HYDROData_TopoCurve& theCurve)
{
+ bool aResult = false;
+
// Locate the edge.
std::list<TopoDS_Edge>::iterator aFirstEIt = myEdges.begin();
std::list<TopoDS_Edge>::iterator aEIt = aFirstEIt;
{
aParamI ^= 1;
}
+ const bool isClosed = IsClosed();
if (aParamI < 0)
{
aEdge.Orientation(TopAbs_FORWARD);
*aEIt = aEParts[aFirstPI];
InsertAfter(aEIt, aEParts[1 - aFirstPI], myEdges);
++aEIt;
+
+ aResult = true;
}
- else if (aParamI > 0)
+ else
{
- ++aEIt;
+ TopoDS_Edge aNewEdge = ReplaceVertex(aEdge, (aParamI == 0) ? false : true);
+ *aEIt = aNewEdge;
+ if (aParamI > 0)
+ {
+ ++aEIt;
+
+ std::list<TopoDS_Edge>::iterator aEdgePosition = theEdgePosition;
+ if (isClosed || ++aEdgePosition != myEdges.end())
+ {
+ aResult = true;
+ }
+ }
+ else
+ {
+ if (isClosed || theEdgePosition != aFirstEIt)
+ {
+ aResult = true;
+ }
+ }
}
// 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);
}
+
+ return aResult;
}
void HYDROData_TopoCurve::Cut(
theCurve1.Cut(aEPos1, theParameter, theCurve2);
}
-void HYDROData_TopoCurve::Cut(
+bool HYDROData_TopoCurve::Cut(
const std::deque<std::list<double> >& theParameters,
std::deque<HYDROData_TopoCurve>& theCurves) const
{
+ bool aResult = false;
HYDROData_TopoCurve aCurves[2];
aCurves[0] = *this;
int aCI = 0;
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)
{
const int aCI1 = 1 - aCI;
- aCurves[aCI].Cut(aEIt, **aPIt, aCurves[aCI1]);
+ aResult |= aCurves[aCI].Cut(aEIt, **aPIt, aCurves[aCI1]);
if (!aCurves[aCI1].IsEmpty())
{
theCurves.push_back(HYDROData_TopoCurve());
aEIt = aCurves[aCI].myEdges.begin();
}
}
+
+ if (!aNextEdge.IsNull() && !aEIt->IsEqual(aNextEdge))
+ {
+ ++aEIt;
+ }
}
theCurves.push_back(aCurves[aCI]);
+ return aResult;
}
double HYDROData_TopoCurve::Project(