From b3cbefc998ba0363d0150b71710afbf09e44f0e5 Mon Sep 17 00:00:00 2001 From: edigonzales Date: Thu, 12 Jun 2014 15:48:55 +0200 Subject: [PATCH] fixes two symbology bugs --- .../core/symbology-ng/qgsmarkersymbollayerv2.sip | 3 ++- src/core/symbology-ng/qgslinesymbollayerv2.cpp | 16 +++++++++++++++- src/core/symbology-ng/qgsmarkersymbollayerv2.cpp | 14 ++++++++++---- src/core/symbology-ng/qgsmarkersymbollayerv2.h | 3 ++- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/python/core/symbology-ng/qgsmarkersymbollayerv2.sip b/python/core/symbology-ng/qgsmarkersymbollayerv2.sip index 5753faec875..038b3e5275e 100644 --- a/python/core/symbology-ng/qgsmarkersymbollayerv2.sip +++ b/python/core/symbology-ng/qgsmarkersymbollayerv2.sip @@ -95,7 +95,8 @@ class QgsSvgMarkerSymbolLayerV2 : QgsMarkerSymbolLayerV2 public: QgsSvgMarkerSymbolLayerV2( QString name = DEFAULT_SVGMARKER_NAME, double size = DEFAULT_SVGMARKER_SIZE, - double angle = DEFAULT_SVGMARKER_ANGLE ); + double angle = DEFAULT_SVGMARKER_ANGLE, + QgsSymbolV2::ScaleMethod scaleMethod = DEFAULT_SCALE_METHOD ); // static stuff diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp index 0f624fae1c0..9bb68a4be2e 100644 --- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp +++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp @@ -443,12 +443,26 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon QgsExpression* dashPatternExpression = expression( "customdash" ); if ( dashPatternExpression ) { + + double scaledWidth = mWidth * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mWidthUnit, mWidthMapUnitScale ); + + double dashWidthDiv = mPen.widthF(); + //fix dash pattern width in Qt 4.8 + QStringList versionSplit = QString( qVersion() ).split( "." ); + if ( versionSplit.size() > 1 + && versionSplit.at( 1 ).toInt() >= 8 + && ( scaledWidth * context.renderContext().rasterScaleFactor() ) < 1.0 ) + { + dashWidthDiv = 1.0; + } + + QVector dashVector; QStringList dashList = dashPatternExpression->evaluate( const_cast( context.feature() ) ).toString().split( ";" ); QStringList::const_iterator dashIt = dashList.constBegin(); for ( ; dashIt != dashList.constEnd(); ++dashIt ) { - dashVector.push_back( dashIt->toDouble() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit, mCustomDashPatternMapUnitScale ) / mPen.widthF() ); + dashVector.push_back( dashIt->toDouble() * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mCustomDashPatternUnit, mCustomDashPatternMapUnitScale ) / dashWidthDiv ); } pen.setDashPattern( dashVector ); } diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp index cd40faf959b..9313b68e8e6 100644 --- a/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp +++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.cpp @@ -976,12 +976,13 @@ QgsMapUnitScale QgsSimpleMarkerSymbolLayerV2::mapUnitScale() const ////////// -QgsSvgMarkerSymbolLayerV2::QgsSvgMarkerSymbolLayerV2( QString name, double size, double angle ) +QgsSvgMarkerSymbolLayerV2::QgsSvgMarkerSymbolLayerV2( QString name, double size, double angle, QgsSymbolV2::ScaleMethod scaleMethod ) { mPath = QgsSymbolLayerV2Utils::symbolNameToPath( name ); mSize = size; mAngle = angle; mOffset = QPointF( 0, 0 ); + mScaleMethod = scaleMethod; mOutlineWidth = 1.0; mOutlineWidthUnit = QgsSymbolV2::MM; mFillColor = QColor( Qt::black ); @@ -994,15 +995,18 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::create( const QgsStringMap& props ) QString name = DEFAULT_SVGMARKER_NAME; double size = DEFAULT_SVGMARKER_SIZE; double angle = DEFAULT_SVGMARKER_ANGLE; - + QgsSymbolV2::ScaleMethod scaleMethod = DEFAULT_SCALE_METHOD; + if ( props.contains( "name" ) ) name = props["name"]; if ( props.contains( "size" ) ) size = props["size"].toDouble(); if ( props.contains( "angle" ) ) angle = props["angle"].toDouble(); - - QgsSvgMarkerSymbolLayerV2* m = new QgsSvgMarkerSymbolLayerV2( name, size, angle ); + if ( props.contains( "scale_method" ) ) + scaleMethod = QgsSymbolLayerV2Utils::decodeScaleMethod( props["scale_method"] ); + + QgsSvgMarkerSymbolLayerV2* m = new QgsSvgMarkerSymbolLayerV2( name, size, angle, scaleMethod ); //we only check the svg default parameters if necessary, since it could be expensive if ( !props.contains( "fill" ) && !props.contains( "outline" ) && !props.contains( "outline-width" ) ) @@ -1143,6 +1147,7 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re double scaledSize = mSize; QgsExpression* sizeExpression = expression( "size" ); + bool hasDataDefinedSize = context.renderHints() & QgsSymbolV2::DataDefinedSizeScale || sizeExpression; if ( sizeExpression ) @@ -1297,6 +1302,7 @@ QgsStringMap QgsSvgMarkerSymbolLayerV2::properties() const map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset ); map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit ); map["offset_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOffsetMapUnitScale ); + map["scale_method"] = QgsSymbolLayerV2Utils::encodeScaleMethod( mScaleMethod ); map["fill"] = mFillColor.name(); map["outline"] = mOutlineColor.name(); map["outline-width"] = QString::number( mOutlineWidth ); diff --git a/src/core/symbology-ng/qgsmarkersymbollayerv2.h b/src/core/symbology-ng/qgsmarkersymbollayerv2.h index 81a4eb9ab2f..817caa0cf5d 100644 --- a/src/core/symbology-ng/qgsmarkersymbollayerv2.h +++ b/src/core/symbology-ng/qgsmarkersymbollayerv2.h @@ -149,7 +149,8 @@ class CORE_EXPORT QgsSvgMarkerSymbolLayerV2 : public QgsMarkerSymbolLayerV2 public: QgsSvgMarkerSymbolLayerV2( QString name = DEFAULT_SVGMARKER_NAME, double size = DEFAULT_SVGMARKER_SIZE, - double angle = DEFAULT_SVGMARKER_ANGLE ); + double angle = DEFAULT_SVGMARKER_ANGLE, + QgsSymbolV2::ScaleMethod scaleMethod = DEFAULT_SCALE_METHOD ); // static stuff