Як отримати доступ до атрибутів видалених функцій (перед вчиненням)


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]

Як я можу отримати доступ до атрибутів видаленої функції (до внесення змін до шару)?


1
Здається, що видалені функції не зберігаються ніде ... окрім оригінальної версії вашого шару ... так ... можливо, відкрийте її двічі та використовуйте deleteFeatureIds, повернуті буфером редагування шару, який ви змінюєте? Я лише виявив, що зміни значень атрибута або зміни геометрії зберігаються ... не видаляються функції (лише їх особливостіІдентифікатори є ...)
snaileater

@snaileater Копіювання шару буде дорогою операцією в моєму випадку. Я спробую записати атрибути функцій у міру їх вибору та порівняти їх із тими, що залишилися, коли зміни будуть здійснені.
Метт

@Matt Можливо, ця публікація у списку розсилки допоможе: list.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. Мені здається, вони керують буфером редагування принципово різними. Я отримую помилку ітерації зупинки, хоча шар все ще знаходиться в режимі редагування. Будь-які пропозиції є?
Джессі Макміллан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.