banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

ThomasG
Membre
Lieu: Nantes
Date d'inscription: 9 Sep 2005
Messages: 948
Site web

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

 

Pied de page des forums

Powered by FluxBB