42 #include <QDomElement> 
   43 #include <QDomDocument> 
   91   return QSet< QString >();
 
   99     mThread = QThread::currentThread();
 
  103     Q_ASSERT_X( mThread == QThread::currentThread(), 
"QgsFeatureRenderer::startRender", 
"startRender called in a different thread - use a cloned renderer instead" );
 
  111   Q_ASSERT_X( mThread == QThread::currentThread(), 
"QgsFeatureRenderer::stopRender", 
"stopRender called in a different thread - use a cloned renderer instead" );
 
  128   Q_ASSERT_X( mThread == QThread::currentThread(), 
"QgsFeatureRenderer::renderFeature", 
"renderFeature called in a different thread - use a cloned renderer instead" );
 
  146   return QStringLiteral( 
"UNKNOWN RENDERER\n" );
 
  159   if ( element.isNull() )
 
  163   QString rendererType = element.attribute( QStringLiteral( 
"type" ) );
 
  172     r->
setUsingSymbolLevels( element.attribute( QStringLiteral( 
"symbollevels" ), QStringLiteral( 
"0" ) ).toInt() );
 
  173     r->
setForceRasterRender( element.attribute( QStringLiteral( 
"forceraster" ), QStringLiteral( 
"0" ) ).toInt() );
 
  176     QDomElement effectElem = element.firstChildElement( QStringLiteral( 
"effect" ) );
 
  177     if ( !effectElem.isNull() )
 
  183     QDomElement orderByElem = element.firstChildElement( QStringLiteral( 
"orderby" ) );
 
  185     r->
setOrderByEnabled( element.attribute( QStringLiteral( 
"enableorderby" ), QStringLiteral( 
"0" ) ).toInt() );
 
  195   rendererElem.setAttribute( QStringLiteral( 
"forceraster" ), ( 
mForceRaster ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) ) );
 
  202     QDomElement 
orderBy = doc.createElement( QStringLiteral( 
"orderby" ) );
 
  204     rendererElem.appendChild( 
orderBy );
 
  206   rendererElem.setAttribute( QStringLiteral( 
"enableorderby" ), ( 
mOrderByEnabled ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) ) );
 
  212   QDomElement element = node.toElement();
 
  213   if ( element.isNull() )
 
  217   QDomElement userStyleElem = element.firstChildElement( QStringLiteral( 
"UserStyle" ) );
 
  218   if ( userStyleElem.isNull() )
 
  221     errorMessage = QStringLiteral( 
"Info: UserStyle element not found." );
 
  226   QDomElement featTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral( 
"FeatureTypeStyle" ) );
 
  227   if ( featTypeStyleElem.isNull() )
 
  229     errorMessage = QStringLiteral( 
"Info: FeatureTypeStyle element not found." );
 
  234   QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode( 
false ).toElement();
 
  239   bool needRuleRenderer = 
false;
 
  242   while ( !featTypeStyleElem.isNull() )
 
  244     QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral( 
"Rule" ) );
 
  245     while ( !ruleElem.isNull() )
 
  249       bool hasRendererSymbolizer = 
false;
 
  250       bool hasRuleRenderer = 
false;
 
  251       QDomElement ruleChildElem = ruleElem.firstChildElement();
 
  252       while ( !ruleChildElem.isNull() )
 
  255         if ( ruleChildElem.localName() == QLatin1String( 
"Filter" ) ||
 
  256              ruleChildElem.localName() == QLatin1String( 
"MinScaleDenominator" ) ||
 
  257              ruleChildElem.localName() == QLatin1String( 
"MaxScaleDenominator" ) )
 
  259           hasRuleRenderer = 
true;
 
  262         else if ( ruleChildElem.localName().endsWith( QLatin1String( 
"Symbolizer" ) ) &&
 
  263                   ruleChildElem.localName() != QLatin1String( 
"TextSymbolizer" ) )
 
  265           QgsDebugMsgLevel( QStringLiteral( 
"Symbolizer element found and not a TextSymbolizer" ), 2 );
 
  266           hasRendererSymbolizer = 
true;
 
  269         ruleChildElem = ruleChildElem.nextSiblingElement();
 
  272       if ( hasRendererSymbolizer )
 
  277         mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
 
  279         if ( hasRuleRenderer )
 
  281           QgsDebugMsgLevel( QStringLiteral( 
"Filter or Min/MaxScaleDenominator element found: need a RuleRenderer" ), 2 );
 
  282           needRuleRenderer = 
true;
 
  289         QgsDebugMsgLevel( QStringLiteral( 
"more Rule elements found: need a RuleRenderer" ), 2 );
 
  290         needRuleRenderer = 
true;
 
  293       ruleElem = ruleElem.nextSiblingElement( QStringLiteral( 
"Rule" ) );
 
  295     featTypeStyleElem = featTypeStyleElem.nextSiblingElement( QStringLiteral( 
"FeatureTypeStyle" ) );
 
  298   QString rendererType;
 
  299   if ( needRuleRenderer )
 
  301     rendererType = QStringLiteral( 
"RuleRenderer" );
 
  305     rendererType = QStringLiteral( 
"singleSymbol" );
 
  307   QgsDebugMsgLevel( QStringLiteral( 
"Instantiating a '%1' renderer..." ).arg( rendererType ), 2 );
 
  313     errorMessage = QStringLiteral( 
"Error: Unable to get metadata for '%1' renderer." ).arg( rendererType );
 
  323   QDomElement userStyleElem = doc.createElement( QStringLiteral( 
"UserStyle" ) );
 
  325   QDomElement nameElem = doc.createElement( QStringLiteral( 
"se:Name" ) );
 
  326   nameElem.appendChild( doc.createTextNode( styleName ) );
 
  327   userStyleElem.appendChild( nameElem );
 
  329   QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral( 
"se:FeatureTypeStyle" ) );
 
  330   toSld( doc, featureTypeStyleElem, props );
 
  331   userStyleElem.appendChild( featureTypeStyleElem );
 
  333   return userStyleElem;
 
  385   const auto constPts = pts;
 
  386   for ( QPointF pt : constPts )
 
  392   const auto constPts = pts;
 
  393   for ( QPointF pt : constPts )
 
  398     const auto constRings = *rings;
 
  399     for ( 
const QPolygonF &ring : constRings )
 
  401       const auto constRing = ring;
 
  402       for ( QPointF pt : constRing )
 
  412   if ( s ) lst.append( s );
 
  426   if ( s ) lst.append( s );
 
  504                      ? QString::number( s->
angle() ) + 
" + " 
  505                      : QString() ) + 
field );
 
ScaleMethod
Scale methods.
@ ScaleDiameter
Calculate scale by the diameter.
@ ScaleArea
Calculate scale by the area.
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.
void renderFeatureWithSymbol(const QgsFeature &feature, QgsSymbol *symbol, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker) SIP_THROW(QgsCsException)
Render the feature with the symbol using context.
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
virtual QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const =0
To be overridden.
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 QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context)
store renderer info to 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 setVertexMarkerAppearance(int type, double size)
Sets type and size of editing vertex markers for subsequent rendering.
virtual QString dump() const
Returns debug information about this renderer.
void setUsingSymbolLevels(bool usingSymbolLevels)
virtual ~QgsFeatureRenderer()
virtual void checkLegendSymbolItem(const QString &key, bool state=true)
item in symbology was checked
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...
int mCurrentVertexMarkerType
The current type of editing marker.
QgsFeatureRequest::OrderBy mOrderBy
virtual QgsSymbol * originalSymbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns symbol for feature.
virtual bool willRenderFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns whether the renderer will render a feature or not.
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.
virtual bool renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false) SIP_THROW(QgsCsException)
Render a feature using this renderer in the given context.
static void convertSymbolSizeScale(QgsSymbol *symbol, Qgis::ScaleMethod method, const QString &field)
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...
Container of fields for a vector layer.
A line symbol type, for rendering LineString and MultiLineString geometries.
double width() const
Returns the estimated width for the whole symbol, which is the maximum width of all marker symbol lay...
void setDataDefinedWidth(const QgsProperty &property)
Set data defined width for whole symbol (including all symbol layers).
A marker symbol type, for rendering Point and MultiPoint geometries.
void setScaleMethod(Qgis::ScaleMethod scaleMethod)
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)
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.
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()) const
Converts a size from the specified units to painter units (pixels).
QgsRendererAbstractMetadata * rendererMetadata(const QString &rendererName)
Returns the metadata for a specified renderer.
An interface for classes which can visit style entity (e.g.
VertexMarkerType
Editing vertex markers.
static void drawVertexMarker(double x, double y, QPainter &p, QgsSymbolLayerUtils::VertexMarkerType type, int markerSize)
Draws a vertex symbol at (painter) coordinates x, y.
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, int currentVertexMarkerType=0, double currentVertexMarkerSize=0.0) SIP_THROW(QgsCsException)
Render a feature.
static QPointF _getPoint(QgsRenderContext &context, const QgsPoint &point)
Creates a point in screen coordinates from a QgsPoint in map coordinates.
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.
@ 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.
QList< QgsLegendSymbolItem > QgsLegendSymbolList
#define QgsDebugMsgLevel(str, level)
#define RENDERER_TAG_NAME
QList< QgsSymbol * > QgsSymbolList