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=2così 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_nothingottiene 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_nothingto add_onenon 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 ?!
@qgsfunctionfunzione nel tuo codice, come nel definire la funzione nel codice. Puoi ignorare la expressionscartella se stai creando il tuo script che è solo per l'app principale
do_nothing). Ma la mia funzione originale bitwise_andnon 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_onenon lo fa!
~/.qgis2/python/expressions/quindi ricarica QGIS e la funzione è disponibile nella sezione builder di espressioni python