QGIS API Documentation 3.99.0-Master (d270888f95f)
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#include <QString>
32
33using namespace Qt::StringLiterals;
34
36 : QgsMergedFeatureRenderer( u"invertedPolygonRenderer"_s, subRenderer )
37{
38 if ( !subRenderer )
39 {
41 }
43}
44
46{
47 if ( !mSubRenderer )
48 {
49 return u"INVERTED: NULL"_s;
50 }
51 return "INVERTED [" + mSubRenderer->dump() + ']';
52}
53
55{
56 QgsInvertedPolygonRenderer *newRenderer = nullptr;
57 if ( !mSubRenderer )
58 {
59 newRenderer = new QgsInvertedPolygonRenderer( nullptr );
60 }
61 else
62 {
63 newRenderer = new QgsInvertedPolygonRenderer( mSubRenderer->clone() );
64 }
66 copyRendererData( newRenderer );
67 return newRenderer;
68}
69
70QgsFeatureRenderer *QgsInvertedPolygonRenderer::create( QDomElement &element, const QgsReadWriteContext &context ) // cppcheck-suppress duplInheritedMember
71{
73 //look for an embedded renderer <renderer-v2>
74 QDomElement embeddedRendererElem = element.firstChildElement( u"renderer-v2"_s );
75 if ( !embeddedRendererElem.isNull() )
76 {
77 QgsFeatureRenderer *renderer = QgsFeatureRenderer::load( embeddedRendererElem, context );
78 r->setEmbeddedRenderer( renderer );
79 }
80 r->setPreprocessingEnabled( element.attribute( u"preprocessing"_s, u"0"_s ).toInt() == 1 );
81 return r;
82}
83
84QDomElement QgsInvertedPolygonRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context )
85{
86 // clazy:skip
87
88 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
89 rendererElem.setAttribute( u"type"_s, u"invertedPolygonRenderer"_s );
90 rendererElem.setAttribute( u"preprocessing"_s, preprocessingEnabled() ? u"1"_s : u"0"_s );
91
92 if ( mSubRenderer )
93 {
94 const QDomElement embeddedRendererElem = mSubRenderer->save( doc, context );
95 rendererElem.appendChild( embeddedRendererElem );
96 }
97
98 saveRendererData( doc, rendererElem, context );
99
100 return rendererElem;
101}
102
104{
105 if ( renderer->type() == "invertedPolygonRenderer"_L1 )
106 {
107 return dynamic_cast<QgsInvertedPolygonRenderer *>( renderer->clone() );
108 }
109 else if ( renderer->type() == "singleSymbol"_L1 ||
110 renderer->type() == "categorizedSymbol"_L1 ||
111 renderer->type() == "graduatedSymbol"_L1 ||
112 renderer->type() == "RuleRenderer"_L1 )
113 {
114 auto res = std::make_unique< QgsInvertedPolygonRenderer >( renderer->clone() );
115 renderer->copyRendererData( res.get() );
116 return res.release();
117 }
118 else if ( renderer->type() == "mergedFeatureRenderer"_L1 )
119 {
120 auto res = std::make_unique< QgsInvertedPolygonRenderer >( renderer->embeddedRenderer() ? renderer->embeddedRenderer()->clone() : nullptr );
121 renderer->copyRendererData( res.get() );
122 return res.release();
123 }
124 return nullptr;
125}
126
@ Polygon
Polygons.
Definition qgis.h:368
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:57