Skip to content

Commit ca9d49b

Browse files
committed
Added possibility to scale a markers area. Up to now, only the diameter could be scaled.
1 parent f378a2a commit ca9d49b

17 files changed

+205
-46
lines changed

src/core/symbology-ng/qgscategorizedsymbolrendererv2.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,19 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
130130
//! @note added in 1.6
131131
QString sizeScaleField() const { return mSizeScaleField; }
132132

133+
//! @note added in 2.0
134+
void setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod ) { mScaleMethod = scaleMethod; }
135+
//! @note added in 2.0
136+
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }
137+
133138
protected:
134139
QString mAttrName;
135140
QgsCategoryList mCategories;
136141
QgsSymbolV2* mSourceSymbol;
137142
QgsVectorColorRampV2* mSourceColorRamp;
138143
QString mRotationField;
139144
QString mSizeScaleField;
145+
QgsSymbolV2::ScaleMethod mScaleMethod;
140146

141147
//! attribute index (derived from attribute name in startRender)
142148
int mAttrNum;

src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
151151
//! @note added in 1.6
152152
QString sizeScaleField() const { return mSizeScaleField; }
153153

154+
//! @note added in 2.0
155+
void setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod ) { mScaleMethod = scaleMethod; }
156+
//! @note added in 2.0
157+
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }
158+
159+
154160
protected:
155161
QString mAttrName;
156162
QgsRangeList mRanges;
@@ -159,6 +165,7 @@ class CORE_EXPORT QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
159165
QgsVectorColorRampV2* mSourceColorRamp;
160166
QString mRotationField;
161167
QString mSizeScaleField;
168+
QgsSymbolV2::ScaleMethod mScaleMethod;
162169

163170
//! attribute index (derived from attribute name in startRender)
164171
int mAttrNum;

src/core/symbology-ng/qgsmarkersymbollayerv2.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,15 @@ static QPointF _rotatedOffset( const QPointF& offset, double angle )
4848

4949
//////
5050

51-
QgsSimpleMarkerSymbolLayerV2::QgsSimpleMarkerSymbolLayerV2( QString name, QColor color, QColor borderColor, double size, double angle )
51+
QgsSimpleMarkerSymbolLayerV2::QgsSimpleMarkerSymbolLayerV2( QString name, QColor color, QColor borderColor, double size, double angle, QgsSymbolV2::ScaleMethod scaleMethod )
5252
{
5353
mName = name;
5454
mColor = color;
5555
mBorderColor = borderColor;
5656
mSize = size;
5757
mAngle = angle;
5858
mOffset = QPointF( 0, 0 );
59+
mScaleMethod = scaleMethod;
5960
}
6061

6162
QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create( const QgsStringMap& props )
@@ -65,6 +66,7 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create( const QgsStringMap& prop
6566
QColor borderColor = DEFAULT_SIMPLEMARKER_BORDERCOLOR;
6667
double size = DEFAULT_SIMPLEMARKER_SIZE;
6768
double angle = DEFAULT_SIMPLEMARKER_ANGLE;
69+
QgsSymbolV2::ScaleMethod scaleMethod = DEFAULT_SCALE_METHOD;
6870

6971
if ( props.contains( "name" ) )
7072
name = props["name"];
@@ -76,8 +78,10 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create( const QgsStringMap& prop
7678
size = props["size"].toDouble();
7779
if ( props.contains( "angle" ) )
7880
angle = props["angle"].toDouble();
81+
if ( props.contains( "scale_method" ) )
82+
scaleMethod = QgsSymbolLayerV2Utils::decodeScaleMethod( props["scale_method"] );
7983

80-
QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2( name, color, borderColor, size, angle );
84+
QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2( name, color, borderColor, size, angle, scaleMethod );
8185
if ( props.contains( "offset" ) )
8286
m->setOffset( QgsSymbolLayerV2Utils::decodePoint( props["offset"] ) );
8387
return m;
@@ -402,6 +406,14 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
402406
if ( hasDataDefinedSize )
403407
{
404408
double scaledSize = context.outputLineWidth( mSize );
409+
410+
switch( mScaleMethod )
411+
{
412+
case QgsSymbolV2::ScaleArea:
413+
scaledSize = sqrt( scaledSize );
414+
break;
415+
}
416+
405417
double half = scaledSize / 2.0;
406418
transform.scale( half, half );
407419
}
@@ -432,12 +444,13 @@ QgsStringMap QgsSimpleMarkerSymbolLayerV2::properties() const
432444
map["size"] = QString::number( mSize );
433445
map["angle"] = QString::number( mAngle );
434446
map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset );
447+
map["scale_method"] = QgsSymbolLayerV2Utils::encodeScaleMethod( mScaleMethod );
435448
return map;
436449
}
437450

438451
QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::clone() const
439452
{
440-
QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2( mName, mColor, mBorderColor, mSize, mAngle );
453+
QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2( mName, mColor, mBorderColor, mSize, mAngle, mScaleMethod );
441454
m->setOffset( mOffset );
442455
return m;
443456
}

src/core/symbology-ng/qgsmarkersymbollayerv2.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#define DEFAULT_SIMPLEMARKER_BORDERCOLOR QColor(0,0,0)
2424
#define DEFAULT_SIMPLEMARKER_SIZE DEFAULT_POINT_SIZE
2525
#define DEFAULT_SIMPLEMARKER_ANGLE 0
26+
#define DEFAULT_SCALE_METHOD QgsSymbolV2::ScaleArea
2627

2728
#include <QPen>
2829
#include <QBrush>
@@ -37,7 +38,8 @@ class CORE_EXPORT QgsSimpleMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2
3738
QColor color = DEFAULT_SIMPLEMARKER_COLOR,
3839
QColor borderColor = DEFAULT_SIMPLEMARKER_BORDERCOLOR,
3940
double size = DEFAULT_SIMPLEMARKER_SIZE,
40-
double angle = DEFAULT_SIMPLEMARKER_ANGLE );
41+
double angle = DEFAULT_SIMPLEMARKER_ANGLE,
42+
QgsSymbolV2::ScaleMethod scaleMethod = DEFAULT_SCALE_METHOD );
4143

4244
// static stuff
4345

src/core/symbology-ng/qgssinglesymbolrendererv2.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ QgsSymbolV2* QgsSingleSymbolRendererV2::symbolForFeature( QgsFeature& feature )
6161
markerSymbol->setAngle( rotation );
6262
if ( mSizeScaleFieldIdx != -1 )
6363
markerSymbol->setSize( sizeScale * mOrigSize );
64+
markerSymbol->setScaleMethod( mScaleMethod );
6465
}
6566
else if ( mTempSymbol->type() == QgsSymbolV2::Line )
6667
{
@@ -183,6 +184,7 @@ QgsFeatureRendererV2* QgsSingleSymbolRendererV2::clone()
183184
r->setUsingSymbolLevels( usingSymbolLevels() );
184185
r->setRotationField( rotationField() );
185186
r->setSizeScaleField( sizeScaleField() );
187+
r->setScaleMethod( scaleMethod() );
186188
return r;
187189
}
188190

@@ -233,7 +235,10 @@ QgsFeatureRendererV2* QgsSingleSymbolRendererV2::create( QDomElement& element )
233235

234236
QDomElement sizeScaleElem = element.firstChildElement( "sizescale" );
235237
if ( !sizeScaleElem.isNull() )
238+
{
236239
r->setSizeScaleField( sizeScaleElem.attribute( "field" ) );
240+
r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) );
241+
}
237242

238243
// TODO: symbol levels
239244
return r;
@@ -344,6 +349,7 @@ QDomElement QgsSingleSymbolRendererV2::save( QDomDocument& doc )
344349

345350
QDomElement sizeScaleElem = doc.createElement( "sizescale" );
346351
sizeScaleElem.setAttribute( "field", mSizeScaleField );
352+
sizeScaleElem.setAttribute( "scalemethod", QgsSymbolLayerV2Utils::encodeScaleMethod( mScaleMethod ) );
347353
rendererElem.appendChild( sizeScaleElem );
348354

349355
return rendererElem;

src/core/symbology-ng/qgssinglesymbolrendererv2.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "qgis.h"
1919
#include "qgsrendererv2.h"
20+
#include "qgssymbolv2.h"
2021

2122
class CORE_EXPORT QgsSingleSymbolRendererV2 : public QgsFeatureRendererV2
2223
{
@@ -47,6 +48,11 @@ class CORE_EXPORT QgsSingleSymbolRendererV2 : public QgsFeatureRendererV2
4748
//! @note added in 1.5
4849
QString sizeScaleField() const { return mSizeScaleField; }
4950

51+
//! @note added in 2.0
52+
void setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod ) { mScaleMethod = scaleMethod; }
53+
//! @note added in 2.0
54+
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }
55+
5056
virtual QString dump();
5157

5258
virtual QgsFeatureRendererV2* clone();
@@ -77,6 +83,7 @@ class CORE_EXPORT QgsSingleSymbolRendererV2 : public QgsFeatureRendererV2
7783
QgsSymbolV2* mSymbol;
7884
QString mRotationField;
7985
QString mSizeScaleField;
86+
QgsSymbolV2::ScaleMethod mScaleMethod;
8087

8188
// temporary stuff for rendering
8289
int mRotationFieldIdx, mSizeScaleFieldIdx;

src/core/symbology-ng/qgssymbollayerv2.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ class CORE_EXPORT QgsMarkerSymbolLayerV2 : public QgsSymbolLayerV2
105105
void setSize( double size ) { mSize = size; }
106106
double size() const { return mSize; }
107107

108+
void setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod ) { mScaleMethod = scaleMethod; }
109+
QgsSymbolV2::ScaleMethod scaleMethod() const { return mScaleMethod; }
110+
108111
void setOffset( QPointF offset ) { mOffset = offset; }
109112
QPointF offset() { return mOffset; }
110113

@@ -119,6 +122,7 @@ class CORE_EXPORT QgsMarkerSymbolLayerV2 : public QgsSymbolLayerV2
119122
double mAngle;
120123
double mSize;
121124
QPointF mOffset;
125+
QgsSymbolV2::ScaleMethod mScaleMethod;
122126
};
123127

124128
class CORE_EXPORT QgsLineSymbolLayerV2 : public QgsSymbolLayerV2

src/core/symbology-ng/qgssymbollayerv2utils.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,38 @@ QVector<qreal> QgsSymbolLayerV2Utils::decodeSldRealVector( const QString& s )
448448
return resultVector;
449449
}
450450

451+
QString QgsSymbolLayerV2Utils::encodeScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod )
452+
{
453+
QString encodedValue;
454+
455+
switch( scaleMethod )
456+
{
457+
case QgsSymbolV2::ScaleDiameter:
458+
encodedValue = "diameter";
459+
break;
460+
case QgsSymbolV2::ScaleArea:
461+
encodedValue = "area";
462+
break;
463+
}
464+
return encodedValue;
465+
}
466+
467+
QgsSymbolV2::ScaleMethod QgsSymbolLayerV2Utils::decodeScaleMethod( QString str )
468+
{
469+
QgsSymbolV2::ScaleMethod scaleMethod;
470+
471+
if ( str == "diameter" )
472+
{
473+
scaleMethod = QgsSymbolV2::ScaleDiameter;
474+
}
475+
else
476+
{
477+
scaleMethod = QgsSymbolV2::ScaleArea;
478+
}
479+
480+
return scaleMethod;
481+
}
482+
451483
QIcon QgsSymbolLayerV2Utils::symbolPreviewIcon( QgsSymbolV2* symbol, QSize size )
452484
{
453485
return QIcon( symbolPreviewPixmap( symbol, size ) );

src/core/symbology-ng/qgssymbollayerv2utils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ class CORE_EXPORT QgsSymbolLayerV2Utils
9090
static QString encodeSldUom( QgsSymbolV2::OutputUnit unit, double *scaleFactor );
9191
static QgsSymbolV2::OutputUnit decodeSldUom( QString str, double *scaleFactor );
9292

93+
static QString encodeScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod );
94+
static QgsSymbolV2::ScaleMethod decodeScaleMethod( QString str );
95+
9396
static QIcon symbolPreviewIcon( QgsSymbolV2* symbol, QSize size );
9497
static QIcon symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, QgsSymbolV2::OutputUnit u, QSize size );
9598
static QIcon colorRampPreviewIcon( QgsVectorColorRampV2* ramp, QSize size );

src/core/symbology-ng/qgssymbolv2.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ double QgsMarkerSymbolV2::angle()
444444
return 0;
445445

446446
// return angle of the first symbol layer
447-
const QgsMarkerSymbolLayerV2 *layer = static_cast<const QgsMarkerSymbolLayerV2 *>( *it );
447+
const QgsMarkerSymbolLayerV2* layer = static_cast<const QgsMarkerSymbolLayerV2 *>( *it );
448448
return layer->angle();
449449
}
450450

@@ -480,6 +480,28 @@ double QgsMarkerSymbolV2::size()
480480
return maxSize;
481481
}
482482

483+
484+
void QgsMarkerSymbolV2::setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod )
485+
{
486+
for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it )
487+
{
488+
QgsMarkerSymbolLayerV2* layer = static_cast<QgsMarkerSymbolLayerV2*>( *it );
489+
layer->setScaleMethod( scaleMethod );
490+
}
491+
}
492+
493+
QgsSymbolV2::ScaleMethod QgsMarkerSymbolV2::scaleMethod()
494+
{
495+
QgsSymbolLayerV2List::const_iterator it = mLayers.begin();
496+
497+
if ( it == mLayers.end() )
498+
return DEFAULT_SCALE_METHOD;
499+
500+
// return scale method of the first symbol layer
501+
const QgsMarkerSymbolLayerV2* layer = static_cast<const QgsMarkerSymbolLayerV2 *>( *it );
502+
return layer->scaleMethod();
503+
}
504+
483505
void QgsMarkerSymbolV2::renderPoint( const QPointF& point, const QgsFeature* f, QgsRenderContext& context, int layer, bool selected )
484506
{
485507
QgsSymbolV2RenderContext symbolContext( context, mOutputUnit, mAlpha, selected, mRenderHints, f );

0 commit comments

Comments
 (0)