-#include<HYDROData_BSplineOperation.h>
-#include<TColgp_HArray1OfPnt.hxx>
-#include<GeomAPI_Interpolate.hxx>
-#include<GeomConvert_BSplineCurveToBezierCurve.hxx>
-#include<Geom_BezierCurve.hxx>
+#include <HYDROData_BSplineOperation.h>
+
+#include <TColgp_HArray1OfPnt.hxx>
+
+#include <GeomAPI_Interpolate.hxx>
+#include <GeomConvert_BSplineCurveToBezierCurve.hxx>
+#include <Geom_BezierCurve.hxx>
+
+#include <QPainterPath>
HYDROData_BSplineOperation::HYDROData_BSplineOperation(
- const QList<double>& thePoints,
- const double theZValue,
- const bool theIsClosed)
+ const NCollection_Sequence<gp_XYZ>& thePoints,
+ const bool theIsClosed,
+ const double theTolerance )
{
+ // skip equal points
+ int aNbPoints = thePoints.Size();
+ NCollection_Sequence<gp_XYZ> aPoints;
+ if ( aNbPoints > 0 ) {
+ gp_XYZ aPrevPoint = thePoints.Value( 1 );
+ aPoints.Append( aPrevPoint );
+ for( int i = 2 ; i <= aNbPoints; ++i )
+ {
+ gp_XYZ aPoint( thePoints.Value( i ) );
+ if ( !aPoint.IsEqual( aPrevPoint, theTolerance ) )
+ aPoints.Append( aPoint );
+ aPrevPoint = aPoint;
+ }
+ }
+
// fill array for algorithm by the received coordinates
- int aLen = thePoints.size() / 2;
- Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt (1, aLen);
- QList<double>::const_iterator aListIter = thePoints.begin();
- for (int ind = 1; ind <= aLen; ind++) {
- gp_Pnt aPnt(gp::Origin());
- aPnt.SetX(*aListIter);
- aListIter++;
- aPnt.SetY(*aListIter);
- aListIter++;
- aPnt.SetZ(theZValue);
- aHCurvePoints->SetValue(ind, aPnt);
+ aNbPoints = aPoints.Size();
+ Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt( 1, aNbPoints );
+ for ( int i = 1; i <= aNbPoints; i++ )
+ {
+ gp_Pnt aPnt( aPoints.Value( i ) );
+ aHCurvePoints->SetValue( i, aPnt );
}
+
// compute BSpline
- GeomAPI_Interpolate aGBC(aHCurvePoints, theIsClosed, gp::Resolution());
+ GeomAPI_Interpolate aGBC( aHCurvePoints, theIsClosed, gp::Resolution() );
aGBC.Perform();
- if (aGBC.IsDone()) {
+ if ( aGBC.IsDone() )
myCurve = aGBC.Curve();
- }
}
-QPainterPath HYDROData_BSplineOperation::ComputePath() const
+void HYDROData_BSplineOperation::ComputePath( QPainterPath& thePath ) const
{
- QPainterPath aResult;
- if (myCurve.IsNull()) // returns an empty Path if original curve is invalid
- return aResult;
+ if ( myCurve.IsNull() ) // returns an empty Path if original curve is invalid
+ return;
+
GeomConvert_BSplineCurveToBezierCurve aConverter(myCurve);
int a, aNumArcs = aConverter.NbArcs();
- for(a = 1; a <= aNumArcs; a++) {
+ for(a = 1; a <= aNumArcs; a++)
+ {
Handle(Geom_BezierCurve) anArc = aConverter.Arc(a);
if (a == 1) { // set a start point
gp_Pnt aStart = anArc->StartPoint();
- aResult.moveTo(aStart.X(), aStart.Y());
+ thePath.moveTo(aStart.X(), aStart.Y());
}
gp_Pnt anEnd = anArc->EndPoint();
if (anArc->NbPoles() == 3) { // quadric segment in the path (pole 1 is start, pole 3 is end)
gp_Pnt aPole = anArc->Pole(2);
- aResult.quadTo(aPole.X(), aPole.Y(), anEnd.X(), anEnd.Y());
+ thePath.quadTo(aPole.X(), aPole.Y(), anEnd.X(), anEnd.Y());
} else if (anArc->NbPoles() == 4) { // cubic segment (usually this is used)
gp_Pnt aPole1 = anArc->Pole(2);
gp_Pnt aPole2 = anArc->Pole(3);
- aResult.cubicTo(
+ thePath.cubicTo(
aPole1.X(), aPole1.Y(), aPole2.X(), aPole2.Y(), anEnd.X(), anEnd.Y());
} else { // error, another number of poles is not supported
- return QPainterPath();
+ continue;
}
}
- return aResult;
}