Jak uzyskać dostęp do atrybutów usuniętych funkcji (przed zatwierdzeniem)

13

Mam konfigurację sygnału dla zdarzenia usuwania funkcji na warstwie:

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

Kiedy próbuję pobrać atrybut z usuniętej funkcji w gnieździe, generowany jest błąd StopIteration (tzn. Nie można pobrać funkcji).

Pomyślałbym, że nadal powinienem być w stanie odzyskać atrybuty z usuniętej operacji przed zatwierdzeniem zmian w warstwie? W przeciwnym razie nie widzę zastosowania parametru 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]

Jak mogę uzyskać dostęp do atrybutów usuniętej operacji (zanim zmiany w warstwie zostaną zatwierdzone)?

Matt
źródło
1
Wygląda na to, że usunięte funkcje nie są nigdzie przechowywane ... poza oryginalną wersją twojej warstwy ... więc ... może otwórz ją dwa razy, a następnie użyj metody deleteFeatureIds zwróconej przez bufor edycji warstwy, którą modyfikujesz? Odkryłem tylko, że zmiany wartości atrybutów lub zmiany geometrii są przechowywane ... nieusunięte obiekty (tylko ich cechy są ...)
snaileater
@snaileater Kopiowanie warstwy będzie w moim przypadku kosztowną operacją. Spróbuję nagrać atrybuty funkcji w miarę ich wybierania i porównać je z pozostałymi po zatwierdzeniu zmian.
Matt
@Matt Może ten post na liście mailowej pomoże: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Odpowiedzi:

5

Byłyby dwa momenty, w których nadal można uzyskać funkcje do usunięcia:

  1. Gdy usuniesz je w sesji edycji, ale nie zatwierdziłeś ani nie zapisałeś zmian (tzn. Nadal możesz przywrócić).

    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. Tuż przed zatwierdzeniem usuniętych funkcji (tj. Właśnie kliknąłeś Save Layer Editsprzycisk lub właśnie zadzwoniłeś 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
źródło
To dobre rozwiązanie, ale nie działa w przypadku warstw PostGis. Wydaje mi się, że zasadniczo zmieniają bufor edycji. Pojawia się błąd iteracji stopu, mimo że warstwa jest nadal w trybie edycji. Jakieś sugestie?
Jesse McMillan,