Carregar funções definidas pelo usuário ao iniciar o QGIS
Outro dia estava ajudando a um colega na comunidade QGIS e ele estava com o seguinte problema:
Ele possuía uma função que removia acentos de uma string de texto, a função é essa aqui (cliquei aqui), e essa função estava sendo utilizada em um campo virtual e quando abria o projeto o campo aparecia apenas com valores nulos.
Investigando o problema
Iniciei alguns testes com a mesma função e percebi que o problema ocorria apenas para usuários do ®Windows, que a função não carregava durante a abertura do QGIS, sendo necessário fazer o reload da função sempre, gerando um transtorno para o usuário.
Durante os testes no Linux isso não ocorreu (😍).
Proposta de solução
Em conversa no grupo oficial no Telegram do QGIS (QGIS Community) a sugestão que surgiu foi a de criar um script que rode durante o início do programa e faça o registro da função.
Ao ler a documentação oficial do PyQGIS encontrei um tópico que mostra como criar um script que rode sempre que o programa for iniciado, e eu achei mais fácil a opção de criar um script startup.py
.
Script startup.py
Ao ser iniciado o QGIS procura por esse script na pasta home do usuário (varia de acordo com o sistema operacional), e o executa, uma outra forma de indicar esse arquivo é colocando o endereço dele na variável de ambiente PYQGIS_STARTUP
, mas achei mais fácil criar o script e colocar em uma pasta (por conta de pessoas menos experientes que queiram resolver o problema).
Dentro desse script colocaríamos um código que registre a função no QGIS durante o início, e assim não seria necessário fazer o reload da função sempre que necessário.
Documentação de onde colocar o script startup.py
clique aqui.
OBS: se optar por colocar o script na pasta indicada na documentação, o arquivo deve ser chamado startup.py
se optar por configurar a variável de ambiente, pode usar o nome que desejar.
Registrando funções
O PyQGIS nos permite fazer o registro de funções usando a classe QgsExpression
que é importada do qgis.core.
Essa classe possui um método chamado registerFunction
que recebe uma função no parâmetro obrigatório, caso a função seja registrada com sucesso, o retorno do método é True
.
Então podemos colocar dentro do script todas as funções que queremos que sejam registradas durante o início do QGIS, ou importar de outros lugares e fazer seu registro.
Mãos ao código
Primeiro precisamos fazer a importação de tudo o que for necessário para as nossas funções e para o registro.
from qgis.utils import qgsfunction
from qgis.core import *
from qgis.gui import *
Esses imports são os mesmos utilizados no exemplo do próprio QGIS para criação de funções para a calculadora de campo.
Podemos agora criar quantas funções nesse arquivo forem necessárias após elas vamos criar uma variável que vai receber uma lista com todas elas para fazer o registro.
@qgsfunction(args=’auto’, group=’Hebert Azevedo’)
def retira_acento(value1, feature, parent):
“””Função criada por Herbert Azevedo
https://groups.google.com/g/qgisbrasil/c/nzP3gfJo5KM
“””
listaa = ‘àáâãäèéêëìíîïòóôõöùúûüÀÁÂÃÄÈÉÊËÌÍÎÒÓÔÕÖÙÚÛÜçÇñÑ ‘
listab = ‘aaaaaeeeeiiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN ‘
k = 0
for caract in listaa:
value1 = value1.replace(caract, listab [k])
k += 1
return value1
functions_to_load = [retira_acento] #Lista com todas as funções criadas
Repare bem na linha 21, é criada uma lista com todas as funções que desejamos registrar.
E agora partimos para o registro das funções, criando uma função para isso:
def registerFunction():
for f in functions_to_load:
QgsExpression.registerFunction(f)
registerFunction()
Repare que na linha 24 é utilizado a classe QgsExpression
, isso é possível por conta do from qgis.core import *
feito na linha 2 no começo do script, na penúltima linha chamamos a função para executar o registro das funções.
Script final
O nosso script ficará da seguinte forma:
from qgis.utils import qgsfunction
from qgis.core import *
from qgis.gui import *
@qgsfunction(args=’auto’, group=’Hebert Azevedo’)
def retira_acento(value1, feature, parent):
“””Função criada por Herbert Azevedo
https://groups.google.com/g/qgisbrasil/c/nzP3gfJo5KM
“””
listaa = ‘àáâãäèéêëìíîïòóôõöùúûüÀÁÂÃÄÈÉÊËÌÍÎÒÓÔÕÖÙÚÛÜçÇñÑ ‘
listab = ‘aaaaaeeeeiiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN ‘
k = 0
for caract in listaa:
value1 = value1.replace(caract, listab [k])
k += 1
return value1
functions_to_load = [retira_acento] #Lista com todas as funções criadas
def registerFunction():
for f in functions_to_load:
QgsExpression.registerFunction(f)
registerFunction()
Observações finais
O código ajuda a resolver o problema de uso das funções criadas pelas pessoas que utilizam o QGIS sem precisar de fazer o reload da mesma sempre, principalmente para quem utiliza ®Windows.
E pode ser utilizado também para outras finalidades como fazer login de usuários em um banco, por exemplo.
Esse script está disponível no repositório Qgis, tips & tricks, clique aqui para acessar o script.
A extensão das funcionalidades do QGIS usando Python e PyQGIS são imensas.
Caso queira aprender mais sobe Python e PyQGIS aqui está um link sobre a criação de funções para a calculadora de campo Python + QGIS = Novas Funções.
Confira aqui também materiais relativos a Python e QGIS.
Caso queira começar a aprender programação recomendo dar uma olhadinha em Cursos de Programação.
Espero que tenha sido útil.
Até a próxima.