Cara mengakses atribut fitur yang dihapus (sebelum melakukan)

13

Saya memiliki pengaturan sinyal untuk acara penghapusan fitur pada layer:

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

Ketika saya mencoba dan mengambil atribut dari fitur yang dihapus pada slot, kesalahan StopIteration dilemparkan (yaitu tidak dapat mengambil fitur).

Saya pikir saya masih bisa mengambil atribut dari fitur yang dihapus sebelum perubahan pada layer dilakukan? Kalau tidak, saya tidak melihat apa yang menggunakan parameter 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]

Bagaimana saya bisa mengakses atribut fitur yang dihapus (sebelum perubahan pada layer dilakukan)?

Mat
sumber
1
Tampaknya fitur yang dihapus tidak disimpan di mana pun ... kecuali dalam versi asli layer Anda ... jadi ... mungkin buka dua kali dan kemudian gunakan deleteFeatureIds yang dikembalikan oleh buffer edit pada layer yang sedang Anda modifikasi? Saya hanya menemukan bahwa perubahan nilai atribut atau perubahan geometri disimpan ... bukan fitur yang dihapus (hanya fiturIdnya ...)
snaileater
@snaileater Menyalin layer akan menjadi operasi yang mahal dalam kasus saya. Saya akan mencoba dan mencatat atribut fitur ketika mereka dipilih dan membandingkannya dengan yang tersisa setelah perubahan dilakukan.
Matt
@Matt Mungkin posting ini di milis akan membantu: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Jawaban:

5

Akan ada dua momen di mana Anda masih bisa mendapatkan fitur yang akan dihapus:

  1. Ketika Anda menghapusnya dalam sesi edit tetapi belum melakukan atau menyimpan perubahan (yaitu, Anda masih bisa mengembalikan).

    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. Tepat sebelum fitur yang dihapus dilakukan (yaitu, Anda baru saja mengklik Save Layer Editstombol atau Anda baru saja menelepon 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 )
Germán Carrillo
sumber
Ini adalah solusi yang baik tetapi tampaknya tidak berfungsi untuk lapisan postGis. Sepertinya saya mereka menangani penyuntingan penyuntingan secara fundamental berbeda. Saya mendapatkan kesalahan iterasi berhenti meskipun lapisan masih dalam mode edit. Ada saran di sana?
Jesse McMillan