QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
Loading...
Searching...
No Matches
qgsalgorithmgenerateelevationprofile.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmgenerateelevationprofile.cpp
3 ---------------------
4 begin : October 2024
5 copyright : (C) 2024 by Mathieu Pellerin
6 email : mathieu at opengis dot ch
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include "qgis.h"
22#include "qgscurve.h"
23#include "qgsfillsymbol.h"
24#include "qgsfillsymbollayer.h"
25#include "qgsfontutils.h"
26#include "qgslinesymbol.h"
27#include "qgslinesymbollayer.h"
28#include "qgsplot.h"
29#include "qgsprofilerequest.h"
30#include "qgsterrainprovider.h"
31#include "qgstextformat.h"
32
33#include <QString>
34
35using namespace Qt::StringLiterals;
36
38
39class QgsAlgorithmElevationProfilePlotItem : public Qgs2DXyPlot
40{
41 public:
42 explicit QgsAlgorithmElevationProfilePlotItem( int width, int height, int dpi )
43 : mDpi( dpi )
44 {
45 setYMinimum( 0 );
46 setYMaximum( 10 );
47 setSize( QSizeF( width, height ) );
48 }
49
50 void setRenderer( QgsProfilePlotRenderer *renderer ) { mRenderer = renderer; }
51
52 QRectF plotArea()
53 {
54 if ( !mPlotArea.isNull() )
55 {
56 return mPlotArea;
57 }
58
59 // calculate plot area
60 QgsRenderContext context;
61 context.setScaleFactor( mDpi / 25.4 );
62
63 QgsPlotRenderContext plotContext;
64 calculateOptimisedIntervals( context, plotContext );
65 mPlotArea = interiorPlotArea( context, plotContext );
66 return mPlotArea;
67 }
68
69 void renderContent( QgsRenderContext &rc, QgsPlotRenderContext &, const QRectF &plotArea, const QgsPlotData & ) override
70 {
71 mPlotArea = plotArea;
72
73 if ( !mRenderer )
74 return;
75
76 rc.painter()->translate( mPlotArea.left(), mPlotArea.top() );
77 const QStringList sourceIds = mRenderer->sourceIds();
78 for ( const QString &source : sourceIds )
79 {
80 mRenderer->render( rc, mPlotArea.width(), mPlotArea.height(), xMinimum(), xMaximum(), yMinimum(), yMaximum(), source );
81 }
82 rc.painter()->translate( -mPlotArea.left(), -mPlotArea.top() );
83 }
84
85 private:
86 int mDpi = 96;
87 QRectF mPlotArea;
88 QgsProfilePlotRenderer *mRenderer = nullptr;
89};
90
91void QgsGenerateElevationProfileAlgorithm::initAlgorithm( const QVariantMap & )
92{
93 addParameter( new QgsProcessingParameterGeometry( u"CURVE"_s, QObject::tr( "Profile curve" ), QVariant(), false, QList<int>() << static_cast<int>( Qgis::GeometryType::Line ) ) );
94 addParameter( new QgsProcessingParameterMultipleLayers( u"MAP_LAYERS"_s, QObject::tr( "Map layers" ), Qgis::ProcessingSourceType::MapLayer, QVariant(), false ) );
95 addParameter( new QgsProcessingParameterNumber( u"WIDTH"_s, QObject::tr( "Chart width (in pixels)" ), Qgis::ProcessingNumberParameterType::Integer, 400, false, 0 ) );
96 addParameter( new QgsProcessingParameterNumber( u"HEIGHT"_s, QObject::tr( "Chart height (in pixels)" ), Qgis::ProcessingNumberParameterType::Integer, 300, false, 0 ) );
97 addParameter(
98 new QgsProcessingParameterMapLayer( u"TERRAIN_LAYER"_s, QObject::tr( "Terrain layer" ), QVariant(), true, QList<int>() << static_cast<int>( Qgis::ProcessingSourceType::Raster ) << static_cast<int>( Qgis::ProcessingSourceType::Mesh ) )
99 );
100
101 auto minimumDistanceParam
102 = std::make_unique<QgsProcessingParameterNumber>( u"MINIMUM_DISTANCE"_s, QObject::tr( "Chart minimum distance (X axis)" ), Qgis::ProcessingNumberParameterType::Double, QVariant(), true );
103 minimumDistanceParam->setFlags( minimumDistanceParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
104 addParameter( minimumDistanceParam.release() );
105 auto maximumDistanceParam
106 = std::make_unique<QgsProcessingParameterNumber>( u"MAXIMUM_DISTANCE"_s, QObject::tr( "Chart maximum distance (X axis)" ), Qgis::ProcessingNumberParameterType::Double, QVariant(), true );
107 maximumDistanceParam->setFlags( maximumDistanceParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
108 addParameter( maximumDistanceParam.release() );
109 auto minimumElevationParam
110 = std::make_unique<QgsProcessingParameterNumber>( u"MINIMUM_ELEVATION"_s, QObject::tr( "Chart minimum elevation (Y axis)" ), Qgis::ProcessingNumberParameterType::Double, QVariant(), true );
111 minimumElevationParam->setFlags( minimumElevationParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
112 addParameter( minimumElevationParam.release() );
113 auto maximumElevationParam
114 = std::make_unique<QgsProcessingParameterNumber>( u"MAXIMUM_ELEVATION"_s, QObject::tr( "Chart maximum elevation (Y axis)" ), Qgis::ProcessingNumberParameterType::Double, QVariant(), true );
115 maximumElevationParam->setFlags( maximumElevationParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
116 addParameter( maximumElevationParam.release() );
117
118 auto textColorParam = std::make_unique<QgsProcessingParameterColor>( u"TEXT_COLOR"_s, QObject::tr( "Chart text color" ), QColor( 0, 0, 0 ), true, true );
119 textColorParam->setFlags( textColorParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
120 addParameter( textColorParam.release() );
121
122 auto textFontFamilyParam = std::make_unique<QgsProcessingParameterString>( u"TEXT_FONT_FAMILY"_s, QObject::tr( "Chart text font family" ), QVariant(), false, true );
123 textFontFamilyParam->setFlags( textFontFamilyParam->flags() | Qgis::ProcessingParameterFlag::Hidden );
124 addParameter( textFontFamilyParam.release() );
125
126 auto textFontStyleParam = std::make_unique<QgsProcessingParameterString>( u"TEXT_FONT_STYLE"_s, QObject::tr( "Chart text font style" ), QVariant(), false, true );
127 textFontStyleParam->setFlags( textFontStyleParam->flags() | Qgis::ProcessingParameterFlag::Hidden );
128 addParameter( textFontStyleParam.release() );
129
130 auto textFontSizeParam = std::make_unique<QgsProcessingParameterNumber>( u"TEXT_FONT_SIZE"_s, QObject::tr( "Chart text font size" ), Qgis::ProcessingNumberParameterType::Double, 0, true );
131 textFontSizeParam->setFlags( textFontSizeParam->flags() | Qgis::ProcessingParameterFlag::Hidden );
132 addParameter( textFontSizeParam.release() );
133
134 auto backgroundColorParam = std::make_unique<QgsProcessingParameterColor>( u"BACKGROUND_COLOR"_s, QObject::tr( "Chart background color" ), QColor( 255, 255, 255 ), true, true );
135 backgroundColorParam->setFlags( backgroundColorParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
136 addParameter( backgroundColorParam.release() );
137 auto borderColorParam = std::make_unique<QgsProcessingParameterColor>( u"BORDER_COLOR"_s, QObject::tr( "Chart border color" ), QColor( 99, 99, 99 ), true, true );
138 borderColorParam->setFlags( borderColorParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
139 addParameter( borderColorParam.release() );
140
141 auto toleranceParam = std::make_unique<QgsProcessingParameterNumber>( u"TOLERANCE"_s, QObject::tr( "Profile tolerance" ), Qgis::ProcessingNumberParameterType::Double, 5.0, false, 0 );
142 toleranceParam->setFlags( toleranceParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
143 addParameter( toleranceParam.release() );
144
145 auto dpiParam = std::make_unique<QgsProcessingParameterNumber>( u"DPI"_s, QObject::tr( "Chart DPI" ), Qgis::ProcessingNumberParameterType::Integer, 96, false, 0 );
146 dpiParam->setFlags( dpiParam->flags() | Qgis::ProcessingParameterFlag::Advanced );
147 addParameter( dpiParam.release() );
148
149 addParameter( new QgsProcessingParameterFileDestination( u"OUTPUT"_s, QObject::tr( "Output image" ) ) );
150}
151
152QString QgsGenerateElevationProfileAlgorithm::name() const
153{
154 return u"generateelevationprofileimage"_s;
155}
156
157QString QgsGenerateElevationProfileAlgorithm::displayName() const
158{
159 return QObject::tr( "Generate elevation profile image" );
160}
161
162QStringList QgsGenerateElevationProfileAlgorithm::tags() const
163{
164 return QObject::tr( "altitude,elevation,terrain,dem" ).split( ',' );
165}
166
167QString QgsGenerateElevationProfileAlgorithm::group() const
168{
169 return QObject::tr( "Plots" );
170}
171
172QString QgsGenerateElevationProfileAlgorithm::groupId() const
173{
174 return u"plots"_s;
175}
176
177QString QgsGenerateElevationProfileAlgorithm::shortHelpString() const
178{
179 return QObject::tr( "This algorithm creates an elevation profile image from a list of map layer and an optional terrain." );
180}
181
182QString QgsGenerateElevationProfileAlgorithm::shortDescription() const
183{
184 return QObject::tr( "Creates an elevation profile image from a list of map layer and an optional terrain." );
185}
186
187QgsGenerateElevationProfileAlgorithm *QgsGenerateElevationProfileAlgorithm::createInstance() const
188{
189 return new QgsGenerateElevationProfileAlgorithm();
190}
191
192bool QgsGenerateElevationProfileAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
193{
194 const QgsGeometry curveGeom = parameterAsGeometry( parameters, u"CURVE"_s, context );
195 const QgsCoordinateReferenceSystem curveCrs = parameterAsGeometryCrs( parameters, u"CURVE"_s, context );
196
197 QList<QgsMapLayer *> layers = parameterAsLayerList( parameters, u"MAP_LAYERS"_s, context );
198 QgsMapLayer *terrainLayer = parameterAsLayer( parameters, u"TERRAIN_LAYER"_s, context );
199
200 const double tolerance = parameterAsDouble( parameters, u"TOLERANCE"_s, context );
201
202 QList<QgsAbstractProfileSource *> sources;
203 for ( QgsMapLayer *layer : layers )
204 {
205 if ( QgsAbstractProfileSource *source = layer->profileSource() )
206 sources.append( source );
207 }
208
209 QgsProfileRequest request( static_cast<QgsCurve *>( curveGeom.constGet()->clone() ) );
210 request.setCrs( curveCrs );
211 request.setTolerance( tolerance );
212 request.setTransformContext( context.transformContext() );
213 request.setExpressionContext( context.expressionContext() );
214
215 if ( terrainLayer )
216 {
217 if ( QgsRasterLayer *rasterLayer = dynamic_cast<QgsRasterLayer *>( terrainLayer ) )
218 {
219 auto terrainProvider = std::make_unique<QgsRasterDemTerrainProvider>();
220 terrainProvider->setLayer( rasterLayer );
221 request.setTerrainProvider( terrainProvider.release() );
222 }
223 else if ( QgsMeshLayer *meshLayer = dynamic_cast<QgsMeshLayer *>( terrainLayer ) )
224 {
225 auto terrainProvider = std::make_unique<QgsMeshTerrainProvider>();
226 terrainProvider->setLayer( meshLayer );
227 request.setTerrainProvider( terrainProvider.release() );
228 }
229 }
230
231
232 mRenderer = std::make_unique<QgsProfilePlotRenderer>( sources, request );
233
234 return true;
235}
236
237QVariantMap QgsGenerateElevationProfileAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
238{
239 const QgsGeometry curveGeom = parameterAsGeometry( parameters, u"CURVE"_s, context );
240
241 const bool hasMinimumDistance = parameters.value( u"MINIMUM_DISTANCE"_s ).isValid();
242 const double minimumDistance = parameterAsDouble( parameters, u"MINIMUM_DISTANCE"_s, context );
243 const bool hasMaximumDistance = parameters.value( u"MAXIMUM_DISTANCE"_s ).isValid();
244 const double maximumDistance = parameterAsDouble( parameters, u"MAXIMUM_DISTANCE"_s, context );
245 const bool hasMinimumElevation = parameters.value( u"MINIMUM_ELEVATION"_s ).isValid();
246 const double minimumElevation = parameterAsDouble( parameters, u"MINIMUM_ELEVATION"_s, context );
247 const bool hasMaximumElevation = parameters.value( u"MAXIMUM_ELEVATION"_s ).isValid();
248 const double maximumElevation = parameterAsDouble( parameters, u"MAXIMUM_ELEVATION"_s, context );
249
250 const int width = parameterAsInt( parameters, u"WIDTH"_s, context );
251 const int height = parameterAsInt( parameters, u"HEIGHT"_s, context );
252 const int dpi = parameterAsInt( parameters, u"DPI"_s, context );
253
254 const QString outputImage = parameterAsString( parameters, u"OUTPUT"_s, context );
255
256 const QColor textColor = parameterAsColor( parameters, u"TEXT_COLOR"_s, context );
257 const QColor backgroundColor = parameterAsColor( parameters, u"BACKGROUND_COLOR"_s, context );
258 const QColor borderColor = parameterAsColor( parameters, u"BORDER_COLOR"_s, context );
259
260 QgsAlgorithmElevationProfilePlotItem plotItem( width, height, dpi );
261
262 const QString textFontFamily = parameterAsString( parameters, u"TEXT_FONT_FAMILY"_s, context );
263 const QString textFontStyle = parameterAsString( parameters, u"TEXT_FONT_STYLE"_s, context );
264 const double textFontSize = parameterAsDouble( parameters, u"TEXT_FONT_SIZE"_s, context );
265
266 if ( !textFontFamily.isEmpty() || !textFontStyle.isEmpty() || textFontSize > 0 )
267 {
268 QgsTextFormat textFormat = plotItem.xAxis().textFormat();
269 QFont font = textFormat.font();
270 if ( !textFontFamily.isEmpty() )
271 {
272 QgsFontUtils::setFontFamily( font, textFontFamily );
273 }
274 if ( !textFontStyle.isEmpty() )
275 {
276 QgsFontUtils::updateFontViaStyle( font, textFontStyle );
277 }
278 textFormat.setFont( font );
279 if ( textFontSize > 0 )
280 {
281 textFormat.setSize( textFontSize );
283 }
284
285 plotItem.xAxis().setTextFormat( textFormat );
286 plotItem.yAxis().setTextFormat( textFormat );
287 }
288
289 if ( textColor.isValid() )
290 {
291 QgsTextFormat textFormat = plotItem.xAxis().textFormat();
292 textFormat.setColor( textColor );
293 plotItem.xAxis().setTextFormat( textFormat );
294 textFormat = plotItem.yAxis().textFormat();
295 textFormat.setColor( textColor );
296 plotItem.yAxis().setTextFormat( textFormat );
297 }
298
299 if ( borderColor.isValid() )
300 {
301 auto lineSymbolLayer = std::make_unique<QgsSimpleLineSymbolLayer>( borderColor, 0.1 );
302 lineSymbolLayer->setPenCapStyle( Qt::FlatCap );
303 plotItem.xAxis().setGridMinorSymbol( new QgsLineSymbol( QgsSymbolLayerList( { lineSymbolLayer->clone() } ) ) );
304 plotItem.yAxis().setGridMinorSymbol( new QgsLineSymbol( QgsSymbolLayerList( { lineSymbolLayer->clone() } ) ) );
305 plotItem.xAxis().setGridMajorSymbol( new QgsLineSymbol( QgsSymbolLayerList( { lineSymbolLayer->clone() } ) ) );
306 plotItem.yAxis().setGridMajorSymbol( new QgsLineSymbol( QgsSymbolLayerList( { lineSymbolLayer->clone() } ) ) );
307 plotItem.setChartBorderSymbol( new QgsFillSymbol( QgsSymbolLayerList( { lineSymbolLayer.release() } ) ) );
308 }
309
310 if ( backgroundColor.isValid() )
311 {
312 auto fillSymbolLayer = std::make_unique<QgsSimpleFillSymbolLayer>( backgroundColor, Qt::SolidPattern, backgroundColor );
313 plotItem.setChartBackgroundSymbol( new QgsFillSymbol( QgsSymbolLayerList( { fillSymbolLayer.release() } ) ) );
314 }
315
316 QgsProfileGenerationContext generationContext;
317 generationContext.setDpi( dpi );
318 generationContext.setMaximumErrorMapUnits( MAX_ERROR_PIXELS * ( curveGeom.constGet()->length() ) / plotItem.plotArea().width() );
319 generationContext.setMapUnitsPerDistancePixel( curveGeom.constGet()->length() / plotItem.plotArea().width() );
320
321 mRenderer->setContext( generationContext );
322
323 mRenderer->startGeneration();
324 mRenderer->waitForFinished();
325
326 const QgsDoubleRange zRange = mRenderer->zRange();
327 double zMinimum = 0;
328 double zMaximum = 0;
329 if ( zRange.upper() < zRange.lower() )
330 {
331 // invalid range, e.g. no features found in plot!
332 zMinimum = 0;
333 zMaximum = 10;
334 }
335 else if ( qgsDoubleNear( zRange.lower(), zRange.upper(), 0.0000001 ) )
336 {
337 // corner case ... a zero height plot! Just pick an arbitrary +/- 5 height range.
338 zMinimum = zRange.lower() - 5;
339 zMaximum = zRange.lower() + 5;
340 }
341 else
342 {
343 // add 5% margin to height range
344 const double margin = ( zRange.upper() - zRange.lower() ) * 0.05;
345 zMinimum = zRange.lower() - margin;
346 zMaximum = zRange.upper() + margin;
347 }
348
349 plotItem.setYMinimum( hasMinimumElevation ? minimumElevation : zMinimum );
350 plotItem.setYMaximum( hasMaximumElevation ? maximumElevation : zMaximum );
351 plotItem.setXMinimum( hasMinimumDistance ? minimumDistance : 0 );
352 plotItem.setXMaximum( hasMaximumDistance ? maximumDistance : curveGeom.constGet()->length() );
353
354 plotItem.setRenderer( mRenderer.get() );
355
356 QImage image( static_cast<int>( plotItem.size().width() ), static_cast<int>( plotItem.size().height() ), QImage::Format_ARGB32_Premultiplied );
357 image.fill( Qt::transparent );
358
359 QPainter painter( &image );
360 painter.setRenderHint( QPainter::Antialiasing, true );
361 QgsRenderContext renderContext = QgsRenderContext::fromQPainter( &painter );
362 renderContext.setScaleFactor( dpi / 25.4 );
363 renderContext.setExpressionContext( context.expressionContext() );
364 QgsPlotRenderContext plotContext;
365 plotItem.calculateOptimisedIntervals( renderContext, plotContext );
366 plotItem.render( renderContext, plotContext );
367 painter.end();
368 image.save( outputImage );
369
370 QVariantMap outputs;
371 outputs.insert( u"OUTPUT"_s, outputImage );
372 return outputs;
373}
374
@ MapLayer
Any map layer type (raster, vector, mesh, point cloud, annotation or plugin layer).
Definition qgis.h:3646
@ Mesh
Mesh layers.
Definition qgis.h:3654
@ Raster
Raster layers.
Definition qgis.h:3651
@ Line
Lines.
Definition qgis.h:381
@ Points
Points (e.g., for font sizes).
Definition qgis.h:5345
@ Hidden
Parameter is hidden and should not be shown to users.
Definition qgis.h:3881
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
Definition qgis.h:3880
@ Double
Double/float values.
Definition qgis.h:3921
virtual void renderContent(QgsRenderContext &context, QgsPlotRenderContext &plotContext, const QRectF &plotArea, const QgsPlotData &plotData=QgsPlotData())
Renders the plot content.
Definition qgsplot.cpp:310
void setSize(QSizeF size)
Sets the overall size of the plot (including titles and over components which sit outside the plot ar...
Definition qgsplot.cpp:320
Base class for 2-dimensional plot/chart/graphs with an X and Y axes.
Definition qgsplot.h:687
double yMaximum() const
Returns the maximum value of the y axis.
Definition qgsplot.h:769
void setYMinimum(double minimum)
Sets the minimum value of the y axis.
Definition qgsplot.h:748
void calculateOptimisedIntervals(QgsRenderContext &context, QgsPlotRenderContext &plotContext)
Automatically sets the grid and label intervals to optimal values for display in the given render con...
Definition qgsplot.cpp:1042
double yMinimum() const
Returns the minimum value of the y axis.
Definition qgsplot.h:741
QRectF interiorPlotArea(QgsRenderContext &context, QgsPlotRenderContext &plotContext, const QgsPlotData &plotData=QgsPlotData()) const override
Returns the area of the plot which corresponds to the actual plot content (excluding all titles and o...
Definition qgsplot.cpp:871
void setYMaximum(double maximum)
Sets the maximum value of the y axis.
Definition qgsplot.h:776
double xMaximum() const
Returns the maximum value of the x axis.
Definition qgsplot.h:755
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
Interface for classes which can generate elevation profiles.
Represents a coordinate reference system (CRS).
Abstract base class for curved geometry type.
Definition qgscurve.h:36
QgsRange which stores a range of double values.
Definition qgsrange.h:217
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
static bool updateFontViaStyle(QFont &f, const QString &fontstyle, bool fallback=false)
Updates font with named style and retain all font properties.
static void setFontFamily(QFont &font, const QString &family)
Sets the family for a font object.
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.
A line symbol type, for rendering LineString and MultiLineString geometries.
Base class for all map layer types.
Definition qgsmaplayer.h:83
Represents a mesh layer supporting display of data on structured or unstructured meshes.
Contains information about the context of a plot rendering operation.
Definition qgsplot.h:191
Contains information about the context in which a processing algorithm is executed.
QgsExpressionContext & expressionContext()
Returns the expression context.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Base class for providing feedback from a processing algorithm.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
A geometry parameter for processing algorithms.
A map layer parameter for processing algorithms.
A parameter for processing algorithms which accepts multiple map layers.
A numeric parameter for processing algorithms.
Encapsulates the context in which an elevation profile is to be generated.
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 setMapUnitsPerDistancePixel(double units)
Sets the number of map units per pixel in the distance dimension.
Encapsulates properties and constraints relating to fetching elevation profiles from different source...
T lower() const
Returns the lower bound of the range.
Definition qgsrange.h:79
T upper() const
Returns the upper bound of the range.
Definition qgsrange.h:86
Represents a raster layer.
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.
QPainter * painter()
Returns the destination QPainter for the render operation.
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
Container for all settings relating to text rendering.
void setColor(const QColor &color)
Sets the color that text will be rendered in.
void setSize(double size)
Sets the size for rendered text.
void setFont(const QFont &font)
Sets the font used for rendering text.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the size of rendered text.
QFont font() const
Returns the font used for rendering text.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
Definition qgis.h:6975
QList< QgsSymbolLayer * > QgsSymbolLayerList
Definition qgssymbol.h:30