QGIS API Documentation 3.28.14-Firenze (exported)
Loading...
Searching...
No Matches
qgsrenderer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsrenderer.cpp
3 ---------------------
4 begin : November 2009
5 copyright : (C) 2009 by Martin Dobias
6 email : wonder dot sk at gmail dot com
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
16#include "qgsrenderer.h"
17#include "qgssymbol.h"
18#include "qgssymbollayerutils.h"
20
21#include "qgssinglesymbolrenderer.h" // for default renderer
22
23#include "qgsrendererregistry.h"
24
25#include "qgsrendercontext.h"
26#include "qgsclipper.h"
27#include "qgsgeometry.h"
29#include "qgsfeature.h"
30#include "qgslogger.h"
31#include "qgsvectorlayer.h"
32#include "qgspainteffect.h"
33#include "qgseffectstack.h"
35#include "qgswkbptr.h"
36#include "qgspoint.h"
37#include "qgsproperty.h"
38#include "qgsapplication.h"
39#include "qgsmarkersymbol.h"
40#include "qgslinesymbol.h"
41
42#include <QDomElement>
43#include <QDomDocument>
44#include <QPolygonF>
45#include <QThread>
46
48{
49 return QgsSymbol::_getPoint( context, point );
50}
51
53{
54 if ( !destRenderer )
55 return;
56
57 if ( mPaintEffect )
58 destRenderer->setPaintEffect( mPaintEffect->clone() );
59
60 destRenderer->setForceRasterRender( mForceRaster );
62 destRenderer->mOrderBy = mOrderBy;
63 destRenderer->mOrderByEnabled = mOrderByEnabled;
64 destRenderer->mReferenceScale = mReferenceScale;
65}
66
68 : mType( type )
69{
71 mPaintEffect->setEnabled( false );
72}
73
78
83
85{
86 return symbolForFeature( feature, context );
87}
88
89QSet< QString > QgsFeatureRenderer::legendKeysForFeature( const QgsFeature &feature, QgsRenderContext &context ) const
90{
91 Q_UNUSED( feature )
92 Q_UNUSED( context )
93 return QSet< QString >();
94}
95
97{
98#ifdef QGISDEBUG
99 if ( !mThread )
100 {
101 mThread = QThread::currentThread();
102 }
103 else
104 {
105 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::startRender", "startRender called in a different thread - use a cloned renderer instead" );
106 }
107#endif
108}
109
111{
112#ifdef QGISDEBUG
113 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::stopRender", "stopRender called in a different thread - use a cloned renderer instead" );
114#endif
115}
116
118{
119 return false;
120}
121
123{
124 return false;
125}
126
127bool QgsFeatureRenderer::renderFeature( const QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
128{
129#ifdef QGISDEBUG
130 Q_ASSERT_X( mThread == QThread::currentThread(), "QgsFeatureRenderer::renderFeature", "renderFeature called in a different thread - use a cloned renderer instead" );
131#endif
132
133 QgsSymbol *symbol = symbolForFeature( feature, context );
134 if ( !symbol )
135 return false;
136
137 renderFeatureWithSymbol( feature, symbol, context, layer, selected, drawVertexMarker );
138 return true;
139}
140
141void QgsFeatureRenderer::renderFeatureWithSymbol( const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
142{
143 symbol->renderFeature( feature, context, layer, selected, drawVertexMarker, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
144}
145
147{
148 return QStringLiteral( "UNKNOWN RENDERER\n" );
149}
150
152{
153 Q_UNUSED( context )
154 return QgsSymbolList();
155}
156
158{
159 // <renderer-v2 type=""> ... </renderer-v2>
160
161 if ( element.isNull() )
162 return nullptr;
163
164 // load renderer
165 const QString rendererType = element.attribute( QStringLiteral( "type" ) );
166
168 if ( !m )
169 return nullptr;
170
171 QgsFeatureRenderer *r = m->createRenderer( element, context );
172 if ( r )
173 {
174 r->setUsingSymbolLevels( element.attribute( QStringLiteral( "symbollevels" ), QStringLiteral( "0" ) ).toInt() );
175 r->setForceRasterRender( element.attribute( QStringLiteral( "forceraster" ), QStringLiteral( "0" ) ).toInt() );
176 r->setReferenceScale( element.attribute( QStringLiteral( "referencescale" ), QStringLiteral( "-1" ) ).toDouble() );
177
178 //restore layer effect
179 const QDomElement effectElem = element.firstChildElement( QStringLiteral( "effect" ) );
180 if ( !effectElem.isNull() )
181 {
182 r->setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
183 }
184
185 // restore order by
186 const QDomElement orderByElem = element.firstChildElement( QStringLiteral( "orderby" ) );
187 r->mOrderBy.load( orderByElem );
188 r->setOrderByEnabled( element.attribute( QStringLiteral( "enableorderby" ), QStringLiteral( "0" ) ).toInt() );
189 }
190 return r;
191}
192
193QDomElement QgsFeatureRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context )
194{
195 Q_UNUSED( context )
196 // create empty renderer element
197 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
198
199 saveRendererData( doc, rendererElem, context );
200
201 return rendererElem;
202}
203
204void QgsFeatureRenderer::saveRendererData( QDomDocument &doc, QDomElement &rendererElem, const QgsReadWriteContext & )
205{
206 rendererElem.setAttribute( QStringLiteral( "forceraster" ), ( mForceRaster ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
207 rendererElem.setAttribute( QStringLiteral( "symbollevels" ), ( mUsingSymbolLevels ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
208 rendererElem.setAttribute( QStringLiteral( "referencescale" ), mReferenceScale );
209
211 mPaintEffect->saveProperties( doc, rendererElem );
212
213 if ( !mOrderBy.isEmpty() )
214 {
215 QDomElement orderBy = doc.createElement( QStringLiteral( "orderby" ) );
217 rendererElem.appendChild( orderBy );
218 }
219 rendererElem.setAttribute( QStringLiteral( "enableorderby" ), ( mOrderByEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ) );
220}
221
222QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, QgsWkbTypes::GeometryType geomType, QString &errorMessage )
223{
224 const QDomElement element = node.toElement();
225 if ( element.isNull() )
226 return nullptr;
227
228 // get the UserStyle element
229 const QDomElement userStyleElem = element.firstChildElement( QStringLiteral( "UserStyle" ) );
230 if ( userStyleElem.isNull() )
231 {
232 // UserStyle element not found, nothing will be rendered
233 errorMessage = QStringLiteral( "Info: UserStyle element not found." );
234 return nullptr;
235 }
236
237 // get the FeatureTypeStyle element
238 QDomElement featTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral( "FeatureTypeStyle" ) );
239 if ( featTypeStyleElem.isNull() )
240 {
241 errorMessage = QStringLiteral( "Info: FeatureTypeStyle element not found." );
242 return nullptr;
243 }
244
245 // create empty FeatureTypeStyle element to merge Rule's from all FeatureTypeStyle's
246 QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode( false ).toElement();
247
248 // use the RuleRenderer when more rules are present or the rule
249 // has filters or min/max scale denominators set,
250 // otherwise use the SingleSymbol renderer
251 bool needRuleRenderer = false;
252 int ruleCount = 0;
253
254 while ( !featTypeStyleElem.isNull() )
255 {
256 QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral( "Rule" ) );
257 while ( !ruleElem.isNull() )
258 {
259 // test rule children element to check if we need to create RuleRenderer
260 // and if the rule has a symbolizer
261 bool hasRendererSymbolizer = false;
262 bool hasRuleRenderer = false;
263 QDomElement ruleChildElem = ruleElem.firstChildElement();
264 while ( !ruleChildElem.isNull() )
265 {
266 // rule has filter or min/max scale denominator, use the RuleRenderer
267 if ( ruleChildElem.localName() == QLatin1String( "Filter" ) ||
268 ruleChildElem.localName() == QLatin1String( "ElseFilter" ) ||
269 ruleChildElem.localName() == QLatin1String( "MinScaleDenominator" ) ||
270 ruleChildElem.localName() == QLatin1String( "MaxScaleDenominator" ) )
271 {
272 hasRuleRenderer = true;
273 }
274 // rule has a renderer symbolizer, not a text symbolizer
275 else if ( ruleChildElem.localName().endsWith( QLatin1String( "Symbolizer" ) ) &&
276 ruleChildElem.localName() != QLatin1String( "TextSymbolizer" ) )
277 {
278 QgsDebugMsgLevel( QStringLiteral( "Symbolizer element found and not a TextSymbolizer" ), 2 );
279 hasRendererSymbolizer = true;
280 }
281
282 ruleChildElem = ruleChildElem.nextSiblingElement();
283 }
284
285 if ( hasRendererSymbolizer )
286 {
287 ruleCount++;
288
289 // append a clone of all Rules to the merged FeatureTypeStyle element
290 mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
291
292 if ( hasRuleRenderer )
293 {
294 QgsDebugMsgLevel( QStringLiteral( "Filter or Min/MaxScaleDenominator element found: need a RuleRenderer" ), 2 );
295 needRuleRenderer = true;
296 }
297 }
298
299 // more rules present, use the RuleRenderer
300 if ( ruleCount > 1 )
301 {
302 QgsDebugMsgLevel( QStringLiteral( "more Rule elements found: need a RuleRenderer" ), 2 );
303 needRuleRenderer = true;
304 }
305
306 ruleElem = ruleElem.nextSiblingElement( QStringLiteral( "Rule" ) );
307 }
308 featTypeStyleElem = featTypeStyleElem.nextSiblingElement( QStringLiteral( "FeatureTypeStyle" ) );
309 }
310
311 QString rendererType;
312 if ( needRuleRenderer )
313 {
314 rendererType = QStringLiteral( "RuleRenderer" );
315 }
316 else
317 {
318 rendererType = QStringLiteral( "singleSymbol" );
319 }
320 QgsDebugMsgLevel( QStringLiteral( "Instantiating a '%1' renderer..." ).arg( rendererType ), 2 );
321
322 // create the renderer and return it
324 if ( !m )
325 {
326 errorMessage = QStringLiteral( "Error: Unable to get metadata for '%1' renderer." ).arg( rendererType );
327 return nullptr;
328 }
329
330 QgsFeatureRenderer *r = m->createRendererFromSld( mergedFeatTypeStyle, geomType );
331 return r;
332}
333
334QDomElement QgsFeatureRenderer::writeSld( QDomDocument &doc, const QString &styleName, const QVariantMap &props ) const
335{
336 QDomElement userStyleElem = doc.createElement( QStringLiteral( "UserStyle" ) );
337
338 QDomElement nameElem = doc.createElement( QStringLiteral( "se:Name" ) );
339 nameElem.appendChild( doc.createTextNode( styleName ) );
340 userStyleElem.appendChild( nameElem );
341
342 QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral( "se:FeatureTypeStyle" ) );
343 toSld( doc, featureTypeStyleElem, props );
344 userStyleElem.appendChild( featureTypeStyleElem );
345
346 return userStyleElem;
347}
348
350{
351 return false;
352}
353
355{
356 Q_UNUSED( key )
357 return false;
358}
359
360void QgsFeatureRenderer::checkLegendSymbolItem( const QString &key, bool state )
361{
362 Q_UNUSED( key )
363 Q_UNUSED( state )
364}
365
366void QgsFeatureRenderer::setLegendSymbolItem( const QString &key, QgsSymbol *symbol )
367{
368 Q_UNUSED( key )
369 delete symbol;
370}
371
372QString QgsFeatureRenderer::legendKeyToExpression( const QString &, QgsVectorLayer *, bool &ok ) const
373{
374 ok = false;
375 return QString();
376}
377
382
388
390{
391 return nullptr != symbolForFeature( feature, context );
392}
393
395{
397 QgsSymbolLayerUtils::drawVertexMarker( pt.x(), pt.y(), *context.painter(),
399 markerSize );
400}
401
403{
404 const auto constPts = pts;
405 for ( const QPointF pt : constPts )
406 renderVertexMarker( pt, context );
407}
408
409void QgsFeatureRenderer::renderVertexMarkerPolygon( QPolygonF &pts, QList<QPolygonF> *rings, QgsRenderContext &context )
410{
411 const auto constPts = pts;
412 for ( const QPointF pt : constPts )
413 renderVertexMarker( pt, context );
414
415 if ( rings )
416 {
417 const auto constRings = *rings;
418 for ( const QPolygonF &ring : constRings )
419 {
420 const auto constRing = ring;
421 for ( const QPointF pt : constRing )
422 renderVertexMarker( pt, context );
423 }
424 }
425}
426
428{
429 QgsSymbolList lst;
430 QgsSymbol *s = symbolForFeature( feature, context );
431 if ( s ) lst.append( s );
432 return lst;
433}
434
436{
437 Q_UNUSED( extent )
438 Q_UNUSED( context )
439}
440
442{
443 QgsSymbolList lst;
444 QgsSymbol *s = originalSymbolForFeature( feature, context );
445 if ( s ) lst.append( s );
446 return lst;
447}
448
453
455{
456 delete mPaintEffect;
457 mPaintEffect = effect;
458}
459
464
469
471{
472 return mOrderByEnabled;
473}
474
476{
477 mOrderByEnabled = enabled;
478}
479
481{
482 delete subRenderer;
483}
484
486{
487 return nullptr;
488}
489
491{
492 return true;
493}
494
496{
497 if ( symbol->type() == Qgis:: SymbolType::Marker )
498 {
499 QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( symbol );
500 if ( Qgis::ScaleMethod::ScaleArea == method )
501 {
502 s->setDataDefinedSize( QgsProperty::fromExpression( "coalesce(sqrt(" + QString::number( s->size() ) + " * (" + field + ")),0)" ) );
503 }
504 else
505 {
506 s->setDataDefinedSize( QgsProperty::fromExpression( "coalesce(" + QString::number( s->size() ) + " * (" + field + "),0)" ) );
507 }
509 }
510 else if ( symbol->type() == Qgis::SymbolType::Line )
511 {
512 QgsLineSymbol *s = static_cast<QgsLineSymbol *>( symbol );
513 s->setDataDefinedWidth( QgsProperty::fromExpression( "coalesce(" + QString::number( s->width() ) + " * (" + field + "),0)" ) );
514 }
515}
516
518{
519 if ( symbol->type() == Qgis::SymbolType::Marker )
520 {
521 QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( symbol );
523 ? QString::number( s->angle() ) + " + "
524 : QString() ) + field );
525 s->setDataDefinedAngle( dd );
526 }
527}
528
530{
531 return mSymbol;
532}
533
535{
536 return mLayer;
537}
ScaleMethod
Scale methods.
Definition qgis.h:220
@ ScaleDiameter
Calculate scale by the diameter.
@ ScaleArea
Calculate scale by the area.
VertexMarkerType
Editing vertex markers, used for showing vertices during a edit operation.
Definition qgis.h:860
@ Marker
Marker symbol.
@ Line
Line symbol.
static QgsPaintEffectRegistry * paintEffectRegistry()
Returns the application's paint effect registry, used for managing paint effects.
static QgsRendererRegistry * rendererRegistry()
Returns the application's renderer registry, used for managing vector layer renderers.
void setOrderBy(const QgsFeatureRequest::OrderBy &orderBy)
Define the order in which features shall be processed by this renderer.
void renderVertexMarkerPolyline(QPolygonF &pts, QgsRenderContext &context)
render editing vertex marker for a polyline
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a wkb string in map coordinates.
virtual QDomElement writeSld(QDomDocument &doc, const QString &styleName, const QVariantMap &props=QVariantMap()) const
create the SLD UserStyle element following the SLD v1.1 specs with the given name
virtual QgsLegendSymbolList legendSymbolItems() const
Returns a list of symbology items for the legend.
static QgsFeatureRenderer * defaultRenderer(QgsWkbTypes::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
void setOrderByEnabled(bool enabled)
Sets whether custom ordering should be applied before features are processed by this renderer.
virtual bool legendSymbolItemsCheckable() const
items of symbology items in legend should be checkable
virtual void modifyRequestExtent(QgsRectangle &extent, QgsRenderContext &context)
Allows for a renderer to modify the extent of a feature request prior to rendering.
virtual bool legendSymbolItemChecked(const QString &key)
items of symbology items in legend is checked
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the renderer.
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the renderer.
virtual void setLegendSymbolItem(const QString &key, QgsSymbol *symbol)
Sets the symbol to be used for a legend symbol item.
virtual void setEmbeddedRenderer(QgsFeatureRenderer *subRenderer)
Sets an embedded renderer (subrenderer) for this feature renderer.
QgsFeatureRenderer(const QString &type)
virtual QgsSymbolList symbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns list of symbols used for rendering the feature.
void setForceRasterRender(bool forceRaster)
Sets whether the renderer should be rendered to a raster destination.
virtual QgsSymbolList symbols(QgsRenderContext &context) const
Returns list of symbols used by the renderer.
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
virtual void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const
used from subclasses to create SLD Rule elements following SLD v1.1 specs
virtual QSet< QString > legendKeysForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns legend keys matching a specified feature.
QgsPaintEffect * mPaintEffect
QString type() const
virtual bool usesEmbeddedSymbols() const
Returns true if the renderer uses embedded symbols for features.
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
virtual bool renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false)
Render a feature using this renderer in the given context.
virtual QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context)
Stores renderer properties to an XML element.
static QgsFeatureRenderer * loadSld(const QDomNode &node, QgsWkbTypes::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
void setReferenceScale(double scale)
Sets the symbology reference scale.
virtual QString dump() const
Returns debug information about this renderer.
void setUsingSymbolLevels(bool usingSymbolLevels)
virtual ~QgsFeatureRenderer()
virtual QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const =0
To be overridden.
virtual void checkLegendSymbolItem(const QString &key, bool state=true)
item in symbology was checked
virtual QString legendKeyToExpression(const QString &key, QgsVectorLayer *layer, bool &ok) const
Attempts to convert the specified legend rule key to a QGIS expression matching the features displaye...
bool orderByEnabled() const
Returns whether custom ordering will be applied before features are processed by this renderer.
virtual bool filterNeedsGeometry() const
Returns true if this renderer requires the geometry to apply the filter.
static void convertSymbolRotation(QgsSymbol *symbol, const QString &field)
static QgsFeatureRenderer * load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
QgsFeatureRequest::OrderBy mOrderBy
virtual QgsSymbol * originalSymbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns symbol for feature.
Qgis::VertexMarkerType mCurrentVertexMarkerType
The current type of editing marker.
virtual bool willRenderFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns whether the renderer will render a feature or not.
void saveRendererData(QDomDocument &doc, QDomElement &element, const QgsReadWriteContext &context)
Saves generic renderer data into the specified element.
void renderFeatureWithSymbol(const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker)
Render the feature with the symbol using context.
void renderVertexMarker(QPointF pt, QgsRenderContext &context)
render editing vertex marker at specified point
void renderVertexMarkerPolygon(QPolygonF &pts, QList< QPolygonF > *rings, QgsRenderContext &context)
render editing vertex marker for a polygon
virtual const QgsFeatureRenderer * embeddedRenderer() const
Returns the current embedded renderer (subrenderer) for this feature renderer.
double mCurrentVertexMarkerSize
The current size of editing marker.
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
static void convertSymbolSizeScale(QgsSymbol *symbol, Qgis::ScaleMethod method, const QString &field)
void setVertexMarkerAppearance(Qgis::VertexMarkerType type, double size)
Sets type and size of editing vertex markers for subsequent rendering.
QgsFeatureRequest::OrderBy orderBy() const
Gets the order in which features shall be processed by this renderer.
virtual QgsSymbolList originalSymbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Equivalent of originalSymbolsForFeature() call extended to support renderers that may use more symbol...
Represents a list of OrderByClauses, with the most important first and the least important last.
void CORE_EXPORT load(const QDomElement &elem)
Deserialize from XML.
void CORE_EXPORT save(QDomElement &elem) const
Serialize to XML.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:56
Container of fields for a vector layer.
Definition qgsfields.h:45
A line symbol type, for rendering LineString and MultiLineString geometries.
void setDataDefinedWidth(const QgsProperty &property) const
Set data defined width for whole symbol (including all symbol layers).
double width() const
Returns the estimated width for the whole symbol, which is the maximum width of all marker symbol lay...
A marker symbol type, for rendering Point and MultiPoint geometries.
void setScaleMethod(Qgis::ScaleMethod scaleMethod) const
Sets the method to use for scaling the marker's size.
double size() const
Returns the estimated size for the whole symbol, which is the maximum size of all marker symbol layer...
double angle() const
Returns the marker angle for the whole symbol.
void setDataDefinedSize(const QgsProperty &property) const
Set data defined size for whole symbol (including all symbol layers).
void setDataDefinedAngle(const QgsProperty &property)
Set data defined angle for whole symbol (including all symbol layers).
static QgsPaintEffect * defaultStack()
Returns a new effect stack consisting of a sensible selection of default effects.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
Base class for visual effects which can be applied to QPicture drawings.
void setEnabled(bool enabled)
Sets whether the effect is enabled.
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
virtual QgsPaintEffect * clone() const =0
Duplicates an effect by creating a deep copy of the effect.
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
A store for object properties.
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
Stores metadata about one renderer class.
virtual QgsFeatureRenderer * createRenderer(QDomElement &elem, const QgsReadWriteContext &context)=0
Returns new instance of the renderer given the DOM element.
virtual QgsFeatureRenderer * createRendererFromSld(QDomElement &elem, QgsWkbTypes::GeometryType geomType)
QgsRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
An interface for classes which can visit style entity (e.g.
static void drawVertexMarker(double x, double y, QPainter &p, Qgis::VertexMarkerType type, int markerSize)
Draws a vertex symbol at (painter) coordinates x, y.
int layer() const
The layer of this symbol level.
QgsSymbol * mSymbol
Definition qgsrenderer.h:79
QgsSymbol * symbol() const
The symbol of this symbol level.
Abstract base class for all rendered symbols.
Definition qgssymbol.h:93
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.
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a QgsPoint in map coordinates.
Definition qgssymbol.h:718
static QgsSymbol * defaultSymbol(QgsWkbTypes::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
Qgis::SymbolType type() const
Returns the symbol's type.
Definition qgssymbol.h:152
@ RenderMillimeters
Millimeters.
Represents a vector layer which manages a vector based data sets.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
const QgsField & field
Definition qgsfield.h:476
QList< QgsLegendSymbolItem > QgsLegendSymbolList
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:39
#define RENDERER_TAG_NAME
Definition qgsrenderer.h:50
QList< QgsSymbol * > QgsSymbolList
Definition qgsrenderer.h:44