30 #include <QDomDocument> 
   31 #include <QDomElement> 
  110   mFeaturesCategories.clear();
 
  111   mSymbolCategories.clear();
 
  112   mFeatureDecorations.clear();
 
  151       exteriorRing.reserve( 5 );
 
  152       exteriorRing << outer.topLeft();
 
  153       exteriorRing << outer.topRight();
 
  154       exteriorRing << outer.bottomRight();
 
  155       exteriorRing << outer.bottomLeft();
 
  156       exteriorRing << outer.topLeft();
 
  158       mExtentPolygon.clear();
 
  159       mExtentPolygon.append( exteriorRing );
 
  176   if ( selected || drawVertexMarker )
 
  178     mFeatureDecorations.append( FeatureDecoration( feature, selected, drawVertexMarker, layer ) );
 
  202       catId.append( 
reinterpret_cast<const char *
>( &sym ), 
sizeof( sym ) );
 
  209       catId.append( 
reinterpret_cast<const char *
>( &sym ), 
sizeof( sym ) );
 
  213   if ( catId.isEmpty() )
 
  218   if ( ! mSymbolCategories.contains( catId ) )
 
  220     CombinedFeature cFeat;
 
  222     cFeat.feature = feature;
 
  223     mSymbolCategories.insert( catId, mSymbolCategories.count() );
 
  224     mFeaturesCategories.append( cFeat );
 
  228   CombinedFeature &cFeat = mFeaturesCategories[ mSymbolCategories[catId] ];
 
  247         geom = geom.
buffer( 0, 0 );
 
  260   cFeat.geometries.append( geom );
 
  287   for ( 
const CombinedFeature &cit : std::as_const( mFeaturesCategories ) )
 
  289     finalMulti.resize( 0 ); 
 
  327         finalMulti.append( mExtentPolygon );
 
  328         for ( 
const QgsGeometry &geom : std::as_const( cit.geometries ) )
 
  335             multi.append( geom.asPolygon() );
 
  339             multi = geom.asMultiPolygon();
 
  342           for ( 
int i = 0; i < multi.size(); i++ )
 
  348             if ( exterior.count() < 4 || exterior[0] != exterior[exterior.count() - 1] )
 
  350             finalMulti[0].append( exterior );
 
  353             for ( 
int j = 1; j < multi[i].size(); j++ )
 
  356               newPoly.append( multi[i][j] );
 
  357               finalMulti.append( newPoly );
 
  383       if ( mFeaturesCategories.isEmpty() )
 
  394   for ( FeatureDecoration deco : std::as_const( mFeatureDecorations ) )
 
  396     mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers );
 
  406     return QStringLiteral( 
"MERGED FEATURES: NULL" );
 
  408   return "MERGED FEATURES [" + 
mSubRenderer->dump() + 
']';
 
  430   QDomElement embeddedRendererElem = element.firstChildElement( QStringLiteral( 
"renderer-v2" ) );
 
  431   if ( !embeddedRendererElem.isNull() )
 
  444   rendererElem.setAttribute( QStringLiteral( 
"type" ), QStringLiteral( 
"mergedFeatureRenderer" ) );
 
  445   rendererElem.setAttribute( QStringLiteral( 
"forceraster" ), ( 
mForceRaster ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) ) );
 
  449     QDomElement embeddedRendererElem = 
mSubRenderer->save( doc, context );
 
  450     rendererElem.appendChild( embeddedRendererElem );
 
  458     QDomElement 
orderBy = doc.createElement( QStringLiteral( 
"orderby" ) );
 
  460     rendererElem.appendChild( 
orderBy );
 
  462   rendererElem.setAttribute( QStringLiteral( 
"enableorderby" ), ( 
mOrderByEnabled ? QStringLiteral( 
"1" ) : QStringLiteral( 
"0" ) ) );
 
  473   return mSubRenderer->symbolForFeature( feature, context );
 
  480   return mSubRenderer->originalSymbolForFeature( feature, context );
 
  489   return mSubRenderer->symbolsForFeature( feature, context );
 
  496   return mSubRenderer->originalSymbolsForFeature( feature, context );
 
  502     return QSet<QString>();
 
  503   return mSubRenderer->legendKeysForFeature( feature, context );
 
  519     return Capabilities();
 
  528     return QSet<QString>();
 
  553   return mSubRenderer->willRenderFeature( feature, context );
 
  558   if ( renderer->
type() == QLatin1String( 
"mergedFeatureRenderer" ) )
 
  563   if ( renderer->
type() == QLatin1String( 
"singleSymbol" ) ||
 
  564        renderer->
type() == QLatin1String( 
"categorizedSymbol" ) ||
 
  565        renderer->
type() == QLatin1String( 
"graduatedSymbol" ) ||
 
  566        renderer->
type() == QLatin1String( 
"RuleRenderer" ) )
 
  570   else if ( renderer->
type() == QLatin1String( 
"invertedPolygonRenderer" ) )
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
QgsPaintEffect * mPaintEffect
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
@ MoreSymbolsPerFeature
May use more than one symbol to render a feature: symbolsForFeature() will return them.
static QgsFeatureRenderer * load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
QgsFeatureRequest::OrderBy mOrderBy
virtual const QgsFeatureRenderer * embeddedRenderer() const
Returns the current embedded renderer (subrenderer) for this feature renderer.
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
QgsFeatureRequest::OrderBy orderBy() const
Gets the order in which features shall be processed by this renderer.
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...
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Container of fields for a vector layer.
A geometry is the spatial representation of a feature.
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other.
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
bool isGeosValid(QgsGeometry::ValidityFlags flags=QgsGeometry::ValidityFlags()) const
Checks validity of the geometry using GEOS.
QgsWkbTypes::GeometryType type
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygon.
QgsGeometry mergeLines() const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygon.
QgsGeometry buffer(double distance, int segments) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
QgsMergedFeatureRenderer is a polygon or line-only feature renderer used to renderer a set of feature...
void setLegendSymbolItem(const QString &key, QgsSymbol *symbol) override
Sets the symbol to be used for a legend symbol item.
static QgsFeatureRenderer * create(QDomElement &element, const QgsReadWriteContext &context)
Creates a renderer out of an XML, for loading.
QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
To be overridden.
void stopRender(QgsRenderContext &context) override
The actual rendering will take place here.
QSet< QString > legendKeysForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Returns legend keys matching a specified feature.
QgsSymbolList symbols(QgsRenderContext &context) const override
Returns list of symbols used by the renderer.
QgsSymbolList symbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Returns list of symbols used for rendering the feature.
void startRender(QgsRenderContext &context, const QgsFields &fields) override
Must be called when a new render cycle is started.
QgsSymbol * originalSymbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Returns symbol for feature.
QString dump() const override
Returns debug information about this renderer.
QgsMergedFeatureRenderer(QgsFeatureRenderer *embeddedRenderer)
Constructor for QgsMergedFeatureRenderer.
const QgsFeatureRenderer * embeddedRenderer() const override
Returns the current embedded renderer (subrenderer) for this feature renderer.
QgsSymbolList originalSymbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Equivalent of originalSymbolsForFeature() call extended to support renderers that may use more symbol...
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns a list of attributes required by this renderer.
QgsLegendSymbolList legendSymbolItems() const override
Returns a list of symbology items for the legend.
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) override
store renderer info to XML element
@ Merge
Merge features (union/dissolve)
@ InvertOnly
Invert features only (polygons only)
@ MergeAndInvert
Merge and invert features (polygons only)
GeometryOperation mOperation
Operation to apply to collected geometries.
void checkLegendSymbolItem(const QString &key, bool state=true) override
item in symbology was checked
bool filterNeedsGeometry() const override
Returns true if this renderer requires the geometry to apply the filter.
bool legendSymbolItemChecked(const QString &key) override
items of symbology items in legend is checked
void setEmbeddedRenderer(QgsFeatureRenderer *subRenderer) override
Sets an embedded renderer (subrenderer) for this feature renderer.
std::unique_ptr< QgsFeatureRenderer > mSubRenderer
Embedded renderer.
QgsFeatureRenderer::Capabilities capabilities() override
Returns details about internals of this renderer.
bool legendSymbolItemsCheckable() const override
items of symbology items in legend should be checkable
bool willRenderFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Returns whether the renderer will render a feature or not.
static QgsMergedFeatureRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsMergedFeatureRenderer by a conversion from an existing renderer.
bool renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false) override SIP_THROW(QgsCsException)
Renders a given feature.
QgsMergedFeatureRenderer * clone() const override
Create a deep copy of this renderer.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
The class is used as a container of context for various read/write operations on other objects.
QRectF toRectF() const
Returns a QRectF with same coordinates as the rectangle.
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
QgsRectangle buffered(double width) const
Gets rectangle enlarged by buffer.
Contains information about the context of a rendering operation.
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
QgsRectangle mapExtent() const
Returns the original extent of the map being rendered.
void setExtent(const QgsRectangle &extent)
When rendering a map layer, calling this method sets the "clipping" extent for the layer (in the laye...
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
An interface for classes which can visit style entity (e.g.
Abstract base class for all rendered symbols.
Type
The WKB type describes the number of dimensions a geometry has.
static Type flatType(Type type) SIP_HOLDGIL
Returns the flat type for a WKB type.
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
QList< QgsLegendSymbolItem > QgsLegendSymbolList
#define RENDERER_TAG_NAME
QList< QgsSymbol * > QgsSymbolList