Estou usando pyqgis em um aplicativo independente. Agora eu queria criar uma expressão personalizada para usar como filterExpression na regra de ruleBasedRendererV2. (Eu tentei o renderizador com funções existentes antes e tudo funcionou bem!)
Personalizado qgisfunction(função AND bit a bit - como ainda não existe essa função) se parece com isso:
from qgis.utils import qgsfunction
@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
return value1 & value2
Eu também tentei registrá-lo, via:
from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and)
Testando a expressão via:
expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
print(exp.parserErrorString())
(Dar 2=2sempre True) funciona após o registro da função e falha se não. Mas ainda assim, não posso usar a expressão dentro de uma regra ...
No momento, o arquivo que contém a função está no topo da pasta do meu projeto, que é automaticamente incluída no PATH, não é ?! (De acordo com Nathan Woodrow, o arquivo pode ser colocado em qualquer lugar do PATH - consulte https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).
ATUALIZAÇÃO: O registro da função funciona até agora, com o código acima - agora o problema está na própria função ...
ATUALIZAÇÃO # 2:
Muito estranho! Função simples, do_nothingobtendo dois argumentos, funciona bem no meu código:
@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
return value1
Usando expressão expString = 'do_nothing(2, 2) = 2'
ATUALIZAÇÃO # 3:
A simples mudança de do_nothingpara add_onenão funciona mais:
@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
return value1 + 1
chamando-o via expString = 'add_one(2, 2) = 3'. É por isso que acho que tem algo a ver com o tipo de retorno ?!
@qgsfunctionfunção no seu código, como define a função no código. Você pode pode ignorar a expressionspasta se você estiver fazendo o seu próprio script que é apenas para o aplicativo principal
do_nothing). Mas minha função original bitwise_andainda não funciona. Agora, acho que tem algo a ver com o tipo de retorno da função, pois do_nothing works, mas add_onenão tem!
~/.qgis2/python/expressions/QGIS, em seguida, recarregar e a função está disponível na seção Construtor de expressão python