21#include "moc_qgselevationprofilecanvas.cpp" 
   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 )
 
  157          return QObject::tr( 
"°" );
 
  166      mDistanceUnit = unit;
 
  173      if ( !mPlotArea.isNull() )
 
  178      if ( !scene()->views().isEmpty() )
 
  179        context.
setScaleFactor( scene()->views().at( 0 )->logicalDpiX() / 25.4 );
 
  188      const QRectF area = plotArea();
 
  189      if ( !area.contains( point.x(), point.y() ) )
 
  192      const double distance = ( point.x() - area.left() ) / area.width() * ( 
xMaximum() - 
xMinimum() ) * mXScaleFactor + 
xMinimum() * mXScaleFactor;
 
  199      if ( point.
distance() < xMinimum() * mXScaleFactor || point.
distance() > xMaximum() * mXScaleFactor || point.
elevation() < yMinimum() || point.
elevation() > yMaximum() )
 
  202      const QRectF area = plotArea();
 
  211      mPlotArea = plotArea;
 
  216      const double pixelRatio = !scene()->views().empty() ? scene()->views().at( 0 )->devicePixelRatioF() : 1;
 
  218      const QStringList sourceIds = mRenderer->sourceIds();
 
  219      for ( 
const QString &source : sourceIds )
 
  222        auto it = mCachedImages.constFind( source );
 
  223        if ( it != mCachedImages.constEnd() )
 
  229          plot = mRenderer->renderToImage( plotArea.width() * pixelRatio, plotArea.height() * pixelRatio, xMinimum() * mXScaleFactor, 
xMaximum() * mXScaleFactor, 
yMinimum(), 
yMaximum(), source, pixelRatio );
 
  230          plot.setDevicePixelRatio( pixelRatio );
 
  231          mCachedImages.insert( source, plot );
 
  233        rc.
painter()->drawImage( QPointF( plotArea.left(), plotArea.top() ), plot );
 
  237    void paint( QPainter *painter )
 override 
  240      if ( !mImage.isNull() )
 
  242        painter->drawImage( QPointF( 0, 0 ), mImage );
 
  246        const double pixelRatio = !scene()->views().empty() ? scene()->views().at( 0 )->devicePixelRatioF() : 1;
 
  247        mImage = QImage( mRect.width() * pixelRatio, mRect.height() * pixelRatio, QImage::Format_ARGB32_Premultiplied );
 
  248        mImage.setDevicePixelRatio( pixelRatio );
 
  249        mImage.fill( Qt::transparent );
 
  251        QPainter imagePainter( &mImage );
 
  252        imagePainter.setRenderHint( QPainter::Antialiasing, 
true );
 
  256        const double mapUnitsPerPixel = ( 
xMaximum() - 
xMinimum() ) * mXScaleFactor / plotArea().width();
 
  266        painter->drawImage( QPointF( 0, 0 ), mImage );
 
  274        mRenderer->setSubsectionsSymbol( symbol );
 
  280    double mXScaleFactor = 1.0;
 
  287    QMap<QString, QImage> mCachedImages;
 
  299      , mPlotItem( plotItem )
 
  305      mRect = mCanvas->rect();
 
  307      prepareGeometryChange();
 
  308      setPos( mRect.topLeft() );
 
  318    QRectF boundingRect()
 const override 
  323    void paint( QPainter *painter )
 override 
  325      const QgsPointXY crossHairPlotPoint = mPlotItem->plotPointToCanvasPoint( mPoint );
 
  326      if ( crossHairPlotPoint.
isEmpty() )
 
  330      painter->setBrush( Qt::NoBrush );
 
  332      crossHairPen.setCosmetic( 
true );
 
  333      crossHairPen.setWidthF( 1 );
 
  334      crossHairPen.setStyle( Qt::DashLine );
 
  335      crossHairPen.setCapStyle( Qt::FlatCap );
 
  336      const QPalette scenePalette = mPlotItem->scene()->palette();
 
  337      QColor penColor = scenePalette.color( QPalette::ColorGroup::Active, QPalette::Text );
 
  338      penColor.setAlpha( 150 );
 
  339      crossHairPen.setColor( penColor );
 
  340      painter->setPen( crossHairPen );
 
  341      painter->drawLine( QPointF( mPlotItem->plotArea().left(), crossHairPlotPoint.
y() ), QPointF( mPlotItem->plotArea().right(), crossHairPlotPoint.
y() ) );
 
  342      painter->drawLine( QPointF( crossHairPlotPoint.
x(), mPlotItem->plotArea().top() ), QPointF( crossHairPlotPoint.
x(), mPlotItem->plotArea().bottom() ) );
 
  347      const QString xCoordinateText = mPlotItem->xAxis().numericFormat()->formatDouble( mPoint.distance() / mPlotItem->mXScaleFactor, numericContext )
 
  348                                      + mPlotItem->distanceSuffix();
 
  350      const QString yCoordinateText = mPlotItem->yAxis().numericFormat()->formatDouble( mPoint.elevation(), numericContext );
 
  353      const QFontMetrics fm( font );
 
  354      const double height = fm.capHeight();
 
  355      const double xWidth = fm.horizontalAdvance( xCoordinateText );
 
  356      const double yWidth = fm.horizontalAdvance( yCoordinateText );
 
  357      const double textAxisMargin = fm.horizontalAdvance( 
' ' );
 
  359      QPointF xCoordOrigin;
 
  360      QPointF yCoordOrigin;
 
  362      if ( mPoint.distance() < ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5 * mPlotItem->mXScaleFactor )
 
  364        if ( mPoint.elevation() < ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5 )
 
  367          xCoordOrigin = QPointF( crossHairPlotPoint.
x() + textAxisMargin, mPlotItem->plotArea().top() + height + textAxisMargin );
 
  369          yCoordOrigin = QPointF( mPlotItem->plotArea().right() - yWidth - textAxisMargin, crossHairPlotPoint.
y() - textAxisMargin );
 
  374          xCoordOrigin = QPointF( crossHairPlotPoint.
x() + textAxisMargin, mPlotItem->plotArea().bottom() - textAxisMargin );
 
  376          yCoordOrigin = QPointF( mPlotItem->plotArea().right() - yWidth - textAxisMargin, crossHairPlotPoint.
y() + height + textAxisMargin );
 
  381        if ( mPoint.elevation() < ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5 )
 
  384          xCoordOrigin = QPointF( crossHairPlotPoint.
x() - xWidth - textAxisMargin, mPlotItem->plotArea().top() + height + textAxisMargin );
 
  386          yCoordOrigin = QPointF( mPlotItem->plotArea().left() + textAxisMargin, crossHairPlotPoint.
y() - textAxisMargin );
 
  391          xCoordOrigin = QPointF( crossHairPlotPoint.
x() - xWidth - textAxisMargin, mPlotItem->plotArea().bottom() - textAxisMargin );
 
  393          yCoordOrigin = QPointF( mPlotItem->plotArea().left() + textAxisMargin, crossHairPlotPoint.
y() + height + textAxisMargin );
 
  398      QColor backgroundColor = mPlotItem->chartBackgroundSymbol()->color();
 
  399      backgroundColor.setAlpha( 220 );
 
  400      painter->setBrush( QBrush( backgroundColor ) );
 
  401      painter->setPen( Qt::NoPen );
 
  402      painter->drawRect( QRectF( xCoordOrigin.x() - textAxisMargin + 1, xCoordOrigin.y() - textAxisMargin - height + 1, xWidth + 2 * textAxisMargin - 2, height + 2 * textAxisMargin - 2 ) );
 
  403      painter->drawRect( QRectF( yCoordOrigin.x() - textAxisMargin + 1, yCoordOrigin.y() - textAxisMargin - height + 1, yWidth + 2 * textAxisMargin - 2, height + 2 * textAxisMargin - 2 ) );
 
  405      painter->setBrush( Qt::NoBrush );
 
  406      painter->setPen( scenePalette.color( QPalette::ColorGroup::Active, QPalette::Text ) );
 
  408      painter->drawText( xCoordOrigin, xCoordinateText );
 
  409      painter->drawText( yCoordOrigin, yCoordinateText );
 
  416    QgsElevationProfilePlotItem *mPlotItem = 
nullptr;
 
  426  mPlotItem = 
new QgsElevationProfilePlotItem( 
this );
 
  431  mCrossHairsItem = 
new QgsElevationProfileCrossHairsItem( 
this, mPlotItem );
 
  432  mCrossHairsItem->setZValue( 100 );
 
  433  mCrossHairsItem->hide();
 
  436  mDeferredRegenerationTimer = 
new QTimer( 
this );
 
  437  mDeferredRegenerationTimer->setSingleShot( 
true );
 
  438  mDeferredRegenerationTimer->stop();
 
  439  connect( mDeferredRegenerationTimer, &QTimer::timeout, 
this, &QgsElevationProfileCanvas::startDeferredRegeneration );
 
  441  mDeferredRedrawTimer = 
new QTimer( 
this );
 
  442  mDeferredRedrawTimer->setSingleShot( 
true );
 
  443  mDeferredRedrawTimer->stop();
 
  444  connect( mDeferredRedrawTimer, &QTimer::timeout, 
this, &QgsElevationProfileCanvas::startDeferredRedraw );
 
 
  451    mPlotItem->setRenderer( 
nullptr );
 
  452    mCurrentJob->deleteLater();
 
  453    mCurrentJob = 
nullptr;
 
 
  461    mPlotItem->setRenderer( 
nullptr );
 
  464    mCurrentJob->deleteLater();
 
  465    mCurrentJob = 
nullptr;
 
 
  471  const double dxPercent = dx / mPlotItem->plotArea().width();
 
  472  const double dyPercent = dy / mPlotItem->plotArea().height();
 
  475  const double dxPlot = -dxPercent * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() );
 
  476  const double dyPlot = dyPercent * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
  479  mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  480  mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  481  mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  482  mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
  486  mPlotItem->updatePlot();
 
 
  492  if ( !mPlotItem->plotArea().contains( x, y ) )
 
  495  const double newCenterX = mPlotItem->xMinimum() + ( x - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() );
 
  496  const double newCenterY = mPlotItem->yMinimum() + ( mPlotItem->plotArea().bottom() - y ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
  498  const double dxPlot = newCenterX - ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5;
 
  499  const double dyPlot = newCenterY - ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5;
 
  502  mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  503  mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  504  mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  505  mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
  509  mPlotItem->updatePlot();
 
 
  521  const double toleranceInPixels = QFontMetrics( font() ).horizontalAdvance( 
' ' );
 
  522  const double xToleranceInPlotUnits = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) * toleranceInPixels;
 
  523  const double yToleranceInPlotUnits = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * toleranceInPixels;
 
  531                                            / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) );
 
  538  const double toleranceInPixels = QFontMetrics( font() ).horizontalAdvance( 
' ' );
 
  539  const double xToleranceInPlotUnits = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) * toleranceInPixels;
 
  540  const double yToleranceInPlotUnits = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * toleranceInPixels;
 
  548                                            / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor / ( mPlotItem->plotArea().width() ) );
 
  555void QgsElevationProfileCanvas::setupLayerConnections( 
QgsMapLayer *layer, 
bool isDisconnect )
 
  570  switch ( layer->
type() )
 
  603void QgsElevationProfileCanvas::adjustRangeForAxisScaleLock( 
double &xMinimum, 
double &xMaximum, 
double &yMinimum, 
double &yMaximum )
 const 
  606  const double horizontalScale = ( xMaximum - xMinimum ) / mPlotItem->plotArea().width();
 
  607  const double verticalScale = ( yMaximum - yMinimum ) / mPlotItem->plotArea().height();
 
  608  if ( horizontalScale > verticalScale )
 
  610    const double height = horizontalScale * mPlotItem->plotArea().height();
 
  611    const double deltaHeight = ( yMaximum - yMinimum ) - height;
 
  612    yMinimum += deltaHeight / 2;
 
  613    yMaximum -= deltaHeight / 2;
 
  617    const double width = verticalScale * mPlotItem->plotArea().width();
 
  618    const double deltaWidth = ( ( xMaximum - xMinimum ) - width );
 
  619    xMinimum += deltaWidth / 2;
 
  620    xMaximum -= deltaWidth / 2;
 
  626  return mDistanceUnit;
 
 
  631  mDistanceUnit = unit;
 
  632  const double oldMin = mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  633  const double oldMax = mPlotItem->xMaximum() * mPlotItem->mXScaleFactor;
 
  635  mPlotItem->setXAxisUnits( mDistanceUnit );
 
  636  mPlotItem->setXMinimum( oldMin / mPlotItem->mXScaleFactor );
 
  637  mPlotItem->setXMaximum( oldMax / mPlotItem->mXScaleFactor );
 
  638  mPlotItem->updatePlot();
 
 
  643  if ( !color.isValid() )
 
  645    QPalette customPalette = qApp->palette();
 
  646    const QColor baseColor = qApp->palette().color( QPalette::ColorRole::Base );
 
  647    const QColor windowColor = qApp->palette().color( QPalette::ColorRole::Window );
 
  648    customPalette.setColor( QPalette::ColorRole::Base, windowColor );
 
  649    customPalette.setColor( QPalette::ColorRole::Window, baseColor );
 
  650    setPalette( customPalette );
 
  651    scene()->setPalette( customPalette );
 
  656    const bool isDarkTheme = color.lightnessF() < 0.5;
 
  657    QPalette customPalette = qApp->palette();
 
  658    customPalette.setColor( QPalette::ColorRole::Window, color );
 
  661      customPalette.setColor( QPalette::ColorRole::Text, QColor( 255, 255, 255 ) );
 
  662      customPalette.setColor( QPalette::ColorRole::Base, color.lighter( 120 ) );
 
  666      customPalette.setColor( QPalette::ColorRole::Text, QColor( 0, 0, 0 ) );
 
  667      customPalette.setColor( QPalette::ColorRole::Base, color.darker( 120 ) );
 
  670    setPalette( customPalette );
 
  671    scene()->setPalette( customPalette );
 
  674  updateChartFromPalette();
 
 
  679  return mLockAxisScales;
 
 
  684  mLockAxisScales = lock;
 
  685  if ( mLockAxisScales )
 
  687    double xMinimum = mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  688    double xMaximum = mPlotItem->xMaximum() * mPlotItem->mXScaleFactor;
 
  689    double yMinimum = mPlotItem->yMinimum();
 
  690    double yMaximum = mPlotItem->yMaximum();
 
  691    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
  692    mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
  693    mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
  694    mPlotItem->setYMinimum( yMinimum );
 
  695    mPlotItem->setYMaximum( yMaximum );
 
  698    mPlotItem->updatePlot();
 
 
  705  if ( !mCurrentJob || !mSnappingEnabled )
 
 
  719  if ( mLockAxisScales )
 
  722  const double currentWidth = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor;
 
  723  const double currentHeight = mPlotItem->yMaximum() - mPlotItem->yMinimum();
 
  725  const double newWidth = currentWidth / xFactor;
 
  726  const double newHeight = currentHeight / yFactor;
 
  728  const double currentCenterX = ( mPlotItem->xMinimum() + mPlotItem->xMaximum() ) * 0.5 * mPlotItem->mXScaleFactor;
 
  729  const double currentCenterY = ( mPlotItem->yMinimum() + mPlotItem->yMaximum() ) * 0.5;
 
  731  double xMinimum = currentCenterX - newWidth * 0.5;
 
  732  double xMaximum = currentCenterX + newWidth * 0.5;
 
  733  double yMinimum = currentCenterY - newHeight * 0.5;
 
  734  double yMaximum = currentCenterY + newHeight * 0.5;
 
  735  if ( mLockAxisScales )
 
  737    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
  740  mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
  741  mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
  742  mPlotItem->setYMinimum( yMinimum );
 
  743  mPlotItem->setYMaximum( yMaximum );
 
  746  mPlotItem->updatePlot();
 
 
  752  const QRectF intersected = rect.intersected( mPlotItem->plotArea() );
 
  754  double minX = ( intersected.left() - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  755  double maxX = ( intersected.right() - mPlotItem->plotArea().left() ) / mPlotItem->plotArea().width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
  756  double minY = ( mPlotItem->plotArea().bottom() - intersected.bottom() ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  757  double maxY = ( mPlotItem->plotArea().bottom() - intersected.top() ) / mPlotItem->plotArea().height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  759  if ( mLockAxisScales )
 
  761    adjustRangeForAxisScaleLock( minX, maxX, minY, maxY );
 
  764  mPlotItem->setXMinimum( minX / mPlotItem->mXScaleFactor );
 
  765  mPlotItem->setXMaximum( maxX / mPlotItem->mXScaleFactor );
 
  766  mPlotItem->setYMinimum( minY );
 
  767  mPlotItem->setYMaximum( maxY );
 
  770  mPlotItem->updatePlot();
 
 
  778  double zoomFactor = settings.
value( QStringLiteral( 
"qgis/zoom_factor" ), 2 ).toDouble();
 
  779  bool reverseZoom = settings.
value( QStringLiteral( 
"qgis/reverse_wheel_zoom" ), 
false ).toBool();
 
  780  bool zoomIn = reverseZoom ? 
event->angleDelta().y() < 0 : 
event->angleDelta().y() > 0;
 
  783  zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 120.0 * std::fabs( 
event->angleDelta().y() );
 
  785  if ( 
event->modifiers() & Qt::ControlModifier )
 
  788    zoomFactor = 1.0 + ( zoomFactor - 1.0 ) / 20.0;
 
  792  double scaleFactor = ( zoomIn ? 1 / zoomFactor : zoomFactor );
 
  794  QRectF viewportRect = mPlotItem->plotArea();
 
  796  if ( viewportRect.contains( 
event->position() ) )
 
  799    const double oldCenterX = 0.5 * ( mPlotItem->xMaximum() + mPlotItem->xMinimum() );
 
  800    const double oldCenterY = 0.5 * ( mPlotItem->yMaximum() + mPlotItem->yMinimum() );
 
  802    const double eventPosX = ( 
event->position().x() - viewportRect.left() ) / viewportRect.width() * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) + mPlotItem->xMinimum();
 
  803    const double eventPosY = ( viewportRect.bottom() - 
event->position().y() ) / viewportRect.height() * ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) + mPlotItem->yMinimum();
 
  805    const double newCenterX = eventPosX + ( ( oldCenterX - eventPosX ) * scaleFactor );
 
  806    const double newCenterY = eventPosY + ( ( oldCenterY - eventPosY ) * scaleFactor );
 
  808    const double dxPlot = newCenterX - ( mPlotItem->xMaximum() + mPlotItem->xMinimum() ) * 0.5;
 
  809    const double dyPlot = newCenterY - ( mPlotItem->yMaximum() + mPlotItem->yMinimum() ) * 0.5;
 
  812    mPlotItem->setXMinimum( mPlotItem->xMinimum() + dxPlot );
 
  813    mPlotItem->setXMaximum( mPlotItem->xMaximum() + dxPlot );
 
  814    mPlotItem->setYMinimum( mPlotItem->yMinimum() + dyPlot );
 
  815    mPlotItem->setYMaximum( mPlotItem->yMaximum() + dyPlot );
 
 
  833  if ( e->isAccepted() )
 
  835    mCrossHairsItem->hide();
 
  840  if ( mCurrentJob && mSnappingEnabled && !plotPoint.
isEmpty() )
 
  849    mCrossHairsItem->hide();
 
  853    mCrossHairsItem->setPoint( plotPoint );
 
  854    mCrossHairsItem->show();
 
 
  861  return mPlotItem->plotArea();
 
 
  881  const QList<QgsMapLayer *> layersToGenerate = 
layers();
 
  882  QList<QgsAbstractProfileSource *> sources;
 
  884  sources.reserve( layersToGenerate.size() + registrySources.size() );
 
  886  sources << registrySources;
 
  890      sources.append( source );
 
  898  generationContext.
setMaximumErrorMapUnits( MAX_ERROR_PIXELS * ( mProfileCurve->length() ) / mPlotItem->plotArea().width() );
 
  902  if ( mSubsectionsSymbol )
 
  908  mPlotItem->setRenderer( mCurrentJob );
 
 
  915  mZoomFullWhenJobFinished = 
true;
 
 
  918void QgsElevationProfileCanvas::generationFinished()
 
  925  if ( mZoomFullWhenJobFinished )
 
  928    mZoomFullWhenJobFinished = 
false;
 
  937    mPlotItem->updatePlot();
 
  940  if ( mForceRegenerationAfterCurrentJobCompletes )
 
  942    mForceRegenerationAfterCurrentJobCompletes = 
false;
 
  944    scheduleDeferredRegeneration();
 
  948void QgsElevationProfileCanvas::onLayerProfileGenerationPropertyChanged()
 
  951  if ( !mCurrentJob || mCurrentJob->
isActive() )
 
  958  if ( 
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( properties->parent() ) )
 
  963        scheduleDeferredRegeneration();
 
  968void QgsElevationProfileCanvas::onLayerProfileRendererPropertyChanged()
 
  971  if ( !mCurrentJob || mCurrentJob->
isActive() )
 
  978  if ( 
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( properties->parent() ) )
 
  984    if ( mPlotItem->redrawResults( layer->
id() ) )
 
  985      scheduleDeferredRedraw();
 
  989void QgsElevationProfileCanvas::regenerateResultsForLayer()
 
  994  if ( 
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() ) )
 
  999        scheduleDeferredRegeneration();
 
 1004void QgsElevationProfileCanvas::scheduleDeferredRegeneration()
 
 1006  if ( !mDeferredRegenerationScheduled )
 
 1008    mDeferredRegenerationTimer->start( 1 );
 
 1009    mDeferredRegenerationScheduled = 
true;
 
 1013void QgsElevationProfileCanvas::scheduleDeferredRedraw()
 
 1015  if ( !mDeferredRedrawScheduled )
 
 1017    mDeferredRedrawTimer->start( 1 );
 
 1018    mDeferredRedrawScheduled = 
true;
 
 1022void QgsElevationProfileCanvas::startDeferredRegeneration()
 
 1024  if ( mCurrentJob && !mCurrentJob->
isActive() )
 
 1029  else if ( mCurrentJob )
 
 1031    mForceRegenerationAfterCurrentJobCompletes = 
true;
 
 1034  mDeferredRegenerationScheduled = 
false;
 
 1037void QgsElevationProfileCanvas::startDeferredRedraw()
 
 1039  mPlotItem->update();
 
 1040  mDeferredRedrawScheduled = 
false;
 
 1043void QgsElevationProfileCanvas::refineResults()
 
 1049    const double plotDistanceRange = ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor;
 
 1050    const double plotElevationRange = mPlotItem->yMaximum() - mPlotItem->yMinimum();
 
 1051    const double plotDistanceUnitsPerPixel = plotDistanceRange / mPlotItem->plotArea().width();
 
 1055    const double targetMaxErrorInMapUnits = MAX_ERROR_PIXELS * plotDistanceUnitsPerPixel;
 
 1056    const double factor = std::pow( 10.0, 1 - std::ceil( std::log10( std::fabs( targetMaxErrorInMapUnits ) ) ) );
 
 1057    const double roundedErrorInMapUnits = std::floor( targetMaxErrorInMapUnits * factor ) / factor;
 
 1064    context.
setDistanceRange( 
QgsDoubleRange( std::max( 0.0, distanceMin ), mPlotItem->xMaximum() * mPlotItem->mXScaleFactor + plotDistanceRange * 0.05 ) );
 
 1069  scheduleDeferredRegeneration();
 
 1072void QgsElevationProfileCanvas::updateChartFromPalette()
 
 1074  const QPalette chartPalette = palette();
 
 1075  setBackgroundBrush( QBrush( chartPalette.color( QPalette::ColorRole::Base ) ) );
 
 1078    textFormat.
setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::Text ) );
 
 1079    mPlotItem->xAxis().setTextFormat( textFormat );
 
 1080    mPlotItem->yAxis().setTextFormat( textFormat );
 
 1083    std::unique_ptr<QgsFillSymbol> chartFill( mPlotItem->chartBackgroundSymbol()->clone() );
 
 1084    chartFill->setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Window ) );
 
 1085    mPlotItem->setChartBackgroundSymbol( chartFill.release() );
 
 1088    std::unique_ptr<QgsFillSymbol> chartBorder( mPlotItem->chartBorderSymbol()->clone() );
 
 1089    chartBorder->setColor( chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text ) );
 
 1090    mPlotItem->setChartBorderSymbol( chartBorder.release() );
 
 1093    std::unique_ptr<QgsLineSymbol> chartMajorSymbol( mPlotItem->xAxis().gridMajorSymbol()->clone() );
 
 1094    QColor 
c = chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text );
 
 1096    chartMajorSymbol->setColor( 
c );
 
 1097    mPlotItem->xAxis().setGridMajorSymbol( chartMajorSymbol->clone() );
 
 1098    mPlotItem->yAxis().setGridMajorSymbol( chartMajorSymbol.release() );
 
 1101    std::unique_ptr<QgsLineSymbol> chartMinorSymbol( mPlotItem->xAxis().gridMinorSymbol()->clone() );
 
 1102    QColor 
c = chartPalette.color( QPalette::ColorGroup::Active, QPalette::ColorRole::Text );
 
 1104    chartMinorSymbol->setColor( 
c );
 
 1105    mPlotItem->xAxis().setGridMinorSymbol( chartMinorSymbol->clone() );
 
 1106    mPlotItem->yAxis().setGridMinorSymbol( chartMinorSymbol.release() );
 
 1108  mPlotItem->updatePlot();
 
 1113  if ( !mPlotItem->plotArea().contains( point.x(), point.y() ) )
 
 1116  return mPlotItem->canvasPointToPlotPoint( point );
 
 
 1121  return mPlotItem->plotPointToCanvasPoint( point );
 
 
 1127  mPlotItem->mProject = project;
 
 
 1137  mProfileCurve.reset( curve );
 
 
 1142  return mProfileCurve.get();
 
 
 1157  for ( 
QgsMapLayer *layer : std::as_const( mLayers ) )
 
 1159    setupLayerConnections( layer, 
true );
 
 1163  auto filteredList = 
layers;
 
 1164  filteredList.erase( std::remove_if( filteredList.begin(), filteredList.end(), []( 
QgsMapLayer *layer ) {
 
 1165                        return !layer || !layer->isValid();
 
 1167                      filteredList.end() );
 
 1169  mLayers = _qgis_listRawToQPointer( filteredList );
 
 1170  for ( 
QgsMapLayer *layer : std::as_const( mLayers ) )
 
 1172    setupLayerConnections( layer, 
false );
 
 
 1178  return _qgis_listQPointerToRaw( mLayers );
 
 
 1185  if ( mLockAxisScales )
 
 1187    double xMinimum = mPlotItem->xMinimum();
 
 1188    double xMaximum = mPlotItem->xMaximum();
 
 1189    double yMinimum = mPlotItem->yMinimum();
 
 1190    double yMaximum = mPlotItem->yMaximum();
 
 1191    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
 1192    mPlotItem->setXMinimum( xMinimum );
 
 1193    mPlotItem->setXMaximum( xMaximum );
 
 1194    mPlotItem->setYMinimum( yMinimum );
 
 1195    mPlotItem->setYMaximum( yMaximum );
 
 1198  mPlotItem->updateRect();
 
 1199  mCrossHairsItem->updateRect();
 
 
 1204  QgsPlotCanvas::paintEvent( 
event );
 
 1206  if ( !mFirstDrawOccurred )
 
 1209    mFirstDrawOccurred = 
true;
 
 1210    mPlotItem->updateRect();
 
 1211    mCrossHairsItem->updateRect();
 
 
 1217  if ( !mPlotItem->plotArea().contains( point.
x(), point.
y() ) )
 
 1220  if ( !mProfileCurve )
 
 1223  const double dx = point.
x() - mPlotItem->plotArea().left();
 
 1225  const double distanceAlongPlotPercent = dx / mPlotItem->plotArea().width();
 
 1226  double distanceAlongCurveLength = distanceAlongPlotPercent * ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor + mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
 1228  std::unique_ptr<QgsPoint> mapXyPoint( mProfileCurve->interpolatePoint( distanceAlongCurveLength ) );
 
 1232  const double mapZ = ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) * ( mPlotItem->plotArea().bottom() - point.
y() ) + mPlotItem->yMinimum();
 
 1234  return QgsPoint( mapXyPoint->x(), mapXyPoint->y(), mapZ );
 
 
 1239  if ( !mProfileCurve )
 
 1244  const double distanceAlongCurve = 
geos.lineLocatePoint( point, &error );
 
 1246  const double distanceAlongCurveOnPlot = distanceAlongCurve - mPlotItem->xMinimum() * mPlotItem->mXScaleFactor;
 
 1247  const double distanceAlongCurvePercent = distanceAlongCurveOnPlot / ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) * mPlotItem->mXScaleFactor );
 
 1248  const double distanceAlongPlotRect = distanceAlongCurvePercent * mPlotItem->plotArea().width();
 
 1250  const double canvasX = mPlotItem->plotArea().left() + distanceAlongPlotRect;
 
 1253  if ( std::isnan( point.
z() ) || point.
z() < mPlotItem->yMinimum() )
 
 1255    canvasY = mPlotItem->plotArea().top();
 
 1257  else if ( point.
z() > mPlotItem->yMaximum() )
 
 1259    canvasY = mPlotItem->plotArea().bottom();
 
 1263    const double yPercent = ( point.
z() - mPlotItem->yMinimum() ) / ( mPlotItem->yMaximum() - mPlotItem->yMinimum() );
 
 1264    canvasY = mPlotItem->plotArea().bottom() - mPlotItem->plotArea().height() * yPercent;
 
 
 1277  double yMinimum = 0;
 
 1278  double yMaximum = 0;
 
 1289    yMinimum = zRange.
lower() - 5;
 
 1290    yMaximum = zRange.
lower() + 5;
 
 1295    const double margin = ( zRange.
upper() - zRange.
lower() ) * 0.05;
 
 1296    yMinimum = zRange.
lower() - margin;
 
 1297    yMaximum = zRange.
upper() + margin;
 
 1301  double xMinimum = 0;
 
 1303  double xMaximum = profileLength * 1.02;
 
 1305  if ( mLockAxisScales )
 
 1307    adjustRangeForAxisScaleLock( xMinimum, xMaximum, yMinimum, yMaximum );
 
 1310  mPlotItem->setXMinimum( xMinimum / mPlotItem->mXScaleFactor );
 
 1311  mPlotItem->setXMaximum( xMaximum / mPlotItem->mXScaleFactor );
 
 1312  mPlotItem->setYMinimum( yMinimum );
 
 1313  mPlotItem->setYMaximum( yMaximum );
 
 1316  mPlotItem->updatePlot();
 
 
 1322  if ( mLockAxisScales )
 
 1324    adjustRangeForAxisScaleLock( minimumDistance, maximumDistance, minimumElevation, maximumElevation );
 
 1327  mPlotItem->setYMinimum( minimumElevation );
 
 1328  mPlotItem->setYMaximum( maximumElevation );
 
 1329  mPlotItem->setXMinimum( minimumDistance / mPlotItem->mXScaleFactor );
 
 1330  mPlotItem->setXMaximum( maximumDistance / mPlotItem->mXScaleFactor );
 
 1332  mPlotItem->updatePlot();
 
 
 1338  return QgsDoubleRange( mPlotItem->xMinimum() * mPlotItem->mXScaleFactor, mPlotItem->xMaximum() * mPlotItem->mXScaleFactor );
 
 
 1343  return QgsDoubleRange( mPlotItem->yMinimum(), mPlotItem->yMaximum() );
 
 
 1352class QgsElevationProfilePlot : 
public Qgs2DPlot 
 1356      : mRenderer( renderer )
 
 1365      rc.
painter()->translate( plotArea.left(), plotArea.top() );
 
 1366      mRenderer->render( rc, plotArea.width(), plotArea.height(), xMinimum() * mXScale, 
xMaximum() * mXScale, 
yMinimum(), 
yMaximum() );
 
 1367      rc.
painter()->translate( -plotArea.left(), -plotArea.top() );
 
 1385  QgsElevationProfilePlot profilePlot( mCurrentJob );
 
 1389  QDomElement elem = doc.createElement( QStringLiteral( 
"plot" ) );
 
 1391  plotSettings.
writeXml( elem, doc, rwContext );
 
 1392  profilePlot.readXml( elem, rwContext );
 
 1394  profilePlot.mXScale = mPlotItem->mXScaleFactor;
 
 1395  profilePlot.xAxis().setLabelSuffix( mPlotItem->xAxis().labelSuffix() );
 
 1396  profilePlot.xAxis().setLabelSuffixPlacement( mPlotItem->xAxis().labelSuffixPlacement() );
 
 1398  profilePlot.setSize( QSizeF( width, height ) );
 
 1399  profilePlot.render( context );
 
 
 1409  return mCurrentJob->
identify( plotPoint, identifyContext() );
 
 
 1420  double distance1 = topLeftPlotPoint.
distance();
 
 1421  double distance2 = bottomRightPlotPoint.
distance();
 
 1422  if ( distance2 < distance1 )
 
 1423    std::swap( distance1, distance2 );
 
 1425  double elevation1 = topLeftPlotPoint.
elevation();
 
 1426  double elevation2 = bottomRightPlotPoint.
elevation();
 
 1427  if ( elevation2 < elevation1 )
 
 1428    std::swap( elevation1, elevation2 );
 
 
 1437  mPlotItem->updatePlot();
 
 
 1442  mSnappingEnabled = enabled;
 
 
 1447  mSubsectionsSymbol.reset( symbol );
 
 1448  std::unique_ptr<QgsLineSymbol> plotItemSymbol( mSubsectionsSymbol ? mSubsectionsSymbol->clone() : nullptr );
 
 1449  mPlotItem->setSubsectionsSymbol( plotItemSymbol.release() );
 
 
@ 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.
 
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.
 
void setSubsectionsSymbol(QgsLineSymbol *symbol)
Sets the symbol used to draw the subsections.
 
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.
 
A line symbol type, for rendering LineString and MultiLineString geometries.
 
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.
 
virtual QgsAbstractProfileSource * profileSource()
Returns the layer's profile source if it has profile capabilities.
 
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
 
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.
 
void setSubsectionsSymbol(QgsLineSymbol *symbol)
Sets the symbol used to draw the subsections.
 
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.
 
A container for the context for various read/write operations on 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.
 
Stores settings for use within QGIS.
 
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 dataset.
 
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