27 #include <QDomDocument> 28 #include <QDomElement> 32 , mPreprocessingEnabled( false )
52 mSubRenderer.reset( const_cast<QgsFeatureRendererV2*>( subRenderer )->
clone() );
56 mSubRenderer.reset( 0 );
62 return mSubRenderer.data();
73 mSubRenderer->startRender( context, fields );
75 mFeaturesCategories.clear();
76 mSymbolCategories.clear();
77 mFeatureDecorations.clear();
91 QRect e( context.
painter()->viewport() );
93 e.adjust( -e.width()*5, -e.height()*5, e.width()*5, e.height()*5 );
96 exteriorRing << mtp.toMapCoordinates( e.topRight() );
97 exteriorRing << mtp.toMapCoordinates( e.bottomRight() );
98 exteriorRing << mtp.toMapCoordinates( e.bottomLeft() );
99 exteriorRing << mtp.toMapCoordinates( e.topLeft() );
114 QRect v( context.
painter()->viewport() );
115 mContext.
setExtent(
QgsRectangle( mtp.toMapCoordinates( v.topLeft() ), mtp.toMapCoordinates( v.bottomRight() ) ) );
119 mExtentPolygon.clear();
120 mExtentPolygon.append( exteriorRing );
131 if ( selected || drawVertexMarker )
133 mFeatureDecorations.append( FeatureDecoration( feature, selected, drawVertexMarker, layer ) );
157 catId.append( reinterpret_cast<const char*>( &sym ),
sizeof( sym ) );
162 QgsSymbolV2* sym = mSubRenderer->symbolForFeature( feature );
165 catId.append( reinterpret_cast<const char*>( &sym ),
sizeof( sym ) );
169 if ( catId.isEmpty() )
174 if ( ! mSymbolCategories.contains( catId ) )
176 CombinedFeature cFeat;
178 cFeat.feature = feature;
179 mSymbolCategories.insert( catId, mSymbolCategories.count() );
180 mFeaturesCategories.append( cFeat );
184 CombinedFeature& cFeat = mFeaturesCategories[ mSymbolCategories[catId] ];
197 if ( mPreprocessingEnabled )
200 if ( ! geom->isGeosValid() )
202 geom.reset( geom->buffer( 0, 0 ) );
210 cFeat.geometries.append( geom.take() );
226 for ( FeatureCategoryVector::iterator cit = mFeaturesCategories.begin(); cit != mFeaturesCategories.end(); ++cit )
229 if ( mPreprocessingEnabled )
251 finalMulti.append( mExtentPolygon );
266 for (
int i = 0; i < multi.size(); i++ )
272 if ( exterior.count() < 4 || exterior[0] != exterior[exterior.count() - 1] )
274 finalMulti[0].append( exterior );
277 for (
int j = 1; j < multi[i].size(); j++ )
280 new_poly.append( multi[i][j] );
281 finalMulti.append( new_poly );
288 mSubRenderer->renderFeature( feat, mContext );
290 for ( FeatureCategoryVector::iterator cit = mFeaturesCategories.begin(); cit != mFeaturesCategories.end(); ++cit )
302 if ( mFeaturesCategories.isEmpty() )
307 mSubRenderer->renderFeature( feat, mContext );
311 foreach ( FeatureDecoration deco, mFeatureDecorations )
313 mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers );
316 mSubRenderer->stopRender( mContext );
323 return "INVERTED: NULL";
325 return "INVERTED [" + mSubRenderer->dump() +
"]";
331 if ( mSubRenderer.isNull() )
347 QDomElement embeddedRendererElem = element.firstChildElement(
"renderer-v2" );
348 if ( !embeddedRendererElem.isNull() )
359 rendererElem.setAttribute(
"type",
"invertedPolygonRenderer" );
364 QDomElement embeddedRendererElem = mSubRenderer->save( doc );
365 rendererElem.appendChild( embeddedRendererElem );
377 return mSubRenderer->symbolForFeature( feature );
384 return mSubRenderer->originalSymbolForFeature( feat );
393 return mSubRenderer->symbolsForFeature( feature );
400 return mSubRenderer->originalSymbolsForFeature( feat );
409 return mSubRenderer->symbols();
418 return mSubRenderer->capabilities();
425 return QList<QString>();
427 return mSubRenderer->usedAttributes();
436 return mSubRenderer->legendSymbologyItems( iconSize );
445 return mSubRenderer->legendSymbolItems( scaleDenominator, rule );
454 return mSubRenderer->willRenderFeature( feat );
459 if ( renderer->
type() ==
"invertedPolygonRenderer" )
464 if ( renderer->
type() ==
"singleSymbol" ||
465 renderer->
type() ==
"categorizedSymbol" ||
466 renderer->
type() ==
"graduatedSymbol" ||
467 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.
virtual bool renderFeature(QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false) override
Renders a given feature.
QList< QgsSymbolV2 * > QgsSymbolV2List
virtual QgsLegendSymbolList legendSymbolItems(double scaleDenominator=-1, QString rule="") override
Proxy that will call this method on the embedded renderer.
QVector< QgsPoint > QgsPolyline
polyline is represented as a vector of points
static QgsInvertedPolygonRenderer * convertFromRenderer(const QgsFeatureRendererV2 *renderer)
creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
QgsGeometry * geometry() const
Get the geometry object associated with this feature.
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.
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
QgsGeometry * difference(QgsGeometry *geometry)
Returns a geometry representing the points making up this geometry that do not make up other...
void setExtent(const QgsRectangle &extent)
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 (deep copy)
virtual QgsFeatureRendererV2 * clone() const override
Used to clone this feature renderer.
QgsInvertedPolygonRenderer is a polygon-only feature renderer used to display features inverted...
void setPreprocessingEnabled(bool enabled)
bool preprocessingEnabled() const
virtual QgsSymbolV2List symbols() override
Proxy that will call this method on the embedded renderer.
QVector< QgsPolygon > QgsMultiPolygon
a collection of QgsPolygons that share a common collection of attributes
QGis::WkbType wkbType() const
Returns type of wkb (point / linestring / polygon etc.)
QVector< QgsPolyline > QgsPolygon
polygon: first item of the list is outer ring, inner rings (if any) start from second item ...
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.
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.
QgsPoint toMapCoordinates(int x, int y) const
Contains information about the context of a rendering operation.
const QgsFeatureRendererV2 * embeddedRenderer() const
static QgsFeatureRendererV2 * load(QDomElement &symbologyElem)
create a renderer from XML element
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.
static QgsGeometry * fromMultiPolygon(const QgsMultiPolygon &multipoly)
construct geometry from a multipolygon
static QgsGeometry * fromPolygon(const QgsPolygon &polygon)
construct geometry from a polygon
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.
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.
virtual bool willRenderFeature(QgsFeature &feat) override
Proxy that will call this method on the embedded renderer.