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;
+ 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;
}
return aWire;
}
-QPainterPath HYDROData_PolylineXY::BuildPainterPath( const SectionType& theType,
- const bool& theIsClosed,
- const NCollection_Sequence<gp_XYZ>& thePoints )
+void HYDROData_PolylineXY::BuildPainterPath( QPainterPath& thePath,
+ const SectionType& theType,
+ const bool& theIsClosed,
+ const NCollection_Sequence<gp_XYZ>& thePoints )
{
- QPainterPath aPath;
if ( thePoints.IsEmpty() )
- return aPath;
+ return;
if ( theType == SECTION_POLYLINE )
{
- aPath.moveTo( thePoints.Value( 1 ).X(), thePoints.Value( 1 ).Y() );
+ const gp_XYZ& aFirstPoint = thePoints.Value( 1 );
+ thePath.moveTo( aFirstPoint.X(), aFirstPoint.Y() );
for( int i = 2, n = thePoints.Size(); i <= n; ++i )
{
const gp_XYZ& aSectPoint = thePoints.Value( i );
- aPath.lineTo( aSectPoint.X(), aSectPoint.Y() );
+ thePath.lineTo( aSectPoint.X(), aSectPoint.Y() );
}
if( theIsClosed )
- aPath.closeSubpath();
+ thePath.closeSubpath();
}
else
{
HYDROData_BSplineOperation aBSpline( thePoints, theIsClosed );
- aPath = aBSpline.ComputePath();
+ aBSpline.ComputePath( thePath );
}
-
- return aPath;
}
void HYDROData_PolylineXY::Update()
NCollection_Sequence<HYDROData_PolylineXY::SectionType> aSectTypes;
NCollection_Sequence<bool> aSectClosures;
GetSections( aSectNames, aSectTypes, aSectClosures );
- if( aSectNames.IsEmpty() )
- return aPath;
- PointsList aSectPointsList = GetPoints( 0 );
- if( aSectPointsList.IsEmpty() )
- return aPath;
+ for ( int aSectionId = 1, aNbSects = aSectNames.Size(); aSectionId <= aNbSects; aSectionId++ )
+ {
+ TCollection_AsciiString aSectName = aSectNames.Value( aSectionId );
+ SectionType aSectionType = aSectTypes.Value( aSectionId );
+ bool anIsSectionClosed = aSectClosures.Value( aSectionId );
+
+ PointsList aSectPointsList = GetPoints( aSectionId - 1 );
+ if ( aSectPointsList.IsEmpty() )
+ continue;
- SectionType aSectionType = aSectTypes.Value( 1 );
- bool anIsSectionClosed = aSectClosures.Value( 1 );
+ NCollection_Sequence<gp_XYZ> aPoints;
+ for( int i = 1, n = aSectPointsList.Size(); i <= n; ++i )
+ {
+ const Point& aSectPoint = aSectPointsList.Value( i );
- NCollection_Sequence<gp_XYZ> aPoints;
- for( int i = 1, n = aSectPointsList.Size(); i <= n; ++i )
- {
- const Point& aSectPoint = aSectPointsList.Value( i );
+ gp_XYZ aPoint( aSectPoint.X(), aSectPoint.Y(), 0.0 );
+ aPoints.Append( aPoint );
+ }
- gp_XYZ aPoint( aSectPoint.X(), aSectPoint.Y(), 0.0 );
- aPoints.Append( aPoint );
+ BuildPainterPath( aPath, aSectionType, anIsSectionClosed, aPoints );
}
- aPath = BuildPainterPath( aSectionType, anIsSectionClosed, aPoints );
-
return aPath;
-
}