Come accedere agli attributi di una funzione eliminata (prima di eseguire il commit)


13

Ho un'impostazione del segnale per un evento di eliminazione di funzionalità su un livello:

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

Quando provo ad afferrare un attributo dalla funzione eliminata nello slot, viene generato un errore StopIteration (ovvero non è possibile recuperare la funzione).

Avrei pensato che avrei dovuto essere ancora in grado di recuperare gli attributi da una funzione eliminata prima che le modifiche al layer fossero impegnate? Altrimenti non vedo a che serve il parametro 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]

Come posso accedere agli attributi di una funzione eliminata (prima che vengano apportate le modifiche al livello)?


1
Sembra che le funzioni cancellate non vengano memorizzate in nessun posto ... tranne nella versione originale del tuo livello ... quindi ... forse aprilo due volte e quindi usa le DeleteFeatureIds restituite dal buffer di modifica del layer che stai modificando? Ho solo scoperto che le modifiche al valore dell'attributo o le modifiche alla geometria sono memorizzate ... funzioni non cancellate (solo le loro caratteristiche sono ...)
snaileater

@snaileater Copiare il layer sarà un'operazione costosa nel mio caso. Proverò a registrare gli attributi delle funzionalità man mano che vengono selezionati e li confronterò con quelli rimasti una volta che le modifiche sono state eseguite.
Matt,

@Matt Forse questo post nella mailing list ti aiuterà: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Risposte:


5

Ci sarebbero due momenti in cui è ancora possibile ottenere funzionalità che devono essere eliminate:

  1. Quando li elimini in una sessione di modifica ma non hai eseguito il commit o il salvataggio delle modifiche (ad esempio, puoi comunque eseguire il rollback).

    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. Subito prima che vengano commesse le funzionalità eliminate (ovvero, hai appena fatto clic sul Save Layer Editspulsante o hai appena chiamato 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 )

Questa è una buona soluzione ma non sembra funzionare per i livelli PostGis. Mi sembra che gestiscano il buffer di modifica in modo sostanzialmente diverso. Ottengo un errore di iterazione di arresto anche se il layer è ancora in modalità di modifica. Qualche suggerimento lì?
Jesse McMillan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.