Skip to content

Commit 0bab3ca

Browse files
committedMay 22, 2015
remove SizeScale and Rotation from Advanced Menu
The expressions used in old project are converted to symbol level DadaDefined size and angle Note that sice the aspect of a composite marker is fixed for symbol size and angle, the aspect of the scaled symbol will change for symbols with offsets and composite markers.
1 parent a32ac3d commit 0bab3ca

File tree

4 files changed

+189
-20
lines changed

4 files changed

+189
-20
lines changed
 

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

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone() const
494494
r->setUsingSymbolLevels( usingSymbolLevels() );
495495
r->setRotationField( rotationField() );
496496
r->setSizeScaleField( sizeScaleField() );
497-
r->setScaleMethod( scaleMethod() );
497+
//r->setScaleMethod( scaleMethod() );
498498

499499
copyPaintEffect( r );
500500
return r;
@@ -525,6 +525,46 @@ QgsSymbolV2List QgsCategorizedSymbolRendererV2::symbols()
525525
return lst;
526526
}
527527

528+
//!@note this function is duplicated in 3 cpp files, it's used to convert
529+
//! old sizeScale expresssions to symbol level DataDefined size
530+
inline void convertSymbolSizeScale( QgsSymbolV2 * symbol, QgsSymbolV2::ScaleMethod method, const QString & field )
531+
{
532+
if ( symbol->type() == QgsSymbolV2::Marker )
533+
{
534+
QgsMarkerSymbolV2 * s = static_cast<QgsMarkerSymbolV2 *>( symbol );
535+
if ( QgsSymbolV2::ScaleArea == method )
536+
{
537+
const QgsDataDefined dd( "sqrt(" + QString::number( s->size() ) + " * (" + field + "))" );
538+
s->setDataDefinedSize( dd );
539+
}
540+
else
541+
{
542+
const QgsDataDefined dd( QString::number( s->size() ) + " * (" + field + ")" );
543+
s->setDataDefinedSize( dd );
544+
}
545+
}
546+
else if ( symbol->type() == QgsSymbolV2::Line )
547+
{
548+
QgsLineSymbolV2 * s = static_cast<QgsLineSymbolV2 *>( symbol );
549+
const QgsDataDefined dd( QString::number( s->width() ) + " * (" + field + ")" );
550+
s->setDataDefinedWidth( dd );
551+
}
552+
}
553+
554+
//!@note this function is duplicated in 3 cpp files, it's used to convert
555+
//! old rotations expresssions to symbol level DataDefined angle
556+
inline void convertSymbolRotation( QgsSymbolV2 * symbol, const QString & field )
557+
{
558+
if ( symbol->type() == QgsSymbolV2::Marker )
559+
{
560+
QgsMarkerSymbolV2 * s = static_cast<QgsMarkerSymbolV2 *>( symbol );
561+
const QgsDataDefined dd(( s->angle()
562+
? QString::number( s->angle() ) + " + "
563+
: QString() ) + field );
564+
s->setDataDefinedAngle( dd );
565+
}
566+
}
567+
528568
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& element )
529569
{
530570
QDomElement symbolsElem = element.firstChildElement( "symbols" );
@@ -586,14 +626,36 @@ QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& eleme
586626
}
587627

588628
QDomElement rotationElem = element.firstChildElement( "rotation" );
589-
if ( !rotationElem.isNull() )
590-
r->setRotationField( rotationElem.attribute( "field" ) );
629+
if ( !rotationElem.isNull() && !rotationElem.attribute( "field" ).isEmpty() )
630+
{
631+
const QgsDataDefined dd( rotationElem.attribute( "field" ) );
632+
QgsCategoryList::iterator it = r->mCategories.begin();
633+
for ( ; it != r->mCategories.end(); ++it )
634+
{
635+
convertSymbolRotation( it->symbol(), rotationElem.attribute( "field" ) );
636+
}
637+
if ( r->mSourceSymbol.data() )
638+
{
639+
convertSymbolRotation( r->mSourceSymbol.data(), rotationElem.attribute( "field" ) );
640+
}
641+
}
591642

592643
QDomElement sizeScaleElem = element.firstChildElement( "sizescale" );
593-
if ( !sizeScaleElem.isNull() )
644+
if ( !sizeScaleElem.isNull() && !sizeScaleElem.attribute( "field" ).isEmpty() )
594645
{
595-
r->setSizeScaleField( sizeScaleElem.attribute( "field" ) );
596-
r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) );
646+
QgsCategoryList::iterator it = r->mCategories.begin();
647+
for ( ; it != r->mCategories.end(); ++it )
648+
{
649+
convertSymbolSizeScale( it->symbol(),
650+
QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ),
651+
sizeScaleElem.attribute( "field" ) );
652+
}
653+
if ( r->mSourceSymbol.data() && r->mSourceSymbol->type() == QgsSymbolV2::Marker )
654+
{
655+
convertSymbolSizeScale( r->mSourceSymbol.data(),
656+
QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ),
657+
sizeScaleElem.attribute( "field" ) );
658+
}
597659
}
598660

599661
// TODO: symbol levels

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

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::clone() const
519519
r->setUsingSymbolLevels( usingSymbolLevels() );
520520
r->setRotationField( rotationField() );
521521
r->setSizeScaleField( sizeScaleField() );
522-
r->setScaleMethod( scaleMethod() );
522+
//r->setScaleMethod( scaleMethod() );
523523
r->setLabelFormat( labelFormat() );
524524
r->setGraduatedMethod( graduatedMethod() );
525525
copyPaintEffect( r );
@@ -937,6 +937,45 @@ void QgsGraduatedSymbolRendererV2::updateClasses( QgsVectorLayer *vlayer, Mode m
937937
updateColorRamp( 0, mInvertedColorRamp );
938938
}
939939

940+
//!@note this function is duplicated in 3 cpp files, it's used to convert
941+
//! old sizeScale expresssions to symbol level DataDefined size
942+
inline void convertSymbolSizeScale( QgsSymbolV2 * symbol, QgsSymbolV2::ScaleMethod method, const QString & field )
943+
{
944+
if ( symbol->type() == QgsSymbolV2::Marker )
945+
{
946+
QgsMarkerSymbolV2 * s = static_cast<QgsMarkerSymbolV2 *>( symbol );
947+
if ( QgsSymbolV2::ScaleArea == method )
948+
{
949+
const QgsDataDefined dd( "sqrt(" + QString::number( s->size() ) + " * (" + field + "))" );
950+
s->setDataDefinedSize( dd );
951+
}
952+
else
953+
{
954+
const QgsDataDefined dd( QString::number( s->size() ) + " * (" + field + ")" );
955+
s->setDataDefinedSize( dd );
956+
}
957+
}
958+
else if ( symbol->type() == QgsSymbolV2::Line )
959+
{
960+
QgsLineSymbolV2 * s = static_cast<QgsLineSymbolV2 *>( symbol );
961+
const QgsDataDefined dd( QString::number( s->width() ) + " * (" + field + ")" );
962+
s->setDataDefinedWidth( dd );
963+
}
964+
}
965+
966+
//!@note this function is duplicated in 3 cpp files, it's used to convert
967+
//! old rotations expresssions to symbol level DataDefined angle
968+
inline void convertSymbolRotation( QgsSymbolV2 * symbol, const QString & field )
969+
{
970+
if ( symbol->type() == QgsSymbolV2::Marker )
971+
{
972+
QgsMarkerSymbolV2 * s = static_cast<QgsMarkerSymbolV2 *>( symbol );
973+
const QgsDataDefined dd(( s->angle()
974+
? QString::number( s->angle() ) + " + "
975+
: QString() ) + field );
976+
s->setDataDefinedAngle( dd );
977+
}
978+
}
940979

941980
QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::create( QDomElement& element )
942981
{
@@ -1027,13 +1066,35 @@ QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::create( QDomElement& element
10271066
}
10281067

10291068
QDomElement rotationElem = element.firstChildElement( "rotation" );
1030-
if ( !rotationElem.isNull() )
1031-
r->setRotationField( rotationElem.attribute( "field" ) );
1069+
if ( !rotationElem.isNull() && !rotationElem.attribute( "field" ).isEmpty() )
1070+
{
1071+
const QgsDataDefined dd( rotationElem.attribute( "field" ) );
1072+
for ( QgsRangeList::iterator it = r->mRanges.begin(); it != r->mRanges.end(); ++it )
1073+
{
1074+
convertSymbolRotation( it->symbol(), rotationElem.attribute( "field" ) );
1075+
}
1076+
if ( r->mSourceSymbol.data() )
1077+
{
1078+
convertSymbolRotation( r->mSourceSymbol.data(), rotationElem.attribute( "field" ) );
1079+
}
1080+
}
10321081

10331082
QDomElement sizeScaleElem = element.firstChildElement( "sizescale" );
1034-
if ( !sizeScaleElem.isNull() )
1035-
r->setSizeScaleField( sizeScaleElem.attribute( "field" ) );
1036-
r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) );
1083+
if ( !sizeScaleElem.isNull() && !sizeScaleElem.attribute( "field" ).isEmpty() )
1084+
{
1085+
for ( QgsRangeList::iterator it = r->mRanges.begin(); it != r->mRanges.end(); ++it )
1086+
{
1087+
convertSymbolSizeScale( it->symbol(),
1088+
QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ),
1089+
sizeScaleElem.attribute( "field" ) );
1090+
}
1091+
if ( r->mSourceSymbol.data() && r->mSourceSymbol->type() == QgsSymbolV2::Marker )
1092+
{
1093+
convertSymbolSizeScale( r->mSourceSymbol.data(),
1094+
QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ),
1095+
sizeScaleElem.attribute( "field" ) );
1096+
}
1097+
}
10371098

10381099
QDomElement labelFormatElem = element.firstChildElement( "labelformat" );
10391100
if ( ! labelFormatElem.isNull() )

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

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ QgsFeatureRendererV2* QgsSingleSymbolRendererV2::clone() const
185185
r->setUsingSymbolLevels( usingSymbolLevels() );
186186
r->setRotationField( rotationField() );
187187
r->setSizeScaleField( sizeScaleField() );
188-
r->setScaleMethod( scaleMethod() );
188+
//r->setScaleMethod( scaleMethod() );
189189
copyPaintEffect( r );
190190
return r;
191191
}
@@ -216,6 +216,46 @@ QgsSymbolV2List QgsSingleSymbolRendererV2::symbols()
216216
return lst;
217217
}
218218

219+
//!@note this function is duplicated in 3 cpp files, it's used to convert
220+
//! old sizeScale expresssions to symbol level DataDefined size
221+
inline void convertSymbolSizeScale( QgsSymbolV2 * symbol, QgsSymbolV2::ScaleMethod method, const QString & field )
222+
{
223+
if ( symbol->type() == QgsSymbolV2::Marker )
224+
{
225+
QgsMarkerSymbolV2 * s = static_cast<QgsMarkerSymbolV2 *>( symbol );
226+
if ( QgsSymbolV2::ScaleArea == method )
227+
{
228+
const QgsDataDefined dd( "sqrt(" + QString::number( s->size() ) + " * (" + field + "))" );
229+
s->setDataDefinedSize( dd );
230+
}
231+
else
232+
{
233+
const QgsDataDefined dd( QString::number( s->size() ) + " * (" + field + ")" );
234+
s->setDataDefinedSize( dd );
235+
}
236+
}
237+
else if ( symbol->type() == QgsSymbolV2::Line )
238+
{
239+
QgsLineSymbolV2 * s = static_cast<QgsLineSymbolV2 *>( symbol );
240+
const QgsDataDefined dd( QString::number( s->width() ) + " * (" + field + ")" );
241+
s->setDataDefinedWidth( dd );
242+
}
243+
}
244+
245+
//!@note this function is duplicated in 3 cpp files, it's used to convert
246+
//! old rotations expresssions to symbol level DataDefined angle
247+
inline void convertSymbolRotation( QgsSymbolV2 * symbol, const QString & field )
248+
{
249+
if ( symbol->type() == QgsSymbolV2::Marker )
250+
{
251+
QgsMarkerSymbolV2 * s = static_cast<QgsMarkerSymbolV2 *>( symbol );
252+
const QgsDataDefined dd(( s->angle()
253+
? QString::number( s->angle() ) + " + "
254+
: QString() ) + field );
255+
s->setDataDefinedAngle( dd );
256+
}
257+
}
258+
219259
QgsFeatureRendererV2* QgsSingleSymbolRendererV2::create( QDomElement& element )
220260
{
221261
QDomElement symbolsElem = element.firstChildElement( "symbols" );
@@ -233,14 +273,17 @@ QgsFeatureRendererV2* QgsSingleSymbolRendererV2::create( QDomElement& element )
233273
QgsSymbolLayerV2Utils::clearSymbolMap( symbolMap );
234274

235275
QDomElement rotationElem = element.firstChildElement( "rotation" );
236-
if ( !rotationElem.isNull() )
237-
r->setRotationField( rotationElem.attribute( "field" ) );
276+
if ( !rotationElem.isNull() && !rotationElem.attribute( "field" ).isEmpty() )
277+
{
278+
convertSymbolRotation( r->mSymbol.data(), rotationElem.attribute( "field" ) );
279+
}
238280

239281
QDomElement sizeScaleElem = element.firstChildElement( "sizescale" );
240-
if ( !sizeScaleElem.isNull() )
282+
if ( !sizeScaleElem.isNull() && !sizeScaleElem.attribute( "field" ).isEmpty() )
241283
{
242-
r->setSizeScaleField( sizeScaleElem.attribute( "field" ) );
243-
r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) );
284+
convertSymbolSizeScale( r->mSymbol.data(),
285+
QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ),
286+
sizeScaleElem.attribute( "field" ) );
244287
}
245288

246289
// TODO: symbol levels

‎src/gui/symbology-ng/qgsrendererv2widget.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,11 @@ QgsRendererV2DataDefinedMenus::QgsRendererV2DataDefinedMenus( QMenu* menu, QgsVe
241241

242242
mSizeScaleMenu->addActions( mSizeMethodActionGroup->actions() );
243243

244-
menu->addMenu( mRotationMenu );
245-
menu->addMenu( mSizeScaleMenu );
244+
//@todo cleanup the class since Rotation and SizeScale are now
245+
//defined using QgsDataDefinedButton
246+
//
247+
//menu->addMenu( mRotationMenu );
248+
//menu->addMenu( mSizeScaleMenu );
246249

247250
connect( mSizeMethodActionGroup, SIGNAL( triggered( QAction* ) ), this, SLOT( scaleMethodSelected( QAction* ) ) );
248251
connect( mRotationAttributeActionGroup, SIGNAL( triggered( QAction* ) ), this, SLOT( rotationFieldSelected( QAction* ) ) );

0 commit comments

Comments
 (0)
Please sign in to comment.