การตั้งค่าเริ่มต้นในฟิลด์ QGIS


12

ฉันต้องการเพิ่มค่าเริ่มต้นในฟิลด์ของเลเยอร์ ฉันหมายความว่าทุกครั้งที่มีการสร้างคุณลักษณะใหม่ฟิลด์นั้นจะถูกเติมด้วยค่าเริ่มต้นโดยอัตโนมัติ

ในกรณีของฉันค่าเริ่มต้นจะเป็นตัวแปร @project_filename (ชื่อไฟล์ของโครงการ)

ฉันไม่พบฟังก์ชันการทำงานนี้ทุกที่

ความนับถือ,

คำตอบ:


8

ตั้งแต่ QGIS 2.18 ไปที่คุณสมบัติเลเยอร์ / คุณสมบัติเขตข้อมูลและตั้งค่าการแสดงออก ( @project_filenameในกรณีนี้) เป็นค่าเริ่มต้น

ค่าเริ่มต้นตามนิพจน์

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


1
ใน C ++ API ถ้าฉันไม่เข้าใจผิดมีคลาส QgsDefaultValue ที่จะทำโดยทางโปรแกรม มีทางเลือกหลามอีกไหม?
shika-kun

หากคุณถามคำถามนี้เป็นคำถามใหม่ฉันยินดีที่จะตอบ เพียงส่งคำเตือนมาที่นี่;)
แมทเธียสส์คุห์น


10

คุณสามารถกำหนดฟังก์ชั่นที่เพิ่มชื่อไฟล์โครงการเป็นคุณสมบัติและเชื่อมต่อฟังก์ชั่นนี้กับเหตุการณ์ที่เพิ่มคุณสมบัติ คุณสามารถใช้รหัสต่อไปนี้เปลี่ยนชื่อของสนามเพื่อสิ่งที่คุณเลือก (ผมใช้Name) และวางลงในคอนโซลหลาม ตอนนี้เมื่อใดก็ตามที่คุณเพิ่มคุณสมบัติใหม่ฟิลด์จะถูกเติมด้วยชื่อโครงการปัจจุบัน:

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)

ผลลัพธ์


1
คุณจำเป็นต้องเรียกใช้สคริปต์ทุกครั้งที่คุณแก้ไขเลเยอร์หรือสคริปต์ยังคงเก็บอยู่ในโครงการ qgis?
Vale

1
@Vale - คุณสามารถบันทึกสคริปต์เป็นแมโครซึ่งจะถูกเก็บไว้ในโครงการ QGIS ฉันจะแก้ไขโพสต์เพื่อรวมสิ่งนี้ =)
โจเซฟ

1
ทำไมคุณต้องเลือกคุณสมบัติของโจเซฟ?
Germán Carrillo

3
ฉันไม่คิดว่าจำเป็นต้องโพสต์คำถามอื่นเนื่องจากจะมีการทับซ้อนกันมากเกินไป คุณสนิทจริงๆ ฉันขอแนะนำให้คุณหลีกเลี่ยงการเลือกคุณสมบัติ สิ่งที่คุณได้รับเป็นพารามิเตอร์เมื่อสัญญาณfeatureAddedถูกเรียกจริง ๆ แล้วเป็นรหัสคุณลักษณะ changeAttributeValueและนั่นคือสิ่งที่คุณต้องการสำหรับการโทร เข้าสู่updateฟังก์ชั่นที่คุณก็จะต้องใช้เวลา 2 เส้น (โดยใช้ชื่อตัวแปรของคุณ): และidx = layer.fieldNameIndex('Name') layer.changeAttributeValue(featureAdded, idx, project_name)
Germán Carrillo

1
@ GermánCarrillo - นั่นใช้ได้ว้าวง่ายมาก! ขอบคุณสำหรับคำแนะนำที่ดี! ฉันเรียนรู้ทุกวัน =)
โจเซฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.