Sto usando pyqgis all'interno di un'applicazione autonoma. Ora volevo creare un'espressione personalizzata da usare come filterExpression in regola di ruleBasedRendererV2
. (Ho provato il renderer con funzioni esistenti prima e tutto ha funzionato bene!)
Personalizzata qgisfunction
(funzione AND bit a bit - in quanto non esiste ancora una tale funzione) è simile alla seguente:
from qgis.utils import qgsfunction
@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
return value1 & value2
Ho anche provato a registrarlo tramite:
from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and)
Test dell'espressione tramite:
expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
print(exp.parserErrorString())
(Dare 2=2
così sempre True
) funziona dopo aver registrato la funzione, e in caso contrario fallisce. Tuttavia, non riesco a usare l'espressione all'interno di una regola ...
In questo momento, il file contenente la funzione si trova in cima alla mia cartella del progetto, che è automaticamente inclusa in PATH, vero ?! (Secondo Nathan Woodrow, il file può essere inserito ovunque nel PERCORSO - consultare https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).
AGGIORNAMENTO: La registrazione della funzione funziona finora, con il codice dall'alto - ora il problema sta nella funzione stessa ...
AGGIORNAMENTO # 2:
Molto strano! La semplice funzione che do_nothing
ottiene due argomenti funziona bene nel mio codice:
@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
return value1
Usando l'espressione expString = 'do_nothing(2, 2) = 2'
AGGIORNAMENTO # 3:
La semplice modifica di do_nothing
to add_one
non funziona più:
@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
return value1 + 1
chiamandolo via expString = 'add_one(2, 2) = 3'
. Ecco perché penso che abbia qualcosa a che fare con il tipo di ritorno ?!
@qgsfunction
funzione nel tuo codice, come nel definire la funzione nel codice. Puoi ignorare la expressions
cartella se stai creando il tuo script che è solo per l'app principale
do_nothing
). Ma la mia funzione originale bitwise_and
non funziona ancora. Ora, penso che abbia qualcosa a che fare con il tipo di ritorno della funzione, dal momento che do_nothing works
, ma add_one
non lo fa!
~/.qgis2/python/expressions/
quindi ricarica QGIS e la funzione è disponibile nella sezione builder di espressioni python