Hola Joaquín. 

Va adjunto gvSIG-environ.info y los demás dentro del zip, y el módulo de 
python. 
Uso la clase Toolkit para obtener el tamaño de la pantalla, lo pasé por alto. 
Instalé Java 8 de Oracle en Lubuntu 18.04 x64 y configuré la variable 
JAVA_HOME, verifiqué que fuera la versión utilizada por defecto por el sistema. 
Me da el mismo error. 

En éstos días intentaré con las demás sugerencias y les cuento. 

Muchas gracias. 
Saludos. 

De: "Joaquin Jose del Cerro Murciano" <jjdelce...@gvsig.org> 
Para: "gvsig desarrolladores" <gvsig_desarrolladores@listserv.gva.es> 
Enviados: Miércoles, 21 de Noviembre 2018 13:13:51 
Asunto: Re: [Gvsig_desarrolladores] Scripting - No toolkit found 



El mié., 21 nov. 2018 a las 16:12, Carlos Colombana (< ccolomb...@anep.edu.uy 
>) escribió: 



Hola. 

Con el siguiente método abro una ventana de ayuda desde scripting en gvsig 2.4: 

def launchHelpWindow(self): 
name = "OSMGeocoder" 
extension = ".html" 
locale = PluginsLocator.getLocaleManager().getCurrentLocale() 
tag = locale.getLanguage() 
helpPath = gvsig.getResource(__file__, "help", name + "_" + tag + extension) 
if not os.path.exists(helpPath): 
helpPath = gvsig.getResource(__file__, "help", name + "_en" + extension) 
helpUrl = "file:///" + helpPath.replace("\\", "/") 
webBrowserFactory = WebBrowserFactory() 
webBrowserPanel = webBrowserFactory.createWebBrowserPanel() 
webBrowserPanel.asJComponent().setPreferredSize(Dimension(int(self.screenSize.getWidth()
 / 4), int(self.screenSize.getHeight() / 2))) 
webBrowserPanel.setPage(helpUrl) 
self.mdiManager.showWindow(webBrowserPanel, self.helpTitle, 
WindowManager.MODE.DIALOG) 

En windows no tengo problema, pero en linux (fedora y ubuntu) me da el error de 
la captura adjunta. 
Probé con gvSIG 2.5 y sucede lo mismo. 




Para cerciorarme seria cuestion de ver el fichero "gvSIG-environ.info", pero yo 
diria que estas usando una JVM que no es la 1.8 de Oracle. 
Faltan los imports en el codigo que has puesto y no se de donde sale la clase 
WebBrowserFactory, pero si esta usando (como lo hace alguna en gvSIG) JavaFX 
para presentar el navegador, y no esta instalado falla con un error parecido a 
ese. Por defecto la JVM que se instala en Ubuntu no lleva javaFX. La JVM que 
lleva gvSIG es la de Oracle, con el JavaFX incluido y si usa esa deberia 
funcionar. 
Si van por ahi los tiros y no quieres tocar la instalacion podrias usar otro 
navegador que no requiera javafx, si no recuerdo mal algo como: 


from gvsig.libs.webbroser.browserpanel import BrowserPanel 

def main(*args): 
browser = BrowserPanel() 
browser.showWindow("Browser", scriptEditor=False) 
if len(args)>0: 
browser.setPage(args[0]) 

Prueba con varios motores de renderizado a ver si esta disponible alguno, 
(prueba con JavaFX, cssbox y por ultimo un JEditorPane), de forma que mas o 
menos "pelotero" pero al final suele acabar mostrando algo. 

A ver si te sirve de algo. 

Un saludo 
Joaquin 


BQ_BEGIN

Saludos. 
-- 
Carlos Colombana 
Tecnólogo en Cartografía 
ANEP - Departamento de Investigación y Estadística Educativa de CODICEN 
Río Negro 1308 piso 7 - Montevideo 
Tel. 2901 2825 Int. 23 

===================PRIVACIDAD DE ESTE MENSAJE=================== 
Este mensaje está dirigido exclusivamente a las personas que tienen las 
direcciones de correo electrónico especificadas en los destinatarios dentro de 
su encabezado. Si por error usted ha recibido este mensaje, por ningún motivo 
debe revelar su contenido, copiarlo, distribuirlo o utilizarlo. Le solicitamos 
por favor comunique el error a la dirección de correo electrónico remitente y 
elimine dicho mensaje junto con cualquier documento adjunto que pudiera 
contener. Los derechos de privacidad y confidencialidad de la información en 
este mensaje no deben perderse por el hecho de haberse trasmitido erróneamente 
o por causas de interferencias en el funcionamiento de los sistemas de correo y 
canales de comunicación. Los datos conten idos en este mensaje están protegidos 
por la Ley 18.331 Ley de Protección de Datos Personales y Acción de Habeas Data 
cuyo alcance puede encontrar en: 
https://www.datospersonales.gub.uy/inicio/normativa/nacional/leyes/ . Toda 
opinión que se expresa en este mensaje pertenece a la persona remitente por lo 
que no debe entenderse necesariamente como una opinión de ANEP y/o de las 
entidades que la integran, a menos que el remitente este autorizado para 
hacerlo o expresamente lo diga en el mismo mensaje. En consideración a que los 
mensajes enviados de manera electrónica pueden ser interceptados y manipulados, 
ANEP y las entidades que la integran no se hacen responsables si los mensajes 
llegan con demora respecto de la fecha de su envío por el remitente, 
incompletos, eliminados o con algún programa malicioso denominado como virus 
informático. 

_______________________________________________ 
gvSIG_desarrolladores mailing list 
gvSIG_desarrolladores@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: 
https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores 

BQ_END



-- 
-------------------------------------- 
Joaquin Jose del Cerro Murciano 
Development and software arquitecture manager at gvSIG Team 
jjdelce...@gvsig.com 
gvSIG Association 
www.gvsig.com 

_______________________________________________ 
gvSIG_desarrolladores mailing list 
gvSIG_desarrolladores@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: 
https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores 

-- 
Carlos Colombana 
Tecnólogo en Cartografía 
ANEP - Departamento de Investigación y Estadística Educativa de CODICEN 
Río Negro 1308 piso 7 - Montevideo 
Tel. 2901 2825 Int. 23 

===================PRIVACIDAD DE ESTE MENSAJE=================== Este mensaje 
esta dirigido exclusivamente a las personas que tienen las direcciones de 
correo electronico especificadas en los destinatarios dentro de su encabezado. 
Si por error usted ha recibido este mensaje, por ningun motivo debe revelar su 
contenido, copiarlo, distribuirlo o utilizarlo. Le solicitamos por favor 
comunique del error a la direccion de correo electronico remitente y elimine 
dicho mensaje junto con cualquier documento adjunto que pudiera contener. Los 
derechos de privacidad y confidencialidad de la informacion en este mensaje no 
deben perderse por el hecho de haberse trasmitido erroneamente o por causas de 
interferencias en el funcionamiento de los sistemas de correo y canales de 
comunicacion. Los datos contenidos en este mensaje estan protegidos por la Ley 
18.331 Ley de Proteccion de Datos Personales y Accion de Habeas
 Data cuy
 o alcance puede encontrar en: 
https://www.datospersonales.gub.uy/inicio/normativa/nacional/leyes/. Toda 
opinion que se expresa en este mensaje pertenece a la persona remitente por lo 
que no debe entenderse necesariamente como una opinion de ANEP y/o de las 
entidades que la integran, a menos que el remitente este autorizado para 
hacerlo o expresamente lo diga en el mismo mensaje. En consideracion a que los 
mensajes enviados de manera electronica pueden ser interceptados y manipulados, 
ANEP y las entidades que la integran no se hacen responsables si los mensajes 
llegan con demora respecto de la fecha de su envio por el remitente, 
incompletos, eliminados o con alg��un programa malicioso denominado como virus 
informatico.

# encoding: utf-8

# Version: 1.0.0-0
# Date: October 19, 2018
# License: GPLv3
# Country: Uruguay
# Organization: gvSIG Uruguay Community
# Developer: Carlos I. Colombana
# Contact: carlos.colomb...@gmail.com

import gvsig
import os
import ssl
import sys
import time

from geopy import geocoders
from gvsig import geom
from java.awt import Dimension
from java.awt import Toolkit
from java.beans import PropertyChangeEvent
from java.beans import PropertyChangeListener
from java.io import File
from java.text import SimpleDateFormat
from java.util import Date
from org.gvsig.andami import PluginsLocator
from org.gvsig.andami.ui.mdiManager import MDIManagerFactory
from org.gvsig.app import ApplicationLocator
from org.gvsig.app.project import DefaultProject
from org.gvsig.app.project import ProjectNotification
from org.gvsig.app.project.documents.table import TableDocument
from org.gvsig.app.project.documents.table import TableManager
from org.gvsig.fmap.dal.feature import FeatureStore
from org.gvsig.fmap.dal.feature import FeatureStoreNotification
from org.gvsig.fmap.dal.feature.impl import DefaultFeatureStore
from org.gvsig.tools import ToolsLocator
from org.gvsig.tools.dispose import DisposeUtils
from org.gvsig.tools.observer import Observer
from org.gvsig.tools.swing.api import ToolsSwingLocator
from org.gvsig.tools.swing.api.windowmanager import WindowManager
from org.gvsig.webbrowser import WebBrowserFactory

class OSMGeocoder(object):
    
    def __init__(self):
        self.i18nManager = ToolsLocator.getI18nManager()
        self.i18nManager.addResourceFamily("text", 
File(gvsig.getResource(__file__, "i18n")))
        self.title = self.i18nManager.getTranslation("_OSM_Title")
        self.helpTitle = self.i18nManager.getTranslation("_OSM_Help_title")
        self.mdiManager = MDIManagerFactory().createManager()
        self.screenSize = Toolkit.getDefaultToolkit().getScreenSize()
        self.panel = None
        self.stopState = True
    
    def getI18nManager(self):
        return self.i18nManager
    
    def getTitle(self):
        return self.title
    
    def getHelpTitle(self):
        return self.helpTitle
    
    def getMdiManager(self):
        return self.mdiManager
    
    def getScreenSize(self):
        return self.screenSize
    
    def getPanel(self): 
        return self.panel
    
    def setPanel(self, panel): 
        self.panel = panel
    
    def getStopState(self):
        return self.stopState
    
    def setStopState(self, stopState):
        self.stopState = stopState
    
    def initProjectObserver(self):
        project = gvsig.currentProject()
        self.addProjectObserver(project, self.panel)
    
    def initStoreObservers(self):
        tables = self.getTables()
        for table in tables: 
            store = table.getStore()
            self.addStoreObserver(store, self.panel)
    
    def initTableListeners(self):
        tables = self.getTables()
        for table in tables:
            self.addTableListener(table, self.panel)
    
    def getTables(self):
        inputTables = 
gvsig.currentProject().getDocuments("project.document.table")
        outputTables = list()
        for inputTable in inputTables:
            if inputTable.getStore().getProviderName() == "CSV":
                outputTables.append(inputTable)
        return outputTables
    
    def getFields(self, tableName):
        table = gvsig.currentProject().getTable(tableName)
        schema = table.getSchema()
        if schema != None:
            fields = list()
            for field in schema:
                if field.getDataTypeName() == "String":
                    fields.append(field.getName())
        else:
            fields = None
        return fields
    
    def addProjectObserver(self, project, panel):
        projectObserver = ProjectObserver(panel)
        project.deleteObservers()
        project.addObserver(projectObserver)
    
    def addStoreObserver(self, store, panel):
        storeObserver = StoreObserver(panel)
        store.deleteObservers()
        store.addObserver(storeObserver)
    
    def addTableListener(self, table, panel):
        tableListener = TableListener(panel)
        table.addPropertyChangeListener(tableListener)
    
    def launchHelpWindow(self):
        name = "OSMGeocoder"
        extension = ".html"
        locale = PluginsLocator.getLocaleManager().getCurrentLocale()
        tag = locale.getLanguage()
        helpPath = gvsig.getResource(__file__, "help", name + "_" + tag + 
extension)
        if not os.path.exists(helpPath):
            helpPath = gvsig.getResource(__file__, "help", name + "_en" + 
extension)
        helpUrl = "file:///" + helpPath.replace("\\", "/")
        webBrowserFactory = WebBrowserFactory()
        webBrowserPanel = webBrowserFactory.createWebBrowserPanel()
        
webBrowserPanel.asJComponent().setPreferredSize(Dimension(int(self.screenSize.getWidth()
 / 4), int(self.screenSize.getHeight() / 2)))
        webBrowserPanel.setPage(helpUrl)
        self.mdiManager.showWindow(webBrowserPanel, self.helpTitle, 
WindowManager.MODE.DIALOG)
    
    def findWindow(self, targetTitle):
        targetWindow = None
        windows = self.mdiManager.getAllWindows()
        length = len(windows)
        i = 0
        while i < length and targetWindow == None:
            title = windows[i].getWindowInfo().getTitle()
            if title == targetTitle:
                targetWindow = windows[i]
            i += 1
        return targetWindow
    
    def geocodeAddress(self, address):
        geometry = None
        message = ""
        try:
            ssl._create_default_https_context = ssl._create_unverified_context
            geocoder = geocoders.get_geocoder_for_service("nominatim")
            location = geocoder().geocode(address, timeout=10)
            if location != None:
                if location.address.split(',', 1)[0] == "None":
                    geometry = None
                else:
                    geometry = geom.createPoint(geom.D2, location.longitude, 
location.latitude)
        except:
            ex = sys.exc_info()[1]
            message = ex.__class__.__name__ + " - " + str(ex)
        if geometry == None and message == "":
            message = self.i18nManager.getTranslation("_OSM_Invalid_address")
        return geometry, message
    
    def geocodeAddresses(self, tableName, fieldName):
        pointsLayer = None
        errorsDBF = None
        ex = None
        table = gvsig.currentProject().getTable(tableName)
        tableSchema = table.getSchema()
        layerSchema = gvsig.createSchema(tableSchema)
        if layerSchema.get("GEOMETRY") != None:
            layerSchema.remove(layerSchema.getAttributeDescriptor("GEOMETRY"))
        for field in layerSchema:
            if field.getDataTypeName() == "String":
                layerSchema.get(field.getName()).setSize(200)
        locationField = "_" + self.i18nManager.getTranslation("_OSM_Location")
        if layerSchema.get(locationField) == None:
            layerSchema.append(locationField, "STRING", 30)
        layerSchema.append("GEOMETRY", "GEOMETRY")
        layerSchema.get("GEOMETRY").setGeometryType(geom.POINT, geom.D2)
        pointsLayer = gvsig.createShape(layerSchema)
        '''
        projection = gvsig.getCRS("EPSG:32721")
        pointsLayer.setProjection(projection)
        '''
        errorsSchema = gvsig.createSchema(tableSchema)
        for field in errorsSchema:
            if field.getDataTypeName() == "String":
                errorsSchema.get(field.getName()).setSize(200)
        messageField = "_" + self.i18nManager.getTranslation("_OSM_Message")
        if errorsSchema.get(messageField) == None:
            errorsSchema.append(messageField, "STRING", 200)
        errorsDBF = gvsig.createDBF(errorsSchema)
        i = 0
        iPoints = 0
        iErrors = 0
        fields = tableSchema.getAttrNames()
        features = table.features()
        try:
            maximum = features.getSize()
            self.panel.pgbMultipleSearch.setMaximum(maximum)
            self.panel.pgbMultipleSearch.setValue(i)
            self.panel.pgbMultipleSearch.setString(str(i) + " / " + 
str(maximum))
            self.panel.pgbMultipleSearch.setStringPainted(True)
            pointsLayer.edit()
            errorsDBF.edit(FeatureStore.MODE_APPEND)
            iterableFeatures = features.iterator()
            while iterableFeatures.hasNext() and not self.stopState:
                feature = iterableFeatures.next()
                address = feature.get(fieldName)
                geometry, message = self.geocodeAddress(address)
                if geometry != None:
                    newFeature = dict()
                    for field in tableSchema:
                        if field.getName() != "GEOMETRY":
                            if feature.get(field.getName()) != None:
                                if str(field.getDataTypeName()) != "Long":
                                    newFeature[field.getName()] = 
feature.get(field.getName())
                                else:
                                    newFeature[field.getName()] = 
long(feature.get(field.getName()))
                            else:
                                newFeature[field.getName()] = ""
                    newFeature[locationField] = str(geometry.getY()) + "," + 
str(geometry.getX())
                    newFeature["GEOMETRY"] = geometry
                    pointsLayer.append(newFeature)
                    iPoints += 1
                else:
                    newFeature = errorsDBF.createNewFeature()
                    for field in tableSchema:
                        if feature.get(field.getName()) != None:
                            newFeature.set(field.getName(), 
feature.get(field.getName()))
                    newFeature.set(messageField, message)
                    errorsDBF.insert(newFeature)
                    iErrors += 1
                i += 1
                self.panel.pgbMultipleSearch.setValue(i)
                self.panel.pgbMultipleSearch.setString(str(i) + " / " + 
str(maximum))
                self.panel.pgbMultipleSearch.setStringPainted(True)
                time.sleep(1)
            pointsLayer.commit()
            errorsDBF.commitChanges()
            if iPoints == 0:
                pointsLayer = None
            if iErrors == 0:
                errorsDBF = None
        except:
            ex = sys.exc_info()[1]
        finally:
            DisposeUtils.disposeQuietly(iterableFeatures)
            DisposeUtils.disposeQuietly(features)
        return pointsLayer, errorsDBF, ex
    
    def showResult(self, geometry, address):
        layerSchema = gvsig.createSchema()
        layerSchema.append("GEOMETRY", "GEOMETRY")
        layerSchema.get("GEOMETRY").setGeometryType(geom.POINT, geom.D2)
        pointLayer = gvsig.createShape(layerSchema)
        pointLayer.edit()
        pointLayer.append(GEOMETRY=geometry)
        pointLayer.commit()
        date = Date()
        dateFormat = SimpleDateFormat("yyyyMMdd_HHmmss")
        pointLayer.setName(address + " (" + dateFormat.format(date) + ")")
        project = gvsig.currentProject()
        view = project.getView(self.title)
        if view == None:
            view = project.createView(self.title)
        view.addLayer(pointLayer)
        view.getMapContext().getViewPort().setEnvelope(geometry.getEnvelope())
        view.showWindow()
    
    def loadResults(self, tableName, pointsLayer, errorsDBF):
        if self.stopState == 0:
            date = Date()
            dateFormat = SimpleDateFormat("yyyyMMdd_HHmmss")
            if errorsDBF != None:
                documentManager = TableManager()
                errorsTable = TableDocument(documentManager, errorsDBF)
                
errorsTable.setName(self.i18nManager.getTranslation("_OSM_Errors_table") + ": " 
+ tableName + " (" + dateFormat.format(date) + ")")
                gvsig.currentProject().addDocument(errorsTable)
                self.mdiManager.addCentredWindow(errorsTable.getMainWindow())
            if pointsLayer != None:
                pointsLayer.setName(tableName + " (" + dateFormat.format(date) 
+ ")")
                project = gvsig.currentProject()
                view = project.getView(self.title)
                if view == None:
                    view = project.createView(self.title)
                view.addLayer(pointsLayer)
                
view.getMapContext().getViewPort().setEnvelope(pointsLayer.getFullEnvelope())
                view.showWindow()
            self.setStopState(True)

class ProjectObserver(Observer):
    
    def __init__(self, panel):
        self.panel = panel
    
    def update(self, observable, notification):
        if isinstance(observable, DefaultProject):
            table = notification.getDocument()
            store = table.getStore()
            notificationType = notification.getNotificationType()
            if store.getProviderName() == "CSV" and (notificationType == 
ProjectNotification.AFTER_ADD_DOCUMENT or notificationType == 
ProjectNotification.AFTER_REMOVE_DOCUMENT):
                if notificationType == ProjectNotification.AFTER_ADD_DOCUMENT:
                    self.panel.getOSMGeocoder().addStoreObserver(store, 
self.panel)
                    self.panel.getOSMGeocoder().addTableListener(table, 
self.panel)
                if self.panel.getOSMGeocoder().getStopState() and 
self.panel.rdbMultipleSearch.isSelected():
                    self.panel.loadTables()

class StoreObserver(Observer):
    
    def __init__(self, panel):
        self.panel = panel
    
    def update(self, observable, notification):
        if isinstance(observable, DefaultFeatureStore):
            notificationType = notification.getType()
            if notificationType == FeatureStoreNotification.TRANSFORM_CHANGE:
                if self.panel.getOSMGeocoder().getStopState() and 
self.panel.rdbMultipleSearch.isSelected():
                    self.panel.loadTables()

class TableListener(PropertyChangeListener):
    
    def __init__(self, panel):
        self.panel = panel
    
    def propertyChange(self, event):
        if isinstance(event, PropertyChangeEvent):
            if self.panel.getOSMGeocoder().getStopState() and 
self.panel.rdbMultipleSearch.isSelected():
                self.panel.loadTables()

def main(*args):
    pass

<<attachment: gvSIG.zip>>

_______________________________________________
gvSIG_desarrolladores mailing list
gvSIG_desarrolladores@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: 
https://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores

Responder a