<div dir="ltr"><div>Thanks for the tip Nathan!<br><br></div>I thought the while loop was necessary because we had to call QgsFeatureIterator.nextFeature() and just now realized that the for loop will do it implicitly. I thought that would work only for python iterators... I guess QgsFeatureIterator is one of them ;)<br>

<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jun 17, 2013 at 6:33 PM, Nathan Woodrow <span dir="ltr"><<a href="mailto:madmanwoo@gmail.com" target="_blank">madmanwoo@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> plugins<br>
MIME-Version: 1.0<br>
Content-Type: multipart/mixed; boundary="===============3430773931903739203=="<br>
<br>
--===============3430773931903739203==<br>
Content-Type: multipart/alternative; boundary=089e0102eaa65b15f904df59d6c1<br>
<br>
--089e0102eaa65b15f904df59d6c1<br>
Content-Type: text/plain; charset="utf-8"<br>
Content-Transfer-Encoding: 7bit<br>
<br>
You don't need go use a while, I don't know why people keep using that<br>
pattern when a simple for will do and is cleaner.<br>
<br>
For f in layer.getFeatures:<br>
<br>
No it just comes down to<br>
<br>
If selected:<br>
features = layers.selectedFeatures()[]<br>
Else:<br>
features = layer.getFeatures()<br>
From: Ricardo Filipe Soares Garcia da<br>
Sent: 17/06/2013 11:47 PM<br>
To: <a href="mailto:qgis-developer@lists.osgeo.org">qgis-developer@lists.osgeo.org</a><br>
Subject: [Qgis-developer] iteration over a layer's features in python<br>
plugins<br>
Hi list<br>
<br>
When building plugins that operate on vector layers, it is a common pattern<br>
to include a checkbox in the plugin's GUI where the user can choose to<br>
perform the plugin analysis on the whole layer or just using the currently<br>
selected features (see for example most fTools dialogs).<br>
<br>
However, I think the QGIS API does not make the implementation of this<br>
pattern as easy as it could be. The QgsVectorLayer.getFeatures() method<br>
returns an iterator but the QgsVectorLayer.selectedFeatures() returns a<br>
list. It would be nice if they both returned an iterator.<br>
<br>
When working with all the features in a layer, I  use:<br>
<br>
feat = QgsFeature()<br>
feat_iterator = v_layer.getFeatures()<br>
while feat_iterator.nextFeature(feat):<br>
    # do stuff with the feature<br>
<br>
When working with only the currently selected features the code is like:<br>
<br>
selected_feats = v_layer.selectedFeatures()<br>
for feat in selected_feats:<br>
    # do stuff with the feature<br>
<br>
Since QgsVectorLayer.getFeatures can take a QgsFeatureRequest as argument,<br>
I think a nice solution could be to add one more filter to<br>
QgsFeatureRequest to allow iterating over a list of feature ids. It<br>
currently already allows to pass in a single feature id, it would just be a<br>
matter of expanding that.<br>
<br>
In the meantime I am using a custom iterator class[1] in Python that wraps<br>
this different behaviour and lets me use the same logic for processing the<br>
whole layer or just the selected features. I think it would be cleaner if<br>
this could be done on the API side.<br>
<br>
Maybe I am asking for too much too late because of the feature freeze for<br>
2.0?<br>
<br>
<br>
[1] - (see the FeatureIterator class)<br>
<a href="https://github.com/ricardogsilva/coneforinputs/blob/master/coneforinputs.py" target="_blank">https://github.com/ricardogsilva/coneforinputs/blob/master/coneforinputs.py</a><br>
<br>
<br>
--<br>
___________________________ ___ __<br>
Ricardo Garcia Silva<br>
<br>
--089e0102eaa65b15f904df59d6c1<br>
Content-Type: text/html; charset="utf-8"<br>
Content-Transfer-Encoding: quoted-printable<br>
<br>
<html><head><meta content=3D"text/html; charset=3Dutf-8" http-equiv=3D"Cont=<br>
ent-Type"></head><body><div><div style=3D"font-family: Calibri,sans-serif; =<br>
font-size: 11pt;">You don't need go use a while, I don't know why people ke=<br>
ep using that pattern when a simple for will do and is cleaner.<br><br>For =<br>
f in layer.getFeatures:<br><br>No it just comes down to<br><br>If selected:=<br>
<br>&nbsp;&nbsp;&nbsp; features =3D layers.selectedFeatures()[]<br>Else:<br=<br>
>&nbsp;&nbsp;&nbsp; features =3D layer.getFeatures()<br></div></div><hr><sp=<br>
an style=3D"font-family: Tahoma,sans-serif; font-size: 10pt; font-weight: b=<br>
old;">From: </span><span style=3D"font-family: Tahoma,sans-serif; font-size=<br>
: 10pt;">Ricardo Filipe Soares Garcia da</span><br><span style=3D"font-fami=<br>
ly: Tahoma,sans-serif; font-size: 10pt; font-weight: bold;">Sent: </span><s=<br>
pan style=3D"font-family: Tahoma,sans-serif; font-size: 10pt;">17/06/2013 1=<br>
1:47 PM</span><br><span style=3D"font-family: Tahoma,sans-serif; font-size:=<br>
 10pt; font-weight: bold;">To: </span><span style=3D"font-family: Tahoma,sa=<br>
ns-serif; font-size: 10pt;"><a href="mailto:qgis-developer@lists.osgeo.org">qgis-developer@lists.osgeo.org</a></span><br><span =<br>
style=3D"font-family: Tahoma,sans-serif; font-size: 10pt; font-weight: bold=<br>
;">Subject: </span><span style=3D"font-family: Tahoma,sans-serif; font-size=<br>
: 10pt;">[Qgis-developer] iteration over a layer's features in python plugi=<br>
ns</span><br><br></body></html><div dir=3D"ltr">Hi list<div><br></div><div>=<br>
When building plugins that operate on vector layers, it is a common pattern=<br>
 to include a checkbox in the plugin&#39;s GUI where the user can choose to=<br>
 perform the plugin analysis on the whole layer or just using the currently=<br>
 selected features (see for example most fTools dialogs).</div><br>
<br>
<div><br></div><div>However, I think the QGIS API does not make the impleme=<br>
ntation of this pattern as easy as it could be. The QgsVectorLayer.getFeatu=<br>
res() method returns an iterator but the QgsVectorLayer.selectedFeatures() =<br>
returns a list. It would be nice if they both returned an iterator.=C2=A0</=<br>
div><br>
<br>
<div><br></div><div>When working with all the features in a layer, I =C2=A0=<br>
use:</div><div><br></div><div style>feat =3D QgsFeature()</div><div>feat_it=<br>
erator =3D v_layer.getFeatures()</div><div style>while feat_iterator.nextFe=<br>
ature(feat):</div><br>
<br>
<div style>=C2=A0 =C2=A0 # do stuff with the feature</div><div><br></div><d=<br>
iv style>When working with only the currently selected features the code is=<br>
 like:</div><div style><br></div><div style>selected_feats =3D v_layer.sele=<br>
ctedFeatures()</div><br>
<br>
<div style>for feat in selected_feats:</div><div style>=C2=A0 =C2=A0 # do s=<br>
tuff with the feature</div><div><div><br></div><div style>Since QgsVectorLa=<br>
yer.getFeatures can take a QgsFeatureRequest as argument, I think a nice so=<br>
lution could be to add one more filter to QgsFeatureRequest to allow iterat=<br>
ing over a list of feature ids. It currently already allows to pass in a si=<br>
ngle feature id, it would just be a matter of expanding that.</div><br>
<br>
<div style><br></div><div style>In the meantime I am using a custom iterato=<br>
r class[1] in Python that wraps this different behaviour and lets me use th=<br>
e same logic for processing the whole layer or just the selected features. =<br>
I think it would be cleaner if this could be done on the API side.</div><br>
<br>
<div style><br></div><div style>Maybe I am asking for too much too late bec=<br>
ause of the feature freeze for 2.0?</div><div style><br></div><div style><b=<br>
r></div><div style>[1] - (see the FeatureIterator class) <a href=3D"https:/=<br>
/<a href="http://github.com/ricardogsilva/coneforinputs/blob/master/coneforinputs.py" target="_blank">github.com/ricardogsilva/coneforinputs/blob/master/coneforinputs.py</a>">https=<br>
://<a href="http://github.com/ricardogsilva/coneforinputs/blob/master/coneforinputs.py" target="_blank">github.com/ricardogsilva/coneforinputs/blob/master/coneforinputs.py</a></a><=<br>
/div><br>
<br>
<div style><br></div><div style><br></div>-- <br>__________________________=<br>
_ ___ __<br>Ricardo Garcia Silva<br>
</div></div><br>
<br>
--089e0102eaa65b15f904df59d6c1--<br>
<br>
--===============3430773931903739203==<br>
Content-Type: text/plain; charset="us-ascii"<br>
MIME-Version: 1.0<br>
Content-Transfer-Encoding: 7bit<br>
Content-Disposition: inline<br>
<br>
_______________________________________________<br>
Qgis-developer mailing list<br>
<a href="mailto:Qgis-developer@lists.osgeo.org">Qgis-developer@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/qgis-developer" target="_blank">http://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
<br>
--===============3430773931903739203==--<br>
</blockquote></div><br><br clear="all"><br>-- <br>___________________________ ___ __<br>Ricardo Garcia Silva
</div>