So greifen Sie auf Attribute für gelöschte Features zu (vor dem Festschreiben)


13

Ich habe eine Signaleinrichtung für ein Feature-Löschereignis auf einer Ebene:

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

Wenn ich versuche, ein Attribut aus dem gelöschten Feature im Slot zu holen , wird ein StopIteration- Fehler ausgegeben (dh, das Feature kann nicht abgerufen werden).

Ich hätte gedacht, ich sollte immer noch in der Lage sein, Attribute von einem gelöschten Feature abzurufen, bevor die Änderungen an der Ebene festgeschrieben werden. Ansonsten sehe ich nicht, was der fid-Parameter verwendet.

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

Wie kann ich auf die Attribute eines gelöschten Features zugreifen (bevor die Änderungen an der Ebene übernommen werden)?


1
Es scheint, dass gelöschte Features nirgendwo gespeichert werden ... außer in der Originalversion Ihrer Ebene ... also ... öffnen Sie sie möglicherweise zweimal und verwenden Sie dann die gelöschten Funktions- IDs, die vom Bearbeitungspuffer der Ebene zurückgegeben wurden, die Sie bearbeiten ? Ich fand nur, dass Attributwertänderungen oder Geometrieänderungen gespeichert werden ... nicht gelöschte Features (nur deren Feature-IDs sind ...)
Schneckenfresser

@snaileater In meinem Fall ist das Kopieren der Ebene ein teurer Vorgang. Ich werde versuchen, die Attribute von Features bei ihrer Auswahl aufzuzeichnen und sie mit denen zu vergleichen, die nach dem Festschreiben der Änderungen noch vorhanden sind.
Matt

@Matt Vielleicht hilft dieser Beitrag in der Mailingliste: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Antworten:


5

Es würde zwei Momente geben, in denen Sie noch Features erhalten können, die gelöscht werden sollen:

  1. Wenn Sie sie in einer Editiersitzung löschen, aber keine Änderungen festgeschrieben oder gespeichert haben (dh, Sie könnten immer noch ein Rollback durchführen).

    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. Kurz bevor die gelöschten Funktionen festgeschrieben werden (dh Sie haben gerade auf die Save Layer EditsSchaltfläche geklickt oder gerade angerufen 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 )

Dies ist eine gute Lösung, scheint jedoch nicht für PostGis-Ebenen zu funktionieren. Mir scheint, sie behandeln den Bearbeitungspuffer grundlegend anders. Ich erhalte einen Fehler beim Stoppen der Iteration, obwohl sich die Ebene noch im Bearbeitungsmodus befindet. Irgendwelche Vorschläge da?
Jesse McMillan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.