Ustawienie wartości domyślnej w polu QGIS

12

Chciałbym dodać w polu warstwy wartość domyślną. Mam na myśli to, że za każdym razem, gdy tworzona jest nowa funkcja, pole to byłoby automatycznie wypełniane wartością domyślną.

W moim przypadku wartością domyślną byłaby zmienna @ nazwa_pliku projektu (nazwa pliku projektu).

Nigdzie nie mogę znaleźć tej funkcji.

Pozdrowienia,

Egidi
źródło

Odpowiedzi:

8

Od QGIS 2.18 przejdź do właściwości warstwy / właściwości pola i ustaw wyrażenie ( @project_filenamew tym przypadku) jako wartość domyślną.

Wartości domyślne oparte na wyrażeniach

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

Matthias Kuhn
źródło
1
W C ++ API, jeśli się nie mylę, istnieje klasa QgsDefaultValue, która robi to programowo. Czy istnieje alternatywa dla Pythona?
shika-kun
Jeśli zadajesz to pytanie jako nowe, chętnie na nie odpowiem. Wyślij mi tylko przypomnienie tutaj;)
Matthias Kuhn
10

Możesz zdefiniować funkcję, która dodaje nazwę projektu jako atrybut i połączyć tę funkcję ze zdarzeniem, które dodaje funkcje. Możesz użyć następującego kodu, zmienić nazwę pola na dowolnie wybrane (użyłem Name) i wkleić je do konsoli Python . Teraz za każdym razem, gdy dodasz nową funkcję, w polu pojawi się nazwa bieżącego projektu:

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)

Wynik

Joseph
źródło
1
Czy musisz uruchamiać skrypt za każdym razem, gdy edytujesz warstwę, czy skrypt pozostaje przechowywany w projekcie qgis?
Vale
1
@Vale - Możesz zapisać skrypt jako makro, które będzie przechowywane w projekcie QGIS. Zmienię post, aby uwzględnić to =)
Joseph
1
Dlaczego musisz wybrać funkcje Joseph?
Germán Carrillo
3
Nie wydaje mi się, aby trzeba było zadawać kolejne pytania, ponieważ nakładałyby się one zbyt wiele. Jesteś naprawdę blisko. Sugeruję unikanie wybierania funkcji. To, co otrzymujesz jako parametr po uruchomieniu SYGNAŁU featureAdded, to tak naprawdę identyfikator funkcji. I to wszystko, czego potrzebujesz do dzwonienia changeAttributeValue. Do updatefunkcji potrzebujesz tylko 2 linii (używając nazw zmiennych): idx = layer.fieldNameIndex('Name')i layer.changeAttributeValue(featureAdded, idx, project_name).
Germán Carrillo
1
@ GermánCarrillo - To działało, wow takie proste! Dziękujemy za wspaniałą sugestię, kolego! Uczę się codziennie =)
Joseph