QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgsinvertedpolygonrenderer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsinvertedpolygonrenderer.cpp
3 ---------------------
4 begin : April 2014
5 copyright : (C) 2014 Hugo Mercier / Oslandia
6 email : hugo dot mercier at oslandia dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgsfeature.h"
19#include "qgslogger.h"
20#include "qgsogcutils.h"
21#include "qgspainteffect.h"
24#include "qgssymbol.h"
25#include "qgssymbollayer.h"
26#include "qgssymbollayerutils.h"
27#include "qgsvectorlayer.h"
28
29#include <QDomDocument>
30#include <QDomElement>
31
33 : QgsMergedFeatureRenderer( QStringLiteral( "invertedPolygonRenderer" ), subRenderer )
34{
35 if ( !subRenderer )
36 {
38 }
40}
41
43{
44 if ( !mSubRenderer )
45 {
46 return QStringLiteral( "INVERTED: NULL" );
47 }
48 return "INVERTED [" + mSubRenderer->dump() + ']';
49}
50
52{
53 QgsInvertedPolygonRenderer *newRenderer = nullptr;
54 if ( !mSubRenderer )
55 {
56 newRenderer = new QgsInvertedPolygonRenderer( nullptr );
57 }
58 else
59 {
60 newRenderer = new QgsInvertedPolygonRenderer( mSubRenderer->clone() );
61 }
63 copyRendererData( newRenderer );
64 return newRenderer;
65}
66
67QgsFeatureRenderer *QgsInvertedPolygonRenderer::create( QDomElement &element, const QgsReadWriteContext &context ) // cppcheck-suppress duplInheritedMember
68{
70 //look for an embedded renderer <renderer-v2>
71 QDomElement embeddedRendererElem = element.firstChildElement( QStringLiteral( "renderer-v2" ) );
72 if ( !embeddedRendererElem.isNull() )
73 {
74 QgsFeatureRenderer *renderer = QgsFeatureRenderer::load( embeddedRendererElem, context );
75 r->setEmbeddedRenderer( renderer );
76 }
77 r->setPreprocessingEnabled( element.attribute( QStringLiteral( "preprocessing" ), QStringLiteral( "0" ) ).toInt() == 1 );
78 return r;
79}
80
81QDomElement QgsInvertedPolygonRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context )
82{
83 // clazy:skip
84
85 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
86 rendererElem.setAttribute( QStringLiteral( "type" ), QStringLiteral( "invertedPolygonRenderer" ) );
87 rendererElem.setAttribute( QStringLiteral( "preprocessing" ), preprocessingEnabled() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
88
89 if ( mSubRenderer )
90 {
91 const QDomElement embeddedRendererElem = mSubRenderer->save( doc, context );
92 rendererElem.appendChild( embeddedRendererElem );
93 }
94
95 saveRendererData( doc, rendererElem, context );
96
97 return rendererElem;
98}
99
101{
102 if ( renderer->type() == QLatin1String( "invertedPolygonRenderer" ) )
103 {
104 return dynamic_cast<QgsInvertedPolygonRenderer *>( renderer->clone() );
105 }
106 else if ( renderer->type() == QLatin1String( "singleSymbol" ) ||
107 renderer->type() == QLatin1String( "categorizedSymbol" ) ||
108 renderer->type() == QLatin1String( "graduatedSymbol" ) ||
109 renderer->type() == QLatin1String( "RuleRenderer" ) )
110 {
111 auto res = std::make_unique< QgsInvertedPolygonRenderer >( renderer->clone() );
112 renderer->copyRendererData( res.get() );
113 return res.release();
114 }
115 else if ( renderer->type() == QLatin1String( "mergedFeatureRenderer" ) )
116 {
117 auto res = std::make_unique< QgsInvertedPolygonRenderer >( renderer->embeddedRenderer() ? renderer->embeddedRenderer()->clone() : nullptr );
118 renderer->copyRendererData( res.get() );
119 return res.release();
120 }
121 return nullptr;
122}
123
@ Polygon
Polygons.
Definition qgis.h:361
QgsFeatureRenderer(const QString &type)
static QgsFeatureRenderer * defaultRenderer(Qgis::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
QString type() const
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
static QgsFeatureRenderer * load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
void saveRendererData(QDomDocument &doc, QDomElement &element, const QgsReadWriteContext &context)
Saves generic renderer data into the specified element.
virtual const QgsFeatureRenderer * embeddedRenderer() const
Returns the current embedded renderer (subrenderer) for this feature renderer.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
bool preprocessingEnabled() const
Returns true if the geometries are to be preprocessed (merged with an union) before rendering.
static QgsInvertedPolygonRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
static QgsFeatureRenderer * create(QDomElement &element, const QgsReadWriteContext &context)
Creates a renderer out of an XML, for loading.
void setPreprocessingEnabled(bool enabled)
Sets whether geometries preprocessing is enabled.
QString dump() const override
Returns debug information about this renderer.
QgsInvertedPolygonRenderer * clone() const override
Create a deep copy of this renderer.
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) override
Stores renderer properties to an XML element.
QgsInvertedPolygonRenderer(QgsFeatureRenderer *embeddedRenderer=nullptr)
Constructor.
QgsMergedFeatureRenderer(QgsFeatureRenderer *embeddedRenderer)
Constructor for QgsMergedFeatureRenderer.
@ InvertOnly
Invert features only (polygons only).
GeometryOperation mOperation
Operation to apply to collected geometries.
void setEmbeddedRenderer(QgsFeatureRenderer *subRenderer) override
Sets an embedded renderer (subrenderer) for this feature renderer.
std::unique_ptr< QgsFeatureRenderer > mSubRenderer
Embedded renderer.
A container for the context for various read/write operations on objects.
#define RENDERER_TAG_NAME
Definition qgsrenderer.h:55