qwt_plot_axis.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  * Qwt Widget Library
3  * Copyright (C) 1997 Josef Wilgen
4  * Copyright (C) 2002 Uwe Rathmann
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the Qwt License, Version 1.0
8  *****************************************************************************/
9 
10 #include "qwt_plot.h"
11 #include "qwt_scale_widget.h"
12 #include "qwt_scale_map.h"
13 #include "qwt_scale_div.h"
14 #include "qwt_scale_engine.h"
15 #include "qwt_interval.h"
16 
17 namespace
18 {
19  class AxisData
20  {
21  public:
22  AxisData()
23  : isVisible( true )
24  , doAutoScale( true )
25  , minValue( 0.0 )
26  , maxValue( 1000.0 )
27  , stepSize( 0.0 )
28  , maxMajor( 8 )
29  , maxMinor( 5 )
30  , isValid( false )
31  , scaleEngine( new QwtLinearScaleEngine() )
32  , scaleWidget( NULL )
33  {
34  }
35 
36  ~AxisData()
37  {
38  if( scaleWidget ) {
39  delete scaleWidget;
40  }
41  delete scaleEngine;
42  }
43 
44  void initWidget( QwtScaleDraw::Alignment align, const QString& name, QwtPlot* plot )
45  {
46  scaleWidget = new QwtScaleWidget( align, plot );
47  scaleWidget->setObjectName( name );
48 
49  #if 1
50  // better find the font sizes from the application font
51  const QFont fscl( plot->fontInfo().family(), 10 );
52  const QFont fttl( plot->fontInfo().family(), 12, QFont::Bold );
53  #endif
54 
55  scaleWidget->setTransformation( scaleEngine->transformation() );
56 
57  scaleWidget->setFont( fscl );
58  scaleWidget->setMargin( 2 );
59 
60  QwtText text = scaleWidget->title();
61  text.setFont( fttl );
62  scaleWidget->setTitle( text );
63  }
64 
65  bool isVisible;
66  bool doAutoScale;
67 
68  double minValue;
69  double maxValue;
70  double stepSize;
71 
72  int maxMajor;
73  int maxMinor;
74 
75  bool isValid;
76 
77  QwtScaleDiv scaleDiv;
78  QwtScaleEngine* scaleEngine;
79  QwtScaleWidget* scaleWidget;
80  };
81 }
82 
84 {
85  public:
86  ScaleData( QwtPlot* plot )
87  {
88  using namespace QwtAxis;
89 
90  m_axisData[YLeft].initWidget( QwtScaleDraw::LeftScale, "QwtPlotAxisYLeft", plot );
91  m_axisData[YRight].initWidget( QwtScaleDraw::RightScale, "QwtPlotAxisYRight", plot );
92  m_axisData[XTop].initWidget( QwtScaleDraw::TopScale, "QwtPlotAxisXTop", plot );
93  m_axisData[XBottom].initWidget( QwtScaleDraw::BottomScale, "QwtPlotAxisXBottom", plot );
94  }
95 
96  inline AxisData& axisData( QwtAxisId axisId )
97  {
98  return m_axisData[ axisId ];
99  }
100 
101  inline const AxisData& axisData( QwtAxisId axisId ) const
102  {
103  return m_axisData[ axisId ];
104  }
105 
106  private:
107  AxisData m_axisData[ QwtAxis::AxisPositions ];
108 };
109 
111 {
112  m_scaleData = new ScaleData( this );
113 
114  m_scaleData->axisData( QwtAxis::YRight ).isVisible = false;
115  m_scaleData->axisData( QwtAxis::XTop ).isVisible = false;
116 }
117 
119 {
120  delete m_scaleData;
121  m_scaleData = NULL;
122 }
123 
135 bool QwtPlot::isAxisValid( QwtAxisId axisId ) const
136 {
137  return QwtAxis::isValid( axisId );
138 }
139 
145 {
146  if ( isAxisValid( axisId ) )
147  return m_scaleData->axisData( axisId ).scaleWidget;
148 
149  return NULL;
150 }
151 
157 {
158  if ( isAxisValid( axisId ) )
159  return m_scaleData->axisData( axisId ).scaleWidget;
160 
161  return NULL;
162 }
163 
173 {
174  if ( isAxisValid( axisId ) && scaleEngine != NULL )
175  {
176  AxisData& d = m_scaleData->axisData( axisId );
177 
178  delete d.scaleEngine;
179  d.scaleEngine = scaleEngine;
180 
181  d.scaleWidget->setTransformation( scaleEngine->transformation() );
182 
183  d.isValid = false;
184 
185  autoRefresh();
186  }
187 }
188 
194 {
195  if ( isAxisValid( axisId ) )
196  return m_scaleData->axisData( axisId ).scaleEngine;
197  else
198  return NULL;
199 }
200 
206 {
207  if ( isAxisValid( axisId ) )
208  return m_scaleData->axisData( axisId ).scaleEngine;
209  else
210  return NULL;
211 }
216 bool QwtPlot::axisAutoScale( QwtAxisId axisId ) const
217 {
218  if ( isAxisValid( axisId ) )
219  return m_scaleData->axisData( axisId ).doAutoScale;
220  else
221  return false;
222 }
223 
228 bool QwtPlot::isAxisVisible( QwtAxisId axisId ) const
229 {
230  if ( isAxisValid( axisId ) )
231  return m_scaleData->axisData( axisId ).isVisible;
232  else
233  return false;
234 }
235 
240 QFont QwtPlot::axisFont( QwtAxisId axisId ) const
241 {
242  if ( isAxisValid( axisId ) )
243  return axisWidget( axisId )->font();
244  else
245  return QFont();
246 
247 }
248 
254 int QwtPlot::axisMaxMajor( QwtAxisId axisId ) const
255 {
256  if ( isAxisValid( axisId ) )
257  return m_scaleData->axisData( axisId ).maxMajor;
258  else
259  return 0;
260 }
261 
267 int QwtPlot::axisMaxMinor( QwtAxisId axisId ) const
268 {
269  if ( isAxisValid( axisId ) )
270  return m_scaleData->axisData( axisId ).maxMinor;
271  else
272  return 0;
273 }
274 
287 {
288  return m_scaleData->axisData( axisId ).scaleDiv;
289 }
290 
298 {
299  if ( !isAxisValid( axisId ) )
300  return NULL;
301 
302  return axisWidget( axisId )->scaleDraw();
303 }
304 
312 {
313  if ( !isAxisValid( axisId ) )
314  return NULL;
315 
316  return axisWidget( axisId )->scaleDraw();
317 }
318 
329 double QwtPlot::axisStepSize( QwtAxisId axisId ) const
330 {
331  if ( !isAxisValid( axisId ) )
332  return 0;
333 
334  return m_scaleData->axisData( axisId ).stepSize;
335 }
336 
348 {
349  if ( !isAxisValid( axisId ) )
350  return QwtInterval();
351 
352  return m_scaleData->axisData( axisId ).scaleDiv.interval();
353 }
354 
360 {
361  if ( isAxisValid( axisId ) )
362  return axisWidget( axisId )->title();
363  else
364  return QwtText();
365 }
366 
379 void QwtPlot::setAxisVisible( QwtAxisId axisId, bool on )
380 {
381  if ( isAxisValid( axisId ) && on != m_scaleData->axisData( axisId ).isVisible )
382  {
383  m_scaleData->axisData( axisId ).isVisible = on;
384  updateLayout();
385  }
386 }
387 
400 double QwtPlot::invTransform( QwtAxisId axisId, double pos ) const
401 {
402  if ( isAxisValid( axisId ) )
403  return( canvasMap( axisId ).invTransform( pos ) );
404  else
405  return 0.0;
406 }
407 
408 
417 double QwtPlot::transform( QwtAxisId axisId, double value ) const
418 {
419  if ( isAxisValid( axisId ) )
420  return( canvasMap( axisId ).transform( value ) );
421  else
422  return 0.0;
423 }
424 
433 void QwtPlot::setAxisFont( QwtAxisId axisId, const QFont& font )
434 {
435  if ( isAxisValid( axisId ) )
436  axisWidget( axisId )->setFont( font );
437 }
438 
452 void QwtPlot::setAxisAutoScale( QwtAxisId axisId, bool on )
453 {
454  if ( isAxisValid( axisId ) && ( m_scaleData->axisData( axisId ).doAutoScale != on ) )
455  {
456  m_scaleData->axisData( axisId ).doAutoScale = on;
457  autoRefresh();
458  }
459 }
460 
476 void QwtPlot::setAxisScale( QwtAxisId axisId, double min, double max, double stepSize )
477 {
478  if ( isAxisValid( axisId ) )
479  {
480  AxisData& d = m_scaleData->axisData( axisId );
481 
482  d.doAutoScale = false;
483  d.isValid = false;
484 
485  d.minValue = min;
486  d.maxValue = max;
487  d.stepSize = stepSize;
488 
489  autoRefresh();
490  }
491 }
492 
505 void QwtPlot::setAxisScaleDiv( QwtAxisId axisId, const QwtScaleDiv& scaleDiv )
506 {
507  if ( isAxisValid( axisId ) )
508  {
509  AxisData& d = m_scaleData->axisData( axisId );
510 
511  d.doAutoScale = false;
512  d.scaleDiv = scaleDiv;
513  d.isValid = true;
514 
515  autoRefresh();
516  }
517 }
518 
536 {
537  if ( isAxisValid( axisId ) )
538  {
539  axisWidget( axisId )->setScaleDraw( scaleDraw );
540  autoRefresh();
541  }
542 }
543 
552 void QwtPlot::setAxisLabelAlignment( QwtAxisId axisId, Qt::Alignment alignment )
553 {
554  if ( isAxisValid( axisId ) )
555  axisWidget( axisId )->setLabelAlignment( alignment );
556 }
557 
567 void QwtPlot::setAxisLabelRotation( QwtAxisId axisId, double rotation )
568 {
569  if ( isAxisValid( axisId ) )
570  axisWidget( axisId )->setLabelRotation( rotation );
571 }
572 
581 void QwtPlot::setAxisMaxMinor( QwtAxisId axisId, int maxMinor )
582 {
583  if ( isAxisValid( axisId ) )
584  {
585  maxMinor = qBound( 0, maxMinor, 100 );
586 
587  AxisData& d = m_scaleData->axisData( axisId );
588  if ( maxMinor != d.maxMinor )
589  {
590  d.maxMinor = maxMinor;
591  d.isValid = false;
592  autoRefresh();
593  }
594  }
595 }
596 
605 void QwtPlot::setAxisMaxMajor( QwtAxisId axisId, int maxMajor )
606 {
607  if ( isAxisValid( axisId ) )
608  {
609  maxMajor = qBound( 1, maxMajor, 10000 );
610 
611  AxisData& d = m_scaleData->axisData( axisId );
612  if ( maxMajor != d.maxMajor )
613  {
614  d.maxMajor = maxMajor;
615  d.isValid = false;
616  autoRefresh();
617  }
618  }
619 }
620 
627 void QwtPlot::setAxisTitle( QwtAxisId axisId, const QString& title )
628 {
629  if ( isAxisValid( axisId ) )
630  axisWidget( axisId )->setTitle( title );
631 }
632 
639 void QwtPlot::setAxisTitle( QwtAxisId axisId, const QwtText& title )
640 {
641  if ( isAxisValid( axisId ) )
642  axisWidget( axisId )->setTitle( title );
643 }
644 
670 {
671  // Find bounding interval of the item data
672  // for all axes, where autoscaling is enabled
673 
674  QwtInterval boundingIntervals[QwtAxis::AxisPositions];
675 
676  const QwtPlotItemList& itmList = itemList();
677 
679  for ( it = itmList.begin(); it != itmList.end(); ++it )
680  {
681  const QwtPlotItem* item = *it;
682 
684  continue;
685 
686  if ( !item->isVisible() )
687  continue;
688 
689  if ( axisAutoScale( item->xAxis() ) || axisAutoScale( item->yAxis() ) )
690  {
691  const QRectF rect = item->boundingRect();
692 
693  if ( rect.width() >= 0.0 )
694  boundingIntervals[item->xAxis()] |= QwtInterval( rect.left(), rect.right() );
695 
696  if ( rect.height() >= 0.0 )
697  boundingIntervals[item->yAxis()] |= QwtInterval( rect.top(), rect.bottom() );
698  }
699  }
700 
701  // Adjust scales
702 
703  for ( int axisPos = 0; axisPos < QwtAxis::AxisPositions; axisPos++ )
704  {
705  {
706  const QwtAxisId axisId( axisPos );
707 
708  AxisData& d = m_scaleData->axisData( axisId );
709 
710  double minValue = d.minValue;
711  double maxValue = d.maxValue;
712  double stepSize = d.stepSize;
713 
714  const QwtInterval& interval = boundingIntervals[axisId];
715 
716  if ( d.doAutoScale && interval.isValid() )
717  {
718  d.isValid = false;
719 
720  minValue = interval.minValue();
721  maxValue = interval.maxValue();
722 
723  d.scaleEngine->autoScale( d.maxMajor,
724  minValue, maxValue, stepSize );
725  }
726  if ( !d.isValid )
727  {
728  d.scaleDiv = d.scaleEngine->divideScale(
729  minValue, maxValue, d.maxMajor, d.maxMinor, stepSize );
730  d.isValid = true;
731  }
732 
733  QwtScaleWidget* scaleWidget = axisWidget( axisId );
734  scaleWidget->setScaleDiv( d.scaleDiv );
735 
736  int startDist, endDist;
737  scaleWidget->getBorderDistHint( startDist, endDist );
738  scaleWidget->setBorderDist( startDist, endDist );
739  }
740  }
741 
742  for ( it = itmList.begin(); it != itmList.end(); ++it )
743  {
744  QwtPlotItem* item = *it;
746  {
747  item->updateScaleDiv( axisScaleDiv( item->xAxis() ),
748  axisScaleDiv( item->yAxis() ) );
749  }
750  }
751 }
752 
QwtInterval axisInterval(QwtAxisId) const
Return the current interval of the specified axis.
d
const AxisData & axisData(QwtAxisId axisId) const
void setAxisFont(QwtAxisId, const QFont &)
Change the font of an axis.
Definition: core.h:1869
bool isValid() const
Definition: qwt_interval.h:210
QList< QwtPlotItem *>::ConstIterator QwtPlotItemIterator
Definition: qwt_plot_dict.h:19
void setAxisLabelAlignment(QwtAxisId, Qt::Alignment)
void setAxisMaxMajor(QwtAxisId, int maxMajor)
void setFont(const QFont &)
Definition: qwt_text.cpp:329
AxisData & axisData(QwtAxisId axisId)
void setAxisScaleDiv(QwtAxisId, const QwtScaleDiv &)
Disable autoscaling and specify a fixed scale for a selected axis.
bool isValid(int axisPos)
Definition: qwt_axis.h:45
double axisStepSize(QwtAxisId) const
Return the step size parameter that has been set in setAxisScale.
A class representing an interval.
Definition: qwt_interval.h:22
QFont axisFont(QwtAxisId) const
double minValue() const
Definition: qwt_interval.h:192
The scale is above.
int axisMaxMajor(QwtAxisId) const
void deleteAxesData()
void getBorderDistHint(int &start, int &end) const
Calculate a hint for the border distances.
void setScaleDiv(const QwtScaleDiv &)
Assign a scale division.
double invTransform(QwtAxisId, double pos) const
const QwtScaleDiv & axisScaleDiv(QwtAxisId) const
Return the scale division of a specified axis.
int axisMaxMinor(QwtAxisId) const
A class representing a scale division.
Definition: qwt_scale_div.h:33
bool isVisible() const
void setAxisScaleEngine(QwtAxisId, QwtScaleEngine *)
void setAxisLabelRotation(QwtAxisId, double rotation)
A 2-D plotting widget.
Definition: qwt_plot.h:78
bool axisAutoScale(QwtAxisId) const
virtual QRectF boundingRect() const
void setAxisVisible(QwtAxisId, bool on=true)
Hide or show a specified axis.
QwtAxisId xAxis() const
Return xAxis.
void setAxisAutoScale(QwtAxisId, bool on=true)
Enable autoscaling for a specified axis.
double transform(QwtAxisId, double value) const
Transform a value into a coordinate in the plotting region.
The scale is left.
void setAxisScaleDraw(QwtAxisId, QwtScaleDraw *)
Set a scale draw.
A Widget which contains a scale.
bool testItemInterest(ItemInterest) const
Y axis right of the canvas.
Definition: qwt_axis.h:27
void initAxesData()
A class representing a text.
Definition: qwt_text.h:51
Y axis left of the canvas.
Definition: qwt_axis.h:24
bool isAxisVisible(QwtAxisId) const
int QwtAxisId
Axis identifier.
Definition: qwt_axis_id.h:26
void setBorderDist(int dist1, int dist2)
QwtText axisTitle(QwtAxisId) const
The scale is right.
bool isAxisValid(QwtAxisId) const
void setAxisScale(QwtAxisId, double min, double max, double stepSize=0)
Disable autoscaling and specify a fixed scale for a selected axis.
virtual void updateScaleDiv(const QwtScaleDiv &, const QwtScaleDiv &)
Update the item to changes of the axes scale division.
A class for drawing scales.
const QwtScaleWidget * axisWidget(QwtAxisId) const
Definition: core.h:1131
A scale engine for linear scales.
Base class for items on the plot canvas.
Definition: qwt_plot_item.h:66
X axis above the canvas.
Definition: qwt_axis.h:33
void setAxisTitle(QwtAxisId, const QString &)
Change the title of a specified axis.
QwtAxisId yAxis() const
Return yAxis.
void setAxisMaxMinor(QwtAxisId, int maxMinor)
ScaleData(QwtPlot *plot)
X axis below the canvas.
Definition: qwt_axis.h:30
The scale is below.
QwtScaleEngine * axisScaleEngine(QwtAxisId)
void updateAxes()
Rebuild the axes scales.
double maxValue() const
Definition: qwt_interval.h:198
QwtTransform * transformation() const
Base class for scale engines.
bool testItemAttribute(ItemAttribute) const
const QwtScaleDraw * axisScaleDraw(QwtAxisId) const
Return the scale draw of a specified axis.


plotjuggler
Author(s): Davide Faconti
autogenerated on Mon Jun 19 2023 03:01:38