6 votos

Cómo iterar a través de las capas seleccionadas?

En QGis pulsando teclas mayús o ctrl un usuario puede seleccionar varias capas en la tabla de contenido. ¿Cómo puede una secuencia de comandos de python iterar a través de las capas seleccionadas?

Me gustaría esperar un iface.selectedLayers() pero me pueden encontrar iface.activeLayer() que devuelva sólo una capa.

4voto

alexis.kennedy Puntos 402

He añadido un QgsLegend::selectedLayers() de la unión a QgsLegendInterface en la rama master. Ahora usted puede hacer lo siguiente cuando utilice un actual maestro de la construcción (podría tener que esperar un día o dos, a menos que la compilación de ti mismo; no va a ser adaptado a QGIS 1.8):

# iface.legendInterface().selectedLayers(bool inDrawOrder)
# param inDrawOrder False returns QTreeWidget::selectedItems() order
#                   True returns render drawing order (Legend or Layer Order)
# returns list of selected QgsMapLayer(s), or empty list

from qgis.utils import iface
li = iface.legendInterface()
sl = li.selectedLayers(True)
for lyr in sl:
    print lyr.name()

1voto

El TOC se implementa como un QTreeView y pueden ser consultados directamente.

El modelo anexo a este punto de vista almacena el Nombre de Pantalla y la Fuente de la capa, sin embargo ninguno de estos puede ser invocado para ser único.

La mejor forma de manejar esta ambigüedad dependerá de su aplicación.

La siguiente es una aplicación que utiliza la capa de fuente para la referencia cruzada, considera que el primer golpe a ser la final, y se intercala un no-repetición de la lista de capas.

from PyQt4.QtGui import *
iface = qgis.utils.iface

layersTreeView = iface.mainWindow().findChild(QTreeView, "theMapLegend")
selectedIndexes = layersTreeView.selectedIndexes()

if len(selectedIndexes) == 0:
  selectedLayers = []
elif len(selectedIndexes) == 1:
  selectedLayers = [iface.activeLayer()]
else:
  layersModel = layersTreeView.model()
  allLayers = iface.legendInterface().layers()
  selectedLayers = []
  for modelIndex in selectedIndexes:
    itemData = layersModel.itemData(modelIndex)
    layerSource = itemData[3].toString()
    for layer in allLayers:
      if layer.source() == layerSource:
        if layer not in selectedLayers:
          selectedLayers.append(layer)
        break

Editar:

En otro pensamiento es posible conectar a iface.currentLayerChanged y el uso de esta señal para mantener la lista de capas ordenadas por cuando se ha seleccionado más recientemente.

Esta lista podría ser utilizado para eliminar la ambigüedad mencionada anteriormente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X