From 6e311cdd9f61fea474d0e0da52133d0d7023601f Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Wed, 21 Dec 2022 15:06:40 +0100 Subject: [PATCH] SLD simple marker rotation data-defined field ref export Fix #24953 at least for simple cases where the expression is a simple field reference. --- src/core/symbology/qgsmarkersymbollayer.cpp | 22 +++++++++++++------ .../python/test_qgssymbollayer_createsld.py | 16 +++++++++++++- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/core/symbology/qgsmarkersymbollayer.cpp b/src/core/symbology/qgsmarkersymbollayer.cpp index 925afce0f5c7..ec8a53699b4d 100644 --- a/src/core/symbology/qgsmarkersymbollayer.cpp +++ b/src/core/symbology/qgsmarkersymbollayer.cpp @@ -18,7 +18,6 @@ #include "qgsdxfexport.h" #include "qgsdxfpaintdevice.h" -#include "qgsexpression.h" #include "qgsfontutils.h" #include "qgsimagecache.h" #include "qgsimageoperation.h" @@ -1416,16 +1415,25 @@ void QgsSimpleMarkerSymbolLayer::writeSldMarker( QDomDocument &doc, QDomElement // QString angleFunc; - bool ok; - const double angle = props.value( QStringLiteral( "angle" ), QStringLiteral( "0" ) ).toDouble( &ok ); - if ( !ok ) + + if ( mDataDefinedProperties.isActive( QgsSymbolLayer::Property::PropertyAngle ) ) { - angleFunc = QStringLiteral( "%1 + %2" ).arg( props.value( QStringLiteral( "angle" ), QStringLiteral( "0" ) ).toString() ).arg( mAngle ); + angleFunc = mDataDefinedProperties.property( QgsSymbolLayer::Property::PropertyAngle ).asExpression(); } - else if ( !qgsDoubleNear( angle + mAngle, 0.0 ) ) + else { - angleFunc = QString::number( angle + mAngle ); + bool ok; + const double angle = props.value( QStringLiteral( "angle" ), QStringLiteral( "0" ) ).toDouble( &ok ); + if ( !ok ) + { + angleFunc = QStringLiteral( "%1 + %2" ).arg( props.value( QStringLiteral( "angle" ), QStringLiteral( "0" ) ).toString() ).arg( mAngle ); + } + else if ( !qgsDoubleNear( angle + mAngle, 0.0 ) ) + { + angleFunc = QString::number( angle + mAngle ); + } } + QgsSymbolLayerUtils::createRotationElement( doc, graphicElem, angleFunc ); // diff --git a/tests/src/python/test_qgssymbollayer_createsld.py b/tests/src/python/test_qgssymbollayer_createsld.py index 5bc2f38b7eac..4998b76847b6 100644 --- a/tests/src/python/test_qgssymbollayer_createsld.py +++ b/tests/src/python/test_qgssymbollayer_createsld.py @@ -26,12 +26,13 @@ from qgis.PyQt.QtGui import QColor, QFont from qgis.core import ( + Qgis, QgsSimpleMarkerSymbolLayer, QgsSimpleMarkerSymbolLayerBase, QgsUnitTypes, QgsSvgMarkerSymbolLayer, QgsFontMarkerSymbolLayer, QgsEllipseSymbolLayer, QgsSimpleLineSymbolLayer, QgsMarkerLineSymbolLayer, QgsMarkerSymbol, QgsSimpleFillSymbolLayer, QgsSVGFillSymbolLayer, QgsLinePatternFillSymbolLayer, QgsPointPatternFillSymbolLayer, QgsVectorLayer, QgsVectorLayerSimpleLabeling, QgsTextBufferSettings, QgsPalLayerSettings, QgsTextBackgroundSettings, QgsRuleBasedLabeling, - QgsLineSymbol) + QgsLineSymbol, QgsSymbolLayer, QgsSimpleMarkerSymbolLayer, QgsProperty) from qgis.testing import start_app, unittest from utilities import unitTestDataPath @@ -1226,6 +1227,19 @@ def testRuleBaseEmptyFilter(self): self.assertEqual(1, filter.elementsByTagName('ogc:PropertyIsEqualTo').size()) self.assertEqual(1, filter.elementsByTagName('ogc:PropertyIsNull').size()) + def testDataDefinedAngle(self): + + l = QgsSimpleMarkerSymbolLayer(Qgis.MarkerShape.Triangle) + p = l.dataDefinedProperties() + p.setProperty(QgsSymbolLayer.Property.PropertyAngle, QgsProperty.fromExpression('"field_a"')) + dom = QDomDocument() + root = dom.createElement("FakeRoot") + dom.appendChild(root) + l.toSld(dom, root, dict()) + rot = dom.elementsByTagName('se:Rotation').at(0).firstChild().toElement() + self.assertEqual(rot.tagName(), 'ogc:PropertyName') + self.assertEqual(rot.text(), 'field_a') + def assertScaleDenominator(self, root, expectedMinScale, expectedMaxScale, index=0): rule = root.elementsByTagName('se:Rule').item(index).toElement()