38#include <QDomDocument> 
   62  destRenderer->mDataDefinedProperties = mDataDefinedProperties;
 
 
   79  QgsFeatureRenderer::initPropertyDefinitions();
 
   80  return sPropertyDefinitions;
 
 
   97  return QSet< QString >();
 
 
  105    mThread = QThread::currentThread();
 
  109    Q_ASSERT_X( mThread == QThread::currentThread(), 
"QgsFeatureRenderer::startRender", 
"startRender called in a different thread - use a cloned renderer instead" );
 
 
  124  Q_ASSERT_X( mThread == QThread::currentThread(), 
"QgsFeatureRenderer::stopRender", 
"stopRender called in a different thread - use a cloned renderer instead" );
 
 
  141  Q_ASSERT_X( mThread == QThread::currentThread(), 
"QgsFeatureRenderer::renderFeature", 
"renderFeature called in a different thread - use a cloned renderer instead" );
 
 
  159  return QStringLiteral( 
"UNKNOWN RENDERER\n" );
 
 
  172  if ( element.isNull() )
 
  176  const QString rendererType = element.attribute( QStringLiteral( 
"type" ) );
 
  185    r->
setUsingSymbolLevels( element.attribute( QStringLiteral( 
"symbollevels" ), QStringLiteral( 
"0" ) ).toInt() );
 
  186    r->
setForceRasterRender( element.attribute( QStringLiteral( 
"forceraster" ), QStringLiteral( 
"0" ) ).toInt() );
 
  187    r->
setReferenceScale( element.attribute( QStringLiteral( 
"referencescale" ), QStringLiteral( 
"-1" ) ).toDouble() );
 
  190    const QDomElement effectElem = element.firstChildElement( QStringLiteral( 
"effect" ) );
 
  191    if ( !effectElem.isNull() )
 
  197    const QDomElement orderByElem = element.firstChildElement( QStringLiteral( 
"orderby" ) );
 
  199    r->
setOrderByEnabled( element.attribute( QStringLiteral( 
"enableorderby" ), QStringLiteral( 
"0" ) ).toInt() );
 
  201    const QDomElement elemDataDefinedProperties = element.firstChildElement( QStringLiteral( 
"data-defined-properties" ) );
 
  202    if ( !elemDataDefinedProperties.isNull() )
 
 
  221  rendererElem.setAttribute( QStringLiteral( 
"forceraster" ), ( 
mForceRaster ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) ) );
 
  222  rendererElem.setAttribute( QStringLiteral( 
"symbollevels" ), ( 
mUsingSymbolLevels ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) ) );
 
  223  rendererElem.setAttribute( QStringLiteral( 
"referencescale" ), 
mReferenceScale );
 
  225  QDomElement elemDataDefinedProperties = doc.createElement( QStringLiteral( 
"data-defined-properties" ) );
 
  227  rendererElem.appendChild( elemDataDefinedProperties );
 
  234    QDomElement 
orderBy = doc.createElement( QStringLiteral( 
"orderby" ) );
 
  236    rendererElem.appendChild( 
orderBy );
 
  238  rendererElem.setAttribute( QStringLiteral( 
"enableorderby" ), ( 
mOrderByEnabled ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) ) );
 
 
  243  const QDomElement element = node.toElement();
 
  244  if ( element.isNull() )
 
  248  const QDomElement userStyleElem = element.firstChildElement( QStringLiteral( 
"UserStyle" ) );
 
  249  if ( userStyleElem.isNull() )
 
  252    errorMessage = QStringLiteral( 
"Info: UserStyle element not found." );
 
  257  QDomElement featTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral( 
"FeatureTypeStyle" ) );
 
  258  if ( featTypeStyleElem.isNull() )
 
  260    errorMessage = QStringLiteral( 
"Info: FeatureTypeStyle element not found." );
 
  265  QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode( 
false ).toElement();
 
  270  bool needRuleRenderer = 
false;
 
  273  while ( !featTypeStyleElem.isNull() )
 
  275    QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral( 
"Rule" ) );
 
  276    while ( !ruleElem.isNull() )
 
  280      bool hasRendererSymbolizer = 
false;
 
  281      bool hasRuleRenderer = 
false;
 
  282      QDomElement ruleChildElem = ruleElem.firstChildElement();
 
  283      while ( !ruleChildElem.isNull() )
 
  286        if ( ruleChildElem.localName() == QLatin1String( 
"Filter" ) ||
 
  287             ruleChildElem.localName() == QLatin1String( 
"ElseFilter" ) ||
 
  288             ruleChildElem.localName() == QLatin1String( 
"MinScaleDenominator" ) ||
 
  289             ruleChildElem.localName() == QLatin1String( 
"MaxScaleDenominator" ) )
 
  291          hasRuleRenderer = 
true;
 
  294        else if ( ruleChildElem.localName().endsWith( QLatin1String( 
"Symbolizer" ) ) &&
 
  295                  ruleChildElem.localName() != QLatin1String( 
"TextSymbolizer" ) )
 
  297          QgsDebugMsgLevel( QStringLiteral( 
"Symbolizer element found and not a TextSymbolizer" ), 2 );
 
  298          hasRendererSymbolizer = 
true;
 
  301        ruleChildElem = ruleChildElem.nextSiblingElement();
 
  304      if ( hasRendererSymbolizer )
 
  309        mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
 
  311        if ( hasRuleRenderer )
 
  313          QgsDebugMsgLevel( QStringLiteral( 
"Filter or Min/MaxScaleDenominator element found: need a RuleRenderer" ), 2 );
 
  314          needRuleRenderer = 
true;
 
  321        QgsDebugMsgLevel( QStringLiteral( 
"more Rule elements found: need a RuleRenderer" ), 2 );
 
  322        needRuleRenderer = 
true;
 
  325      ruleElem = ruleElem.nextSiblingElement( QStringLiteral( 
"Rule" ) );
 
  327    featTypeStyleElem = featTypeStyleElem.nextSiblingElement( QStringLiteral( 
"FeatureTypeStyle" ) );
 
  330  QString rendererType;
 
  331  if ( needRuleRenderer )
 
  333    rendererType = QStringLiteral( 
"RuleRenderer" );
 
  337    rendererType = QStringLiteral( 
"singleSymbol" );
 
  339  QgsDebugMsgLevel( QStringLiteral( 
"Instantiating a '%1' renderer..." ).arg( rendererType ), 2 );
 
  345    errorMessage = QStringLiteral( 
"Error: Unable to get metadata for '%1' renderer." ).arg( rendererType );
 
 
  357  QSet< QString > keys;
 
  358  keys.reserve( allLegendSymbols.size() );
 
  361    keys.insert( symbol.ruleKey() );
 
 
  368  QDomElement userStyleElem = doc.createElement( QStringLiteral( 
"UserStyle" ) );
 
  370  QDomElement nameElem = doc.createElement( QStringLiteral( 
"se:Name" ) );
 
  371  nameElem.appendChild( doc.createTextNode( styleName ) );
 
  372  userStyleElem.appendChild( nameElem );
 
  374  QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral( 
"se:FeatureTypeStyle" ) );
 
  375  toSld( doc, featureTypeStyleElem, props );
 
  376  userStyleElem.appendChild( featureTypeStyleElem );
 
  378  return userStyleElem;
 
 
  417  QList<QgsLayerTreeModelLegendNode *> nodes;
 
  420  nodes.reserve( symbolItems.size() );
 
 
  457  const auto constPts = pts;
 
  458  for ( 
const QPointF pt : constPts )
 
 
  464  const auto constPts = pts;
 
  465  for ( 
const QPointF pt : constPts )
 
  470    const auto constRings = *rings;
 
  471    for ( 
const QPolygonF &ring : constRings )
 
  473      const auto constRing = ring;
 
  474      for ( 
const QPointF pt : constRing )
 
 
  484  if ( s ) lst.append( s );
 
 
  498  if ( s ) lst.append( s );
 
 
  515  mDataDefinedProperties.
setProperty( key, property );
 
 
  581                           ? QString::number( s->
angle() ) + 
" + " 
  582                           : QString() ) + field );
 
 
  587void QgsFeatureRenderer::initPropertyDefinitions()
 
  589  if ( !sPropertyDefinitions.isEmpty() )
 
  592  QString origin = QStringLiteral( 
"renderer" );
 
ScaleMethod
Scale methods.
 
@ ScaleDiameter
Calculate scale by the diameter.
 
@ ScaleArea
Calculate scale by the area.
 
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
 
@ Millimeters
Millimeters.
 
VertexMarkerType
Editing vertex markers, used for showing vertices during a edit operation.
 
virtual bool readXml(const QDomElement &collectionElem, const QgsPropertiesDefinition &definitions)
Reads property collection state from an XML element.
 
virtual bool writeXml(QDomElement &collectionElem, const QgsPropertiesDefinition &definitions) const
Writes the current state of the property collection into an XML element.
 
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.
 
Produces legend node with a marker symbol.
 
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
 
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
 
virtual bool canSkipRender()
Returns true if the renderer can be entirely skipped, i.e.
 
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.
 
void setOrderByEnabled(bool enabled)
Sets whether custom ordering should be applied before features are processed by this renderer.
 
virtual bool legendSymbolItemsCheckable() const
Returns true if symbology items in legend are 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)
Returns true if the legend symbology item with the specified key 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.
 
virtual QList< QgsLayerTreeModelLegendNode * > createLegendNodes(QgsLayerTreeLayer *nodeLayer) const
Returns a list of legend nodes to be used for the legend for the renderer.
 
QgsFeatureRenderer(const QString &type)
 
static QgsFeatureRenderer * defaultRenderer(Qgis::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
 
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.
 
Property
Data definable properties for renderers.
 
@ HeatmapRadius
Heatmap renderer radius.
 
@ HeatmapMaximum
Heatmap maximum value.
 
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
 
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.
 
void setReferenceScale(double scale)
Sets the symbology reference scale.
 
virtual QString dump() const
Returns debug information about this renderer.
 
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the symbol property definitions.
 
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)
Sets whether the legend symbology item with the specified ley should be 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.
 
QSet< QString > legendKeys() const
Returns the set of all legend keys used by the renderer.
 
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.
 
void setDataDefinedProperty(Property key, const QgsProperty &property)
Sets a data defined property for the renderer.
 
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.
 
static QgsFeatureRenderer * loadSld(const QDomNode &node, Qgis::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
 
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...
 
Container of fields for a vector layer.
 
Layer tree node points to a map layer.
 
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
 
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.
 
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
 
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const final
Prepares the collection against a specified expression context.
 
Definition for a property.
 
@ DoublePositive
Positive double value (including 0)
 
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.
 
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.
 
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.
 
Implementation of legend node interface for displaying preview of vector symbols and their labels and...
 
int layer() const
The layer of this symbol level.
 
QgsSymbol * symbol() const
The symbol of this symbol level.
 
Abstract base class for all rendered symbols.
 
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.
 
Qgis::SymbolType type() const
Returns the symbol's type.
 
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
 
Represents a vector layer which manages a vector based data sets.
 
QList< QgsLegendSymbolItem > QgsLegendSymbolList
 
#define QgsDebugMsgLevel(str, level)
 
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
 
#define RENDERER_TAG_NAME
 
QList< QgsSymbol * > QgsSymbolList