Skip to content

Commit 9931dde

Browse files
committed
refactor to a more general convertFromRenderer function
1 parent 11d159c commit 9931dde

29 files changed

+368
-331
lines changed

python/core/symbology-ng/qgscategorizedsymbolrendererv2.sip

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2
5555

5656
virtual QString dump() const;
5757

58-
virtual QgsFeatureRendererV2* clone() /Factory/;
58+
virtual QgsFeatureRendererV2* clone() const /Factory/;
5959

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

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

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

154155
protected:
155156
void rebuildHash();

python/core/symbology-ng/qgsgraduatedsymbolrendererv2.sip

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
5959

6060
virtual QString dump() const;
6161

62-
virtual QgsFeatureRendererV2* clone() /Factory/;
62+
virtual QgsFeatureRendererV2* clone() const /Factory/;
6363

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

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

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

182181
protected:
183182
QgsSymbolV2* symbolForValue( double value );

python/core/symbology-ng/qgsinvertedpolygonrenderer.sip

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2
1212
virtual ~QgsInvertedPolygonRenderer();
1313

1414
/** Used to clone this feature renderer.*/
15-
virtual QgsFeatureRendererV2* clone() /Factory/;
15+
virtual QgsFeatureRendererV2* clone() const /Factory/;
1616

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

@@ -81,4 +81,10 @@ class QgsInvertedPolygonRenderer : QgsFeatureRendererV2
8181
This will involve some CPU-demanding computations and is thus disabled by default.
8282
*/
8383
void setPreprocessingEnabled( bool enabled );
84+
85+
/** creates a QgsInvertedPolygonRenderer by a conversion from an existing renderer.
86+
@note added in 2.5
87+
@returns a new renderer if the conversion was possible, otherwise 0.
88+
*/
89+
static QgsInvertedPolygonRenderer* convertFromRenderer( const QgsFeatureRendererV2* renderer ) /Factory/;
8490
};

python/core/symbology-ng/qgspointdisplacementrenderer.sip

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class QgsPointDisplacementRenderer : QgsFeatureRendererV2
77
QgsPointDisplacementRenderer( const QString& labelAttributeName = "" );
88
~QgsPointDisplacementRenderer();
99

10-
QgsFeatureRendererV2* clone() /Factory/;
10+
QgsFeatureRendererV2* clone() const /Factory/;
1111

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

@@ -69,6 +69,11 @@ class QgsPointDisplacementRenderer : QgsFeatureRendererV2
6969
void setTolerance( double t );
7070
double tolerance() const;
7171

72+
//! creates a QgsPointDisplacementRenderer from an existing renderer.
73+
//! @note added in 2.5
74+
//! @returns a new renderer if the conversion was possible, otherwise 0.
75+
static QgsPointDisplacementRenderer* convertFromRenderer(const QgsFeatureRendererV2 *renderer ) /Factory/;
76+
7277
private:
7378
QgsPointDisplacementRenderer( const QgsPointDisplacementRenderer & );
7479
QgsPointDisplacementRenderer & operator=( const QgsPointDisplacementRenderer & );

python/core/symbology-ng/qgsrendererv2.sip

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class QgsFeatureRendererV2
7171

7272
virtual ~QgsFeatureRendererV2();
7373

74-
virtual QgsFeatureRendererV2* clone() = 0 /Factory/;
74+
virtual QgsFeatureRendererV2* clone() const = 0 /Factory/;
7575

7676
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
7777

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

178-
//! convert the renderer to a rule based renderer with equivalent rules, if possible
179-
//! @note added in 2.5
180-
virtual QgsRuleBasedRendererV2* convertToRuleBasedRenderer() /Factory/;
181-
182178
protected:
183179
QgsFeatureRendererV2( QString type );
184180

python/core/symbology-ng/qgsrulebasedrendererv2.sip

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ class QgsRuleBasedRendererV2 : QgsFeatureRendererV2
164164

165165
virtual QList<QString> usedAttributes();
166166

167-
virtual QgsFeatureRendererV2* clone() /Factory/;
167+
virtual QgsFeatureRendererV2* clone() const /Factory/;
168168

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

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

234-
//! convert the renderer to a rule based renderer with equivalent rules, if possible
234+
//! creates a QgsRuleBasedRendererV2 from an existing renderer.
235235
//! @note added in 2.5
236-
virtual QgsRuleBasedRendererV2* convertToRuleBasedRenderer() /Factory/;
236+
//! @returns a new renderer if the conversion was possible, otherwise 0.
237+
static QgsRuleBasedRendererV2* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;
238+
239+
//! helper function to convert the size scale and rotation fields present in some other renderers to data defined symbology
240+
static void convertToDataDefinedSymbology( QgsSymbolV2* symbol, QString sizeScaleField, QString rotationField );
237241

238242
private:
239243
QgsRuleBasedRendererV2( const QgsRuleBasedRendererV2 & );

python/core/symbology-ng/qgssinglesymbolrendererv2.sip

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class QgsSingleSymbolRendererV2 : QgsFeatureRendererV2
3737

3838
virtual QString dump() const;
3939

40-
virtual QgsFeatureRendererV2* clone() /Factory/;
40+
virtual QgsFeatureRendererV2* clone() const /Factory/;
4141

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

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

7374
private:
7475
QgsSingleSymbolRendererV2( const QgsSingleSymbolRendererV2 & );

src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

Lines changed: 17 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
#include "qgssymbolv2.h"
2020
#include "qgssymbollayerv2utils.h"
2121
#include "qgsvectorcolorrampv2.h"
22-
#include "qgsrulebasedrendererv2.h"
22+
#include "qgspointdisplacementrenderer.h"
23+
#include "qgsinvertedpolygonrenderer.h"
2324

2425
#include "qgsfeature.h"
2526
#include "qgsvectorlayer.h"
@@ -463,7 +464,7 @@ QString QgsCategorizedSymbolRendererV2::dump() const
463464
return s;
464465
}
465466

466-
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone()
467+
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone() const
467468
{
468469
QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrName, mCategories );
469470
if ( mSourceSymbol.data() )
@@ -760,93 +761,21 @@ void QgsCategorizedSymbolRendererV2::checkLegendSymbolItem( QString key, bool st
760761

761762
QgsMarkerSymbolV2 QgsCategorizedSymbolRendererV2::sSkipRender;
762763

763-
QgsRuleBasedRendererV2* QgsCategorizedSymbolRendererV2::convertToRuleBasedRenderer()
764+
QgsCategorizedSymbolRendererV2* QgsCategorizedSymbolRendererV2::convertFromRenderer( const QgsFeatureRendererV2 *renderer )
764765
{
765-
QgsRuleBasedRendererV2::Rule* rootrule = new QgsRuleBasedRendererV2::Rule( NULL );
766-
767-
QString expression;
768-
QString sizeExpression;
769-
QString value;
770-
for ( int i = 0; i < mCategories.size();++i )
766+
if ( renderer->type() == "categorizedSymbol" )
771767
{
772-
QgsRuleBasedRendererV2::Rule* rule = new QgsRuleBasedRendererV2::Rule( NULL );
773-
774-
rule->setLabel( mCategories[i].label() );
775-
776-
//We first define the rule corresponding to the category
777-
//If the value is a number, we can use it directly, otherwise we need to quote it in the rule
778-
if ( QVariant( mCategories[i].value() ).convert( QVariant::Double ) )
779-
{
780-
value = mCategories[i].value().toString();
781-
}
782-
else
783-
{
784-
value = "'" + mCategories[i].value().toString() + "'";
785-
}
786-
787-
//An empty category is equivalent to the ELSE keyword
788-
if ( value == "''" )
789-
expression = "ELSE";
790-
else
791-
expression = classAttribute() + " = " + value;
792-
rule->setFilterExpression( expression );
793-
794-
//Then we construct an equivalent symbol.
795-
//Ideally we could simply copy the symbol, but the categorized renderer allows a separate interface to specify
796-
//data dependent area and rotation, so we need to convert these to obtain the same rendering
797-
798-
QgsSymbolV2* origSymbol = mCategories[i].symbol()->clone();
799-
800-
switch ( origSymbol->type() )
801-
{
802-
case QgsSymbolV2::Marker:
803-
for ( int j = 0; j < origSymbol->symbolLayerCount();++j )
804-
{
805-
QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( origSymbol->symbolLayer( j ) );
806-
if ( mSizeScale.data() )
807-
{
808-
sizeExpression = QString( "%1*(%2)" ).arg( msl->size() ).arg( sizeScaleField() );
809-
msl->setDataDefinedProperty( "size", sizeExpression );
810-
}
811-
if ( mRotation.data() )
812-
{
813-
msl->setDataDefinedProperty( "angle", rotationField() );
814-
}
815-
}
816-
break;
817-
case QgsSymbolV2::Line:
818-
if ( mSizeScale.data() )
819-
{
820-
for ( int j = 0; j < origSymbol->symbolLayerCount();++j )
821-
{
822-
if ( origSymbol->symbolLayer( j )->layerType() == "SimpleLine" )
823-
{
824-
QgsLineSymbolLayerV2* lsl = static_cast<QgsLineSymbolLayerV2*>( origSymbol->symbolLayer( j ) );
825-
sizeExpression = QString( "%1*(%2)" ).arg( lsl->width() ).arg( sizeScaleField() );
826-
lsl->setDataDefinedProperty( "width", sizeExpression );
827-
}
828-
if ( origSymbol->symbolLayer( j )->layerType() == "MarkerLine" )
829-
{
830-
QgsSymbolV2* marker = origSymbol->symbolLayer( j )->subSymbol();
831-
for ( int k = 0; k < marker->symbolLayerCount();++k )
832-
{
833-
QgsMarkerSymbolLayerV2* msl = static_cast<QgsMarkerSymbolLayerV2*>( marker->symbolLayer( k ) );
834-
sizeExpression = QString( "%1*(%2)" ).arg( msl->size() ).arg( sizeScaleField() );
835-
msl->setDataDefinedProperty( "size", sizeExpression );
836-
}
837-
}
838-
}
839-
}
840-
break;
841-
default:
842-
break;
843-
}
844-
845-
rule->setSymbol( origSymbol );
846-
847-
rootrule->appendChild( rule );
768+
return dynamic_cast<QgsCategorizedSymbolRendererV2*>( renderer->clone() );
848769
}
849-
850-
return new QgsRuleBasedRendererV2( rootrule );
851-
770+
if ( renderer->type() == "pointDisplacement" )
771+
{
772+
const QgsPointDisplacementRenderer* pointDisplacementRenderer = dynamic_cast<const QgsPointDisplacementRenderer*>( renderer );
773+
return convertFromRenderer( pointDisplacementRenderer->embeddedRenderer() );
774+
}
775+
if ( renderer->type() == "invertedPolygonRenderer" )
776+
{
777+
const QgsInvertedPolygonRenderer* invertedPolygonRenderer = dynamic_cast<const QgsInvertedPolygonRenderer*>( renderer );
778+
return convertFromRenderer( invertedPolygonRenderer->embeddedRenderer() );
779+
}
780+
return 0;
852781
}

src/core/symbology-ng/qgscategorizedsymbolrendererv2.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525
class QgsVectorColorRampV2;
2626
class QgsVectorLayer;
27-
class QgsRuleBasedRendererV2;
2827

2928
/* \brief categorized renderer */
3029
class CORE_EXPORT QgsRendererCategoryV2
@@ -86,7 +85,7 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
8685

8786
virtual QString dump() const;
8887

89-
virtual QgsFeatureRendererV2* clone();
88+
virtual QgsFeatureRendererV2* clone() const;
9089

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

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

169-
170168
//! items of symbology items in legend should be checkable
171-
// @note added in 2.5
169+
//! @note added in 2.5
172170
virtual bool legendSymbolItemsCheckable() const;
173171

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

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

190189
protected:
191190
QString mAttrName;

0 commit comments

Comments
 (0)