[GIS] Iterating over selected features in QGIS Processing

pyqgispythonqgissextantevector

I used to be able to iterate over selected features using the following script in v2.0.

import processing
features = processing.getfeatures(layer)
for feature in features:
  #Do whatever you need with the feature

However, this doesn't seem to work when I upgraded my QGIS to v2.2. Is there any new way on how to iterate selected vectors?

Best Answer

You can use the solutions given in Using processing algorithms from the console:

But if you look at what's in the module (version 2.2):

import processing
dir(processing)

no more getfeatures() or getFeatures()

You can control this with a little function adapted from Script de Python para filtrar por patrón de texto los métodos de Clases en PyQGIS de José Guerrero

import re
def get_patt(keyword, L):
    return [item for item in dir(L) if re.search(keyword,item)]
get_patt("getfeatures",processing)
[]
get_patt("getFeatures",processing)
[]

but there is:

get_patt("features",processing)
['features']

So the command is:

features = processing.features(layer)

But for me, it is easiest with:

without processing:

layer = qgis.utils.iface.activeLayer()

with processing:

layer = processing.getObject("name_of_the_layer")

All the features:

for feat in layer.getFeatures():
     geom= feat.geometry()
     attr =feat.attributes()

Selected features only:

for feat in layer.selectedFeatures():
     geom= feat.geometry()
     attr =feat.attributes()

and, for example, an "universal solution":

if layer.selectedFeatureCount():
     geom = [feat.geometry() for feat in layer.selectedFeatures()]
else:
     geom = [feat.geometry() for feat in layer.getFeatures()]