From f7397e8b4affff04333969acee90c19022eb12ad Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 29 Sep 2021 10:43:21 +1000 Subject: [PATCH] Fix symbol sizes in Meters at Scale cannot be negative Fixes #45298 --- src/core/qgsrendercontext.cpp | 4 +++- tests/src/python/test_qgsrendercontext.py | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/core/qgsrendercontext.cpp b/src/core/qgsrendercontext.cpp index 5fc9906100f0..383dbb90e0b1 100644 --- a/src/core/qgsrendercontext.cpp +++ b/src/core/qgsrendercontext.cpp @@ -572,7 +572,9 @@ double QgsRenderContext::convertMetersToMapUnits( double meters ) const { pointCenter = mCoordTransform.transform( pointCenter ); } - return mDistanceArea.measureLineProjected( pointCenter, meters ); + + const int multiplier = meters < 0 ? -1 : 1; + return multiplier * mDistanceArea.measureLineProjected( pointCenter, std::fabs( meters ) ); } case QgsUnitTypes::DistanceKilometers: case QgsUnitTypes::DistanceFeet: diff --git a/tests/src/python/test_qgsrendercontext.py b/tests/src/python/test_qgsrendercontext.py index 272e7fa9b324..04323d47eb6c 100644 --- a/tests/src/python/test_qgsrendercontext.py +++ b/tests/src/python/test_qgsrendercontext.py @@ -253,9 +253,14 @@ def testRenderMetersInMapUnits(self): r.setDistanceArea(da_wsg84) result_test_painterunits = r.convertToPainterUnits(meters_test, QgsUnitTypes.RenderMetersInMapUnits, c) self.assertAlmostEqual(result_test_painterunits, 60.0203759, 1) + result_test_painterunits = r.convertToPainterUnits(-meters_test, QgsUnitTypes.RenderMetersInMapUnits, c) + self.assertAlmostEqual(result_test_painterunits, -60.0203759, 1) result_test_mapunits = r.convertToMapUnits(meters_test, QgsUnitTypes.RenderMetersInMapUnits, c) self.assertEqual(QgsDistanceArea.formatDistance(result_test_mapunits, 7, QgsUnitTypes.DistanceDegrees, True), QgsDistanceArea.formatDistance(meters_test_mapunits, 7, QgsUnitTypes.DistanceDegrees, True)) + result_test_mapunits = r.convertToMapUnits(-meters_test, QgsUnitTypes.RenderMetersInMapUnits, c) + self.assertEqual(QgsDistanceArea.formatDistance(result_test_mapunits, 7, QgsUnitTypes.DistanceDegrees, True), + QgsDistanceArea.formatDistance(-meters_test_mapunits, 7, QgsUnitTypes.DistanceDegrees, True)) result_test_meters = r.convertFromMapUnits(meters_test_mapunits, QgsUnitTypes.RenderMetersInMapUnits) self.assertEqual(QgsDistanceArea.formatDistance(result_test_meters, 1, QgsUnitTypes.DistanceMeters, True), QgsDistanceArea.formatDistance(meters_test, 1, QgsUnitTypes.DistanceMeters, True))