#1 Wed 05 May 2021 17:27
- bd66300
- Juste Inscrit !
- Date d'inscription: 3 Apr 2021
- Messages: 9
QGIS: PyQGis Symbology 'rule based'
Bonjour à tous,
Je cherche à modifier avec Python les éléments d’une symbologie ‘rule based’.
Voici les 2 premiers élements que me donne le layer.renderer().dump():
Code:
RULE Tous, pas d'échelle - scale [0,0] - filter - symbol MARKER SYMBOL (1 layers) color 25,136,233,255 RULE date spécifique - scale [0,0] - filter "datePhoto" like '%2020-02-10%' - symbol MARKER SYMBOL (1 layers) color 250,255,57,255
La question est comment puis-je atteindre chacun de ces éléments (“Tous, pas d’échelle”, scale [0,0], etc…)
et comment je peux les modifier.
Merci pour vos réponses, BD
Hors ligne
#2 Wed 05 May 2021 20:13
- bd66300
- Juste Inscrit !
- Date d'inscription: 3 Apr 2021
- Messages: 9
Re: QGIS: PyQGis Symbology 'rule based'
Objet: PyQGis symbology rulebased
(re) bonjour,
Suite à mon précédent message , j’ai progressé un peu. J’arrive maintenant à ‘lire’ les différents éléments de chaque règle (code ci-dessous) mais n’arrive pas à modifier l’un de ces éléments.
Dans l’exemple ci-dessous, j’essaie de modifier la condition de la 7ème règle ("MotsCles" like \'%GEOLOGI%\''). Mais lorsque je regarde dans Qgis, la modification n’a pas été faite.
Avez-vous une idée?
Code:
layerPhotos = QgsProject.instance().mapLayersByName('Photographies')[0] iface.setActiveLayer(layerPhotos) renderer = layerPhotos.renderer() root_rule = renderer.rootRule() # objet de la class qgis._core.QgsRuleBasedRenderer.Rule print(root_rule.children()[6].symbol()) print(root_rule.children()[6].label()) print(root_rule.children()[6].maximumScale()) print(root_rule.children()[6].minimumScale()) print("filtre: ", root_rule.children()[6].filter()) print("description:", root_rule.children()[6].description()) exp = QgsExpression('"MotsCles" like \'%GEOLOGI%\'') renderer.rootRule().children()[6].filterExp = exp layerPhotos.setRenderer(renderer) layerPhotos.triggerRepaint()
Hors ligne
#3 Thu 06 May 2021 01:28
Re: QGIS: PyQGis Symbology 'rule based'
Bonjour,
Essayez d'utiliser un "setter" comme suivant plutôt que d'assigner une propriété
Code:
renderer.rootRule().children()[6].setFilterExpression('"MotsCles" like \'%GEOLOGI%\'')
A partir de la documentation, vous allez voir toute la liste disponible depuis "setActive" https://qgis.org/api/classQgsRuleBasedR … 1Rule.html
De manière intuitive, si vous avez un appel "root_rule.children()[6].description()" vous aurez la possibilité de faire "root_rule.children()[6].setDescription('ma description')"
Un autre manière pour avoir toutes les méthodes disponible pour votre objet est de faire "print(dir(root_rule.children()[6]))"
Cordialement
Thomas
Hors ligne
#4 Thu 06 May 2021 09:37
- bd66300
- Juste Inscrit !
- Date d'inscription: 3 Apr 2021
- Messages: 9
Re: QGIS: PyQGis Symbology 'rule based'
Bonjour Thomas,
Super la solution!
En fait, c’était simplement le filterExp qui devait être remplacé par setFilterExpression.
Merci surtout de n’avoir pas donné uniquement la solution mais également les éléments pour la comprendre.
Lorsque vous dites ‘utilisez un setter plutôt que d’assigner une propriété’, comment savez-vous que c’est le cas ici? Quelle a été votre démarche intellectuelle pour trouver la solution car j’imagine que vous n’avez pas l’habitude de traiter ce cas très particulier? Vous utilisez automatiquement le ‘dir()’ je suppose. Mais pourquoi écarter l’assignation?
En tout cas, bravo pour votre réponse qui encore une fois permet de connaître la solution mais également la méthode pour la trouver.
Bien cordialement,
Bruno
Hors ligne