QGIS API Documentation 4.3.0-Master (0de80482b60)
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
70std::unique_ptr<QgsFeatureRenderer> QgsInvertedPolygonRenderer::create( QDomElement &element, const QgsReadWriteContext &context ) // cppcheck-suppress duplInheritedMember
71{
72 auto r = std::make_unique<QgsInvertedPolygonRenderer>();
73 //look for an embedded renderer <renderer-v2>
74 QDomElement embeddedRendererElem = element.firstChildElement( u"renderer-v2"_s );
75 if ( !embeddedRendererElem.isNull() )
76 {
77 std::unique_ptr<QgsFeatureRenderer> renderer = QgsFeatureRenderer::load( embeddedRendererElem, context );
78 r->setEmbeddedRenderer( renderer.release() );
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
103std::unique_ptr<QgsInvertedPolygonRenderer> QgsInvertedPolygonRenderer::convertFromRenderer( const QgsFeatureRenderer *renderer ) // cppcheck-suppress duplInheritedMember
104{
105 if ( renderer->type() == "invertedPolygonRenderer"_L1 )
106 {
107 return std::unique_ptr<QgsInvertedPolygonRenderer>( dynamic_cast<QgsInvertedPolygonRenderer *>( renderer->clone() ) );
108 }
109 else if ( renderer->type() == "singleSymbol"_L1 || renderer->type() == "categorizedSymbol"_L1 || renderer->type() == "graduatedSymbol"_L1 || renderer->type() == "RuleRenderer"_L1 )
110 {
111 auto res = std::make_unique< QgsInvertedPolygonRenderer >( renderer->clone() );
112 renderer->copyRendererData( res.get() );
113 return res;
114 }
115 else if ( renderer->type() == "mergedFeatureRenderer"_L1 )
116 {
117 auto res = std::make_unique< QgsInvertedPolygonRenderer >( renderer->embeddedRenderer() ? renderer->embeddedRenderer()->clone() : nullptr );
118 renderer->copyRendererData( res.get() );
119 return res;
120 }
121 return nullptr;
122}
@ Polygon
Polygons.
Definition qgis.h:382
static std::unique_ptr< QgsFeatureRenderer > load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
QgsFeatureRenderer(const QString &type)
QString type() const
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
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.
static std::unique_ptr< QgsFeatureRenderer > defaultRenderer(Qgis::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
static std::unique_ptr< QgsInvertedPolygonRenderer > convertFromRenderer(const QgsFeatureRenderer *renderer)
Creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
bool preprocessingEnabled() const
Returns true if the geometries are to be preprocessed (merged with an union) before rendering.
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.
static std::unique_ptr< QgsFeatureRenderer > create(QDomElement &element, const QgsReadWriteContext &context)
Creates a renderer out of an XML, for loading.
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.
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