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=2
siempre 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_nothing
obtener 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_nothing
a add_one
ya 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?
fuente
~/.qgis2/python/expressions/
luego vuelva a cargar QGIS y la función está disponible en la sección del generador de expresiones python@qgsfunction
función en su código, ya que define la función en el código? Puede ignorar laexpressions
carpeta si está creando su propio script que es solo para la aplicación principaldo_nothing
). Pero mi función originalbitwise_and
todavía no funciona. Ahora, creo que tiene algo que ver con el tipo de retorno de la funcióndo_nothing works
, ¡peroadd_one
no lo tiene!Respuestas:
¡Finalmente resolví el problema!
Realmente fue un problema de tipo, ya que los valores de entrada se definen como
QVariant
dentro@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:
Y si tiene la función colocada en la carpeta de su proyecto, no olvide registrarla primero:
fuente