banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 20 March 2009 14:21

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Bonjour smile,

J'ai un souci avec la fonction removeLayer([id_layer]) de QGIS API.

Je souhaite enlever une couche à la fois du canevas et de la légende gauche mais cette dernière ne s'enlève que du canevas

Dans un projet vierge,  j'effectue les commandes suivantes:

Code:

>>>iface.addVectorLayer("monshape.shp","macouche","ogr")
<qgis.core.QgsVectorLayer object at 0x0382C6A8>

>>> QgsMapLayerRegistry.instance().mapLayers() 
{PyQt4.QtCore.QString(u'macouche20090320141313633'): <qgis.core.QgsVectorLayer object at 0x0382C6F0>}

>>> id = iface.getMapCanvas().currentLayer().getLayerID()
>>> id
macouche20090320141313633

>>> QgsMapLayerRegistry.instance().removeMapLayer(id)

>>> QgsMapLayerRegistry.instance().mapLayers()
{}

A la ligne

Code:

>>> QgsMapLayerRegistry.instance().removeMapLayer(id)

ma couche s'enlève bien du canevas...mais pas de la légende.
Au niveau registre, pas de souci: ma couche disparaît du registre...

Par contre, si je lance la commande

Code:

>>> QgsMapLayerRegistry.instance().removeAllMapLayers()

...mes couches s'enlèvent à la fois du canevas et de la légende...

Auriez-vous une idée du problème?
Je suis sous Metis: bug dû à la version?

Si quelqu'un peut m'aider...
smile


geodata au cerema et petits billets en géomatique

Hors ligne

 

#2 Mon 23 March 2009 09:51

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Bonjour,

N'y a t-il pas une fonction pour mettre à jour la légende ? Par exemple :

Code:

virtual void QgisInterface::refreshLegend      (      QgsMapLayer *        l       )        [pure virtual, slot]

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#3 Mon 23 March 2009 15:22

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Bonjour,

Merci pour la réponse smile

Dans le billet suivant, Martin Dobias écrit bien:

>>> QgsMapLayerRegistry.instance().removeMapLayer(id)
(layer is removed from legend and canvas)


La commande removeMapLayer devrait donc supprimer ma couche dans la légende.

Je crois que la fonction refreshlegend permet de rafraîchir la représentation, entre autres symbologique, des couches dans la légende. Je ne pense pas qu'elle permette de rafraîchir la légende en fonction des couches présentes dans le registre...

Cependant, comme dit précédemment lorssque j'applique

Code:

QgsMapLayerRegistry.instance().removeAllMapLayers()

Toutes me couches s'en vont...
Mais ce n'est pas ce que je souhaite comme je ne veux enlever que certaines couches déjà chargées...


geodata au cerema et petits billets en géomatique

Hors ligne

 

#4 Fri 27 March 2009 22:57

mathieu_r
Participant occasionnel
Date d'inscription: 17 Mar 2009
Messages: 21

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

bonjour,

Un utilisateur indique ici la même erreur:

(...)What I haven't been able to do is to update the legend after programmatically removing a raster layer. Anytime I remove a raster layer, the related legend entry remains there, no way to remove it.
If i try to remove it by invoking iface.refreshLegend(layer), an error rises, since the layer object has been already destroyed... this make sense, of course.(...)


Peut-être essayer avec la dernière version de QGIS?

Hors ligne

 

#5 Tue 21 June 2016 15:33

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Up... !

J'ai exactement le même problème... et toujours pas de solution.

Quelqu'un a-t-il réglé ce problème  ?

(je suis avec la version 2.8.9 Wien)

Hors ligne

 

#6 Tue 21 June 2016 19:00

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Bonsoir,

sur la version 2.14 il n'y a aucun problème.

La légende se met bien à jour une fois l'appel à la fonction removeMapLayer.

Dernière modification par lejedi76 (Tue 21 June 2016 19:02)

Hors ligne

 

#7 Wed 29 June 2016 09:33

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

hum... merci..

Mais pour l'usage en entreprise, c'est la version 2.8.9 qui est stable et donc, préférée d'utilisation... :s

Hors ligne

 

#8 Wed 29 June 2016 13:10

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3943

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Bonjour

Cerise45 a écrit:

hum... merci..

Mais pour l'usage en entreprise, c'est la version 2.8.9 qui est stable et donc, préférée d'utilisation... :s


Dans moins de deux semaines, elle devrait laisser officiellement la place à la 2.14. Ce n'est qu'une question d'officialisation sinon, la 2.14 est tout aussi bien maintenue (perso, je préfère ce terme à stable) que la 2.8 (qui ne recevra plus de correctifs)

Hors ligne

 

#9 Thu 30 June 2016 11:44

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Merci de l'info smile

Et effectivement, le terme de stable était assez mal choisi..

Hors ligne

 

#10 Thu 30 June 2016 14:24

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Une solution

Pour aide, je mets un petit bout de code simple qui permet de supprimer de la légende et du canevas de la carte 1 ou plusieurs layers, en les cherchant par leurs noms :

Code:

liste = ["Nom_de_la_couche1_a_suppr","Nom_de_la_couche2_a_suppr"]
for layer in self.iface.legendInterface().layers():
     if layer.name() in liste:
          QgsMapLayerRegistry.instance().removeMapLayer(layer.id())
     else:
          pass

J'espère que ça en aidera certains et certaines smile

Dernière modification par Cerise45 (Fri 01 July 2016 09:23)

Hors ligne

 

#11 Fri 01 July 2016 00:59

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

L'intention est bonne mais
évitez de poster des morceaux de codes sans explication et qui ne répondent pas à la question.
En effet, je ne suis pas sûr que de boucler sur les layers de legendInterface fasse fonctionner la fonction removeMapLayer.
En plus,
le code n'est pas très bien écrit (liste à l'intérieur de la boucle, emploi de list mot réservé dans python, ...) et surtout il y a des moyens plus efficient de supprimer des layers via une liste de nom.
Cordialement,

Dernière modification par lejedi76 (Fri 01 July 2016 08:08)

Hors ligne

 

#12 Fri 01 July 2016 09:18

Cerise45
Participant actif
Date d'inscription: 31 Aug 2011
Messages: 132

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

En bouclant sur legendInterface, le code fonctionne. Je ne vois pas comment faire autrement pour regarder les layers qui sont déjà chargés dans la table des matières.
Et je n'ai pas trouvé de moyens plus efficients de supprimer des layers via une liste de noms...

NB : j'ai modifié un peu le code suivant vos conseils

Dernière modification par Cerise45 (Fri 01 July 2016 09:26)

Hors ligne

 

#13 Fri 01 July 2016 20:19

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende

Bonsoir,

ce que je voulais dire c'est que ou bien removeMapLayer fonctionne ou bien ca ne fonctionne pas.
La fonction doit fonctionner indépendamment de votre boucle.

Bref un code plus propre serait :


Code:

registry = QgsMapLayerRegistry.instance()
liste = ["Nom_de_la_couche1_a_suppr","Nom_de_la_couche2_a_suppr"]
layers_to_delete = []
for name in liste:
  # la fonction mapLayrsByName renvoie une liste de layer correspondant aux nom donné
  # on concatène les listes
  layers_to_delete += registry.mapLayersByName(name)

#on supprimer la liste de layer
registry.removeMapLayers(layers_to_delete)

Dernière modification par lejedi76 (Fri 01 July 2016 20:25)

Hors ligne

 

Pied de page des forums

Powered by FluxBB