Silinen özellikler niteliklerine nasıl erişilir (taahhütte bulunmadan önce)


13

Bir katman üzerinde bir özellik silme olayı için bir sinyal kurulumu var:

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

Yuvadaki silinen özellikten bir öznitelik yakalamaya çalıştığımda, bir StopIteration hatası atılır (yani özelliği alamaz).

Katmanda yapılan değişiklikler tamamlanmadan önce silinen bir özellikten özellikleri alabilmem gerektiğini düşünürdüm? Aksi takdirde fid parametresinin ne olduğunu göremiyorum.

def feature_deleted(self, fid):
    feature = self.layer.getFeatures(QgsFeatureRequest().setFilterFid(int(fid))).next()
    idx = self.layer.fieldNameIndex('my_attribute')
    print feature.attributes()[idx]

Silinmiş bir özelliğin özelliklerine nasıl erişebilirim (katmandaki değişiklikler yapılmadan önce)?


1
Görünüşe göre silinen özellikler, katmanınızın orijinal sürümü dışında hiçbir yerde saklanmıyor ... yani ... belki iki kez açıp değiştirdiğiniz katmanın düzenleme arabelleği tarafından döndürülen deletedFeatureIds'ı kullanıyor musunuz? Sadece özellik değeri değişikliklerinin veya geometri değişikliklerinin saklandığını gördüm ... silinen özellikler (sadece onların özellikleri ...)
snaileater

@snaileater Katmanın kopyalanması benim durumumda pahalı bir işlem olacak. Seçildikçe özelliklerin niteliklerini kaydetmeye çalışacağım ve değişiklikler yapıldıktan sonra bunları kalanlarla karşılaştıracağım.
Matt

@Matt Belki de posta listesindeki bu gönderi yardımcı olacaktır: lists.osgeo.org/pipermail/qgis-developer/2015-May/037823.html
eftas

Yanıtlar:


5

Silinecek özellikleri almaya devam edebileceğiniz iki an olacaktır:

  1. Bunları bir düzenleme oturumunda sildiğiniz, ancak değişiklikleri taahhüt etmediyseniz veya kaydetmediyseniz (yani, yine de geri alabilirsiniz).

    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. Silinen özellikler tamamlanmadan hemen önce (yani, sadece Save Layer Editsdüğmeyi tıkladınız veya yeni aradınız 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 )
    

Bu iyi bir çözüm ancak postGis katmanları için işe yaramıyor gibi görünüyor. Bana öyle geliyor ki düzenleme arabelleği temelde farklı. Katman hala düzenleme modunda olsa bile bir durdurma yineleme hatası alıyorum. Orada herhangi bir öneriniz var mı?
Jesse McMillan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.