lunes, 29 de enero de 2018

Cómo manipular objetos QgsScaleComboBox con PyQGIS

En esta pregunta de gis.stackexchange.com se refiere un comportamiento extraño de los objetos del tipo QgsScaleComboBox en el sentido de que las escalas supuestamente añadidas no podían ser seleccionadas.

La modificación de la función para añadir escalas, tal como se presenta a continuación, para imprimir sólamente la variable que supuestamente estaba siendo usada para crear la nueva escala reveló que ésto no era así.

1
2
3
4
5
6
7
8
9
.
.
. 
    def addScale(self):
        newScale = (str(1. / self.wcbS.scale()))
        print newScale
.
.
.

El resultado que se visualizó en la Python Console, después de la ejecución de la función, fue el siguiente:

Python Console 
Use iface to access QGIS API interface or Type help(iface) for more info
1000000.0

De lo anterior se desprende que se trata de añadir un entero ya existente en una escala por default (correspondiente al item "1:1,000,000") a un string ("1:") y, posteriormente, incorporarlo a un objeto QgsScaleComboBox. Desafortunadamente, este error lógico aparentemente no parece producir un error en tiempo de ejecución pero si produce un comportamiento inesperado.

Por tanto, después de averiguar que el método para crear la escala era 'setScaleString', se modificó la función tal como se señala a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
.
.
. 
    def addScale(self):
        newScale = (str(1. / self.wcbS.scale()))
        print newScale
        print self.wcbS.setScaleString("1:750000")
        new_scale = self.wcbS.currentText()
        print new_scale
        self.wcbS.addItem(new_scale)
.
.
.

Luego de recargar el plugin y ejecutar el botón de añadir escalas, se puede observar al final del menú de persiana en la imagen siguiente que la escala "1:750,000" fue añadida efectivamente.


La función para borrar escalas se indica a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
.
.
. 
    def deleteScale(self):
        delitem = self.wcbS.currentIndex()
        print self.wcbS.currentText()
        self.wcbS.removeItem(delitem)
.
.
.

Después de seleccionado el item correspondiente a la escala recientemente creada ("1:750,000"), se puede observar en la imagen siguiente que la función se ejecuta satisfactoriamente, es decir, la elimina de la lista de escalas.


No hay comentarios: