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 ) );
187 catId.append( reinterpret_cast<const char *>( &sym ),
sizeof( sym ) );
192 QgsSymbol *sym = mSubRenderer->symbolForFeature( feature, context );
195 catId.append( reinterpret_cast<const char *>( &sym ),
sizeof( sym ) );
199 if ( catId.isEmpty() )
204 if ( ! mSymbolCategories.contains( catId ) )
206 CombinedFeature cFeat;
208 cFeat.feature = feature;
209 mSymbolCategories.insert( catId, mSymbolCategories.count() );
210 mFeaturesCategories.append( cFeat );
214 CombinedFeature &cFeat = mFeaturesCategories[ mSymbolCategories[catId] ];
227 if ( mPreprocessingEnabled )
232 geom = geom.
buffer( 0, 0 );
240 cFeat.geometries.append( geom );
250 mSubRenderer->stopRender( mContext );
266 Q_FOREACH (
const CombinedFeature &cit, mFeaturesCategories )
268 finalMulti.resize( 0 );
270 if ( mPreprocessingEnabled )
292 finalMulti.append( mExtentPolygon );
293 Q_FOREACH (
const QgsGeometry &geom, cit.geometries )
307 for (
int i = 0; i < multi.size(); i++ )
313 if ( exterior.count() < 4 || exterior[0] != exterior[exterior.count() - 1] )
315 finalMulti[0].append( exterior );
318 for (
int j = 1; j < multi[i].size(); j++ )
321 newPoly.append( multi[i][j] );
322 finalMulti.append( newPoly );
331 mSubRenderer->renderFeature( feat, mContext );
339 if ( mFeaturesCategories.isEmpty() )
344 mSubRenderer->renderFeature( feat, mContext );
348 Q_FOREACH ( FeatureDecoration deco, mFeatureDecorations )
350 mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers );
353 mSubRenderer->stopRender( mContext );
360 return QStringLiteral(
"INVERTED: NULL" );
362 return "INVERTED [" + mSubRenderer->dump() +
']';
385 QDomElement embeddedRendererElem = element.firstChildElement( QStringLiteral(
"renderer-v2" ) );
386 if ( !embeddedRendererElem.isNull() )
391 r->
setPreprocessingEnabled( element.attribute( QStringLiteral(
"preprocessing" ), QStringLiteral(
"0" ) ).toInt() == 1 );
400 rendererElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"invertedPolygonRenderer" ) );
401 rendererElem.setAttribute( QStringLiteral(
"preprocessing" ),
preprocessingEnabled() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
402 rendererElem.setAttribute( QStringLiteral(
"forceraster" ), (
mForceRaster ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) ) );
406 QDomElement embeddedRendererElem = mSubRenderer->save( doc, context );
407 rendererElem.appendChild( embeddedRendererElem );
415 QDomElement
orderBy = doc.createElement( QStringLiteral(
"orderby" ) );
417 rendererElem.appendChild( orderBy );
419 rendererElem.setAttribute( QStringLiteral(
"enableorderby" ), (
mOrderByEnabled ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) ) );
430 return mSubRenderer->symbolForFeature( feature, context );
437 return mSubRenderer->originalSymbolForFeature( feature, context );
446 return mSubRenderer->symbolsForFeature( feature, context );
453 return mSubRenderer->originalSymbolsForFeature( feature, context );
462 return mSubRenderer->symbols( context );
471 return mSubRenderer->capabilities();
478 return QSet<QString>();
480 return mSubRenderer->usedAttributes( context );
485 return mSubRenderer ? mSubRenderer->filterNeedsGeometry() :
false;
494 return mSubRenderer->legendSymbolItems();
503 return mSubRenderer->willRenderFeature( feature, context );
508 if ( renderer->
type() == QLatin1String(
"invertedPolygonRenderer" ) )
513 if ( renderer->
type() == QLatin1String(
"singleSymbol" ) ||
514 renderer->
type() == QLatin1String(
"categorizedSymbol" ) ||
515 renderer->
type() == QLatin1String(
"graduatedSymbol" ) ||
516 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.
void CORE_EXPORT save(QDomElement &elem) const
Serialize to XML.
bool isGeosValid(QgsGeometry::ValidityFlags flags=nullptr) const
Checks validity of the geometry using GEOS.
May use more than one symbol to render a feature: symbolsForFeature() will return them...
QRectF toRectF() const
Returns a QRectF with same coordinates as the rectangle.
bool legendSymbolItemChecked(const QString &key) override
items of symbology items in legend is checked
QList< QgsLegendSymbolItem > QgsLegendSymbolList
QgsFeatureRequest::OrderBy mOrderBy
bool isNull() const
Returns true if the geometry is null (ie, contains no underlying geometry accessible via geometry() )...
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.
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
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...
QgsRectangle mapExtent() const
Returns the original extent of the map being rendered.
QgsInvertedPolygonRenderer * clone() const override
Create a deep copy of this renderer.
Container of fields for a vector layer.
A geometry is the spatial representation of a feature.
#define RENDERER_TAG_NAME
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.
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...
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.
QgsMultiPolygonXY asMultiPolygon() const
Returns contents of the geometry as a multi polygon if wkbType is WKBMultiPolygon, otherwise an empty list.
void startRender(QgsRenderContext &context, const QgsFields &fields) override
Must be called when a new render cycle is started.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
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.
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...
QgsRectangle buffered(double width) const
Gets rectangle enlarged by buffer.
bool renderingStopped() const
Returns TRUE if the rendering operation has been stopped and any ongoing rendering should be canceled...
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.
QgsLegendSymbolList legendSymbolItems() const override
Proxy that will call this method on the embedded renderer.
void setPreprocessingEnabled(bool enabled)
bool preprocessingEnabled() const
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other...
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.
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
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.
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 copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
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.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
bool legendSymbolItemsCheckable() const override
items of symbology items in legend should be checkable
QgsFeatureRequest::OrderBy orderBy() const
Gets the order in which features shall be processed by this renderer.
void stopRender(QgsRenderContext &context) override
The actual rendering will take place here.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
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.
double width() const
Returns the width of the rectangle.
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.
QgsPolygonXY asPolygon() const
Returns the contents of the geometry as a polygon.