@@ -949,24 +949,24 @@ void QgsMarkerSymbolV2::setAngle( double ang )
949
949
950
950
double QgsMarkerSymbolV2::angle () const
951
951
{
952
- QgsSymbolLayerV2List::const_iterator it = mLayers . begin ();
953
-
954
- if ( it == mLayers . end () )
955
- return 0 ;
956
-
957
- // return angle of the first symbol layer
958
- const QgsMarkerSymbolLayerV2* layer = static_cast < const QgsMarkerSymbolLayerV2 *>( *it );
959
- return layer-> angle () ;
952
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
953
+ {
954
+ if ( layer-> type () != QgsSymbolV2::Marker )
955
+ continue ;
956
+ const QgsMarkerSymbolLayerV2* markerLayer = static_cast < const QgsMarkerSymbolLayerV2*>( layer );
957
+ return markerLayer-> angle ();
958
+ }
959
+ return 0 ;
960
960
}
961
961
962
962
void QgsMarkerSymbolV2::setLineAngle ( double lineAng )
963
963
{
964
964
Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
965
965
{
966
- QgsMarkerSymbolLayerV2* markerLayer = dynamic_cast <QgsMarkerSymbolLayerV2*>( layer );
967
-
968
- if ( markerLayer )
969
- markerLayer->setLineAngle ( lineAng );
966
+ if ( layer-> type () != QgsSymbolV2::Marker )
967
+ continue ;
968
+ QgsMarkerSymbolLayerV2* markerLayer = static_cast <QgsMarkerSymbolLayerV2*>( layer );
969
+ markerLayer->setLineAngle ( lineAng );
970
970
}
971
971
}
972
972
@@ -976,25 +976,23 @@ void QgsMarkerSymbolV2::setDataDefinedAngle( const QgsDataDefined& dd )
976
976
977
977
Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
978
978
{
979
- QgsMarkerSymbolLayerV2* markerLayer = dynamic_cast <QgsMarkerSymbolLayerV2*>( layer );
980
-
981
- if ( markerLayer )
979
+ if ( layer->type () != QgsSymbolV2::Marker )
980
+ continue ;
981
+ const QgsMarkerSymbolLayerV2* markerLayer = static_cast <const QgsMarkerSymbolLayerV2*>( layer );
982
+ if ( dd.hasDefaultValues () )
982
983
{
983
- if ( dd.hasDefaultValues () )
984
+ layer->removeDataDefinedProperty ( " angle" );
985
+ }
986
+ else
987
+ {
988
+ if ( qgsDoubleNear ( markerLayer->angle (), symbolRotation ) )
984
989
{
985
- layer->removeDataDefinedProperty ( " angle" );
990
+ layer->setDataDefinedProperty ( " angle" , new QgsDataDefined ( dd ) );
986
991
}
987
992
else
988
993
{
989
- if ( qgsDoubleNear ( markerLayer->angle (), symbolRotation ) )
990
- {
991
- layer->setDataDefinedProperty ( " angle" , new QgsDataDefined ( dd ) );
992
- }
993
- else
994
- {
995
- QgsDataDefined* rotatedDD = rotateWholeSymbol ( markerLayer->angle () - symbolRotation, dd );
996
- layer->setDataDefinedProperty ( " angle" , rotatedDD );
997
- }
994
+ QgsDataDefined* rotatedDD = rotateWholeSymbol ( markerLayer->angle () - symbolRotation, dd );
995
+ layer->setDataDefinedProperty ( " angle" , rotatedDD );
998
996
}
999
997
}
1000
998
}
@@ -1006,12 +1004,14 @@ QgsDataDefined QgsMarkerSymbolV2::dataDefinedAngle() const
1006
1004
QgsDataDefined* symbolDD = 0 ;
1007
1005
1008
1006
// find the base of the "en masse" pattern
1009
- for ( QgsSymbolLayerV2List::const_iterator it = mLayers . begin (); it != mLayers . end (); ++it )
1007
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1010
1008
{
1011
- const QgsMarkerSymbolLayerV2* layer = static_cast <const QgsMarkerSymbolLayerV2 *>( *it );
1012
- if ( layer->angle () == symbolRotation && layer->getDataDefinedProperty ( " angle" ) )
1009
+ if ( layer->type () != QgsSymbolV2::Marker )
1010
+ continue ;
1011
+ const QgsMarkerSymbolLayerV2* markerLayer = static_cast <const QgsMarkerSymbolLayerV2*>( layer );
1012
+ if ( markerLayer->angle () == symbolRotation && markerLayer->getDataDefinedProperty ( " angle" ) )
1013
1013
{
1014
- symbolDD = layer ->getDataDefinedProperty ( " angle" );
1014
+ symbolDD = markerLayer ->getDataDefinedProperty ( " angle" );
1015
1015
break ;
1016
1016
}
1017
1017
}
@@ -1020,20 +1020,21 @@ QgsDataDefined QgsMarkerSymbolV2::dataDefinedAngle() const
1020
1020
return QgsDataDefined ();
1021
1021
1022
1022
// check that all layer's angle expressions match the "en masse" pattern
1023
- for ( QgsSymbolLayerV2List::const_iterator it = mLayers . begin (); it != mLayers . end (); ++it )
1023
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1024
1024
{
1025
- const QgsMarkerSymbolLayerV2* layer = static_cast <const QgsMarkerSymbolLayerV2 *>( *it );
1026
-
1027
- QgsDataDefined* layerAngleDD = layer->getDataDefinedProperty ( " angle" );
1025
+ if ( layer->type () != QgsSymbolV2::Marker )
1026
+ continue ;
1027
+ const QgsMarkerSymbolLayerV2* markerLayer = static_cast <const QgsMarkerSymbolLayerV2*>( layer );
1028
+ QgsDataDefined* layerAngleDD = markerLayer->getDataDefinedProperty ( " angle" );
1028
1029
1029
- if ( qgsDoubleNear ( layer ->angle (), symbolRotation ) )
1030
+ if ( qgsDoubleNear ( markerLayer ->angle (), symbolRotation ) )
1030
1031
{
1031
1032
if ( !layerAngleDD || *layerAngleDD != *symbolDD )
1032
1033
return QgsDataDefined ();
1033
1034
}
1034
1035
else
1035
1036
{
1036
- QScopedPointer< QgsDataDefined > rotatedDD ( rotateWholeSymbol ( layer ->angle () - symbolRotation, *symbolDD ) );
1037
+ QScopedPointer< QgsDataDefined > rotatedDD ( rotateWholeSymbol ( markerLayer ->angle () - symbolRotation, *symbolDD ) );
1037
1038
if ( !layerAngleDD || *layerAngleDD != *( rotatedDD.data () ) )
1038
1039
return QgsDataDefined ();
1039
1040
}
@@ -1048,7 +1049,9 @@ void QgsMarkerSymbolV2::setSize( double s )
1048
1049
1049
1050
Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1050
1051
{
1051
- QgsMarkerSymbolLayerV2* markerLayer = dynamic_cast <QgsMarkerSymbolLayerV2*>( layer );
1052
+ if ( layer->type () != QgsSymbolV2::Marker )
1053
+ continue ;
1054
+ QgsMarkerSymbolLayerV2* markerLayer = static_cast <QgsMarkerSymbolLayerV2*>( layer );
1052
1055
if ( markerLayer->size () == origSize )
1053
1056
markerLayer->setSize ( s );
1054
1057
else if ( origSize != 0 )
@@ -1067,10 +1070,12 @@ double QgsMarkerSymbolV2::size() const
1067
1070
{
1068
1071
// return size of the largest symbol
1069
1072
double maxSize = 0 ;
1070
- for ( QgsSymbolLayerV2List::const_iterator it = mLayers . begin (); it != mLayers . end (); ++it )
1073
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1071
1074
{
1072
- const QgsMarkerSymbolLayerV2* layer = static_cast <const QgsMarkerSymbolLayerV2 *>( *it );
1073
- double lsize = layer->size ();
1075
+ if ( layer->type () != QgsSymbolV2::Marker )
1076
+ continue ;
1077
+ const QgsMarkerSymbolLayerV2* markerLayer = static_cast <const QgsMarkerSymbolLayerV2*>( layer );
1078
+ double lsize = markerLayer->size ();
1074
1079
if ( lsize > maxSize )
1075
1080
maxSize = lsize;
1076
1081
}
@@ -1083,7 +1088,9 @@ void QgsMarkerSymbolV2::setDataDefinedSize( const QgsDataDefined &dd )
1083
1088
1084
1089
Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1085
1090
{
1086
- QgsMarkerSymbolLayerV2* markerLayer = dynamic_cast <QgsMarkerSymbolLayerV2 *>( layer );
1091
+ if ( layer->type () != QgsSymbolV2::Marker )
1092
+ continue ;
1093
+ QgsMarkerSymbolLayerV2* markerLayer = static_cast <QgsMarkerSymbolLayerV2*>( layer );
1087
1094
1088
1095
if ( dd.hasDefaultValues () )
1089
1096
{
@@ -1118,12 +1125,14 @@ QgsDataDefined QgsMarkerSymbolV2::dataDefinedSize() const
1118
1125
QgsDataDefined* symbolDD = 0 ;
1119
1126
1120
1127
// find the base of the "en masse" pattern
1121
- for ( QgsSymbolLayerV2List::const_iterator it = mLayers . begin (); it != mLayers . end (); ++it )
1128
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1122
1129
{
1123
- const QgsMarkerSymbolLayerV2* layer = static_cast <const QgsMarkerSymbolLayerV2 *>( *it );
1124
- if ( layer->size () == symbolSize && layer->getDataDefinedProperty ( " size" ) )
1130
+ if ( layer->type () != QgsSymbolV2::Marker )
1131
+ continue ;
1132
+ const QgsMarkerSymbolLayerV2* markerLayer = static_cast <const QgsMarkerSymbolLayerV2*>( layer );
1133
+ if ( markerLayer->size () == symbolSize && markerLayer->getDataDefinedProperty ( " size" ) )
1125
1134
{
1126
- symbolDD = layer ->getDataDefinedProperty ( " size" );
1135
+ symbolDD = markerLayer ->getDataDefinedProperty ( " size" );
1127
1136
break ;
1128
1137
}
1129
1138
}
@@ -1132,14 +1141,16 @@ QgsDataDefined QgsMarkerSymbolV2::dataDefinedSize() const
1132
1141
return QgsDataDefined ();
1133
1142
1134
1143
// check that all layers size expressions match the "en masse" pattern
1135
- for ( QgsSymbolLayerV2List::const_iterator it = mLayers . begin (); it != mLayers . end (); ++it )
1144
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1136
1145
{
1137
- const QgsMarkerSymbolLayerV2* layer = static_cast <const QgsMarkerSymbolLayerV2 *>( *it );
1146
+ if ( layer->type () != QgsSymbolV2::Marker )
1147
+ continue ;
1148
+ const QgsMarkerSymbolLayerV2* markerLayer = static_cast <const QgsMarkerSymbolLayerV2*>( layer );
1138
1149
1139
- QgsDataDefined* layerSizeDD = layer ->getDataDefinedProperty ( " size" );
1140
- QgsDataDefined* layerOffsetDD = layer ->getDataDefinedProperty ( " offset" );
1150
+ QgsDataDefined* layerSizeDD = markerLayer ->getDataDefinedProperty ( " size" );
1151
+ QgsDataDefined* layerOffsetDD = markerLayer ->getDataDefinedProperty ( " offset" );
1141
1152
1142
- if ( qgsDoubleNear ( layer ->size (), symbolSize ) )
1153
+ if ( qgsDoubleNear ( markerLayer ->size (), symbolSize ) )
1143
1154
{
1144
1155
if ( !layerSizeDD || *layerSizeDD != *symbolDD )
1145
1156
return QgsDataDefined ();
@@ -1149,12 +1160,12 @@ QgsDataDefined QgsMarkerSymbolV2::dataDefinedSize() const
1149
1160
if ( symbolSize == 0 )
1150
1161
return QgsDataDefined ();
1151
1162
1152
- QScopedPointer< QgsDataDefined > scaledDD ( scaleWholeSymbol ( layer ->size () / symbolSize, *symbolDD ) );
1163
+ QScopedPointer< QgsDataDefined > scaledDD ( scaleWholeSymbol ( markerLayer ->size () / symbolSize, *symbolDD ) );
1153
1164
if ( !layerSizeDD || *layerSizeDD != *( scaledDD.data () ) )
1154
1165
return QgsDataDefined ();
1155
1166
}
1156
1167
1157
- QScopedPointer< QgsDataDefined > scaledOffsetDD ( scaleWholeSymbol ( layer ->offset ().x () / symbolSize, layer ->offset ().y () / symbolSize, *symbolDD ) );
1168
+ QScopedPointer< QgsDataDefined > scaledOffsetDD ( scaleWholeSymbol ( markerLayer ->offset ().x () / symbolSize, markerLayer ->offset ().y () / symbolSize, *symbolDD ) );
1158
1169
if ( layerOffsetDD && *layerOffsetDD != *( scaledOffsetDD.data () ) )
1159
1170
return QgsDataDefined ();
1160
1171
}
@@ -1166,22 +1177,25 @@ void QgsMarkerSymbolV2::setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod )
1166
1177
{
1167
1178
Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1168
1179
{
1169
- QgsMarkerSymbolLayerV2* markerLayer = dynamic_cast <QgsMarkerSymbolLayerV2*>( layer );
1170
- if ( markerLayer )
1171
- markerLayer->setScaleMethod ( scaleMethod );
1180
+ if ( layer->type () != QgsSymbolV2::Marker )
1181
+ continue ;
1182
+ QgsMarkerSymbolLayerV2* markerLayer = static_cast <QgsMarkerSymbolLayerV2*>( layer );
1183
+ markerLayer->setScaleMethod ( scaleMethod );
1172
1184
}
1173
1185
}
1174
1186
1175
1187
QgsSymbolV2::ScaleMethod QgsMarkerSymbolV2::scaleMethod ()
1176
1188
{
1177
- QgsSymbolLayerV2List::const_iterator it = mLayers .begin ();
1178
-
1179
- if ( it == mLayers .end () )
1180
- return DEFAULT_SCALE_METHOD;
1189
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1190
+ {
1191
+ if ( layer->type () != QgsSymbolV2::Marker )
1192
+ continue ;
1193
+ const QgsMarkerSymbolLayerV2* markerLayer = static_cast <const QgsMarkerSymbolLayerV2*>( layer );
1194
+ // return scale method of the first symbol layer
1195
+ return markerLayer->scaleMethod ();
1196
+ }
1181
1197
1182
- // return scale method of the first symbol layer
1183
- const QgsMarkerSymbolLayerV2* layer = static_cast <const QgsMarkerSymbolLayerV2 *>( *it );
1184
- return layer->scaleMethod ();
1198
+ return DEFAULT_SCALE_METHOD;
1185
1199
}
1186
1200
1187
1201
void QgsMarkerSymbolV2::renderPointUsingLayer ( QgsMarkerSymbolLayerV2* layer, const QPointF& point, QgsSymbolV2RenderContext& context )
@@ -1241,12 +1255,16 @@ QRectF QgsMarkerSymbolV2::bounds( const QPointF& point, QgsRenderContext& contex
1241
1255
QgsSymbolV2RenderContext symbolContext ( context, outputUnit (), mAlpha , false , mRenderHints , 0 , 0 , mapUnitScale () );
1242
1256
1243
1257
QRectF bound;
1244
- for ( QgsSymbolLayerV2List::const_iterator it = mLayers . constBegin (); it != mLayers . constEnd (); ++it )
1258
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1245
1259
{
1246
- if ( bound.isNull () )
1247
- bound = static_cast < QgsMarkerSymbolLayerV2* >( *it )->bounds ( point, symbolContext );
1248
- else
1249
- bound = bound.united ( static_cast < QgsMarkerSymbolLayerV2* >( *it )->bounds ( point, symbolContext ) );
1260
+ if ( layer->type () == QgsSymbolV2::Marker )
1261
+ {
1262
+ QgsMarkerSymbolLayerV2* symbolLayer = static_cast < QgsMarkerSymbolLayerV2* >( layer );
1263
+ if ( bound.isNull () )
1264
+ bound = symbolLayer->bounds ( point, symbolContext );
1265
+ else
1266
+ bound = symbolLayer->bounds ( point, symbolContext );
1267
+ }
1250
1268
}
1251
1269
return bound;
1252
1270
}
@@ -1370,14 +1388,16 @@ QgsDataDefined QgsLineSymbolV2::dataDefinedWidth() const
1370
1388
return QgsDataDefined ();
1371
1389
1372
1390
// check that all layers width expressions match the "en masse" pattern
1373
- for ( QgsSymbolLayerV2List::const_iterator it = mLayers . begin (); it != mLayers . end (); ++it )
1391
+ Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1374
1392
{
1375
- const QgsLineSymbolLayerV2* layer = static_cast <const QgsLineSymbolLayerV2*>( *it );
1393
+ if ( layer->type () != QgsSymbolV2::Line )
1394
+ continue ;
1395
+ const QgsLineSymbolLayerV2* lineLayer = static_cast <const QgsLineSymbolLayerV2*>( layer );
1376
1396
1377
- QgsDataDefined* layerWidthDD = layer ->getDataDefinedProperty ( " width" );
1378
- QgsDataDefined* layerOffsetDD = layer ->getDataDefinedProperty ( " offset" );
1397
+ QgsDataDefined* layerWidthDD = lineLayer ->getDataDefinedProperty ( " width" );
1398
+ QgsDataDefined* layerOffsetDD = lineLayer ->getDataDefinedProperty ( " offset" );
1379
1399
1380
- if ( qgsDoubleNear ( layer ->width (), symbolWidth ) )
1400
+ if ( qgsDoubleNear ( lineLayer ->width (), symbolWidth ) )
1381
1401
{
1382
1402
if ( !layerWidthDD || *layerWidthDD != *symbolDD )
1383
1403
return QgsDataDefined ();
@@ -1387,12 +1407,12 @@ QgsDataDefined QgsLineSymbolV2::dataDefinedWidth() const
1387
1407
if ( symbolWidth == 0 )
1388
1408
return QgsDataDefined ();
1389
1409
1390
- QScopedPointer< QgsDataDefined > scaledDD ( scaleWholeSymbol ( layer ->width () / symbolWidth, *symbolDD ) );
1410
+ QScopedPointer< QgsDataDefined > scaledDD ( scaleWholeSymbol ( lineLayer ->width () / symbolWidth, *symbolDD ) );
1391
1411
if ( !layerWidthDD || *layerWidthDD != *( scaledDD.data () ) )
1392
1412
return QgsDataDefined ();
1393
1413
}
1394
1414
1395
- QScopedPointer< QgsDataDefined > scaledOffsetDD ( scaleWholeSymbol ( layer ->offset () / symbolWidth, *symbolDD ) );
1415
+ QScopedPointer< QgsDataDefined > scaledOffsetDD ( scaleWholeSymbol ( lineLayer ->offset () / symbolWidth, *symbolDD ) );
1396
1416
if ( layerOffsetDD && *layerOffsetDD != *( scaledOffsetDD.data () ) )
1397
1417
return QgsDataDefined ();
1398
1418
}
@@ -1422,7 +1442,9 @@ void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, const QgsFeature*
1422
1442
1423
1443
Q_FOREACH ( QgsSymbolLayerV2* symbolLayer, mLayers )
1424
1444
{
1425
- QgsLineSymbolLayerV2* lineLayer = dynamic_cast <QgsLineSymbolLayerV2*>( symbolLayer );
1445
+ if ( symbolLayer->type () != QgsSymbolV2::Line )
1446
+ continue ;
1447
+ QgsLineSymbolLayerV2* lineLayer = static_cast <QgsLineSymbolLayerV2*>( symbolLayer );
1426
1448
1427
1449
if ( lineLayer )
1428
1450
renderPolylineUsingLayer ( lineLayer, points, symbolContext );
@@ -1480,9 +1502,9 @@ void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList<QPolygonF>*
1480
1502
1481
1503
if ( layerIdx != -1 )
1482
1504
{
1483
- if ( layerIdx >= 0 && layerIdx < mLayers .count () )
1505
+ QgsSymbolLayerV2* layer = mLayers .value ( layerIdx );
1506
+ if ( layer )
1484
1507
{
1485
- QgsSymbolLayerV2* layer = mLayers .at ( layerIdx );
1486
1508
if ( layer->type () == Fill || layer->type () == Line )
1487
1509
renderPolygonUsingLayer ( layer, points, rings, symbolContext );
1488
1510
else
@@ -1582,7 +1604,10 @@ void QgsFillSymbolV2::setAngle( double angle )
1582
1604
{
1583
1605
Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
1584
1606
{
1585
- QgsFillSymbolLayerV2* fillLayer = dynamic_cast <QgsFillSymbolLayerV2*>( layer );
1607
+ if ( layer->type () != QgsSymbolV2::Fill )
1608
+ continue ;
1609
+
1610
+ QgsFillSymbolLayerV2* fillLayer = static_cast <QgsFillSymbolLayerV2*>( layer );
1586
1611
1587
1612
if ( fillLayer )
1588
1613
fillLayer->setAngle ( angle );
0 commit comments