void QwtPlotZoomer::rescale() { QwtPlot *plt = plot(); if ( !plt ) return; const QRectF &rect = d_data->zoomStack[d_data->zoomRectIndex]; if ( rect != scaleRect() ) { const bool doReplot = plt->autoReplot(); plt->setAutoReplot( false ); double x1 = rect.left(); double x2 = rect.right(); if ( !plt->axisScaleDiv( xAxis() ).isIncreasing() ) qSwap( x1, x2 ); plt->setAxisScale( xAxis(), x1, x2 ); double y1 = rect.top(); double y2 = rect.bottom(); if ( !plt->axisScaleDiv( yAxis() ).isIncreasing() ) qSwap( y1, y2 ); plt->setAxisScale( yAxis(), y1, y2 ); plt->setAutoReplot( doReplot ); plt->replot(); } }
/*! Zoom in/out the axes scales \param factor A value < 1.0 zooms in, a value > 1.0 zooms out. */ void QwtPlotMagnifier::rescale(double factor) { factor = qwtAbs(factor); if ( factor == 1.0 || factor == 0.0 ) return; bool doReplot = false; QwtPlot* plt = plot(); const bool autoReplot = plt->autoReplot(); plt->setAutoReplot(false); for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { const QwtScaleDiv *scaleDiv = plt->axisScaleDiv(axisId); if ( isAxisEnabled(axisId) && scaleDiv->isValid() ) { const double center = scaleDiv->lowerBound() + scaleDiv->range() / 2; const double width_2 = scaleDiv->range() / 2 * factor; plt->setAxisScale(axisId, center - width_2, center + width_2); doReplot = true; } } plt->setAutoReplot(autoReplot); if ( doReplot ) plt->replot(); }
/*! Update the axes scales \param intervals Scale intervals */ void QwtPlotRescaler::updateScales( QwtInterval intervals[QwtPlot::axisCnt] ) const { if ( d_data->inReplot >= 5 ) { return; } QwtPlot *plt = const_cast<QwtPlot *>( plot() ); const bool doReplot = plt->autoReplot(); plt->setAutoReplot( false ); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( axis == referenceAxis() || aspectRatio( axis ) > 0.0 ) { double v1 = intervals[axis].minValue(); double v2 = intervals[axis].maxValue(); if ( plt->axisScaleDiv( axis )->lowerBound() > plt->axisScaleDiv( axis )->upperBound() ) { qSwap( v1, v2 ); } if ( d_data->inReplot >= 1 ) { d_data->axisData[axis].scaleDiv = *plt->axisScaleDiv( axis ); } if ( d_data->inReplot >= 2 ) { QList<double> ticks[QwtScaleDiv::NTickTypes]; for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) ticks[i] = d_data->axisData[axis].scaleDiv.ticks( i ); plt->setAxisScaleDiv( axis, QwtScaleDiv( v1, v2, ticks ) ); } else { plt->setAxisScale( axis, v1, v2 ); } } } const bool immediatePaint = plt->canvas()->testPaintAttribute( QwtPlotCanvas::ImmediatePaint ); plt->canvas()->setPaintAttribute( QwtPlotCanvas::ImmediatePaint, false ); plt->setAutoReplot( doReplot ); d_data->inReplot++; plt->replot(); d_data->inReplot--; plt->canvas()->setPaintAttribute( QwtPlotCanvas::ImmediatePaint, immediatePaint ); }
/*! Update the axes scales \param intervals Scale intervals */ void QwtPlotRescaler::updateScales( QwtDoubleInterval intervals[QwtPlot::axisCnt]) const { if ( d_data->inReplot >= 5 ) { return; } QwtPlot *plt = (QwtPlot *)plot(); const bool doReplot = plt->autoReplot(); plt->setAutoReplot(false); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( axis == referenceAxis() || aspectRatio(axis) > 0.0 ) { double v1 = intervals[axis].minValue(); double v2 = intervals[axis].maxValue(); if ( plt->axisScaleDiv(axis)->lowerBound() > plt->axisScaleDiv(axis)->upperBound() ) { qSwap(v1, v2); } if ( d_data->inReplot >= 1 ) { d_data->axisData[axis].scaleDiv = *plt->axisScaleDiv(axis); } if ( d_data->inReplot >= 2 ) { QwtValueList ticks[QwtScaleDiv::NTickTypes]; for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) ticks[i] = d_data->axisData[axis].scaleDiv.ticks(i); plt->setAxisScaleDiv(axis, QwtScaleDiv(v1, v2, ticks)); } else { plt->setAxisScale(axis, v1, v2); } } } plt->setAutoReplot(doReplot); d_data->inReplot++; plt->replot(); d_data->inReplot--; }
/*! Adjust the enabled axes according to dx/dy \param dx Pixel offset in x direction \param dy Pixel offset in y direction \sa QwtPanner::panned() */ void QwtPlotPanner::moveCanvas( int dx, int dy ) { if ( dx == 0 && dy == 0 ) return; QwtPlot *plot = this->plot(); if ( plot == NULL ) return; const bool doAutoReplot = plot->autoReplot(); plot->setAutoReplot( false ); for ( int axisPos = 0; axisPos < QwtAxis::PosCount; axisPos++ ) { const int axesCount = plot->axesCount( axisPos ); for ( int i = 0; i < axesCount; i++ ) { const QwtAxisId axisId( axisPos, i ); if ( !isAxisEnabled( axisId ) ) continue; const QwtScaleMap map = plot->canvasMap( axisId ); const double p1 = map.transform( plot->axisScaleDiv( axisId ).lowerBound() ); const double p2 = map.transform( plot->axisScaleDiv( axisId ).upperBound() ); double d1, d2; if ( QwtAxis::isXAxis( axisPos ) ) { d1 = map.invTransform( p1 - dx ); d2 = map.invTransform( p2 - dx ); } else { d1 = map.invTransform( p1 - dy ); d2 = map.invTransform( p2 - dy ); } plot->setAxisScale( axisId, d1, d2 ); } } plot->setAutoReplot( doAutoReplot ); plot->replot(); }
/*! Redraw the canvas, and focus rect \param painter Painter */ void QwtPlotCanvas::drawContents( QPainter *painter ) { if ( d_data->paintAttributes & PaintCached && d_data->cache && d_data->cache->size() == contentsRect().size() ) { painter->drawPixmap( contentsRect().topLeft(), *d_data->cache ); } else { QwtPlot *plot = ( ( QwtPlot * )parent() ); const bool doAutoReplot = plot->autoReplot(); plot->setAutoReplot( false ); drawCanvas( painter ); plot->setAutoReplot( doAutoReplot ); } if ( hasFocus() && focusIndicator() == CanvasFocusIndicator ) drawFocusIndicator( painter ); }
/*! Adjust the enabled axes according to dx/dy \param dx Pixel offset in x direction \param dy Pixel offset in y direction \sa QwtPanner::panned() */ void QwtPlotPanner::moveCanvas(int dx, int dy) { if ( dx == 0 && dy == 0 ) return; QwtPlot *plot = QwtPlotPanner::plot(); if ( plot == NULL ) return; const bool doAutoReplot = plot->autoReplot(); plot->setAutoReplot(false); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( !d_data->isAxisEnabled[axis] ) continue; const QwtScaleMap map = plot->canvasMap(axis); const int i1 = map.transform(plot->axisScaleDiv(axis)->lowerBound()); const int i2 = map.transform(plot->axisScaleDiv(axis)->upperBound()); double d1, d2; if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { d1 = map.invTransform(i1 - dx); d2 = map.invTransform(i2 - dx); } else { d1 = map.invTransform(i1 - dy); d2 = map.invTransform(i2 - dy); } plot->setAxisScale(axis, d1, d2); } plot->setAutoReplot(doAutoReplot); plot->replot(); }
//! Adjust the plot axes scales void QwtPlotRescaler::rescale() const { #if 0 const int axis = referenceAxis(); if ( axis < 0 || axis >= QwtPlot::axisCnt ) return; const QwtDoubleInterval hint = intervalHint(axis); if ( !hint.isNull() ) { QwtPlot *plt = (QwtPlot *)plot(); const bool doReplot = plt->autoReplot(); plt->setAutoReplot(false); plt->setAxisScale(axis, hint.minValue(), hint.maxValue()); plt->setAutoReplot(doReplot); plt->updateAxes(); } #endif const QSize size = canvas()->contentsRect().size(); rescale(size, size); }
void PlotMagnifier::rescale( double factor, AxisMode axis ) { factor = qAbs( 1.0/factor ); QwtPlot* plt = plot(); if ( plt == nullptr || factor == 1.0 ){ return; } bool doReplot = false; const bool autoReplot = plt->autoReplot(); plt->setAutoReplot( false ); const int axis_list[2] = {QwtPlot::xBottom, QwtPlot::yLeft}; QRectF new_rect; for ( int i = 0; i <2; i++ ) { double temp_factor = factor; if( i==1 && axis == X_AXIS) { temp_factor = 1.0; } if( i==0 && axis == Y_AXIS) { temp_factor = 1.0; } int axisId = axis_list[i]; if ( isAxisEnabled( axisId ) ) { const QwtScaleMap scaleMap = plt->canvasMap( axisId ); double v1 = scaleMap.s1(); double v2 = scaleMap.s2(); double center = _mouse_position.x(); if( axisId == QwtPlot::yLeft){ center = _mouse_position.y(); } if ( scaleMap.transformation() ) { // the coordinate system of the paint device is always linear v1 = scaleMap.transform( v1 ); // scaleMap.p1() v2 = scaleMap.transform( v2 ); // scaleMap.p2() } const double width = ( v2 - v1 ); const double ratio = (v2-center)/ (width); v1 = center - width*temp_factor*(1-ratio); v2 = center + width*temp_factor*(ratio); if( v1 > v2 ) std::swap( v1, v2 ); if ( scaleMap.transformation() ) { v1 = scaleMap.invTransform( v1 ); v2 = scaleMap.invTransform( v2 ); } if( v1 < _lower_bounds[axisId]) v1 = _lower_bounds[axisId]; if( v2 > _upper_bounds[axisId]) v2 = _upper_bounds[axisId]; plt->setAxisScale( axisId, v1, v2 ); if( axisId == QwtPlot::xBottom) { new_rect.setLeft( v1 ); new_rect.setRight( v2 ); } else{ new_rect.setBottom( v1 ); new_rect.setTop( v2 ); } doReplot = true; } } plt->setAutoReplot( autoReplot ); if ( doReplot ){ emit rescaled( new_rect ); } }