From 51b547d78c1fce1aa4381179b51d689a452050d5 Mon Sep 17 00:00:00 2001 From: rldhont Date: Fri, 10 Jan 2020 11:42:34 +0100 Subject: [PATCH 1/8] [BUGFIX] Read SLD TextSymbolizer set units to pixels --- src/core/qgsvectorlayer.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index 7243c6016da1..eb4c259dc9dd 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -4475,6 +4475,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet QString fontFamily = QStringLiteral( "Sans-Serif" ); int fontPointSize = 10; + QgsUnitTypes::RenderUnit fontUnitSize = QgsUnitTypes::RenderPoints; int fontWeight = -1; bool fontItalic = false; bool fontUnderline = false; @@ -4501,7 +4502,10 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet bool ok; int fontSize = it.value().toInt( &ok ); if ( ok ) + { fontPointSize = fontSize; + fontUnitSize = QgsUnitTypes::RenderPixels; + } } else if ( it.key() == QLatin1String( "font-weight" ) ) { @@ -4520,6 +4524,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet font.setUnderline( fontUnderline ); format.setFont( font ); format.setSize( fontPointSize ); + format.setSizeUnit( fontUnitSize ); // Fill QDomElement fillElem = textSymbolizerElem.firstChildElement( QStringLiteral( "Fill" ) ); @@ -4549,6 +4554,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { bufferSettings.setSize( bufferSize ); + bufferSettings.setSizeUnit( QgsUnitTypes::RenderPixels ); } } @@ -4584,6 +4590,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.xOffset = xOffset; + settings.offsetUnits = QgsUnitTypes::RenderPixels; } } QDomElement displacementYElem = displacementElem.firstChildElement( QStringLiteral( "DisplacementY" ) ); @@ -4594,6 +4601,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.yOffset = yOffset; + settings.offsetUnits = QgsUnitTypes::RenderPixels; } } } @@ -4608,6 +4616,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.xOffset = xOffset; + settings.distUnits = QgsUnitTypes::RenderPixels; } } QDomElement anchorPointYElem = anchorPointElem.firstChildElement( QStringLiteral( "AnchorPointY" ) ); @@ -4618,6 +4627,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.yOffset = yOffset; + settings.distUnits = QgsUnitTypes::RenderPixels; } } } From 4291ace6c2c449ba44ff42a410f6eae367bb0c48 Mon Sep 17 00:00:00 2001 From: rldhont Date: Fri, 10 Jan 2020 12:02:18 +0100 Subject: [PATCH 2/8] [Tests] Read SLD TextSymbolizer set units to pixels --- tests/src/python/test_qgssymbollayer_readsld.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/src/python/test_qgssymbollayer_readsld.py b/tests/src/python/test_qgssymbollayer_readsld.py index 98b80b3908a9..193ab468f470 100644 --- a/tests/src/python/test_qgssymbollayer_readsld.py +++ b/tests/src/python/test_qgssymbollayer_readsld.py @@ -442,10 +442,12 @@ def testLineOpacity(): self.assertFalse(font.italic()) self.assertEqual(format.size(), 18) + self.assertEqual(format.sizeUnit(), QgsUnitTypes.RenderPixels) self.assertEqual(settings.placement, QgsPalLayerSettings.OverPoint) self.assertEqual(settings.xOffset, 1) self.assertEqual(settings.yOffset, 0) + self.assertEqual(settings.offsetUnits, QgsUnitTypes.RenderPixels) if __name__ == '__main__': From 32cad40eb96594188d90e1fce9d12aaddfd05eaa Mon Sep 17 00:00:00 2001 From: rldhont Date: Fri, 10 Jan 2020 14:28:07 +0100 Subject: [PATCH 3/8] [Bugfix] Read SLD TextSymbolizer : change offset units if offset change --- src/core/qgsvectorlayer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index eb4c259dc9dd..59673ae255b3 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -4616,7 +4616,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.xOffset = xOffset; - settings.distUnits = QgsUnitTypes::RenderPixels; + settings.offsetUnits = QgsUnitTypes::RenderPixels; } } QDomElement anchorPointYElem = anchorPointElem.firstChildElement( QStringLiteral( "AnchorPointY" ) ); @@ -4627,7 +4627,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.yOffset = yOffset; - settings.distUnits = QgsUnitTypes::RenderPixels; + settings.offsetUnits = QgsUnitTypes::RenderPixels; } } } From 0ea6c7a0e9c3f6bd21b99b46f9251d8856656e51 Mon Sep 17 00:00:00 2001 From: rldhont Date: Mon, 13 Jan 2020 17:27:14 +0100 Subject: [PATCH 4/8] [API] QgsSymbolLayerUtils::decodeSldUom, scaleFactor is not mandatory --- python/core/auto_generated/symbology/qgssymbollayerutils.sip.in | 2 +- src/core/symbology/qgssymbollayerutils.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in index 105a0a3b66ad..c5c96a81b145 100644 --- a/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in +++ b/python/core/auto_generated/symbology/qgssymbollayerutils.sip.in @@ -171,7 +171,7 @@ Encodes a render unit into an SLD unit of measure string. .. seealso:: :py:func:`decodeSldUom` %End - static QgsUnitTypes::RenderUnit decodeSldUom( const QString &str, double *scaleFactor ); + static QgsUnitTypes::RenderUnit decodeSldUom( const QString &str, double *scaleFactor = 0 ); %Docstring Decodes a SLD unit of measure string to a render unit. diff --git a/src/core/symbology/qgssymbollayerutils.h b/src/core/symbology/qgssymbollayerutils.h index 4206b76abeaf..78beb65f7a0d 100644 --- a/src/core/symbology/qgssymbollayerutils.h +++ b/src/core/symbology/qgssymbollayerutils.h @@ -191,7 +191,7 @@ class CORE_EXPORT QgsSymbolLayerUtils * \returns matching render unit * \see encodeSldUom() */ - static QgsUnitTypes::RenderUnit decodeSldUom( const QString &str, double *scaleFactor ); + static QgsUnitTypes::RenderUnit decodeSldUom( const QString &str, double *scaleFactor = nullptr ); /** * Returns the size scaled in pixels according to the uom attribute. From a58dc6bfc3e3a61c722b518480f71818fc085cf0 Mon Sep 17 00:00:00 2001 From: rldhont Date: Mon, 13 Jan 2020 17:28:44 +0100 Subject: [PATCH 5/8] Read SLD TextSymbolizer: use QgsSymbolLayerUtils::decodeSldUom --- src/core/qgsvectorlayer.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index 59673ae255b3..c980667dbd8f 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -4473,6 +4473,12 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet return false; } + QgsUnitTypes::RenderUnit sldUnitSize = QgsUnitTypes::RenderPixels; + if ( textSymbolizerElem.hasAttribute( QStringLiteral( "uom" ) ) ) + { + sldUnitSize = QgsSymbolLayerUtils::decodeSldUom( textSymbolizerElem.attribute( QStringLiteral( "uom" ) ) ); + } + QString fontFamily = QStringLiteral( "Sans-Serif" ); int fontPointSize = 10; QgsUnitTypes::RenderUnit fontUnitSize = QgsUnitTypes::RenderPoints; @@ -4504,7 +4510,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { fontPointSize = fontSize; - fontUnitSize = QgsUnitTypes::RenderPixels; + fontUnitSize = sldUnitSize; } } else if ( it.key() == QLatin1String( "font-weight" ) ) @@ -4554,7 +4560,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { bufferSettings.setSize( bufferSize ); - bufferSettings.setSizeUnit( QgsUnitTypes::RenderPixels ); + bufferSettings.setSizeUnit( sldUnitSize ); } } @@ -4590,7 +4596,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.xOffset = xOffset; - settings.offsetUnits = QgsUnitTypes::RenderPixels; + settings.offsetUnits = sldUnitSize; } } QDomElement displacementYElem = displacementElem.firstChildElement( QStringLiteral( "DisplacementY" ) ); @@ -4601,7 +4607,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.yOffset = yOffset; - settings.offsetUnits = QgsUnitTypes::RenderPixels; + settings.offsetUnits = sldUnitSize; } } } @@ -4616,7 +4622,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.xOffset = xOffset; - settings.offsetUnits = QgsUnitTypes::RenderPixels; + settings.offsetUnits = sldUnitSize; } } QDomElement anchorPointYElem = anchorPointElem.firstChildElement( QStringLiteral( "AnchorPointY" ) ); @@ -4627,7 +4633,7 @@ bool QgsVectorLayer::readSldTextSymbolizer( const QDomNode &node, QgsPalLayerSet if ( ok ) { settings.yOffset = yOffset; - settings.offsetUnits = QgsUnitTypes::RenderPixels; + settings.offsetUnits = sldUnitSize; } } } From 680df967ada4a620ad37ac92a3fc4d2a373ea95e Mon Sep 17 00:00:00 2001 From: rldhont Date: Mon, 13 Jan 2020 17:44:37 +0100 Subject: [PATCH 6/8] QgsSymbolLayerUtils::decodeSldUom add decode Pixel uom --- src/core/symbology/qgssymbollayerutils.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/core/symbology/qgssymbollayerutils.cpp b/src/core/symbology/qgssymbollayerutils.cpp index 1abf7c143128..7e51f3073f84 100644 --- a/src/core/symbology/qgssymbollayerutils.cpp +++ b/src/core/symbology/qgssymbollayerutils.cpp @@ -640,6 +640,12 @@ QgsUnitTypes::RenderUnit QgsSymbolLayerUtils::decodeSldUom( const QString &str, *scaleFactor = 304.8; // from feet to meters return QgsUnitTypes::RenderMapUnits; } + else if ( str == QLatin1String( "http://www.opengeospatial.org/se/units/pixel" ) ) + { + if ( scaleFactor ) + *scaleFactor = 1.0; // from pixels to pixels + return QgsUnitTypes::RenderPixels; + } // pixel is the SLD default uom. The "standardized rendering pixel // size" is defined to be 0.28mm x 0.28mm (millimeters). From 39ae955e4337482cda607d66d47f0957ba8c999d Mon Sep 17 00:00:00 2001 From: rldhont Date: Wed, 15 Jan 2020 15:52:46 +0100 Subject: [PATCH 7/8] [Tests] Add QgsSymbolLayerUtils::decodeSldUom test --- tests/src/python/test_qgssymbollayerutils.py | 23 +++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests/src/python/test_qgssymbollayerutils.py b/tests/src/python/test_qgssymbollayerutils.py index 531a28a79860..419a649b5cc8 100644 --- a/tests/src/python/test_qgssymbollayerutils.py +++ b/tests/src/python/test_qgssymbollayerutils.py @@ -14,7 +14,8 @@ from qgis.core import (QgsSymbolLayerUtils, QgsMarkerSymbol, - QgsArrowSymbolLayer) + QgsArrowSymbolLayer, + QgsUnitTypes) from qgis.PyQt.QtGui import QColor from qgis.PyQt.QtCore import QSizeF, QPointF from qgis.testing import unittest, start_app @@ -210,6 +211,26 @@ def testSymbolToFromMimeData(self): self.assertTrue(symbol2 is not None) self.assertEqual(symbol2.color().name(), symbol.color().name()) + def testDecodeSldUom(self): + """ + Test Decodes a SLD unit of measure string to a render unit + """ + + # meter + decode = None + decode = QgsSymbolLayerUtils.decodeSldUom("http://www.opengeospatial.org/se/units/metre") + self.assertEqual(decode, (QgsUnitTypes.RenderMapUnits, 1000.0)) + + # foot + decode = None + decode = QgsSymbolLayerUtils.decodeSldUom("http://www.opengeospatial.org/se/units/foot") + self.assertEqual(decode, (QgsUnitTypes.RenderMapUnits, 304.8)) + + # pixel + decode = None + decode = QgsSymbolLayerUtils.decodeSldUom("http://www.opengeospatial.org/se/units/pixel") + self.assertEqual(decode, (QgsUnitTypes.RenderPixels, 1.0)) + if __name__ == '__main__': unittest.main() From dbb53be7f3eda6e1c6aeb5124989aec77dc6d5da Mon Sep 17 00:00:00 2001 From: rldhont Date: Wed, 15 Jan 2020 15:59:46 +0100 Subject: [PATCH 8/8] [Tests] Add QgsSymbolLayerUtils::encodeSldUom test --- tests/src/python/test_qgssymbollayerutils.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/src/python/test_qgssymbollayerutils.py b/tests/src/python/test_qgssymbollayerutils.py index 419a649b5cc8..b2841c9c5659 100644 --- a/tests/src/python/test_qgssymbollayerutils.py +++ b/tests/src/python/test_qgssymbollayerutils.py @@ -211,6 +211,21 @@ def testSymbolToFromMimeData(self): self.assertTrue(symbol2 is not None) self.assertEqual(symbol2.color().name(), symbol.color().name()) + def testEncodeSldUom(self): + """ + Test Encodes a SLD unit of measure string to a render unit + """ + + # millimeter + encode = None + encode = QgsSymbolLayerUtils.encodeSldUom(QgsUnitTypes.RenderMillimeters) + self.assertTupleEqual(encode, ('', 3.571428571428571)) + + # mapunits + encode = None + encode = QgsSymbolLayerUtils.encodeSldUom(QgsUnitTypes.RenderMapUnits) + self.assertTupleEqual(encode, ('http://www.opengeospatial.org/se/units/metre', 0.001)) + def testDecodeSldUom(self): """ Test Decodes a SLD unit of measure string to a render unit