qwt_polar_grid.cpp
Go to the documentation of this file.
1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2  * QwtPolar Widget Library
3  * Copyright (C) 2008 Uwe Rathmann
4  *
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  *****************************************************************************/
8 
9 #include "qwt_polar_grid.h"
10 #include "qwt_painter.h"
11 #include "qwt_text.h"
12 #include "qwt_clipper.h"
13 #include "qwt_scale_map.h"
14 #include "qwt_scale_engine.h"
15 #include "qwt_scale_div.h"
16 #include "qwt_scale_draw.h"
17 #include "qwt_round_scale_draw.h"
18 
19 #include <qpainter.h>
20 #include <qpen.h>
21 #include <float.h>
22 
23 static inline bool isClose( double value1, double value2 )
24 {
25  return qAbs( value1 - value2 ) < DBL_EPSILON;
26 }
27 
29 {
30 public:
32  isVisible( false ),
33  scaleDraw( NULL )
34  {
35  }
37  {
38  delete scaleDraw;
39  }
40 
41  bool isVisible;
43  QPen pen;
44  QFont font;
45 };
46 
48 {
49 public:
51  isVisible( true ),
52  isMinorVisible( false )
53  {
54  }
55 
56  bool isVisible;
59 
60  QPen majorPen;
61  QPen minorPen;
62 };
63 
65 {
66 public:
71 };
72 
81  QwtPolarItem( QwtText( "Grid" ) )
82 {
83  d_data = new PrivateData;
84 
85  for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
86  {
87  AxisData &axis = d_data->axisData[axisId];
88  switch( axisId )
89  {
91  {
92  axis.scaleDraw = new QwtRoundScaleDraw;
96  axis.isVisible = true;
97  break;
98  }
99  case QwtPolar::AxisLeft:
100  {
103 
104  axis.scaleDraw = scaleDraw;
105  axis.isVisible = false;
106  break;
107  }
108  case QwtPolar::AxisRight:
109  {
112 
113  axis.scaleDraw = scaleDraw;
114  axis.isVisible = true;
115  break;
116  }
117  case QwtPolar::AxisTop:
118  {
121 
122  axis.scaleDraw = scaleDraw;
123  axis.isVisible = false;
124  break;
125  }
127  {
130 
131  axis.scaleDraw = scaleDraw;
132  axis.isVisible = true;
133  break;
134  }
135  default:;
136  }
137  }
138 
140 
147 
148  setZ( 10.0 );
150 }
151 
154 {
155  delete d_data;
156 }
157 
160 {
162 }
163 
171 {
172  if ( ( ( d_data->displayFlags & flag ) != 0 ) != on )
173  {
174  if ( on )
175  d_data->displayFlags |= flag;
176  else
177  d_data->displayFlags &= ~flag;
178 
179  itemChanged();
180  }
181 }
182 
188 {
189  return ( d_data->displayFlags & flag );
190 }
191 
202 {
203  if ( bool( d_data->attributes & attribute ) == on )
204  return;
205 
206  if ( on )
207  d_data->attributes |= attribute;
208  else
209  d_data->attributes &= ~attribute;
210 
211  itemChanged();
212 }
213 
219 {
220  return d_data->attributes & attribute;
221 }
222 
231 void QwtPolarGrid::setAxisPen( int axisId, const QPen &pen )
232 {
233  if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
234  return;
235 
236  AxisData &axisData = d_data->axisData[axisId];
237  if ( axisData.pen != pen )
238  {
239  axisData.pen = pen;
240  itemChanged();
241  }
242 }
243 
250 void QwtPolarGrid::showGrid( int scaleId, bool show )
251 {
252  if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
253  return;
254 
255  GridData &grid = d_data->gridData[scaleId];
256  if ( grid.isVisible != show )
257  {
258  grid.isVisible = show;
259  itemChanged();
260  }
261 }
262 
268 bool QwtPolarGrid::isGridVisible( int scaleId ) const
269 {
270  if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
271  return false;
272 
273  return d_data->gridData[scaleId].isVisible;
274 }
275 
286 void QwtPolarGrid::showMinorGrid( int scaleId, bool show )
287 {
288  if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
289  return;
290 
291  GridData &grid = d_data->gridData[scaleId];
292  if ( grid.isMinorVisible != show )
293  {
294  grid.isMinorVisible = show;
295  itemChanged();
296  }
297 }
298 
304 bool QwtPolarGrid::isMinorGridVisible( int scaleId ) const
305 {
306  if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
307  return false;
308 
309  return d_data->gridData[scaleId].isMinorVisible;
310 }
311 
320 void QwtPolarGrid::showAxis( int axisId, bool show )
321 {
322  if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
323  return;
324 
325  AxisData &axisData = d_data->axisData[axisId];
326  if ( axisData.isVisible != show )
327  {
328  axisData.isVisible = show;
329  itemChanged();
330  }
331 }
332 
339 bool QwtPolarGrid::isAxisVisible( int axisId ) const
340 {
341  if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
342  return false;
343 
344  return d_data->axisData[axisId].isVisible;
345 }
346 
353 void QwtPolarGrid::setPen( const QPen &pen )
354 {
355  bool isChanged = false;
356 
357  for ( int scaleId = 0; scaleId < QwtPolar::ScaleCount; scaleId++ )
358  {
359  GridData &grid = d_data->gridData[scaleId];
360  if ( grid.majorPen != pen || grid.minorPen != pen )
361  {
362  grid.majorPen = pen;
363  grid.minorPen = pen;
364  isChanged = true;
365  }
366  }
367  for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
368  {
369  AxisData &axis = d_data->axisData[axisId];
370  if ( axis.pen != pen )
371  {
372  axis.pen = pen;
373  isChanged = true;
374  }
375  }
376  if ( isChanged )
377  itemChanged();
378 }
379 
386 void QwtPolarGrid::setFont( const QFont &font )
387 {
388  bool isChanged = false;
389  for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
390  {
391  AxisData &axis = d_data->axisData[axisId];
392  if ( axis.font != font )
393  {
394  axis.font = font;
395  isChanged = true;
396  }
397  }
398  if ( isChanged )
399  itemChanged();
400 }
401 
408 void QwtPolarGrid::setMajorGridPen( const QPen &pen )
409 {
410  bool isChanged = false;
411 
412  for ( int scaleId = 0; scaleId < QwtPolar::ScaleCount; scaleId++ )
413  {
414  GridData &grid = d_data->gridData[scaleId];
415  if ( grid.majorPen != pen )
416  {
417  grid.majorPen = pen;
418  isChanged = true;
419  }
420  }
421  if ( isChanged )
422  itemChanged();
423 }
424 
432 void QwtPolarGrid::setMajorGridPen( int scaleId, const QPen &pen )
433 {
434  if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
435  return;
436 
437  GridData &grid = d_data->gridData[scaleId];
438  if ( grid.majorPen != pen )
439  {
440  grid.majorPen = pen;
441  itemChanged();
442  }
443 }
444 
450 QPen QwtPolarGrid::majorGridPen( int scaleId ) const
451 {
452  if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
453  return QPen();
454 
455  const GridData &grid = d_data->gridData[scaleId];
456  return grid.majorPen;
457 }
458 
465 void QwtPolarGrid::setMinorGridPen( const QPen &pen )
466 {
467  bool isChanged = false;
468 
469  for ( int scaleId = 0; scaleId < QwtPolar::ScaleCount; scaleId++ )
470  {
471  GridData &grid = d_data->gridData[scaleId];
472  if ( grid.minorPen != pen )
473  {
474  grid.minorPen = pen;
475  isChanged = true;
476  }
477  }
478  if ( isChanged )
479  itemChanged();
480 }
481 
489 void QwtPolarGrid::setMinorGridPen( int scaleId, const QPen &pen )
490 {
491  if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
492  return;
493 
494  GridData &grid = d_data->gridData[scaleId];
495  if ( grid.minorPen != pen )
496  {
497  grid.minorPen = pen;
498  itemChanged();
499  }
500 }
501 
506 QPen QwtPolarGrid::minorGridPen( int scaleId ) const
507 {
508  if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount )
509  return QPen();
510 
511  const GridData &grid = d_data->gridData[scaleId];
512  return grid.minorPen;
513 }
514 
521 QPen QwtPolarGrid::axisPen( int axisId ) const
522 {
523  if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
524  return QPen();
525 
526  return d_data->axisData[axisId].pen;
527 }
528 
535 void QwtPolarGrid::setAxisFont( int axisId, const QFont &font )
536 {
537  if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
538  return;
539 
540  AxisData &axisData = d_data->axisData[axisId];
541  if ( axisData.font != font )
542  {
543  axisData.font = font;
544  itemChanged();
545  }
546 }
547 
552 QFont QwtPolarGrid::axisFont( int axisId ) const
553 {
554  if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
555  return QFont();
556 
557  return d_data->axisData[axisId].font;
558 }
559 
570 void QwtPolarGrid::draw( QPainter *painter,
571  const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap,
572  const QPointF &pole, double radius,
573  const QRectF &canvasRect ) const
574 {
575  updateScaleDraws( azimuthMap, radialMap, pole, radius );
576 
577  painter->save();
578 
580  {
581  QRegion clipRegion( canvasRect.toRect() );
582  for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
583  {
584  const AxisData &axis = d_data->axisData[axisId];
585  if ( axisId != QwtPolar::AxisAzimuth && axis.isVisible )
586  {
587  QwtScaleDraw *scaleDraw = static_cast<QwtScaleDraw *>( axis.scaleDraw );
588  if ( scaleDraw->hasComponent( QwtScaleDraw::Labels ) )
589  {
590  const QList<double> &ticks =
591  scaleDraw->scaleDiv().ticks( QwtScaleDiv::MajorTick );
592  for ( int i = 0; i < int( ticks.size() ); i++ )
593  {
594  if ( !scaleDraw->scaleDiv().contains( ticks[i] ) )
595  continue;
596 
597  QRect labelRect =
598  scaleDraw->boundingLabelRect( axis.font, ticks[i] );
599 
600  const int margin = 2;
601  labelRect.adjust( -margin, -margin, margin, margin );
602 
603  if ( labelRect.isValid() )
604  clipRegion -= QRegion( labelRect );
605  }
606  }
607  }
608  }
609  painter->setClipRegion( clipRegion );
610  }
611 
612  // draw radial grid
613 
614  const GridData &radialGrid = d_data->gridData[QwtPolar::Radius];
615  if ( radialGrid.isVisible && radialGrid.isMinorVisible )
616  {
617  painter->setPen( radialGrid.minorPen );
618 
619  drawCircles( painter, canvasRect, pole, radialMap,
620  radialGrid.scaleDiv.ticks( QwtScaleDiv::MinorTick ) );
621  drawCircles( painter, canvasRect, pole, radialMap,
622  radialGrid.scaleDiv.ticks( QwtScaleDiv::MediumTick ) );
623  }
624  if ( radialGrid.isVisible )
625  {
626  painter->setPen( radialGrid.majorPen );
627 
628  drawCircles( painter, canvasRect, pole, radialMap,
629  radialGrid.scaleDiv.ticks( QwtScaleDiv::MajorTick ) );
630  }
631 
632  // draw azimuth grid
633 
634  const GridData &azimuthGrid =
636 
637  if ( azimuthGrid.isVisible && azimuthGrid.isMinorVisible )
638  {
639  painter->setPen( azimuthGrid.minorPen );
640 
641  drawRays( painter, canvasRect, pole, radius, azimuthMap,
642  azimuthGrid.scaleDiv.ticks( QwtScaleDiv::MinorTick ) );
643  drawRays( painter, canvasRect, pole, radius, azimuthMap,
644  azimuthGrid.scaleDiv.ticks( QwtScaleDiv::MediumTick ) );
645  }
646  if ( azimuthGrid.isVisible )
647  {
648  painter->setPen( azimuthGrid.majorPen );
649 
650  drawRays( painter, canvasRect, pole, radius, azimuthMap,
651  azimuthGrid.scaleDiv.ticks( QwtScaleDiv::MajorTick ) );
652  }
653  painter->restore();
654 
655  for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
656  {
657  const AxisData &axis = d_data->axisData[axisId];
658  if ( axis.isVisible )
659  {
660  painter->save();
661  drawAxis( painter, axisId );
662  painter->restore();
663  }
664  }
665 }
666 
678  QPainter *painter, const QRectF &canvasRect,
679  const QPointF &pole, double radius,
680  const QwtScaleMap &azimuthMap, const QList<double> &values ) const
681 {
682  for ( int i = 0; i < int( values.size() ); i++ )
683  {
684  double azimuth = azimuthMap.transform( values[i] );
685  azimuth = ::fmod( azimuth, 2 * M_PI );
686 
687  bool skipLine = false;
689  {
692  if ( isClose( azimuth, 0.0 ) )
693  {
695  if ( axis.isVisible && axis.scaleDraw->hasComponent( bone ) )
696  skipLine = true;
697  }
698  else if ( isClose( azimuth, M_PI / 2 ) )
699  {
700  const AxisData &axis = d_data->axisData[QwtPolar::AxisTop];
701  if ( axis.isVisible && axis.scaleDraw->hasComponent( bone ) )
702  skipLine = true;
703  }
704  else if ( isClose( azimuth, M_PI ) )
705  {
706  const AxisData &axis = d_data->axisData[QwtPolar::AxisLeft];
707  if ( axis.isVisible && axis.scaleDraw->hasComponent( bone ) )
708  skipLine = true;
709  }
710  else if ( isClose( azimuth, 3 * M_PI / 2.0 ) )
711  {
713  if ( axis.isVisible && axis.scaleDraw->hasComponent( bone ) )
714  skipLine = true;
715  }
716  }
717  if ( !skipLine )
718  {
719  const QPointF pos = qwtPolar2Pos( pole, radius, azimuth );
720 
721  /*
722  Qt4 is horrible slow, when painting primitives,
723  with coordinates far outside the visible area.
724  */
725 
726  QPolygonF polygon( 2 );
727  polygon[0] = pole.toPoint();
728  polygon[1] = pos.toPoint();
729 
731  QwtClipper::clipPolygonF( canvasRect, polygon );
732 
733  QwtPainter::drawPolyline( painter, polygon );
734  }
735  }
736 }
737 
748  QPainter *painter, const QRectF &canvasRect,
749  const QPointF &pole, const QwtScaleMap &radialMap,
750  const QList<double> &values ) const
751 {
752  for ( int i = 0; i < int( values.size() ); i++ )
753  {
754  const double val = values[i];
755 
756  const GridData &gridData =
758 
759  bool skipLine = false;
761  {
763  if ( axis.isVisible &&
765  {
766  if ( isClose( val, gridData.scaleDiv.upperBound() ) )
767  skipLine = true;
768  }
769  }
770 
771  if ( isClose( val, gridData.scaleDiv.lowerBound() ) )
772  skipLine = true;
773 
774  if ( !skipLine )
775  {
776  const double radius = radialMap.transform( val );
777 
778  QRectF outerRect( 0, 0, 2 * radius, 2 * radius );
779  outerRect.moveCenter( pole );
780 
782  {
783  /*
784  Qt4 is horrible slow, when painting primitives,
785  with coordinates far outside the visible area.
786  We need to clip.
787  */
788 
789  const QVector<QwtInterval> angles =
790  QwtClipper::clipCircle( canvasRect, pole, radius );
791 
792  for ( int j = 0; j < angles.size(); j++ )
793  {
794  const QwtInterval intv = angles[j];
795 
796  if ( intv.minValue() == 0 && intv.maxValue() == 2 * M_PI )
797  {
798  QwtPainter::drawEllipse( painter, outerRect );
799  }
800  else
801  {
802  const double from = qwtDegrees( intv.minValue() );
803  const double to = qwtDegrees( intv.maxValue() );
804 
805  double span = to - from;
806  if ( span < 0.0 )
807  span += 360.0;
808 
809  painter->drawArc( outerRect,
810  qRound( from * 16 ), qRound( span * 16 ) );
811  }
812  }
813  }
814  else
815  {
816  QwtPainter::drawEllipse( painter, outerRect );
817  }
818  }
819  }
820 }
821 
828 void QwtPolarGrid::drawAxis( QPainter *painter, int axisId ) const
829 {
830  if ( axisId < 0 || axisId >= QwtPolar::AxesCount )
831  return;
832 
833  AxisData &axis = d_data->axisData[axisId];
834 
835  painter->setPen( axis.pen );
836  painter->setFont( axis.font );
837 
838  QPalette pal;
839  pal.setColor( QPalette::WindowText, axis.pen.color() );
840  pal.setColor( QPalette::Text, axis.pen.color() );
841 
842  axis.scaleDraw->draw( painter, pal );
843 }
844 
856  const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap,
857  const QPointF &pole, double radius ) const
858 {
859  const QPoint p = pole.toPoint();
860 
861  const QwtInterval interval =
863 
864  const int min = radialMap.transform( interval.minValue() );
865  const int max = radialMap.transform( interval.maxValue() );
866  const int l = max - min;
867 
868  for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
869  {
870  AxisData &axis = d_data->axisData[axisId];
871 
872  if ( axisId == QwtPolar::AxisAzimuth )
873  {
875  static_cast<QwtRoundScaleDraw *>( axis.scaleDraw );
876 
877  scaleDraw->setRadius( qRound( radius ) );
878  scaleDraw->moveCenter( p );
879 
880  double from = ::fmod( 90.0 - qwtDegrees( azimuthMap.p1() ), 360.0 );
881  if ( from < 0.0 )
882  from += 360.0;
883 
884  scaleDraw->setAngleRange( from, from - 360.0 );
885 
886  const QwtTransform *transform = azimuthMap.transformation();
887  if ( transform )
888  scaleDraw->setTransformation( transform->copy() );
889  else
890  scaleDraw->setTransformation( NULL );
891  }
892  else
893  {
895  static_cast<QwtScaleDraw *>( axis.scaleDraw );
896 
897  switch( axisId )
898  {
899  case QwtPolar::AxisLeft:
900  {
901  scaleDraw->move( p.x() - min, p.y() );
902  scaleDraw->setLength( -l );
903  break;
904  }
905  case QwtPolar::AxisRight:
906  {
907  scaleDraw->move( p.x() + min, p.y() );
908  scaleDraw->setLength( l );
909  break;
910  }
911  case QwtPolar::AxisTop:
912  {
913  scaleDraw->move( p.x(), p.y() - max );
914  scaleDraw->setLength( l );
915  break;
916  }
918  {
919  scaleDraw->move( p.x(), p.y() + max );
920  scaleDraw->setLength( -l );
921  break;
922  }
923  }
924  const QwtTransform *transform = radialMap.transformation();
925  if ( transform )
926  scaleDraw->setTransformation( transform->copy() );
927  else
928  scaleDraw->setTransformation( NULL );
929  }
930  }
931 }
932 
948 void QwtPolarGrid::updateScaleDiv( const QwtScaleDiv &azimuthScaleDiv,
949  const QwtScaleDiv &radialScaleDiv, const QwtInterval &interval )
950 {
951  GridData &radialGrid = d_data->gridData[QwtPolar::Radius];
952 
953  const QwtPolarPlot *plt = plot();
954  if ( plt && testGridAttribute( AutoScaling ) )
955  {
956  const QwtScaleEngine *se = plt->scaleEngine( QwtPolar::Radius );
957  radialGrid.scaleDiv = se->divideScale(
958  interval.minValue(), interval.maxValue(),
960  plt->scaleMaxMinor( QwtPolar::Radius ), 0 );
961  }
962  else
963  {
964  if ( radialGrid.scaleDiv != radialScaleDiv )
965  radialGrid.scaleDiv = radialScaleDiv;
966  }
967 
968  GridData &azimuthGrid = d_data->gridData[QwtPolar::Azimuth];
969  if ( azimuthGrid.scaleDiv != azimuthScaleDiv )
970  {
971  azimuthGrid.scaleDiv = azimuthScaleDiv;
972  }
973 
974  bool hasOrigin = false;
975  for ( int axisId = 0; axisId < QwtPolar::AxesCount; axisId++ )
976  {
977  AxisData &axis = d_data->axisData[axisId];
978  if ( axis.isVisible && axis.scaleDraw )
979  {
980  if ( axisId == QwtPolar::AxisAzimuth )
981  {
982  axis.scaleDraw->setScaleDiv( azimuthGrid.scaleDiv );
984  {
986  QwtAbstractScaleDraw::Ticks, !azimuthGrid.isVisible );
987  }
988  }
989  else
990  {
991  QwtScaleDiv sd = radialGrid.scaleDiv;
992 
994 
996  {
997  bool skipOrigin = hasOrigin;
998  if ( !skipOrigin )
999  {
1000  if ( axisId == QwtPolar::AxisLeft
1001  || axisId == QwtPolar::AxisRight )
1002  {
1004  skipOrigin = true;
1005  }
1006  else
1007  {
1009  skipOrigin = true;
1010  }
1011  }
1012  if ( ticks.size() > 0 && ticks.first() == sd.lowerBound() )
1013  {
1014  if ( skipOrigin )
1015  ticks.removeFirst();
1016  else
1017  hasOrigin = true;
1018  }
1019  }
1020 
1022  {
1023  if ( ticks.size() > 0 && ticks.last() == sd.upperBound() )
1024  ticks.removeLast();
1025  }
1026 
1027  sd.setTicks( QwtScaleDiv::MajorTick, ticks );
1028  axis.scaleDraw->setScaleDiv( sd );
1029 
1031  {
1032  axis.scaleDraw->enableComponent(
1033  QwtAbstractScaleDraw::Ticks, !radialGrid.isVisible );
1034  }
1035 
1036  }
1037  }
1038  }
1039 }
1040 
1046 {
1048  if ( axis.isVisible )
1049  {
1050  const int extent = axis.scaleDraw->extent( axis.font );
1051  return extent;
1052  }
1053 
1054  return 0;
1055 }
1056 
1064 const QwtScaleDraw *QwtPolarGrid::scaleDraw( int axisId ) const
1065 {
1066  if ( axisId >= QwtPolar::AxisLeft && axisId <= QwtPolar::AxisBottom )
1067  return static_cast<QwtScaleDraw *>( d_data->axisData[axisId].scaleDraw );
1068 
1069  return NULL;
1070 }
1071 
1080 {
1081  if ( axisId >= QwtPolar::AxisLeft && axisId <= QwtPolar::AxisBottom )
1082  return static_cast<QwtScaleDraw *>( d_data->axisData[axisId].scaleDraw );
1083 
1084  return NULL;
1085 }
1086 
1096 {
1097  if ( axisId < QwtPolar::AxisLeft || axisId > QwtPolar::AxisBottom )
1098  return;
1099 
1100  AxisData &axisData = d_data->axisData[axisId];
1101  if ( axisData.scaleDraw != scaleDraw )
1102  {
1103  delete axisData.scaleDraw;
1104  axisData.scaleDraw = scaleDraw;
1105  itemChanged();
1106  }
1107 }
1108 
1114 {
1115  return static_cast<QwtRoundScaleDraw *>(
1117 }
1118 
1124 {
1125  return static_cast<QwtRoundScaleDraw *>(
1127 }
1128 
1136 {
1138  if ( axisData.scaleDraw != scaleDraw )
1139  {
1140  delete axisData.scaleDraw;
1141  axisData.scaleDraw = scaleDraw;
1142  itemChanged();
1143  }
1144 }
A abstract base class for drawing scales.
double p1() const
Definition: qwt_scale_map.h:99
QwtPolarGrid::GridAttributes attributes
void drawAxis(QPainter *, int axisId) const
Left axis.
Definition: qwt_polar.h:52
void showAxis(int axisId, bool show=true)
A plotting widget, displaying a polar coordinate system.
AxisData axisData[QwtPolar::AxesCount]
virtual int marginHint() const QWT_OVERRIDE
void drawCircles(QPainter *, const QRectF &, const QPointF &pole, const QwtScaleMap &radialMap, const QList< double > &) const
void setAlignment(Alignment)
void setLength(double length)
void setAzimuthScaleDraw(QwtRoundScaleDraw *)
Set a scale draw for the azimuth scale.
void drawRays(QPainter *, const QRectF &, const QPointF &pole, double radius, const QwtScaleMap &azimuthMap, const QList< double > &) const
void setPen(const QPen &p)
bool isMinorGridVisible(int scaleId) const
A class representing an interval.
Definition: qwt_interval.h:22
void showGrid(int scaleId, bool show=true)
QPoint qwtPolar2Pos(const QPoint &pole, double radius, double angle)
virtual int rtti() const QWT_OVERRIDE
QwtAbstractScaleDraw * scaleDraw
double minValue() const
Definition: qwt_interval.h:190
void setTicks(int tickType, const QList< double > &)
double qwtDegrees(double degrees)
Translate radians into degrees.
Definition: qwt_math.h:253
Azimuth.
Definition: qwt_polar.h:36
QwtPolarPlot * plot() const
QFont axisFont(int axisId) const
virtual void draw(QPainter *p, const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap, const QPointF &pole, double radius, const QRectF &rect) const QWT_OVERRIDE
virtual QwtTransform * copy() const =0
Virtualized copy operation.
void setMajorGridPen(const QPen &p)
A class representing a scale division.
Definition: qwt_scale_div.h:33
QPen axisPen(int axisId) const
void setAxisPen(int axisId, const QPen &p)
double maxValue() const
Definition: qwt_interval.h:196
const QwtScaleDraw * scaleDraw(int axisId) const
double upperBound() const
QRect boundingLabelRect(const QFont &, double value) const
Find the bounding rectangle for the label.
bool isGridVisible(int scaleId) const
QwtScaleEngine * scaleEngine(int scaleId)
void moveCenter(double x, double y)
Move the center of the scale draw, leaving the radius unchanged.
Base class for items on a polar plot.
void setFont(const QFont &)
QwtPolarGrid::DisplayFlags displayFlags
void updateScaleDraws(const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap, const QPointF &pole, const double radius) const
GridData gridData[QwtPolar::ScaleCount]
bool contains(double value) const
Radius.
Definition: qwt_polar.h:39
#define min(A, B)
Definition: Log.c:64
PrivateData * d_data
Right axis.
Definition: qwt_polar.h:55
void setGridAttribute(GridAttribute, bool on=true)
Specify an attribute for the grid.
#define max(A, B)
Definition: Socket.h:88
The scale is left.
Top axis.
Definition: qwt_polar.h:58
void setAxisFont(int axisId, const QFont &p)
const QwtScaleDiv & scaleDiv() const
double lowerBound() const
void setZ(double z)
Set the z value.
static void clipPolygonF(const QRectF &, QPolygonF &, bool closePolygon=false)
A transformation between coordinate systems.
Definition: qwt_transform.h:35
void setDisplayFlag(DisplayFlag, bool on=true)
A class representing a text.
Definition: qwt_text.h:51
void setScaleDiv(const QwtScaleDiv &)
QwtPolarGrid()
Constructor.
Backbone = the line where the ticks are located.
const QwtTransform * transformation() const
Get the transformation.
A scale map.
Definition: qwt_scale_map.h:26
Number of scales.
Definition: qwt_polar.h:80
static void drawEllipse(QPainter *, const QRectF &)
Wrapper for QPainter::drawEllipse()
void setAngleRange(double angle1, double angle2)
Adjust the baseline circle segment for round scales.
static bool isClose(double value1, double value2)
void setTickLength(QwtScaleDiv::TickType, double length)
Number of available axis.
Definition: qwt_polar.h:64
void enableComponent(ScaleComponent, bool enable=true)
void showMinorGrid(int scaleId, bool show=true)
A class for drawing round scales.
void show()
Show the item.
#define M_PI
Definition: qwt_math.h:56
static void drawPolyline(QPainter *, const QPolygonF &)
Wrapper for QPainter::drawPolyline()
virtual double extent(const QFont &font) const =0
virtual void draw(QPainter *, const QPalette &) const
Draw the scale.
int scaleMaxMajor(int scaleId) const
Radial scale.
Definition: qwt_polar.h:77
QFlags< GridAttribute > GridAttributes
Grid attributes.
bool testDisplayFlag(DisplayFlag) const
static QVector< QwtInterval > clipCircle(const QRectF &, const QPointF &, double radius)
QwtInterval interval() const
virtual void updateScaleDiv(const QwtScaleDiv &azimuthMap, const QwtScaleDiv &radialMap, const QwtInterval &) QWT_OVERRIDE
Update the item to changes of the axes scale division.
bool hasComponent(ScaleComponent) const
void setTransformation(QwtTransform *)
QFlags< DisplayFlag > DisplayFlags
Display flags.
bool isAxisVisible(int axisId) const
virtual ~QwtPolarGrid()
Destructor.
QPen minorGridPen(int scaleId) const
A class for drawing scales.
GridAttribute
Grid attributes.
QPen majorGridPen(int scaleId) const
void setRadius(double radius)
bool testGridAttribute(GridAttribute) const
double transform(double s) const
virtual QwtScaleDiv divideScale(double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize=0.0) const =0
Calculate a scale division.
void setScaleDraw(int axisId, QwtScaleDraw *)
Set a scale draw.
virtual void itemChanged()
QList< double > ticks(int tickType) const
Azimuth axis.
Definition: qwt_polar.h:49
const QwtRoundScaleDraw * azimuthScaleDraw() const
The scale is below.
void setMinorGridPen(const QPen &p)
Base class for scale engines.
void move(double x, double y)
Bottom axis.
Definition: qwt_polar.h:61
int scaleMaxMinor(int scaleId) const
void setRenderHint(RenderHint, bool on=true)


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Dec 6 2020 03:48:10