Cómo obtener los métodos de clase de PyQGIS en el código de un plugin con la función globals()

En el post anterior se consideró el caso de cómo obtener los métodos de clase de PyQGIS en el código de un plugin con un diccionario. El diccionario contenía sólo tres entradas y en vista de que existen más de 1200 clases de PyQGIS hay que escoger otra vía para tener a la disposición el mayor número de clases posibles.

La solución a este inconveniente es usar en el código python la función globals; la cual devuelve un diccionario con la tabla de símbolos globales actual (es decir, el objecto o clase a la que se haga referencia). Al hacer un dir a este tipo de objetos se devuelve una lista con todos los elementos disponibles en él. Por tanto, sólo se requiere eliminar el diccionario e implementar la función globals() con el mismo algoritmo. El único cambio es el uso de una sentencia try…except para manejar la excepción de cuando el nombre de la clase sea incorrecto o exista un espacio vacío.

El extracto del código propuesto en el plugin es el siguiente:

.
.
.
    def run(self):
        """Run method that performs all the real work"""

        text_search_class = self.dlg.lineEdit.text()
        text_search_line = self.dlg.lineEdit2.text()

        try:

            elements = getPat2(text_search_line, dir(globals()[text_search_class]))

            n = len(elements)

            message = str(n) + " elements of '" + text_search_line + "' in " + text_search_class + "\n\n" 

            for i in range(n - 1):
                message += elements[i] + ', '

            if n != 0:
                message += elements[n - 1]

            txtBox = self.dlg.textFeedback
            txtBox.setText(message)

        except KeyError:
            message = "The chosen class does not exist"
            txtBox = self.dlg.textFeedback
            txtBox.setText(message)

        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:
            # Do something useful here - delete the line containing pass and
            # substitute with your code.
            pass

Cuando probamos el plugin observamos que ahora tenemos acceso a mucho más que las clases que inicialmente se habían considerado en el diccionario: QgsVectorLayer, QgsRasterLayer y QLineEdit. Además, es posible acceder no sólo a métodos de clase de cada clase en ‘qgis.core’, ‘qgis.gui’, ‘qgis.utils’, ‘PyQt4.QtCore’ o ‘PyQt4.QtGui’, sino que, también podemos listar las clases presentes en ‘core’, ‘gui’, ‘utils’, ‘QtCore’ o ‘QtGui’.

En la imagen siguiente se tiene el despliegue de los elementos de clase en QgsFeature, QgsCoordinateReferenceSystem y QgsMapCanvas.

getpat3

En esta otra imagen filtramos por ‘zoom’ y ‘Zoom’ en QgsMapcanvas y por ‘set’ en QColor.

getpat4

Para finalizar, unos ejemplos donde para ‘qgis.gui’ se filtra por ‘Ramp’, ‘Band’ y ‘Table’:

get_pattern5

Esta entrada fue publicada en Plugin, PyQGIS, QGIS, Software Libre. Guarda el enlace permanente.

3 respuestas a Cómo obtener los métodos de clase de PyQGIS en el código de un plugin con la función globals()

  1. Pingback: Las clases QgsVectorGradientColorRampV2 y QgsVectorGradientColorRampV2Dialog de PyQGIS | El Blog de José Guerrero

  2. Pingback: Otros métodos para instanciar la clase QgsVectorGradientColorRampV2 | El Blog de José Guerrero

  3. Pingback: Newsletter Octubre 2015 | El Blog de José Guerrero

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s