21#include "moc_qgselevationprofilecanvas.cpp" 
   67      mRect = mCanvas->rect();
 
   70      prepareGeometryChange();
 
   71      setPos( mRect.topLeft() );
 
   74      mCachedImages.clear();
 
   82      mCachedImages.clear();
 
   87    bool redrawResults( 
const QString &sourceId )
 
   89      auto it = mCachedImages.find( sourceId );
 
   90      if ( it == mCachedImages.end() )
 
   93      mCachedImages.erase( it );
 
   98    QRectF boundingRect()
 const override 
  103    QString distanceSuffix()
 const 
  105      switch ( mDistanceUnit )
 
  158          return QObject::tr( 
"°" );
 
  167      mDistanceUnit = unit;
 
  174      if ( !mPlotArea.isNull() )
 
  179      if ( !scene()->views().isEmpty() )
 
  180        context.
setScaleFactor( scene()->views().at( 0 )->logicalDpiX() / 25.4 );
 
  189      const QRectF area = plotArea();
 
  190      if ( !area.contains( point.x(), point.y() ) )
 
  193      const double distance = ( point.x() - area.left() ) / area.width() * ( 
xMaximum() - 
xMinimum() ) * mXScaleFactor + 
xMinimum() * mXScaleFactor;
 
  200      if ( point.
distance() < xMinimum() * mXScaleFactor || point.
distance() > xMaximum() * mXScaleFactor || point.
elevation() < yMinimum() || point.
elevation() > yMaximum() )
 
  203      const QRectF area = plotArea();
 
  212      mPlotArea = plotArea;
 
  217      const double pixelRatio = !scene()->views().empty() ? scene()->views().at( 0 )->devicePixelRatioF() : 1;
 
  219      const QStringList sourceIds = mRenderer->sourceIds();
 
  220      for ( 
const QString &source : sourceIds )
 
  223        auto it = mCachedImages.constFind( source );
 
  224        if ( it != mCachedImages.constEnd() )
 
  230          plot = mRenderer->renderToImage( plotArea.width() * pixelRatio, plotArea.height() * pixelRatio, xMinimum() * mXScaleFactor, 
xMaximum() * mXScaleFactor, 
yMinimum(), 
yMaximum(), source, pixelRatio );
 
  231          plot.setDevicePixelRatio( pixelRatio );
 
  232          mCachedImages.insert( source, plot );
 
  234        rc.
painter()->drawImage( QPointF( plotArea.left(), plotArea.top() ), plot );
 
  238    void paint( QPainter *painter )
 override 
  241      if ( !mImage.isNull() )
 
  243        painter->drawImage( QPointF( 0, 0 ), mImage );
 
  247        const double pixelRatio = !scene()->views().empty() ? scene()->views().at( 0 )->devicePixelRatioF() : 1;
 
  248        mImage = QImage( mRect.width() * pixelRatio, mRect.height() * pixelRatio, QImage::Format_ARGB32_Premultiplied );
 
  249        mImage.setDevicePixelRatio( pixelRatio );
 
  250        mImage.fill( Qt::transparent );
 
  252        QPainter imagePainter( &mImage );
 
  253        imagePainter.setRenderHint( QPainter::Antialiasing, 
true );
 
  257        const double mapUnitsPerPixel = ( 
xMaximum() - 
xMinimum() ) * mXScaleFactor / plotArea().width();
 
  267        painter->drawImage( QPointF( 0, 0 ), mImage );
 
  272    double mXScaleFactor = 1.0;
 
  279    QMap<QString, QImage> mCachedImages;
 
  291      , mPlotItem( plotItem )
 
  297      mRect = mCanvas->rect();
 
  299      prepareGeometryChange();
 
  300      setPos( mRect.topLeft() );
 
  310    QRectF boundingRect()
 const override 
  315    void paint( QPainter *painter )
 override 
  317      const QgsPointXY crossHairPlotPoint = mPlotItem->plotPointToCanvasPoint( mPoint );
 
  318      if ( crossHairPlotPoint.
isEmpty() )
 
  322      painter->setBrush( Qt::NoBrush );
 
  324      crossHairPen.setCosmetic( 
true );
 
  325      crossHairPen.setWidthF( 1 );
 
  326      crossHairPen.setStyle( Qt::DashLine );
 
  327      crossHairPen.setCapStyle( Qt::FlatCap );
 
  328      const QPalette scenePalette = mPlotItem->scene()->palette();
 
  329      QColor penColor = scenePalette.color( QPalette::ColorGroup::Active, QPalette::Text );
 
  330      penColor.setAlpha( 150 );
 
  331      crossHairPen.setColor( penColor );
 
  332      painter->setPen( crossHairPen );
 
  333      painter->drawLine( QPointF( mPlotItem->plotArea().left(), crossHairPlotPoint.
y() ), QPointF( mPlotItem->plotArea().right(), crossHairPlotPoint.
y() ) );
 
  334      painter->drawLine( QPointF( crossHairPlotPoint.
x(), mPlotItem->plotArea().top() ), QPointF( crossHairPlotPoint.
x(), mPlotItem->plotArea().bottom() ) );
 
  339      const QString xCoordinateText = mPlotItem->xAxis().numericFormat()->formatDouble( mPoint.distance() / mPlotItem->mXScaleFactor, numericContext )
 
  340                                      + mPlotItem->distanceSuffix();
 
  342      const QString yCoordinateText = mPlotItem->yAxis().numericFormat()->formatDouble( mPoint.elevation(), numericContext );
 
  345      const QFontMetrics fm( font );
 
  346      const double height = fm.capHeight();
 
  347      const double xWidth = fm.horizontalAdvance( xCoordinateText );
 
  348      const double yWidth = fm.horizontalAdvance( yCoordinateText );
 
  349      const double textAxisMargin = fm.horizontalAdvance( 
' ' );
 
  351      QPointF xCoordOrigin;
 
  352      QPointF yCoordOrigin;
 
  354      if ( mPoint.distance() < ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5 * mPlotItem->mXScaleFactor )
 
  356        if ( mPoint.elevation() < ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5 )
 
  359          xCoordOrigin = QPointF( crossHairPlotPoint.
x() + textAxisMargin, mPlotItem->plotArea().top() + height + textAxisMargin );
 
  361          yCoordOrigin = QPointF( mPlotItem->plotArea().right() - yWidth - textAxisMargin, crossHairPlotPoint.
y() - textAxisMargin );
 
  366          xCoordOrigin = QPointF( crossHairPlotPoint.
x() + textAxisMargin, mPlotItem->plotArea().bottom() - textAxisMargin );
 
  368          yCoordOrigin = QPointF( mPlotItem->plotArea().right() - yWidth - textAxisMargin, crossHairPlotPoint.
y() + height + textAxisMargin );
 
  373        if ( mPoint.elevation() < ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5 )
 
  376          xCoordOrigin = QPointF( crossHairPlotPoint.
x() - xWidth - textAxisMargin, mPlotItem->plotArea().top() + height + textAxisMargin );
 
  378          yCoordOrigin = QPointF( mPlotItem->plotArea().left() + textAxisMargin, crossHairPlotPoint.
y() - textAxisMargin );
 
  383          xCoordOrigin = QPointF( crossHairPlotPoint.
x() - xWidth - textAxisMargin, mPlotItem->plotArea().bottom() - textAxisMargin );
 
  385          yCoordOrigin = QPointF( mPlotItem->plotArea().left() + textAxisMargin, crossHairPlotPoint.
y() + height + textAxisMargin );
 
  390      QColor backgroundColor = mPlotItem->chartBackgroundSymbol()->color();
 
  391      backgroundColor.setAlpha( 220 );
 
  392      painter->setBrush( QBrush( backgroundColor ) );
 
  393      painter->setPen( Qt::NoPen );
 
  394      painter->drawRect( QRectF( xCoordOrigin.x() - textAxisMargin + 1, xCoordOrigin.y() - textAxisMargin - height + 1, xWidth + 2 * textAxisMargin - 2, height + 2 * textAxisMargin - 2 ) );
 
  395      painter->drawRect( QRectF( yCoordOrigin.x() - textAxisMargin + 1, yCoordOrigin.y() - textAxisMargin - height + 1, yWidth + 2 * textAxisMargin - 2, height + 2 * textAxisMargin - 2 ) );
 
  397      painter->setBrush( Qt::NoBrush );
 
  398      painter->setPen( scenePalette.color( QPalette::ColorGroup::Active, QPalette::Text ) );
 
  400      painter->drawText( xCoordOrigin, xCoordinateText );
 
  401      painter->drawText( yCoordOrigin, yCoordinateText );
 
  408    QgsElevationProfilePlotItem *mPlotItem = 
nullptr;
 
  418  mPlotItem = 
new QgsElevationProfilePlotItem( 
this );
 
  423  mCrossHairsItem = 
new QgsElevationProfileCrossHairsItem( 
this, mPlotItem );
 
  424  mCrossHairsItem->setZValue( 100 );
 
  425  mCrossHairsItem->hide();
 
  428  mDeferredRegenerationTimer = 
new QTimer( 
this );
 
  429  mDeferredRegenerationTimer->setSingleShot( 
true );
 
  430  mDeferredRegenerationTimer->stop();
 
  431  connect( mDeferredRegenerationTimer, &QTimer::timeout, 
this, &QgsElevationProfileCanvas::startDeferredRegeneration );
 
  433  mDeferredRedrawTimer = 
new QTimer( 
this );
 
  434  mDeferredRedrawTimer->setSingleShot( 
true );
 
  435  mDeferredRedrawTimer->stop();
 
  436  connect( mDeferredRedrawTimer, &QTimer::timeout, 
this, &QgsElevationProfileCanvas::startDeferredRedraw );
 
 
  443    mPlotItem->setRenderer( 
nullptr );
 
  444    mCurrentJob->deleteLater();
 
  445    mCurrentJob = 
nullptr;
 
 
  453    mPlotItem->setRenderer( 
nullptr );
 
  456    mCurrentJob->deleteLater();
 
  457    mCurrentJob = 
nullptr;
 
 
  463  const double dxPercent = dx / mPlotItem->plotArea().width();
 
  464  const double dyPercent = dy / mPlotItem->plotArea().height();
 
  467  const double dxPlot = -dxPercent * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() );
 
  468  const double dyPlot = dyPercent * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
  471  mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  472  mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  473  mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  474  mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
  478  mPlotItem->updatePlot();
 
 
  484  if ( !mPlotItem->plotArea().contains( x, y ) )
 
  487  const double newCenterX = mPlotItem->xMinimum() + ( x - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() );
 
  488  const double newCenterY = mPlotItem->yMinimum() + ( mPlotItem->plotArea().bottom() - y ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
  490  const double dxPlot = newCenterX - ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5;
 
  491  const double dyPlot = newCenterY - ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5;
 
  494  mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  495  mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  496  mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  497  mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
  501  mPlotItem->updatePlot();
 
 
  513  const double toleranceInPixels = QFontMetrics( font() ).horizontalAdvance( 
' ' );
 
  514  const double xToleranceInPlotUnits = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) * toleranceInPixels;
 
  515  const double yToleranceInPlotUnits = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * toleranceInPixels;
 
  523                                            / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) );
 
  530  const double toleranceInPixels = QFontMetrics( font() ).horizontalAdvance( 
' ' );
 
  531  const double xToleranceInPlotUnits = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) * toleranceInPixels;
 
  532  const double yToleranceInPlotUnits = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * toleranceInPixels;
 
  540                                            / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) );
 
  547void QgsElevationProfileCanvas::setupLayerConnections( 
QgsMapLayer *layer, 
bool isDisconnect )
 
  562  switch ( layer->
type() )
 
  595void QgsElevationProfileCanvas::adjustRangeForAxisScaleLock( 
double &xMinimum, 
double &xMaximum, 
double &yMinimum, 
double &yMaximum )
 const 
  598  const double horizontalScale = ( xMaximum - xMinimum ) / mPlotItem->plotArea().width();
 
  599  const double verticalScale = ( yMaximum - yMinimum ) / mPlotItem->plotArea().height();
 
  600  if ( horizontalScale > verticalScale )
 
  602    const double height = horizontalScale * mPlotItem->plotArea().height();
 
  603    const double deltaHeight = ( yMaximum - yMinimum ) - height;
 
  604    yMinimum += deltaHeight / 2;
 
  605    yMaximum -= deltaHeight / 2;
 
  609    const double width = verticalScale * mPlotItem->plotArea().width();
 
  610    const double deltaWidth = ( ( xMaximum - xMinimum ) - width );
 
  611    xMinimum += deltaWidth / 2;
 
  612    xMaximum -= deltaWidth / 2;
 
  618  return mDistanceUnit;
 
 
  623  mDistanceUnit = unit;
 
  624  const double oldMin = mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  625  const double oldMax = mPlotItem->xMaximum() * mPlotItem->mXScaleFactor;
 
  627  mPlotItem->setXAxisUnits( mDistanceUnit );
 
  628  mPlotItem->setXMinimum( oldMin / mPlotItem->mXScaleFactor );
 
  629  mPlotItem->setXMaximum( oldMax / mPlotItem->mXScaleFactor );
 
  630  mPlotItem->updatePlot();
 
 
  635  if ( !color.isValid() )
 
  637    QPalette customPalette = qApp->palette();
 
  638    const QColor baseColor = qApp->palette().color( QPalette::ColorRole::Base );
 
  639    const QColor windowColor = qApp->palette().color( QPalette::ColorRole::Window );
 
  640    customPalette.setColor( QPalette::ColorRole::Base, windowColor );
 
  641    customPalette.setColor( QPalette::ColorRole::Window, baseColor );
 
  642    setPalette( customPalette );
 
  643    scene()->setPalette( customPalette );
 
  648    const bool isDarkTheme = color.lightnessF() < 0.5;
 
  649    QPalette customPalette = qApp->palette();
 
  650    customPalette.setColor( QPalette::ColorRole::Window, color );
 
  653      customPalette.setColor( QPalette::ColorRole::Text, QColor( 255, 255, 255 ) );
 
  654      customPalette.setColor( QPalette::ColorRole::Base, color.lighter( 120 ) );
 
  658      customPalette.setColor( QPalette::ColorRole::Text, QColor( 0, 0, 0 ) );
 
  659      customPalette.setColor( QPalette::ColorRole::Base, color.darker( 120 ) );
 
  662    setPalette( customPalette );
 
  663    scene()->setPalette( customPalette );
 
  666  updateChartFromPalette();
 
 
  671  return mLockAxisScales;
 
 
  676  mLockAxisScales = lock;
 
  677  if ( mLockAxisScales )
 
  679    double xMinimum = mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  680    double xMaximum = mPlotItem->xMaximum() * mPlotItem->mXScaleFactor;
 
  681    double yMinimum = mPlotItem->yMinimum();
 
  682    double yMaximum = mPlotItem->yMaximum();
 
  683    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
  684    mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
  685    mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
  686    mPlotItem->setYMinimum( yMinimum );
 
  687    mPlotItem->setYMaximum( yMaximum );
 
  690    mPlotItem->updatePlot();
 
 
  697  if ( !mCurrentJob || !mSnappingEnabled )
 
 
  711  if ( mLockAxisScales )
 
  714  const double currentWidth = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor;
 
  715  const double currentHeight = mPlotItem->yMaximum() - mPlotItem->yMinimum();
 
  717  const double newWidth = currentWidth / xFactor;
 
  718  const double newHeight = currentHeight / yFactor;
 
  720  const double currentCenterX = ( mPlotItem->xMinimum() + mPlotItem->xMaximum() ) * 0.5 * mPlotItem->mXScaleFactor;
 
  721  const double currentCenterY = ( mPlotItem->yMinimum() + mPlotItem->yMaximum() ) * 0.5;
 
  723  double xMinimum = currentCenterX - newWidth * 0.5;
 
  724  double xMaximum = currentCenterX + newWidth * 0.5;
 
  725  double yMinimum = currentCenterY - newHeight * 0.5;
 
  726  double yMaximum = currentCenterY + newHeight * 0.5;
 
  727  if ( mLockAxisScales )
 
  729    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
  732  mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
  733  mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
  734  mPlotItem->setYMinimum( yMinimum );
 
  735  mPlotItem->setYMaximum( yMaximum );
 
  738  mPlotItem->updatePlot();
 
 
  744  const QRectF intersected = rect.intersected( mPlotItem->plotArea() );
 
  746  double minX = ( intersected.left() - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  747  double maxX = ( intersected.right() - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  748  double minY = ( mPlotItem->plotArea().bottom() - intersected.bottom() ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  749  double maxY = ( mPlotItem->plotArea().bottom() - intersected.top() ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  751  if ( mLockAxisScales )
 
  753    adjustRangeForAxisScaleLock( minX, maxX, minY, maxY );
 
  756  mPlotItem->setXMinimum( minX / mPlotItem->mXScaleFactor );
 
  757  mPlotItem->setXMaximum( maxX / mPlotItem->mXScaleFactor );
 
  758  mPlotItem->setYMinimum( minY );
 
  759  mPlotItem->setYMaximum( maxY );
 
  762  mPlotItem->updatePlot();
 
 
  770  double zoomFactor = settings.
value( QStringLiteral( 
"qgis/zoom_factor" ), 2 ).toDouble();
 
  771  bool reverseZoom = settings.
value( QStringLiteral( 
"qgis/reverse_wheel_zoom" ), 
false ).toBool();
 
  772  bool zoomIn = reverseZoom ? 
event->angleDelta().y() < 0 : 
event->angleDelta().y() > 0;
 
  775  zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 120.0 * std::fabs( 
event->angleDelta().y() );
 
  777  if ( 
event->modifiers() & Qt::ControlModifier )
 
  780    zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 20.0;
 
  784  double scaleFactor = ( zoomIn ? 1 / zoomFactor : zoomFactor );
 
  786  QRectF viewportRect = mPlotItem->plotArea();
 
  788  if ( viewportRect.contains( 
event->position() ) )
 
  791    const double oldCenterX = 0.5 * ( mPlotItem->xMaximum() + mPlotItem->xMinimum() );
 
  792    const double oldCenterY = 0.5 * ( mPlotItem->yMaximum() + mPlotItem->yMinimum() );
 
  794    const double eventPosX = ( 
event->position().x() - viewportRect.left() ) / viewportRect.width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) + mPlotItem->xMinimum();
 
  795    const double eventPosY = ( viewportRect.bottom() - 
event->position().y() ) / viewportRect.height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  797    const double newCenterX = eventPosX + ( ( oldCenterX - eventPosX ) * scaleFactor );
 
  798    const double newCenterY = eventPosY + ( ( oldCenterY - eventPosY ) * scaleFactor );
 
  800    const double dxPlot = newCenterX - ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5;
 
  801    const double dyPlot = newCenterY - ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5;
 
  804    mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  805    mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  806    mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  807    mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
 
  825  if ( e->isAccepted() )
 
  827    mCrossHairsItem->hide();
 
  832  if ( mCurrentJob && mSnappingEnabled && !plotPoint.
isEmpty() )
 
  841    mCrossHairsItem->hide();
 
  845    mCrossHairsItem->setPoint( plotPoint );
 
  846    mCrossHairsItem->show();
 
 
  853  return mPlotItem->plotArea();
 
 
  873  const QList<QgsMapLayer *> layersToGenerate = 
layers();
 
  874  QList<QgsAbstractProfileSource *> sources;
 
  876  sources.reserve( layersToGenerate.size() + registrySources.size() );
 
  878  sources << registrySources;
 
  882      sources.append( source );
 
  890  generationContext.
setMaximumErrorMapUnits( MAX_ERROR_PIXELS * ( mProfileCurve->length() ) / mPlotItem->plotArea().width() );
 
  895  mPlotItem->setRenderer( mCurrentJob );
 
 
  902  mZoomFullWhenJobFinished = 
true;
 
 
  905void QgsElevationProfileCanvas::generationFinished()
 
  912  if ( mZoomFullWhenJobFinished )
 
  915    mZoomFullWhenJobFinished = 
false;
 
  924    mPlotItem->updatePlot();
 
  927  if ( mForceRegenerationAfterCurrentJobCompletes )
 
  929    mForceRegenerationAfterCurrentJobCompletes = 
false;
 
  931    scheduleDeferredRegeneration();
 
  935void QgsElevationProfileCanvas::onLayerProfileGenerationPropertyChanged()
 
  938  if ( !mCurrentJob || mCurrentJob->
isActive() )
 
  945  if ( 
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( properties->parent() ) )
 
  950        scheduleDeferredRegeneration();
 
  955void QgsElevationProfileCanvas::onLayerProfileRendererPropertyChanged()
 
  958  if ( !mCurrentJob || mCurrentJob->
isActive() )
 
  965  if ( 
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( properties->parent() ) )
 
  971    if ( mPlotItem->redrawResults( layer->
id() ) )
 
  972      scheduleDeferredRedraw();
 
  976void QgsElevationProfileCanvas::regenerateResultsForLayer()
 
  981  if ( 
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() ) )
 
  986        scheduleDeferredRegeneration();
 
  991void QgsElevationProfileCanvas::scheduleDeferredRegeneration()
 
  993  if ( !mDeferredRegenerationScheduled )
 
  995    mDeferredRegenerationTimer->start( 1 );
 
  996    mDeferredRegenerationScheduled = 
true;
 
 1000void QgsElevationProfileCanvas::scheduleDeferredRedraw()
 
 1002  if ( !mDeferredRedrawScheduled )
 
 1004    mDeferredRedrawTimer->start( 1 );
 
 1005    mDeferredRedrawScheduled = 
true;
 
 1009void QgsElevationProfileCanvas::startDeferredRegeneration()
 
 1011  if ( mCurrentJob && !mCurrentJob->
isActive() )
 
 1016  else if ( mCurrentJob )
 
 1018    mForceRegenerationAfterCurrentJobCompletes = 
true;
 
 1021  mDeferredRegenerationScheduled = 
false;
 
 1024void QgsElevationProfileCanvas::startDeferredRedraw()
 
 1026  mPlotItem->update();
 
 1027  mDeferredRedrawScheduled = 
false;
 
 1030void QgsElevationProfileCanvas::refineResults()
 
 1036    const double plotDistanceRange = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor;
 
 1037    const double plotElevationRange = mPlotItem->yMaximum() - mPlotItem->yMinimum();
 
 1038    const double plotDistanceUnitsPerPixel = plotDistanceRange / mPlotItem->plotArea().width();
 
 1042    const double targetMaxErrorInMapUnits = MAX_ERROR_PIXELS * plotDistanceUnitsPerPixel;
 
 1043    const double factor = std::pow( 10.0, 1 - std::ceil( std::log10( std::fabs( targetMaxErrorInMapUnits ) ) ) );
 
 1044    const double roundedErrorInMapUnits = std::floor( targetMaxErrorInMapUnits * factor ) / factor;
 
 1051    context.
setDistanceRange( 
QgsDoubleRange( std::max( 0.0, distanceMin ), mPlotItem->xMaximum() * mPlotItem->mXScaleFactor + plotDistanceRange * 0.05 ) );
 
 1056  scheduleDeferredRegeneration();
 
 1059void QgsElevationProfileCanvas::updateChartFromPalette()
 
 1061  const QPalette chartPalette = palette();
 
 1062  setBackgroundBrush( QBrush( chartPalette.color( QPalette::ColorRole::Base ) ) );
 
 1065    textFormat.
setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::Text ) );
 
 1066    mPlotItem->xAxis().setTextFormat( textFormat );
 
 1067    mPlotItem->yAxis().setTextFormat( textFormat );
 
 1070    std::unique_ptr<QgsFillSymbol> chartFill( mPlotItem->chartBackgroundSymbol()->clone() );
 
 1071    chartFill->setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Window ) );
 
 1072    mPlotItem->setChartBackgroundSymbol( chartFill.release() );
 
 1075    std::unique_ptr<QgsFillSymbol> chartBorder( mPlotItem->chartBorderSymbol()->clone() );
 
 1076    chartBorder->setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text ) );
 
 1077    mPlotItem->setChartBorderSymbol( chartBorder.release() );
 
 1080    std::unique_ptr<QgsLineSymbol> chartMajorSymbol( mPlotItem->xAxis().gridMajorSymbol()->clone() );
 
 1081    QColor 
c = chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text );
 
 1083    chartMajorSymbol->setColor( 
c );
 
 1084    mPlotItem->xAxis().setGridMajorSymbol( chartMajorSymbol->clone() );
 
 1085    mPlotItem->yAxis().setGridMajorSymbol( chartMajorSymbol.release() );
 
 1088    std::unique_ptr<QgsLineSymbol> chartMinorSymbol( mPlotItem->xAxis().gridMinorSymbol()->clone() );
 
 1089    QColor 
c = chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text );
 
 1091    chartMinorSymbol->setColor( 
c );
 
 1092    mPlotItem->xAxis().setGridMinorSymbol( chartMinorSymbol->clone() );
 
 1093    mPlotItem->yAxis().setGridMinorSymbol( chartMinorSymbol.release() );
 
 1095  mPlotItem->updatePlot();
 
 1100  if ( !mPlotItem->plotArea().contains( point.x(), point.y() ) )
 
 1103  return mPlotItem->canvasPointToPlotPoint( point );
 
 
 1108  return mPlotItem->plotPointToCanvasPoint( point );
 
 
 1114  mPlotItem->mProject = project;
 
 
 1124  mProfileCurve.reset( curve );
 
 
 1129  return mProfileCurve.get();
 
 
 1144  for ( 
QgsMapLayer *layer : std::as_const( mLayers ) )
 
 1146    setupLayerConnections( layer, 
true );
 
 1150  auto filteredList = 
layers;
 
 1151  filteredList.erase( std::remove_if( filteredList.begin(), filteredList.end(), []( 
QgsMapLayer *layer ) {
 
 1152                        return !layer || !layer->isValid();
 
 1154                      filteredList.end() );
 
 1156  mLayers = _qgis_listRawToQPointer( filteredList );
 
 1157  for ( 
QgsMapLayer *layer : std::as_const( mLayers ) )
 
 1159    setupLayerConnections( layer, 
false );
 
 
 1165  return _qgis_listQPointerToRaw( mLayers );
 
 
 1172  if ( mLockAxisScales )
 
 1174    double xMinimum = mPlotItem->xMinimum();
 
 1175    double xMaximum = mPlotItem->xMaximum();
 
 1176    double yMinimum = mPlotItem->yMinimum();
 
 1177    double yMaximum = mPlotItem->yMaximum();
 
 1178    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
 1179    mPlotItem->setXMinimum( xMinimum );
 
 1180    mPlotItem->setXMaximum( xMaximum );
 
 1181    mPlotItem->setYMinimum( yMinimum );
 
 1182    mPlotItem->setYMaximum( yMaximum );
 
 1185  mPlotItem->updateRect();
 
 1186  mCrossHairsItem->updateRect();
 
 
 1191  QgsPlotCanvas::paintEvent( 
event );
 
 1193  if ( !mFirstDrawOccurred )
 
 1196    mFirstDrawOccurred = 
true;
 
 1197    mPlotItem->updateRect();
 
 1198    mCrossHairsItem->updateRect();
 
 
 1204  if ( !mPlotItem->plotArea().contains( point.
x(), point.
y() ) )
 
 1207  if ( !mProfileCurve )
 
 1210  const double dx = point.
x() - mPlotItem->plotArea().left();
 
 1212  const double distanceAlongPlotPercent = dx / mPlotItem->plotArea().width();
 
 1213  double distanceAlongCurveLength = distanceAlongPlotPercent * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
 1215  std::unique_ptr<QgsPoint> mapXyPoint( mProfileCurve->interpolatePoint( distanceAlongCurveLength ) );
 
 1219  const double mapZ = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * ( mPlotItem->plotArea().bottom() - point.
y() ) + mPlotItem->yMinimum();
 
 1221  return QgsPoint( mapXyPoint->x(), mapXyPoint->y(), mapZ );
 
 
 1226  if ( !mProfileCurve )
 
 1231  const double distanceAlongCurve = 
geos.lineLocatePoint( point, &error );
 
 1233  const double distanceAlongCurveOnPlot = distanceAlongCurve - mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
 1234  const double distanceAlongCurvePercent = distanceAlongCurveOnPlot / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor );
 
 1235  const double distanceAlongPlotRect = distanceAlongCurvePercent * mPlotItem->plotArea().width();
 
 1237  const double canvasX = mPlotItem->plotArea().left() + distanceAlongPlotRect;
 
 1240  if ( std::isnan( point.
z() ) || point.
z() < mPlotItem->yMinimum() )
 
 1242    canvasY = mPlotItem->plotArea().top();
 
 1244  else if ( point.
z() > mPlotItem->yMaximum() )
 
 1246    canvasY = mPlotItem->plotArea().bottom();
 
 1250    const double yPercent = ( point.
z() - mPlotItem->yMinimum() ) / ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
 1251    canvasY = mPlotItem->plotArea().bottom() - mPlotItem->plotArea().height() * yPercent;
 
 
 1264  double yMinimum = 0;
 
 1265  double yMaximum = 0;
 
 1276    yMinimum = zRange.
lower() - 5;
 
 1277    yMaximum = zRange.
lower() + 5;
 
 1282    const double margin = ( zRange.
upper() - zRange.
lower() ) * 0.05;
 
 1283    yMinimum = zRange.
lower() - margin;
 
 1284    yMaximum = zRange.
upper() + margin;
 
 1288  double xMinimum = 0;
 
 1290  double xMaximum = profileLength * 1.02;
 
 1292  if ( mLockAxisScales )
 
 1294    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
 1297  mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
 1298  mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
 1299  mPlotItem->setYMinimum( yMinimum );
 
 1300  mPlotItem->setYMaximum( yMaximum );
 
 1303  mPlotItem->updatePlot();
 
 
 1309  if ( mLockAxisScales )
 
 1311    adjustRangeForAxisScaleLock( minimumDistance, maximumDistance, minimumElevation, maximumElevation );
 
 1314  mPlotItem->setYMinimum( minimumElevation );
 
 1315  mPlotItem->setYMaximum( maximumElevation );
 
 1316  mPlotItem->setXMinimum( minimumDistance / mPlotItem->mXScaleFactor );
 
 1317  mPlotItem->setXMaximum( maximumDistance / mPlotItem->mXScaleFactor );
 
 1319  mPlotItem->updatePlot();
 
 
 1325  return QgsDoubleRange( mPlotItem->xMinimum() * mPlotItem->mXScaleFactor, mPlotItem->xMaximum() * mPlotItem->mXScaleFactor );
 
 
 1330  return QgsDoubleRange( mPlotItem->yMinimum(), mPlotItem->yMaximum() );
 
 
 1339class QgsElevationProfilePlot : 
public Qgs2DPlot 
 1343      : mRenderer( renderer )
 
 1352      rc.
painter()->translate( plotArea.left(), plotArea.top() );
 
 1353      mRenderer->render( rc, plotArea.width(), plotArea.height(), xMinimum() * mXScale, 
xMaximum() * mXScale, 
yMinimum(), 
yMaximum() );
 
 1354      rc.
painter()->translate( -plotArea.left(), -plotArea.top() );
 
 1372  QgsElevationProfilePlot profilePlot( mCurrentJob );
 
 1376  QDomElement elem = doc.createElement( QStringLiteral( 
"plot" ) );
 
 1378  plotSettings.
writeXml( elem, doc, rwContext );
 
 1379  profilePlot.readXml( elem, rwContext );
 
 1381  profilePlot.mXScale = mPlotItem->mXScaleFactor;
 
 1382  profilePlot.xAxis().setLabelSuffix( mPlotItem->xAxis().labelSuffix() );
 
 1383  profilePlot.xAxis().setLabelSuffixPlacement( mPlotItem->xAxis().labelSuffixPlacement() );
 
 1385  profilePlot.setSize( QSizeF( width, height ) );
 
 1386  profilePlot.render( context );
 
 
 1396  return mCurrentJob->
identify( plotPoint, identifyContext() );
 
 
 1407  double distance1 = topLeftPlotPoint.
distance();
 
 1408  double distance2 = bottomRightPlotPoint.
distance();
 
 1409  if ( distance2 < distance1 )
 
 1410    std::swap( distance1, distance2 );
 
 1412  double elevation1 = topLeftPlotPoint.
elevation();
 
 1413  double elevation2 = bottomRightPlotPoint.
elevation();
 
 1414  if ( elevation2 < elevation1 )
 
 1415    std::swap( elevation1, elevation2 );
 
 
 1424  mPlotItem->updatePlot();
 
 
 1429  mSnappingEnabled = enabled;
 
 
@ FirstAndLastLabels
Place suffix after the first and last label values only.
 
DistanceUnit
Units of distance.
 
@ YardsBritishSears1922Truncated
British yards (Sears 1922 truncated)
 
@ MilesUSSurvey
US Survey miles.
 
@ LinksBritishSears1922
British links (Sears 1922)
 
@ YardsBritishBenoit1895A
British yards (Benoit 1895 A)
 
@ LinksBritishBenoit1895A
British links (Benoit 1895 A)
 
@ Centimeters
Centimeters.
 
@ YardsIndian1975
Indian yards (1975)
 
@ FeetUSSurvey
US Survey feet.
 
@ Millimeters
Millimeters.
 
@ FeetBritishSears1922
British feet (Sears 1922)
 
@ YardsClarkes
Clarke's yards.
 
@ YardsIndian
Indian yards.
 
@ FeetBritishBenoit1895B
British feet (Benoit 1895 B)
 
@ Miles
Terrestrial miles.
 
@ LinksUSSurvey
US Survey links.
 
@ ChainsUSSurvey
US Survey chains.
 
@ FeetClarkes
Clarke's feet.
 
@ Unknown
Unknown distance unit.
 
@ FeetBritish1936
British feet (1936)
 
@ FeetIndian1962
Indian feet (1962)
 
@ YardsBritishSears1922
British yards (Sears 1922)
 
@ FeetIndian1937
Indian feet (1937)
 
@ YardsIndian1937
Indian yards (1937)
 
@ Degrees
Degrees, for planar geographic CRS distance measurements.
 
@ ChainsBritishBenoit1895B
British chains (Benoit 1895 B)
 
@ LinksBritishSears1922Truncated
British links (Sears 1922 truncated)
 
@ ChainsBritishBenoit1895A
British chains (Benoit 1895 A)
 
@ YardsBritishBenoit1895B
British yards (Benoit 1895 B)
 
@ FeetBritish1865
British feet (1865)
 
@ YardsIndian1962
Indian yards (1962)
 
@ FeetBritishSears1922Truncated
British feet (Sears 1922 truncated)
 
@ MetersGermanLegal
German legal meter.
 
@ LinksBritishBenoit1895B
British links (Benoit 1895 B)
 
@ ChainsInternational
International chains.
 
@ LinksInternational
International links.
 
@ ChainsBritishSears1922Truncated
British chains (Sears 1922 truncated)
 
@ FeetIndian
Indian (geodetic) feet.
 
@ NauticalMiles
Nautical miles.
 
@ ChainsClarkes
Clarke's chains.
 
@ LinksClarkes
Clarke's links.
 
@ ChainsBritishSears1922
British chains (Sears 1922)
 
@ FeetIndian1975
Indian feet (1975)
 
@ FeetGoldCoast
Gold Coast feet.
 
@ FeetBritishBenoit1895A
British feet (Benoit 1895 A)
 
@ Group
Composite group layer. Added in QGIS 3.24.
 
@ Plugin
Plugin based layer.
 
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
 
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
 
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
 
@ Mesh
Mesh layer. Added in QGIS 3.2.
 
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
 
Base class for 2-dimensional plot/chart/graphs.
 
void calculateOptimisedIntervals(QgsRenderContext &context)
Automatically sets the grid and label intervals to optimal values for display in the given render con...
 
double yMaximum() const
Returns the maximum value of the y axis.
 
bool writeXml(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Writes the plot's properties into an XML element.
 
QgsPlotAxis & xAxis()
Returns a reference to the plot's x axis.
 
void setSize(QSizeF size)
Sets the overall size of the plot (including titles and over components which sit outside the plot ar...
 
double xMaximum() const
Returns the maximum value of the x axis.
 
void render(QgsRenderContext &context)
Renders the plot.
 
void setYMaximum(double maximum)
Sets the maximum value of the y axis.
 
double xMinimum() const
Returns the minimum value of the x axis.
 
double yMinimum() const
Returns the minimum value of the y axis.
 
QRectF interiorPlotArea(QgsRenderContext &context) const
Returns the area of the plot which corresponds to the actual plot content (excluding all titles and o...
 
void setYMinimum(double minimum)
Sets the minimum value of the y axis.
 
virtual void renderContent(QgsRenderContext &context, const QRectF &plotArea)
Renders the plot content.
 
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
 
Interface for classes which can generate elevation profiles.
 
virtual QgsAbstractTerrainProvider * clone() const =0
Creates a clone of the provider and returns the new object.
 
static QgsProfileSourceRegistry * profileSourceRegistry()
Returns registry of available profile source implementations.
 
This class represents a coordinate reference system (CRS).
 
Qgis::DistanceUnit mapUnits
 
Abstract base class for curved geometry type.
 
QgsRange which stores a range of double values.
 
A canvas for elevation profiles.
 
QgsDoubleRange visibleElevationRange() const
Returns the elevation range currently visible in the plot.
 
QgsCurve * profileCurve() const
Returns the profile curve.
 
void setTolerance(double tolerance)
Sets the profile tolerance (in crs() units).
 
void setLockAxisScales(bool lock)
Sets whether the distance and elevation scales are locked to each other.
 
void setProfileCurve(QgsCurve *curve)
Sets the profile curve.
 
void zoomToRect(const QRectF &rect) override
Zooms the plot to the specified rect in canvas units.
 
void activeJobCountChanged(int count)
Emitted when the number of active background jobs changes.
 
QgsElevationProfileCanvas(QWidget *parent=nullptr)
Constructor for QgsElevationProfileCanvas, with the specified parent widget.
 
void scalePlot(double factor) override
Scales the plot by a specified scale factor.
 
void paintEvent(QPaintEvent *event) override
 
QgsDoubleRange visibleDistanceRange() const
Returns the distance range currently visible in the plot.
 
void cancelJobs() override
Cancel any rendering job, in a blocking way.
 
QgsCoordinateReferenceSystem crs() const override
Returns the coordinate reference system (CRS) for map coordinates used by the canvas.
 
void clear()
Clears the current profile.
 
void setDistanceUnit(Qgis::DistanceUnit unit)
Sets the distance unit used by the canvas.
 
QgsProfilePoint canvasPointToPlotPoint(QPointF point) const
Converts a canvas point to the equivalent plot point.
 
void setBackgroundColor(const QColor &color)
Sets the background color to use for the profile canvas.
 
QgsPointXY plotPointToCanvasPoint(const QgsProfilePoint &point) const
Converts a plot point to the equivalent canvas point.
 
QgsPoint toMapCoordinates(const QgsPointXY &point) const override
Converts a point on the canvas to the associated map coordinate.
 
bool lockAxisScales() const
Returns true if the distance and elevation scales are locked to each other.
 
void setVisiblePlotRange(double minimumDistance, double maximumDistance, double minimumElevation, double maximumElevation)
Sets the visible area of the plot.
 
void canvasPointHovered(const QgsPointXY &point, const QgsProfilePoint &profilePoint)
Emitted when the mouse hovers over the specified point (in canvas coordinates).
 
void render(QgsRenderContext &context, double width, double height, const Qgs2DPlot &plotSettings)
Renders a portion of the profile using the specified render context.
 
QgsPointXY snapToPlot(QPoint point) override
Snap a canvas point to the plot.
 
void setProject(QgsProject *project)
Sets the project associated with the profile.
 
QList< QgsMapLayer * > layers() const
Returns the list of layers included in the profile.
 
void resizeEvent(QResizeEvent *event) override
 
void centerPlotOn(double x, double y) override
Centers the plot on the plot point corresponding to x, y in canvas units.
 
const Qgs2DPlot & plot() const
Returns a reference to the 2D plot used by the widget.
 
void wheelZoom(QWheelEvent *event) override
Zoom plot from a mouse wheel event.
 
void refresh() override
Triggers a complete regeneration of the profile, causing the profile extraction to perform in the bac...
 
Qgis::DistanceUnit distanceUnit() const
Returns the distance unit used by the canvas.
 
double tolerance() const
Returns the tolerance of the profile (in crs() units).
 
void mouseMoveEvent(QMouseEvent *e) override
 
void panContentsBy(double dx, double dy) override
Pans the plot contents by dx, dy in canvas units.
 
void invalidateCurrentPlotExtent()
Invalidates the current plot extent, which means that the visible plot area will be recalculated and ...
 
QgsPointXY toCanvasCoordinates(const QgsPoint &point) const override
Converts a point in map coordinates to the associated canvas point.
 
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the crs associated with the canvas' map coordinates.
 
~QgsElevationProfileCanvas() override
 
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of layers to include in the profile.
 
void zoomFull()
Zooms to the full extent of the profile.
 
void setSnappingEnabled(bool enabled)
Sets whether snapping of cursor points is enabled.
 
QVector< QgsProfileIdentifyResults > identify(QPointF point)
Identify results visible at the specified plot point.
 
QRectF plotArea() const
Returns the interior rectangle representing the surface of the plot, in canvas coordinates.
 
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
 
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
 
Does vector analysis using the GEOS library and handles import, export, and exception handling.
 
Base class for storage of map layer elevation properties.
 
void profileGenerationPropertyChanged()
Emitted when any of the elevation properties which relate solely to generation of elevation profiles ...
 
void profileRenderingPropertyChanged()
Emitted when any of the elevation properties which relate solely to presentation of elevation results...
 
Base class for all map layer types.
 
void dataChanged()
Data of layer changed.
 
virtual QgsMapLayerElevationProperties * elevationProperties()
Returns the layer's elevation properties.
 
Perform transforms between map coordinates and device coordinates.
 
A context for numeric formats.
 
void setLabelSuffixPlacement(Qgis::PlotAxisSuffixPlacement placement)
Sets the placement for the axis label suffixes.
 
void setLabelSuffix(const QString &suffix)
Sets the axis label suffix.
 
An abstract class for items that can be placed on a QgsPlotCanvas.
 
virtual void paint(QPainter *painter)=0
Paints the item.
 
Plot canvas is a class for displaying interactive 2d charts and plots.
 
bool event(QEvent *e) override
 
void plotAreaChanged()
Emitted whenever the visible area of the plot is changed.
 
void mouseMoveEvent(QMouseEvent *e) override
 
void resizeEvent(QResizeEvent *e) override
 
A class to represent a 2D point.
 
bool isEmpty() const
Returns true if the geometry is empty.
 
Point geometry type, with support for z-dimension and m-values.
 
Encapsulates the context in which an elevation profile is to be generated.
 
double maximumErrorMapUnits() const
Returns the maximum allowed error in the generated result, in profile curve map units.
 
void setDpi(double dpi)
Sets the dpi (dots per inch) for the profie, to be used in size conversions.
 
void setMaximumErrorMapUnits(double error)
Sets the maximum allowed error in the generated result, in profile curve map units.
 
void setDistanceRange(const QgsDoubleRange &range)
Sets the range of distances to include in the generation.
 
void setElevationRange(const QgsDoubleRange &range)
Sets the range of elevations to include in the generation.
 
void setMapUnitsPerDistancePixel(double units)
Sets the number of map units per pixel in the distance dimension.
 
Encapsulates the context of identifying profile results.
 
double maximumPointElevationDelta
Maximum allowed snapping delta for the elevation values when identifying a point.
 
double maximumPointDistanceDelta
Maximum allowed snapping delta for the distance values when identifying a point.
 
QgsProject * project
Associated project.
 
double displayRatioElevationVsDistance
Display ratio of elevation vs distance units.
 
double maximumSurfaceDistanceDelta
Maximum allowed snapping delta for the distance values when identifying a continuous elevation surfac...
 
double maximumSurfaceElevationDelta
Maximum allowed snapping delta for the elevation values when identifying a continuous elevation surfa...
 
Generates and renders elevation profile plots.
 
QgsProfileSnapResult snapPoint(const QgsProfilePoint &point, const QgsProfileSnapContext &context)
Snap a point to the results.
 
void regenerateInvalidatedResults()
Starts a background regeneration of any invalidated results and immediately returns.
 
void invalidateAllRefinableSources()
Invalidates previous results from all refinable sources.
 
void cancelGeneration()
Stop the generation job - does not return until the job has terminated.
 
void startGeneration()
Start the generation job and immediately return.
 
QgsDoubleRange zRange() const
Returns the limits of the retrieved elevation values.
 
QVector< QgsProfileIdentifyResults > identify(const QgsProfilePoint &point, const QgsProfileIdentifyContext &context)
Identify results visible at the specified profile point.
 
bool isActive() const
Returns true if the generation job is currently running in background.
 
bool invalidateResults(QgsAbstractProfileSource *source)
Invalidates the profile results from the source with matching ID.
 
void replaceSource(QgsAbstractProfileSource *source)
Replaces the existing source with matching ID.
 
void setContext(const QgsProfileGenerationContext &context)
Sets the context in which the profile generation will occur.
 
void generationFinished()
Emitted when the profile generation is finished (or canceled).
 
Encapsulates a point on a distance-elevation profile.
 
double elevation() const
Returns the elevation of the point.
 
double distance() const
Returns the distance of the point.
 
bool isEmpty() const
Returns true if the point is empty.
 
Encapsulates properties and constraints relating to fetching elevation profiles from different source...
 
QgsProfileRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate expressions.
 
QgsProfileRequest & setTransformContext(const QgsCoordinateTransformContext &context)
Sets the transform context, for use when transforming coordinates from a source to the request's crs(...
 
QgsProfileRequest & setTerrainProvider(QgsAbstractTerrainProvider *provider)
Sets the terrain provider.
 
QgsProfileRequest & setTolerance(double tolerance)
Sets the tolerance of the request (in crs() units).
 
QgsProfileRequest & setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the desired Coordinate Reference System (crs) for the profile.
 
Encapsulates the context of snapping a profile point.
 
double maximumPointDistanceDelta
Maximum allowed snapping delta for the distance values when snapping to a point.
 
double maximumSurfaceElevationDelta
Maximum allowed snapping delta for the elevation values when snapping to a continuous elevation surfa...
 
double maximumPointElevationDelta
Maximum allowed snapping delta for the elevation values when snapping to a point.
 
double maximumSurfaceDistanceDelta
Maximum allowed snapping delta for the distance values when snapping to a continuous elevation surfac...
 
double displayRatioElevationVsDistance
Display ratio of elevation vs distance units.
 
Encapsulates results of snapping a profile point.
 
bool isValid() const
Returns true if the result is a valid point.
 
QgsProfilePoint snappedPoint
Snapped point.
 
QList< QgsAbstractProfileSource * > profileSources() const
Returns a list of registered profile sources.
 
QgsAbstractTerrainProvider * terrainProvider()
Returns the project's terrain provider.
 
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
 
const QgsProjectElevationProperties * elevationProperties() const
Returns the project's elevation properties, which contains the project's elevation related settings.
 
QgsCoordinateTransformContext transformContext
 
T lower() const
Returns the lower bound of the range.
 
T upper() const
Returns the upper bound of the range.
 
The class is used as a container of context for various read/write operations on other objects.
 
Contains information about the context of a rendering operation.
 
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
 
void setDevicePixelRatio(float ratio)
Sets the device pixel ratio.
 
QPainter * painter()
Returns the destination QPainter for the render operation.
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
 
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
 
A utility class for dynamic handling of changes to screen properties.
 
double screenDpi() const
Returns the current screen DPI for the screen that the parent widget appears on.
 
This class is a composition of two QSettings instances:
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
Container for all settings relating to text rendering.
 
void setColor(const QColor &color)
Sets the color that text will be rendered in.
 
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
 
static Q_INVOKABLE QString toAbbreviatedString(Qgis::DistanceUnit unit)
Returns a translated abbreviation representing a distance unit.
 
Represents a vector layer which manages a vector based data sets.
 
void attributeValueChanged(QgsFeatureId fid, int idx, const QVariant &value)
Emitted whenever an attribute value change is done in the edit buffer.
 
void featureAdded(QgsFeatureId fid)
Emitted when a new feature has been added to the layer.
 
void featureDeleted(QgsFeatureId fid)
Emitted when a feature has been deleted.
 
void geometryChanged(QgsFeatureId fid, const QgsGeometry &geometry)
Emitted whenever a geometry change is done in the edit buffer.
 
Contains geos related utilities and functions.
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
#define BUILTIN_UNREACHABLE
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
const QgsCoordinateReferenceSystem & crs