QGIS API Documentation 3.39.0-Master (47f7b3a4989)
Loading...
Searching...
No Matches
qgsgeometrygeneratorsymbollayer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsgeometrygeneratorsymbollayer.cpp
3 ---------------------
4 begin : November 2015
5 copyright : (C) 2015 by Matthias Kuhn
6 email : matthias at opengis dot ch
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17#include "qgsgeometry.h"
18#include "qgsmarkersymbol.h"
19#include "qgslinesymbol.h"
20#include "qgsfillsymbol.h"
21#include "qgspolygon.h"
22#include "qgslegendpatchshape.h"
23#include "qgsstyle.h"
24#include "qgsunittypes.h"
25
27
29
31{
32 QString expression = properties.value( QStringLiteral( "geometryModifier" ) ).toString();
33 if ( expression.isEmpty() )
34 {
35 expression = QStringLiteral( "$geometry" );
36 }
38
39 if ( properties.value( QStringLiteral( "SymbolType" ) ) == QLatin1String( "Marker" ) )
40 {
42 }
43 else if ( properties.value( QStringLiteral( "SymbolType" ) ) == QLatin1String( "Line" ) )
44 {
46 }
47 else
48 {
50 }
51 symbolLayer->setUnits( QgsUnitTypes::decodeRenderUnit( properties.value( QStringLiteral( "units" ), QStringLiteral( "mapunits" ) ).toString() ) );
52
54
55 return symbolLayer;
56}
57
58QgsGeometryGeneratorSymbolLayer::QgsGeometryGeneratorSymbolLayer( const QString &expression )
59 : QgsSymbolLayer( Qgis::SymbolType::Hybrid )
60 , mExpression( new QgsExpression( expression ) )
61 , mSymbolType( Qgis::SymbolType::Marker )
62{
63
64}
65
67{
68 return QStringLiteral( "GeometryGenerator" );
69}
70
72{
74 {
75 if ( !mFillSymbol )
76 mFillSymbol.reset( QgsFillSymbol::createSimple( QVariantMap() ) );
77 mSymbol = mFillSymbol.get();
78 }
80 {
81 if ( !mLineSymbol )
82 mLineSymbol.reset( QgsLineSymbol::createSimple( QVariantMap() ) );
83 mSymbol = mLineSymbol.get();
84 }
86 {
87 if ( !mMarkerSymbol )
88 mMarkerSymbol.reset( QgsMarkerSymbol::createSimple( QVariantMap() ) );
89 mSymbol = mMarkerSymbol.get();
90 }
91 else
92 Q_ASSERT( false );
93
94 mSymbolType = symbolType;
95}
96
98{
99 mExpression->prepare( &context.renderContext().expressionContext() );
100
102
103 subSymbol()->startRender( context.renderContext(), context.fields() );
104}
105
107{
108 if ( mSymbol )
109 mSymbol->stopRender( context.renderContext() );
110}
111
113{
115 return;
116
117 mRenderingFeature = true;
118 mHasRenderedFeature = false;
119}
120
122{
123 mRenderingFeature = false;
124}
125
127{
128 if ( mFillSymbol )
129 return mFillSymbol->usesMapUnits();
130 else if ( mLineSymbol )
131 return mLineSymbol->usesMapUnits();
132 else if ( mMarkerSymbol )
133 return mMarkerSymbol->usesMapUnits();
134 return false;
135}
136
138{
139 if ( mFillSymbol )
140 return mFillSymbol->color();
141 else if ( mLineSymbol )
142 return mLineSymbol->color();
143 else if ( mMarkerSymbol )
144 return mMarkerSymbol->color();
145 return QColor();
146}
147
149{
150 if ( mFillSymbol )
151 return mFillSymbol->outputUnit();
152 else if ( mLineSymbol )
153 return mLineSymbol->outputUnit();
154 else if ( mMarkerSymbol )
155 return mMarkerSymbol->outputUnit();
157}
158
160{
161 if ( mFillSymbol )
162 mFillSymbol->setOutputUnit( unit );
163 else if ( mLineSymbol )
164 mLineSymbol->setOutputUnit( unit );
165 else if ( mMarkerSymbol )
166 mMarkerSymbol->setOutputUnit( unit );
167}
168
170{
171 if ( mFillSymbol )
172 return mFillSymbol->mapUnitScale();
173 else if ( mLineSymbol )
174 return mLineSymbol->mapUnitScale();
175 else if ( mMarkerSymbol )
176 return mMarkerSymbol->mapUnitScale();
177 return QgsMapUnitScale();
178}
179
181{
183
184 if ( mFillSymbol )
185 clone->mFillSymbol.reset( mFillSymbol->clone() );
186 if ( mLineSymbol )
187 clone->mLineSymbol.reset( mLineSymbol->clone() );
188 if ( mMarkerSymbol )
189 clone->mMarkerSymbol.reset( mMarkerSymbol->clone() );
190
191 clone->setSymbolType( mSymbolType );
192 clone->setUnits( mUnits );
193
196
197 return clone;
198}
199
201{
202 QVariantMap props;
203 props.insert( QStringLiteral( "geometryModifier" ), mExpression->expression() );
204 switch ( mSymbolType )
205 {
207 props.insert( QStringLiteral( "SymbolType" ), QStringLiteral( "Marker" ) );
208 break;
210 props.insert( QStringLiteral( "SymbolType" ), QStringLiteral( "Line" ) );
211 break;
212 default:
213 props.insert( QStringLiteral( "SymbolType" ), QStringLiteral( "Fill" ) );
214 break;
215 }
216 props.insert( QStringLiteral( "units" ), QgsUnitTypes::encodeUnit( mUnits ) );
217
218 return props;
219}
220
222{
223 if ( mSymbol )
224 {
225 // evaluate expression
226 QgsGeometry patchShapeGeometry;
227
228 if ( context.patchShape() && !context.patchShape()->isNull() )
229 {
230 patchShapeGeometry = context.patchShape()->scaledGeometry( size );
231 }
232 if ( patchShapeGeometry.isEmpty() )
233 {
234 Qgis::SymbolType originalSymbolType = Qgis::SymbolType::Hybrid;
235 switch ( context.originalGeometryType() )
236 {
238 originalSymbolType = Qgis::SymbolType::Marker;
239 break;
241 originalSymbolType = Qgis::SymbolType::Line;
242 break;
244 originalSymbolType = Qgis::SymbolType::Fill;
245 break;
248 originalSymbolType = mSymbol->type();
249 break;
250 }
251 patchShapeGeometry = QgsStyle::defaultStyle()->defaultPatch( originalSymbolType, size ).scaledGeometry( size );
252 }
253
254 // evaluate geometry expression
255 QgsFeature feature;
256 if ( context.feature() )
257 feature = *context.feature();
258 else
259 feature.setGeometry( patchShapeGeometry );
260 const QgsGeometry iconGeometry = evaluateGeometryInPainterUnits( patchShapeGeometry, feature, context.renderContext(), context.renderContext().expressionContext() );
261
262 QgsLegendPatchShape evaluatedPatchShape( mSymbol->type(), coerceToExpectedType( iconGeometry ) );
263 // we don't want to rescale the patch shape to fit the legend symbol size -- we've already considered that here,
264 // and we don't want to undo the effects of a geometry generator which modifies the symbol bounds
265 evaluatedPatchShape.setScaleToOutputSize( false );
266 mSymbol->drawPreviewIcon( context.renderContext().painter(), size, &context.renderContext(), false, &context.renderContext().expressionContext(), &evaluatedPatchShape );
267 }
268}
269
271{
272 mExpression.reset( new QgsExpression( exp ) );
273}
274
276{
277 return mExpression->expression();
278}
279
281{
282 switch ( symbol->type() )
283 {
285 mMarkerSymbol.reset( static_cast<QgsMarkerSymbol *>( symbol ) );
286 break;
287
289 mLineSymbol.reset( static_cast<QgsLineSymbol *>( symbol ) );
290 break;
291
293 mFillSymbol.reset( static_cast<QgsFillSymbol *>( symbol ) );
294 break;
295
296 default:
297 break;
298 }
299
300 setSymbolType( symbol->type() );
301
302 return true;
303}
304
306{
307 return QgsSymbolLayer::usedAttributes( context )
308 + mSymbol->usedAttributes( context )
309 + mExpression->referencedColumns();
310}
311
313{
314 // we treat geometry generator layers like they have data defined properties,
315 // since the WHOLE layer is based on expressions and requires the full expression
316 // context
317 return true;
318}
319
321{
322 Q_UNUSED( symbol )
323 return true;
324}
325
326QgsGeometry QgsGeometryGeneratorSymbolLayer::evaluateGeometryInPainterUnits( const QgsGeometry &input, const QgsFeature &, const QgsRenderContext &renderContext, QgsExpressionContext &expressionContext ) const
327{
328 QgsGeometry drawGeometry( input );
329 // step 1 - scale the draw geometry from PAINTER units to target units (e.g. millimeters)
330 const double scale = 1 / renderContext.convertToPainterUnits( 1, mUnits );
331 const QTransform painterToTargetUnits = QTransform::fromScale( scale, scale );
332 drawGeometry.transform( painterToTargetUnits );
333
334 // step 2 - set the feature to use the new scaled geometry, and inject it into the expression context
336 QgsExpressionContextScopePopper popper( expressionContext, generatorScope );
337 generatorScope->setGeometry( drawGeometry );
338
339 // step 3 - evaluate the new generated geometry.
340 QgsGeometry geom = mExpression->evaluate( &expressionContext ).value<QgsGeometry>();
341
342 // step 4 - transform geometry back from target units to painter units
343 geom.transform( painterToTargetUnits.inverted( ) );
344
345 return geom;
346}
347
348QgsGeometry QgsGeometryGeneratorSymbolLayer::coerceToExpectedType( const QgsGeometry &geometry ) const
349{
350 switch ( mSymbolType )
351 {
353 if ( geometry.type() != Qgis::GeometryType::Point )
354 {
355 QVector< QgsGeometry > geoms = geometry.coerceToType( Qgis::WkbType::MultiPoint );
356 if ( !geoms.empty() )
357 return geoms.at( 0 );
358 }
359 break;
361 if ( geometry.type() != Qgis::GeometryType::Line )
362 {
363 QVector< QgsGeometry > geoms = geometry.coerceToType( Qgis::WkbType::MultiLineString );
364 if ( !geoms.empty() )
365 return geoms.at( 0 );
366 }
367 break;
369 if ( geometry.type() != Qgis::GeometryType::Polygon )
370 {
371 QVector< QgsGeometry > geoms = geometry.coerceToType( Qgis::WkbType::MultiPolygon );
372 if ( !geoms.empty() )
373 return geoms.at( 0 );
374 }
375 break;
377 break;
378 }
379 return geometry;
380}
381
382void QgsGeometryGeneratorSymbolLayer::render( QgsSymbolRenderContext &context, Qgis::GeometryType geometryType, const QPolygonF *points, const QVector<QPolygonF> *rings )
383{
384 if ( mRenderingFeature && mHasRenderedFeature )
385 return;
386
387 QgsExpressionContext &expressionContext = context.renderContext().expressionContext();
388 QgsFeature f = expressionContext.feature();
389
390 if ( ( !context.feature() || context.renderContext().flags() & Qgis::RenderContextFlag::RenderingSubSymbol ) && points )
391 {
392 // oh dear, we don't have a feature to work from... but that's ok, we are probably being rendered as a plain old symbol!
393 // in this case we need to build up a feature which represents the points being rendered.
394 // note that we also do this same logic when we are rendering a subsymbol. In that case the $geometry part of the
395 // expression should refer to the shape of the subsymbol being rendered, NOT the feature's original geometry
396 QgsGeometry drawGeometry;
397
398 // step 1 - convert points and rings to geometry
399 switch ( geometryType )
400 {
402 {
403 Q_ASSERT( points->size() == 1 );
404 drawGeometry = QgsGeometry::fromPointXY( points->at( 0 ) );
405 break;
406 }
408 {
409 Q_ASSERT( !rings );
410 std::unique_ptr < QgsLineString > ring( QgsLineString::fromQPolygonF( *points ) );
411 drawGeometry = QgsGeometry( std::move( ring ) );
412 break;
413 }
415 {
416 std::unique_ptr < QgsLineString > exterior( QgsLineString::fromQPolygonF( *points ) );
417 std::unique_ptr< QgsPolygon > polygon = std::make_unique< QgsPolygon >();
418 polygon->setExteriorRing( exterior.release() );
419 if ( rings )
420 {
421 for ( const QPolygonF &ring : *rings )
422 {
423 polygon->addInteriorRing( QgsLineString::fromQPolygonF( ring ) );
424 }
425 }
426 drawGeometry = QgsGeometry( std::move( polygon ) );
427 break;
428 }
429
432 return; // unreachable
433 }
434
435 // step 2 - evaluate the result
436 QgsGeometry result = evaluateGeometryInPainterUnits( drawGeometry, f, context.renderContext(), expressionContext );
437
438 // We transform back to map units here (from painter units)
439 // as we'll ultimately be calling renderFeature, which excepts the feature has a geometry in map units.
440 // Here we also scale the transform by the target unit to painter units factor to reverse that conversion
441 QTransform mapToPixel = context.renderContext().mapToPixel().transform();
442 result.transform( mapToPixel.inverted() );
443 // also need to apply the coordinate transform from the render context
444 try
445 {
447 }
448 catch ( QgsCsException & )
449 {
450 QgsDebugError( QStringLiteral( "Could no transform generated geometry to layer CRS" ) );
451 }
452
453 f.setGeometry( coerceToExpectedType( result ) );
454 }
455 else if ( context.feature() )
456 {
457 switch ( mUnits )
458 {
460 case Qgis::RenderUnit::Unknown: // unsupported, not exposed as an option
461 case Qgis::RenderUnit::MetersInMapUnits: // unsupported, not exposed as an option
462 case Qgis::RenderUnit::Percentage: // unsupported, not exposed as an option
463 {
464 QgsGeometry geom = mExpression->evaluate( &expressionContext ).value<QgsGeometry>();
465 f.setGeometry( coerceToExpectedType( geom ) );
466 break;
467 }
468
473 {
474 // convert feature geometry to painter units
475 QgsGeometry transformed = f.geometry();
476 transformed.transform( context.renderContext().coordinateTransform() );
477 const QTransform mapToPixel = context.renderContext().mapToPixel().transform();
478 transformed.transform( mapToPixel );
479
480 QgsGeometry result = evaluateGeometryInPainterUnits( transformed, f, context.renderContext(), expressionContext );
481
482 // We transform back to map units here (from painter units)
483 // as we'll ultimately be calling renderFeature, which excepts the feature has a geometry in map units.
484 // Here we also scale the transform by the target unit to painter units factor to reverse that conversion
485 result.transform( mapToPixel.inverted() );
486 // also need to apply the coordinate transform from the render context
487 try
488 {
490 }
491 catch ( QgsCsException & )
492 {
493 QgsDebugError( QStringLiteral( "Could no transform generated geometry to layer CRS" ) );
494 }
495 f.setGeometry( coerceToExpectedType( result ) );
496 break;
497 }
498 }
499 }
500
501 QgsExpressionContextScope *subSymbolExpressionContextScope = mSymbol->symbolRenderContext()->expressionContextScope();
502 // override the $geometry value for all subsymbols -- this should be the generated geometry
503 subSymbolExpressionContextScope->setGeometry( f.geometry() );
504
505 const bool prevIsSubsymbol = context.renderContext().flags() & Qgis::RenderContextFlag::RenderingSubSymbol;
507
508 const bool useSelectedColor = shouldRenderUsingSelectionColor( context );
509 mSymbol->renderFeature( f, context.renderContext(), -1, useSelectedColor );
510
512
513 if ( mRenderingFeature )
514 mHasRenderedFeature = true;
515}
516
518{
519 mSymbol->setColor( color );
520}
The Qgis class provides global constants for use throughout the application.
Definition qgis.h:54
@ IsSymbolLayerSubSymbol
Symbol is being rendered as a sub-symbol of a QgsSymbolLayer (since QGIS 3.38)
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition qgis.h:274
@ Polygon
Polygons.
@ Unknown
Unknown types.
@ Null
No geometry.
RenderUnit
Rendering size units.
Definition qgis.h:4494
@ Percentage
Percentage of another measurement (e.g., canvas size, feature size)
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes)
@ Unknown
Mixed or unknown units.
@ MapUnits
Map units.
@ MetersInMapUnits
Meters value as Map units.
@ RenderingSubSymbol
Set whenever a sub-symbol of a parent symbol is currently being rendered. Can be used during symbol a...
SymbolType
Symbol types.
Definition qgis.h:420
@ Marker
Marker symbol.
@ Line
Line symbol.
@ Fill
Fill symbol.
@ Hybrid
Hybrid symbol.
@ MultiPoint
MultiPoint.
@ MultiPolygon
MultiPolygon.
@ MultiLineString
MultiLineString.
@ Reverse
Reverse/inverse transform (from destination to source)
Custom exception class for Coordinate Reference System related exceptions.
RAII class to pop scope from an expression context on destruction.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void setGeometry(const QgsGeometry &geometry)
Convenience function for setting a geometry for the scope.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsFeature feature() const
Convenience function for retrieving the feature for the context, if set.
Class for parsing and evaluation of expressions (formerly called "search strings").
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:58
QgsGeometry geometry
Definition qgsfeature.h:69
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
static QgsFillSymbol * createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
QgsMapUnitScale mapUnitScale() const override
void drawPreviewIcon(QgsSymbolRenderContext &context, QSize size) override
QString geometryExpression() const
Gets the expression to generate this geometry.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
void setUnits(Qgis::RenderUnit units)
Sets the units for the geometry expression.
void setGeometryExpression(const QString &exp)
Set the expression to generate this geometry.
void setSymbolType(Qgis::SymbolType symbolType)
Set the type of symbol which should be created.
QString layerType() const override
Returns a string that represents this layer type.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
bool isCompatibleWithSymbol(QgsSymbol *symbol) const override
Will always return true.
Qgis::SymbolType symbolType() const
Access the symbol type.
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
QgsSymbol * subSymbol() override
Returns the symbol's sub symbol, if present.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
void setColor(const QColor &color) override
Sets the "representative" color for the symbol layer.
static QgsSymbolLayer * create(const QVariantMap &properties)
Creates the symbol layer.
void setOutputUnit(Qgis::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
void stopFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called after the layer has been rendered for a particular feature.
QgsSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
void render(QgsSymbolRenderContext &context, Qgis::GeometryType geometryType=Qgis::GeometryType::Unknown, const QPolygonF *points=nullptr, const QVector< QPolygonF > *rings=nullptr)
Will render this symbol layer using the context.
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QColor color() const override
Returns the "representative" color of the symbol layer.
void startFeatureRender(const QgsFeature &feature, QgsRenderContext &context) override
Called before the layer will be rendered for a particular feature.
Qgis::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
A geometry is the spatial representation of a feature.
QVector< QgsGeometry > coerceToType(Qgis::WkbType type, double defaultZ=0, double defaultM=0) const
Attempts to coerce this geometry into the specified destination type.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
Qgis::GeometryType type
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
Represents a patch shape for use in map legends.
QgsGeometry scaledGeometry(QSizeF size) const
Returns the patch shape's geometry, scaled to the given size.
bool isNull() const
Returns true if the patch shape is a null QgsLegendPatchShape, which indicates that the default legen...
void setScaleToOutputSize(bool scale)
Sets whether the patch shape should by resized to the desired target size when rendering.
static QgsLineString * fromQPolygonF(const QPolygonF &polygon)
Returns a new linestring from a QPolygonF polygon input.
A line symbol type, for rendering LineString and MultiLineString geometries.
static QgsLineSymbol * createSimple(const QVariantMap &properties)
Create a line symbol with one symbol layer: SimpleLine with specified properties.
QgsPointXY transform(const QgsPointXY &p) const
Transforms a point p from map (world) coordinates to device coordinates.
Struct for storing maximum and minimum scales for measurements in map units.
A marker symbol type, for rendering Point and MultiPoint geometries.
static QgsMarkerSymbol * createSimple(const QVariantMap &properties)
Create a marker symbol with one symbol layer: SimpleMarker with specified properties.
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.
QgsExpressionContext & expressionContext()
Gets the expression context.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
Qgis::RenderContextFlags flags() const
Returns combination of flags used for rendering.
QgsLegendPatchShape defaultPatch(Qgis::SymbolType type, QSizeF size) const
Returns the default legend patch shape for the given symbol type.
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
Definition qgsstyle.cpp:145
bool shouldRenderUsingSelectionColor(const QgsSymbolRenderContext &context) const
Returns true if the symbol layer should be rendered using the selection color from the render context...
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns the set of attributes referenced by the layer.
void copyDataDefinedProperties(QgsSymbolLayer *destLayer) const
Copies all data defined properties of this layer to another symbol layer.
void restoreOldDataDefinedProperties(const QVariantMap &stringMap)
Restores older data defined properties from string map.
void copyPaintEffect(QgsSymbolLayer *destLayer) const
Copies paint effect of this layer to another symbol layer.
const QgsFeature * feature() const
Returns the current feature being rendered.
Qgis::GeometryType originalGeometryType() const
Returns the geometry type for the original feature geometry being rendered.
QgsFields fields() const
Fields of the layer.
QgsExpressionContextScope * expressionContextScope()
This scope is always available when a symbol of this type is being rendered.
const QgsLegendPatchShape * patchShape() const
Returns the symbol patch shape, to use if rendering symbol preview icons.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:94
QgsSymbolRenderContext * symbolRenderContext()
Returns the symbol render context.
void setRenderHints(Qgis::SymbolRenderHints hints)
Sets rendering hint flags for the symbol.
Definition qgssymbol.h:508
void renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false, Qgis::VertexMarkerType currentVertexMarkerType=Qgis::VertexMarkerType::SemiTransparentCircle, double currentVertexMarkerSize=0.0)
Render a feature.
void stopRender(QgsRenderContext &context)
Ends the rendering process.
void setColor(const QColor &color) const
Sets the color for the symbol.
QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns a list of attributes required to render this feature.
void drawPreviewIcon(QPainter *painter, QSize size, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *patchShape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Draws an icon of the symbol that occupies an area given by size using the specified painter.
Qgis::SymbolType type() const
Returns the symbol's type.
Definition qgssymbol.h:156
void startRender(QgsRenderContext &context, const QgsFields &fields=QgsFields())
Begins the rendering process for the symbol.
static Q_INVOKABLE Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
#define QgsDebugError(str)
Definition qgslogger.h:38