J'utilise pyqgis dans une application autonome. Maintenant, je voulais créer une expression personnalisée à utiliser comme expression de filtre dans la règle de ruleBasedRendererV2
. (J'ai déjà essayé le moteur de rendu avec les fonctions existantes et tout fonctionnait bien!)
Personnalisé qgisfunction
(fonction AND au niveau du bit - car il n'existe pas encore de telle fonction) ressemble à ceci:
from qgis.utils import qgsfunction
@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
return value1 & value2
J'ai également essayé de l'enregistrer, via:
from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and)
Test de l'expression via:
expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
print(exp.parserErrorString())
(Donner 2=2
si toujours True
) fonctionne après l'enregistrement de la fonction et échoue sinon. Mais quand même, je ne peux pas utiliser l'expression dans une règle ...
En ce moment, le fichier contenant la fonction se trouve en haut dans mon dossier de projet, qui est automatiquement inclus dans PATH, n'est-ce pas?! (Selon Nathan Woodrow, le fichier peut être placé n'importe où dans PATH - voir https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).
MISE À JOUR: L' enregistrement de la fonction fonctionne jusqu'à présent, avec le code ci-dessus - maintenant le problème réside dans la fonction elle-même ...
MISE À JOUR # 2:
Très étrange! Une fonction simple do_nothing
obtenant deux arguments fonctionne très bien dans mon code:
@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
return value1
Utiliser l'expression expString = 'do_nothing(2, 2) = 2'
MISE À JOUR # 3:
Le simple changement de do_nothing
en add_one
ne fonctionne plus:
@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
return value1 + 1
appeler via expString = 'add_one(2, 2) = 3'
. C'est pourquoi je pense que cela a quelque chose à voir avec le retour du type?!
~/.qgis2/python/expressions/
puis rechargez QGIS et la fonction est disponible dans la section générateur d'expression python@qgsfunction
fonction dans votre code, comme dans vous définissez la fonction dans le code. Vous pouvez ignorer leexpressions
dossier si vous créez votre propre script uniquement pour l'application principaledo_nothing
). Mais ma fonction d'originebitwise_and
ne fonctionne toujours pas. Maintenant, je pense qu'il a quelque chose à voir avec le type de retour de la fonction, puisquedo_nothing works
, maisadd_one
ne fait pas!Réponses:
J'ai finalement résolu le problème!
C'était vraiment un problème de type, car les valeurs d'entrée sont définies comme à l'
QVariant
intérieur@qgsfunction
. Donc, pour que mon code fonctionne, je devais d'abord les convertir en entiers. Apparemment, QGIS s'occupe lui-même des conversions de types ...La fonction ressemble à ceci maintenant:
Et si vous avez placé la fonction dans votre dossier de projet, n'oubliez pas de l'enregistrer d'abord:
la source