mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-16 00:03:12 -04:00
Fixed indentation
This commit is contained in:
parent
3853fc232a
commit
25346fe98f
@ -5,76 +5,76 @@ class QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
|
|||||||
%End
|
%End
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** Constructor
|
/** Constructor
|
||||||
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned
|
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned
|
||||||
*/
|
*/
|
||||||
QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = 0 );
|
QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = 0 );
|
||||||
virtual ~QgsInvertedPolygonRenderer();
|
virtual ~QgsInvertedPolygonRenderer();
|
||||||
|
|
||||||
/** Used to clone this feature renderer.*/
|
/** Used to clone this feature renderer.*/
|
||||||
virtual QgsFeatureRendererV2* clone();
|
virtual QgsFeatureRendererV2* clone();
|
||||||
|
|
||||||
virtual void startRender( QgsRenderContext& context, const QgsFields& fields );
|
virtual void startRender( QgsRenderContext& context, const QgsFields& fields );
|
||||||
|
|
||||||
/** Renders a given feature.
|
/** Renders a given feature.
|
||||||
* This will here collect features. The actual rendering will be postponed to stopRender()
|
* This will here collect features. The actual rendering will be postponed to stopRender()
|
||||||
* @param feature the feature to render
|
* @param feature the feature to render
|
||||||
* @param context the rendering context
|
* @param context the rendering context
|
||||||
* @param layer the symbol layer to render, if that makes sense
|
* @param layer the symbol layer to render, if that makes sense
|
||||||
* @param selected whether this feature has been selected (this will add decorations)
|
* @param selected whether this feature has been selected (this will add decorations)
|
||||||
* @param drawVertexMarker whether this feature has vertex markers (in edit mode usually)
|
* @param drawVertexMarker whether this feature has vertex markers (in edit mode usually)
|
||||||
* @returns true if the rendering was ok
|
* @returns true if the rendering was ok
|
||||||
*/
|
*/
|
||||||
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
|
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The actual rendering will take place here.
|
* The actual rendering will take place here.
|
||||||
* Features collected during renderFeature() are rendered using the embedded feature renderer
|
* Features collected during renderFeature() are rendered using the embedded feature renderer
|
||||||
*/
|
*/
|
||||||
virtual void stopRender( QgsRenderContext& context );
|
virtual void stopRender( QgsRenderContext& context );
|
||||||
|
|
||||||
/** @returns a textual reprensation of the renderer */
|
/** @returns a textual reprensation of the renderer */
|
||||||
virtual QString dump() const;
|
virtual QString dump() const;
|
||||||
|
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QList<QString> usedAttributes();
|
virtual QList<QString> usedAttributes();
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual int capabilities();
|
virtual int capabilities();
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsSymbolV2List symbols();
|
virtual QgsSymbolV2List symbols();
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature );
|
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature );
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
|
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
|
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual bool willRenderFeature( QgsFeature& feat );
|
virtual bool willRenderFeature( QgsFeature& feat );
|
||||||
|
|
||||||
/** Creates a renderer out of an XML, for loading*/
|
/** Creates a renderer out of an XML, for loading*/
|
||||||
static QgsFeatureRendererV2* create( QDomElement& element );
|
static QgsFeatureRendererV2* create( QDomElement& element );
|
||||||
|
|
||||||
/** Creates an XML representation of the renderer. Used for saving purpose
|
/** Creates an XML representation of the renderer. Used for saving purpose
|
||||||
* @param doc the XML document where to create the XML subtree
|
* @param doc the XML document where to create the XML subtree
|
||||||
* @returns the created XML subtree
|
* @returns the created XML subtree
|
||||||
*/
|
*/
|
||||||
virtual QDomElement save( QDomDocument& doc );
|
virtual QDomElement save( QDomDocument& doc );
|
||||||
|
|
||||||
/** sets the embedded renderer
|
/** sets the embedded renderer
|
||||||
* @param subRenderer the embedded renderer (will be cloned)
|
* @param subRenderer the embedded renderer (will be cloned)
|
||||||
*/
|
*/
|
||||||
void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer );
|
void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer );
|
||||||
/** @returns the current embedded renderer
|
/** @returns the current embedded renderer
|
||||||
*/
|
*/
|
||||||
const QgsFeatureRendererV2* embeddedRenderer() const;
|
const QgsFeatureRendererV2* embeddedRenderer() const;
|
||||||
/** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/
|
/** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/
|
||||||
|
|
||||||
bool preprocessingEnabled() const;
|
bool preprocessingEnabled() const;
|
||||||
/**
|
/**
|
||||||
@param enabled enables or disables the preprocessing.
|
@param enabled enables or disables the preprocessing.
|
||||||
When enabled, geometries will be merged with an union before being rendered.
|
When enabled, geometries will be merged with an union before being rendered.
|
||||||
It allows to fix some rendering artefacts (when rendering overlapping polygons for instance).
|
It allows to fix some rendering artefacts (when rendering overlapping polygons for instance).
|
||||||
This will involve some CPU-demanding computations and is thus disabled by default.
|
This will involve some CPU-demanding computations and is thus disabled by default.
|
||||||
*/
|
*/
|
||||||
void setPreprocessingEnabled( bool enabled );
|
void setPreprocessingEnabled( bool enabled );
|
||||||
};
|
};
|
||||||
|
@ -28,12 +28,14 @@
|
|||||||
#include <QDomElement>
|
#include <QDomElement>
|
||||||
|
|
||||||
QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* subRenderer )
|
QgsInvertedPolygonRenderer::QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* subRenderer )
|
||||||
: QgsFeatureRendererV2( "invertedPolygonRenderer" ), mPreprocessingEnabled( false )
|
: QgsFeatureRendererV2( "invertedPolygonRenderer" ), mPreprocessingEnabled( false )
|
||||||
{
|
{
|
||||||
if ( subRenderer ) {
|
if ( subRenderer )
|
||||||
|
{
|
||||||
setEmbeddedRenderer( subRenderer );
|
setEmbeddedRenderer( subRenderer );
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
mSubRenderer.reset( QgsFeatureRendererV2::defaultRenderer( QGis::Polygon ) );
|
mSubRenderer.reset( QgsFeatureRendererV2::defaultRenderer( QGis::Polygon ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -44,10 +46,12 @@ QgsInvertedPolygonRenderer::~QgsInvertedPolygonRenderer()
|
|||||||
|
|
||||||
void QgsInvertedPolygonRenderer::setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer )
|
void QgsInvertedPolygonRenderer::setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer )
|
||||||
{
|
{
|
||||||
if ( subRenderer ) {
|
if ( subRenderer )
|
||||||
mSubRenderer.reset( const_cast<QgsFeatureRendererV2*>(subRenderer)->clone() );
|
{
|
||||||
|
mSubRenderer.reset( const_cast<QgsFeatureRendererV2*>( subRenderer )->clone() );
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
mSubRenderer.reset( 0 );
|
mSubRenderer.reset( 0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -59,7 +63,8 @@ const QgsFeatureRendererV2* QgsInvertedPolygonRenderer::embeddedRenderer() const
|
|||||||
|
|
||||||
void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const QgsFields& fields )
|
void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const QgsFields& fields )
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +104,7 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q
|
|||||||
if ( context.coordinateTransform() )
|
if ( context.coordinateTransform() )
|
||||||
{
|
{
|
||||||
// disable projection
|
// disable projection
|
||||||
mContext.setCoordinateTransform(0);
|
mContext.setCoordinateTransform( 0 );
|
||||||
// recompute extent so that polygon clipping is correct
|
// recompute extent so that polygon clipping is correct
|
||||||
QRect v( context.painter()->viewport() );
|
QRect v( context.painter()->viewport() );
|
||||||
mContext.setExtent( QgsRectangle( mtp.toMapCoordinates( v.topLeft() ), mtp.toMapCoordinates( v.bottomRight() ) ) );
|
mContext.setExtent( QgsRectangle( mtp.toMapCoordinates( v.topLeft() ), mtp.toMapCoordinates( v.bottomRight() ) ) );
|
||||||
@ -107,7 +112,7 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q
|
|||||||
}
|
}
|
||||||
|
|
||||||
mExtentPolygon.clear();
|
mExtentPolygon.clear();
|
||||||
mExtentPolygon.append(exteriorRing);
|
mExtentPolygon.append( exteriorRing );
|
||||||
|
|
||||||
mSubRenderer->startRender( mContext, fields );
|
mSubRenderer->startRender( mContext, fields );
|
||||||
}
|
}
|
||||||
@ -122,7 +127,7 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
|
|||||||
// store this feature as a feature to render with decoration if needed
|
// store this feature as a feature to render with decoration if needed
|
||||||
if ( selected || drawVertexMarker )
|
if ( selected || drawVertexMarker )
|
||||||
{
|
{
|
||||||
mFeatureDecorations.append( FeatureDecoration( feature, selected, drawVertexMarker, layer) );
|
mFeatureDecorations.append( FeatureDecoration( feature, selected, drawVertexMarker, layer ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Features are grouped by category of symbols (returned by symbol(s)ForFeature)
|
// Features are grouped by category of symbols (returned by symbol(s)ForFeature)
|
||||||
@ -131,7 +136,7 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
|
|||||||
// that have transparency.
|
// that have transparency.
|
||||||
//
|
//
|
||||||
// In order to assign a unique category to a set of symbols
|
// In order to assign a unique category to a set of symbols
|
||||||
// during each rendering session (between startRender() and stopRender()),
|
// during each rendering session (between startRender() and stopRender()),
|
||||||
// we build an unique id as a QByteArray that is the concatenation
|
// we build an unique id as a QByteArray that is the concatenation
|
||||||
// of each symbol's memory address.
|
// of each symbol's memory address.
|
||||||
// The only assumption made here is that symbol(s)ForFeature will
|
// The only assumption made here is that symbol(s)ForFeature will
|
||||||
@ -140,19 +145,21 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
|
|||||||
// This QByteArray can then be used as a key for a QMap where the list of
|
// This QByteArray can then be used as a key for a QMap where the list of
|
||||||
// features for this category is stored
|
// features for this category is stored
|
||||||
QByteArray catId;
|
QByteArray catId;
|
||||||
if ( capabilities() & MoreSymbolsPerFeature ) {
|
if ( capabilities() & MoreSymbolsPerFeature )
|
||||||
|
{
|
||||||
QgsSymbolV2List syms( mSubRenderer->symbolsForFeature( feature ) );
|
QgsSymbolV2List syms( mSubRenderer->symbolsForFeature( feature ) );
|
||||||
foreach ( QgsSymbolV2* sym, syms )
|
foreach ( QgsSymbolV2* sym, syms )
|
||||||
{
|
{
|
||||||
// append the memory address
|
// append the memory address
|
||||||
catId.append( reinterpret_cast<const char*>(&sym), sizeof(sym) );
|
catId.append( reinterpret_cast<const char*>( &sym ), sizeof( sym ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QgsSymbolV2* sym = mSubRenderer->symbolForFeature( feature );
|
QgsSymbolV2* sym = mSubRenderer->symbolForFeature( feature );
|
||||||
if (sym) {
|
if ( sym )
|
||||||
catId.append( reinterpret_cast<const char*>(&sym), sizeof(sym) );
|
{
|
||||||
|
catId.append( reinterpret_cast<const char*>( &sym ), sizeof( sym ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,7 +168,7 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! mSymbolCategories.contains(catId) )
|
if ( ! mSymbolCategories.contains( catId ) )
|
||||||
{
|
{
|
||||||
// the exterior ring must be a square in the destination CRS
|
// the exterior ring must be a square in the destination CRS
|
||||||
CombinedFeature cFeat;
|
CombinedFeature cFeat;
|
||||||
@ -187,12 +194,14 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
|
|||||||
geom->transform( *xform );
|
geom->transform( *xform );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (geom->wkbType() == QGis::WKBPolygon) ||
|
if (( geom->wkbType() == QGis::WKBPolygon ) ||
|
||||||
(geom->wkbType() == QGis::WKBPolygon25D) ) {
|
( geom->wkbType() == QGis::WKBPolygon25D ) )
|
||||||
multi.append(geom->asPolygon() );
|
{
|
||||||
|
multi.append( geom->asPolygon() );
|
||||||
}
|
}
|
||||||
else if ( (geom->wkbType() == QGis::WKBMultiPolygon) ||
|
else if (( geom->wkbType() == QGis::WKBMultiPolygon ) ||
|
||||||
(geom->wkbType() == QGis::WKBMultiPolygon25D) ) {
|
( geom->wkbType() == QGis::WKBMultiPolygon25D ) )
|
||||||
|
{
|
||||||
multi = geom->asMultiPolygon();
|
multi = geom->asMultiPolygon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +211,7 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
|
|||||||
if ( ! cFeat.feature.geometry() )
|
if ( ! cFeat.feature.geometry() )
|
||||||
{
|
{
|
||||||
// first feature: add the current geometry
|
// first feature: add the current geometry
|
||||||
cFeat.feature.setGeometry( new QgsGeometry(*geom) );
|
cFeat.feature.setGeometry( new QgsGeometry( *geom ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -227,12 +236,14 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
|
|||||||
// No validity check is done, on purpose, it will be very slow and painting
|
// No validity check is done, on purpose, it will be very slow and painting
|
||||||
// operations do not need geometries to be valid
|
// operations do not need geometries to be valid
|
||||||
|
|
||||||
for ( int i = 0; i < multi.size(); i++ ) {
|
for ( int i = 0; i < multi.size(); i++ )
|
||||||
|
{
|
||||||
// add the exterior ring as interior ring to the first polygon
|
// add the exterior ring as interior ring to the first polygon
|
||||||
cFeat.multiPolygon[0].append( multi[i][0] );
|
cFeat.multiPolygon[0].append( multi[i][0] );
|
||||||
|
|
||||||
// add interior rings as new polygons
|
// add interior rings as new polygons
|
||||||
for ( int j = 1; j < multi[i].size(); j++ ) {
|
for ( int j = 1; j < multi[i].size(); j++ )
|
||||||
|
{
|
||||||
QgsPolygon new_poly;
|
QgsPolygon new_poly;
|
||||||
new_poly.append( multi[i][j] );
|
new_poly.append( multi[i][j] );
|
||||||
cFeat.multiPolygon.append( new_poly );
|
cFeat.multiPolygon.append( new_poly );
|
||||||
@ -244,7 +255,8 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
|
|||||||
|
|
||||||
void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
|
void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ( !context.painter() )
|
if ( !context.painter() )
|
||||||
@ -252,7 +264,7 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( FeatureCategoryMap::iterator cit = mFeaturesCategoryMap.begin(); cit != mFeaturesCategoryMap.end(); ++cit)
|
for ( FeatureCategoryMap::iterator cit = mFeaturesCategoryMap.begin(); cit != mFeaturesCategoryMap.end(); ++cit )
|
||||||
{
|
{
|
||||||
QgsFeature feat( cit->feature );
|
QgsFeature feat( cit->feature );
|
||||||
if ( !mPreprocessingEnabled )
|
if ( !mPreprocessingEnabled )
|
||||||
@ -289,7 +301,7 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// draw feature decorations
|
// draw feature decorations
|
||||||
foreach (FeatureDecoration deco, mFeatureDecorations )
|
foreach ( FeatureDecoration deco, mFeatureDecorations )
|
||||||
{
|
{
|
||||||
mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers );
|
mSubRenderer->renderFeature( deco.feature, mContext, deco.layer, deco.selected, deco.drawMarkers );
|
||||||
}
|
}
|
||||||
@ -299,7 +311,8 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
|
|||||||
|
|
||||||
QString QgsInvertedPolygonRenderer::dump() const
|
QString QgsInvertedPolygonRenderer::dump() const
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return "INVERTED: NULL";
|
return "INVERTED: NULL";
|
||||||
}
|
}
|
||||||
return "INVERTED [" + mSubRenderer->dump() + "]";
|
return "INVERTED [" + mSubRenderer->dump() + "]";
|
||||||
@ -350,7 +363,8 @@ QDomElement QgsInvertedPolygonRenderer::save( QDomDocument& doc )
|
|||||||
|
|
||||||
QgsSymbolV2* QgsInvertedPolygonRenderer::symbolForFeature( QgsFeature& feature )
|
QgsSymbolV2* QgsInvertedPolygonRenderer::symbolForFeature( QgsFeature& feature )
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return mSubRenderer->symbolForFeature( feature );
|
return mSubRenderer->symbolForFeature( feature );
|
||||||
@ -358,7 +372,8 @@ QgsSymbolV2* QgsInvertedPolygonRenderer::symbolForFeature( QgsFeature& feature )
|
|||||||
|
|
||||||
QgsSymbolV2List QgsInvertedPolygonRenderer::symbolsForFeature( QgsFeature& feature )
|
QgsSymbolV2List QgsInvertedPolygonRenderer::symbolsForFeature( QgsFeature& feature )
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return QgsSymbolV2List();
|
return QgsSymbolV2List();
|
||||||
}
|
}
|
||||||
return mSubRenderer->symbolsForFeature( feature );
|
return mSubRenderer->symbolsForFeature( feature );
|
||||||
@ -366,7 +381,8 @@ QgsSymbolV2List QgsInvertedPolygonRenderer::symbolsForFeature( QgsFeature& featu
|
|||||||
|
|
||||||
QgsSymbolV2List QgsInvertedPolygonRenderer::symbols()
|
QgsSymbolV2List QgsInvertedPolygonRenderer::symbols()
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return QgsSymbolV2List();
|
return QgsSymbolV2List();
|
||||||
}
|
}
|
||||||
return mSubRenderer->symbols();
|
return mSubRenderer->symbols();
|
||||||
@ -374,7 +390,8 @@ QgsSymbolV2List QgsInvertedPolygonRenderer::symbols()
|
|||||||
|
|
||||||
int QgsInvertedPolygonRenderer::capabilities()
|
int QgsInvertedPolygonRenderer::capabilities()
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return mSubRenderer->capabilities();
|
return mSubRenderer->capabilities();
|
||||||
@ -382,7 +399,8 @@ int QgsInvertedPolygonRenderer::capabilities()
|
|||||||
|
|
||||||
QList<QString> QgsInvertedPolygonRenderer::usedAttributes()
|
QList<QString> QgsInvertedPolygonRenderer::usedAttributes()
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return QList<QString>();
|
return QList<QString>();
|
||||||
}
|
}
|
||||||
return mSubRenderer->usedAttributes();
|
return mSubRenderer->usedAttributes();
|
||||||
@ -390,7 +408,8 @@ QList<QString> QgsInvertedPolygonRenderer::usedAttributes()
|
|||||||
|
|
||||||
QgsLegendSymbologyList QgsInvertedPolygonRenderer::legendSymbologyItems( QSize iconSize )
|
QgsLegendSymbologyList QgsInvertedPolygonRenderer::legendSymbologyItems( QSize iconSize )
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return QgsLegendSymbologyList();
|
return QgsLegendSymbologyList();
|
||||||
}
|
}
|
||||||
return mSubRenderer->legendSymbologyItems( iconSize );
|
return mSubRenderer->legendSymbologyItems( iconSize );
|
||||||
@ -398,7 +417,8 @@ QgsLegendSymbologyList QgsInvertedPolygonRenderer::legendSymbologyItems( QSize i
|
|||||||
|
|
||||||
QgsLegendSymbolList QgsInvertedPolygonRenderer::legendSymbolItems( double scaleDenominator, QString rule )
|
QgsLegendSymbolList QgsInvertedPolygonRenderer::legendSymbolItems( double scaleDenominator, QString rule )
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return QgsLegendSymbolList();
|
return QgsLegendSymbolList();
|
||||||
}
|
}
|
||||||
return mSubRenderer->legendSymbolItems( scaleDenominator, rule );
|
return mSubRenderer->legendSymbolItems( scaleDenominator, rule );
|
||||||
@ -406,8 +426,10 @@ QgsLegendSymbolList QgsInvertedPolygonRenderer::legendSymbolItems( double scaleD
|
|||||||
|
|
||||||
bool QgsInvertedPolygonRenderer::willRenderFeature( QgsFeature& feat )
|
bool QgsInvertedPolygonRenderer::willRenderFeature( QgsFeature& feat )
|
||||||
{
|
{
|
||||||
if ( !mSubRenderer ) {
|
if ( !mSubRenderer )
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return mSubRenderer->willRenderFeature( feat );
|
return mSubRenderer->willRenderFeature( feat );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
*
|
*
|
||||||
* It is designed on top of another feature renderer, which is called "embedded"
|
* It is designed on top of another feature renderer, which is called "embedded"
|
||||||
* Most of the methods are then only proxies to the embedded renderer.
|
* Most of the methods are then only proxies to the embedded renderer.
|
||||||
*
|
*
|
||||||
* Features are collected to form one "inverted" polygon
|
* Features are collected to form one "inverted" polygon
|
||||||
* during renderFeature() and rendered on stopRender().
|
* during renderFeature() and rendered on stopRender().
|
||||||
*/
|
*/
|
||||||
@ -39,128 +39,128 @@ class CORE_EXPORT QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** Constructor
|
/** Constructor
|
||||||
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned
|
* @param embeddedRenderer optional embeddedRenderer. If null, a default one will be assigned
|
||||||
*/
|
*/
|
||||||
QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = 0 );
|
QgsInvertedPolygonRenderer( const QgsFeatureRendererV2* embeddedRenderer = 0 );
|
||||||
virtual ~QgsInvertedPolygonRenderer();
|
virtual ~QgsInvertedPolygonRenderer();
|
||||||
|
|
||||||
/** Used to clone this feature renderer.*/
|
/** Used to clone this feature renderer.*/
|
||||||
virtual QgsFeatureRendererV2* clone();
|
virtual QgsFeatureRendererV2* clone();
|
||||||
|
|
||||||
virtual void startRender( QgsRenderContext& context, const QgsFields& fields );
|
virtual void startRender( QgsRenderContext& context, const QgsFields& fields );
|
||||||
|
|
||||||
/** Renders a given feature.
|
/** Renders a given feature.
|
||||||
* This will here collect features. The actual rendering will be postponed to stopRender()
|
* This will here collect features. The actual rendering will be postponed to stopRender()
|
||||||
* @param feature the feature to render
|
* @param feature the feature to render
|
||||||
* @param context the rendering context
|
* @param context the rendering context
|
||||||
* @param layer the symbol layer to render, if that makes sense
|
* @param layer the symbol layer to render, if that makes sense
|
||||||
* @param selected whether this feature has been selected (this will add decorations)
|
* @param selected whether this feature has been selected (this will add decorations)
|
||||||
* @param drawVertexMarker whether this feature has vertex markers (in edit mode usually)
|
* @param drawVertexMarker whether this feature has vertex markers (in edit mode usually)
|
||||||
* @returns true if the rendering was ok
|
* @returns true if the rendering was ok
|
||||||
*/
|
*/
|
||||||
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
|
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The actual rendering will take place here.
|
* The actual rendering will take place here.
|
||||||
* Features collected during renderFeature() are rendered using the embedded feature renderer
|
* Features collected during renderFeature() are rendered using the embedded feature renderer
|
||||||
*/
|
*/
|
||||||
virtual void stopRender( QgsRenderContext& context );
|
virtual void stopRender( QgsRenderContext& context );
|
||||||
|
|
||||||
/** @returns a textual reprensation of the renderer */
|
/** @returns a textual reprensation of the renderer */
|
||||||
virtual QString dump() const;
|
virtual QString dump() const;
|
||||||
|
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QList<QString> usedAttributes();
|
virtual QList<QString> usedAttributes();
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual int capabilities();
|
virtual int capabilities();
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsSymbolV2List symbols();
|
virtual QgsSymbolV2List symbols();
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature );
|
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature );
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
|
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
|
virtual QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual QgsLegendSymbolList legendSymbolItems( double scaleDenominator = -1, QString rule = "" );
|
virtual QgsLegendSymbolList legendSymbolItems( double scaleDenominator = -1, QString rule = "" );
|
||||||
/** Proxy that will call this method on the embedded renderer. */
|
/** Proxy that will call this method on the embedded renderer. */
|
||||||
virtual bool willRenderFeature( QgsFeature& feat );
|
virtual bool willRenderFeature( QgsFeature& feat );
|
||||||
|
|
||||||
/** Creates a renderer out of an XML, for loading*/
|
/** Creates a renderer out of an XML, for loading*/
|
||||||
static QgsFeatureRendererV2* create( QDomElement& element );
|
static QgsFeatureRendererV2* create( QDomElement& element );
|
||||||
|
|
||||||
/** Creates an XML representation of the renderer. Used for saving purpose
|
/** Creates an XML representation of the renderer. Used for saving purpose
|
||||||
* @param doc the XML document where to create the XML subtree
|
* @param doc the XML document where to create the XML subtree
|
||||||
* @returns the created XML subtree
|
* @returns the created XML subtree
|
||||||
*/
|
*/
|
||||||
virtual QDomElement save( QDomDocument& doc );
|
virtual QDomElement save( QDomDocument& doc );
|
||||||
|
|
||||||
/** sets the embedded renderer
|
/** sets the embedded renderer
|
||||||
* @param subRenderer the embedded renderer (will be cloned)
|
* @param subRenderer the embedded renderer (will be cloned)
|
||||||
*/
|
*/
|
||||||
void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer );
|
void setEmbeddedRenderer( const QgsFeatureRendererV2* subRenderer );
|
||||||
/** @returns the current embedded renderer
|
/** @returns the current embedded renderer
|
||||||
*/
|
*/
|
||||||
const QgsFeatureRendererV2* embeddedRenderer() const;
|
const QgsFeatureRendererV2* embeddedRenderer() const;
|
||||||
|
|
||||||
/** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/
|
/** @returns true if the geometries are to be preprocessed (merged with an union) before rendering.*/
|
||||||
bool preprocessingEnabled() const { return mPreprocessingEnabled; }
|
bool preprocessingEnabled() const { return mPreprocessingEnabled; }
|
||||||
/**
|
/**
|
||||||
@param enabled enables or disables the preprocessing.
|
@param enabled enables or disables the preprocessing.
|
||||||
When enabled, geometries will be merged with an union before being rendered.
|
When enabled, geometries will be merged with an union before being rendered.
|
||||||
It allows to fix some rendering artefacts (when rendering overlapping polygons for instance).
|
It allows to fix some rendering artefacts (when rendering overlapping polygons for instance).
|
||||||
This will involve some CPU-demanding computations and is thus disabled by default.
|
This will involve some CPU-demanding computations and is thus disabled by default.
|
||||||
*/
|
*/
|
||||||
void setPreprocessingEnabled( bool enabled ) { mPreprocessingEnabled = enabled; }
|
void setPreprocessingEnabled( bool enabled ) { mPreprocessingEnabled = enabled; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** Private copy constructor. @see clone() */
|
/** Private copy constructor. @see clone() */
|
||||||
QgsInvertedPolygonRenderer( const QgsInvertedPolygonRenderer& );
|
QgsInvertedPolygonRenderer( const QgsInvertedPolygonRenderer& );
|
||||||
/** Private assignment operator. @see clone() */
|
/** Private assignment operator. @see clone() */
|
||||||
QgsInvertedPolygonRenderer& operator=( const QgsInvertedPolygonRenderer& );
|
QgsInvertedPolygonRenderer& operator=( const QgsInvertedPolygonRenderer& );
|
||||||
|
|
||||||
/** Embedded renderer */
|
/** Embedded renderer */
|
||||||
QScopedPointer<QgsFeatureRendererV2> mSubRenderer;
|
QScopedPointer<QgsFeatureRendererV2> mSubRenderer;
|
||||||
|
|
||||||
/** Structure where the reversed geometry is built during renderFeature */
|
/** Structure where the reversed geometry is built during renderFeature */
|
||||||
struct CombinedFeature
|
struct CombinedFeature
|
||||||
{
|
{
|
||||||
QgsMultiPolygon multiPolygon; //< the final combined geometry
|
QgsMultiPolygon multiPolygon; //< the final combined geometry
|
||||||
QgsFeature feature; //< one feature (for attriute-based rendering)
|
QgsFeature feature; //< one feature (for attriute-based rendering)
|
||||||
};
|
};
|
||||||
typedef QVector<CombinedFeature> FeatureCategoryMap;
|
typedef QVector<CombinedFeature> FeatureCategoryMap;
|
||||||
/** where features are stored, based on the index of their symbol category @see mSymbolCategories */
|
/** where features are stored, based on the index of their symbol category @see mSymbolCategories */
|
||||||
FeatureCategoryMap mFeaturesCategoryMap;
|
FeatureCategoryMap mFeaturesCategoryMap;
|
||||||
|
|
||||||
/** maps a category to an index */
|
/** maps a category to an index */
|
||||||
QMap<QByteArray, int> mSymbolCategories;
|
QMap<QByteArray, int> mSymbolCategories;
|
||||||
|
|
||||||
/** the polygon used as exterior ring that covers the current extent */
|
/** the polygon used as exterior ring that covers the current extent */
|
||||||
QgsPolygon mExtentPolygon;
|
QgsPolygon mExtentPolygon;
|
||||||
|
|
||||||
/** the context used for rendering */
|
/** the context used for rendering */
|
||||||
QgsRenderContext mContext;
|
QgsRenderContext mContext;
|
||||||
|
|
||||||
/** fields of each feature*/
|
/** fields of each feature*/
|
||||||
QgsFields mFields;
|
QgsFields mFields;
|
||||||
|
|
||||||
/** Class used to represent features that must be rendered
|
/** Class used to represent features that must be rendered
|
||||||
with decorations (selection, vertex markers)
|
with decorations (selection, vertex markers)
|
||||||
*/
|
*/
|
||||||
struct FeatureDecoration
|
struct FeatureDecoration
|
||||||
{
|
{
|
||||||
QgsFeature feature;
|
QgsFeature feature;
|
||||||
bool selected;
|
bool selected;
|
||||||
bool drawMarkers;
|
bool drawMarkers;
|
||||||
int layer;
|
int layer;
|
||||||
FeatureDecoration( QgsFeature& a_feature, bool a_selected, bool a_drawMarkers, int a_layer ) :
|
FeatureDecoration( QgsFeature& a_feature, bool a_selected, bool a_drawMarkers, int a_layer ) :
|
||||||
feature(a_feature),selected(a_selected), drawMarkers(a_drawMarkers), layer(a_layer) {}
|
feature( a_feature ), selected( a_selected ), drawMarkers( a_drawMarkers ), layer( a_layer ) {}
|
||||||
};
|
};
|
||||||
QList<FeatureDecoration> mFeatureDecorations;
|
QList<FeatureDecoration> mFeatureDecorations;
|
||||||
|
|
||||||
/** whether to preprocess (merge) geometries before rendering*/
|
/** whether to preprocess (merge) geometries before rendering*/
|
||||||
bool mPreprocessingEnabled;
|
bool mPreprocessingEnabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,7 +29,8 @@ QgsRendererV2Widget* QgsInvertedPolygonRendererWidget::create( QgsVectorLayer* l
|
|||||||
QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
|
QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
|
||||||
: QgsRendererV2Widget( layer, style )
|
: QgsRendererV2Widget( layer, style )
|
||||||
{
|
{
|
||||||
if ( !layer ) {
|
if ( !layer )
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,7 +67,7 @@ QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLay
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// an existing inverted renderer
|
// an existing inverted renderer
|
||||||
mRenderer.reset( static_cast<QgsInvertedPolygonRenderer*>(renderer) );
|
mRenderer.reset( static_cast<QgsInvertedPolygonRenderer*>( renderer ) );
|
||||||
mMergePolygonsCheckBox->blockSignals( true );
|
mMergePolygonsCheckBox->blockSignals( true );
|
||||||
mMergePolygonsCheckBox->setCheckState( mRenderer->preprocessingEnabled() ? Qt::Checked : Qt::Unchecked );
|
mMergePolygonsCheckBox->setCheckState( mRenderer->preprocessingEnabled() ? Qt::Checked : Qt::Unchecked );
|
||||||
mMergePolygonsCheckBox->blockSignals( false );
|
mMergePolygonsCheckBox->blockSignals( false );
|
||||||
@ -81,7 +82,7 @@ QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLay
|
|||||||
for ( ; it != rendererList.constEnd(); ++it, ++idx )
|
for ( ; it != rendererList.constEnd(); ++it, ++idx )
|
||||||
{
|
{
|
||||||
if (( *it != "invertedPolygonRenderer" ) && //< an inverted renderer cannot contain another inverted renderer
|
if (( *it != "invertedPolygonRenderer" ) && //< an inverted renderer cannot contain another inverted renderer
|
||||||
( *it != "pointDisplacement" )) //< an inverted renderer can only contain a polygon renderer
|
( *it != "pointDisplacement" ) ) //< an inverted renderer can only contain a polygon renderer
|
||||||
{
|
{
|
||||||
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( *it );
|
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( *it );
|
||||||
mRendererComboBox->addItem( m->icon(), m->visibleName(), /* data */ *it );
|
mRendererComboBox->addItem( m->icon(), m->visibleName(), /* data */ *it );
|
||||||
@ -123,9 +124,10 @@ void QgsInvertedPolygonRendererWidget::on_mRendererComboBox_currentIndexChanged(
|
|||||||
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( rendererId );
|
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( rendererId );
|
||||||
if ( m )
|
if ( m )
|
||||||
{
|
{
|
||||||
mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, const_cast<QgsFeatureRendererV2*>(mRenderer->embeddedRenderer())->clone() ) );
|
mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, const_cast<QgsFeatureRendererV2*>( mRenderer->embeddedRenderer() )->clone() ) );
|
||||||
|
|
||||||
if ( mLayout->count() > 2 ) {
|
if ( mLayout->count() > 2 )
|
||||||
|
{
|
||||||
// remove the current renderer widget
|
// remove the current renderer widget
|
||||||
mLayout->takeAt( 2 );
|
mLayout->takeAt( 2 );
|
||||||
}
|
}
|
||||||
|
@ -26,35 +26,35 @@ class QMenu;
|
|||||||
*/
|
*/
|
||||||
class GUI_EXPORT QgsInvertedPolygonRendererWidget : public QgsRendererV2Widget, private Ui::QgsInvertedPolygonRendererWidgetBase
|
class GUI_EXPORT QgsInvertedPolygonRendererWidget : public QgsRendererV2Widget, private Ui::QgsInvertedPolygonRendererWidgetBase
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** static creation method
|
/** static creation method
|
||||||
* @param layer the layer where this renderer is applied
|
* @param layer the layer where this renderer is applied
|
||||||
* @param style
|
* @param style
|
||||||
* @param renderer the mask renderer (will take ownership)
|
* @param renderer the mask renderer (will take ownership)
|
||||||
*/
|
*/
|
||||||
static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
|
static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
|
||||||
|
|
||||||
/** Constructor
|
/** Constructor
|
||||||
* @param layer the layer where this renderer is applied
|
* @param layer the layer where this renderer is applied
|
||||||
* @param style
|
* @param style
|
||||||
* @param renderer the mask renderer (will take ownership)
|
* @param renderer the mask renderer (will take ownership)
|
||||||
*/
|
*/
|
||||||
QgsInvertedPolygonRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
|
QgsInvertedPolygonRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
|
||||||
|
|
||||||
/** @returns the current feature renderer */
|
/** @returns the current feature renderer */
|
||||||
virtual QgsFeatureRendererV2* renderer();
|
virtual QgsFeatureRendererV2* renderer();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** the mask renderer */
|
/** the mask renderer */
|
||||||
QScopedPointer<QgsInvertedPolygonRenderer> mRenderer;
|
QScopedPointer<QgsInvertedPolygonRenderer> mRenderer;
|
||||||
/** the widget used to represent the mask's embedded renderer */
|
/** the widget used to represent the mask's embedded renderer */
|
||||||
QScopedPointer<QgsRendererV2Widget> mEmbeddedRendererWidget;
|
QScopedPointer<QgsRendererV2Widget> mEmbeddedRendererWidget;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_mRendererComboBox_currentIndexChanged( int index );
|
void on_mRendererComboBox_currentIndexChanged( int index );
|
||||||
void on_mMergePolygonsCheckBox_stateChanged( int state );
|
void on_mMergePolygonsCheckBox_stateChanged( int state );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user