def testQgsRendererRange_1(self): """Test QgsRendererRange getter/setter functions""" range = QgsRendererRange() self.assertTrue(range) lower = 123.45 upper = 234.56 label = "Test label" symbol = createMarkerSymbol() range.setLowerValue(lower) self.assertEqual(range.lowerValue(), lower, "Lower value getter/setter failed") range.setUpperValue(upper) self.assertEqual(range.upperValue(), upper, "Upper value getter/setter failed") range.setLabel(label) self.assertEqual(range.label(), label, "Label getter/setter failed") range.setRenderState(True) self.assertTrue(range.renderState(), "Render state getter/setter failed") range.setRenderState(False) self.assertFalse(range.renderState(), "Render state getter/setter failed") range.setSymbol(symbol.clone()) self.assertEqual(symbol.dump(), range.symbol().dump(), "Symbol getter/setter failed") range2 = QgsRendererRange(lower, upper, symbol.clone(), label, False) self.assertEqual(range2.lowerValue(), lower, "Lower value from constructor failed") self.assertEqual(range2.upperValue(), upper, "Upper value from constructor failed") self.assertEqual(range2.label(), label, "Label from constructor failed") self.assertEqual(range2.symbol().dump(), symbol.dump(), "Symbol from constructor failed") self.assertFalse(range2.renderState(), "Render state getter/setter failed")
def testQgsRendererRangeLabelFormat_2(self): """Test QgsRendererRangeLabelFormat number format""" format = QgsRendererRangeLabelFormat() # Tests have precision, trim, value, expected # (Note: Not sure what impact of locale is on these tests) tests = ( (2, False, 1.0, '1.00'), (2, True, 1.0, '1'), (2, False, 1.234, '1.23'), (2, True, 1.234, '1.23'), (2, False, 1.236, '1.24'), (2, False, -1.236, '-1.24'), (2, False, -0.004, '0.00'), (2, True, 1.002, '1'), (2, True, 1.006, '1.01'), (2, True, 1.096, '1.1'), (3, True, 1.096, '1.096'), (-2, True, 1496.45, '1500'), (-2, True, 149.45, '100'), (-2, True, 79.45, '100'), (-2, True, 49.45, '0'), (-2, True, -49.45, '0'), (-2, True, -149.45, '-100'), ) for f in tests: precision, trim, value, expected = f format.setPrecision(precision) format.setTrimTrailingZeroes(trim) result = format.formatNumber(value) self.assertEqual(result, expected, "Number format error {0}:{1}:{2} => {3}".format( precision, trim, value, result)) # Label tests - label format, expected result. # Labels will be evaluated with lower=1.23 upper=2.34, precision=2 ltests = ( ("%1 - %2", "1.23 - 2.34"), ("%1", "1.23"), ("%2", "2.34"), ("%2%", "2.34%"), ("%1%1", "1.231.23"), ("from %1 to %2 meters", "from 1.23 to 2.34 meters"), ("from %2 to %1 meters", "from 2.34 to 1.23 meters"), ) format.setPrecision(2) format.setTrimTrailingZeroes(False) lower = 1.232 upper = 2.339 for t in ltests: label, expected = t format.setFormat(label) result = format.labelForLowerUpper(lower, upper) self.assertEqual(result, expected, "Label format error {0} => {1}".format( label, result)) range = QgsRendererRange() range.setLowerValue(lower) range.setUpperValue(upper) label = ltests[0][0] format.setFormat(label) result = format.labelForRange(range) self.assertEqual(result, ltests[0][1], "Label for range error {0} => {1}".format( label, result))
def testQgsGraduatedSymbolRenderer_2(self): """Test QgsGraduatedSymbolRenderer: Adding /removing/editing classes """ # Create a renderer renderer = QgsGraduatedSymbolRenderer() symbol = createMarkerSymbol() renderer.setSourceSymbol(symbol.clone()) symbol.setColor(QColor(255, 0, 0)) # Add class without start and end ranges renderer.addClass(symbol.clone()) renderer.addClass(symbol.clone()) renderer.updateRangeLabel(1, 'Second range') renderer.updateRangeLowerValue(1, 10.0) renderer.updateRangeUpperValue(1, 25.0) renderer.updateRangeRenderState(1, False) symbol.setColor(QColor(0, 0, 255)) renderer.updateRangeSymbol(1, symbol.clone()) # Add as a rangeobject symbol.setColor(QColor(0, 255, 0)) range = QgsRendererRange(20.0, 25.5, symbol.clone(), 'Third range', False) renderer.addClassRange(range) # Add class by lower and upper renderer.addClassLowerUpper(25.5, 30.5) # (Update label for sorting tests) renderer.updateRangeLabel(3, 'Another range') self.assertEqual( dumpRangeLabels(renderer.ranges()), '(0.0 - 0.0,Second range,Third range,Another range,)', 'Added ranges labels not correct') self.assertEqual( dumpRangeBreaks(renderer.ranges()), '(0.0000-0.0000,10.0000-25.0000,20.0000-25.5000,25.5000-30.5000,)', 'Added ranges lower/upper values not correct') # Check that clone function works renderer2 = renderer.clone() self.assertEqual(dumpGraduatedRenderer(renderer), dumpGraduatedRenderer(renderer2), "clone function doesn't replicate renderer properly") # Check save and reload from Dom works doc = QDomDocument() element = renderer.save(doc, QgsReadWriteContext()) renderer2 = QgsGraduatedSymbolRenderer.create(element, QgsReadWriteContext()) self.assertEqual( dumpGraduatedRenderer(renderer), dumpGraduatedRenderer(renderer2), "Save/create from DOM doesn't replicate renderer properly") # Check sorting renderer.sortByLabel() self.assertEqual( dumpRangeList(renderer.ranges(), labelsOnly=True), '(0.0 - 0.0,Another range,Second range,Third range,)', 'sortByLabel not correct') renderer.sortByValue() self.assertEqual( dumpRangeBreaks(renderer.ranges()), '(0.0000-0.0000,10.0000-25.0000,20.0000-25.5000,25.5000-30.5000,)', 'sortByValue not correct') renderer.sortByValue(Qt.DescendingOrder) self.assertEqual( dumpRangeBreaks(renderer.ranges()), '(25.5000-30.5000,20.0000-25.5000,10.0000-25.0000,0.0000-0.0000,)', 'sortByValue descending not correct') # Check deleting renderer.deleteClass(2) self.assertEqual(dumpRangeBreaks(renderer.ranges()), '(25.5000-30.5000,20.0000-25.5000,0.0000-0.0000,)', 'deleteClass not correct') renderer.deleteAllClasses() self.assertEqual(len(renderer.ranges()), 0, "deleteAllClasses didn't delete all")
def testQgsRendererRangeLabelFormat_2(self): """Test QgsRendererRangeLabelFormat number format""" format = QgsRendererRangeLabelFormat() # Tests have precision, trim, value, expected # (Note: Not sure what impact of locale is on these tests) tests = ( (2, False, 1.0, '1.00'), (2, True, 1.0, '1'), (2, False, 1.234, '1.23'), (2, True, 1.234, '1.23'), (2, False, 1.236, '1.24'), (2, False, -1.236, '-1.24'), (2, False, -0.004, '0.00'), (2, True, 1.002, '1'), (2, True, 1.006, '1.01'), (2, True, 1.096, '1.1'), (3, True, 1.096, '1.096'), (-2, True, 1496.45, '1500'), (-2, True, 149.45, '100'), (-2, True, 79.45, '100'), (-2, True, 49.45, '0'), (-2, True, -49.45, '0'), (-2, True, -149.45, '-100'), ) for f in tests: precision, trim, value, expected = f format.setPrecision(precision) format.setTrimTrailingZeroes(trim) result = format.formatNumber(value) self.assertEqual( result, expected, "Number format error {0}:{1}:{2} => {3}".format( precision, trim, value, result)) # Label tests - label format, expected result. # Labels will be evaluated with lower=1.23 upper=2.34, precision=2 ltests = ( ("%1 - %2", "1.23 - 2.34"), ("%1", "1.23"), ("%2", "2.34"), ("%2%", "2.34%"), ("%1%1", "1.231.23"), ("from %1 to %2 meters", "from 1.23 to 2.34 meters"), ("from %2 to %1 meters", "from 2.34 to 1.23 meters"), ) format.setPrecision(2) format.setTrimTrailingZeroes(False) lower = 1.232 upper = 2.339 for t in ltests: label, expected = t format.setFormat(label) result = format.labelForLowerUpper(lower, upper) self.assertEqual( result, expected, "Label format error {0} => {1}".format(label, result)) range = QgsRendererRange() range.setLowerValue(lower) range.setUpperValue(upper) label = ltests[0][0] format.setFormat(label) result = format.labelForRange(range) self.assertEqual( result, ltests[0][1], "Label for range error {0} => {1}".format(label, result))
def processAlgorithm(self, parameters, context, feedback): # Couche buffer : input_featuresource = self.parameterAsSource(parameters, 'INPUT', context) # Buffer distance : bufferdist = self.parameterAsDouble(parameters, 'BUFFERDIST', context) # Check for cancelation if feedback.isCanceled(): return {} buffer_result = processing.run( 'native:buffer', { # Here we pass on the original parameter values of INPUT # and BUFFER_OUTPUT to the buffer algorithm. 'INPUT': parameters['INPUT'], 'OUTPUT': parameters['BUFFER_OUTPUT'], 'DISTANCE': bufferdist, 'SEGMENTS': 10, 'DISSOLVE': True, 'END_CAP_STYLE': 0, 'JOIN_STYLE': 0, 'MITER_LIMIT': 10 }, # Because the buffer algorithm is being run as a step in # another larger algorithm, the is_child_algorithm option # should be set to True is_child_algorithm=True, # # It's important to pass on the context and feedback objects to # child algorithms, so that they can properly give feedback to # users and handle cancelation requests. context=context, feedback=feedback) # Check for cancelation if feedback.isCanceled(): return {} # Selection de la couche cable : cables = QgsVectorLayer( "/Users/pierre-loupgarrigues/Python JupyterLab/M2/pyqgis/Evaluation_pyqgis/data/cables.shp", "cables", "ogr") cables = iface.activeLayer() # Séléction des cables en fonction des paramètres choisis : cables.selectByExpression( " \"capacite\" > '{}' AND \"mode_pose\" = '{}' ".format( parameters[self.CAPACITE], parameters[self.MODE_DE_POSE])) # Vérification : selectionCapacite = self.parameterAsDouble(parameters, 'CAPACITE', context) print(selectionCapacite) # Vérification : selectionModeDePose = self.parameterAsString(parameters, 'MODE_DE_POSE', context) print(selectionModeDePose) # Sauvegarde de la séléction des cables : cables_selection = processing.run( 'qgis:saveselectedfeatures', { 'INPUT': cables, #'OUTPUT':'memory:' 'OUTPUT': parameters['CABLES_OUTPUT'] }, context=context, feedback=feedback, is_child_algorithm=True) mes_cables = cables_selection['OUTPUT'] ### SYMBOLOGIE GRADUEE nb_prises = ( ('Faible', 0, 9, 'green'), ('Moyen_1', 10, 25, 'yellow'), ('Moyen_2', 26, 100, 'orange'), ('Eleve', 101, 1000000, 'red'), ) # creation ranges = [] for label, lower, upper, color in nb_prises: symbol = QgsSymbol.defaultSymbol(cables.geometryType()) symbol.setColor(QColor(color)) rng = QgsRendererRange(lower, upper, symbol, label) ranges.append(rng) # create the renderer and assign it to a layer expression = 'nb_prises' # field name renderer = QgsGraduatedSymbolRenderer(expression, ranges) cables.setRenderer(renderer) # Return the results return { 'BUFFER_OUTPUT': buffer_result['OUTPUT'], 'CABLES_OUTPUT': cables_selection['OUTPUT'] }
def testRendererRange(self): self.assertEqual(QgsRendererRange().__repr__(), '<QgsRendererRange: 0 - 0>') self.assertEqual(QgsRendererRange(1.0, 2.0, None, None).__repr__(), '<QgsRendererRange: 1 - 2>') self.assertEqual(QgsRendererRange(1.0, 2.0, None, 'my class').__repr__(), '<QgsRendererRange: 1 - 2 (my class)>')