Retour du nom de couche correct dans PyQGIS

Sep 28 2020

J'ai vu ce type de question posée à quelques reprises sur ce site. Les solutions que j'ai tirées de ces questions m'ont aidé. Mais je n'ai pas réussi à faire en sorte que mon script produise un résultat que j'aimerais.

J'ai une couche dans ma carte QGIS 3.10 appelée "warn" , le chemin et le nom du fichier sont "C: \ temp \ warn1.shp" . J'écris une boîte à outils pour effectuer une série de processus sur ce fichier "warn", avec l'intention que ce fichier soit appelé quelque chose de différent dans le futur.

Quelques exemples que j'ai utilisés:

  • Obtenir la couche par nom dans PyQGIS?
  • Activer la couche par son nom dans PyQGIS
  • Comment obtenir une couche par nom dans PyQGIS 3.0?

J'ai configuré les paramètres de la boîte à outils comme décrit dans le modèle QGIS:

self.addParameter(
            QgsProcessingParameterFeatureSource(
                'INPUT',
                self.tr('Area'),
                [QgsProcessing.TypeVectorPolygon]
            )
        )
    

J'appelle cette entrée dans le script principal:

Polygon = parameters['INPUT']

Lorsque j'essaie de confirmer le nom de l'entrée à l'aide d'une instruction d'impression, une valeur est renvoyée, mais le nom contient ce qui semble être un identifiant:

print (Polygon)

Retour:

warn1_940166d7_22bc_47bf_b76c_d75462802047

Lorsque j'utilise la variable Polygon dans la définition du calque:

layer = QgsProject.instance().mapLayersByName(Polygon)[0]

J'obtiens une "index out of range"erreur. Ce qui est attendu, car le nom n'existe pas dans la carte.

Comment puis-je renvoyer le nom du calque tel qu'il apparaît dans la vue des calques (Table des matières)?

Dans ce cas, je voudrais "avertir" retourné.

Réponses

3 J.Monticolo Sep 28 2020 at 19:14

J'ai réalisé cela par une petite solution de contournement:

from qgis.utils import iface  # add this in the list of imports
#
#
class My_model(QgsProcessingAlgorithm):

    def initAlgorithm(self, config=None):
        # ...

    def processAlgorithm(self, parameters, context, model_feedback):
        # ...
        lyr_list = iface.layerTreeView().layerTreeModel().rootGroup().layerOrder()
        lyr_dict = {lyr.id(): (lyr.name(), lyr) for lyr in lyr_list}
        if parameters['INPUT'] in lyr_dict:
                print(lyr_dict[parameters['INPUT']][0])
                polygon = lyr_dict[parameters['INPUT']][0]
                layer = lyr_dict[parameters['INPUT']][1]
1 Taras Sep 29 2020 at 12:30

@Keagan Allan a répondu à sa propre question

En utilisant la réponse acceptée, j'ai ajouté ce qui suit à mon code:

lyr_list = iface.layerTreeView().layerTreeModel().rootGroup().layerOrder()
lyr_dict = {lyr.id(): lyr.name() for lyr in lyr_list}
if parameters['INPUT'] in lyr_dict:
      print(lyr_dict[parameters['INPUT']])
      polygon = lyr_dict[parameters['INPUT']]
      layer = QgsProject.instance().mapLayersByName(polygon)[0]