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.

This entry was posted in development, gvSIG Desktop, scripting, spanish. Bookmark the permalink.

6 Responses to Camino a gvSIG 2.3: Compatibilidad y cambios en scripts

  1. Pingback: Camino a gvSIG 2.3: Ejemplo de script con la nueva implementación | gvSIG blog

  2. Pingback: Camino a gvSIG 2.3: Insertar nuevos geoprocesos mediante Scripting | gvSIG blog

  3. Pingback: ¡gvSIG 2.3 ya está aquí! | gvSIG blog

  4. Pingback: gvSIG 2.3 is now available! | gvSIG blog

  5. Coscia says:

    Hola, en gvSIG 2.2 para obtener la cantidad de puntos de una geometría lo podía realizar de la siguiente manera. En caso de ser polígonos:
    num_ptos = geometria.toPoints().getNumPoints()
    y en caso de ser del tipo linea.
    num_ptos = geometria.getNumVertices()
    Como sería en gvSIG 2.3?, ya que no encuentro la operación getNumPoints() ni getNumVertices(). Gracias

    Además, notar que ahora el número del tipo de geometría cambió , antes una linea era del tipo 2 y un poligono del 8, mientras que ahora son 18 y 21 respectivamente
    Saludos

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s