29 #include <QDomDocument> 30 #include <QDomElement> 49 mSubRenderer.reset( subRenderer );
53 mSubRenderer.reset(
nullptr );
59 return mSubRenderer.get();
67 mSubRenderer->setLegendSymbolItem( key, symbol );
75 return mSubRenderer->legendSymbolItemsCheckable();
83 return mSubRenderer->legendSymbolItemChecked( key );
91 mSubRenderer->checkLegendSymbolItem( key, state );
104 mSubRenderer->startRender( context, fields );
106 mFeaturesCategories.clear();
107 mSymbolCategories.clear();
108 mFeatureDecorations.clear();
125 exteriorRing.reserve( 5 );
126 exteriorRing << outer.topLeft();
127 exteriorRing << outer.topRight();
128 exteriorRing << outer.bottomRight();
129 exteriorRing << outer.bottomLeft();
130 exteriorRing << outer.topLeft();
149 mExtentPolygon.clear();
150 mExtentPolygon.append( exteriorRing );
161 if ( selected || drawVertexMarker )
163 mFeatureDecorations.append( FeatureDecoration( feature, selected, drawVertexMarker, layer ) );
183 QgsSymbolList syms( mSubRenderer->symbolsForFeature( feature, context ) );
184 const auto constSyms = syms;
188 catId.append( reinterpret_cast<const char *>( &sym ),
sizeof( sym ) );
193 QgsSymbol *sym = mSubRenderer->symbolForFeature( feature, context );
196 catId.append( reinterpret_cast<const char *>( &sym ),
sizeof( sym ) );
200 if ( catId.isEmpty() )
205 if ( ! mSymbolCategories.contains( catId ) )
207 CombinedFeature cFeat;
209 cFeat.feature = feature;
210 mSymbolCategories.insert( catId, mSymbolCategories.count() );
211 mFeaturesCategories.append( cFeat );
215 CombinedFeature &cFeat = mFeaturesCategories[ mSymbolCategories[catId] ];
228 if ( mPreprocessingEnabled )
233 geom = geom.
buffer( 0, 0 );
241 cFeat.geometries.append( geom );
251 mSubRenderer->stopRender( mContext );
267 const auto constMFeaturesCategories = mFeaturesCategories;
268 for (
const CombinedFeature &cit : constMFeaturesCategories )
270 finalMulti.resize( 0 );
272 if ( mPreprocessingEnabled )
294 finalMulti.append( mExtentPolygon );
295 for (
const QgsGeometry &geom : qgis::as_const( cit.geometries ) )
302 multi.append( geom.asPolygon() );
306 multi = geom.asMultiPolygon();
309 for (
int i = 0; i < multi.size(); i++ )
315 if ( exterior.count() < 4 || exterior[0] != exterior[exterior.count() - 1] )
317 finalMulti[0].append( exterior );
320 for (
int j = 1; j < multi[i].size(); j++ )
323 newPoly.append( multi[i][j] );
324 finalMulti.append( newPoly );
333 mSubRenderer->renderFeature( feat, mContext );
341 if ( mFeaturesCategories.isEmpty() )
346 mSubRenderer->renderFeature( feat, mContext );
350 const auto constMFeatureDecorations = mFeatureDecorations;
351 for ( FeatureDecoration deco : constMFeatureDecorations )
353 mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers );
356 mSubRenderer->stopRender( mContext );
363 return QStringLiteral(
"INVERTED: NULL" );
365 return "INVERTED [" + mSubRenderer->dump() +
']';
388 QDomElement embeddedRendererElem = element.firstChildElement( QStringLiteral(
"renderer-v2" ) );
389 if ( !embeddedRendererElem.isNull() )
394 r->
setPreprocessingEnabled( element.attribute( QStringLiteral(
"preprocessing" ), QStringLiteral(
"0" ) ).toInt() == 1 );
403 rendererElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"invertedPolygonRenderer" ) );
404 rendererElem.setAttribute( QStringLiteral(
"preprocessing" ),
preprocessingEnabled() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
405 rendererElem.setAttribute( QStringLiteral(
"forceraster" ), (
mForceRaster ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) ) );
409 QDomElement embeddedRendererElem = mSubRenderer->save( doc, context );
410 rendererElem.appendChild( embeddedRendererElem );
418 QDomElement
orderBy = doc.createElement( QStringLiteral(
"orderby" ) );
420 rendererElem.appendChild( orderBy );
422 rendererElem.setAttribute( QStringLiteral(
"enableorderby" ), (
mOrderByEnabled ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) ) );
433 return mSubRenderer->symbolForFeature( feature, context );
440 return mSubRenderer->originalSymbolForFeature( feature, context );
449 return mSubRenderer->symbolsForFeature( feature, context );
456 return mSubRenderer->originalSymbolsForFeature( feature, context );
465 return mSubRenderer->symbols( context );
474 return mSubRenderer->capabilities();
481 return QSet<QString>();
483 return mSubRenderer->usedAttributes( context );
488 return mSubRenderer ? mSubRenderer->filterNeedsGeometry() :
false;
497 return mSubRenderer->legendSymbolItems();
506 return mSubRenderer->willRenderFeature( feature, context );
511 if ( renderer->
type() == QLatin1String(
"invertedPolygonRenderer" ) )
516 if ( renderer->
type() == QLatin1String(
"singleSymbol" ) ||
517 renderer->
type() == QLatin1String(
"categorizedSymbol" ) ||
518 renderer->
type() == QLatin1String(
"graduatedSymbol" ) ||
519 renderer->
type() == QLatin1String(
"RuleRenderer" ) )
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygon.
The class is used as a container of context for various read/write operations on other objects...
QgsFeatureRenderer::Capabilities capabilities() override
Proxy that will call this method on the embedded renderer.
May use more than one symbol to render a feature: symbolsForFeature() will return them...
bool legendSymbolItemChecked(const QString &key) override
items of symbology items in legend is checked
QList< QgsLegendSymbolItem > QgsLegendSymbolList
QgsFeatureRequest::OrderBy mOrderBy
Abstract base class for all rendered symbols.
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.
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
static QgsFeatureRenderer * create(QDomElement &element, const QgsReadWriteContext &context)
Creates a renderer out of an XML, for loading.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Proxy that will call this method on the embedded renderer.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
QgsFeatureRequest::OrderBy orderBy() const
Gets the order in which features shall be processed by this renderer.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item...
QgsInvertedPolygonRenderer * clone() const override
Create a deep copy of this renderer.
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
Container of fields for a vector layer.
A geometry is the spatial representation of a feature.
#define RENDERER_TAG_NAME
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...
QgsRectangle mapExtent() const
Returns the original extent of the map being rendered.
bool willRenderFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Proxy that will call this method on the embedded renderer.
QgsPaintEffect * mPaintEffect
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
QString dump() const override
Returns debug information about this renderer.
static QgsInvertedPolygonRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setExtent(const QgsRectangle &extent)
When rendering a map layer, calling this method sets the "clipping" extent for the layer (in the laye...
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
void startRender(QgsRenderContext &context, const QgsFields &fields) override
Must be called when a new render cycle is started.
QgsRectangle buffered(double width) const
Gets rectangle enlarged by buffer.
Type
The WKB type describes the number of dimensions a geometry has.
QList< QgsSymbol * > QgsSymbolList
QgsSymbol * symbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Proxy that will call this method on the embedded renderer.
bool isGeosValid(QgsGeometry::ValidityFlags flags=nullptr) const
Checks validity of the geometry using GEOS.
void checkLegendSymbolItem(const QString &key, bool state=true) override
item in symbology was checked
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) override
store renderer info to XML element
QgsInvertedPolygonRenderer is a polygon-only feature renderer used to display features inverted...
static QgsFeatureRenderer * load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
QgsSymbolList originalSymbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Proxy that will call this method on the embedded renderer.
bool preprocessingEnabled() const
QgsLegendSymbolList legendSymbolItems() const override
Proxy that will call this method on the embedded renderer.
void setPreprocessingEnabled(bool enabled)
double width() const
Returns the width of the rectangle.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
QgsSymbol * originalSymbolForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Proxy that will call this method on the embedded renderer.
QgsSymbolList symbols(QgsRenderContext &context) const override
Proxy that will call this method on the embedded renderer.
QgsExpressionContext & expressionContext()
Gets the expression context.
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygon.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
QRectF toRectF() const
Returns a QRectF with same coordinates as the rectangle.
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
bool renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false) override SIP_THROW(QgsCsException)
Renders a given feature.
QgsInvertedPolygonRenderer(QgsFeatureRenderer *embeddedRenderer=nullptr)
Constructor.
void CORE_EXPORT save(QDomElement &elem) const
Serialize to XML.
void setLegendSymbolItem(const QString &key, QgsSymbol *symbol) override
Sets the symbol to be used for a legend symbol item.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
bool legendSymbolItemsCheckable() const override
items of symbology items in legend should be checkable
void stopRender(QgsRenderContext &context) override
The actual rendering will take place here.
const QgsFeatureRenderer * embeddedRenderer() const override
Returns the current embedded renderer (subrenderer) for this feature renderer.
static QgsFeatureRenderer * defaultRenderer(QgsWkbTypes::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
static Type flatType(Type type)
Returns the flat type for a WKB type.
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
bool filterNeedsGeometry() const override
Returns true if this renderer requires the geometry to apply the filter.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
QgsSymbolList symbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const override
Proxy that will call this method on the embedded renderer.
void setEmbeddedRenderer(QgsFeatureRenderer *subRenderer) override
Sets an embedded renderer (subrenderer) for this feature renderer.
double height() const
Returns the height of the rectangle.
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other...