Skip to content

Commit

Permalink
SLD simple marker rotation data-defined field ref export
Browse files Browse the repository at this point in the history
Fix #24953 at least for simple cases where the expression
is a simple field reference.
  • Loading branch information
elpaso authored and github-actions[bot] committed Dec 28, 2022
1 parent b47e00b commit 9a96246
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 8 deletions.
22 changes: 15 additions & 7 deletions src/core/symbology/qgsmarkersymbollayer.cpp
Expand Up @@ -18,7 +18,6 @@

#include "qgsdxfexport.h"
#include "qgsdxfpaintdevice.h"
#include "qgsexpression.h"
#include "qgsfontutils.h"
#include "qgsimagecache.h"
#include "qgsimageoperation.h"
Expand Down Expand Up @@ -1416,16 +1415,25 @@ void QgsSimpleMarkerSymbolLayer::writeSldMarker( QDomDocument &doc, QDomElement

// <Rotation>
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 );

// <Displacement>
Expand Down
16 changes: 15 additions & 1 deletion tests/src/python/test_qgssymbollayer_createsld.py
Expand Up @@ -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

Expand Down Expand Up @@ -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()

Expand Down

0 comments on commit 9a96246

Please sign in to comment.