Registra qgsfunction personalizzata in pyqgis


9

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 ?!


1
Copia il tuo file ~/.qgis2/python/expressions/quindi ricarica QGIS e la funzione è disponibile nella sezione builder di espressioni python
ThomasG77,

Seguendo i tuoi consigli, la funzione appare nell'editor delle funzioni di QGIS e posso usarla come previsto. Ma quando provo ad usarlo nella mia applicazione standalone, la funzione non funziona! - Penso che, quando si avvia QGIS, in qualche modo registra tutti i file nella cartella delle espressioni, ma mi chiedo come ?!
Henhuy,

Stai usando la @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
Nathan W

Hai ragione - quando la registrazione della funzione funziona come descritto sopra (ad esempio 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!
Henhuy,

Risposte:


8

Finalmente ho risolto il problema!

Era davvero un problema di tipo, poiché i valori di input sono definiti come QVariantdentro @qgsfunction. Quindi, per far funzionare il mio codice ho dovuto prima convertirli in numeri interi. Apparentemente, QGIS si occupa delle conversioni di tipo stesso ...

La funzione è simile a questa ora:

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1.toInt()[0] & value2.toInt()[0]

E se hai la funzione inserita nella cartella del progetto, non dimenticare di registrarla prima:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.