def testQgsVectorGradientRampV2(self): # test QgsGradientStop stop = QgsGradientStop(0.9, QColor(200, 150, 100)) self.assertEqual(stop.offset, 0.9) self.assertEqual(stop.color, QColor(200, 150, 100)) self.assertEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.1, QColor(180, 20, 30))) self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.2, QColor(180, 20, 30))) self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.1, QColor(180, 40, 30))) # test gradient with only start/end color r = QgsGradientColorRamp(QColor(200, 0, 0, 100), QColor(0, 200, 0, 200)) self.assertEqual(r.type(), 'gradient') self.assertEqual(r.color1(), QColor(200, 0, 0, 100)) self.assertEqual(r.color2(), QColor(0, 200, 0, 200)) self.assertEqual(r.isDiscrete(), False) self.assertEqual(len(r.stops()), 0) self.assertEqual(r.count(), 2) self.assertEqual(r.value(0), 0.0) self.assertEqual(r.value(1), 1.0) self.assertEqual(r.color(0), QColor(200, 0, 0, 100)) self.assertEqual(r.color(1), QColor(0, 200, 0, 200)) self.assertEqual(r.color(0.5), QColor(100, 100, 0, 150)) # test gradient with stops r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100))]) self.assertEqual(r.color1(), QColor(200, 0, 0)) self.assertEqual(r.color2(), QColor(0, 200, 0)) self.assertEqual(r.isDiscrete(), False) self.assertEqual(len(r.stops()), 2) self.assertEqual(r.count(), 4) self.assertEqual(r.value(0), 0.0) self.assertEqual(r.value(1), 0.1) self.assertEqual(r.value(2), 0.9) self.assertEqual(r.value(3), 1.0) self.assertEqual(r.color(0), QColor(200, 0, 0)) self.assertEqual(r.color(0.05), QColor(190, 10, 20)) self.assertEqual(r.color(0.1), QColor(180, 20, 40)) self.assertEqual(r.color(0.5), QColor(110, 40, 70)) self.assertEqual(r.color(0.9), QColor(40, 60, 100)) self.assertEqual(r.color(0.95), QColor(20, 130, 50)) self.assertEqual(r.color(1), QColor(0, 200, 0)) # test setters r.setColor1(QColor(0, 0, 200)) self.assertEqual(r.color1(), QColor(0, 0, 200)) self.assertEqual(r.color(0), QColor(0, 0, 200)) r.setColor2(QColor(0, 0, 100)) self.assertEqual(r.color2(), QColor(0, 0, 100)) self.assertEqual(r.color(1.0), QColor(0, 0, 100)) r.setStops([QgsGradientStop(0.4, QColor(100, 100, 40))]) s = r.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) self.assertEqual(s[0].color, QColor(100, 100, 40)) # test info r.setInfo({'key1': 'val1', 'key2': 'val2'}) self.assertEqual(r.info()['key1'], 'val1') self.assertEqual(r.info()['key2'], 'val2') # test creating from properties props = r.properties() fromProps = QgsGradientColorRamp.create(props) self.assertEqual(fromProps.color1(), QColor(0, 0, 200)) self.assertEqual(fromProps.color2(), QColor(0, 0, 100)) s = fromProps.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) c = QColor(s[0].color) self.assertEqual(c, QColor(100, 100, 40)) self.assertEqual(fromProps.info()['key1'], 'val1') self.assertEqual(fromProps.info()['key2'], 'val2') self.assertEqual(fromProps.isDiscrete(), False) # test cloning ramp cloned = r.clone() self.assertEqual(cloned.color1(), QColor(0, 0, 200)) self.assertEqual(cloned.color2(), QColor(0, 0, 100)) s = cloned.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) c = QColor(s[0].color) self.assertEqual(c, QColor(100, 100, 40)) self.assertEqual(cloned.info()['key1'], 'val1') self.assertEqual(cloned.info()['key2'], 'val2') self.assertEqual(cloned.isDiscrete(), False) # test discrete ramps # first with no stops d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True) self.assertEqual(d.isDiscrete(), True) self.assertEqual(d.color(0), QColor(200, 0, 0)) self.assertEqual(d.color(0.5), QColor(200, 0, 0)) self.assertEqual(d.color(1), QColor(0, 200, 0)) # then with stops d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True, [QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100))]) self.assertEqual(d.isDiscrete(), True) self.assertEqual(d.color(0), QColor(200, 0, 0)) self.assertEqual(d.color(0.05), QColor(200, 0, 0)) self.assertEqual(d.color(0.1), QColor(180, 20, 40)) self.assertEqual(d.color(0.5), QColor(180, 20, 40)) self.assertEqual(d.color(0.9), QColor(40, 60, 100)) self.assertEqual(d.color(0.95), QColor(40, 60, 100)) self.assertEqual(d.color(1), QColor(0, 200, 0)) # to gradient g = QGradient() r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100))]) r.addStopsToGradient(g, 0.5) self.assertEqual(len(g.stops()), 4) self.assertEqual(g.stops()[0], (0.0, QColor(200, 0, 0, 127))) self.assertEqual(g.stops()[1], (0.1, QColor(180, 20, 40, 127))) self.assertEqual(g.stops()[2], (0.9, QColor(40, 60, 100, 127))) self.assertEqual(g.stops()[3], (1.0, QColor(0, 200, 0, 127))) # test that stops are ordered when setting them # first add some out-of-order stops r.setStops([QgsGradientStop(0.4, QColor(100, 100, 40)), QgsGradientStop(0.2, QColor(200, 200, 80)), QgsGradientStop(0.8, QColor(50, 20, 10)), QgsGradientStop(0.6, QColor(10, 10, 4))]) s = r.stops() self.assertEqual(len(s), 4) self.assertEqual(s[0].offset, 0.2) self.assertEqual(s[0].color, QColor(200, 200, 80)) self.assertEqual(s[1].offset, 0.4) self.assertEqual(s[1].color, QColor(100, 100, 40)) self.assertEqual(s[2].offset, 0.6) self.assertEqual(s[2].color, QColor(10, 10, 4)) self.assertEqual(s[3].offset, 0.8) self.assertEqual(s[3].color, QColor(50, 20, 10)) # test continuous invert function r.invert() self.assertEqual(r.color(0), QColor(0, 200, 0)) self.assertEqual(r.color(1), QColor(200, 0, 0)) self.assertEqual(r.color(0.2), QColor(50, 20, 10)) # test discrete invert function r = QgsGradientColorRamp(QColor(255, 255, 255), QColor(0, 0, 0), True, [QgsGradientStop(0.33, QColor(128, 128, 128)), QgsGradientStop(0.66, QColor(0, 0, 0))]) self.assertEqual(r.color(0.2), QColor(255, 255, 255)) self.assertEqual(r.color(0.5), QColor(128, 128, 128)) self.assertEqual(r.color(0.8), QColor(0, 0, 0)) r.invert() self.assertEqual(r.color(0.2), QColor(0, 0, 0)) self.assertEqual(r.color(0.5), QColor(128, 128, 128)) self.assertEqual(r.color(0.8), QColor(255, 255, 255))
def testQgsGradientColorRamp(self): # test QgsGradientStop stop = QgsGradientStop(0.9, QColor(200, 150, 100)) self.assertEqual(stop.offset, 0.9) self.assertEqual(stop.color, QColor(200, 150, 100)) self.assertEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.1, QColor(180, 20, 30))) self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.2, QColor(180, 20, 30))) self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.1, QColor(180, 40, 30))) stop2 = QgsGradientStop(stop) stop2.setColorSpec(QColor.Hsv) self.assertNotEqual(stop2, stop) self.assertEqual(stop2.colorSpec(), QColor.Hsv) stop2 = QgsGradientStop(stop) stop2.setDirection(Qgis.AngularDirection.Clockwise) self.assertNotEqual(stop2, stop) self.assertEqual(stop2.direction(), Qgis.AngularDirection.Clockwise) # test gradient with only start/end color r = QgsGradientColorRamp(QColor(200, 0, 0, 100), QColor(0, 200, 0, 200)) self.assertEqual(r.type(), 'gradient') self.assertEqual(r.color1(), QColor(200, 0, 0, 100)) self.assertEqual(r.color2(), QColor(0, 200, 0, 200)) self.assertEqual(r.isDiscrete(), False) self.assertEqual(len(r.stops()), 0) self.assertEqual(r.count(), 2) self.assertEqual(r.value(0), 0.0) self.assertEqual(r.value(1), 1.0) self.assertEqual(r.color(0), QColor(200, 0, 0, 100)) self.assertEqual(r.color(1), QColor(0, 200, 0, 200)) self.assertEqual(r.color(0.5), QColor(100, 100, 0, 150)) r.setColorSpec(QColor.Hsv) self.assertEqual(r.colorSpec(), QColor.Hsv) r.setColor1(QColor.fromHsvF(0.1, 0.2, 0.4, 0.5)) r.setColor2(QColor.fromHsvF(0.3, 0.4, 0.6, 0.7)) self.assertAlmostEqual(r.color(0).hsvHueF(), 0.1, 3) self.assertAlmostEqual(r.color(0).hsvSaturationF(), 0.2, 3) self.assertAlmostEqual(r.color(0).valueF(), 0.4, 3) self.assertAlmostEqual(r.color(0).alphaF(), 0.5, 3) self.assertAlmostEqual(r.color(1).hsvHueF(), 0.3, 3) self.assertAlmostEqual(r.color(1).hsvSaturationF(), 0.4, 3) self.assertAlmostEqual(r.color(1).valueF(), 0.6, 3) self.assertAlmostEqual(r.color(1).alphaF(), 0.7, 3) self.assertAlmostEqual(r.color(0.5).hsvHueF(), 0.2, 3) self.assertAlmostEqual(r.color(0.5).hsvSaturationF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).valueF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3) r.setDirection(Qgis.AngularDirection.Clockwise) self.assertAlmostEqual(r.color(0.5).hsvHueF(), 0.7, 3) self.assertAlmostEqual(r.color(0.5).hsvSaturationF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).valueF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3) r.setDirection(Qgis.AngularDirection.CounterClockwise) r.setColor1(QColor.fromHsvF(0.1, 0.2, 0.4, 0.5)) r.setColor2(QColor.fromHsvF(0.3, 0.4, 0.6, 0.7)) self.assertAlmostEqual(r.color(0.5).hsvHueF(), 0.2, 3) self.assertAlmostEqual(r.color(0.5).hsvSaturationF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).valueF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3) r.setDirection(Qgis.AngularDirection.Clockwise) self.assertAlmostEqual(r.color(0.5).hsvHueF(), 0.7, 3) self.assertAlmostEqual(r.color(0.5).hsvSaturationF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).valueF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3) r.setColorSpec(QColor.Hsl) r.setDirection(Qgis.AngularDirection.CounterClockwise) self.assertEqual(r.colorSpec(), QColor.Hsl) r.setColor1(QColor.fromHslF(0.1, 0.2, 0.4, 0.5)) r.setColor2(QColor.fromHslF(0.3, 0.4, 0.6, 0.7)) self.assertAlmostEqual(r.color(0).hslHueF(), 0.1, 3) self.assertAlmostEqual(r.color(0).hslSaturationF(), 0.2, 3) self.assertAlmostEqual(r.color(0).lightnessF(), 0.4, 3) self.assertAlmostEqual(r.color(0).alphaF(), 0.5, 3) self.assertAlmostEqual(r.color(1).hslHueF(), 0.3, 3) self.assertAlmostEqual(r.color(1).hslSaturationF(), 0.4, 3) self.assertAlmostEqual(r.color(1).lightnessF(), 0.6, 3) self.assertAlmostEqual(r.color(1).alphaF(), 0.7, 3) self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.2, 3) self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3) r.setDirection(Qgis.AngularDirection.Clockwise) self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.7, 3) self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3) r.setDirection(Qgis.AngularDirection.CounterClockwise) r.setColor1(QColor.fromHslF(0.1, 0.2, 0.4, 0.5)) r.setColor2(QColor.fromHslF(0.3, 0.4, 0.6, 0.7)) self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.2, 3) self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3) r.setDirection(Qgis.AngularDirection.Clockwise) self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.7, 3) self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3) # test gradient with stops r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [ QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100)) ]) self.assertEqual(r.color1(), QColor(200, 0, 0)) self.assertEqual(r.color2(), QColor(0, 200, 0)) self.assertEqual(r.isDiscrete(), False) self.assertEqual(len(r.stops()), 2) self.assertEqual(r.count(), 4) self.assertEqual(r.value(0), 0.0) self.assertEqual(r.value(1), 0.1) self.assertEqual(r.value(2), 0.9) self.assertEqual(r.value(3), 1.0) self.assertEqual(r.color(0), QColor(200, 0, 0)) self.assertEqual(r.color(0.05), QColor(190, 10, 20)) self.assertEqual(r.color(0.1), QColor(180, 20, 40)) self.assertEqual(r.color(0.5), QColor(110, 40, 70)) self.assertEqual(r.color(0.9), QColor(40, 60, 100)) self.assertEqual(r.color(0.95), QColor(20, 130, 50)) self.assertEqual(r.color(1), QColor(0, 200, 0)) # with color models r = QgsGradientColorRamp(QColor.fromHsvF(0.2, 0.4, 0.6, 0.3), QColor(0, 200, 0)) stop1 = QgsGradientStop(0.1, QColor.fromHsvF(0.4, 0.6, 0.8, 0.1)) stop1.setColorSpec(QColor.Hsv) stop2 = QgsGradientStop(0.5, QColor.fromHslF(0.3, 0.2, 0.1, 0.9)) stop2.setColorSpec(QColor.Hsl) stop3 = QgsGradientStop(0.9, QColor(60, 100, 120)) stop3.setColorSpec(QColor.Rgb) r.setStops([stop1, stop2, stop3]) self.assertAlmostEqual(r.color(0).hsvHueF(), 0.2, 3) self.assertAlmostEqual(r.color(0).hsvSaturationF(), 0.4, 3) self.assertAlmostEqual(r.color(0).valueF(), 0.6, 3) self.assertAlmostEqual(r.color(0).alphaF(), 0.3, 3) self.assertAlmostEqual(r.color(0.05).hsvHueF(), 0.3, 3) self.assertAlmostEqual(r.color(0.05).hsvSaturationF(), 0.5, 3) self.assertAlmostEqual(r.color(0.05).valueF(), 0.7, 3) self.assertAlmostEqual(r.color(0.05).alphaF(), 0.2, 3) self.assertAlmostEqual(r.color(0.1).hsvHueF(), 0.4, 3) self.assertAlmostEqual(r.color(0.1).hsvSaturationF(), 0.6, 3) self.assertAlmostEqual(r.color(0.1).valueF(), 0.8, 3) self.assertAlmostEqual(r.color(0.1).alphaF(), 0.1, 3) self.assertAlmostEqual(r.color(0.1).hslHueF(), 0.4, 3) self.assertAlmostEqual(r.color(0.1).hslSaturationF(), 0.5454, 3) self.assertAlmostEqual(r.color(0.1).lightnessF(), 0.56, 3) self.assertAlmostEqual(r.color(0.3).hslHueF(), 0.85, 3) self.assertAlmostEqual(r.color(0.3).hslSaturationF(), 0.3727, 3) self.assertAlmostEqual(r.color(0.3).lightnessF(), 0.330, 3) self.assertAlmostEqual(r.color(0.3).alphaF(), 0.5, 3) self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.3, 3) self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.2, 3) self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.1, 3) self.assertAlmostEqual(r.color(0.5).alphaF(), 0.9, 3) self.assertEqual(r.color(0.5).red(), 22) self.assertAlmostEqual(r.color(0.5).green(), 31, -1) self.assertEqual(r.color(0.5).blue(), 20) self.assertEqual(r.color(0.7).red(), 41) self.assertEqual(r.color(0.7).green(), 65) self.assertEqual(r.color(0.7).blue(), 70) self.assertAlmostEqual(r.color(0.7).alphaF(), 0.95, 3) self.assertEqual(r.color(0.9), QColor(60, 100, 120)) self.assertEqual(r.color(0.95), QColor(30, 150, 60)) self.assertEqual(r.color(1), QColor(0, 200, 0)) # HSV based interpolation, invalid hues rr = QgsGradientColorRamp(QColor.fromHsvF(-1, 0, 0.6, 1), QColor.fromHsvF(0.2, 0.7, 0.8, .5)) rr.setColorSpec(QColor.Hsv) self.assertAlmostEqual(rr.color(0.5).hsvHueF(), 0.2, 3) # should take either avialable hue self.assertAlmostEqual(rr.color(0.5).hsvSaturationF(), 0.350, 3) self.assertAlmostEqual(rr.color(0.5).valueF(), 0.7, 3) self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3) rr = QgsGradientColorRamp(QColor.fromHsvF(0.2, 0.7, 0.8, .5), QColor.fromHsvF(-1, 0, 0.6, 1)) rr.setColorSpec(QColor.Hsv) self.assertAlmostEqual(rr.color(0.5).hsvHueF(), 0.2, 3) # should take either avialable hue self.assertAlmostEqual(rr.color(0.5).hsvSaturationF(), 0.350, 3) self.assertAlmostEqual(rr.color(0.5).valueF(), 0.7, 3) self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3) # both invalid hue rr = QgsGradientColorRamp(QColor.fromHsvF(-1, 0.7, 0.8, .5), QColor.fromHsvF(-1, 0, 0.6, 1)) rr.setColorSpec(QColor.Hsv) self.assertEqual(rr.color(0.5).hsvHueF(), -1) self.assertAlmostEqual(rr.color(0.5).hsvSaturationF(), 0.350, 3) self.assertAlmostEqual(rr.color(0.5).valueF(), 0.7, 3) self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3) # HSL based interpolation, invalid hues rr = QgsGradientColorRamp(QColor.fromHslF(-1, 0, 0.6, 1), QColor.fromHslF(0.2, 0.7, 0.8, .5)) rr.setColorSpec(QColor.Hsl) self.assertAlmostEqual(rr.color(0.5).hslHueF(), 0.2, 3) # should take either avialable hue self.assertAlmostEqual(rr.color(0.5).hslSaturationF(), 0.350, 3) self.assertAlmostEqual(rr.color(0.5).lightnessF(), 0.7, 3) self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3) rr = QgsGradientColorRamp(QColor.fromHslF(0.2, 0.7, 0.8, .5), QColor.fromHslF(-1, 0, 0.6, 1)) rr.setColorSpec(QColor.Hsl) self.assertAlmostEqual(rr.color(0.5).hslHueF(), 0.2, 3) # should take either avialable hue self.assertAlmostEqual(rr.color(0.5).hslSaturationF(), 0.350, 3) self.assertAlmostEqual(rr.color(0.5).lightnessF(), 0.7, 3) self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3) # both invalid hue rr = QgsGradientColorRamp(QColor.fromHslF(-1, 0.7, 0.8, .5), QColor.fromHslF(-1, 0, 0.6, 1)) rr.setColorSpec(QColor.Hsl) self.assertEqual(rr.color(0.5).hslHueF(), -1) self.assertAlmostEqual(rr.color(0.5).hslSaturationF(), 0.350, 3) self.assertAlmostEqual(rr.color(0.5).lightnessF(), 0.7, 3) self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3) # test setters r.setColor1(QColor(0, 0, 200)) self.assertEqual(r.color1(), QColor(0, 0, 200)) self.assertEqual(r.color(0), QColor(0, 0, 200)) r.setColor2(QColor(0, 0, 100)) self.assertEqual(r.color2(), QColor(0, 0, 100)) self.assertEqual(r.color(1.0), QColor(0, 0, 100)) stop = QgsGradientStop(0.4, QColor(100, 100, 40)) stop.setColorSpec(QColor.Hsv) stop.setDirection(Qgis.AngularDirection.Clockwise) r.setStops([stop]) s = r.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) self.assertEqual(s[0].color, QColor(100, 100, 40)) # test info r.setInfo({'key1': 'val1', 'key2': 'val2'}) self.assertEqual(r.info()['key1'], 'val1') self.assertEqual(r.info()['key2'], 'val2') # test creating from properties r.setColorSpec(QColor.Hsv) r.setDirection(Qgis.AngularDirection.Clockwise) props = r.properties() fromProps = QgsGradientColorRamp.create(props) self.assertEqual(fromProps.color1(), QColor(0, 0, 200)) self.assertEqual(fromProps.color2(), QColor(0, 0, 100)) s = fromProps.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) self.assertEqual(s[0].colorSpec(), QColor.Hsv) self.assertEqual(s[0].direction(), Qgis.AngularDirection.Clockwise) c = QColor(s[0].color) self.assertEqual(c, QColor(100, 100, 40)) self.assertEqual(fromProps.info()['key1'], 'val1') self.assertEqual(fromProps.info()['key2'], 'val2') self.assertEqual(fromProps.isDiscrete(), False) self.assertEqual(fromProps.colorSpec(), QColor.Hsv) self.assertEqual(fromProps.direction(), Qgis.AngularDirection.Clockwise) # test cloning ramp cloned = r.clone() self.assertEqual(cloned.color1(), QColor(0, 0, 200)) self.assertEqual(cloned.color2(), QColor(0, 0, 100)) s = cloned.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) self.assertEqual(s[0].colorSpec(), QColor.Hsv) self.assertEqual(s[0].direction(), Qgis.AngularDirection.Clockwise) c = QColor(s[0].color) self.assertEqual(c, QColor(100, 100, 40)) self.assertEqual(cloned.info()['key1'], 'val1') self.assertEqual(cloned.info()['key2'], 'val2') self.assertEqual(cloned.isDiscrete(), False) self.assertEqual(cloned.colorSpec(), QColor.Hsv) self.assertEqual(cloned.direction(), Qgis.AngularDirection.Clockwise) # test discrete ramps # first with no stops d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True) self.assertEqual(d.isDiscrete(), True) self.assertEqual(d.color(0), QColor(200, 0, 0)) self.assertEqual(d.color(0.5), QColor(200, 0, 0)) self.assertEqual(d.color(1), QColor(0, 200, 0)) # then with stops d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True, [ QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100)) ]) self.assertEqual(d.isDiscrete(), True) self.assertEqual(d.color(0), QColor(200, 0, 0)) self.assertEqual(d.color(0.05), QColor(200, 0, 0)) self.assertEqual(d.color(0.1), QColor(180, 20, 40)) self.assertEqual(d.color(0.5), QColor(180, 20, 40)) self.assertEqual(d.color(0.9), QColor(40, 60, 100)) self.assertEqual(d.color(0.95), QColor(40, 60, 100)) self.assertEqual(d.color(1), QColor(0, 200, 0)) # to gradient g = QGradient() r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [ QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100)) ]) r.addStopsToGradient(g, 0.5) self.assertEqual(len(g.stops()), 4) self.assertEqual(g.stops()[0], (0.0, QColor(200, 0, 0, 127))) self.assertEqual(g.stops()[1], (0.1, QColor(180, 20, 40, 127))) self.assertEqual(g.stops()[2], (0.9, QColor(40, 60, 100, 127))) self.assertEqual(g.stops()[3], (1.0, QColor(0, 200, 0, 127))) # add to gradient, non-RGB color model g = QGradient() rr = QgsGradientColorRamp(QColor.fromHsvF(0.2, 0.3, 0.4), QColor.fromHsvF(0.8, 1.0, 0.6)) rr.setColorSpec(QColor.Hsv) rr.addStopsToGradient(g, 0.5) res = [(round(stop[0], 2), round(stop[1].hsvHueF(), 2), round(stop[1].hsvSaturationF(), 2), round(stop[1].valueF(), 2), round(stop[1].alphaF(), 2)) for stop in g.stops()] self.assertEqual(res, [(0.0, 0.2, 0.3, 0.4, 0.5), (0.05, 0.23, 0.34, 0.41, 0.5), (0.1, 0.26, 0.37, 0.42, 0.5), (0.15, 0.29, 0.41, 0.43, 0.5), (0.2, 0.32, 0.44, 0.44, 0.5), (0.25, 0.35, 0.48, 0.45, 0.5), (0.3, 0.38, 0.51, 0.46, 0.5), (0.35, 0.41, 0.55, 0.47, 0.5), (0.4, 0.44, 0.58, 0.48, 0.5), (0.45, 0.47, 0.61, 0.49, 0.5), (0.5, 0.5, 0.65, 0.5, 0.5), (0.55, 0.53, 0.69, 0.51, 0.5), (0.6, 0.56, 0.72, 0.52, 0.5), (0.65, 0.59, 0.76, 0.53, 0.5), (0.7, 0.62, 0.79, 0.54, 0.5), (0.75, 0.65, 0.83, 0.55, 0.5), (0.8, 0.68, 0.86, 0.56, 0.5), (0.85, 0.71, 0.9, 0.57, 0.5), (0.9, 0.74, 0.93, 0.58, 0.5), (0.95, 0.77, 0.96, 0.59, 0.5), (1.0, 0.8, 1.0, 0.6, 0.5)]) # with stops stop = QgsGradientStop(0.6, QColor.fromHsvF(0.1, 0.7, 0.3, 0.4)) stop.setColorSpec(QColor.Hsl) stop.setDirection(Qgis.AngularDirection.Clockwise) rr.setStops([stop]) g = QGradient() rr.addStopsToGradient(g, 0.5) res = [(round(stop[0], 2), round(stop[1].hsvHueF(), 2), round(stop[1].hsvSaturationF(), 2), round(stop[1].valueF(), 2), round(stop[1].alphaF(), 2)) for stop in g.stops()] self.assertEqual(res, [(0.0, 0.2, 0.3, 0.4, 0.5), (0.05, 0.19, 0.34, 0.4, 0.47), (0.1, 0.18, 0.38, 0.39, 0.45), (0.15, 0.17, 0.42, 0.38, 0.42), (0.2, 0.17, 0.46, 0.38, 0.4), (0.25, 0.16, 0.49, 0.37, 0.37), (0.3, 0.15, 0.53, 0.36, 0.35), (0.35, 0.14, 0.56, 0.35, 0.33), (0.4, 0.13, 0.59, 0.35, 0.3), (0.45, 0.12, 0.62, 0.33, 0.27), (0.5, 0.12, 0.65, 0.32, 0.25), (0.55, 0.11, 0.67, 0.31, 0.22), (0.6, 0.1, 0.7, 0.3, 0.2), (0.65, 0.19, 0.74, 0.34, 0.24), (0.7, 0.28, 0.78, 0.38, 0.27), (0.75, 0.36, 0.81, 0.41, 0.31), (0.8, 0.45, 0.85, 0.45, 0.35), (0.85, 0.54, 0.89, 0.49, 0.39), (0.9, 0.62, 0.93, 0.53, 0.42), (0.95, 0.71, 0.96, 0.56, 0.46), (1.0, 0.8, 1.0, 0.6, 0.5)]) # test that stops are ordered when setting them # first add some out-of-order stops r.setStops([ QgsGradientStop(0.4, QColor(100, 100, 40)), QgsGradientStop(0.2, QColor(200, 200, 80)), QgsGradientStop(0.8, QColor(50, 20, 10)), QgsGradientStop(0.6, QColor(10, 10, 4)) ]) s = r.stops() self.assertEqual(len(s), 4) self.assertEqual(s[0].offset, 0.2) self.assertEqual(s[0].color, QColor(200, 200, 80)) self.assertEqual(s[1].offset, 0.4) self.assertEqual(s[1].color, QColor(100, 100, 40)) self.assertEqual(s[2].offset, 0.6) self.assertEqual(s[2].color, QColor(10, 10, 4)) self.assertEqual(s[3].offset, 0.8) self.assertEqual(s[3].color, QColor(50, 20, 10)) # test continuous invert function r.invert() self.assertEqual(r.color(0), QColor(0, 200, 0)) self.assertEqual(r.color(1), QColor(200, 0, 0)) self.assertEqual(r.color(0.2), QColor(50, 20, 10)) # test discrete invert function r = QgsGradientColorRamp(QColor(255, 255, 255), QColor( 0, 0, 0), True, [ QgsGradientStop(0.33, QColor(128, 128, 128)), QgsGradientStop(0.66, QColor(0, 0, 0)) ]) self.assertEqual(r.color(0.2), QColor(255, 255, 255)) self.assertEqual(r.color(0.5), QColor(128, 128, 128)) self.assertEqual(r.color(0.8), QColor(0, 0, 0)) r.invert() self.assertEqual(r.color(0.2), QColor(0, 0, 0)) self.assertEqual(r.color(0.5), QColor(128, 128, 128)) self.assertEqual(r.color(0.8), QColor(255, 255, 255)) # test invalid value range r = QgsGradientColorRamp(color1=QColor(0, 0, 255), color2=QColor(0, 255, 0), discrete=False) self.assertEqual(r.color(0), QColor(0, 0, 255)) self.assertEqual(r.color(1), QColor(0, 255, 0)) self.assertEqual(r.color(0.5).name(), QColor(0, 128, 128).name()) self.assertEqual(r.color(2), QColor(0, 255, 0)) self.assertEqual(r.color(-1), QColor(0, 0, 255)) self.assertEqual(r.color(float('nan')), QColor(0, 255, 0))
def testQgsVectorGradientRampV2(self): # test QgsGradientStop stop = QgsGradientStop(0.9, QColor(200, 150, 100)) self.assertEqual(stop.offset, 0.9) self.assertEqual(stop.color, QColor(200, 150, 100)) self.assertEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.1, QColor(180, 20, 30))) self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.2, QColor(180, 20, 30))) self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.1, QColor(180, 40, 30))) # test gradient with only start/end color r = QgsGradientColorRamp(QColor(200, 0, 0, 100), QColor(0, 200, 0, 200)) self.assertEqual(r.type(), 'gradient') self.assertEqual(r.color1(), QColor(200, 0, 0, 100)) self.assertEqual(r.color2(), QColor(0, 200, 0, 200)) self.assertEqual(r.isDiscrete(), False) self.assertEqual(len(r.stops()), 0) self.assertEqual(r.count(), 2) self.assertEqual(r.value(0), 0.0) self.assertEqual(r.value(1), 1.0) self.assertEqual(r.color(0), QColor(200, 0, 0, 100)) self.assertEqual(r.color(1), QColor(0, 200, 0, 200)) self.assertEqual(r.color(0.5), QColor(100, 100, 0, 150)) # test gradient with stops r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [ QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100)) ]) self.assertEqual(r.color1(), QColor(200, 0, 0)) self.assertEqual(r.color2(), QColor(0, 200, 0)) self.assertEqual(r.isDiscrete(), False) self.assertEqual(len(r.stops()), 2) self.assertEqual(r.count(), 4) self.assertEqual(r.value(0), 0.0) self.assertEqual(r.value(1), 0.1) self.assertEqual(r.value(2), 0.9) self.assertEqual(r.value(3), 1.0) self.assertEqual(r.color(0), QColor(200, 0, 0)) self.assertEqual(r.color(0.05), QColor(190, 10, 20)) self.assertEqual(r.color(0.1), QColor(180, 20, 40)) self.assertEqual(r.color(0.5), QColor(110, 40, 70)) self.assertEqual(r.color(0.9), QColor(40, 60, 100)) self.assertEqual(r.color(0.95), QColor(20, 130, 50)) self.assertEqual(r.color(1), QColor(0, 200, 0)) # test setters r.setColor1(QColor(0, 0, 200)) self.assertEqual(r.color1(), QColor(0, 0, 200)) self.assertEqual(r.color(0), QColor(0, 0, 200)) r.setColor2(QColor(0, 0, 100)) self.assertEqual(r.color2(), QColor(0, 0, 100)) self.assertEqual(r.color(1.0), QColor(0, 0, 100)) r.setStops([QgsGradientStop(0.4, QColor(100, 100, 40))]) s = r.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) self.assertEqual(s[0].color, QColor(100, 100, 40)) # test info r.setInfo({'key1': 'val1', 'key2': 'val2'}) self.assertEqual(r.info()['key1'], 'val1') self.assertEqual(r.info()['key2'], 'val2') # test creating from properties props = r.properties() fromProps = QgsGradientColorRamp.create(props) self.assertEqual(fromProps.color1(), QColor(0, 0, 200)) self.assertEqual(fromProps.color2(), QColor(0, 0, 100)) s = fromProps.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) c = QColor(s[0].color) self.assertEqual(c, QColor(100, 100, 40)) self.assertEqual(fromProps.info()['key1'], 'val1') self.assertEqual(fromProps.info()['key2'], 'val2') self.assertEqual(fromProps.isDiscrete(), False) # test cloning ramp cloned = r.clone() self.assertEqual(cloned.color1(), QColor(0, 0, 200)) self.assertEqual(cloned.color2(), QColor(0, 0, 100)) s = cloned.stops() self.assertEqual(len(s), 1) self.assertEqual(s[0].offset, 0.4) c = QColor(s[0].color) self.assertEqual(c, QColor(100, 100, 40)) self.assertEqual(cloned.info()['key1'], 'val1') self.assertEqual(cloned.info()['key2'], 'val2') self.assertEqual(cloned.isDiscrete(), False) # test discrete ramps # first with no stops d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True) self.assertEqual(d.isDiscrete(), True) self.assertEqual(d.color(0), QColor(200, 0, 0)) self.assertEqual(d.color(0.5), QColor(200, 0, 0)) self.assertEqual(d.color(1), QColor(0, 200, 0)) # then with stops d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True, [ QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100)) ]) self.assertEqual(d.isDiscrete(), True) self.assertEqual(d.color(0), QColor(200, 0, 0)) self.assertEqual(d.color(0.05), QColor(200, 0, 0)) self.assertEqual(d.color(0.1), QColor(180, 20, 40)) self.assertEqual(d.color(0.5), QColor(180, 20, 40)) self.assertEqual(d.color(0.9), QColor(40, 60, 100)) self.assertEqual(d.color(0.95), QColor(40, 60, 100)) self.assertEqual(d.color(1), QColor(0, 200, 0)) # to gradient g = QGradient() r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [ QgsGradientStop(0.1, QColor(180, 20, 40)), QgsGradientStop(0.9, QColor(40, 60, 100)) ]) r.addStopsToGradient(g, 0.5) self.assertEqual(len(g.stops()), 4) self.assertEqual(g.stops()[0], (0.0, QColor(200, 0, 0, 127))) self.assertEqual(g.stops()[1], (0.1, QColor(180, 20, 40, 127))) self.assertEqual(g.stops()[2], (0.9, QColor(40, 60, 100, 127))) self.assertEqual(g.stops()[3], (1.0, QColor(0, 200, 0, 127))) # test that stops are ordered when setting them # first add some out-of-order stops r.setStops([ QgsGradientStop(0.4, QColor(100, 100, 40)), QgsGradientStop(0.2, QColor(200, 200, 80)), QgsGradientStop(0.8, QColor(50, 20, 10)), QgsGradientStop(0.6, QColor(10, 10, 4)) ]) s = r.stops() self.assertEqual(len(s), 4) self.assertEqual(s[0].offset, 0.2) self.assertEqual(s[0].color, QColor(200, 200, 80)) self.assertEqual(s[1].offset, 0.4) self.assertEqual(s[1].color, QColor(100, 100, 40)) self.assertEqual(s[2].offset, 0.6) self.assertEqual(s[2].color, QColor(10, 10, 4)) self.assertEqual(s[3].offset, 0.8) self.assertEqual(s[3].color, QColor(50, 20, 10)) # test continuous invert function r.invert() self.assertEqual(r.color(0), QColor(0, 200, 0)) self.assertEqual(r.color(1), QColor(200, 0, 0)) self.assertEqual(r.color(0.2), QColor(50, 20, 10)) # test discrete invert function r = QgsGradientColorRamp(QColor(255, 255, 255), QColor( 0, 0, 0), True, [ QgsGradientStop(0.33, QColor(128, 128, 128)), QgsGradientStop(0.66, QColor(0, 0, 0)) ]) self.assertEqual(r.color(0.2), QColor(255, 255, 255)) self.assertEqual(r.color(0.5), QColor(128, 128, 128)) self.assertEqual(r.color(0.8), QColor(0, 0, 0)) r.invert() self.assertEqual(r.color(0.2), QColor(0, 0, 0)) self.assertEqual(r.color(0.5), QColor(128, 128, 128)) self.assertEqual(r.color(0.8), QColor(255, 255, 255))
def style_maps(layer, style_by, iface, output_type='damages-rlzs', perils=None, add_null_class=False, render_higher_on_top=False, repaint=True, use_sgc_style=False): symbol = QgsSymbol.defaultSymbol(layer.geometryType()) # see properties at: # https://qgis.org/api/qgsmarkersymbollayerv2_8cpp_source.html#l01073 symbol.setOpacity(1) if isinstance(symbol, QgsMarkerSymbol): # do it only for the layer with points symbol.symbolLayer(0).setStrokeStyle(Qt.PenStyle(Qt.NoPen)) style = get_style(layer, iface.messageBar()) # this is the default, as specified in the user settings ramp = QgsGradientColorRamp(style['color_from'], style['color_to']) style_mode = style['style_mode'] # in most cases, we override the user-specified setting, and use # instead a setting that was required by scientists if output_type in OQ_TO_LAYER_TYPES: default_qgs_style = QgsStyle().defaultStyle() default_color_ramp_names = default_qgs_style.colorRampNames() if output_type in ( 'damages-rlzs', 'avg_losses-rlzs', 'avg_losses-stats', ): # options are EqualInterval, Quantile, Jenks, StdDev, Pretty # jenks = natural breaks if Qgis.QGIS_VERSION_INT < 31000: style_mode = QgsGraduatedSymbolRenderer.Jenks else: style_mode = 'Jenks' ramp_type_idx = default_color_ramp_names.index('Reds') symbol.setColor(QColor(RAMP_EXTREME_COLORS['Reds']['top'])) inverted = False elif (output_type in ('gmf_data', 'ruptures') or (output_type == 'hmaps' and not use_sgc_style)): # options are EqualInterval, Quantile, Jenks, StdDev, Pretty # jenks = natural breaks if output_type == 'ruptures': if Qgis.QGIS_VERSION_INT < 31000: style_mode = QgsGraduatedSymbolRenderer.Pretty else: style_mode = 'PrettyBreaks' else: if Qgis.QGIS_VERSION_INT < 31000: style_mode = QgsGraduatedSymbolRenderer.EqualInterval else: style_mode = 'EqualInterval' ramp_type_idx = default_color_ramp_names.index('Spectral') inverted = True symbol.setColor(QColor(RAMP_EXTREME_COLORS['Reds']['top'])) elif output_type == 'hmaps' and use_sgc_style: # FIXME: for SGC they were using size 10000 map units # options are EqualInterval, Quantile, Jenks, StdDev, Pretty # jenks = natural breaks if Qgis.QGIS_VERSION_INT < 31000: style_mode = QgsGraduatedSymbolRenderer.Pretty else: style_mode = 'PrettyBreaks' try: ramp_type_idx = default_color_ramp_names.index( 'SGC_Green2Red_Hmap_Color_Ramp') except ValueError: raise ValueError( 'Color ramp SGC_Green2Red_Hmap_Color_Ramp was ' 'not found. Please import it from ' 'Settings -> Style Manager, loading ' 'svir/resources/sgc_green2red_hmap_color_ramp.xml') inverted = False registry = QgsApplication.symbolLayerRegistry() symbol_props = { 'name': 'square', 'color': '0,0,0', 'color_border': '0,0,0', 'offset': '0,0', 'size': '1.5', # FIXME 'angle': '0', } square = registry.symbolLayerMetadata( "SimpleMarker").createSymbolLayer(symbol_props) symbol = QgsSymbol.defaultSymbol(layer.geometryType()).clone() symbol.deleteSymbolLayer(0) symbol.appendSymbolLayer(square) symbol.symbolLayer(0).setStrokeStyle(Qt.PenStyle(Qt.NoPen)) elif output_type in ['asset_risk', 'input']: # options are EqualInterval, Quantile, Jenks, StdDev, Pretty # jenks = natural breaks if Qgis.QGIS_VERSION_INT < 31000: style_mode = QgsGraduatedSymbolRenderer.EqualInterval else: style_mode = 'EqualInterval' # exposure_strings = ['number', 'occupants', 'value'] # setting exposure colors by default colors = { 'single': RAMP_EXTREME_COLORS['Blues']['top'], 'ramp_name': 'Blues' } inverted = False if output_type == 'asset_risk': damage_strings = perils for damage_string in damage_strings: if damage_string in style_by: colors = { 'single': RAMP_EXTREME_COLORS['Spectral']['top'], 'ramp_name': 'Spectral' } inverted = True break else: # 'input' colors = { 'single': RAMP_EXTREME_COLORS['Greens']['top'], 'ramp_name': 'Greens' } symbol.symbolLayer(0).setShape( QgsSimpleMarkerSymbolLayerBase.Square) single_color = colors['single'] ramp_name = colors['ramp_name'] ramp_type_idx = default_color_ramp_names.index(ramp_name) symbol.setColor(QColor(single_color)) else: raise NotImplementedError( 'Undefined color ramp for output type %s' % output_type) ramp = default_qgs_style.colorRamp( default_color_ramp_names[ramp_type_idx]) if inverted: ramp.invert() # get unique values fni = layer.fields().indexOf(style_by) unique_values = layer.dataProvider().uniqueValues(fni) num_unique_values = len(unique_values - {NULL}) if num_unique_values > 2: if Qgis.QGIS_VERSION_INT < 31000: renderer = QgsGraduatedSymbolRenderer.createRenderer( layer, style_by, min(num_unique_values, style['classes']), style_mode, symbol.clone(), ramp) else: renderer = QgsGraduatedSymbolRenderer(style_by, []) # NOTE: the following returns an instance of one of the # subclasses of QgsClassificationMethod classification_method = \ QgsApplication.classificationMethodRegistry().method( style_mode) renderer.setClassificationMethod(classification_method) renderer.updateColorRamp(ramp) renderer.updateSymbols(symbol.clone()) renderer.updateClasses( layer, min(num_unique_values, style['classes'])) if not use_sgc_style: if Qgis.QGIS_VERSION_INT < 31000: label_format = renderer.labelFormat() # NOTE: the following line might be useful # label_format.setTrimTrailingZeroes(True) label_format.setPrecision(2) renderer.setLabelFormat(label_format, updateRanges=True) else: renderer.classificationMethod().setLabelPrecision(2) renderer.calculateLabelPrecision() elif num_unique_values == 2: categories = [] for unique_value in unique_values: symbol = symbol.clone() try: symbol.setColor( QColor(RAMP_EXTREME_COLORS[ramp_name] ['bottom' if unique_value == min(unique_values) else 'top'])) except Exception: symbol.setColor( QColor(style['color_from'] if unique_value == min(unique_values) else style['color_to'])) category = QgsRendererCategory(unique_value, symbol, str(unique_value)) # entry for the list of category items categories.append(category) renderer = QgsCategorizedSymbolRenderer(style_by, categories) else: renderer = QgsSingleSymbolRenderer(symbol.clone()) if add_null_class and NULL in unique_values: # add a class for NULL values rule_renderer = QgsRuleBasedRenderer(symbol.clone()) root_rule = rule_renderer.rootRule() not_null_rule = root_rule.children()[0].clone() # strip parentheses from stringified color HSL not_null_rule.setFilterExpression( '%s IS NOT NULL' % QgsExpression.quotedColumnRef(style_by)) not_null_rule.setLabel('%s:' % style_by) root_rule.appendChild(not_null_rule) null_rule = root_rule.children()[0].clone() null_rule.setSymbol( QgsFillSymbol.createSimple({ 'color': '160,160,160', 'style': 'diagonal_x' })) null_rule.setFilterExpression( '%s IS NULL' % QgsExpression.quotedColumnRef(style_by)) null_rule.setLabel(tr('No points')) root_rule.appendChild(null_rule) if isinstance(renderer, QgsGraduatedSymbolRenderer): # create value ranges rule_renderer.refineRuleRanges(not_null_rule, renderer) # remove default rule elif isinstance(renderer, QgsCategorizedSymbolRenderer): rule_renderer.refineRuleCategoris(not_null_rule, renderer) for rule in rule_renderer.rootRule().children()[1].children(): label = rule.label() # by default, labels are like: # ('"collapse-structural-ASH_DRY_sum" >= 0.0000 AND # "collapse-structural-ASH_DRY_sum" <= 2.3949') first, second = label.split(" AND ") bottom = first.rsplit(" ", 1)[1] top = second.rsplit(" ", 1)[1] simplified = "%s - %s" % (bottom, top) rule.setLabel(simplified) root_rule.removeChildAt(0) renderer = rule_renderer if render_higher_on_top: renderer.setUsingSymbolLevels(True) symbol_items = [item for item in renderer.legendSymbolItems()] for i in range(len(symbol_items)): sym = symbol_items[i].symbol().clone() key = symbol_items[i].ruleKey() for lay in range(sym.symbolLayerCount()): sym.symbolLayer(lay).setRenderingPass(i) renderer.setLegendSymbolItem(key, sym) layer.setRenderer(renderer) if not use_sgc_style: layer.setOpacity(0.7) if repaint: layer.triggerRepaint() iface.setActiveLayer(layer) iface.zoomToActiveLayer() # NOTE QGIS3: probably not needed # iface.layerTreeView().refreshLayerSymbology(layer.id()) iface.mapCanvas().refresh()