19#include "moc_qgslayoutitemelevationprofile.cpp"
38#define CACHE_SIZE_LIMIT 5000
41class QgsLayoutItemElevationProfilePlot :
public Qgs2DPlot
45 QgsLayoutItemElevationProfilePlot()
59 rc.
painter()->translate( plotArea.left(), plotArea.top() );
60 mRenderer->render( rc, plotArea.width(), plotArea.height(), xMinimum() * xScale,
xMaximum() * xScale,
yMinimum(),
yMaximum() );
61 rc.
painter()->translate( -plotArea.left(), -plotArea.top() );
76 , mPlot( std::make_unique< QgsLayoutItemElevationProfilePlot >() )
78 mBackgroundUpdateTimer =
new QTimer(
this );
79 mBackgroundUpdateTimer->setSingleShot(
true );
80 connect( mBackgroundUpdateTimer, &QTimer::timeout,
this, &QgsLayoutItemElevationProfile::recreateCachedImageInBackground );
82 setCacheMode( QGraphicsItem::NoCache );
104 mRenderJob->cancelGeneration();
128 bool forceUpdate =
false;
133 double value = mTolerance;
153 double value = mPlot->xMinimum();
164 mPlot->setXMinimum( value );
173 double value = mPlot->xMaximum();
184 mPlot->setXMaximum( value );
193 double value = mPlot->yMinimum();
204 mPlot->setYMinimum( value );
213 double value = mPlot->yMaximum();
224 mPlot->setYMaximum( value );
233 double value = mPlot->xAxis().gridIntervalMajor();
244 mPlot->xAxis().setGridIntervalMajor( value );
253 double value = mPlot->xAxis().gridIntervalMinor();
264 mPlot->xAxis().setGridIntervalMinor( value );
273 double value = mPlot->xAxis().labelInterval();
284 mPlot->xAxis().setLabelInterval( value );
293 double value = mPlot->yAxis().gridIntervalMajor();
304 mPlot->yAxis().setGridIntervalMajor( value );
313 double value = mPlot->yAxis().gridIntervalMinor();
324 mPlot->yAxis().setGridIntervalMinor( value );
333 double value = mPlot->yAxis().labelInterval();
344 mPlot->yAxis().setLabelInterval( value );
353 double value = mPlot->margins().left();
366 mPlot->setMargins( margins );
375 double value = mPlot->margins().right();
388 mPlot->setMargins( margins );
397 double value = mPlot->margins().top();
410 mPlot->setMargins( margins );
419 double value = mPlot->margins().bottom();
432 mPlot->setMargins( margins );
440 mCacheInvalidated =
true;
456 return blendMode() != QPainter::CompositionMode_SourceOver;
461 return mEvaluatedOpacity < 1.0;
476 return _qgis_listRefToRaw( mLayers );
481 if (
layers == _qgis_listRefToRaw( mLayers ) )
484 mLayers = _qgis_listRawToRef(
layers );
490 mCurve.reset( curve );
529 mAtlasDriven = enabled;
555 if ( !
mLayout || !painter || !painter->device() || !mUpdatesEnabled )
564 QRectF thisPaintRect = rect();
568 if (
mLayout->renderContext().isPreviewRender() )
574 painter->setClipRect( thisPaintRect );
575 if ( !mCacheFinalImage || mCacheFinalImage->isNull() )
578 painter->setBrush( QBrush( QColor( 125, 125, 125, 125 ) ) );
579 painter->drawRect( thisPaintRect );
580 painter->setBrush( Qt::NoBrush );
582 messageFont.setPointSize( 12 );
583 painter->setFont( messageFont );
584 painter->setPen( QColor( 255, 255, 255, 255 ) );
585 painter->drawText( thisPaintRect, Qt::AlignCenter | Qt::AlignHCenter, tr(
"Rendering profile" ) );
588 ( mRenderJob && mCacheInvalidated && !mDrawingPreview )
590 ( !mRenderJob && !mDrawingPreview )
595 mBackgroundUpdateTimer->start( 1 );
600 if ( mCacheInvalidated && !mDrawingPreview )
604 mBackgroundUpdateTimer->start( 1 );
609 double imagePixelWidth = mCacheFinalImage->width();
610 double scale = rect().width() / imagePixelWidth;
614 painter->scale( scale, scale );
615 painter->setCompositionMode( blendModeForRender() );
616 painter->drawImage( 0, 0, *mCacheFinalImage );
619 painter->setClipRect( thisPaintRect, Qt::NoClip );
632 QPaintDevice *paintDevice = painter->device();
639 painter->setRenderHint( QPainter::LosslessImageRendering,
true );
651 int widthInPixels =
static_cast< int >( std::round( boundingRect().width() * layoutUnitsInInches * destinationDpi ) );
652 int heightInPixels =
static_cast< int >( std::round( boundingRect().height() * layoutUnitsInInches * destinationDpi ) );
653 QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
655 image.fill( Qt::transparent );
656 image.setDotsPerMeterX(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
657 image.setDotsPerMeterY(
static_cast< int >( std::round( 1000 * destinationDpi / 25.4 ) ) );
658 double dotsPerMM = destinationDpi / 25.4;
659 layoutSize *= dotsPerMM;
660 QPainter p( &image );
661 preparePainter( &p );
666 p.scale( dotsPerMM, dotsPerMM );
672 p.scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
674 const double mapUnitsPerPixel =
static_cast<double>( mPlot->xMaximum() - mPlot->xMinimum() ) * mPlot->xScale / layoutSize.width();
677 QList< QgsAbstractProfileSource * > sources;
682 sources.append( source );
688 mPlot->setRenderer( &renderer );
691 mPlot->setSize( layoutSize );
695 mPlot->setRenderer(
nullptr );
697 p.scale( dotsPerMM, dotsPerMM );
705 painter->setCompositionMode( blendModeForRender() );
706 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
707 painter->drawImage( 0, 0, image );
708 painter->scale( dotsPerMM, dotsPerMM );
723 double dotsPerMM = paintDevice->logicalDpiX() / 25.4;
724 layoutSize *= dotsPerMM;
725 painter->scale( 1 / dotsPerMM, 1 / dotsPerMM );
727 const double mapUnitsPerPixel =
static_cast<double>( mPlot->xMaximum() - mPlot->xMinimum() ) * mPlot->xScale / layoutSize.width();
730 QList< QgsAbstractProfileSource * > sources;
735 sources.append( source );
748 mPlot->setRenderer( &renderer );
751 mPlot->setSize( layoutSize );
755 mPlot->setRenderer(
nullptr );
757 painter->setClipRect( thisPaintRect, Qt::NoClip );
772 if ( mAtlasDriven &&
mLayout &&
mLayout->reportContext().layer() )
781 if (
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( geom->simplifiedTypeRef() ) )
783 mCurve.reset( curve->clone() );
796 mCacheInvalidated =
true;
807 QDomElement plotElement = doc.createElement( QStringLiteral(
"plot" ) );
808 mPlot->writeXml( plotElement, doc, rwContext );
809 layoutProfileElem.appendChild( plotElement );
812 layoutProfileElem.setAttribute( QStringLiteral(
"distanceUnit" ),
qgsEnumValueToKey( mDistanceUnit ) );
814 layoutProfileElem.setAttribute( QStringLiteral(
"tolerance" ), mTolerance );
815 layoutProfileElem.setAttribute( QStringLiteral(
"atlasDriven" ), mAtlasDriven ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
818 QDomElement crsElem = doc.createElement( QStringLiteral(
"crs" ) );
820 layoutProfileElem.appendChild( crsElem );
824 QDomElement curveElem = doc.createElement( QStringLiteral(
"curve" ) );
825 curveElem.appendChild( doc.createTextNode( mCurve->asWkt( ) ) );
826 layoutProfileElem.appendChild( curveElem );
830 QDomElement layersElement = doc.createElement( QStringLiteral(
"layers" ) );
833 QDomElement layerElement = doc.createElement( QStringLiteral(
"layer" ) );
834 layer.writeXml( layerElement, rwContext );
835 layersElement.appendChild( layerElement );
837 layoutProfileElem.appendChild( layersElement );
845 const QDomElement plotElement = itemElem.firstChildElement( QStringLiteral(
"plot" ) );
846 if ( !plotElement.isNull() )
848 mPlot->readXml( plotElement, context );
851 const QDomNodeList crsNodeList = itemElem.elementsByTagName( QStringLiteral(
"crs" ) );
853 if ( !crsNodeList.isEmpty() )
855 const QDomElement crsElem = crsNodeList.at( 0 ).toElement();
862 const QDomNodeList curveNodeList = itemElem.elementsByTagName( QStringLiteral(
"curve" ) );
863 if ( !curveNodeList.isEmpty() )
865 const QDomElement curveElem = curveNodeList.at( 0 ).toElement();
867 if (
const QgsCurve *curveGeom = qgsgeometry_cast< const QgsCurve * >( curve.
constGet() ) )
869 mCurve.reset( curveGeom->clone() );
877 mTolerance = itemElem.attribute( QStringLiteral(
"tolerance" ) ).toDouble();
878 mAtlasDriven =
static_cast< bool >( itemElem.attribute( QStringLiteral(
"atlasDriven" ), QStringLiteral(
"0" ) ).toInt() );
882 const QDomElement layersElement = itemElem.firstChildElement( QStringLiteral(
"layers" ) );
883 QDomElement layerElement = layersElement.firstChildElement( QStringLiteral(
"layer" ) );
884 while ( !layerElement.isNull() )
887 ref.
readXml( layerElement, context );
889 mLayers.append( ref );
891 layerElement = layerElement.nextSiblingElement( QStringLiteral(
"layer" ) );
898void QgsLayoutItemElevationProfile::recreateCachedImageInBackground()
904 QPainter *oldPainter = mPainter.release();
905 QImage *oldImage = mCacheRenderingImage.release();
908 oldJob->deleteLater();
916 mCacheRenderingImage.reset(
nullptr );
920 Q_ASSERT( !mRenderJob );
921 Q_ASSERT( !mPainter );
922 Q_ASSERT( !mCacheRenderingImage );
925 double widthLayoutUnits = layoutSize.width();
926 double heightLayoutUnits = layoutSize.height();
928 int w =
static_cast< int >( std::round( widthLayoutUnits * mPreviewScaleFactor ) );
929 int h =
static_cast< int >( std::round( heightLayoutUnits * mPreviewScaleFactor ) );
932 if ( w > 5000 || h > 5000 )
937 h =
static_cast< int>( std::round( w * heightLayoutUnits / widthLayoutUnits ) );
942 w =
static_cast< int >( std::round( h * widthLayoutUnits / heightLayoutUnits ) );
946 if ( w <= 0 || h <= 0 )
949 mCacheRenderingImage.reset(
new QImage( w, h, QImage::Format_ARGB32 ) );
952 mCacheRenderingImage->setDotsPerMeterX(
static_cast< int >( std::round( 1000 * w / widthLayoutUnits ) ) );
953 mCacheRenderingImage->setDotsPerMeterY(
static_cast< int >( std::round( 1000 * h / heightLayoutUnits ) ) );
956 mCacheRenderingImage->fill( Qt::transparent );
963 mCacheInvalidated =
false;
964 mPainter.reset(
new QPainter( mCacheRenderingImage.get() ) );
966 QList< QgsAbstractProfileSource * > sources;
971 sources.append( source );
974 mRenderJob = std::make_unique< QgsProfilePlotRenderer >( sources,
profileRequest() );
976 mRenderJob->startGeneration();
978 mDrawingPreview =
false;
981void QgsLayoutItemElevationProfile::profileGenerationFinished()
983 mPlot->setRenderer( mRenderJob.get() );
989 const double mapUnitsPerPixel =
static_cast< double >( mPlot->xMaximum() - mPlot->xMinimum() ) * mPlot->xScale /
990 mCacheRenderingImage->size().width();
994 mPlot->setSize( mCacheRenderingImage->size() );
998 mPlot->setRenderer(
nullptr );
1001 mRenderJob.reset(
nullptr );
1002 mPainter.reset(
nullptr );
1003 mCacheFinalImage = std::move( mCacheRenderingImage );
1011 return mDistanceUnit;
1016 mDistanceUnit = unit;
1018 switch ( mDistanceUnit )
1072 mPlot->xAxis().setLabelSuffix( QObject::tr(
"°" ) );
1076 mPlot->xAxis().setLabelSuffix( QString() );
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)
Base class for 2-dimensional plot/chart/graphs.
double yMaximum() const
Returns the maximum value of the y axis.
double xMaximum() const
Returns the maximum value of the x axis.
double yMinimum() const
Returns the minimum value of the y axis.
virtual void renderContent(QgsRenderContext &context, const QRectF &plotArea)
Renders the plot content.
Abstract base class for all geometries.
Interface for classes which can generate elevation profiles.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
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.
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
bool writeXml(QDomNode &node, QDomDocument &doc) const
Stores state to the given Dom node in the given document.
Qgis::DistanceUnit mapUnits
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.
A layout item subclass for elevation profile plots.
static QgsLayoutItemElevationProfile * create(QgsLayout *layout)
Returns a new elevation profile item for the specified layout.
~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.
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.
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
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.
void setDistanceUnit(Qgis::DistanceUnit unit)
Sets the unit for the distance axis.
Qgs2DPlot * plot()
Returns a reference to the elevation plot object, which can be used to set plot appearance and proper...
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).
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...
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
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.
Base class for graphical items within a QgsLayout.
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.
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.
@ FlagLosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ FlagForceVectorOutput
Force output in vector format where possible, even if items require rasterization to keep their corre...
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.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
void refreshed()
Emitted when the layout has been refreshed and items should also be refreshed and updated.
Perform transforms between map coordinates and device coordinates.
The QgsMargins class 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)
Adds a message to the log instance (and creates it if necessary).
Generates and renders elevation profile plots.
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.
QList< QgsAbstractProfileSource * > profileSources() const
Returns a list of registered profile sources.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
bool isActive(int key) const final
Returns true if the collection contains an active property with the specified key.
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.
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 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.
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 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)
const QgsCoordinateReferenceSystem & crs
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.
bool readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads the layer's properties from an XML element.