28 #include <QDomDocument>
29 #include <QDomElement>
33 , mPreprocessingEnabled( false )
53 mSubRenderer.
reset( const_cast<QgsFeatureRendererV2*>( subRenderer )->
clone() );
57 mSubRenderer.
reset( 0 );
63 return mSubRenderer.
data();
74 mSubRenderer->startRender( context, fields );
76 mFeaturesCategories.
clear();
77 mSymbolCategories.
clear();
78 mFeatureDecorations.
clear();
94 e.
adjust( -e.width()*5, -e.height()*5, e.width()*5, e.height()*5 );
96 exteriorRing << mtp.toMapCoordinates( e.topLeft() );
97 exteriorRing << mtp.toMapCoordinates( e.topRight() );
98 exteriorRing << mtp.toMapCoordinates( e.bottomRight() );
99 exteriorRing << mtp.toMapCoordinates( e.bottomLeft() );
100 exteriorRing << mtp.toMapCoordinates( e.topLeft() );
116 mContext.
setExtent(
QgsRectangle( mtp.toMapCoordinates( v.topLeft() ), mtp.toMapCoordinates( v.bottomRight() ) ) );
120 mExtentPolygon.
clear();
121 mExtentPolygon.
append( exteriorRing );
132 if ( selected || drawVertexMarker )
134 mFeatureDecorations.
append( FeatureDecoration( feature, selected, drawVertexMarker, layer ) );
158 catId.
append( reinterpret_cast<const char*>( &sym ),
sizeof( sym ) );
163 QgsSymbolV2* sym = mSubRenderer->symbolForFeature( feature );
166 catId.
append( reinterpret_cast<const char*>( &sym ),
sizeof( sym ) );
175 if ( ! mSymbolCategories.
contains( catId ) )
177 CombinedFeature cFeat;
179 cFeat.feature = feature;
180 mSymbolCategories.
insert( catId, mSymbolCategories.
count() );
181 mFeaturesCategories.
append( cFeat );
185 CombinedFeature& cFeat = mFeaturesCategories[ mSymbolCategories[catId] ];
195 geom->transform( *xform );
198 if ( mPreprocessingEnabled )
201 if ( ! geom->isGeosValid() )
203 geom.
reset( geom->buffer( 0, 0 ) );
211 cFeat.geometries.append( geom.
take() );
230 if ( mPreprocessingEnabled )
236 QgsGeometry *
final = rect->difference( const_cast<QgsGeometry*>( unioned.
data() ) );
252 finalMulti.
append( mExtentPolygon );
267 for (
int i = 0; i < multi.
size(); i++ )
273 if ( exterior.
count() < 4 || exterior[0] != exterior[exterior.
count() - 1] )
275 finalMulti[0].
append( exterior );
278 for (
int j = 1; j < multi[i].
size(); j++ )
281 new_poly.
append( multi[i][j] );
282 finalMulti.
append( new_poly );
289 mSubRenderer->renderFeature( feat, mContext );
303 if ( mFeaturesCategories.
isEmpty() )
308 mSubRenderer->renderFeature( feat, mContext );
312 foreach ( FeatureDecoration deco, mFeatureDecorations )
314 mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers );
317 mSubRenderer->stopRender( mContext );
324 return "INVERTED: NULL";
326 return "INVERTED [" + mSubRenderer->dump() +
"]";
332 if ( mSubRenderer.
isNull() )
350 if ( !embeddedRendererElem.
isNull() )
361 rendererElem.
setAttribute(
"type",
"invertedPolygonRenderer" );
366 QDomElement embeddedRendererElem = mSubRenderer->save( doc );
382 return mSubRenderer->symbolForFeature( feature );
389 return mSubRenderer->originalSymbolForFeature( feat );
398 return mSubRenderer->symbolsForFeature( feature );
405 return mSubRenderer->originalSymbolsForFeature( feat );
414 return mSubRenderer->symbols();
423 return mSubRenderer->capabilities();
432 return mSubRenderer->usedAttributes();
441 return mSubRenderer->legendSymbologyItems( iconSize );
450 return mSubRenderer->legendSymbolItems( scaleDenominator, rule );
459 return mSubRenderer->willRenderFeature( feat );
464 if ( renderer->
type() ==
"invertedPolygonRenderer" )
469 if ( renderer->
type() ==
"singleSymbol" ||
470 renderer->
type() ==
"categorizedSymbol" ||
471 renderer->
type() ==
"graduatedSymbol" ||
472 renderer->
type() ==
"RuleRenderer" )
virtual ~QgsInvertedPolygonRenderer()
#define RENDERER_TAG_NAME
A rectangle specified with double values.
virtual QgsSymbolV2 * symbolForFeature(QgsFeature &feature) override
Proxy that will call this method on the embedded renderer.
bool contains(const Key &key) const
virtual bool renderFeature(QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false) override
Renders a given feature.
QList< QgsSymbolV2 * > QgsSymbolV2List
QDomNode appendChild(const QDomNode &newChild)
void append(const T &value)
QString attribute(const QString &name, const QString &defValue) const
virtual QgsLegendSymbolList legendSymbolItems(double scaleDenominator=-1, QString rule="") override
Proxy that will call this method on the embedded renderer.
static QgsInvertedPolygonRenderer * convertFromRenderer(const QgsFeatureRendererV2 *renderer)
creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
QgsPolygon asPolygon() const
Return contents of the geometry as a polygon if wkbType is WKBPolygon, otherwise an empty list...
Container of fields for a vector layer.
A geometry is the spatial representation of a feature.
QgsInvertedPolygonRenderer(const QgsFeatureRendererV2 *embeddedRenderer=0)
Constructor.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
virtual QString dump() const override
const QgsCoordinateTransform * coordinateTransform() const
void setExtent(const QgsRectangle &extent)
QgsPaintEffect * mPaintEffect
QgsMultiPolygon asMultiPolygon() const
Return contents of the geometry as a multi polygon if wkbType is WKBMultiPolygon, otherwise an empty ...
void setCoordinateTransform(const QgsCoordinateTransform *t)
Sets coordinate transformation.
void setEmbeddedRenderer(const QgsFeatureRendererV2 *subRenderer)
sets the embedded renderer
virtual void startRender(QgsRenderContext &context, const QgsFields &fields) override
Perform transforms between map coordinates and device coordinates.
virtual QgsFeatureRendererV2 * clone() const =0
void setGeometry(const QgsGeometry &geom)
Set this feature's geometry from another QgsGeometry object.
void append(const T &value)
virtual QgsFeatureRendererV2 * clone() const override
Used to clone this feature renderer.
QgsInvertedPolygonRenderer is a polygon-only feature renderer used to display features inverted...
void setAttribute(const QString &name, const QString &value)
void setPreprocessingEnabled(bool enabled)
bool preprocessingEnabled() const
int toInt(bool *ok, int base) const
virtual QgsSymbolV2List symbols() override
Proxy that will call this method on the embedded renderer.
QGis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
static QgsFeatureRendererV2 * defaultRenderer(QGis::GeometryType geomType)
return a new renderer - used by default in vector layers
virtual QgsSymbolV2List originalSymbolsForFeature(QgsFeature &feat) override
Proxy that will call this method on the embedded renderer.
QList< QPair< QString, QPixmap > > QgsLegendSymbologyList
virtual QList< QString > usedAttributes() override
Proxy that will call this method on the embedded renderer.
QByteArray & append(char ch)
virtual QDomElement save(QDomDocument &doc) override
Creates an XML representation of the renderer.
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize) override
Proxy that will call this method on the embedded renderer.
virtual bool saveProperties(QDomDocument &doc, QDomElement &element) const
Saves the current state of the effect to a DOM element.
Contains information about the context of a rendering operation.
const QgsFeatureRendererV2 * embeddedRenderer() const
void copyPaintEffect(QgsFeatureRendererV2 *destRenderer) const
Copies paint effect of this renderer to another renderer.
static QgsFeatureRendererV2 * load(QDomElement &symbologyElem)
create a renderer from XML element
QDomElement firstChildElement(const QString &tagName) const
int count(const T &value) const
void adjust(int dx1, int dy1, int dx2, int dy2)
const QgsGeometry * constGeometry() const
Gets a const pointer to the geometry object associated with this feature.
virtual int capabilities() override
Proxy that will call this method on the embedded renderer.
const QgsMapToPixel & mapToPixel() const
static QgsGeometry * unaryUnion(const QList< QgsGeometry * > &geometryList)
compute the unary union on a list of geometries.
iterator insert(const Key &key, const T &value)
static QgsGeometry * fromMultiPolygon(const QgsMultiPolygon &multipoly)
Creates a new geometry from a QgsMultiPolygon.
static QgsGeometry * fromPolygon(const QgsPolygon &polygon)
Creates a new geometry from a QgsPolygon.
virtual void stopRender(QgsRenderContext &context) override
The actual rendering will take place here.
static QgsFeatureRendererV2 * create(QDomElement &element)
Creates a renderer out of an XML, for loading.
QDomElement createElement(const QString &tagName)
virtual QgsSymbolV2 * originalSymbolForFeature(QgsFeature &feat) override
Proxy that will call this method on the embedded renderer.
QList< QPair< QString, QgsSymbolV2 * > > QgsLegendSymbolList
virtual QgsSymbolV2List symbolsForFeature(QgsFeature &feat) override
Proxy that will call this method on the embedded renderer.
int count(const Key &key) const
virtual bool willRenderFeature(QgsFeature &feat) override
Proxy that will call this method on the embedded renderer.