Browse By

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.

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.