viernes, 3 de marzo de 2017

Cambiando la capa activa en una Combo Box (PyQGIS)

Aunque existe un método directo y automático para seleccionar capas en la programación con PyQGIS, mediante el uso de un objeto QgsMapLayerComboBox, también es útil conocer cómo puede realizarse ésto empleando un objeto Qt representado por una QComboBox.



Ejecutando el código siguiente en la Python Console de QGIS; donde en el Map Canvas existen cuatro capas vectoriales cargadas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from qgis.PyQt.QtGui import QComboBox

comboBox = QComboBox()

layers = QgsMapLayerRegistry.instance().mapLayers().values()

layers_names = [ layer.name() for layer in layers ]

comboBox.addItems(layers_names)

comboBox.show()

se obtiene como resultado lo siguiente:


Al principio de la lista se encuentra una de las capas con el mismo nonbre de 'clipped_line' y se quiere seleccionar la denominada 'grid'. Hecha la selección, al ejecutar el código siguiente (equivalente a hacer click en el botón OK de un plugin):

1
2
3
4
>>>selectedLayerIndex = comboBox.currentIndex()
>>>selectedLayer = layers[selectedLayerIndex].name()
>>>selectedLayer
u'grid'

se observará que se imprime correctamente el nombre de la capa seleccionada (el método empleado de QgsVectorLayer fue precisamente 'name'). No obstante, como se sabe que la capa es de tipo polígono se puede, por ejemplo, averiguar cuál es el área de su primer feature (que es la misma para todos ellos porque es una rejilla) mediante el código siguiente:

1
2
3
4
5
6
>>>selectedLayer = layers[selectedLayerIndex]
>>>feats = [ feat for feat in selectedLayer.getFeatures() ]
>>>len(feats)
264
>>>feats[0].geometry().area()
25000000.0

En el plugin se tendría algo como esto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.
   .
   .
    def __init__(self, iface):
   .
   .
   .
        self.cb = QComboBox(self.dlg)
   .
   .
   .
        okBtn = self.dlg.okButton
        okBtn.connect(okBtn, SIGNAL("clicked()"), self.your_function)
   .
   .
   .
    def your_function(self):

        selectedLayerIndex = self.cb.currentIndex()
        selectedLayer = layers[selectedLayerIndex]

        #rest of your code
   .
   .
   .



No hay comentarios: