Bienvenidos al Blog de la Comunidad Argentina de GvSIG

La idea de esta Blog es reunir a los usuarios, desarrolladores, interesados y recursos en Argentina del Proyecto GvSIG

miércoles, 31 de agosto de 2016

Camino a gvSIG 2.3: Compatibilidad y cambios en scripts




En el post anterior sobre la nueva integración de las librerías de scripting con la API de gvSIG, comentamos que habíamos realizados cambios importantes en su enfoque a nivel interno pero que, el uso de estas librerías, se mantuviera en lo posible a lo anteriormente desarrollado.
Hemos tenido en cuenta que mucha gente tiene scripts antiguos realizados para la versión 2.2, así que esta nueva implementación es muy parecida a la antigua con algunas excepciones que comentaré más abajo.

¿Qué pasa si tengo un script desarrollado para la versión 2.2?

Una posible solución es activar la compatibilidad de scripts con la 2.2. Esto se puede hacer desde el Scripting Composer, abriendo nuestro script y navegando en la pestaña de Propiedades. Aquí podemos activar la casilla de Compatibilidad con la 2.2. De esta forma cuando gvSIG ejecute este script, utilizará las librerías antiguas de la versión 2.2 de gvSIG.
img22prop

¿Cuáles son los cambios para actualizar mi código?

La siguiente opción sería realizar las modificaciones necesarios para adaptarlo a la versión 2.3. Los cambios no son grandes, así que animo a que optéis por esta opción en vuestros scripts.
Los cambios son menores y voy a ir explicando los más significativos para que podáis localizarlos y modificarlos.
También será útil si venís de programar en la 2.2, veréis la nueva forma de hacer las cosas. Como ya he dicho, no os preocupéis, los cambios son pequeños.
Imports
* 2.2: En la anterior versión existían varias librerías como gvsig, geom, commonsdialog... a las cuales se les hacia referencia directamente con un import:
import gvsig
import geom 
import commonsdialog
* 2.3: En la nueva versión hemos querido desarrollar todo dentro de una librería única que fuera gvsig. Estos módulos siguen existiendo solo que su acceso de ha modificado, siendo:
import gvsig
import gvsig.geom
import gvsig.commonsdialog
Podemos importarlo de diferente forma para que se adapte mejor al script que ya tengamos hecho, dependiendo a cómo lo teníamos hecho, siendo las diferentes opciones por ejemplo:
import gvsig.geom
ó
from gvsig import geom
ó
from gvsig.geom import *
Creación de capas: Tipo de geometrías
* 2.2: A la hora de crear capas, siempre tenemos que crear primero el esquema (FeatureType) de nuestra capa. En la anterior versión establecíamos qué tipo de geometría iba a utilizar la capa a la hora de generar la misma, por ejemplo, en el createShape().
* 2.3: En la nueva versión hemos simplificado este sistema. El tipo de geometría se establece solo en el esquema.
from gvsig import *
from gvsig.geom import *

def main(*args):

    fty = createFeatureType() #es lo mismo que createSchema()
    fty.append("GEOMETRY", "GEOMETRY")
    fty.get("GEOMETRY").setGeometryType(POINT, D2)
    shp = createShape(fty)
Las constantes POINT y D2 vienen de la librería geom.
Si los import fueran diferentes:
import gvsig
from gvsig import geom

def main(*args):

    fty = gvsig.createFeatureType()
    fty.append("GEOMETRY", "GEOMETRY")
    fty.get("GEOMETRY").setGeometryType(geom.POINT, geom.D2)
    shp = gvsig.createShape(fty)
Edición de entidades
* 2.2: En la versión anterior podíamos poder en edición una entidad directamente y modificarla. Por limitaciones en la nueva implementación esto no es posible ahora. Seguimos una aproximación más cercana a Java.
* 2.3: La forma de realizar una modificación en una capa y en sus entidades sería a través de una entidad editable que obtenemos de la entidad principal, y que luego actualizamos sobre el featureSet y no sobre la capa, como en la anterior versión:
from gvsig import *
from gvsig import geom

def main(*args):

    layer = currentLayer()
    features = layer.features()

    layer.edit() #Ponemos la capa en edición

    for i in features:
       c = i.getEditable() #Obtenemos una entidad editable
       c.set("NAME", "Modified_4") #Modifacmos la entidad
       #Actualizamos entidad sobre el featureSet
       features.update(c) 

    layer.commit() #Guardamos la capa
Crear una geometría de tipo punto
* 2.2: En la anterior versión utilizábamos para crear un punto la función createPoint(x, y)
* 2.3: Dadas las mejores en la librería de geometrías que hemos realizado, hemos modificado este método. Tenemos varias formas de llamarlo. Ambas se encuentran dentro del módulo gvsig.geom:
Una función que hemos incluido para imitar el comportamiento de la antigua:
p1 = geom.createPoint2D(x, y)
O la nueva que permite mayor versatilidad a la hora de generar puntos, teniendo que pasar como parámetro la dimensión de este punto:
p2 = geom.createPoint(geom.D2, x, y)
o una opción más genérica, en la cual primero crearíamos la geometría de punto vacía, y luego tendríamos que establecer sus coordenadas:
p3 = geom.createGeometry(geom.POINT)
p3.setX(x)
p3.setY(y)
Ambos obtienen como resultado un geometría de tipo punto de dimensiones 2D.
Valores devueltos por las funciones de commonsdialog
* 2.2: En la anterior versión, los objetos devueltos por la librería commonsdialog referentes a la obtención de rutas, se hacían excesivamente complicados, devolviendo arrays de java.io.File o similar.
* 2.3: En la nueva versión, hemos simplificado este retorno de valores. Si la multiseleción está establecida en False, devolverá un único String correspondiente a la ruta. Si la función no tiene parámetro multiselection o lo tiene establecido como True, devolverá una lista de String con las rutas correspondientes.
option = "OPEN_FILE"
fc = commonsdialog.filechooser(option, 
                                title="", 
                                initialPath=None, 
                                multiselection=False, 
                                filter = None, 
                                fileHidingEnabled=True, 
                                root=None)
print "filechooser:", fc
fc = commonsdialog.filechooser(option, 
                                title="", 
                                initialPath=None, 
                                multiselection=True, 
                                filter = None, 
                                fileHidingEnabled=True, 
                                root=None)
print "filechooser:", fc
Salida por consola:
filechooser: C:\Users\Oscar\values.txt
filechooser: [u'C:\\Users\\Oscar\\input1.csv', u'C:\\Users\\Oscar\\input2.txt']
Si seguimos encontrando diferencias de compatibilidad las iremos añadiendo al post.
Dado que hay muchos cambios en las librerías y en funcionalidades, os animamos a que nos informéis de errores que detectéis en estas nuevas herramientas para Scripting en las Listas de Usuarios o Desarrolladores

No hay comentarios: