[Gvsig_desarrolladores] Extensi髇 con scripting

Joaquin Jose del Cerro Murciano jjdelcerro en gvsig.org
Lun Oct 5 18:32:11 CEST 2015


El 28 de septiembre de 2015, 16:13, Alicia Duarte <duartealicia en yahoo.com.ar
> escribi贸:

> Hola a todos!!!
>> Estoy viendo el tema de generar una extensi贸n con scripting, que se
>> dispare desde una opci贸n de men煤.
>> Por lo que he investigado se necesita tener un config.xml donde se define
>> la entrada del men煤 y tambi茅n se indica acci贸n a ejecutar al seleccionarla.
>> Bas谩ndome en un ejemplo que hab铆a para versi贸n de gvSIG 1.x configur茅 de
>> esta manera el config.xml. Me agrega la entrada en el men煤 pero no me
>> reconoce el valor de "action-command".
>> Existe la manera de poder invocar al archivo .py y al .dlg desde el
>> config.xml en gvSIG 2.x?
>>
>> <?xml version="1.0" encoding="ISO-8859-1"?>
>> <plugin-config>
>>     <libraries
>> library-dir="../org.gvsig.scripting.app.extension/scripting"/>
>>     <depends plugin-name="org.gvsig.scripting.app.extension"/>
>>         <resourceBundle name="text"/>
>>     <extensions>
>>         <extension
>> class-name="org.gvsig.scripting.app.extension.ScriptingExtension"
>>
>>             description="Extensi贸n para el manejo de scripts en gvSIG"
>>
>>             active="true">
>>             <menu text="tools/Scripting/Centrar vista en un punto"
>>                 tooltip="Centrar la vista en un punto"
>>                 action-command =
>> "show(fileName='gvSIG/extensiones/centrarVistaSobreUnPunto/centrarVistaSobreUnPunto.xml',language='python',title='Centrar
>> la vista a un punto',width=210,height=86)"
>>                 icon="images/default.png"
>>                 position="55"
>>                 />
>>             <menu text="tools/Scripting/Borrar puntos"
>>                 tooltip="Borrar puntos"
>>                 action-command =
>> "run(fileName='gvSIG/extensiones/centrarVistaSobreUnPunto/limpiarElGraphics.py',language='python')"
>>
>>                 icon="images/default.png"
>>                 position="56"
>>                 />
>>         </extension>
>>     </extensions>
>> </plugin-config>
>>
>>
Hola Alicia,
perdona por tardar tanto en decir algo, pero estaba fuera y se me paso
por alto el correo.

En principio, lo que quieres hacer no funciona correctamente en gvSIG 2.
No se pueden asociar scripts a extensiones en el config.xml (bueno en
realidad
si se puede pero hay un error en el classpath y no creo que se arregle).

Ahora bien la forma de hacer lo que quieres seria otra.

Puedes crear un script que se llame "autorun". Este script se ejecutara al
arrancar gvSIG, y desde el puedes a帽adir botones a la barra de herramientas
o entradas a los menus y  asociarles scripts.

驴 Donde debes dejar este autorun ?
Pues puedes dejarlo en varias partes... puedes dejarlo en el raiz de los
scrips de usuario, eso seria lo mas simple... pero solo estaria disponible
para ese usuario.

A falta de poder generar paquetes con nuestros scripts para instalarlos
desde el administrador de complementos, podemos meter nuestros scripts
dentro de un plugin, y si ahi hay un "autorun" tambien se ejecutaria al
arrancar gvSIG.

Y la ventaja es que podriamos empaquetar el plugin con nuestros scripts para
poder instalarlos luego desde el administrador de complementos.

Ahora ire poniendo los detalles.

Vamos a crear un plugin que para el ejemplo he llamado
"com.acme.testplugin" :)
Para ello en la carpeta "gvSIG/extensiones" de la instalacion de gvSIG
crearemos
las carpetas y ficheros:

gvSIG/extensiones/com.acme.testplugin
gvSIG/extensiones/com.acme.testplugin/scripting
gvSIG/extensiones/com.acme.testplugin/scripting/lib
gvSIG/extensiones/com.acme.testplugin/scripting/scripts
gvSIG/extensiones/com.acme.testplugin/scripting/scripts/acme.png
gvSIG/extensiones/com.acme.testplugin/scripting/scripts/acme.inf
gvSIG/extensiones/com.acme.testplugin/scripting/scripts/acme.py
gvSIG/extensiones/com.acme.testplugin/scripting/scripts/autorun.inf
gvSIG/extensiones/com.acme.testplugin/scripting/scripts/autorun.py
gvSIG/extensiones/com.acme.testplugin/config.xml
gvSIG/extensiones/com.acme.testplugin/package.info

Voy contando que tendriamos en cada fichero.


En "acme.py" tendriamos el script que queremos ejecutar desde un boton u
opcion
de menu. En el caso de ejemplo es muy simple, pero eso ya lo puedes
complicar tu.

#---------------><----acme.py---><----------------

from commonsdialog import *

def main():
  msgbox("A.C.M.E. ..... Boom!!!!")

#---------------><-------------><----------------

El acme.png es la imagen que vamos a utilizar en la barra de botones y la
entrada de menu,
y el acme.inf se crea automaticamente al crear un script desde el composer.
Tendria algo como:

;---------------><---acme.inf---><----------------
[Unit]
name = acme
description =
createdBy =
version =

[Script]
main = main
Lang = python
;---------------><-------------><----------------

El "package.info" contiene los metadatos del plugin, y vendria a ser algo
como:

#---------------><---package.info----><----------------
#Tue Jun 02 11:21:02 CEST 2015
owner=ACME Inc
code=com.acme.testplugin
java-version=j1_7
official=false
type=plugin
version=2.0.100
state=final
operating-system=all
dependencies=required\: org.gvsig.scripting.app.extension -ge 2
sources-url=
web-url=
architecture=all
model-version=1.0.1
categories=
description=This a example plugin make using scripting
buildNumber=1
gvSIG-version=2.2.0
name=ACME
#---------------><-------------><----------------

El "config.xml", sigue siendo necesario, pero en una version minimalista:

<?xml version="1.0" encoding="ISO-8859-1"?>
<plugin-config>
  <libraries library-dir="lib"/>
  <depends plugin-name="org.gvsig.scripting.app.extension"/>
  <resourceBundle name="text"/>
  <extensions>
    <extension class-name="org.gvsig.andami.LibraryExtension"
      description=""
      active="true">
  </extensions>
</plugin-config>

El "autorun.inf", pues eso, parecido al "acme.inf":

;---------------><---autorun.inf---><----------------
[Unit]
name = autorun
description =
createdBy =
version =

[Script]
main = main
Lang = python
;---------------><-------------><----------------

Y donde esta el meollo es en el "autorun.py", pero ya le he puesto
comentarios y salvo el problema del bug en el addMenu, creo que
el resto se puede entender bastante bien.

#---------------><---autorun.py---><----------------
from gvsig import *

from commonsdialog import msgbox

from javax.swing import ImageIcon

from org.gvsig.andami import PluginsLocator
from org.gvsig.scripting.app.extension import ScriptingExtension
from org.gvsig.tools.swing.api import ToolsSwingLocator


from java.lang import Thread
class fixbug_addMenu(Thread):
  """
  Clase de utilidad para rodear un error que hay en la funcion addMenu
  al a帽adir entradas de menu a los menus de gvSIG.
  """
  def __init__(self, name, text):
    self.name = name
    self.text = text
    self.start()

  def run(self):
    from time import sleep
    from  org.gvsig.andami import PluginServices

    sleep(5)
    menu = PluginServices.getMainFrame().getComponentByName(self.name)
    menu.setText(self.text)


def main():
  application = ApplicationLocator.getManager()

  # Cargamos y registramos el icono en el tema de iconos
  iconurl = script.getResource("acme.png").toURL()
  iconimage = ImageIcon(iconurl)
  iconTheme = ToolsSwingLocator.getIconThemeManager().getCurrent()
  iconTheme.register("Scripting", "action", "tools-scripting-acme",
iconimage, iconurl)

  # Creamos la accion asociada a nuestro script
  actionManager = PluginsLocator.getActionInfoManager()
  action = actionManager.createAction(
      ScriptingExtension,
      "tools-scripting-acme",
      "A.C.M.E.",
      "acme", # Nombre del script
      "tools-scripting-acme",
      None,
      1009000000,
      "A.C.M.E. Inc."
  )
  # Registramos la accion
  action = actionManager.registerAction(action)

  # Cargamos en la barra de botones "acme" nuestro nuevo boton
  # asociado a nuestra accion
  application.addTool(action, "acme")

  # Y damos de alta una entrada de menu asociada a nuesta accion
  application.addMenu(action, "tools/Scripting/A.C.M.E.")

  # Esto es por que en gvSIG 2.2 hay un error en la funcion addMenu
  # y con esto lo rodeamos.
  fixbug_addMenu("tools-scripting-acme","A.C.M.E.")

  msgbox("A.C.M.E. Inc., instalada")

#---------------><-------------><----------------

Adjunto tambien el fichero "com.acme.testplugin.zip" con el plugin completo
(que
basicamente es lo que he incluido ya en el correo salvo el png).

Y lo unico que quedaria seria generar un paquete con esto.

Una vez ya tengas creado el plugin, puedes usar la opcion de menu:

  Herramientas/desarrollo/Crear paquetes de instalacion

Para crear el paquete.

Cuando lo aranques, selecciona tu plugin de la lista, y simplemente
dandole a siguiente te creara un paquete de instalacion para tu plugin
hecho enteramente usando scripting. Ten cuidado de no seleccionar la opcion
de "Habilitar modo avanzado", hay errores en ella y lo mas seguro es que
acabes
generando un paquete "chungo".

Cuando este disponible la opcion de empaquetar nuestros scripts desde el
mismo
composer, sera bastante mas simple todo esto ya que no precisaremos crear un
plugin para hacerlo.

Espero que te sirva, y si tienes dudas ya sabes pregunta por la lista, en
cuanto tenga un ratito contesto.

Un saludo
Joaquin







> Desde ya muchas gracias.
>> Saludos
>> Alicia Duarte - Argentina
>>
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en listserv.gva.es
> Para ver hist贸rico de mensajes, editar sus preferencias de usuario o darse
> de baja en esta lista, acuda a la siguiente direcci贸n:
> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>
>


-- 
--------------------------------------
Joaquin Jose del Cerro Murciano
Development and software arquitecture manager at gvSIG Team
jjdelcerro en gvsig.com
jjdelcerro en gvsig.org
gvSIG Association
www.gvsig.com
www.gvsig.org
------------ pr髕ima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20151005/4bf219c3/attachment.htm 
------------ pr髕ima parte ------------
Se ha borrado un mensaje que no est谩 en formato texto plano...
Nombre     : com.acme.testplugin.zip
Tipo       : application/zip
Tama帽o     : 4916 bytes
Descripci贸n: no disponible
Url        : http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20151005/4bf219c3/attachment.zip 


M醩 informaci髇 sobre la lista de distribuci髇 gvSIG_desarrolladores