66      mRect = mCanvas->rect();
 
   69      prepareGeometryChange();
 
   70      setPos( mRect.topLeft() );
 
   73      mCachedImages.clear();
 
   81      mCachedImages.clear();
 
   86    bool redrawResults( 
const QString &sourceId )
 
   88      auto it = mCachedImages.find( sourceId );
 
   89      if ( it == mCachedImages.end() )
 
   92      mCachedImages.erase( it );
 
   97    QRectF boundingRect()
 const override 
  102    QString distanceSuffix()
 const 
  104      switch ( mDistanceUnit )
 
  118          return QObject::tr( 
"°" );
 
  127      mDistanceUnit = unit;
 
  134      if ( !mPlotArea.isNull() )
 
  139      if ( !scene()->views().isEmpty() )
 
  140        context.
setScaleFactor( scene()->views().at( 0 )->logicalDpiX() / 25.4 );
 
  149      const QRectF area = plotArea();
 
  150      if ( !area.contains( point.x(), point.y() ) )
 
  153      const double distance = ( point.x() - area.left() ) / area.width() * ( 
xMaximum() - 
xMinimum() ) * mXScaleFactor + 
xMinimum() * mXScaleFactor;
 
  160      if ( point.
distance() < xMinimum() * mXScaleFactor || point.
distance() > xMaximum()* mXScaleFactor || point.
elevation() < yMinimum() || point.
elevation() > yMaximum() )
 
  163      const QRectF area = plotArea();
 
  172      mPlotArea = plotArea;
 
  177      const double pixelRatio = !scene()->views().empty() ? scene()->views().at( 0 )->devicePixelRatioF() : 1;
 
  179      const QStringList sourceIds = mRenderer->sourceIds();
 
  180      for ( 
const QString &source : sourceIds )
 
  183        auto it = mCachedImages.constFind( source );
 
  184        if ( it != mCachedImages.constEnd() )
 
  190          plot = mRenderer->renderToImage( plotArea.width() * pixelRatio,
 
  191                                           plotArea.height() * pixelRatio, xMinimum() * mXScaleFactor, 
xMaximum() * mXScaleFactor, 
yMinimum(), 
yMaximum(), source, pixelRatio );
 
  192          plot.setDevicePixelRatio( pixelRatio );
 
  193          mCachedImages.insert( source, plot );
 
  195        rc.
painter()->drawImage( QPointF( plotArea.left(),
 
  196                                          plotArea.top() ), plot );
 
  200    void paint( QPainter *painter )
 override 
  203      if ( !mImage.isNull() )
 
  205        painter->drawImage( QPointF( 0, 0 ), mImage );
 
  209        const double pixelRatio = !scene()->views().empty() ? scene()->views().at( 0 )->devicePixelRatioF() : 1;
 
  210        mImage = QImage( mRect.width() * pixelRatio, mRect.height() * pixelRatio, QImage::Format_ARGB32_Premultiplied );
 
  211        mImage.setDevicePixelRatio( pixelRatio );
 
  212        mImage.fill( Qt::transparent );
 
  214        QPainter imagePainter( &mImage );
 
  215        imagePainter.setRenderHint( QPainter::Antialiasing, 
true );
 
  219        const double mapUnitsPerPixel = ( 
xMaximum() - 
xMinimum() ) * mXScaleFactor / plotArea().width();
 
  229        painter->drawImage( QPointF( 0, 0 ), mImage );
 
  234    double mXScaleFactor = 1.0;
 
  242    QMap< QString, QImage > mCachedImages;
 
  255      , mPlotItem( plotItem )
 
  261      mRect = mCanvas->rect();
 
  263      prepareGeometryChange();
 
  264      setPos( mRect.topLeft() );
 
  274    QRectF boundingRect()
 const override 
  279    void paint( QPainter *painter )
 override 
  281      const QgsPointXY crossHairPlotPoint  = mPlotItem->plotPointToCanvasPoint( mPoint );
 
  282      if ( crossHairPlotPoint.
isEmpty() )
 
  286      painter->setBrush( Qt::NoBrush );
 
  288      crossHairPen.setCosmetic( 
true );
 
  289      crossHairPen.setWidthF( 1 );
 
  290      crossHairPen.setStyle( Qt::DashLine );
 
  291      crossHairPen.setCapStyle( Qt::FlatCap );
 
  292      const QPalette scenePalette = mPlotItem->scene()->palette();
 
  293      QColor penColor = scenePalette.color( QPalette::ColorGroup::Active, QPalette::Text );
 
  294      penColor.setAlpha( 150 );
 
  295      crossHairPen.setColor( penColor );
 
  296      painter->setPen( crossHairPen );
 
  297      painter->drawLine( QPointF( mPlotItem->plotArea().left(), crossHairPlotPoint.
y() ), QPointF( mPlotItem->plotArea().right(), crossHairPlotPoint.
y() ) );
 
  298      painter->drawLine( QPointF( crossHairPlotPoint.
x(), mPlotItem->plotArea().top() ), QPointF( crossHairPlotPoint.
x(), mPlotItem->plotArea().bottom() ) );
 
  303      const QString xCoordinateText = mPlotItem->xAxis().numericFormat()->formatDouble( mPoint.distance() / mPlotItem->mXScaleFactor, numericContext )
 
  304                                      + mPlotItem->distanceSuffix();
 
  306      const QString yCoordinateText = mPlotItem->yAxis().numericFormat()->formatDouble( mPoint.elevation(), numericContext );
 
  309      const QFontMetrics fm( font );
 
  310      const double height = fm.capHeight();
 
  311      const double xWidth = fm.horizontalAdvance( xCoordinateText );
 
  312      const double yWidth = fm.horizontalAdvance( yCoordinateText );
 
  313      const double textAxisMargin = fm.horizontalAdvance( 
' ' );
 
  315      QPointF xCoordOrigin;
 
  316      QPointF yCoordOrigin;
 
  318      if ( mPoint.distance() < ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5 * mPlotItem->mXScaleFactor )
 
  320        if ( mPoint.elevation() < ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5 )
 
  323          xCoordOrigin = QPointF( crossHairPlotPoint.
x() + textAxisMargin, mPlotItem->plotArea().top() + height + textAxisMargin );
 
  325          yCoordOrigin = QPointF( mPlotItem->plotArea().right() - yWidth - textAxisMargin, crossHairPlotPoint.
y() - textAxisMargin );
 
  330          xCoordOrigin = QPointF( crossHairPlotPoint.
x() + textAxisMargin, mPlotItem->plotArea().bottom() - textAxisMargin );
 
  332          yCoordOrigin = QPointF( mPlotItem->plotArea().right() - yWidth - textAxisMargin, crossHairPlotPoint.
y() + height + textAxisMargin );
 
  337        if ( mPoint.elevation() < ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5 )
 
  340          xCoordOrigin = QPointF( crossHairPlotPoint.
x() - xWidth - textAxisMargin, mPlotItem->plotArea().top() + height + textAxisMargin );
 
  342          yCoordOrigin = QPointF( mPlotItem->plotArea().left() + textAxisMargin, crossHairPlotPoint.
y() - textAxisMargin );
 
  347          xCoordOrigin = QPointF( crossHairPlotPoint.
x() - xWidth - textAxisMargin, mPlotItem->plotArea().bottom() - textAxisMargin );
 
  349          yCoordOrigin = QPointF( mPlotItem->plotArea().left() + textAxisMargin, crossHairPlotPoint.
y() + height + textAxisMargin );
 
  354      QColor backgroundColor = mPlotItem->chartBackgroundSymbol()->color();
 
  355      backgroundColor.setAlpha( 220 );
 
  356      painter->setBrush( QBrush( backgroundColor ) );
 
  357      painter->setPen( Qt::NoPen );
 
  358      painter->drawRect( QRectF( xCoordOrigin.x() - textAxisMargin + 1, xCoordOrigin.y() - textAxisMargin - height + 1, xWidth + 2 * textAxisMargin - 2, height + 2 * textAxisMargin - 2 ) );
 
  359      painter->drawRect( QRectF( yCoordOrigin.x() - textAxisMargin + 1, yCoordOrigin.y() - textAxisMargin - height + 1, yWidth + 2 * textAxisMargin - 2, height + 2 * textAxisMargin - 2 ) );
 
  361      painter->setBrush( Qt::NoBrush );
 
  362      painter->setPen( scenePalette.color( QPalette::ColorGroup::Active, QPalette::Text ) );
 
  364      painter->drawText( xCoordOrigin, xCoordinateText );
 
  365      painter->drawText( yCoordOrigin, yCoordinateText );
 
  373    QgsElevationProfilePlotItem *mPlotItem = 
nullptr;
 
  383  mPlotItem = 
new QgsElevationProfilePlotItem( 
this );
 
  388  mCrossHairsItem = 
new QgsElevationProfileCrossHairsItem( 
this, mPlotItem );
 
  389  mCrossHairsItem->setZValue( 100 );
 
  390  mCrossHairsItem->hide();
 
  393  mDeferredRegenerationTimer = 
new QTimer( 
this );
 
  394  mDeferredRegenerationTimer->setSingleShot( 
true );
 
  395  mDeferredRegenerationTimer->stop();
 
  396  connect( mDeferredRegenerationTimer, &QTimer::timeout, 
this, &QgsElevationProfileCanvas::startDeferredRegeneration );
 
  398  mDeferredRedrawTimer = 
new QTimer( 
this );
 
  399  mDeferredRedrawTimer->setSingleShot( 
true );
 
  400  mDeferredRedrawTimer->stop();
 
  401  connect( mDeferredRedrawTimer, &QTimer::timeout, 
this, &QgsElevationProfileCanvas::startDeferredRedraw );
 
 
  409    mPlotItem->setRenderer( 
nullptr );
 
  410    mCurrentJob->deleteLater();
 
  411    mCurrentJob = 
nullptr;
 
 
  419    mPlotItem->setRenderer( 
nullptr );
 
  422    mCurrentJob->deleteLater();
 
  423    mCurrentJob = 
nullptr;
 
 
  429  const double dxPercent = dx / mPlotItem->plotArea().width();
 
  430  const double dyPercent = dy / mPlotItem->plotArea().height();
 
  433  const double dxPlot = - dxPercent * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() );
 
  434  const double dyPlot = dyPercent * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
  437  mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  438  mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  439  mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  440  mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
  444  mPlotItem->updatePlot();
 
 
  450  if ( !mPlotItem->plotArea().contains( x, y ) )
 
  453  const double newCenterX = mPlotItem->xMinimum() + ( x - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() );
 
  454  const double newCenterY = mPlotItem->yMinimum() + ( mPlotItem->plotArea().bottom() - y ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
  456  const double dxPlot = newCenterX - ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5;
 
  457  const double dyPlot = newCenterY - ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5;
 
  460  mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  461  mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  462  mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  463  mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
  467  mPlotItem->updatePlot();
 
 
  479  const double toleranceInPixels = QFontMetrics( font() ).horizontalAdvance( 
' ' );
 
  480  const double xToleranceInPlotUnits = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) * toleranceInPixels;
 
  481  const double yToleranceInPlotUnits = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * toleranceInPixels;
 
  489      / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) );
 
  496  const double toleranceInPixels = QFontMetrics( font() ).horizontalAdvance( 
' ' );
 
  497  const double xToleranceInPlotUnits = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) * toleranceInPixels;
 
  498  const double yToleranceInPlotUnits = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * toleranceInPixels;
 
  506      / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) );
 
  513void QgsElevationProfileCanvas::setupLayerConnections( 
QgsMapLayer *layer, 
bool isDisconnect )
 
  528  switch ( layer->
type() )
 
  561void QgsElevationProfileCanvas::adjustRangeForAxisScaleLock( 
double &xMinimum, 
double &xMaximum, 
double &yMinimum, 
double &yMaximum )
 const 
  564  const double horizontalScale = ( xMaximum - xMinimum ) / mPlotItem->plotArea().width();
 
  565  const double verticalScale = ( yMaximum - yMinimum ) / mPlotItem->plotArea().height();
 
  566  if ( horizontalScale > verticalScale )
 
  568    const double height = horizontalScale * mPlotItem->plotArea().height();
 
  569    const double deltaHeight = ( yMaximum - yMinimum ) - height;
 
  570    yMinimum += deltaHeight / 2;
 
  571    yMaximum -= deltaHeight / 2;
 
  575    const double width = verticalScale * mPlotItem->plotArea().width();
 
  576    const double deltaWidth = ( ( xMaximum - xMinimum ) - width );
 
  577    xMinimum += deltaWidth / 2;
 
  578    xMaximum -= deltaWidth / 2;
 
  584  return mDistanceUnit;
 
 
  589  mDistanceUnit = unit;
 
  590  const double oldMin = mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  591  const double oldMax = mPlotItem->xMaximum() * mPlotItem->mXScaleFactor;
 
  593  mPlotItem->setXAxisUnits( mDistanceUnit );
 
  594  mPlotItem->setXMinimum( oldMin / mPlotItem->mXScaleFactor );
 
  595  mPlotItem->setXMaximum( oldMax / mPlotItem->mXScaleFactor );
 
  596  mPlotItem->updatePlot();
 
 
  601  if ( !color.isValid() )
 
  603    QPalette customPalette = qApp->palette();
 
  604    const QColor baseColor = qApp->palette().color( QPalette::ColorRole::Base );
 
  605    const QColor windowColor = qApp->palette().color( QPalette::ColorRole::Window );
 
  606    customPalette.setColor( QPalette::ColorRole::Base, windowColor );
 
  607    customPalette.setColor( QPalette::ColorRole::Window, baseColor );
 
  608    setPalette( customPalette );
 
  609    scene()->setPalette( customPalette );
 
  614    const bool isDarkTheme = color.lightnessF() < 0.5;
 
  615    QPalette customPalette = qApp->palette();
 
  616    customPalette.setColor( QPalette::ColorRole::Window, color );
 
  619      customPalette.setColor( QPalette::ColorRole::Text, QColor( 255, 255, 255 ) );
 
  620      customPalette.setColor( QPalette::ColorRole::Base, color.lighter( 120 ) );
 
  624      customPalette.setColor( QPalette::ColorRole::Text, QColor( 0, 0, 0 ) );
 
  625      customPalette.setColor( QPalette::ColorRole::Base, color.darker( 120 ) );
 
  628    setPalette( customPalette );
 
  629    scene()->setPalette( customPalette );
 
  632  updateChartFromPalette();
 
 
  637  return mLockAxisScales;
 
 
  642  mLockAxisScales = lock;
 
  643  if ( mLockAxisScales )
 
  645    double xMinimum = mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  646    double xMaximum = mPlotItem->xMaximum() * mPlotItem->mXScaleFactor;
 
  647    double yMinimum = mPlotItem->yMinimum();
 
  648    double yMaximum = mPlotItem->yMaximum();
 
  649    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
  650    mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
  651    mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
  652    mPlotItem->setYMinimum( yMinimum );
 
  653    mPlotItem->setYMaximum( yMaximum );
 
  656    mPlotItem->updatePlot();
 
 
  663  if ( !mCurrentJob || !mSnappingEnabled )
 
 
  677  if ( mLockAxisScales )
 
  680  const double currentWidth = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor;
 
  681  const double currentHeight = mPlotItem->yMaximum() - mPlotItem->yMinimum();
 
  683  const double newWidth = currentWidth / xFactor;
 
  684  const double newHeight = currentHeight / yFactor;
 
  686  const double currentCenterX = ( mPlotItem->xMinimum() + mPlotItem->xMaximum() ) * 0.5 * mPlotItem->mXScaleFactor;
 
  687  const double currentCenterY = ( mPlotItem->yMinimum() + mPlotItem->yMaximum() ) * 0.5;
 
  689  double xMinimum = currentCenterX - newWidth * 0.5;
 
  690  double xMaximum = currentCenterX + newWidth * 0.5;
 
  691  double yMinimum = currentCenterY - newHeight * 0.5;
 
  692  double yMaximum = currentCenterY + newHeight * 0.5;
 
  693  if ( mLockAxisScales )
 
  695    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
  698  mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
  699  mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
  700  mPlotItem->setYMinimum( yMinimum );
 
  701  mPlotItem->setYMaximum( yMaximum );
 
  704  mPlotItem->updatePlot();
 
 
  710  const QRectF intersected = rect.intersected( mPlotItem->plotArea() );
 
  712  double minX = ( intersected.left() - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  713  double maxX = ( intersected.right() - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  714  double minY = ( mPlotItem->plotArea().bottom() - intersected.bottom() ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  715  double maxY = ( mPlotItem->plotArea().bottom() - intersected.top() ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  717  if ( mLockAxisScales )
 
  719    adjustRangeForAxisScaleLock( minX, maxX, minY, maxY );
 
  722  mPlotItem->setXMinimum( minX / mPlotItem->mXScaleFactor );
 
  723  mPlotItem->setXMaximum( maxX / mPlotItem->mXScaleFactor );
 
  724  mPlotItem->setYMinimum( minY );
 
  725  mPlotItem->setYMaximum( maxY );
 
  728  mPlotItem->updatePlot();
 
 
  736  double zoomFactor = settings.
value( QStringLiteral( 
"qgis/zoom_factor" ), 2 ).toDouble();
 
  737  bool reverseZoom = settings.
value( QStringLiteral( 
"qgis/reverse_wheel_zoom" ), 
false ).toBool();
 
  738  bool zoomIn = reverseZoom ? 
event->angleDelta().y() < 0 : 
event->angleDelta().y() > 0;
 
  741  zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 120.0 * std::fabs( 
event->angleDelta().y() );
 
  743  if ( 
event->modifiers() & Qt::ControlModifier )
 
  746    zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 20.0;
 
  750  double scaleFactor = ( zoomIn ? 1 / zoomFactor : zoomFactor );
 
  752  QRectF viewportRect = mPlotItem->plotArea();
 
  754  if ( viewportRect.contains( 
event->position() ) )
 
  757    const double oldCenterX = 0.5 * ( mPlotItem->xMaximum() + mPlotItem->xMinimum() );
 
  758    const double oldCenterY = 0.5 * ( mPlotItem->yMaximum() + mPlotItem->yMinimum() );
 
  760    const double eventPosX = ( 
event->position().x() - viewportRect.left() ) / viewportRect.width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) + mPlotItem->xMinimum();
 
  761    const double eventPosY = ( viewportRect.bottom() - 
event->position().y() ) / viewportRect.height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  763    const double newCenterX = eventPosX + ( ( oldCenterX - eventPosX ) * scaleFactor );
 
  764    const double newCenterY = eventPosY + ( ( oldCenterY - eventPosY ) * scaleFactor );
 
  766    const double dxPlot = newCenterX - ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5;
 
  767    const double dyPlot = newCenterY - ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5;
 
  770    mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  771    mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  772    mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  773    mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
 
  791  if ( e->isAccepted() )
 
  793    mCrossHairsItem->hide();
 
  798  if ( mCurrentJob && mSnappingEnabled && !plotPoint.
isEmpty() )
 
  807    mCrossHairsItem->hide();
 
  811    mCrossHairsItem->setPoint( plotPoint );
 
  812    mCrossHairsItem->show();
 
 
  819  return mPlotItem->plotArea();
 
 
  829    mPlotItem->setRenderer( 
nullptr );
 
  831    mCurrentJob->deleteLater();
 
  832    mCurrentJob = 
nullptr;
 
  845  const QList< QgsMapLayer * > layersToGenerate = 
layers();
 
  846  QList< QgsAbstractProfileSource * > sources;
 
  847  sources.reserve( layersToGenerate .size() );
 
  851      sources.append( source );
 
  859  generationContext.
setMaximumErrorMapUnits( MAX_ERROR_PIXELS * ( mProfileCurve->length() ) / mPlotItem->plotArea().width() );
 
  864  mPlotItem->setRenderer( mCurrentJob );
 
 
  871  mZoomFullWhenJobFinished = 
true;
 
 
  874void QgsElevationProfileCanvas::generationFinished()
 
  881  if ( mZoomFullWhenJobFinished )
 
  884    mZoomFullWhenJobFinished = 
false;
 
  893    mPlotItem->updatePlot();
 
  896  if ( mForceRegenerationAfterCurrentJobCompletes )
 
  898    mForceRegenerationAfterCurrentJobCompletes = 
false;
 
  900    scheduleDeferredRegeneration();
 
  904void QgsElevationProfileCanvas::onLayerProfileGenerationPropertyChanged()
 
  907  if ( !mCurrentJob || mCurrentJob->
isActive() )
 
  914  if ( 
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( properties->parent() ) )
 
  919        scheduleDeferredRegeneration();
 
  924void QgsElevationProfileCanvas::onLayerProfileRendererPropertyChanged()
 
  927  if ( !mCurrentJob || mCurrentJob->
isActive() )
 
  934  if ( 
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( properties->parent() ) )
 
  940    if ( mPlotItem->redrawResults( layer->
id() ) )
 
  941      scheduleDeferredRedraw();
 
  945void QgsElevationProfileCanvas::regenerateResultsForLayer()
 
  947  if ( 
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( sender() ) )
 
  952        scheduleDeferredRegeneration();
 
  957void QgsElevationProfileCanvas::scheduleDeferredRegeneration()
 
  959  if ( !mDeferredRegenerationScheduled )
 
  961    mDeferredRegenerationTimer->start( 1 );
 
  962    mDeferredRegenerationScheduled = 
true;
 
  966void QgsElevationProfileCanvas::scheduleDeferredRedraw()
 
  968  if ( !mDeferredRedrawScheduled )
 
  970    mDeferredRedrawTimer->start( 1 );
 
  971    mDeferredRedrawScheduled = 
true;
 
  975void QgsElevationProfileCanvas::startDeferredRegeneration()
 
  977  if ( mCurrentJob && !mCurrentJob->
isActive() )
 
  982  else if ( mCurrentJob )
 
  984    mForceRegenerationAfterCurrentJobCompletes = 
true;
 
  987  mDeferredRegenerationScheduled = 
false;
 
  990void QgsElevationProfileCanvas::startDeferredRedraw()
 
  993  mDeferredRedrawScheduled = 
false;
 
  996void QgsElevationProfileCanvas::refineResults()
 
 1002    const double plotDistanceRange = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor;
 
 1003    const double plotElevationRange = mPlotItem->yMaximum() - mPlotItem->yMinimum();
 
 1004    const double plotDistanceUnitsPerPixel = plotDistanceRange / mPlotItem->plotArea().width();
 
 1008    const double targetMaxErrorInMapUnits = MAX_ERROR_PIXELS * plotDistanceUnitsPerPixel;
 
 1009    const double factor = std::pow( 10.0, 1 - std::ceil( std::log10( std::fabs( targetMaxErrorInMapUnits ) ) ) );
 
 1010    const double roundedErrorInMapUnits = std::floor( targetMaxErrorInMapUnits * factor ) / factor;
 
 1018                              mPlotItem->xMaximum() * mPlotItem->mXScaleFactor + plotDistanceRange * 0.05 ) );
 
 1021                               mPlotItem->yMaximum() + plotElevationRange * 0.05 ) );
 
 1024  scheduleDeferredRegeneration();
 
 1027void QgsElevationProfileCanvas::updateChartFromPalette()
 
 1029  const QPalette chartPalette = palette();
 
 1030  setBackgroundBrush( QBrush( chartPalette.color( QPalette::ColorRole::Base ) ) );
 
 1033    textFormat.
setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::Text ) );
 
 1034    mPlotItem->xAxis().setTextFormat( textFormat );
 
 1035    mPlotItem->yAxis().setTextFormat( textFormat );
 
 1038    std::unique_ptr< QgsFillSymbol > chartFill( mPlotItem->chartBackgroundSymbol()->clone() );
 
 1039    chartFill->setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Window ) );
 
 1040    mPlotItem->setChartBackgroundSymbol( chartFill.release() );
 
 1043    std::unique_ptr< QgsFillSymbol > chartBorder( mPlotItem->chartBorderSymbol()->clone() );
 
 1044    chartBorder->setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text ) );
 
 1045    mPlotItem->setChartBorderSymbol( chartBorder.release() );
 
 1048    std::unique_ptr< QgsLineSymbol > chartMajorSymbol( mPlotItem->xAxis().gridMajorSymbol()->clone() );
 
 1049    QColor 
c = chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text );
 
 1051    chartMajorSymbol->setColor( 
c );
 
 1052    mPlotItem->xAxis().setGridMajorSymbol( chartMajorSymbol->clone() );
 
 1053    mPlotItem->yAxis().setGridMajorSymbol( chartMajorSymbol.release() );
 
 1056    std::unique_ptr< QgsLineSymbol > chartMinorSymbol( mPlotItem->xAxis().gridMinorSymbol()->clone() );
 
 1057    QColor 
c = chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text );
 
 1059    chartMinorSymbol->setColor( 
c );
 
 1060    mPlotItem->xAxis().setGridMinorSymbol( chartMinorSymbol->clone() );
 
 1061    mPlotItem->yAxis().setGridMinorSymbol( chartMinorSymbol.release() );
 
 1063  mPlotItem->updatePlot();
 
 1068  if ( !mPlotItem->plotArea().contains( point.x(), point.y() ) )
 
 1071  return mPlotItem->canvasPointToPlotPoint( point );
 
 
 1076  return mPlotItem->plotPointToCanvasPoint( point );
 
 
 1082  mPlotItem->mProject = project;
 
 
 1092  mProfileCurve.reset( curve );
 
 
 1097  return mProfileCurve.get();
 
 
 1112  for ( 
QgsMapLayer *layer : std::as_const( mLayers ) )
 
 1114    setupLayerConnections( layer, 
true );
 
 1118  auto filteredList = 
layers;
 
 1119  filteredList.erase( std::remove_if( filteredList.begin(), filteredList.end(),
 
 1122    return !layer || !layer->isValid();
 
 1123  } ), filteredList.end() );
 
 1125  mLayers = _qgis_listRawToQPointer( filteredList );
 
 1126  for ( 
QgsMapLayer *layer : std::as_const( mLayers ) )
 
 1128    setupLayerConnections( layer, 
false );
 
 
 1134  return _qgis_listQPointerToRaw( mLayers );
 
 
 1141  if ( mLockAxisScales )
 
 1143    double xMinimum = mPlotItem->xMinimum();
 
 1144    double xMaximum = mPlotItem->xMaximum();
 
 1145    double yMinimum = mPlotItem->yMinimum();
 
 1146    double yMaximum = mPlotItem->yMaximum();
 
 1147    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
 1148    mPlotItem->setXMinimum( xMinimum );
 
 1149    mPlotItem->setXMaximum( xMaximum );
 
 1150    mPlotItem->setYMinimum( yMinimum );
 
 1151    mPlotItem->setYMaximum( yMaximum );
 
 1154  mPlotItem->updateRect();
 
 1155  mCrossHairsItem->updateRect();
 
 
 1160  QgsPlotCanvas::paintEvent( 
event );
 
 1162  if ( !mFirstDrawOccurred )
 
 1165    mFirstDrawOccurred = 
true;
 
 1166    mPlotItem->updateRect();
 
 1167    mCrossHairsItem->updateRect();
 
 
 1173  if ( !mPlotItem->plotArea().contains( point.
x(), point.
y() ) )
 
 1176  if ( !mProfileCurve )
 
 1179  const double dx = point.
x() - mPlotItem->plotArea().left();
 
 1181  const double distanceAlongPlotPercent = dx / mPlotItem->plotArea().width();
 
 1182  double distanceAlongCurveLength = distanceAlongPlotPercent * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
 1184  std::unique_ptr< QgsPoint > mapXyPoint( mProfileCurve->interpolatePoint( distanceAlongCurveLength ) );
 
 1188  const double mapZ = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * ( mPlotItem->plotArea().bottom() - point.
y() ) + mPlotItem->yMinimum();
 
 1190  return QgsPoint( mapXyPoint->x(), mapXyPoint->y(), mapZ );
 
 
 1195  if ( !mProfileCurve )
 
 1200  const double distanceAlongCurve = 
geos.lineLocatePoint( point, &error );
 
 1202  const double distanceAlongCurveOnPlot = distanceAlongCurve - mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
 1203  const double distanceAlongCurvePercent = distanceAlongCurveOnPlot / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor );
 
 1204  const double distanceAlongPlotRect = distanceAlongCurvePercent * mPlotItem->plotArea().width();
 
 1206  const double canvasX = mPlotItem->plotArea().left() + distanceAlongPlotRect;
 
 1209  if ( std::isnan( point.
z() ) || point.
z() < mPlotItem->yMinimum() )
 
 1211    canvasY = mPlotItem->plotArea().top();
 
 1213  else if ( point.
z() > mPlotItem->yMaximum() )
 
 1215    canvasY = mPlotItem->plotArea().bottom();
 
 1219    const double yPercent = ( point.
z() - mPlotItem->yMinimum() ) / ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
 1220    canvasY = mPlotItem->plotArea().bottom() - mPlotItem->plotArea().height() * yPercent;
 
 
 1233  double yMinimum = 0;
 
 1234  double yMaximum = 0;
 
 1245    yMinimum = zRange.
lower() - 5;
 
 1246    yMaximum = zRange.
lower() + 5;
 
 1251    const double margin = ( zRange.
upper() - zRange.
lower() ) * 0.05;
 
 1252    yMinimum = zRange.
lower() - margin;
 
 1253    yMaximum = zRange.
upper() + margin;
 
 1257  double xMinimum = 0;
 
 1259  double xMaximum = profileLength * 1.02;
 
 1261  if ( mLockAxisScales )
 
 1263    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
 1266  mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
 1267  mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
 1268  mPlotItem->setYMinimum( yMinimum );
 
 1269  mPlotItem->setYMaximum( yMaximum );
 
 1272  mPlotItem->updatePlot();
 
 
 1278  if ( mLockAxisScales )
 
 1280    adjustRangeForAxisScaleLock( minimumDistance, maximumDistance, minimumElevation, maximumElevation );
 
 1283  mPlotItem->setYMinimum( minimumElevation );
 
 1284  mPlotItem->setYMaximum( maximumElevation );
 
 1285  mPlotItem->setXMinimum( minimumDistance / mPlotItem->mXScaleFactor );
 
 1286  mPlotItem->setXMaximum( maximumDistance / mPlotItem->mXScaleFactor );
 
 1288  mPlotItem->updatePlot();
 
 
 1294  return QgsDoubleRange( mPlotItem->xMinimum() * mPlotItem->mXScaleFactor, mPlotItem->xMaximum() * mPlotItem->mXScaleFactor );
 
 
 1299  return QgsDoubleRange( mPlotItem->yMinimum(), mPlotItem->yMaximum() );
 
 
 1308class QgsElevationProfilePlot : 
public Qgs2DPlot 
 1313      : mRenderer( renderer )
 
 1322      rc.
painter()->translate( plotArea.left(), plotArea.top() );
 
 1323      mRenderer->render( rc, plotArea.width(), plotArea.height(), xMinimum() * mXScale, 
xMaximum() * mXScale, 
yMinimum(), 
yMaximum() );
 
 1324      rc.
painter()->translate( -plotArea.left(), -plotArea.top() );
 
 1343  QgsElevationProfilePlot profilePlot( mCurrentJob );
 
 1347  QDomElement elem = doc.createElement( QStringLiteral( 
"plot" ) );
 
 1349  plotSettings.
writeXml( elem, doc, rwContext );
 
 1350  profilePlot.readXml( elem, rwContext );
 
 1352  profilePlot.mXScale = mPlotItem->mXScaleFactor;
 
 1353  profilePlot.xAxis().setLabelSuffix( mPlotItem->xAxis().labelSuffix() );
 
 1354  profilePlot.xAxis().setLabelSuffixPlacement( mPlotItem->xAxis().labelSuffixPlacement() );
 
 1356  profilePlot.setSize( QSizeF( width, height ) );
 
 1357  profilePlot.render( context );
 
 
 1367  return mCurrentJob->
identify( plotPoint, identifyContext() );
 
 
 1378  double distance1 = topLeftPlotPoint.
distance();
 
 1379  double distance2 = bottomRightPlotPoint.
distance();
 
 1380  if ( distance2 < distance1 )
 
 1381    std::swap( distance1, distance2 );
 
 1383  double elevation1 = topLeftPlotPoint.
elevation();
 
 1384  double elevation2 = bottomRightPlotPoint.
elevation();
 
 1385  if ( elevation2 < elevation1 )
 
 1386    std::swap( elevation1, elevation2 );
 
 
 1394  mPlotItem->setRenderer( 
nullptr );
 
 1395  mPlotItem->updatePlot();
 
 
 1400  mSnappingEnabled = enabled;
 
 
@ FirstAndLastLabels
Place suffix after the first and last label values only.
DistanceUnit
Units of distance.
@ Centimeters
Centimeters.
@ Millimeters
Millimeters.
@ Miles
Terrestrial miles.
@ Unknown
Unknown distance unit.
@ Degrees
Degrees, for planar geographic CRS distance measurements.
@ Inches
Inches (since QGIS 3.32)
@ NauticalMiles
Nautical miles.
@ 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.
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, 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.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
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.
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