Cómo obtener los métodos de clase de PyQGIS en el código de un plugin con un diccionario

Cuando estamos en la Python Console de QGIS es muy fácil averiguar cuáles son los elementos de una clase particular en PyQGIS, siempre que se haya cargado el módulo respectivo, con un dir(PyQGIS_Clase). Sin embargo, dentro de le ejecución de un script ésto no funciona cuando le pasamos una variable de texto, por ejemplo ‘QgsRasterLayer,’ porque dir(‘QgsRasterLayer’) no produce el resultado esperado.

Algo que se nos podría ocurrir es la creación de una variable en tiempo de ejecución con ‘exec’ pero los expertos lo desaconsejan y sugieren más bien la creación de un diccionario; que es lo que se empleará en este post (aunque existe una sólución mejor que se considerará en otro artículo).

Averiguar los elementos de una clase de PyQGIS surge de la necesidad de acotar sus métodos para una determinada palabra clave. Por ejemplo, QgsMapCanvas tiene 584 elementos y aquellos que tienen ‘zoom’ y ‘Zoom’ en el nombre del método de clase son 11 y 3; respectivamente. Esto agiliza la búsqueda en cuanto a encontrar el método adecuado y su sintaxis correcta cuando estamos programando. En un post pasado ya se ha considerado está búsqueda con la función ‘getPat’ dentro de la Python Console. Ahora tocará hacerlo mediante un plugin.

Cuando se programa el plugin se considera, como primera aproximación, utilizar dos objetos de la clase QLineEdit para introducir el nombre de la clase y el texto a explorar dentro del nombre del método; respectivamente. Para la expresión de los resultados es adecuada una QTextBrowser. Como se ve más adelante en el extracto de código siguiente, se implementa un diccionario con sólo tres clases: QgsVectorLayer, QgsRasterLayer y QLineEdit. La desventaja de un diccionario es evidente si consideramos que existen más de 1200 clases en PyQGIS.

.
.
.
    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()

        dict = {'QgsVectorLayer' : dir(QgsVectorLayer) 
                'QgsRasterLayer' : dir(QgsRasterLayer),
                'QLineEdit'      : dir(QLineEdit)}

        if ( text_search_class in dict.keys() ) == True:

            idx = dict.keys().index(text_search_class)

            elements = getPat2(text_search_line, dict.values()[idx])

            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)

        else:
            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

No obstante estos inconvenientes, el plugin trabaja bien para las tres clases consideradas en el diccionario; tal como se observa en las imágenes siguientes:

getpat1

getpat2

La solución anterior se incluyó porque considera la manera de hacer una búsqueda dentro de un diccionario (también es válido para una lista) y recuperar el valor de su índice; si tal elemento existe. En el post siguiente se considerará una solución más general, concisa y sin el diccionario.

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

Una respuesta a Cómo obtener los métodos de clase de PyQGIS en el código de un plugin con un diccionario

  1. Pingback: Cómo obtener los métodos de clase de PyQGIS en el código de un plugin con la función globals() | 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