डिलीट की गई विशेषताओं को कैसे एक्सेस करें (कमिट करने से पहले)


13

मेरे पास एक परत पर एक सुविधा हटाने की घटना के लिए एक सिग्नल सेटअप है:

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

जब मैं स्लॉट पर हटाई गई विशेषता से एक विशेषता को आज़माता हूं और रोकता हूं, तो एक StopIteration त्रुटि डाली जाती है (यानी यह सुविधा पुनर्प्राप्त नहीं कर सकती है)।

मैंने सोचा होगा कि परत में परिवर्तन होने से पहले ही मुझे हटाए गए फीचर से विशेषताओं को पुनः प्राप्त करने में सक्षम होना चाहिए? अन्यथा मैं यह नहीं देखता कि फिड पैरामीटर का क्या उपयोग है।

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
ऐसा लगता है कि हटाए गए फीचर कहीं भी संग्रहीत नहीं किए गए हैं ... अपनी परत के मूल संस्करण को छोड़कर ... इसलिए ... हो सकता है कि इसे दो बार खोलें और फिर हटाए गए फ़ीचर का उपयोग करें । परत के संपादन बफ़र द्वारा लौटाए गए हैं क्या आप संशोधित कर रहे हैं? मैंने केवल पाया कि विशेषता मान परिवर्तन या ज्यामिति परिवर्तन संग्रहीत हैं ... हटाए गए फ़ीचर नहीं हैं (केवल उनकी विशेषताएँ हैं ...)
स्नाइलटर

@ स्नेलटर परत की नकल करना मेरे मामले में एक महंगा ऑपरेशन होगा। मैं कोशिश करूँगा और विशेषताओं के गुणों को रिकॉर्ड करूं क्योंकि वे चुने गए हैं और बदलाव होने के बाद उन्हें छोड़ दिया है।
मैट

@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 )
    

यह एक अच्छा समाधान है, लेकिन पोस्टगिस परतों के लिए काम नहीं करता है। यह मुझे प्रतीत होता है कि वे संपादन बफर को मौलिक रूप से अलग करते हैं। भले ही परत अभी भी संपादन मोड में है, मुझे स्टॉप इटरेशन त्रुटि मिलती है। कोई सुझाव वहाँ?
जेसी मैकमिलन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.