Como acessar os atributos de recursos excluídos (antes de confirmar)

13

Eu tenho uma configuração de sinal para um evento de exclusão de recurso em uma camada:

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

Quando tento pegar um atributo do recurso excluído no slot, um erro StopIteration é gerado (ou seja, ele não pode recuperar o recurso).

Eu teria pensado que ainda deveria conseguir recuperar atributos de um recurso excluído antes que as alterações na camada sejam confirmadas? Caso contrário, não vejo o uso do 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]

Como acessar os atributos de um recurso excluído (antes que as alterações na camada sejam confirmadas)?

Matt
fonte
1
Parece que os recursos excluídos não são armazenados em nenhum lugar ... exceto na versão original da sua camada ... então ... talvez abra-o duas vezes e use os deleteFeatureIds retornados pelo buffer de edição da camada que você está modificando? Eu só descobri que as mudanças de valor atributo ou mudanças de geometria são armazenados ... não características eliminado (apenas os seus featureIds são ...)
snaileater
Copiar a camada será uma operação cara no meu caso. Tentarei gravar os atributos dos recursos à medida que forem selecionados e compará-los com os que restam depois que as alterações forem confirmadas.
Matt
@ Matt Talvez desta postagem na lista de discussão vai ajudar: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Respostas:

5

Existem dois momentos em que você ainda pode obter recursos que devem ser excluídos:

  1. Quando você os exclui em uma sessão de edição, mas não efetuou ou salvou alterações (ou seja, você ainda pode reverter).

    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. Logo antes dos recursos excluídos serem confirmados (ou seja, você acabou de clicar no Save Layer Editsbotão ou de ligar 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
fonte
Essa é uma boa solução, mas parece não funcionar para as camadas postGis. Parece-me que eles lidam com o buffer de edição fundamentalmente diferente. Eu recebo um erro de interrupção da iteração, mesmo que a camada ainda esteja no modo de edição. Alguma sugestão aí?
Jesse McMillan