43#include "moc_qgslayoutitemelevationprofile.cpp"
45using namespace Qt::StringLiterals;
47#define CACHE_SIZE_LIMIT 5000
50class QgsLayoutItemElevationProfilePlot :
public Qgs2DXyPlot
53 QgsLayoutItemElevationProfilePlot() {}
65 const double distanceMin =
xMinimum() * xScale;
66 const double distanceMax =
xMaximum() * xScale;
67 rc.
painter()->translate( plotArea.left(), plotArea.top() );
68 mRenderer->render( rc, plotArea.width(), plotArea.height(), distanceMin, distanceMax, yMinimum(),
yMaximum() );
69 rc.
painter()->translate( -plotArea.left(), -plotArea.top() );
70 mRenderer->renderSubsectionsIndicator( rc, plotArea, distanceMin, distanceMax,
yMinimum(),
yMaximum() );
83 , mPlot( std::make_unique< QgsLayoutItemElevationProfilePlot >() )
85 mBackgroundUpdateTimer =
new QTimer(
this );
86 mBackgroundUpdateTimer->setSingleShot(
true );
87 connect( mBackgroundUpdateTimer, &QTimer::timeout,
this, &QgsLayoutItemElevationProfile::recreateCachedImageInBackground );
89 setCacheMode( QGraphicsItem::NoCache );
113 mRenderJob->cancelGeneration();
137 bool forceUpdate =
false;
142 double value = mTolerance;
162 double value = mPlot->xMinimum();
173 mPlot->setXMinimum( value );
182 double value = mPlot->xMaximum();
193 mPlot->setXMaximum( value );
202 double value = mPlot->yMinimum();
213 mPlot->setYMinimum( value );
222 double value = mPlot->yMaximum();
233 mPlot->setYMaximum( value );
242 double value = mPlot->xAxis().gridIntervalMajor();
253 mPlot->xAxis().setGridIntervalMajor( value );
262 double value = mPlot->xAxis().gridIntervalMinor();
273 mPlot->xAxis().setGridIntervalMinor( value );
282 double value = mPlot->xAxis().labelInterval();
293 mPlot->xAxis().setLabelInterval( value );
302 double value = mPlot->yAxis().gridIntervalMajor();
313 mPlot->yAxis().setGridIntervalMajor( value );
322 double value = mPlot->yAxis().gridIntervalMinor();
333 mPlot->yAxis().setGridIntervalMinor( value );
342 double value = mPlot->yAxis().labelInterval();
353 mPlot->yAxis().setLabelInterval( value );
362 double value = mPlot->margins().left();
375 mPlot->setMargins( margins );
384 double value = mPlot->margins().right();
397 mPlot->setMargins( margins );
406 double value = mPlot->margins().top();
419 mPlot->setMargins( margins );
428 double value = mPlot->margins().bottom();
441 mPlot->setMargins( margins );
449 mCacheInvalidated =
true;
465 return blendMode() != QPainter::CompositionMode_SourceOver;
470 return mEvaluatedOpacity < 1.0;
485 return _qgis_listRefToRaw( mLayers );
490 if (
layers == _qgis_listRefToRaw( mLayers ) )
493 mLayers = _qgis_listRawToRef(
layers );
499 if ( mSources.isEmpty() && !mLayers.isEmpty() )
505 QList< QgsAbstractProfileSource * >
sources;
506 const QList<QgsMapLayer *> layersToGenerate =
layers();
507 sources.reserve( layersToGenerate.size() );
524 QList< QgsAbstractProfileSource * >
sources;
525 sources.reserve( mSources.count() );
526 for (
const auto &source : mSources )
528 if (
const QgsMapLayerRef *layerRef = std::get_if< QgsMapLayerRef >( &source ) )
532 sources << layer->profileSource();
535 else if (
auto profileSource = std::get_if< QgsAbstractProfileSource * >( &source ) )
550 mSources.reserve(
sources.count() );
553 if (
auto layer =
dynamic_cast<QgsMapLayer *
>( profileSource ) )
559 mSources << profileSource;
568 mCurve.reset( curve );
607 mAtlasDriven = enabled;
633 if ( !
mLayout || !painter || !painter->device() || !mUpdatesEnabled )
642 QRectF thisPaintRect = rect();
647 calculateAxisRanges( rc );
649 if (
mLayout->renderContext().isPreviewRender() )
654 painter->setClipRect( thisPaintRect );
655 if ( !mCacheFinalImage || mCacheFinalImage->isNull() )
658 painter->setBrush( QBrush( QColor( 125, 125, 125, 125 ) ) );
659 painter->drawRect( thisPaintRect );
660 painter->setBrush( Qt::NoBrush );
662 messageFont.setPointSize( 12 );
663 painter->setFont( messageFont );
664 painter->setPen( QColor( 255, 255, 255, 255 ) );
665 painter->drawText( thisPaintRect, Qt::AlignCenter | Qt::AlignHCenter, tr(
"Rendering profile" ) );
668 ( mRenderJob && mCacheInvalidated && !mDrawingPreview )
669 || ( !mRenderJob && !mDrawingPreview )
673 mBackgroundUpdateTimer->start( 1 );
678 if ( mCacheInvalidated && !mDrawingPreview )
682 mBackgroundUpdateTimer->start( 1 );
687 double imagePixelWidth = mCacheFinalImage->width();
688 double scale = rect().width() / imagePixelWidth;
692 painter->scale( scale, scale );
693 painter->setCompositionMode( blendModeForRender() );
694 painter->drawImage( 0, 0, *mCacheFinalImage );
697 painter->setClipRect( thisPaintRect, Qt::NoClip );
710 QPaintDevice *paintDevice = painter->device();
717 painter->setRenderHint( QPainter::LosslessImageRendering,
true );
724 if ( (
containsAdvancedEffects() || ( blendModeForRender() != QPainter::CompositionMode_SourceOver ) ) && !forceVector )
729 int widthInPixels =
static_cast< int >( std::round( boundingRect().width() * layoutUnitsInInches * destinationDpi ) );
730 int heightInPixels =
static_cast< int >( std::round( boundingRect().height() * layoutUnitsInInches * destinationDpi ) );
731 QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
733 image.fill( Qt::transparent );
734 image.setDotsPerMeterX(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
735 image.setDotsPerMeterY(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
736 double dotsPerMM = destinationDpi / 25.4;
737 layoutSize *= dotsPerMM;
738 QPainter p( &image );
739 preparePainter( &p );
744 p.scale( dotsPerMM, dotsPerMM );
750 p.scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
752 const double mapUnitsPerPixel =
static_cast<double>( mPlot->xMaximum() - mPlot->xMinimum() ) * mPlot->xScale / layoutSize.width();
755 QList< QgsAbstractProfileSource *> sourcesToRender =
sources();
756 std::reverse( sourcesToRender.begin(), sourcesToRender.end() );
763 mPlot->setRenderer( &renderer );
766 mPlot->setSize( layoutSize );
769 mPlot->render( rc, plotContext );
771 mPlot->setRenderer(
nullptr );
773 p.scale( dotsPerMM, dotsPerMM );
781 painter->setCompositionMode( blendModeForRender() );
782 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
783 painter->drawImage( 0, 0, image );
784 painter->scale( dotsPerMM, dotsPerMM );
799 double dotsPerMM = paintDevice->logicalDpiX() / 25.4;
800 layoutSize *= dotsPerMM;
801 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
803 const double mapUnitsPerPixel =
static_cast<double>( mPlot->xMaximum() - mPlot->xMinimum() ) * mPlot->xScale / layoutSize.width();
806 QList< QgsAbstractProfileSource *> sourcesToRender =
sources();
807 std::reverse( sourcesToRender.begin(), sourcesToRender.end() );
820 mPlot->setRenderer( &renderer );
823 mPlot->setSize( layoutSize );
826 mPlot->render( rc, plotContext );
828 mPlot->setRenderer(
nullptr );
830 painter->setClipRect( thisPaintRect, Qt::NoClip );
845 if ( mAtlasDriven &&
mLayout &&
mLayout->reportContext().layer() )
856 mCurve.reset( curve->clone() );
870 mCacheInvalidated =
true;
880 QDomElement plotElement = doc.createElement( u
"plot"_s );
881 mPlot->writeXml( plotElement, doc, rwContext );
882 layoutProfileElem.appendChild( plotElement );
887 layoutProfileElem.setAttribute( u
"rangeMethod"_s,
qgsEnumValueToKey( mRangeMethod ) );
891 layoutProfileElem.setAttribute( u
"distanceScale"_s,
qgsDoubleToString( mDistanceScale ) );
895 layoutProfileElem.setAttribute( u
"elevationScale"_s,
qgsDoubleToString( mElevationScale ) );
898 layoutProfileElem.setAttribute( u
"distanceUnit"_s,
qgsEnumValueToKey( mDistanceUnit ) );
900 layoutProfileElem.setAttribute( u
"tolerance"_s, mTolerance );
901 layoutProfileElem.setAttribute( u
"atlasDriven"_s, mAtlasDriven ? u
"1"_s : u
"0"_s );
902 if ( mCrs.isValid() )
904 QDomElement crsElem = doc.createElement( u
"crs"_s );
905 mCrs.writeXml( crsElem, doc );
906 layoutProfileElem.appendChild( crsElem );
910 QDomElement curveElem = doc.createElement( u
"curve"_s );
911 curveElem.appendChild( doc.createTextNode( mCurve->asWkt() ) );
912 layoutProfileElem.appendChild( curveElem );
916 QDomElement layersElement = doc.createElement( u
"layers"_s );
919 QDomElement layerElement = doc.createElement( u
"layer"_s );
920 layer.writeXml( layerElement, rwContext );
921 layersElement.appendChild( layerElement );
923 layoutProfileElem.appendChild( layersElement );
927 QDomElement sourcesElement = doc.createElement( u
"profileSources"_s );
928 for (
const auto &source : mSources )
930 if (
const QgsMapLayerRef *layerRef = std::get_if< QgsMapLayerRef >( &source ) )
932 if ( layerRef->get() )
934 QDomElement sourceElement = doc.createElement( u
"profileLayerSource"_s );
935 layerRef->writeXml( sourceElement, rwContext );
936 sourcesElement.appendChild( sourceElement );
939 else if (
auto profileSource = std::get_if< QgsAbstractProfileSource * >( &source ) )
943 QDomElement sourceElement = doc.createElement( u
"profileCustomSource"_s );
944 sourceElement.setAttribute( u
"id"_s, ( *profileSource )->profileSourceId() );
945 sourcesElement.appendChild( sourceElement );
950 layoutProfileElem.appendChild( sourcesElement );
953 if ( mSubsectionsSymbol )
955 QDomElement subsectionsElement = doc.createElement( u
"subsections"_s );
957 subsectionsElement.appendChild( symbolElement );
958 layoutProfileElem.appendChild( subsectionsElement );
966 const QDomElement plotElement = itemElem.firstChildElement( u
"plot"_s );
967 if ( !plotElement.isNull() )
969 mPlot->readXml( plotElement, context );
972 const QDomNodeList crsNodeList = itemElem.elementsByTagName( u
"crs"_s );
974 if ( !crsNodeList.isEmpty() )
976 const QDomElement crsElem = crsNodeList.at( 0 ).toElement();
977 crs.readXml( crsElem );
982 mDistanceScale = itemElem.attribute( u
"distanceScale"_s ).toDouble();
983 mElevationScale = itemElem.attribute( u
"elevationScale"_s ).toDouble();
987 const QDomNodeList curveNodeList = itemElem.elementsByTagName( u
"curve"_s );
988 if ( !curveNodeList.isEmpty() )
990 const QDomElement curveElem = curveNodeList.at( 0 ).toElement();
994 mCurve.reset( curveGeom->clone() );
1002 mTolerance = itemElem.attribute( u
"tolerance"_s ).toDouble();
1003 mAtlasDriven =
static_cast< bool >( itemElem.attribute( u
"atlasDriven"_s, u
"0"_s ).toInt() );
1007 const QDomElement layersElement = itemElem.firstChildElement( u
"layers"_s );
1008 QDomElement layerElement = layersElement.firstChildElement( u
"layer"_s );
1009 while ( !layerElement.isNull() )
1012 ref.
readXml( layerElement, context );
1014 mLayers.append( ref );
1016 layerElement = layerElement.nextSiblingElement( u
"layer"_s );
1022 mSources.reserve( itemElem.elementsByTagName( u
"profileSources"_s ).count() );
1023 const QDomElement sourcesElement = itemElem.firstChildElement( u
"profileSources"_s );
1024 QDomElement sourceElement = sourcesElement.firstChildElement();
1025 while ( !sourceElement.isNull() )
1027 if ( sourceElement.tagName() ==
"profileCustomSource"_L1 )
1029 const QString sourceId = sourceElement.attribute( u
"id"_s );
1032 mSources << profileSource;
1035 else if ( sourceElement.tagName() ==
"profileLayerSource"_L1 )
1038 ref.
readXml( sourceElement, context );
1046 sourceElement = sourceElement.nextSiblingElement();
1050 const QDomElement subsectionsElement = itemElem.firstChildElement( u
"subsections"_s );
1051 const QDomElement symbolsElement = subsectionsElement.firstChildElement( u
"symbol"_s );
1052 if ( !symbolsElement.isNull() )
1055 if ( subSectionsSymbol )
1064void QgsLayoutItemElevationProfile::recreateCachedImageInBackground()
1070 QPainter *oldPainter = mPainter.release();
1071 QImage *oldImage = mCacheRenderingImage.release();
1073 oldJob->deleteLater();
1081 mCacheRenderingImage.reset(
nullptr );
1085 Q_ASSERT( !mRenderJob );
1086 Q_ASSERT( !mPainter );
1087 Q_ASSERT( !mCacheRenderingImage );
1090 double widthLayoutUnits = layoutSize.width();
1091 double heightLayoutUnits = layoutSize.height();
1093 int w =
static_cast< int >( std::round( widthLayoutUnits * mPreviewScaleFactor ) );
1094 int h =
static_cast< int >( std::round( heightLayoutUnits * mPreviewScaleFactor ) );
1097 if ( w > 5000 || h > 5000 )
1102 h =
static_cast< int>( std::round( w * heightLayoutUnits / widthLayoutUnits ) );
1107 w =
static_cast< int >( std::round( h * widthLayoutUnits / heightLayoutUnits ) );
1111 if ( w <= 0 || h <= 0 )
1114 mCacheRenderingImage = std::make_unique<QImage>( w, h, QImage::Format_ARGB32 );
1117 mCacheRenderingImage->setDotsPerMeterX(
static_cast< int >( std::round( 1000 * w / widthLayoutUnits ) ) );
1118 mCacheRenderingImage->setDotsPerMeterY(
static_cast< int >( std::round( 1000 * h / heightLayoutUnits ) ) );
1121 mCacheRenderingImage->fill( Qt::transparent );
1128 mCacheInvalidated =
false;
1129 mPainter = std::make_unique<QPainter>( mCacheRenderingImage.get() );
1131 QList< QgsAbstractProfileSource *> sourcesToRender =
sources();
1132 std::reverse( sourcesToRender.begin(), sourcesToRender.end() );
1134 mRenderJob = std::make_unique< QgsProfilePlotRenderer >( sourcesToRender,
profileRequest() );
1136 mRenderJob->setSubsectionsSymbol( rendererSubSectionsSymbol.release() );
1138 mRenderJob->startGeneration();
1140 mDrawingPreview =
false;
1143void QgsLayoutItemElevationProfile::profileGenerationFinished()
1145 mPlot->setRenderer( mRenderJob.get() );
1151 const double mapUnitsPerPixel =
static_cast< double >( mPlot->xMaximum() - mPlot->xMinimum() ) * mPlot->xScale / mCacheRenderingImage->size().width();
1155 mPlot->setSize( mCacheRenderingImage->size() );
1157 QgsPlotRenderContext plotContext;
1158 mPlot->render( rc, plotContext );
1160 mPlot->setRenderer(
nullptr );
1163 mRenderJob.reset(
nullptr );
1164 mPainter.reset(
nullptr );
1165 mCacheFinalImage = std::move( mCacheRenderingImage );
1173 return mDistanceUnit;
1178 mDistanceUnit = unit;
1180 switch ( mDistanceUnit )
1234 mPlot->xAxis().setLabelSuffix( QObject::tr(
"°" ) );
1238 mPlot->xAxis().setLabelSuffix( QString() );
1245 mSubsectionsSymbol.reset( symbol );
1248void QgsLayoutItemElevationProfile::setSourcesPrivate()
1256void QgsLayoutItemElevationProfile::calculateAxisRanges(
QgsRenderContext &context )
1261 switch ( mRangeMethod )
1277 mPlot->setSize( layoutSizeMm.
toQSizeF() * mmToPainterUnits );
1279 QgsPlotRenderContext plotContext;
1287 if ( mDistanceScale > 0 )
1289 const double widthMeters = layoutSizeMm.
width() / 1000;
1291 mPlot->setXMinimum( 0 );
1292 mPlot->setXMaximum( distanceRange );
1294 if ( mElevationScale > 0 )
1296 const double heightMeters = layoutSizeMm.
height() / 1000;
1297 const double elevationRange = heightMeters * mElevationScale;
1298 mPlot->setYMaximum( mPlot->yMinimum() + elevationRange );
1302 QRectF previousPlotArea;
1303 for (
int iteration = 0; iteration < 5; ++iteration )
1305 const QRectF currentPlotArea = mPlot->interiorPlotArea( context, plotContext );
1306 if (
qgsDoubleNear( currentPlotArea.width(), previousPlotArea.width(), 1 ) &&
qgsDoubleNear( currentPlotArea.height(), previousPlotArea.height(), 1 ) )
1309 previousPlotArea = currentPlotArea;
1311 if ( mDistanceScale > 0 )
1313 const double widthMm = currentPlotArea.width() / mmToPainterUnits;
1314 const double widthMeters = widthMm / 1000.0;
1316 mPlot->setXMaximum( distanceRange );
1319 if ( mElevationScale > 0 )
1321 const double heightMm = currentPlotArea.height() / mmToPainterUnits;
1322 const double heightMeters = heightMm / 1000.0;
1323 const double elevationRange = heightMeters * mElevationScale;
1324 mPlot->setYMaximum( mPlot->yMinimum() + elevationRange );
1331 return mElevationScale;
1336 mElevationScale = scale;
1341 return mDistanceScale;
1346 mDistanceScale = scale;
1351 return mRangeMethod;
1356 mRangeMethod = method;
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
@ Millimeters
Millimeters.
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).
@ Millimeters
Millimeters.
ElevationProfileRangeMethod
Elevation profile range calculation methods.
@ ManualRange
Distance/elevation ranges are manually set.
@ FixedScale
Distance and elevation ranges are calculated from fixed scales.
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
virtual void renderContent(QgsRenderContext &context, QgsPlotRenderContext &plotContext, const QRectF &plotArea, const QgsPlotData &plotData=QgsPlotData())
Renders the plot content.
Base class for 2-dimensional plot/chart/graphs with an X and Y axes.
double yMaximum() const
Returns 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.
double xMaximum() const
Returns the maximum value of the x axis.
Abstract base class for all geometries.
Interface for classes which can generate elevation profiles.
Abstract base class for terrain providers.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsProfileSourceRegistry * profileSourceRegistry()
Returns registry of available profile source implementations.
Represents a coordinate reference system (CRS).
Abstract base class for curved geometry type.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static Q_INVOKABLE QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
static QgsLayoutItemElevationProfile * create(QgsLayout *layout)
Returns a new elevation profile item for the specified layout.
Qgs2DXyPlot * plot()
Returns a reference to the elevation plot object, which can be used to set plot appearance and proper...
void setElevationScale(double scale)
Sets the denominator of the elevation scale.
QgsLayoutItemElevationProfile(QgsLayout *layout)
Constructor for QgsLayoutItemElevationProfile, with the specified parent layout.
Qgis::ElevationProfileRangeMethod rangeMethod() const
Returns the method used to determine the elevation/distance ranges on the profile.
~QgsLayoutItemElevationProfile() override
QgsCurve * profileCurve() const
Returns the cross section profile curve, which represents the line along which the profile should be ...
void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties) override
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
void setLayers(const QList< QgsMapLayer * > &layers)
Sets the list of map layers participating in the elevation profile.
void setSubsectionsSymbol(QgsLineSymbol *symbol)
Sets the symbol used to draw the subsections.
QList< QgsMapLayer * > layers() const
Returns the list of map layers participating in the elevation profile.
void invalidateCache() override
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the desired Coordinate Reference System (crs) for the profile.
double distanceScale() const
Returns the denominator of the distance scale.
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
void setDistanceScale(double scale)
Sets the denominator of the distance scale.
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
QgsLayoutItem::Flags itemFlags() const override
Returns the item's flags, which indicate how the item behaves.
QList< QgsAbstractProfileSource * > sources() const
Returns the list of sources participating in the elevation profile.
void setRangeMethod(Qgis::ElevationProfileRangeMethod method)
Sets the method used to determine the elevation/distance ranges on the profile.
void setDistanceUnit(Qgis::DistanceUnit unit)
Sets the unit for the distance axis.
void setTolerance(double tolerance)
Sets the tolerance of the request (in crs() units).
QgsCoordinateReferenceSystem crs() const
Returns the desired Coordinate Reference System for the profile.
void setAtlasDriven(bool enabled)
Sets whether the profile curve will follow the current atlas feature.
double tolerance() const
Returns the tolerance of the request (in crs() units).
QgsLineSymbol * subsectionsSymbol()
Returns the symbol used to draw the subsections.
Qgis::DistanceUnit distanceUnit() const
Returns the units for the distance axis.
bool requiresRasterization() const override
Returns true if the item is drawn in such a way that forces the whole layout to be rasterized when ex...
void setSources(const QList< QgsAbstractProfileSource * > &sources)
Sets the list of sources participating in the elevation profile.
bool containsAdvancedEffects() const override
Returns true if the item contains contents with blend modes or transparency effects which can only be...
void paint(QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget) override
double elevationScale() const
Returns the denominator of the elevation scale.
QIcon icon() const override
Returns the item's icon.
void previewRefreshed()
Emitted whenever the item's preview has been refreshed.
void setProfileCurve(QgsCurve *curve)
Sets the cross section profile curve, which represents the line along which the profile should be gen...
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
QgsProfileRequest profileRequest() const
Returns the profile request used to generate the elevation profile.
int type() const override
@ LayoutElevationProfile
Elevation profile item.
Contains settings and helpers relating to a render of a QgsLayoutItem.
virtual void drawFrame(QgsRenderContext &context)
Draws the frame around the item.
QColor backgroundColor(bool useDataDefined=true) const
Returns the background color for this item.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties)
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
QgsLayoutSize sizeWithUnits() const
Returns the item's current size, including units.
QgsLayoutItem(QgsLayout *layout, bool manageZValue=true)
Constructor for QgsLayoutItem, with the specified parent layout.
void refreshItemSize()
Refreshes an item's size by rechecking it against any possible item fixed or minimum sizes.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
virtual void drawBackground(QgsRenderContext &context)
Draws the background for the item.
bool shouldDrawItem() const
Returns whether the item should be drawn in the current context.
@ FlagOverridesPaint
Item overrides the default layout item painting method.
@ FlagDisableSceneCaching
Item should not have QGraphicsItem caching enabled.
void sizePositionChanged()
Emitted when the item's size or position changes.
bool frameEnabled() const
Returns true if the item includes a frame.
bool hasBackground() const
Returns true if the item has a background.
void refresh() override
Refreshes the item, causing a recalculation of any property overrides and recalculation of its positi...
friend class QgsLayoutItemElevationProfile
void setBackgroundEnabled(bool drawBackground)
Sets whether this item has a background drawn under it or not.
QPainter::CompositionMode blendMode() const
Returns the item's composition blending mode.
void backgroundTaskCountChanged(int count)
Emitted whenever the number of background tasks an item is executing changes.
QgsPropertyCollection mDataDefinedProperties
const QgsLayout * layout() const
Returns the layout the object is attached to.
QPointer< QgsLayout > mLayout
DataDefinedProperty
Data defined properties for different item types.
@ ElevationProfileMaximumDistance
Maximum distance value for elevation profile.
@ MarginBottom
Bottom margin.
@ ElevationProfileElevationMinorInterval
Minor grid line interval for elevation profile elevation axis.
@ ElevationProfileDistanceMinorInterval
Minor grid line interval for elevation profile distance axis.
@ ElevationProfileMinimumDistance
Minimum distance value for elevation profile.
@ ElevationProfileMaximumElevation
Maximum elevation value for elevation profile.
@ ElevationProfileDistanceLabelInterval
Label interval for elevation profile distance axis.
@ ElevationProfileTolerance
Tolerance distance for elevation profiles.
@ ElevationProfileMinimumElevation
Minimum elevation value for elevation profile.
@ MarginRight
Right margin.
@ ElevationProfileElevationLabelInterval
Label interval for elevation profile elevation axis.
@ ElevationProfileDistanceMajorInterval
Major grid line interval for elevation profile distance axis.
@ ElevationProfileElevationMajorInterval
Major grid line interval for elevation profile elevation axis.
@ AllProperties
All properties for item.
double height() const
Returns the height of the size.
double width() const
Returns the width of the size.
QSizeF toQSizeF() const
Converts the layout size to a QSizeF.
static QgsRenderContext createRenderContextForLayout(QgsLayout *layout, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout and painter destination.
static Q_DECL_DEPRECATED double scaleFactorFromItemStyle(const QStyleOptionGraphicsItem *style)
Extracts the scale factor from an item style.
void refreshed()
Emitted when the layout has been refreshed and items should also be refreshed and updated.
A line symbol type, for rendering LineString and MultiLineString geometries.
Base class for all map layer types.
Perform transforms between map coordinates and device coordinates.
Defines the four margins of a rectangle.
void setBottom(double bottom)
Sets the bottom margin to bottom.
void setLeft(double left)
Sets the left margin to left.
void setRight(double right)
Sets the right margin to right.
void setTop(double top)
Sets the top margin to top.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
Encapsulates one or more plot series.
Contains information about the context of a plot rendering operation.
Generates and renders elevation profile plots.
void setSubsectionsSymbol(QgsLineSymbol *symbol)
Sets the symbol used to draw the subsections.
void cancelGenerationWithoutBlocking()
Triggers cancellation of the generation job without blocking.
void generateSynchronously()
Generate the profile results synchronously in this thread.
void generationFinished()
Emitted when the profile generation is finished (or canceled).
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.
void profileSourceUnregistered(const QString &sourceId)
Signal emitted once a profile source is unregistered.
void profileSourceRegistered(const QString &sourceId, const QString &sourceName)
Signal emitted once a profile source is registered.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
A container for the context for various read/write operations on objects.
Contains information about the context of a rendering operation.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
Scoped object for saving and restoring a QPainter object's state.
static std::unique_ptr< QgsSymbol > loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
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.
T qgsEnumKeyToValue(const QString &key, const T &defaultValue, bool tryValueAsKey=true, bool *returnOk=nullptr)
Returns the value corresponding to the given key of an enum.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
T qgsgeometry_cast(QgsAbstractGeometry *geom)
_LayerRef< QgsMapLayer > QgsMapLayerRef
TYPE * resolveWeakly(const QgsProject *project, MatchType matchType=MatchType::All)
Resolves the map layer by attempting to find a matching layer in a project using a weak match.
TYPE * get() const
Returns a pointer to the layer, or nullptr if the reference has not yet been matched to a layer.
bool readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads the layer's properties from an XML element.