Skip to content

Commit

Permalink
refactor to a more general convertFromRenderer function
Browse files Browse the repository at this point in the history
  • Loading branch information
leyan committed Sep 9, 2014
1 parent 11d159c commit 9931dde
Show file tree
Hide file tree
Showing 29 changed files with 368 additions and 331 deletions.
7 changes: 4 additions & 3 deletions python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip
Expand Up @@ -55,7 +55,7 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2


virtual QString dump() const; virtual QString dump() const;


virtual QgsFeatureRendererV2* clone() /Factory/; virtual QgsFeatureRendererV2* clone() const /Factory/;


virtual void toSld( QDomDocument& doc, QDomElement &element ) const; virtual void toSld( QDomDocument& doc, QDomElement &element ) const;


Expand Down Expand Up @@ -147,9 +147,10 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2
// @note added in 2.5 // @note added in 2.5
virtual void checkLegendSymbolItem( QString key, bool state = true ); virtual void checkLegendSymbolItem( QString key, bool state = true );


//! convert the renderer to a rule based renderer with equivalent rules //! creates a QgsCategorizedSymbolRendererV2 from an existing renderer.
//! @note added in 2.5 //! @note added in 2.5
virtual QgsRuleBasedRendererV2* convertToRuleBasedRenderer() /Factory/; //! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsCategorizedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;


protected: protected:
void rebuildHash(); void rebuildHash();
Expand Down
9 changes: 4 additions & 5 deletions python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip
Expand Up @@ -59,7 +59,7 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2


virtual QString dump() const; virtual QString dump() const;


virtual QgsFeatureRendererV2* clone() /Factory/; virtual QgsFeatureRendererV2* clone() const /Factory/;


virtual void toSld( QDomDocument& doc, QDomElement &element ) const; virtual void toSld( QDomDocument& doc, QDomElement &element ) const;


Expand Down Expand Up @@ -173,11 +173,10 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
// @note added in 2.5 // @note added in 2.5
virtual void checkLegendSymbolItem( QString key, bool state = true ); virtual void checkLegendSymbolItem( QString key, bool state = true );


//! convert the renderer to a rule based renderer with equivalent rules //! creates a QgsGraduatedSymbolRendererV2 from an existing renderer.
//! @note added in 2.5 //! @note added in 2.5
virtual QgsRuleBasedRendererV2* convertToRuleBasedRenderer() /Factory/; //! @returns a new renderer if the conversion was possible, otherwise 0.

static QgsGraduatedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;



protected: protected:
QgsSymbolV2* symbolForValue( double value ); QgsSymbolV2* symbolForValue( double value );
Expand Down
8 changes: 7 additions & 1 deletion python/core/symbology-ng/qgsinvertedpolygonrenderer.sip
Expand Up @@ -12,7 +12,7 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2
virtual ~QgsInvertedPolygonRenderer(); virtual ~QgsInvertedPolygonRenderer();


/** Used to clone this feature renderer.*/ /** Used to clone this feature renderer.*/
virtual QgsFeatureRendererV2* clone() /Factory/; virtual QgsFeatureRendererV2* clone() const /Factory/;


virtual void startRender( QgsRenderContext& context, const QgsFields& fields ); virtual void startRender( QgsRenderContext& context, const QgsFields& fields );


Expand Down Expand Up @@ -81,4 +81,10 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2
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 );

/** creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
@note added in 2.5
@returns a new renderer if the conversion was possible, otherwise 0.
*/
static QgsInvertedPolygonRenderer* convertFromRenderer( const QgsFeatureRendererV2* renderer ) /Factory/;
}; };
7 changes: 6 additions & 1 deletion python/core/symbology-ng/qgspointdisplacementrenderer.sip
Expand Up @@ -7,7 +7,7 @@ class QgsPointDisplacementRenderer : QgsFeatureRendererV2
QgsPointDisplacementRenderer( const QString& labelAttributeName = "" ); QgsPointDisplacementRenderer( const QString& labelAttributeName = "" );
~QgsPointDisplacementRenderer(); ~QgsPointDisplacementRenderer();


QgsFeatureRendererV2* clone() /Factory/; QgsFeatureRendererV2* clone() const /Factory/;


virtual void toSld( QDomDocument& doc, QDomElement &element ) const; virtual void toSld( QDomDocument& doc, QDomElement &element ) const;


Expand Down Expand Up @@ -69,6 +69,11 @@ class QgsPointDisplacementRenderer : QgsFeatureRendererV2
void setTolerance( double t ); void setTolerance( double t );
double tolerance() const; double tolerance() const;


//! creates a QgsPointDisplacementRenderer from an existing renderer.
//! @note added in 2.5
//! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsPointDisplacementRenderer* convertFromRenderer(const QgsFeatureRendererV2 *renderer ) /Factory/;

private: private:
QgsPointDisplacementRenderer( const QgsPointDisplacementRenderer & ); QgsPointDisplacementRenderer( const QgsPointDisplacementRenderer & );
QgsPointDisplacementRenderer & operator=( const QgsPointDisplacementRenderer & ); QgsPointDisplacementRenderer & operator=( const QgsPointDisplacementRenderer & );
Expand Down
6 changes: 1 addition & 5 deletions python/core/symbology-ng/qgsrendererv2.sip
Expand Up @@ -71,7 +71,7 @@ class QgsFeatureRendererV2


virtual ~QgsFeatureRendererV2(); virtual ~QgsFeatureRendererV2();


virtual QgsFeatureRendererV2* clone() = 0 /Factory/; virtual QgsFeatureRendererV2* clone() const = 0 /Factory/;


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 );


Expand Down Expand Up @@ -175,10 +175,6 @@ class QgsFeatureRendererV2
//! @note added in 1.9 //! @note added in 1.9
virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat ); virtual QgsSymbolV2List symbolsForFeature( QgsFeature& feat );


//! convert the renderer to a rule based renderer with equivalent rules, if possible
//! @note added in 2.5
virtual QgsRuleBasedRendererV2* convertToRuleBasedRenderer() /Factory/;

protected: protected:
QgsFeatureRendererV2( QString type ); QgsFeatureRendererV2( QString type );


Expand Down
10 changes: 7 additions & 3 deletions python/core/symbology-ng/qgsrulebasedrendererv2.sip
Expand Up @@ -164,7 +164,7 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2


virtual QList<QString> usedAttributes(); virtual QList<QString> usedAttributes();


virtual QgsFeatureRendererV2* clone() /Factory/; virtual QgsFeatureRendererV2* clone() const /Factory/;


virtual void toSld( QDomDocument& doc, QDomElement &element ) const; virtual void toSld( QDomDocument& doc, QDomElement &element ) const;


Expand Down Expand Up @@ -231,9 +231,13 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
//! take a rule and create a list of new rules with intervals of scales given by the passed scale denominators //! take a rule and create a list of new rules with intervals of scales given by the passed scale denominators
static void refineRuleScales( QgsRuleBasedRendererV2::Rule* initialRule, QList<int> scales ); static void refineRuleScales( QgsRuleBasedRendererV2::Rule* initialRule, QList<int> scales );


//! convert the renderer to a rule based renderer with equivalent rules, if possible //! creates a QgsRuleBasedRendererV2 from an existing renderer.
//! @note added in 2.5 //! @note added in 2.5
virtual QgsRuleBasedRendererV2* convertToRuleBasedRenderer() /Factory/; //! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsRuleBasedRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;

//! helper function to convert the size scale and rotation fields present in some other renderers to data defined symbology
static void convertToDataDefinedSymbology( QgsSymbolV2* symbol, QString sizeScaleField, QString rotationField );


private: private:
QgsRuleBasedRendererV2( const QgsRuleBasedRendererV2 & ); QgsRuleBasedRendererV2( const QgsRuleBasedRendererV2 & );
Expand Down
7 changes: 4 additions & 3 deletions python/core/symbology-ng/qgssinglesymbolrendererv2.sip
Expand Up @@ -37,7 +37,7 @@ class QgsSingleSymbolRendererV2 : QgsFeatureRendererV2


virtual QString dump() const; virtual QString dump() const;


virtual QgsFeatureRendererV2* clone() /Factory/; virtual QgsFeatureRendererV2* clone() const /Factory/;


virtual void toSld( QDomDocument& doc, QDomElement &element ) const; virtual void toSld( QDomDocument& doc, QDomElement &element ) const;
static QgsFeatureRendererV2* createFromSld( QDomElement& element, QGis::GeometryType geomType ); static QgsFeatureRendererV2* createFromSld( QDomElement& element, QGis::GeometryType geomType );
Expand Down Expand Up @@ -66,9 +66,10 @@ class QgsSingleSymbolRendererV2 : QgsFeatureRendererV2
//! @note added in 2.6 //! @note added in 2.6
virtual QgsLegendSymbolListV2 legendSymbolItemsV2() const; virtual QgsLegendSymbolListV2 legendSymbolItemsV2() const;


//! convert the renderer to a rule based renderer with equivalent rules //! creates a QgsSingleSymbolRendererV2 from an existing renderer.
//! @note added in 2.5 //! @note added in 2.5
virtual QgsRuleBasedRendererV2* convertToRuleBasedRenderer() /Factory/; //! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsSingleSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;


private: private:
QgsSingleSymbolRendererV2( const QgsSingleSymbolRendererV2 & ); QgsSingleSymbolRendererV2( const QgsSingleSymbolRendererV2 & );
Expand Down
105 changes: 17 additions & 88 deletions src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp
Expand Up @@ -19,7 +19,8 @@
#include "qgssymbolv2.h" #include "qgssymbolv2.h"
#include "qgssymbollayerv2utils.h" #include "qgssymbollayerv2utils.h"
#include "qgsvectorcolorrampv2.h" #include "qgsvectorcolorrampv2.h"
#include "qgsrulebasedrendererv2.h" #include "qgspointdisplacementrenderer.h"
#include "qgsinvertedpolygonrenderer.h"


#include "qgsfeature.h" #include "qgsfeature.h"
#include "qgsvectorlayer.h" #include "qgsvectorlayer.h"
Expand Down Expand Up @@ -463,7 +464,7 @@ QString QgsCategorizedSymbolRendererV2::dump() const
return s; return s;
} }


QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone() QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone() const
{ {
QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrName, mCategories ); QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrName, mCategories );
if ( mSourceSymbol.data() ) if ( mSourceSymbol.data() )
Expand Down Expand Up @@ -760,93 +761,21 @@ void QgsCategorizedSymbolRendererV2::checkLegendSymbolItem( QString key, bool st


QgsMarkerSymbolV2 QgsCategorizedSymbolRendererV2::sSkipRender; QgsMarkerSymbolV2 QgsCategorizedSymbolRendererV2::sSkipRender;


QgsRuleBasedRendererV2* QgsCategorizedSymbolRendererV2::convertToRuleBasedRenderer() QgsCategorizedSymbolRendererV2* QgsCategorizedSymbolRendererV2::convertFromRenderer( const QgsFeatureRendererV2 *renderer )
{ {
QgsRuleBasedRendererV2::Rule* rootrule = new QgsRuleBasedRendererV2::Rule( NULL ); if ( renderer->type() == "categorizedSymbol" )

QString expression;
QString sizeExpression;
QString value;
for ( int i = 0; i < mCategories.size();++i )
{ {
QgsRuleBasedRendererV2::Rule* rule = new QgsRuleBasedRendererV2::Rule( NULL ); return dynamic_cast<QgsCategorizedSymbolRendererV2*>( renderer->clone() );

rule->setLabel( mCategories[i].label() );

//We first define the rule corresponding to the category
//If the value is a number, we can use it directly, otherwise we need to quote it in the rule
if ( QVariant( mCategories[i].value() ).convert( QVariant::Double ) )
{
value = mCategories[i].value().toString();
}
else
{
value = "'" + mCategories[i].value().toString() + "'";
}

//An empty category is equivalent to the ELSE keyword
if ( value == "''" )
expression = "ELSE";
else
expression = classAttribute() + " = " + value;
rule->setFilterExpression( expression );

//Then we construct an equivalent symbol.
//Ideally we could simply copy the symbol, but the categorized renderer allows a separate interface to specify
//data dependent area and rotation, so we need to convert these to obtain the same rendering

QgsSymbolV2* origSymbol = mCategories[i].symbol()->clone();

switch ( origSymbol->type() )
{
case QgsSymbolV2::Marker:
for ( int j = 0; j < origSymbol->symbolLayerCount();++j )
{
QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( origSymbol->symbolLayer( j ) );
if ( mSizeScale.data() )
{
sizeExpression = QString( "%1*(%2)" ).arg( msl->size() ).arg( sizeScaleField() );
msl->setDataDefinedProperty( "size", sizeExpression );
}
if ( mRotation.data() )
{
msl->setDataDefinedProperty( "angle", rotationField() );
}
}
break;
case QgsSymbolV2::Line:
if ( mSizeScale.data() )
{
for ( int j = 0; j < origSymbol->symbolLayerCount();++j )
{
if ( origSymbol->symbolLayer( j )->layerType() == "SimpleLine" )
{
QgsLineSymbolLayerV2* lsl = static_cast<QgsLineSymbolLayerV2*>( origSymbol->symbolLayer( j ) );
sizeExpression = QString( "%1*(%2)" ).arg( lsl->width() ).arg( sizeScaleField() );
lsl->setDataDefinedProperty( "width", sizeExpression );
}
if ( origSymbol->symbolLayer( j )->layerType() == "MarkerLine" )
{
QgsSymbolV2* marker = origSymbol->symbolLayer( j )->subSymbol();
for ( int k = 0; k < marker->symbolLayerCount();++k )
{
QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( marker->symbolLayer( k ) );
sizeExpression = QString( "%1*(%2)" ).arg( msl->size() ).arg( sizeScaleField() );
msl->setDataDefinedProperty( "size", sizeExpression );
}
}
}
}
break;
default:
break;
}

rule->setSymbol( origSymbol );

rootrule->appendChild( rule );
} }

if ( renderer->type() == "pointDisplacement" )
return new QgsRuleBasedRendererV2( rootrule ); {

const QgsPointDisplacementRenderer* pointDisplacementRenderer = dynamic_cast<const QgsPointDisplacementRenderer*>( renderer );
return convertFromRenderer( pointDisplacementRenderer->embeddedRenderer() );
}
if ( renderer->type() == "invertedPolygonRenderer" )
{
const QgsInvertedPolygonRenderer* invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer*>( renderer );
return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
}
return 0;
} }
11 changes: 5 additions & 6 deletions src/core/symbology-ng/qgscategorizedsymbolrendererv2.h
Expand Up @@ -24,7 +24,6 @@


class QgsVectorColorRampV2; class QgsVectorColorRampV2;
class QgsVectorLayer; class QgsVectorLayer;
class QgsRuleBasedRendererV2;


/* \brief categorized renderer */ /* \brief categorized renderer */
class CORE_EXPORT QgsRendererCategoryV2 class CORE_EXPORT QgsRendererCategoryV2
Expand Down Expand Up @@ -86,7 +85,7 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2


virtual QString dump() const; virtual QString dump() const;


virtual QgsFeatureRendererV2* clone(); virtual QgsFeatureRendererV2* clone() const;


virtual void toSld( QDomDocument& doc, QDomElement &element ) const; virtual void toSld( QDomDocument& doc, QDomElement &element ) const;


Expand Down Expand Up @@ -166,9 +165,8 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
//! @note added in 2.0 //! @note added in 2.0
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; } QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }



//! items of symbology items in legend should be checkable //! items of symbology items in legend should be checkable
// @note added in 2.5 //! @note added in 2.5
virtual bool legendSymbolItemsCheckable() const; virtual bool legendSymbolItemsCheckable() const;


//! item in symbology was checked //! item in symbology was checked
Expand All @@ -183,9 +181,10 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
//! @note added in 2.6 //! @note added in 2.6
virtual QString legendClassificationAttribute() const { return classAttribute(); } virtual QString legendClassificationAttribute() const { return classAttribute(); }


//! convert the renderer to a rule based renderer with equivalent rules //! creates a QgsCategorizedSymbolRendererV2 from an existing renderer.
//! @note added in 2.5 //! @note added in 2.5
virtual QgsRuleBasedRendererV2* convertToRuleBasedRenderer(); //! @returns a new renderer if the conversion was possible, otherwise 0.
static QgsCategorizedSymbolRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer );


protected: protected:
QString mAttrName; QString mAttrName;
Expand Down

0 comments on commit 9931dde

Please sign in to comment.