Registre la función qgs personalizada en pyqgis

9

Estoy usando pyqgis dentro de una aplicación independiente. Ahora quería crear una expresión personalizada para usar como filterExpression en la regla de ruleBasedRendererV2. (¡Probé el procesador con funciones existentes antes y todo funcionó bien!)

Personalizado qgisfunction(función AND a nivel de bit, ya que aún no existe tal función) se ve así:

from qgis.utils import qgsfunction

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

También intenté registrarlo, a través de:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 

Probar la expresión a través de:

expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
    print(exp.parserErrorString())

(Dar 2=2siempre así True) funciona después de registrar la función, y falla si no. Pero aún así, no puedo usar la expresión dentro de una regla ...

En este momento, el archivo que contiene la función se encuentra en la parte superior de mi carpeta de proyecto, que se incluye automáticamente en PATH, ¿no? (Según Nathan Woodrow, el archivo se puede colocar en cualquier lugar de la RUTA; consulte https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).

ACTUALIZACIÓN: el registro de la función funciona hasta ahora, con el código de arriba; ahora el problema radica en la función misma ...

ACTUALIZACIÓN # 2:

¡Muy extraño! La función simple para do_nothingobtener dos argumentos funciona bien en mi código:

@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
    return value1

Usando expresión expString = 'do_nothing(2, 2) = 2'

ACTUALIZACIÓN # 3:

El simple cambio de do_nothinga add_oneya no funciona:

@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
    return value1 + 1

llamándolo a través de expString = 'add_one(2, 2) = 3'. ¿Es por eso que creo que tiene algo que ver con el tipo de retorno?

Henhuy
fuente
1
Copie su archivo y ~/.qgis2/python/expressions/luego vuelva a cargar QGIS y la función está disponible en la sección del generador de expresiones python
ThomasG77
Siguiendo su consejo, la función aparece en el editor de funciones QGIS y puedo usarla como se esperaba. Pero cuando intento usarlo en mi aplicación independiente, ¡la función no funciona! - Creo que, cuando se inicia QGIS, de alguna manera registra todos los archivos en la carpeta de expresión, pero me pregunto cómo.
Henhuy
¿Está utilizando la @qgsfunctionfunción en su código, ya que define la función en el código? Puede ignorar la expressionscarpeta si está creando su propio script que es solo para la aplicación principal
Nathan W
Tiene razón: cuando el registro de la función funciona como se describe anteriormente (por ejemplo do_nothing). Pero mi función original bitwise_andtodavía no funciona. Ahora, creo que tiene algo que ver con el tipo de retorno de la función do_nothing works, ¡pero add_oneno lo tiene!
Henhuy

Respuestas:

8

¡Finalmente resolví el problema!

Realmente fue un problema de tipo, ya que los valores de entrada se definen como QVariantdentro @qgsfunction. Entonces, para que mi código funcione, primero tuve que convertirlos en enteros. Aparentemente, QGIS se encarga de las conversiones de tipos en sí ...

La función se ve así ahora:

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

Y si tiene la función colocada en la carpeta de su proyecto, no olvide registrarla primero:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 
Henhuy
fuente