1
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2
* QwtPolar Widget Library
3
* Copyright (C) 2008 Uwe Rathmann
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of the Qwt License, Version 1.0
7
*****************************************************************************/
13
#include "qwt_painter.h"
15
#include "qwt_clipper.h"
16
#include "qwt_scale_map.h"
17
#include "qwt_scale_engine.h"
18
#include "qwt_scale_div.h"
19
#include "qwt_scale_draw.h"
20
#include "qwt_round_scale_draw.h"
21
#include "qwt_polar_grid.h"
23
static inline bool isClose( double value1, double value2 )
25
return qwtAbs( value1 - value2 ) < DBL_EPSILON;
28
class QwtPolarGrid::AxisData
42
mutable QwtAbstractScaleDraw *scaleDraw;
47
class QwtPolarGrid::GridData
52
isMinorVisible( false )
64
class QwtPolarGrid::PrivateData
67
GridData gridData[QwtPolar::ScaleCount];
68
AxisData axisData[QwtPolar::AxesCount];
76
Enables major and disables minor grid lines.
77
The azimuth and right radial axis are visible. all other axes
78
are hidden. Autoscaling is enabled.
80
QwtPolarGrid::QwtPolarGrid():
81
QwtPolarItem( QwtText( "Grid" ) )
83
d_data = new PrivateData;
85
for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
87
AxisData &axis = d_data->axisData[axisId];
90
case QwtPolar::AxisAzimuth:
92
axis.scaleDraw = new QwtRoundScaleDraw;
93
axis.scaleDraw->setTickLength( QwtScaleDiv::MinorTick, 2 );
94
axis.scaleDraw->setTickLength( QwtScaleDiv::MediumTick, 2 );
95
axis.scaleDraw->setTickLength( QwtScaleDiv::MajorTick, 4 );
96
axis.isVisible = true;
99
case QwtPolar::AxisLeft:
101
QwtScaleDraw *scaleDraw = new QwtScaleDraw;
102
scaleDraw->setAlignment( QwtScaleDraw::BottomScale );
104
axis.scaleDraw = scaleDraw;
105
axis.isVisible = false;
108
case QwtPolar::AxisRight:
110
QwtScaleDraw *scaleDraw = new QwtScaleDraw;
111
scaleDraw->setAlignment( QwtScaleDraw::BottomScale );
113
axis.scaleDraw = scaleDraw;
114
axis.isVisible = true;
117
case QwtPolar::AxisTop:
119
QwtScaleDraw *scaleDraw = new QwtScaleDraw;
120
scaleDraw->setAlignment( QwtScaleDraw::LeftScale );
122
axis.scaleDraw = scaleDraw;
123
axis.isVisible = false;
126
case QwtPolar::AxisBottom:
128
QwtScaleDraw *scaleDraw = new QwtScaleDraw;
129
scaleDraw->setAlignment( QwtScaleDraw::LeftScale );
131
axis.scaleDraw = scaleDraw;
132
axis.isVisible = true;
139
d_data->attributes = AutoScaling;
141
d_data->displayFlags = 0;
142
d_data->displayFlags |= SmartOriginLabel;
143
d_data->displayFlags |= HideMaxRadiusLabel;
144
d_data->displayFlags |= ClipAxisBackground;
145
d_data->displayFlags |= SmartScaleDraw;
146
d_data->displayFlags |= ClipGridLines;
149
#if QT_VERSION >= 0x040000
150
setRenderHint( RenderAntialiased, true );
155
QwtPolarGrid::~QwtPolarGrid()
160
//! \return QwtPlotItem::Rtti_PolarGrid
161
int QwtPolarGrid::rtti() const
163
return QwtPolarItem::Rtti_PolarGrid;
167
Change the display flags
169
\param flag See DisplayFlag
172
void QwtPolarGrid::setDisplayFlag( DisplayFlag flag, bool on )
174
if ((( d_data->displayFlags & flag ) != 0 ) != on )
177
d_data->displayFlags |= flag;
179
d_data->displayFlags &= ~flag;
186
\return true, if flag is enabled
187
\param flag See DisplayFlag
189
bool QwtPolarGrid::testDisplayFlag( DisplayFlag flag ) const
191
return ( d_data->displayFlags & flag );
195
\brief Specify an attribute for the grid
197
\param attribute Grid attribute
200
/sa GridAttribute, testGridAttribute(), updateScaleDiv(),
201
QwtPolarPlot::zoom(), QwtPolarPlot::scaleDiv()
203
void QwtPolarGrid::setGridAttribute( GridAttribute attribute, bool on )
205
if ( bool( d_data->attributes & attribute ) == on )
209
d_data->attributes |= attribute;
211
d_data->attributes &= ~attribute;
217
\return true, if attribute is enabled
218
\sa GridAttribute, setGridAttribute()
220
bool QwtPolarGrid::testGridAttribute( GridAttribute attribute ) const
222
return d_data->attributes & attribute;
226
Assign a pen for painting an axis
228
\param axisId Axis id (QwtPolar::Axis)
233
void QwtPolarGrid::setAxisPen( int axisId, const QPen &pen )
235
if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
238
AxisData &axisData = d_data->axisData[axisId];
239
if ( axisData.pen != pen )
247
Show/Hide grid lines for a scale
249
\param scaleId Scale id ( QwtPolar::Scale )
250
\param show true/false
252
void QwtPolarGrid::showGrid( int scaleId, bool show )
254
if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
257
GridData &grid = d_data->gridData[scaleId];
258
if ( grid.isVisible != show )
260
grid.isVisible = show;
266
\return true if grid lines are enabled
267
\param scaleId Scale id ( QwtPolar::Scale )
268
\sa QwtPolar::Scale, showGrid()
270
bool QwtPolarGrid::isGridVisible( int scaleId ) const
272
if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
275
return d_data->gridData[scaleId].isVisible;
279
Show/Hide minor grid lines for a scale
281
To display minor grid lines. showGrid() needs to be enabled too.
283
\param scaleId Scale id ( QwtPolar::Scale )
284
\param show true/false
288
void QwtPolarGrid::showMinorGrid( int scaleId, bool show )
290
if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
293
GridData &grid = d_data->gridData[scaleId];
294
if ( grid.isMinorVisible != show )
296
grid.isMinorVisible = show;
302
\return true if minor grid lines are enabled
303
\param scaleId Scale id ( QwtPolar::Scale )
306
bool QwtPolarGrid::isMinorGridVisible( int scaleId ) const
308
if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
311
return d_data->gridData[scaleId].isMinorVisible;
317
\param axisId Axis id (QwtPolar::Axis)
318
\param show true/false
322
void QwtPolarGrid::showAxis( int axisId, bool show )
324
if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
327
AxisData &axisData = d_data->axisData[axisId];
328
if ( axisData.isVisible != show )
330
axisData.isVisible = show;
336
\return true if the axis is visible
337
\param axisId Axis id (QwtPolar::Axis)
341
bool QwtPolarGrid::isAxisVisible( int axisId ) const
343
if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
346
return d_data->axisData[axisId].isVisible;
350
Assign a pen for all axes and grid lines
353
\sa setMajorGridPen(), setMinorGridPen(), setAxisPen()
355
void QwtPolarGrid::setPen( const QPen &pen )
357
bool isChanged = false;
359
for ( int scaleId = 0; scaleId < QwtPolar::ScaleCount; scaleId++ )
361
GridData &grid = d_data->gridData[scaleId];
362
if ( grid.majorPen != pen || grid.minorPen != pen )
369
for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
371
AxisData &axis = d_data->axisData[axisId];
372
if ( axis.pen != pen )
383
Assign a font for all scale tick labels
388
void QwtPolarGrid::setFont( const QFont &font )
390
bool isChanged = false;
391
for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
393
AxisData &axis = d_data->axisData[axisId];
394
if ( axis.font != font )
405
Assign a pen for the major grid lines
408
\sa setPen(), setMinorGridPen(), majorGridPen
410
void QwtPolarGrid::setMajorGridPen( const QPen &pen )
412
bool isChanged = false;
414
for ( int scaleId = 0; scaleId < QwtPolar::ScaleCount; scaleId++ )
416
GridData &grid = d_data->gridData[scaleId];
417
if ( grid.majorPen != pen )
428
Assign a pen for the major grid lines of a specific scale
430
\param scaleId Scale id ( QwtPolar::Scale )
432
\sa setPen(), setMinorGridPen(), majorGridPen
434
void QwtPolarGrid::setMajorGridPen( int scaleId, const QPen &pen )
436
if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
439
GridData &grid = d_data->gridData[scaleId];
440
if ( grid.majorPen != pen )
448
\return Pen for painting the major grid lines of a specific scale
449
\param scaleId Scale id ( QwtPolar::Scale )
450
\sa setMajorGridPen(), minorGridPen()
452
QPen QwtPolarGrid::majorGridPen( int scaleId ) const
454
if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
457
const GridData &grid = d_data->gridData[scaleId];
458
return grid.majorPen;
462
Assign a pen for the minor grid lines
465
\sa setPen(), setMajorGridPen(), minorGridPen()
467
void QwtPolarGrid::setMinorGridPen( const QPen &pen )
469
bool isChanged = false;
471
for ( int scaleId = 0; scaleId < QwtPolar::ScaleCount; scaleId++ )
473
GridData &grid = d_data->gridData[scaleId];
474
if ( grid.minorPen != pen )
485
Assign a pen for the minor grid lines of a specific scale
487
\param scaleId Scale id ( QwtPolar::Scale )
489
\sa setPen(), setMajorGridPen(), minorGridPen
491
void QwtPolarGrid::setMinorGridPen( int scaleId, const QPen &pen )
493
if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
496
GridData &grid = d_data->gridData[scaleId];
497
if ( grid.minorPen != pen )
505
\return Pen for painting the minor grid lines of a specific scale
506
\param scaleId Scale id ( QwtPolar::Scale )
508
QPen QwtPolarGrid::minorGridPen( int scaleId ) const
510
if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
513
const GridData &grid = d_data->gridData[scaleId];
514
return grid.minorPen;
518
\return Pen for painting a specific axis
520
\param axisId Axis id (QwtPolar::Axis)
523
QPen QwtPolarGrid::axisPen( int axisId ) const
525
if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
528
return d_data->axisData[axisId].pen;
532
Assign a font for the tick labels of a specific axis
534
\param axisId Axis id (QwtPolar::Axis)
537
void QwtPolarGrid::setAxisFont( int axisId, const QFont &font )
539
if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
542
AxisData &axisData = d_data->axisData[axisId];
543
if ( axisData.font != font )
545
axisData.font = font;
551
\return Font for the tick labels of a specific axis
552
\param axisId Axis id (QwtPolar::Axis)
554
QFont QwtPolarGrid::axisFont( int axisId ) const
556
if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
559
return d_data->axisData[axisId].font;
563
Draw the grid and axes
565
\param painter Painter
566
\param azimuthMap Maps azimuth values to values related to 0.0, M_2PI
567
\param radialMap Maps radius values into painter coordinates.
568
\param pole Position of the pole in painter coordinates
569
\param radius Radius of the complete plot area in painter coordinates
570
\param canvasRect Contents rect of the canvas in painter coordinates
572
void QwtPolarGrid::draw( QPainter *painter,
573
const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap,
574
const QwtDoublePoint &pole, double radius,
575
const QwtDoubleRect &canvasRect ) const
577
updateScaleDraws( azimuthMap, radialMap, pole, radius );
581
if ( testDisplayFlag( ClipAxisBackground ) )
583
QRegion clipRegion( canvasRect.toRect() );
584
for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
586
const AxisData &axis = d_data->axisData[axisId];
587
if ( axisId != QwtPolar::AxisAzimuth && axis.isVisible )
589
QwtScaleDraw *scaleDraw = ( QwtScaleDraw * )axis.scaleDraw;
590
if ( scaleDraw->hasComponent( QwtScaleDraw::Labels ) )
592
const QwtValueList &ticks =
593
scaleDraw->scaleDiv().ticks( QwtScaleDiv::MajorTick );
594
for ( int i = 0; i < int( ticks.size() ); i++ )
597
scaleDraw->boundingLabelRect( axis.font, ticks[i] );
599
const int margin = 2;
601
labelRect.x() - margin,
602
labelRect.y() - margin,
603
labelRect.width() + 2 * margin,
604
labelRect.height() + 2 * margin
607
if ( labelRect.isValid() )
608
clipRegion -= QRegion( labelRect );
613
painter->setClipRegion( clipRegion );
618
const GridData &radialGrid = d_data->gridData[QwtPolar::Radius];
619
if ( radialGrid.isVisible && radialGrid.isMinorVisible )
621
painter->setPen( radialGrid.minorPen );
623
drawCircles( painter, canvasRect, pole, radialMap,
624
radialGrid.scaleDiv.ticks( QwtScaleDiv::MinorTick ) );
625
drawCircles( painter, canvasRect, pole, radialMap,
626
radialGrid.scaleDiv.ticks( QwtScaleDiv::MediumTick ) );
628
if ( radialGrid.isVisible )
630
painter->setPen( radialGrid.majorPen );
632
drawCircles( painter, canvasRect, pole, radialMap,
633
radialGrid.scaleDiv.ticks( QwtScaleDiv::MajorTick ) );
638
const GridData &azimuthGrid =
639
d_data->gridData[QwtPolar::Azimuth];
641
if ( azimuthGrid.isVisible && azimuthGrid.isMinorVisible )
643
painter->setPen( azimuthGrid.minorPen );
645
drawRays( painter, canvasRect, pole, radius, azimuthMap,
646
azimuthGrid.scaleDiv.ticks( QwtScaleDiv::MinorTick ) );
647
drawRays( painter, canvasRect, pole, radius, azimuthMap,
648
azimuthGrid.scaleDiv.ticks( QwtScaleDiv::MediumTick ) );
650
if ( azimuthGrid.isVisible )
652
painter->setPen( azimuthGrid.majorPen );
654
drawRays( painter, canvasRect, pole, radius, azimuthMap,
655
azimuthGrid.scaleDiv.ticks( QwtScaleDiv::MajorTick ) );
659
for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
661
const AxisData &axis = d_data->axisData[axisId];
662
if ( axis.isVisible )
665
drawAxis( painter, axisId );
672
Draw lines from the pole
674
\param painter Painter
675
\param canvasRect Contents rect of the canvas in painter coordinates
676
\param pole Position of the pole in painter coordinates
677
\param radius Length of the lines in painter coordinates
678
\param azimuthMap Maps azimuth values to values related to 0.0, M_2PI
679
\param values Azimuth values, indicating the direction of the lines
681
void QwtPolarGrid::drawRays(
682
QPainter *painter, const QwtDoubleRect &canvasRect,
683
const QwtDoublePoint &pole, double radius,
684
const QwtScaleMap &azimuthMap, const QwtValueList &values ) const
686
for ( int i = 0; i < int( values.size() ); i++ )
688
double azimuth = azimuthMap.xTransform( values[i] );
689
azimuth = ::fmod( azimuth, 2 * M_PI );
691
bool skipLine = false;
692
if ( testDisplayFlag( SmartScaleDraw ) )
694
const QwtAbstractScaleDraw::ScaleComponent bone =
695
QwtAbstractScaleDraw::Backbone;
696
if ( isClose( azimuth, 0.0 ) )
698
const AxisData &axis = d_data->axisData[QwtPolar::AxisRight];
699
if ( axis.isVisible && axis.scaleDraw->hasComponent( bone ) )
702
else if ( isClose( azimuth, M_PI / 2 ) )
704
const AxisData &axis = d_data->axisData[QwtPolar::AxisTop];
705
if ( axis.isVisible && axis.scaleDraw->hasComponent( bone ) )
708
else if ( isClose( azimuth, M_PI ) )
710
const AxisData &axis = d_data->axisData[QwtPolar::AxisLeft];
711
if ( axis.isVisible && axis.scaleDraw->hasComponent( bone ) )
714
else if ( isClose( azimuth, 3 * M_PI / 2.0 ) )
716
const AxisData &axis = d_data->axisData[QwtPolar::AxisBottom];
717
if ( axis.isVisible && axis.scaleDraw->hasComponent( bone ) )
723
const QwtDoublePoint pos = qwtPolar2Pos( pole, radius, azimuth );
726
Qt4 is horrible slow, when painting primitives,
727
with coordinates far outside the visible area.
731
pa.setPoint( 0, pole.toPoint() );
732
pa.setPoint( 1, pos.toPoint() );
734
if ( testDisplayFlag( ClipGridLines ) )
735
pa = QwtClipper::clipPolygon( canvasRect.toRect(), pa );
737
QwtPainter::drawPolyline( painter, pa );
745
\param painter Painter
746
\param canvasRect Contents rect of the canvas in painter coordinates
747
\param pole Position of the pole in painter coordinates
748
\param radialMap Maps radius values into painter coordinates.
749
\param values Radial values, indicating the distances from the pole
751
void QwtPolarGrid::drawCircles(
752
QPainter *painter, const QwtDoubleRect &canvasRect,
753
const QwtDoublePoint &pole, const QwtScaleMap &radialMap,
754
const QwtValueList &values ) const
756
for ( int i = 0; i < int( values.size() ); i++ )
758
const double val = values[i];
760
const GridData &gridData =
761
d_data->gridData[QwtPolar::Radius];
763
bool skipLine = false;
764
if ( testDisplayFlag( SmartScaleDraw ) )
766
const AxisData &axis = d_data->axisData[QwtPolar::AxisAzimuth];
767
if ( axis.isVisible &&
768
axis.scaleDraw->hasComponent( QwtAbstractScaleDraw::Backbone ) )
770
#if QWT_VERSION < 0x050200
771
if ( isClose( val, gridData.scaleDiv.hBound() ) )
773
if ( isClose( val, gridData.scaleDiv.upperBound() ) )
779
#if QWT_VERSION < 0x050200
780
if ( isClose( val, gridData.scaleDiv.lBound() ) )
782
if ( isClose( val, gridData.scaleDiv.lowerBound() ) )
788
const double radius = radialMap.transform( val );
790
QwtDoubleRect outerRect( 0, 0, 2 * radius, 2 * radius );
791
outerRect.moveCenter( pole );
793
#if QT_VERSION < 0x040000
794
QwtPainter::drawEllipse( painter, outerRect.toRect() );
796
if ( testDisplayFlag( ClipGridLines ) )
800
Qt4 is horrible slow, when painting primitives,
801
with coordinates far outside the visible area.
805
const QwtArray<QwtDoubleInterval> angles =
806
QwtClipper::clipCircle( canvasRect, pole, radius );
807
for ( int i = 0; i < angles.size(); i++ )
809
const QwtDoubleInterval intv = angles[i];
810
if ( intv.minValue() == 0 && intv.maxValue() == 2 * M_PI )
811
QwtPainter::drawEllipse( painter, outerRect.toRect() );
814
const double from = intv.minValue() / M_PI * 180;
815
const double to = intv.maxValue() / M_PI * 180;
816
double span = to - from;
820
const QwtMetricsMap &mm = QwtPainter::metricsMap();
821
const QRect r = outerRect.toRect();
823
painter->drawArc( mm.layoutToDevice( r, painter ),
824
qRound( from * 16 ), qRound( span * 16 ) );
831
QwtPainter::drawEllipse( painter, outerRect.toRect() );
841
\param painter Painter
842
\param axisId Axis id (QwtPolar::Axis)
844
void QwtPolarGrid::drawAxis( QPainter *painter, int axisId ) const
846
if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
849
AxisData &axis = d_data->axisData[axisId];
851
painter->setPen( axis.pen );
852
painter->setFont( axis.font );
854
#if QT_VERSION < 0x040000
856
cg.setColor( QColorGroup::Foreground, axis.pen.color() );
857
cg.setColor( QColorGroup::Text, axis.pen.color() );
859
axis.scaleDraw->draw( painter, cg );
862
pal.setColor( QPalette::Foreground, axis.pen.color() );
863
pal.setColor( QPalette::Text, axis.pen.color() );
865
axis.scaleDraw->draw( painter, pal );
870
Update the axis scale draw geometries
872
\param azimuthMap Maps azimuth values to values related to 0.0, M_2PI
873
\param radialMap Maps radius values into painter coordinates.
874
\param pole Position of the pole in painter coordinates
875
\param radius Radius of the complete plot area in painter coordinates
879
void QwtPolarGrid::updateScaleDraws(
880
const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap,
881
const QwtDoublePoint &pole, double radius ) const
883
const QPoint p = pole.toPoint();
885
const QwtDoubleInterval interval =
886
d_data->gridData[QwtPolar::ScaleRadius].scaleDiv.interval();
888
const int min = radialMap.transform( interval.minValue() );
889
const int max = radialMap.transform( interval.maxValue() );
890
const int l = max - min;
892
for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
894
AxisData &axis = d_data->axisData[axisId];
896
if ( axisId == QwtPolar::AxisAzimuth )
898
QwtRoundScaleDraw *scaleDraw = ( QwtRoundScaleDraw * )axis.scaleDraw;
900
scaleDraw->setRadius( qRound( radius ) );
901
scaleDraw->moveCenter( p );
903
double from = ::fmod( 90.0 - azimuthMap.p1() * 180.0 / M_PI, 360.0 );
907
scaleDraw->setAngleRange( from, from - 360.0 );
908
scaleDraw->setTransformation( azimuthMap.transformation()->copy() );
912
QwtScaleDraw *scaleDraw = ( QwtScaleDraw * )axis.scaleDraw;
915
case QwtPolar::AxisLeft:
917
scaleDraw->move( p.x() - min, p.y() );
918
scaleDraw->setLength( -l );
921
case QwtPolar::AxisRight:
923
scaleDraw->move( p.x() + min, p.y() );
924
scaleDraw->setLength( l );
927
case QwtPolar::AxisTop:
929
scaleDraw->move( p.x(), p.y() - max );
930
scaleDraw->setLength( l );
933
case QwtPolar::AxisBottom:
935
scaleDraw->move( p.x(), p.y() + max );
936
scaleDraw->setLength( -l );
940
scaleDraw->setTransformation( radialMap.transformation()->copy() );
946
\brief Update the item to changes of the axes scale division
948
If AutoScaling is enabled the radial scale is calculated
949
from the interval, otherwise the scales are adopted to
952
\param azimuthScaleDiv Scale division of the azimuth-scale
953
\param radialScaleDiv Scale division of the radius-axis
954
\param interval The interval of the radius-axis, that is
955
visible on the canvas
957
\sa QwtPolarPlot::setGridAttributes()
960
void QwtPolarGrid::updateScaleDiv( const QwtScaleDiv &azimuthScaleDiv,
961
const QwtScaleDiv &radialScaleDiv, const QwtDoubleInterval &interval )
963
GridData &radialGrid = d_data->gridData[QwtPolar::Radius];
965
const QwtPolarPlot *plt = plot();
966
if ( plt && testGridAttribute( AutoScaling ) )
968
const QwtScaleEngine *se = plt->scaleEngine( QwtPolar::Radius );
969
radialGrid.scaleDiv = se->divideScale(
970
interval.minValue(), interval.maxValue(),
971
plt->scaleMaxMajor( QwtPolar::Radius ),
972
plt->scaleMaxMinor( QwtPolar::Radius ), 0 );
976
if ( radialGrid.scaleDiv != radialScaleDiv )
977
radialGrid.scaleDiv = radialScaleDiv;
980
GridData &azimuthGrid = d_data->gridData[QwtPolar::Azimuth];
981
if ( azimuthGrid.scaleDiv != azimuthScaleDiv )
983
azimuthGrid.scaleDiv = azimuthScaleDiv;
986
bool hasOrigin = false;
987
for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
989
AxisData &axis = d_data->axisData[axisId];
990
if ( axis.isVisible && axis.scaleDraw )
992
if ( axisId == QwtPolar::AxisAzimuth )
994
axis.scaleDraw->setScaleDiv( azimuthGrid.scaleDiv );
995
if ( testDisplayFlag( SmartScaleDraw ) )
997
axis.scaleDraw->enableComponent(
998
QwtAbstractScaleDraw::Ticks, !azimuthGrid.isVisible );
1003
QwtScaleDiv sd = radialGrid.scaleDiv;
1005
QwtValueList &ticks =
1006
( QwtValueList & )sd.ticks( QwtScaleDiv::MajorTick );
1008
if ( testDisplayFlag( SmartOriginLabel ) )
1010
bool skipOrigin = hasOrigin;
1013
if ( axisId == QwtPolar::AxisLeft
1014
|| axisId == QwtPolar::AxisRight )
1016
if ( d_data->axisData[QwtPolar::AxisBottom].isVisible )
1021
if ( d_data->axisData[QwtPolar::AxisLeft].isVisible )
1025
#if QWT_VERSION < 0x050200
1026
if ( ticks.size() > 0 && ticks.first() == sd.lBound() )
1028
if ( ticks.size() > 0 && ticks.first() == sd.lowerBound() )
1033
#if QT_VERSION < 0x040000
1036
ticks.removeFirst();
1044
if ( testDisplayFlag( HideMaxRadiusLabel ) )
1046
#if QWT_VERSION < 0x050200
1047
if ( ticks.size() > 0 && ticks.last() == sd.hBound() )
1049
if ( ticks.size() > 0 && ticks.last() == sd.upperBound() )
1051
#if QT_VERSION < 0x040000
1058
axis.scaleDraw->setScaleDiv( sd );
1060
if ( testDisplayFlag( SmartScaleDraw ) )
1062
axis.scaleDraw->enableComponent(
1063
QwtAbstractScaleDraw::Ticks, !radialGrid.isVisible );
1072
\return Number of pixels, that are necessary to paint the azimuth scale
1073
\sa QwtRoundScaleDraw::extent()
1075
int QwtPolarGrid::marginHint() const
1077
const AxisData &axis = d_data->axisData[QwtPolar::AxisAzimuth];
1078
if ( axis.isVisible )
1080
const int extent = axis.scaleDraw->extent( axis.pen, axis.font );
1088
Returns the scale draw of a specified axis
1090
\param axisId axis index ( QwtPolar::AxisLeft <= axisId <= QwtPolar::AxisBottom)
1091
\return specified scaleDraw for axis, or NULL if axis is invalid.
1092
\sa azimuthScaleDraw()
1094
const QwtScaleDraw *QwtPolarGrid::scaleDraw( int axisId ) const
1096
if ( axisId >= QwtPolar::AxisLeft || axisId <= QwtPolar::AxisBottom )
1097
return ( QwtScaleDraw * )d_data->axisData[axisId].scaleDraw;
1103
Returns the scale draw of a specified axis
1105
\param axisId axis index ( QwtPolar::AxisLeft <= axisId <= QwtPolar::AxisBottom)
1106
\return specified scaleDraw for axis, or NULL if axis is invalid.
1107
\sa setScaleDraw(), azimuthScaleDraw()
1109
QwtScaleDraw *QwtPolarGrid::scaleDraw( int axisId )
1111
if ( axisId >= QwtPolar::AxisLeft || axisId <= QwtPolar::AxisBottom )
1112
return ( QwtScaleDraw * )d_data->axisData[axisId].scaleDraw;
1118
\brief Set a scale draw
1120
\param axisId axis index ( QwtPolar::AxisLeft <= axisId <= QwtPolar::AxisBottom)
1121
\param scaleDraw object responsible for drawing scales.
1123
\sa scaleDraw(), setAzimuthScaleDraw()
1125
void QwtPolarGrid::setScaleDraw( int axisId, QwtScaleDraw *scaleDraw )
1127
if ( axisId < QwtPolar::AxisLeft || axisId > QwtPolar::AxisBottom )
1130
AxisData &axisData = d_data->axisData[axisId];
1131
if ( axisData.scaleDraw != scaleDraw )
1133
delete axisData.scaleDraw;
1134
axisData.scaleDraw = scaleDraw;
1140
Returns the scale draw of the azimuth axis
1141
\sa setAzimuthScaleDraw(), scaleDraw()
1143
const QwtRoundScaleDraw *QwtPolarGrid::azimuthScaleDraw() const
1145
return ( QwtRoundScaleDraw * )d_data->axisData[QwtPolar::AxisAzimuth].scaleDraw;
1149
Returns the scale draw of the azimuth axis
1150
\sa setAzimuthScaleDraw(), scaleDraw()
1152
QwtRoundScaleDraw *QwtPolarGrid::azimuthScaleDraw()
1154
return ( QwtRoundScaleDraw * )d_data->axisData[QwtPolar::AxisAzimuth].scaleDraw;
1158
\brief Set a scale draw for the azimuth scale
1160
\param scaleDraw object responsible for drawing scales.
1161
\sa azimuthScaleDraw(), setScaleDraw()
1163
void QwtPolarGrid::setAzimuthScaleDraw( QwtRoundScaleDraw *scaleDraw )
1165
AxisData &axisData = d_data->axisData[QwtPolar::AxisAzimuth];
1166
if ( axisData.scaleDraw != scaleDraw )
1168
delete axisData.scaleDraw;
1169
axisData.scaleDraw = scaleDraw;