Skip to content

Commit 1ed94d0

Browse files
committedMay 12, 2014
fixed simple marker, ellipse, svg anchor with data defined size, fixes #9579
1 parent 4670a16 commit 1ed94d0

File tree

6 files changed

+49
-30
lines changed

6 files changed

+49
-30
lines changed
 

‎src/core/symbology-ng/qgsellipsesymbollayerv2.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,20 +236,22 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend
236236
QString colorString = outlineColorExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toString();
237237
mPen.setColor( QColor( QgsSymbolLayerV2Utils::decodeColor( colorString ) ) );
238238
}
239+
double scaledWidth = mSymbolWidth;
240+
double scaledHeight = mSymbolHeight;
239241
if ( widthExpression || heightExpression || symbolNameExpression )
240242
{
241243
QString symbolName = mSymbolName;
242244
if ( symbolNameExpression )
243245
{
244246
symbolName = symbolNameExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toString();
245247
}
246-
preparePath( symbolName, context, context.feature() );
248+
preparePath( symbolName, context, &scaledWidth, &scaledHeight, context.feature() );
247249
}
248250

249251
//offset
250252
double offsetX = 0;
251253
double offsetY = 0;
252-
markerOffset( context, mSymbolWidth, mSymbolHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
254+
markerOffset( context, scaledWidth, scaledHeight, mSymbolWidthUnit, mSymbolHeightUnit, offsetX, offsetY, mSymbolWidthMapUnitScale, mSymbolHeightMapUnitScale );
253255
QPointF off( offsetX, offsetY );
254256

255257
QPainter* p = context.renderContext().painter();
@@ -459,7 +461,7 @@ bool QgsEllipseSymbolLayerV2::hasDataDefinedProperty() const
459461
|| dataDefinedProperty( "symbol_name" ) || dataDefinedProperty( "offset" ) );
460462
}
461463

462-
void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV2RenderContext& context, const QgsFeature* f )
464+
void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV2RenderContext& context, double* scaledWidth, double* scaledHeight, const QgsFeature* f )
463465
{
464466
mPainterPath = QPainterPath();
465467
const QgsRenderContext& ct = context.renderContext();
@@ -479,6 +481,10 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV
479481
{
480482
width = mSymbolWidth;
481483
}
484+
if ( scaledWidth )
485+
{
486+
*scaledWidth = width;
487+
}
482488
width *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( ct, mSymbolWidthUnit, mSymbolHeightMapUnitScale );
483489

484490
double height = 0;
@@ -495,6 +501,10 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV
495501
{
496502
height = mSymbolHeight;
497503
}
504+
if ( scaledHeight )
505+
{
506+
*scaledHeight = height;
507+
}
498508
height *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( ct, mSymbolHeightUnit, mSymbolHeightMapUnitScale );
499509

500510
if ( symbolName == "circle" )

‎src/core/symbology-ng/qgsellipsesymbollayerv2.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class CORE_EXPORT QgsEllipseSymbolLayerV2: public QgsMarkerSymbolLayerV2
111111
@param symbolName name of symbol
112112
@param context render context
113113
@param f feature f to render (0 if no data defined rendering)*/
114-
void preparePath( const QString& symbolName, QgsSymbolV2RenderContext& context, const QgsFeature* f = 0 );
114+
void preparePath( const QString& symbolName, QgsSymbolV2RenderContext& context, double* scaledWidth = 0, double* scaledHeight = 0, const QgsFeature* f = 0 );
115115

116116
/**True if this symbol layer uses a data defined property*/
117117
bool hasDataDefinedProperty() const;

‎src/core/symbology-ng/qgsmarkersymbollayerv2.cpp

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -481,10 +481,27 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
481481
return;
482482
}
483483

484+
QgsExpression *sizeExpression = expression( "size" );
485+
bool hasDataDefinedSize = context.renderHints() & QgsSymbolV2::DataDefinedSizeScale || sizeExpression;
486+
487+
double scaledSize = mSize;
488+
if ( hasDataDefinedSize )
489+
{
490+
if ( sizeExpression )
491+
{
492+
scaledSize = sizeExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble();
493+
}
494+
495+
if ( mScaleMethod == QgsSymbolV2::ScaleArea )
496+
{
497+
scaledSize = sqrt( scaledSize );
498+
}
499+
}
500+
484501
//offset
485502
double offsetX = 0;
486503
double offsetY = 0;
487-
markerOffset( context, offsetX, offsetY );
504+
markerOffset( context, scaledSize, scaledSize, offsetX, offsetY );
488505
QPointF off( offsetX, offsetY );
489506

490507
//angle
@@ -522,30 +539,13 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
522539
// move to the desired position
523540
transform.translate( point.x() + off.x(), point.y() + off.y() );
524541

525-
QgsExpression *sizeExpression = expression( "size" );
526-
bool hasDataDefinedSize = context.renderHints() & QgsSymbolV2::DataDefinedSizeScale || sizeExpression;
527-
528542
// resize if necessary
529543
if ( hasDataDefinedSize )
530544
{
531-
double scaledSize = mSize;
532-
if ( sizeExpression )
533-
{
534-
scaledSize = sizeExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble();
535-
}
536-
537-
switch ( mScaleMethod )
538-
{
539-
case QgsSymbolV2::ScaleArea:
540-
scaledSize = sqrt( scaledSize );
541-
break;
542-
case QgsSymbolV2::ScaleDiameter:
543-
break;
544-
}
545545

546-
scaledSize *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale );
546+
double s = scaledSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale );
547547

548-
double half = scaledSize / 2.0;
548+
double half = s / 2.0;
549549
transform.scale( half, half );
550550
}
551551

@@ -1140,27 +1140,28 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
11401140
if ( !p )
11411141
return;
11421142

1143-
double size = mSize;
1143+
double scaledSize = mSize;
11441144
QgsExpression* sizeExpression = expression( "size" );
11451145
bool hasDataDefinedSize = context.renderHints() & QgsSymbolV2::DataDefinedSizeScale || sizeExpression;
11461146

11471147
if ( sizeExpression )
11481148
{
1149-
size = sizeExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble();
1149+
scaledSize = sizeExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble();
11501150
}
11511151

11521152
if ( hasDataDefinedSize )
11531153
{
11541154
switch ( mScaleMethod )
11551155
{
11561156
case QgsSymbolV2::ScaleArea:
1157-
size = sqrt( size );
1157+
scaledSize = sqrt( scaledSize );
11581158
break;
11591159
case QgsSymbolV2::ScaleDiameter:
11601160
break;
11611161
}
11621162
}
1163-
size *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale );
1163+
1164+
double size = scaledSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit, mSizeMapUnitScale );
11641165

11651166
//don't render symbols with size below one or above 10,000 pixels
11661167
if (( int )size < 1 || 10000.0 < size )
@@ -1173,7 +1174,7 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
11731174
//offset
11741175
double offsetX = 0;
11751176
double offsetY = 0;
1176-
markerOffset( context, offsetX, offsetY );
1177+
markerOffset( context, scaledSize, scaledSize, offsetX, offsetY );
11771178
QPointF outputOffset( offsetX, offsetY );
11781179

11791180
double angle = mAngle;

‎src/core/symbology-ng/qgsmarkersymbollayerv2.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ class CORE_EXPORT QgsSimpleMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2
105105
QgsMapUnitScale mapUnitScale() const;
106106

107107
protected:
108-
109108
void drawMarker( QPainter* p, QgsSymbolV2RenderContext& context );
110109

111110
bool prepareShape( QString name = QString() );

‎src/core/symbology-ng/qgssymbollayerv2.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,11 @@ void QgsMarkerSymbolLayerV2::markerOffset( const QgsSymbolV2RenderContext& conte
231231
markerOffset( context, mSize, mSize, mSizeUnit, mSizeUnit, offsetX, offsetY, mSizeMapUnitScale, mSizeMapUnitScale );
232232
}
233233

234+
void QgsMarkerSymbolLayerV2::markerOffset( const QgsSymbolV2RenderContext& context, double width, double height, double& offsetX, double& offsetY ) const
235+
{
236+
markerOffset( context, width, height, mSizeUnit, mSizeUnit, offsetX, offsetY, mSizeMapUnitScale, mSizeMapUnitScale );
237+
}
238+
234239
void QgsMarkerSymbolLayerV2::markerOffset( const QgsSymbolV2RenderContext& context, double width, double height,
235240
QgsSymbolV2::OutputUnit widthUnit, QgsSymbolV2::OutputUnit heightUnit,
236241
double& offsetX, double& offsetY, const QgsMapUnitScale& widthMapUnitScale, const QgsMapUnitScale& heightMapUnitScale ) const

‎src/core/symbology-ng/qgssymbollayerv2.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,13 @@ class CORE_EXPORT QgsMarkerSymbolLayerV2 : public QgsSymbolLayerV2
223223
protected:
224224
QgsMarkerSymbolLayerV2( bool locked = false );
225225

226+
bool hasDataDefinedSize() const;
227+
226228
//handles marker offset and anchor point shift together
227229
void markerOffset( const QgsSymbolV2RenderContext& context, double& offsetX, double& offsetY ) const;
228230

231+
void markerOffset( const QgsSymbolV2RenderContext& context, double width, double height, double& offsetX, double& offsetY ) const;
232+
229233
//! @note available in python bindings as markerOffset2
230234
void markerOffset( const QgsSymbolV2RenderContext& context, double width, double height,
231235
QgsSymbolV2::OutputUnit widthUnit, QgsSymbolV2::OutputUnit heightUnit,

0 commit comments

Comments
 (0)
Please sign in to comment.