From 7f4226d209f3522f77ef9594c09b959c0321c9c5 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 2 Dec 2019 15:55:44 +1000 Subject: [PATCH] Update labeling tests to use engine v2, update expected reference images --- tests/src/core/testqgslabelingengine.cpp | 2 +- tests/src/python/test_qgspallabeling_base.py | 4 +- .../python/test_qgspallabeling_placement.py | 138 +++++++++--------- ...obstacle_obstacle_factor_greater_equal.png | Bin 6331 -> 6249 bytes ...ine_line_obstacle_obstacle_factor_less.png | Bin 6344 -> 6331 bytes ...obstacle_obstacle_factor_greater_equal.png | Bin 1481 -> 1439 bytes ...ne_point_obstacle_obstacle_factor_less.png | Bin 1488 -> 1481 bytes ...obstacle_obstacle_factor_greater_equal.png | Bin 1853 -> 1727 bytes ..._polygon_obstacle_obstacle_factor_less.png | Bin 1919 -> 1853 bytes ...obstacle_obstacle_factor_greater_equal.png | Bin 6504 -> 6369 bytes ...int_line_obstacle_obstacle_factor_less.png | Bin 6504 -> 6504 bytes ...obstacle_obstacle_factor_greater_equal.png | Bin 1853 -> 1753 bytes ...nt_point_obstacle_obstacle_factor_less.png | Bin 1858 -> 1853 bytes ...obstacle_obstacle_factor_greater_equal.png | Bin 2709 -> 2551 bytes ..._polygon_obstacle_obstacle_factor_less.png | Bin 2707 -> 2709 bytes ...obstacle_obstacle_factor_greater_equal.png | Bin 3032 -> 2905 bytes ...gon_line_obstacle_obstacle_factor_less.png | Bin 3028 -> 3032 bytes ...obstacle_obstacle_factor_greater_equal.png | Bin 2031 -> 1963 bytes ...on_point_obstacle_obstacle_factor_less.png | Bin 2031 -> 2031 bytes ...obstacle_obstacle_factor_greater_equal.png | Bin 1806 -> 1727 bytes ..._polygon_obstacle_obstacle_factor_less.png | Bin 1814 -> 1806 bytes 21 files changed, 70 insertions(+), 74 deletions(-) diff --git a/tests/src/core/testqgslabelingengine.cpp b/tests/src/core/testqgslabelingengine.cpp index 6d050e9cd0b..1ae317efe4b 100644 --- a/tests/src/core/testqgslabelingengine.cpp +++ b/tests/src/core/testqgslabelingengine.cpp @@ -205,7 +205,7 @@ void TestQgsLabelingEngine::setDefaultLabelParams( QgsPalLayerSettings &settings QgsLabelingEngineSettings TestQgsLabelingEngine::createLabelEngineSettings() { QgsLabelingEngineSettings settings; - settings.setPlacementVersion( QgsLabelingEngineSettings::PlacementEngineVersion1 ); + settings.setPlacementVersion( QgsLabelingEngineSettings::PlacementEngineVersion2 ); return settings; } diff --git a/tests/src/python/test_qgspallabeling_base.py b/tests/src/python/test_qgspallabeling_base.py index a15d238c792..6c6a9a71984 100644 --- a/tests/src/python/test_qgspallabeling_base.py +++ b/tests/src/python/test_qgspallabeling_base.py @@ -127,7 +127,9 @@ class TestQgsPalLabeling(unittest.TestCase): @classmethod def setDefaultEngineSettings(cls): """Restore default settings for pal labeling""" - cls._MapSettings.setLabelingEngineSettings(QgsLabelingEngineSettings()) + settings = QgsLabelingEngineSettings() + settings.setPlacementVersion(QgsLabelingEngineSettings.PlacementEngineVersion2) + cls._MapSettings.setLabelingEngineSettings(settings) @classmethod def removeAllLayers(cls): diff --git a/tests/src/python/test_qgspallabeling_placement.py b/tests/src/python/test_qgspallabeling_placement.py index b992b308061..1ad09592c5d 100644 --- a/tests/src/python/test_qgspallabeling_placement.py +++ b/tests/src/python/test_qgspallabeling_placement.py @@ -59,6 +59,7 @@ class TestPlacementBase(TestQgsPalLabeling): # render only rectangles of the placed labels engine_settings = QgsLabelingEngineSettings() + engine_settings.setPlacementVersion(QgsLabelingEngineSettings.PlacementEngineVersion2) engine_settings.setFlag(QgsLabelingEngineSettings.DrawLabelRectOnly) self._MapSettings.setLabelingEngineSettings(engine_settings) @@ -205,20 +206,22 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_point_point_obstacle_obstacle_factor_greater_equal(self): - # Test point label but obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test point label but obstacle exists with a greater than obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('point') obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('point_ordered_obstacle1') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) + self.assertEqual(self._MapSettings.labelingEngineSettings().placementVersion(), QgsLabelingEngineSettings.PlacementEngineVersion2) self._TestMapSettings = self.cloneMapSettings(self._MapSettings) + self.assertEqual(self._TestMapSettings.labelingEngineSettings().placementVersion(), QgsLabelingEngineSettings.PlacementEngineVersion2) self.lyr.placement = QgsPalLayerSettings.OverPoint self.lyr.quadOffset = QgsPalLayerSettings.QuadrantAboveRight self.lyr.priority = label_priority @@ -227,18 +230,17 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_point_point_obstacle_obstacle_factor_less(self): - # Test point label but obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test point label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('point') obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('point_ordered_obstacle1') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -252,16 +254,16 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_point_line_obstacle_obstacle_factor_greater_equal(self): - # Test point label but line obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test point label but line obstacle exists with a greater obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('point') obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('line') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -274,18 +276,17 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_point_line_obstacle_obstacle_factor_less(self): - # Test point label but line obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test point label but line obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('point') obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('line') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -299,16 +300,16 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_point_polygon_obstacle_obstacle_factor_greater_equal(self): - # Test point label but polygon obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test point label but polygon obstacle exists with a greater obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('point') obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('narrow_polygon') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -321,18 +322,17 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_point_polygon_obstacle_obstacle_factor_less(self): - # Test point label but polygon obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test point label but polygon obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('point') obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('narrow_polygon') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -346,17 +346,17 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_line_point_obstacle_obstacle_factor_greater_equal(self): - # Test line label but obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test line label but obstacle exists with a greater obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('line_short') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('point') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -368,19 +368,18 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_line_point_obstacle_obstacle_factor_less(self): - # Test line label but obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test line label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('line_short') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('point') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -393,17 +392,17 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_line_line_obstacle_obstacle_factor_greater_equal(self): - # Test line label but obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test line label but obstacle exists with a greater obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('line_short') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('line') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -415,19 +414,18 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_line_line_obstacle_obstacle_factor_less(self): - # Test line label but obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test line label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('line_short') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('line') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -440,17 +438,17 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_line_polygon_obstacle_obstacle_factor_greater_equal(self): - # Test line label but obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test line label but obstacle exists with a greater obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('line_short') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('polygon_center') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -462,19 +460,18 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_line_polygon_obstacle_obstacle_factor_less(self): - # Test line label but obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test line label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('line_short') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('polygon_center') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -487,17 +484,17 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_polygon_point_obstacle_obstacle_factor_greater_equal(self): - # Test polygon label but obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test polygon label but obstacle exists with a greater obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_center') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('point') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -509,19 +506,18 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_polygon_point_obstacle_obstacle_factor_less(self): - # Test line label but obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test line label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_center') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('point') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -534,17 +530,17 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_polygon_line_obstacle_obstacle_factor_greater_equal(self): - # Test polygon label but obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test polygon label but obstacle exists with a greater obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_center') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('line_placement_4') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -556,19 +552,18 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_polygon_line_obstacle_obstacle_factor_less(self): - # Test line label but obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test line label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_center') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('line_placement_4') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -581,17 +576,17 @@ class TestPointPlacement(TestPlacementBase): self.layer = None def test_polygon_polygon_obstacle_obstacle_factor_greater_equal(self): - # Test polygon label but obstacle exists with a greater than or equal to obstacle factor vs label priority => NO LABEL + # Test polygon label but obstacle exists with a greater obstacle factor vs label priority => NO LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_center') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('polygon_small') - for label_priority in range(0, 10): - for obstacle_weight in range(label_priority, 11): + for label_priority in range(0, 11): + for obstacle_weight in range(label_priority + 1, 11): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) @@ -603,19 +598,18 @@ class TestPointPlacement(TestPlacementBase): self.removeMapLayer(self.layer) self.layer = None - @unittest.skip('Needs engine change') def test_polygon_polygon_obstacle_obstacle_factor_less(self): - # Test line label but obstacle exists with a lower obstacle factor vs label priority => LABEL + # Test line label but obstacle exists with an equal or lower obstacle factor vs label priority => LABEL self.layer = TestQgsPalLabeling.loadFeatureLayer('polygon_center') self.layer.setLabelsEnabled(True) obstacleLayer = TestQgsPalLabeling.loadFeatureLayer('polygon_small') for label_priority in range(0, 11): - for obstacle_weight in range(0, label_priority): + for obstacle_weight in range(0, label_priority + 1): obstacle_label_settings = QgsPalLayerSettings() obstacle_label_settings.obstacle = True obstacle_label_settings.drawLabels = False - obstacle_label_settings.obstacleFactor = obstacle_weight + obstacle_label_settings.obstacleFactor = obstacle_weight * 0.2 obstacleLayer.setLabeling(QgsVectorLayerSimpleLabeling(obstacle_label_settings)) obstacleLayer.setLabelsEnabled(True) diff --git a/tests/testdata/control_images/expected_pal_placement/sp_line_line_obstacle_obstacle_factor_greater_equal/sp_line_line_obstacle_obstacle_factor_greater_equal.png b/tests/testdata/control_images/expected_pal_placement/sp_line_line_obstacle_obstacle_factor_greater_equal/sp_line_line_obstacle_obstacle_factor_greater_equal.png index 5d9021ada83ac0db5b9bb537e2617960347972cc..a459baeda1f97f99bf54147bedca35a58f2b08eb 100644 GIT binary patch literal 6249 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 literal 6331 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 RGYkL#002ovPDHLkV1hcZ+|~d9 literal 1481 zcmeAS@N?(olHy`uVBq!ia0y~yU|a&k5*%zm5n-1mYaqp0;1OBOz`!j8!i<;h*8O2% zV6FCaaSW-L^Y*S`w`?dw+r!DKtr?3xu8Z^#?%wc-f5TRftzqB3aYo(jWMkRbwKY`b zn`UdsMh``$AN)sj#9q4SO`j2aFn3Sc?dN$9_LNu7D_XU_+S2&&nbzud_1BCHli!|^ zV_-<;5MmH)VsU6vV4R@f!Jq=}al5Z_N^Y{NN`^HkC*mPuP z(bN9>#~!xJpPgrT_upam&FTlZi%;`4usAX)I8I>j5Kv(dV&No-d+tTWR+;0gpT3dY z@b!e(o_{{6e&=G*0I>zmd-ZDEnFD*68|V*jt2nEg8?uIIn& z`yW?nR`=)M?3+5vX^qSwQdTdz8pLbuVHw%e96kU1Jl5#b(Paf}?A!NQ)TTX2VM$l^C~$LP(Ql6~BQ{m%-zJr z^f}i5-^IRV4N)g;cRfAtLw>#4Hx+L@t+@UBPX>052{4o|bwO)@$_wSCQ)pCrn z9#L8KhIVZm%;WDB-q$`_5e6n1PL~9Y4O&$yt_A6PmWGUudSXO zjW_nLjn}R$CN6{RB}lNL4{qNXJ11|Br;nH8>Eq?tIa!Q@Tc6LK1zXEoc5ns_2=kdjhb53-=CB{AG;1tH1s<-uv>C*)z_a zU%vZcJiqbo>=`h|a6)2B9KU^I{QmK0vuB(;|L$I$JpoQRApwx!r3SIVj{%cl0WlW% YANoaCw+RN^DF6Tf07*qoM6N<$f;h471poj5 delta 495 zcmVEhU%xf=D%e=AkYG*s?%p1&x1WuRmuKVR<(={3ttaD`pT3`Z7Hlj*f;Aj2 z=3}{-kJ-l;j*rbg*&a{-`Fs5LWHI3~*j$1HYg!F|`B6f#$WBNfsOR?-58y_)f2%HR^ z+PeGB+>0(76oTU?J-=CT=iRo|y65+-@=Hzo{q+0x#S94>PrqVhaG0vVDB!fYk#!m4 z#0zTmhgM%@esKEg|H|OE@At1dwlC3U-;R3QRmaNq*Z#Uu@y5O{`Tp(YSvIwMwjDS8 z9_ya_d8glc%YMo8HqZZVeSdpf`tiWyKVFsmnGx-lTRfkC?(Jlr@3qH`&wsYqzqYTi zKXB{Y-B!@=MXx*=kMqKs?WFA zuWmnRd~E-n^{ZB0i%U?c@r>D&Jo9Z)tSyT|hr-4)Wuht%6g+e`$Ho}4@iiT>O7l3- z2@*DSW&(1JZXZ3)Z}Fq^093puwCuo4g^f_^+*OFAQP@q!bfDt8Qh@?Bk2Uq1b3+%g zykY5Fx@HTrnq!i#u}XrvhfZo6i%-*$ps-tvlNB~jnOb&0#Y5-mBv}Jap=?f}4Z}pi+#{1vmuI8CmS$ZFDx6IJbH}0+49vzx*8nyraw=mOVuQs#%V|Gm18NPo1 z{}t!$-S!`UEx1y0t>oU{+cwtcudZWxSNA{cugH#_Z#UkTJ9h7u;K6HluPhHf_n7eG zP44ZbudXiLHvQk0_Y-ebt*_&Y*?rgfM)cQvS=no=?6=*0Z29=w>hHJro!_|j*4vH# z?|)~%`Tj6i)#Jm)n02K$#dG((*gs`!SnZv6(~Y95^TopVhJU@iaqsrpZ{^mm1@l$k zDgN%MvyRov?T>u+boKi9PiuZKaR}Aqt-HSK%GGl7`7*2DY+lIP2281XVjuVp#qO+W T&v3NhB~XOQ#osXW1n2$lEn)aouA!tX_?a= z)>V5LRH{~e@lXi7s95Oap()@h602aDr)q!R`JrTWp0MW0%<}p7b?5shSKHL3B1Y8fZH0^V7G#kEQ-CtbHSKH9zj^%cJSLKOTFU82;Gk zPSER!t+~&4eJYjS&3NqX>)TU5e!aTQu)h3pkJQ$j^4#;e`-_wBNPWL%v75IiF!Xeu z{PBqV@VWbb?1}sHa`N@K*|&ceR>qdE|5)~Z6QA9+>mT;a{CMke|NDO%=KXym&RXs| zVaBs(@$;{p-v9Th-|;u`e|P8o``K?T`+4mZzpMW~KkAjY+xPTarS#k0jR&R_1kNip|_K(SKsps-Fr3TZ_Ul< zs}h^%tA3CL2CHr5uf^4}^*wcc*Hwd}w`_YccY1GW#M(8))mKwy)B7c{=HQCb#6s8r_i10hd1)QUee3{*Ecfz>hYH~TAR0C?|ZcB`>MKK zdhc^>e_6j(+99X9?sZSyt+{%+(-)sPY;9k0LOA{Ce@4fq9mnzi*e3-=LU#pkfsP(gq@$ps&zp$S zrb4_0s=NRsdaCqDAW_jFaY9Hb5JePSAUSR&KhHzq8GCLMDamPfpWiK?Ph)#Ler9ZW z{ngAq>s>y6elrRHCOgdD0RX5HBmhDP5&#hd34jQK1V98q0J=_`|P%GkX`{dl4iam1lqdYd!zv`?Ggrx*z}kce8f^zBi}r0Ei$+07P)g zj%oU+m#^qsG<1*Y*>sYmI z=eqKB8@mC@%7cVF@JaCj2g9UcWuvYzjI^U8u!*XyA6y{Rm*N4$5?Myoxb?I zUi|5k*It|3`*C?)cdzkw@3Ia)*4Oa7nep1=kMI7lp8f0>1$RY|nC9kRpVrI2{pC)_ z>|g!6ZvOd?J00__)K1m@^Wu#kKECDlc^mDG$A@p?lpWJ7hvV#B0DpoA64NY4K?1G> ziD{ODGseJ`ATf_4Bw$C7m}WUTLISP?iD{ODw;yoj6M=agAptvr#588v0egbPG-lZW zdxFF~M{hsi$|nNTm}Lj-2@=!z>L6fGkeFv#szeD`2@+G8X$NcsiMbph0V_dbDo04b zMv$1wOgmsBNK9p>9e=P9B&Kr84%i41a|sf#5+tVbeRjY`keJG(24Evd%wkyf4uWCf%_*&Om)})59zlbesrhf0e=t2DLbYzsR7ss5_6f< z0IURwsr(CbU?WIO<(nFSjT89HbvV}3pZ>f?>ot0-YOTgtFMF?Qry9Lo@9VurJMGqK zRoi2GtKLpkz13*_eA!#o7_*-x@Er&e(>;0mqkA2HjDC*SB~n|ow&C{TYtmYTf0WEwR?R|@E8dakKVEzs-7HbdFXfh8mXoC>ifX8(>a8_Rqw5q z)~fgGvU5DQxb^D&w61eqR_%0Ir}uRm>uq>j2@>3w!?6zQq>TstO<8Nz$LV}3v$fZb z;;Q$me!4F2Z9V!s?IO4yC9dm?e%hTbZI`3W!#h8C$P;J9{{caQ$L4sfLmmBe^VTuT g4zsZZv;h|X1FtEyK>V78`v3p{07*qoM6N<$f}zXX1ONa4 delta 1021 zcmVIP@ z%$-Sl@5b-F0AR4q=m7vgl^_8SLbHJddjWqq8$AI2$L6W#`DRtGs@|)5t7?6@U$s0? zeSLg4ak;;{?Y&p4W!}Ebd$^3=t6Eh*UuIRWUTt~o{Qlp()^1U|=k;Zot*?(P)BiHA zcD~&6bvRi5@w%I{(Aj#{hQIl;J=z~jvfK`8Hel`rfvK^1ndbC z<7|BVfIV9ThG}Q^kbpfwVi?#ATdlk6C_|ykQl}u5^zY67-#E$ zNWh*TF-+UqLjv{$iE)}eBw$aF7^Z)n`S<~Qwg?R4IwatbATdsBRn12b*s(QWsOC&N zU?E5h)qKG!u<++8W1V;p>62GKJn8Z-vNt|^bMz44wg?hKo%&j&A0Pdpp1c0?NtbyM zef{(oqlW;u&G8b3a;6=y5+sK5Z4JOmkQhpkfR!LImT&w97J|f3u0sM=g2aDNf&{Dt ziLqQ53oL967|I?Juo5JOa+V#i5+ufQVJxr^B!+5RA34+&Ta5<@i?#sUjL zVkmn^z)Fx9%N`Q25G00j+BdKgB!+Ux4p<2iV>x68ECh+6>>&XwL1L^kA3_WHruMrw%YPz``4LIqhq{+jpE z>vONFY1hAbs;Yi3)(q|$L4s3gt!lfiR=d;K*9hMAliKIwn5{89yYg*4{K9M14-R{t z9|m0xch2+SVbA0F`ZQOcZyrxyr*$FZ?hqun$Tpj*+8pf#wyJ7pm+I1EPu!i??0xxv zpF@?LmLLJQr?qO^vuX#fY39V7_6?EoAy(hiz0`MOQ5*NbbUw&FIzWeqq z=X?DgjOF5Z=9Y7O{{F}H)75MDU@UNJg2aXJ^HW#rySLsMJ&gO#Z;w4bdI)f?y?5hx r-z5*ga87CflW_s{lQ03<7lc0mX(`1Vt`EBx00000NkvXXu0mjf0apTN diff --git a/tests/testdata/control_images/expected_pal_placement/sp_point_line_obstacle_obstacle_factor_greater_equal/sp_point_line_obstacle_obstacle_factor_greater_equal.png b/tests/testdata/control_images/expected_pal_placement/sp_point_line_obstacle_obstacle_factor_greater_equal/sp_point_line_obstacle_obstacle_factor_greater_equal.png index 60bcc2ae24b0cdf04b258e1ac322a62b039b40b2..61bc0d0f022a1bd9e25c71599960f7b21ba92849 100644 GIT binary patch literal 6369 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 literal 6504 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 UxACZlUH||907*qoM6N<$f|yQ%IRF3v delta 844 zcmV-S1GD_u4ZRMKIe+g-L_t(|obB36h*otR#_``PE(9;xFf*kwWtf)PB7&euijwRi z*)}Uz*{a*3f|6P!5hVpNR0z!?$YqP7A`Q9`?FxdDD08G&yx>eP6ImF=oECv?r*ZN; zGxPZ@&*JdxzWmSmcV2t>=ccOasb{aO$KLw5`YyPz0O0>NeqQ)cy?ocLwR6W;RaLd1 zs_Ol{yK3bn>%|Cwv!;LO;u=`Bx<2^urK+mx^z{!lD=%4J55DrBI{L!>M1OOJavkU=v0WB7`Jpkr{JMO)??Fn$!O{`v5 zpFcA^WA76rm>~zYY;Ai2oK*w+zn;oj*U=BLj8?TeS@wR8cf3mRc0l*Au zn)+yDxPI-8S2ay7>p!n<+Wt`6t6)l;kYEn^Xk@s~KW9zddHYj!=jNwtV9BcbWaO2$ zXTg*R63h`Nd*k(MZ@eyFxAF9|E7otSiLqn#+eEL$WiT~@1anE#w7mePO_1OWjde%s z&r_#=+MZEM`ub~W|6qN)|HISIzWH`P{=#JLVhJn-1`qnP3 zUrrp4xInOYd7l_D>o_67G;}(hs`~c=!A}E=YVEO8b?#r2b^Z_gYtiDR?Tv$3s2%uO1i(DfOitGDJ)3Ln@S$3;bH`V;y8r5Wb=#J< zcL6ZZ4BxZ4E?u#qc0T##KmU+!+w^E1J@{Sqj&$4J2EaTq)*Y>}!-s0q#z(5E>Tiv0 W)z=1JdK~}&002ovPDHLk0$_qgQO3gn diff --git a/tests/testdata/control_images/expected_pal_placement/sp_point_point_obstacle_obstacle_factor_less/sp_point_point_obstacle_obstacle_factor_less.png b/tests/testdata/control_images/expected_pal_placement/sp_point_point_obstacle_obstacle_factor_less/sp_point_point_obstacle_obstacle_factor_less.png index 49664c8d75a80b510c217ab8cd058892ec8a5a08..0898e71e8c8bf6bd077ea659314b256597500b01 100644 GIT binary patch delta 852 zcmV-a1FQVP4!sVLIe+g-L_t(|obB36h*otR#_``PE(9;xFf*kwWtf)PB7&euijwRi z*)}Uz*{a*3f|6P!5hVpNR0z!?$YqP7A`Q9`?FxdDD08G&yx>eP6ImF=oECv?r*ZN; zGxPZ@&*JdxzWmSmcV2t>=ccOasb{aO$KLw5`YyPz0O0>NerEVky?ocLwR6W;RaLd1 zs_Ol{yK3bn>%|Cwv!;LO;u=`Bx<2^urK+mx^z{!lD=%4J55DrBI{L!>M1OOJaJpcfz1POo;vjGKg0WB7`Jpkr{JMO)? z?Fn$!O{`v5pFcA^WA76rm>~zYY;Ai2oK*w+zn;p!n<+Wt`6t6)l;kYEn^Xk@s~KW9zddHYj!=jNwt zV9BcbWaO2$XTg*R63h`Nd*k(MZ@eyFxAF9|E7otSiLqn#+eEL$WiT~@1anE#w7meP zO_1OWjde%s&r_#=+MZEM`ub~W|6qN)|HISIzWH`P{=#JLV zhJn-1`qnP3Urrp4xInOYd7l_D>o_67G;}(hs`~c=!A}E=YVEO8b?#r2b^Z_gYtiDR z?Tv$3s2%uO1i(DfOitGDJ)3Ln@S$3;bH`V; zy8r5Wb=#J}!-s0q e#z(5E>Tiv0)z=1JdK~}&002ovPDHLk0$_qh5Xf8r delta 858 zcmV-g1Eu`E4#EzQIe+v?L_t(|obB5^XkB$2#_`{cfr@RlhBTU#luE5{6>;$mi=bkC zDb&^af`dA#IH;haOA$d)k)Yy`O-BVq#3E>Qa8nRp5UD0`LtE*Mmr7G<6mlGdy4E!I zJWW2I@eGG&``+_E=XTzF?YE|?>e=V7tS8?6tcEshECBew&1cR`*K2p(R=c11x~i%M zs;WNP^HPmnxK)e*IAw;%FR1mKHrL0Wyi!$FouT3JX6(YP^~l>Fv^))fm8NN$dgH#G zb>NpDtMkI=`x;M10JN#UzgwNR_RTkK4*`IIwg&(}l^_8SLbK5XZvidBVA}&=Ie2x$ zEp1PLQ*QLnOKVqeV#)3&NU%h%KC-Lr32;iytomk2@8`%4lK};2f59>|*PpGq{%qSb z;6E8`djPP6nx;OToTwxH*{Y_gvxm>Cn;v|$?Nx9>JR!j{^6BJ6oqx`jy7P`_>&_j| z)%rD?YVYLhZO?)eB1o`I%=KsMNPo62yY%Mc*Dl|>y$<&d*3rZL7MH<^5hPennx^dq zuxNq=C#lz+s=wxsf3-cM)(j2T+ToG<{)bPFU;FO+J+*FRtX8iZYH=Byn9f`K=KZ9C zMQ9cl>ZQA{t3%zXI`;n28rr*|Zhh$KwrADe$=B;}?_gC`ts5Du8y|SM7VyPqJzBE5LmHPxK^YmIMPU*Fz8RfF%HQ3Lbm)~yddf7SN1L59? zgGK0dr|M95s>ZjiKYnfKqP6w=p`@TP_hJI0=FTC#k=`TUAv<8#cDQ1Ws?>A;C!!B3K%}vIDb$ z0Sy6@-~{Y{Ffcna-S!3mR=8ewsyf3Xo0^eLTk6qwKCDis)Al9+R*+_4p(gIxQN5Yz z8rc2J*R^^0s(RzToo(*|V1=2uXGdK;x~+CU{nbD3kZ#}pcpdoV$LjCzw!IC26{6Rj ks@}|WZNK@ks;c@MpFiLK+CA$d00000NkvXXu0mh|f<#TkaR2}S diff --git a/tests/testdata/control_images/expected_pal_placement/sp_point_polygon_obstacle_obstacle_factor_greater_equal/sp_point_polygon_obstacle_obstacle_factor_greater_equal.png b/tests/testdata/control_images/expected_pal_placement/sp_point_polygon_obstacle_obstacle_factor_greater_equal/sp_point_polygon_obstacle_obstacle_factor_greater_equal.png index 3332f1dc70e1a46b0ed7390f7f4f1ead21222cb4..a2f8f04ec0bdbf6abaaac08f1495e4e1c2209846 100644 GIT binary patch literal 2551 zcmeHJ{X3gk8jgBL6Q&x`X)`kFwNiFgwX~MD>f^ApkTKpTg{?KnYm^}*pZO2J3QYk`QqD{2RRgc#b{SR77=r2aH|~E^7Hbi!Wu*b!==MCoGX!v`yHNy(*rR6|L}iPmgnhRf|->T zx?>erHU3&8j1#V033)*vJx>>Oo|8_h*4?+1@^jMYU~akc{V(junQp$c54AU;S(-?z z7zv9DbX(a>6?ZM@l0qztajOd8Opt%a>D)!6HfXXUDc1rD-s(`v^L6~6D*esc@9+7Hl?d489O6U$^h zx22}JVIf)-Y>AQIKrJ%?WID0Ml^rEoY3}OyDijg%1xDVDpr7{0YweyqW^6AC4hIbw zfilJ7KTSGmx=?ABnj&*5av>eCn+M0=L|(sBP|Zw+2tQs@H2Eur)>y3P+Bc0!RJ^d} zYI!_6{(dX;VJd6%6?}=2O%XIke$kA_yYu3>BE+=12{7aQX}8-;vkH#&h1*nfL4eOL zEJ&DGYyTT}I^^C!vr>pfUY#|itNl%7pfm_7~gCjVptRgM1WPE z0|b$~WRF*2rDkkwW|-!t2R7m^N*Ya+KVEw#c|SW}qQ&mF3Vq8r!_~3a7at6BHwB{j z(L}#FY5AVu@>K_Asp;+Z!mX@%0itVd8G44cn5)hi3=#!aN!~g)Zggh|ILqH~7Bgh4 zvy+N}Cui9<(Vm$W;<6MCeQLtTvV-|mk$bvj4Yr=g$=8%!w*?#P+-un^$1J6Z!n5Cs zfkN4%o0l5ooGrsGcL^UOA3)HynD;{-aZ9N=GruaT?8)LqVPxFK_eIjBfySc=JwoSi zJTzTQK_^LDzcsPuf0>-_+u8Kc%kll+C!&iUtt!`E*l(_LWLm%wKjqh6Z?nF8a=Oux zvlOzg&fol=(G}tB#Lm4ulg_r)WwsLuL5(7+T$ZoT-;wur4A|TI=te{hAP)uI9yMUa zS5PQro-6drv#mUpxt{d22kgmUK%=i%+}G9tTrvd_w#6Ovz0UEfF=*Z&* z2I^7MPGPXOLc1N9(G!eRM$fcK|1hNyA5uzPblh2^Q#EdNDP}GJVs~~=r&|%J_&Raj zY09IV`>mg?hkXoOGxQ`$P`{waGkEJ>b1MZ#as{3CA5_vnP)myc0f$3jompyPpUS7g z!Y<7VgHI|vYU*dnnjqm{rUaU*v%%pSeKvk<895a=tAWEb5Jl0uIP$AW$K;N!Qb-;(P7S`;SvduK~Ms z(^3(7sGMnjkngJo2yCNS6>Ns51a|LW=gF+e`*@<>N&5!XU zXe!B(N20d6W3ZFTVh2!b4}#(%8@ap8X}2<9BzeU=JIMvOj0t2aj!q5j%&GzBwfg0H znl*RP+wiQzaJWrR8jLW7lHf;tJK_D-J7>D3p@$-@O~PHU;u_`LF-11n2tivJJZ*(O zHN0YBfM7ODHUSZ75C!tvN9)O_8;pQ!FmvVd06)Ok%0WFeViDC{6_+f`4^>9nUOt&= z75`9beodl=Kjfy4-7tJjrS)JIc529&9>0jeh)ezK zh%thuNf{JqCm`0=ahfg%(>b9GjBJjeZW77WviN%8gVx=3rHdcX=4}ua;cIos%1cNu?G6W+Z1_7zRk-U~3 z@1bd8O6zH!7+evtSG#}i|F<*ngFuJk1zqvQLi?}YdKpGpQhtJIJ;@$^qhF!Wj^mp{ z87mX?CSDHrott4Wqw){i4MLV)UZjipW*W@Zu9Yg*%sXM+uc<{p6lz-^R$SfY^y;Pl o1KzanOoY?v`q}@XXM;-f_$T92w4i7Q@RGxw_`=h*(m4eECvN!qw*UYD literal 2709 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 diff --git a/tests/testdata/control_images/expected_pal_placement/sp_polygon_point_obstacle_obstacle_factor_less/sp_polygon_point_obstacle_obstacle_factor_less.png b/tests/testdata/control_images/expected_pal_placement/sp_polygon_point_obstacle_obstacle_factor_less/sp_polygon_point_obstacle_obstacle_factor_less.png index 422616367c58f8b4f94219aa1f4a81406afebf45..297d012a5f1ccc3601aaa7e1280b1717767bef28 100644 GIT binary patch delta 1101 zcmV-T1hV_@5AP3dT6g{dtVnGbGuJ}!F{eDd%bOX;XGd{=GhmY*V9LT9X$hP*wHM zci*c&e)Ox+)8L8{B!-!muNS1Ms=xi{rw5z~Tkn4Uc=Qyw!YpcFm}%kvL%^OOG0qzt zApw_}z@G02jN=FixImB?=1o@F0hf;;F^pAqz(s<@I7^>? zz@G023}clYaFHM}%VhC0^YMLIuyQs-x9b@vB1ciZm%@T8u6`%OJPKN~nRI9`IpP{+H{ zZmO63**f4g2@*pc>q@&DCnt5|qn<`>&~5e=f=(dvM2B|g2YhAddjY< z>i&a=Ro`B($De#zk3ac;vg*n8y8rWsqo)N&>sZg1a9JF2kfv#>`wt%OerDvz2;Ph! zG1O&vKRY3U!*I%up^kS^18``9#8^kVr~x=UL1L(5Ueo{_mLM^dAOTx~#88)EQ3G%o zg2Ygckbo^gVkkiZwgic>tg-_(1c{;i9ulx6NQ~u_9k3xt3}uyn9k3-x3}sORuq8+g zb*z662{=4KVknCmfGt5{ET`;%4MAckr|f_&L1HM28h|Y)@EL2dtlK~SMfJH=Z*$c= zSMQt4)~e=J^)~NsYps?yZq<8VeO1+3RrRXYt5>h;eYdT*zP_z*{sHj>iQ%r@zV}Mw z|MKhKztZ^L+d5`{bE|4|^|o4H?xMHe);HU#ZQ{7QzN)s{cfV~nZeDM1^Sm2V^ZZJ4 z1O$mIV44b$^)xowUD_eXIv)ml|s?YFmibM&{m5W&q+ z;$}>5tKI3+{g_oPu7B@sJ}a&OL4wO>xvWJkeRXqmtg-{MF$SmslMn$57s9^*{>1Z% TMtWcw00000NkvXXu0mjfTfju@ delta 1105 zcmV-X1g`t<5AP3$K3AIFSyV3W3R`i3+GY$`PI4o`*x()wB6=? z&uuq{^|t+j``JCesrK{ky=vO*|GwAe+&s?j^X|N-&Fi&&4X1Zrk6yi&pB&eJ{h$51 z;Hn4`!@T|a@Ac;SUq?@a3-teTy{f9_`6JAPn?#TpW?C#Swcpc6f2fxazPjSsP*wGV zS3j)JpZ#w1G`OJziD9PY<$_dI^^@m6zrvZY_0_`{qo=?PW>EvfObh=X0`>%naX#P( z3Ala)iD9OtBP3u?kQioK`1AvR_IyWR97jmNIfBG6AF|30xPAnQVXU$P&J!fYS^D$? z_IyWR7_01n^8|@uF8kI&!1W|Zj5AGD*C0w~C$H=5)Dr2>+JNjs(RfyzE{6^{F|DlY4p_KAUQ%}tOGtmdiLehnjWm`)6X7%)~BC+zv}+m z`pcjHGOFt94!9&iVyHu1X?JvdTt~-u>(%r9Vun}GPwMXd`}N7uo&T^W@IHdXP=|WTuBz(M z<0n<$+^!d2ysQ^rysUbEeY+n0^2z9F!NEGz^Cest2OOknn(EQxC%c~+IWmF|BS;K& z9p2AQh~R2CWyes5yQl%UYJ$XA2fC;MxO#%bP=~yz0k~R%#883+YzY!WU57;tz|{~W zhH``iYzY!W2@?Z?*f+{Ud{YpcyR z`>~o=yKP$AJjUia94bMA|ChzG7Mn#IAN40?^IWa3s^+#hISSk##Z_xnZM7e7^XBMp zbuNONqr}ZNy{&eqOZVHXYH|B}AM;sp0|*jaH_K%$YU!(+gJYE)vq1qk0h6Esd=|b1 Xpf2-yFeW~u00000NkvXXu0mjfT5?Pp diff --git a/tests/testdata/control_images/expected_pal_placement/sp_polygon_polygon_obstacle_obstacle_factor_greater_equal/sp_polygon_polygon_obstacle_obstacle_factor_greater_equal.png b/tests/testdata/control_images/expected_pal_placement/sp_polygon_polygon_obstacle_obstacle_factor_greater_equal/sp_polygon_polygon_obstacle_obstacle_factor_greater_equal.png index adf95d42df62722498a929605235aecec3f14736..7ac5f90111de5f17e72aac9bf4d622c74593453b 100644 GIT binary patch delta 806 zcmeC<+s`|}GNjPc#WAE}&fB|=ebTNHZ4dXq^-xd|5xc{>G5w&RrC9cjjgJ^K1Wtxd zZQXrm?nRdk3c>M{p5Lsv^KRQ}-Sc}^`K6})e)@g;Vupl`r(ZELI80Sw6mZ(i$e6)6 zc>-ff{h`%YnID|K`oA*x?fdo^8hs zzsI`ge%|S~-m+ivyv_5!Ti@T_mVP|&_>Wg5e`Z9xpO__OI<`@f_IUk^y_UU?YtCFQ%>Vt{^#0+uCx07eUHLjY|MhP9`g*+|`#FS8@A><=zv}bt z^{d+t8Xwz#XZ@;G*WwaXYCK~$CC_|Y6l=?((4nyLOqr<40|gJA&9O0tY?xB;~#^Td-Bq;0_<79=6Q>K<3Q1Q@tI!V@mQz)BLXoIlI zv`@d^G8qz4dmZ z|NGzBZ@xbaR`vL>F=k!qP4V14FZNH_8diJf-E^bq>U^>Az2RSPZ``}R_FK8NYr%Zg zcZ$Dz>a1h+a{D8nJzc#%{?nQtOdLWrdF!t4x^lJLe7?-;H=7k1JwQn{N9+UNq1c@@ T?HSK5FaUw4tDnm{r-UW|j;Wb* delta 887 zcmdnb+s8M-GWmd~i(^Q|oVR!F`=woFjz7GAYodb!hbz|@_ID}P2giys!Z1?yPoYQzVOe(XR~)dpQtqd_~vgnir!5wRh#~DcKrPBObrM5 z7K<}5gf_7_aBOB|j9{GHz*t)U-A%t?_v*iY*F4+*Z_TUM4)*mMYwoW8wIwEQ@7np# zzyG~ae|F`o@ci{JYt9&Ly}sq{^`pso$G>F1E3SN#nzO4+cI*1}dVTM2d#ul#{dv*z zvbe)W+vAJvpFcOhy6@e+)yuyA5Z`Mi{(6Vavsb&8fBkwZ?(oY~uP?5?{&6q=tHtN# zMC?VDC0Om;#q0gO~&p03WhzgWd~Fp zljbbmF2CWkY-8e^P0V^gOZL3#=VQuK2TEkF5>ic2_25ZeF1tZcg>w`c zr5%$rtlu{DDi}_gTXw*0g2X9zFy%d=VJc8;emZ*&P+?9MgIUv&2s2X#ZJ_$uQuSaB z3Six{rNA6xl>}uE9#s#J8K?EEL6$we4>n&%{w5f<`i!=yKZv+>Mgr%M~V}=qgP+^dp)Oi&9lpue%Y^+*Ia*?tLpKg-csiE zhP+!lF7DTy{XFY$i0SsPItBLKtFNuPl_{V9x$0Z_u8s#)({`MD`L^WWj*|Jss}5Vg zzxQPGBR&C@9l3qSt*%^rpLfry?B?W!j5~k{{U#7Ai#?P-d2HvSD)y<*7=Xaj)z4*} HQ$iB}E2O?U diff --git a/tests/testdata/control_images/expected_pal_placement/sp_polygon_polygon_obstacle_obstacle_factor_less/sp_polygon_polygon_obstacle_obstacle_factor_less.png b/tests/testdata/control_images/expected_pal_placement/sp_polygon_polygon_obstacle_obstacle_factor_less/sp_polygon_polygon_obstacle_obstacle_factor_less.png index a661efa0e936849c87efd554efc15233d4d560c3..adf95d42df62722498a929605235aecec3f14736 100644 GIT binary patch delta 884 zcmbQn*T*-(GWmd~i(^Q|oVR!F`=woFjz7GAYodb!hbz|@_ID}P2giys!Z1?yPoYQzVOe(XR~)dpQtqd_~vgnir!5wRh#~DcKrPBObrM5 z7K<}5gf_7_aBMDQ?Pr`Uz+_kd-A%t?_v*iY*F4+*Z_TUM4)*mMYwoW8wIwEQ@7np# zzyG~ae|F`o@ci{JYt9&Ly}sq{^`pso$G>F1E3SN#nzO4+cI*1}dVTM2d#ul#{dv*z zvbe)W+vAJvpFcOhy6@e+)yuyA5Z`Mi{(6Vavsb&8fBkwZ?(oY~uP?5?{&6q=tHtN# zMC?VDC0Om;#q0gO~&p03WhzgWd~Fp zljbbmF2CWkY-8e^P0V^gOZL3#=VQuK2TEkF5>ic2_25ZeF1tZcg>w`c zr5%$rtlu{DDi}_gTXw*0g2X9zFy%d=VJc8;emZ*&P+?9MgIUv&2s2X#ZJ_$uQuSaB z3Six{rNA6xl>}uE9#s#J8K?EEL6$we4>n&%{w5f<`i!=yKZv+>Mgr%M~V}=qgP+^dp)Oi&9lpue%Y^+*Ia*?tLpKg-csiE zhP+!lF7DTy{XFY$i0SsPItBLKtFNuPl_{V9x$0Z_u8s#)({`MD`L^WWj*|Jss}5Vg zzxQPGBR&C@9l3qSt*%^rpLfry?B-@gMi0ix6Bu*E9?G9Qw)0UH`_yL)K;Y@>=d#Wz Gp$Pz0!n?Ep delta 891 zcmeCx;(Xo|j;vQp>dta@VcMD8^{A~K?=gO{j{poKvKD}f9+DGs5cKiJ=SQ(n% zy6H18tYYD85SU!Z_+#<}#;f&mJ#h@vSO5LH=h^;$YhImpu&*urvn%}T%Zkdc+v;ZB z-<}*lEBNaAdvTXv&Ukz!?s8RpdjC$j%j|5ewY<;Xri9uxb0%bvK`*%q;twpCwm?f;y&_y5c3 z^{m@nCrCUyx;g&!&&l)M^qaH4)bET74gFlhuKjQlhtOf4-G6)gen0&D{?&H=dG|hL ztyuNzLx2CP)$;o#_wwjXQ7}BSWq;&^RjcgkKHbz^*K+mp@%=q9bb3a7J(lIp54=U&GS5agHJ*w_}n< zy2k;p2@$qU zFJr3*X;6jeUd9IEJmukx;1qJ^6as19bea!j+0SyYiqr08U~PI3Yl4}<*8EpQHo5;z zL#u+}6d(n(XA01sQ|v!_w%)$J*ni&&yX~)X*UftVs&;42+AO<}{Lf|4_1RnNf5h2V z|ELbl4!ycMYJJ?^Ro^d1x&Zg?m{AcyH_5VK|C@HHvYgzyPt;FV? zp<8!WS6}?y&9SP&o#4xKi4e2&ZIX}q42%$<#n$P zu3NUdZoB@(Sy8LY zWbcJEvHYKYcVF4*WxdvaXKw