Definindo um valor padrão em um campo QGIS


12

Eu gostaria de adicionar no campo de uma camada um valor padrão. Quero dizer, toda vez que um novo recurso é criado, esse campo é preenchido automaticamente com o valor padrão.

No meu caso, o valor padrão seria a variável @project_filename (nome do arquivo do projeto).

Não consigo encontrar essa funcionalidade em lugar algum.

Saudações,

Respostas:


8

Desde o QGIS 2.18, vá para as propriedades da camada / propriedades do campo e defina uma expressão ( @project_filenameneste caso) como o valor padrão.

Valores padrão baseados em expressão

https://www.qgis.org/en/site/forusers/visualchangelog218/index.html#feature-client-side-default-field-values


1
Na API C ++, se não me engano, há a classe QgsDefaultValue para fazer isso programaticamente. Existe python alternativa para isso?
Shika-kun

Se você fizer isso como uma nova pergunta, teremos prazer em responder. Envie-me um lembrete aqui;)
Matthias Kuhn


10

Você pode definir uma função que inclua o nome do arquivo do projeto como um atributo e conectar essa função ao evento que adiciona recursos. Você pode usar o código a seguir, alterar o nome do campo para o que você escolher (eu usei Name) e colá-lo no Console Python . Agora, sempre que você adicionar um novo recurso, o campo será preenchido com o nome do projeto atual:

import os

# Get project name
project = QgsProject.instance()
project_name = os.path.basename(project.fileName())

# Set active layer
layer = qgis.utils.iface.activeLayer()

# Define function to select added feature and add attribute to field "Name"
def update(featureAdded):
    idx = layer.fieldNameIndex('Name')
    layer.changeAttributeValue(featureAdded, idx, project_name)

# Connect "featureAdded" event to "select" function
layer.featureAdded.connect(update)

Resultado


1
Você precisa executar o script sempre que editar a camada ou o script permanecer armazenado no projeto qgis?
Vale

1
@Vale - Você pode salvar o script como uma macro que será armazenada no projeto QGIS. Vou editar o post para incluir esta =)
Joseph

1
Por que você precisa selecionar os recursos Joseph?
Germán Carrillo

3
Não acho que seja necessário postar outra pergunta, pois haveria muita sobreposição. Você está realmente perto. Eu sugiro que você evite selecionar recursos. O que você obtém como parâmetro quando o SIGNAL featureAddedé acionado é na verdade um ID de recurso. E é tudo o que você precisa para ligar changeAttributeValue. Para a updatefunção, você precisaria apenas de 2 linhas (usando os nomes das variáveis): idx = layer.fieldNameIndex('Name')e layer.changeAttributeValue(featureAdded, idx, project_name).
Germán Carrillo

1
@ GermánCarrillo - Isso funcionou, uau, tão simples! Obrigado por sua ótima sugestão, amigo! I aprender algo todos os dias =)
Joseph
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.