Cómo acceder a los atributos de características eliminadas (antes de confirmar)


13

Tengo una configuración de señal para un evento de eliminación de características en una capa:

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

Cuando intento obtener un atributo de la función eliminada en la ranura, se produce un error StopIteration (es decir, no puede recuperar la función).

¿Pensé que aún debería poder recuperar los atributos de una entidad eliminada antes de que se confirmen los cambios en la capa? De lo contrario, no veo para qué sirve el parámetro 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]

¿Cómo puedo acceder a los atributos de una entidad eliminada (antes de que se confirmen los cambios en la capa)?


1
Parece que las características eliminadas no se almacenan en ningún lugar ... excepto en la versión original de su capa ... así que ... ¿tal vez abrirlo dos veces y luego usar los DeleteFeatureIds devueltos por el búfer de edición de la capa que está modificando? Solo descubrí que los cambios en el valor del atributo o los cambios en la geometría se almacenan ... no se eliminan las características (solo sus características son ...)
snaileater

@snaileater Copiar la capa será una operación costosa en mi caso. Intentaré registrar los atributos de las características a medida que se seleccionen y compararlas con las que quedan una vez que se confirmen los cambios.
Matt

@Matt Quizás esta publicación en la lista de correo ayudará: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Respuestas:


5

Habría dos momentos en los que aún puede obtener funciones que se eliminarán:

  1. Cuando los elimina en una sesión de edición, pero no ha confirmado ni guardado los cambios (es decir, aún podría revertirlos).

    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. Justo antes de que se confirmen las funciones eliminadas (es decir, acaba de hacer clic en el Save Layer Editsbotón o acaba de llamar 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 )

Esta es una buena solución, pero no parece funcionar para las capas postGis. Me parece que manejan el búfer de edición fundamentalmente diferente. Me sale un error de detener la iteración a pesar de que la capa todavía está en modo de edición. ¿Alguna sugerencia allí?
Jesse McMillan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.