Pages: 1
- Sujet précédent - QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende - Sujet suivant
#1 Fri 20 March 2009 14:21
QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende
Bonjour ,
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...
geodata au cerema et petits billets en géomatique
Hors ligne
#2 Mon 23 March 2009 09:51
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
Re: QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende
Bonjour,
Merci pour la réponse
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
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
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
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
Pages: 1
- Sujet précédent - QGIS (QgsMapLayerRegistry:removeLayer): couche reste dans la légende - Sujet suivant