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)?


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 )

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.