lunes, 26 de febrero de 2018

Primer plugin funcional en QGIS3

Como es bien sabido por los usuarios de QGIS, el viernes 23/02/2018 fue liberada la versión 3 (Girona). No obstante, sólo ayer 25/02/2018 estuvo disponible para ser bajada de los servidores para el sistema operativo Windows.

Aunque esta versión fue muy esperada, era previsible una gran ansiedad adicional porque el cambio de Python 2.x a Python 3.x y de PyQt4 a PyQt5 hacía previsible que nuestros complementos ya desarrollados (plugins) dejasen de funcionar adecuadamente.

El temor no era infundado y básicamente había que diseñar una estrategia para abordar la magnitud del trabajo que se tiene por delante. Como estoy más del 90% de mi tiempo en el sistema operativo Linux, conozco que tener disponible simultáneamente las versiones 2 y 3 de QGIS en este sistema operativo es algo más difícil que en Windows. Por tanto, me decidí por este último para probar la versión 3 (que ya incluye GRASS 7.4); la cual bajé del link siguiente:

https://download.osgeo.org/qgis/windows/?C=M;O=D

Una vez instalada y ejecutada la aplicación, se puede corroborar adicionalmente que plugin builder y plugin reloader ya forman parte de la oferta inicial y sólo hay que habilitarlos. El QtDesigner también está incluido, así como la OSGeo Console, pero lo que si no pude ubicar fue el comando para compilar recursos (pyrcc5) por lo que me tocó hacerlo desde Linux. El aspecto general de la aplicación es la siguiente:


Lo primero que traté de hacer fue verificar la funcionalidad del plugin que desarrollé aquí para la versión previa (2.99) y seguía colgándose. Por tanto, me dispuse a probar con getPattern que es el que me permitiría averiguar los métodos de las diferentes clases de PyQGIS3 y PyQt5; tal como se desarrolló parcialmente aquí:

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

Aunque tal como está en el link anterior funciona, es más conveniente colocar el núcleo del algoritmo en un slot y programar el botón correspondiente. El código condensado del plugin sería el siguiente:

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
.
   .
   .
    def add_action(
        self,
        icon_path,
        text,
        callback,
        enabled_flag=True,
        add_to_menu=True,
        add_to_toolbar=True,
        status_tip=None,
        whats_this=None,
        parent=None):
        .
        .
        .

        okBtn = self.dlg.okButton
        okBtn.clicked.connect(self.getClasses)

        return action
        .
        .
        .

    def getClasses(self):

        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)

    def run(self):
       .
       .
       .

El plugin producido con 'Plugin Builder' fue compilado para recursos, desde Linux, en la ruta:

1
C:\Users\Usuario\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins

La ejecución del comando make, en Linux, dio como resultado la salida, sin errores, siguiente:

1
pyrcc5 -o resources.py resources.qrc

En la imagen a continuación se observa que el plugin funciona sin problemas. Se visualizan los recursos en QtCore donde ya no se dispone del método 'SIGNAL' (que anteriormente se usaba para conectar los slots con PyQt4).


En la imagen siguiente se observan los recursos disponibles en la clase QgsRasterLayer para PyQGIS3:


No hay comentarios: