Comment accéder à un attribut d'entités supprimé (avant de valider)

13

J'ai une configuration de signal pour un événement de suppression d'entité sur une couche:

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

Lorsque j'essaie de récupérer un attribut de la fonctionnalité supprimée sur l'emplacement, une erreur StopIteration est levée (c'est-à-dire qu'il ne peut pas récupérer la fonctionnalité).

J'aurais pensé que je devrais encore pouvoir récupérer les attributs d'une entité supprimée avant que les modifications apportées à la couche ne soient validées? Sinon, je ne vois pas à quoi sert le paramètre 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]

Comment accéder aux attributs d'une entité supprimée (avant que les modifications apportées à la couche ne soient validées)?

Mat
la source
1
Il semble que les fonctionnalités supprimées ne soient stockées nulle part ... sauf dans la version d'origine de votre calque ... alors ... peut-être l'ouvrir deux fois, puis utiliser les deleteFeatureIds renvoyés par le tampon d'édition du calque que vous modifiez? J'ai seulement constaté que les changements de valeur d'attribut ou les changements de géométrie sont stockés ... les entités non supprimées (seuls leurs identificateurs de fonctionnalité sont ...)
snaileater
@snaileater La copie de la couche sera une opération coûteuse dans mon cas. Je vais essayer d'enregistrer les attributs des entités au fur et à mesure qu'ils sont sélectionnés et de les comparer à ceux qui restent une fois les modifications validées.
Matt
@Matt Peut-être que cette publication sur la liste de diffusion vous aidera: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Réponses:

5

Il y aurait deux moments où vous pouvez toujours obtenir des fonctionnalités à supprimer:

  1. Lorsque vous les supprimez dans une session d'édition mais que vous n'avez pas validé ou enregistré de modifications (c.-à-d. Vous pouvez toujours annuler).

    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. Juste avant que les fonctionnalités supprimées ne soient validées (c'est-à-dire que vous venez de cliquer sur le Save Layer Editsbouton ou que vous venez d'appeler 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
la source
C'est une bonne solution mais ne semble pas fonctionner pour les couches postGis. Il me semble qu'ils gèrent le tampon d'édition fondamentalement différent. J'obtiens une erreur d'arrêt d'itération même si le calque est toujours en mode édition. Y a-t-il des suggestions?
Jesse McMillan