Lors de l'itération sur une couche vectorielle avec pyqgis, comment puis-je vérifier si une entité est sélectionnée?

10

Lors de l'itération sur une couche vectorielle à l'aide du code suivant (résumé de l'exemple dans le livre de recettes pyqgis ), existe-t-il un moyen de vérifier si une fonction est sélectionnée?

provider = vlayer.dataProvider()
feat = QgsFeature()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
while provider.nextFeature(feat):
    geom = feat.geometry()
    attrs = feat.attributeMap()
    for (k,attr) in attrs.iteritems():
        print "%d: %s" % (k, attr.toString())

Alternativement, je pourrais créer une liste de fonctionnalités sélectionnées à l'aide vlayer.selectedFeatures(), mais j'espère qu'il existe un moyen de vérifier chaque fonctionnalité directement.

Cyrus
la source

Réponses:

8

Il ne semble pas y avoir de moyen de trouver directement le calque parent d'un objet d'entité ou s'il est sélectionné à partir d'une méthode de la classe QgsFeature.

Une approche similaire à vlayer.selectedFeatures()consiste à tester si le feat.id()est vlayer.selectedFeaturesIds(). Les QgsFeatureIds ne sont pas des valeurs uniques par rapport aux autres couches vectorielles, uniquement dans leur propre couche.

Alternativement, vous pouvez commencer par vlayer.selectedFeatures()et parcourir ces fonctionnalités, au lieu de toutes les fonctionnalités du fournisseur.

Une autre approche consiste à rassembler initialement des ensembles (ou des listes) d'ID d'entités sélectionnés et non sélectionnés pour une couche vectorielle donnée:

# previous relevant code

set_selids = set(vlayer.selectedFeaturesIds())
feat = QgsFeature()
vlayer.select([], QgsRectangle(), False)
set_allids = set()
while vlayer.nextFeature(feat):
    set_allids.add(feat.id())

set_notselids = set_allids - set_selids

print set_allids
print set_selids
print set_notselids

Je n'arrive pas à trouver un seul appel pour récupérer une référence à toutes les fonctionnalités (ou identifiants) pour une couche vectorielle (c'est-à-dire que je dois encore utiliser QgsVectorLayer.select()et itérer avec QgsVectorLayer.nextFeature()).

Modifier : le code mis à jour pour refléter QgsVectorLaer peut gérer l'appel sélectionné (pas besoin d'obtenir directement le fournisseur), et ne gâche pas les fonctionnalités sélectionnées dans le canevas de carte, qui nécessiterait setSelectedFeatures()une mise à jour.

Edit 2 : après avoir créé des ensembles d'ID d'entité, vous pouvez les parcourir et les utiliser QgsVectorLayer.featureAtId(featid)pour accéder à l'entité.

dakcarto
la source
Je soupçonnais que cela pourrait être le cas, mais merci beaucoup pour les suggestions utiles.
Cyrus