วิธีเข้าถึงแอตทริบิวต์ที่ถูกลบ (ก่อนที่จะส่ง)


13

ฉันมีการตั้งค่าสัญญาณสำหรับเหตุการณ์การลบคุณสมบัติในเลเยอร์:

self.layer.featureDeleted.connect(self.feature_deleted)

เมื่อฉันพยายามคว้าคุณลักษณะจากคุณลักษณะที่ถูกลบในสล็อตข้อผิดพลาดStopIterationจะถูกส่งออกไป (นั่นคือไม่สามารถเรียกคืนคุณสมบัติ)

ฉันคิดว่าฉันควรจะยังคงสามารถดึงข้อมูลคุณลักษณะจากคุณลักษณะที่ถูกลบก่อนที่การเปลี่ยนแปลงในเลเยอร์จะเกิดขึ้นได้อย่างไร มิฉะนั้นฉันไม่เห็นสิ่งที่ใช้พารามิเตอร์ fid คือ

def feature_deleted(self, fid):
    feature = self.layer.getFeatures(QgsFeatureRequest().setFilterFid(int(fid))).next()
    idx = self.layer.fieldNameIndex('my_attribute')
    print feature.attributes()[idx]

ฉันจะเข้าถึงคุณลักษณะของคุณลักษณะที่ถูกลบได้ (ก่อนที่จะมีการเปลี่ยนแปลงในเลเยอร์)


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

@snaileater การคัดลอกเลเยอร์จะเป็นการดำเนินการที่แพงในกรณีของฉัน ฉันจะลองและบันทึกคุณสมบัติของคุณสมบัติตามที่เลือกไว้และเปรียบเทียบกับคุณลักษณะที่เหลือเมื่อทำการเปลี่ยนแปลง
แมตต์

@Matt บางทีการโพสต์ในรายชื่อผู้รับจดหมายอาจช่วยได้: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

คำตอบ:


5

จะมีสองช่วงเวลาที่คุณยังคงสามารถรับคุณลักษณะที่จะถูกลบ:

  1. เมื่อคุณลบพวกเขาในเซสชั่นการแก้ไข แต่ยังไม่ได้กระทำหรือบันทึกการเปลี่ยนแปลง (เช่นคุณยังคงสามารถย้อนกลับ)

    layer = iface.activeLayer()
    idx = layer.fieldNameIndex( 'my_attribute' )
    def feature_deleted( fid ):
        feature = layer.dataProvider().getFeatures( QgsFeatureRequest( fid ) ).next()
        print feature.id(), feature.attributes()[idx]
    
    layer.featureDeleted.connect( feature_deleted )
    
  2. ก่อนที่คุณสมบัติที่ถูกลบจะถูกส่งไป (เช่นคุณเพิ่งคลิกที่Save Layer Editsปุ่มหรือเพิ่งจะเรียกlayer.commitChanges())

    layer = iface.activeLayer()
    idx = layer.fieldNameIndex( 'my_attribute' )
    def features_deleted():
        if layer.editBuffer():
           ids = layer.editBuffer().deletedFeatureIds()
           for feature in layer.dataProvider().getFeatures( QgsFeatureRequest().setFilterFids( ids ) ):
               print feature.id(), feature.attributes()[idx]
    
    layer.beforeCommitChanges.connect( features_deleted )
    

นี่เป็นทางออกที่ดี แต่ดูเหมือนจะไม่ทำงานสำหรับเลเยอร์ postGis ดูเหมือนว่าพวกเขาจัดการบัฟเฟอร์การแก้ไขที่แตกต่างกันโดยพื้นฐาน ฉันพบข้อผิดพลาดการหยุดซ้ำแม้ว่าเลเยอร์จะยังอยู่ในโหมดแก้ไข มีคำแนะนำอะไรบ้าง?
Jesse McMillan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.