Как получить доступ к атрибутам удаленных объектов (до фиксации)

13

У меня есть настройка сигнала для события удаления объекта на слое:

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

Когда я пытаюсь получить атрибут из удаленной функции в слоте, выдается ошибка StopIteration (то есть он не может получить функцию).

Я бы подумал, что я все еще смогу получить атрибуты из удаленного объекта до того, как изменения в уровне будут зафиксированы? В противном случае я не вижу, что использовать параметр 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]

Как я могу получить доступ к атрибутам удаленного объекта (до того, как изменения в уровне будут зафиксированы)?

Matt
источник
1
Кажется, что удаленные объекты нигде не хранятся ... кроме как в исходной версии вашего слоя ... так что ... возможно, откройте его дважды, а затем используйте deleteFeatureIds, возвращенный буфером редактирования слоя, который вы изменяете? Я только обнаружил, что изменения значений атрибутов или изменений геометрии сохраняются ... не удаленные объекты (только их featureIds ...)
snaileater
@snaileater Копирование слоя будет дорогой операцией в моем случае. Я постараюсь записать атрибуты функций по мере их выбора и сравнить их с оставленными после внесения изменений.
Мэтт
@Matt Может быть, эта публикация в списке рассылки поможет: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Ответы:

5

Там будет два момента, когда вы все еще можете получить функции, которые должны быть удалены:

  1. Когда вы удаляете их в сеансе редактирования, но не сохраняете или не сохраняете изменения (т. Е. Вы все равно можете выполнить откат).

    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. Непосредственно перед фиксацией удаленных функций (т. Е. Вы только что нажали Save Layer Editsкнопку или только что позвонили 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 )
Герман Каррильо
источник
Это хорошее решение, но оно не работает для слоев postGis. Мне кажется, они обрабатывают буфер редактирования принципиально иначе. Я получаю ошибку остановки итерации, даже если слой все еще находится в режиме редактирования. Есть предложения?
Джесси Макмиллан