Retour du nom de couche correct dans PyQGIS
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
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]
@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]