From aab4319f1f8306683e93dbd71ac7a02c0437fac6 Mon Sep 17 00:00:00 2001 From: adv Date: Tue, 3 Dec 2013 08:34:42 +0000 Subject: [PATCH] The building of path for Graphics view corrected (Bug #139). --- src/HYDROData/HYDROData_BSplineOperation.cxx | 17 +++--- src/HYDROData/HYDROData_BSplineOperation.h | 2 +- src/HYDROData/HYDROData_PolylineXY.cxx | 54 +++++++++---------- src/HYDROData/HYDROData_PolylineXY.h | 7 +-- .../test_HYDROData_BSplineOperation.cxx | 3 +- 5 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/HYDROData/HYDROData_BSplineOperation.cxx b/src/HYDROData/HYDROData_BSplineOperation.cxx index 128f4aec..293dbd44 100644 --- a/src/HYDROData/HYDROData_BSplineOperation.cxx +++ b/src/HYDROData/HYDROData_BSplineOperation.cxx @@ -30,32 +30,31 @@ HYDROData_BSplineOperation::HYDROData_BSplineOperation( 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; } diff --git a/src/HYDROData/HYDROData_BSplineOperation.h b/src/HYDROData/HYDROData_BSplineOperation.h index 6c91bf86..640f85bc 100644 --- a/src/HYDROData/HYDROData_BSplineOperation.h +++ b/src/HYDROData/HYDROData_BSplineOperation.h @@ -35,7 +35,7 @@ public: //! Performs conversion from BSpline curve to QPainterPath made from Bezier curves //! \returns computed PainterPath, not stored in this class, so calling of this method is not fast - QPainterPath ComputePath() const; + void ComputePath( QPainterPath& thePath ) const; private: Handle(Geom_BSplineCurve) myCurve; ///< resulting BSpline, null if something is wrong diff --git a/src/HYDROData/HYDROData_PolylineXY.cxx b/src/HYDROData/HYDROData_PolylineXY.cxx index 0d79dd23..b20f1bd8 100755 --- a/src/HYDROData/HYDROData_PolylineXY.cxx +++ b/src/HYDROData/HYDROData_PolylineXY.cxx @@ -158,35 +158,34 @@ TopoDS_Wire HYDROData_PolylineXY::BuildWire( const SectionType& return aWire; } -QPainterPath HYDROData_PolylineXY::BuildPainterPath( const SectionType& theType, - const bool& theIsClosed, - const NCollection_Sequence& thePoints ) +void HYDROData_PolylineXY::BuildPainterPath( QPainterPath& thePath, + const SectionType& theType, + const bool& theIsClosed, + const NCollection_Sequence& 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() @@ -741,29 +740,30 @@ QPainterPath HYDROData_PolylineXY::GetPainterPath() const NCollection_Sequence aSectTypes; NCollection_Sequence 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 aPoints; + for( int i = 1, n = aSectPointsList.Size(); i <= n; ++i ) + { + const Point& aSectPoint = aSectPointsList.Value( i ); - NCollection_Sequence 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; - } diff --git a/src/HYDROData/HYDROData_PolylineXY.h b/src/HYDROData/HYDROData_PolylineXY.h index 45ea7459..5ce65a94 100644 --- a/src/HYDROData/HYDROData_PolylineXY.h +++ b/src/HYDROData/HYDROData_PolylineXY.h @@ -57,9 +57,10 @@ public: /** * Returns the presentation of polyline section in Qt maner. */ - HYDRODATA_EXPORT static QPainterPath BuildPainterPath( const SectionType& theType, - const bool& theIsClosed, - const NCollection_Sequence& thePoints ); + HYDRODATA_EXPORT static void BuildPainterPath( QPainterPath& thePath, + const SectionType& theType, + const bool& theIsClosed, + const NCollection_Sequence& thePoints ); public: diff --git a/src/HYDROData/test_HYDROData_BSplineOperation.cxx b/src/HYDROData/test_HYDROData_BSplineOperation.cxx index f5310176..10dbb436 100644 --- a/src/HYDROData/test_HYDROData_BSplineOperation.cxx +++ b/src/HYDROData/test_HYDROData_BSplineOperation.cxx @@ -48,7 +48,8 @@ void test_HYDROData_BSplineOperation::testPath() CPPUNIT_ASSERT( !aBSpline.Curve().IsNull() ); - QPainterPath aPath = aBSpline.ComputePath(); + QPainterPath aPath; + aBSpline.ComputePath( aPath ); CPPUNIT_ASSERT( !aPath.isEmpty() ); /* -- 2.39.2