Buenos días.Tengo problemas para implementar el método refreshSelection en el
siguiente código:
public boolean execute(PlugInContext context) throws Exception {
//*************************************************************
//SELECCIONAR LOS ELEMENTOS DE LA CAPA DEL RECUADRO DE LA VISTA
//*************************************************************
//recuperamos el encuadre de la vista activa
Envelope encuadreActual =
context.getLayerViewPanel().getViewport().getEnvelopeInModelCoordinates();
//recuperamos la capa a partir de la selección del árbol
Layer selectedLayer = (Layer) context.getSelectedLayer(0);
//recuperamos los elementos que cruzan con el encuadre actual
List<Layerable> layersToFilter = new ArrayList<Layerable>();
layersToFilter.add(selectedLayer); Geometry fence =
EnvelopeUtil.toGeometry(encuadreActual); Map
layerToFeaturesInFenceMap =
context.getLayerViewPanel().layersToFeaturesInFenceMap(layersToFilter, fence);
//seleccionamos los elementos
refreshSelection(layerToFeaturesInFenceMap, context.getLayerViewPanel());
return true;}
Logger LOGGER = Logger.getLogger(CalculateSelectionPlugIn.class);boolean
wasShiftPressed;AbstractSelection selection;
public void refreshSelection( Map layerToFeaturesInFenceMap, LayerViewPanel
panel ) throws Exception { Layer[] layers = new
Layer[layerToFeaturesInFenceMap.keySet().size()];
layerToFeaturesInFenceMap.keySet().toArray(layers);
for( int i = 0; i < layers.length; i++ ) { Layer
layer = layers[i];
boolean originalPanelUpdatesEnabled = panel.getSelectionManager()
.arePanelUpdatesEnabled();
panel.getSelectionManager().setPanelUpdatesEnabled(false);
try { Collection featuresToSelect = (Collection)
layerToFeaturesInFenceMap.get(layer);
if (featuresToSelect == null) continue;
Collection featuresToUnselect =
selection.getFeaturesWithSelectedItems(layer);
featuresToUnselect.retainAll(featuresToSelect);
selection.selectItems(layer, featuresToSelect);
if (wasShiftPressed) {
selection.unselectItems(layer, featuresToUnselect); }
} finally {
panel.getSelectionManager().setPanelUpdatesEnabled(originalPanelUpdatesEnabled);
} }
panel.getSelectionManager().updatePanel();}
El proyecto compila sin problemas, pero a la hora de ejecutarlo en Kosmo me da
una excepción sin mensaje asociado (Null Pointer Exception):
java.lang.NullPointerException at
org.saig.jump.plugin.proyecto.HelloWorldPlugIn.refreshSelection(HelloWorldPlugIn.java:167)
at
org.saig.jump.plugin.proyecto.HelloWorldPlugIn.execute(HelloWorldPlugIn.java:116)
at
com.vividsolutions.jump.workbench.plugin.AbstractPlugIn$1.actionPerformed(AbstractPlugIn.java:151)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at
javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at
javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at
java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) at
java.awt.Component.processMouseEvent(Component.java:6263) at
javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at
java.awt.Component.processEvent(Component.java:6028) at
java.awt.Container.processEvent(Container.java:2041) at
java.awt.Component.dispatchEventImpl(Component.java:4630) at
java.awt.Container.dispatchEventImpl(Container.java:2099) at
java.awt.Component.dispatchEvent(Component.java:4460) at
java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at
java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at
java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at
java.awt.Container.dispatchEventImpl(Container.java:2085) at
java.awt.Window.dispatchEventImpl(Window.java:2478) at
java.awt.Component.dispatchEvent(Component.java:4460) at
java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Espero me puedan ayudar. Gracias de antemano y un saludo,Alex.
> Date: Mon, 7 Jun 2010 13:05:52 +0200
> From: [email protected]
> To: [email protected]
> Subject: Re: [Kosmo] Re: Consulta desarrollo
>
> Buenas Alex.
>
> Layer extiende AbstractLayerable (que a su vez implementa Layerable),
> por lo que solo tienes que hacer el casting adecuado para que funcione ;):
>
> Layer selectedLayer = (Layer)context.getSelectedLayer(0);
>
> .........
>
> List<Layerable> layersToFilter = new ArrayList<Layerable>();
> layersToFilter.add(selectedLayer);
> Geometry fence = EnvelopeUtil.toGeometry(encuadreActual);
> Map layerToFeaturesInFenceMap =
> context.getLayerViewPanel().layersToFeaturesInFenceMap(layersToFilter,
> fence);
>
> Saludos,
>
> Alex Mtz. de Agirre Escobar escribió:
> > Muchas gracias por la respuesta.
> > He seguido las instrucciones, y he llegado al código que se muestra a
> > continuación:
> >
> >
> > public boolean execute(PlugInContext context) throws Exception {
> > //******************
> > //MENSAJE DE DIALOGO
> > //******************
> > DialogFactory.showInformationDialog(context.getWorkbenchFrame(),
> > "Proyecto de exportación a dxf...",
> > "Diálogo de información");
> > //*************************************************************
> > //SELEECIONAR LOS ELEMENTOS DE LA CAPA DEL RECUADRO DE LA VISTA
> > //*************************************************************
> > //recuperamos el encuadre de la vista activa
> > Envelope encuadreActual =
> > context.getLayerViewPanel().getViewport().getEnvelopeInModelCoordinates();
> > //recuperamos la capa a partir de la selección del árbol
> > Layer selectedLayer = _context.getSelectedLayer(0)_; --> _ERROR:
> > "Type mismatch: cannot convert from Layerable to Layer"_
> >
> > //recuperamos los elementos que cruzan con el encuadre actual
> > List<Layer> layersToFilter = new ArrayList<Layer>();
> > layersToFilter.add(selectedLayer);
> > Geometry fence = EnvelopeUtil.toGeometry(encuadreActual);
> > Map layerToFeaturesInFenceMap =
> > context.getLayerViewPanel()._layersToFeaturesInFenceMap_(layersToFilter,
> > fence); --> _ERROR: "The method _
> > _layersToFeaturesInFenceMap(List<Layerable>, Geometry) in the type
> > LayerViewPanel is not applicable _
> > _for the arguments (List<Layer>, Geometry)"_
> >
> >
> > Espero que me puedan ayudar con estos 2 errores.
> > Gracias de nuevo, y un saludo,
> > Alex.
> >
> >
> >
> >
> > > Date: Mon, 7 Jun 2010 11:16:42 +0200
> > > From: [email protected]
> > > To: [email protected]
> > > Subject: [Kosmo] Re: Consulta desarrollo
> > >
> > > Buenos días Alex.
> > >
> > > Le comento una serie de puntos sobre la funcionalidad que quiere
> > > implementar:
> > >
> > > 1) En primer lugar, supondré que su herramienta será un PlugIn (es
> > > decir, que la clase implementa la interfaz PlugIn o extiende a
> > alguna de
> > > sus subclases, como AbstractPlugIn o ThreadedPlugIn).
> > >
> > > 2) En el método execute de dicha herramienta debe incluir el código que
> > > debe ejecutarse al pulsar el botón de la misma en la interfaz de
> > usuario
> > > (o, si la tarea que desea realizar es de "larga duración", deberá
> > > comprobarse en dicho método execute que se cumplen todas las
> > > precondiciones para la ejecución de la misma en el método run(),
> > > recuperando a su vez los datos que necesite).
> > >
> > > En este caso, lo primero que necesitará es recuperar el encuadre de la
> > > vista activa (no olvide incluir en el método getCheck() /
> > > createEnableCheck la comprobación de que debe existir una vista activa):
> > >
> > > Envelope encuadreActual =
> > >
> > context.getLayerViewPanel().getViewport().getEnvelopeInModelCoordinates();
> > >
> > > 3) Una vez obtenida dicha referencia, sería necesario recuperar de qué
> > > capa/s se van a seleccionar los elementos. Dependiendo de la
> > > funcionalidad que desea implementar, puede obtener la referencia
> > > directamente (si sabe de antemano de qué capa debe recuperarla), o, si
> > > es una herramienta válida para cualquier capa, puede obtener la
> > > referencia a la capa mediante la selección de la misma en el árbol
> > de capas:
> > >
> > > a) Referencia directa por nombre (sería recomendable incluir un chequeo
> > > de que la capa de nombre nombreDeMiCapa existe realmente):
> > >
> > > Layer selectedLayer = JUMPWorkbench.getLayer(nombreDeMiCapa);
> > >
> > > b) Recuperarla a partir de la selección del árbol (sería recomendable
> > > incluir un chequeo que compruebe que existe una capa vectorial y que
> > > está seleccionada en el árbol)
> > >
> > > Layer selectedLayer = context.getSelectedLayer(0);
> > >
> > > 4) Recuperamos los elementos que cruzan con el encuadre actual:
> > >
> > > List<Layer> layersToFilter = new ArrayList<Layer>();
> > > layersToFilter.add(selectedLayer);
> > > Geometry fence = EnvelopeUtil.toGeometry(encuadreActual);
> > > Map layerToFeaturesInFenceMap =
> > > context.getLayerViewPanel().layersToFeaturesInFenceMap(
> > > layersToFilter, fence);
> > >
> > > 5) Para seleccionar los elementos puedes consultar el método
> > > refreshSelection(layerToFeaturesInFenceMap,
> > context.getLayerViewPanel())
> > > del plugin CalculateSelectionPlugIn.
> > >
> > > Saludos,
> > >
> > >
> > > Alex Mtz. de Agirre Escobar escribió:
> > > > Buenos días!
> > > >
> > > > Estoy teniendo algunos problemas a la hora de implementar una
> > > > herramienta propia sobre Kosmo.
> > > >
> > > > El primer paso que debe realizar dicha herramienta es seleccionar los
> > > > elementos de la capa activa que se encuentren en la ventana de
> > > > visualización de Kosmo. Para ello, debo de llamar al evento que
> > > > realiza el botón de selección, y posteriormente seleccionar los
> > > > elementos que se encuentren dentro de las coordenadas de la
> > ventana de
> > > > visualización. De momento, me conformaría con lograr dicho
> > > > propósito. El error que tengo en mi código es que el constructor
> > > > /CalculateSelectionPlugIn/ no está definido.
> > > >
> > > > Si fuese posible, les agradecería que me ayudaran a solucionar dicho
> > > > contratiempo.
> > > >
> > > > Gracias de antemano,
> > > > Alex.
> > > >
> > > >
> > ------------------------------------------------------------------------
> > > > Eskura ezazu Windows Live Hotmail doanik, beti eskura edukiko duzun
> > > > posta elektronikoko zerbitzua. Erregistratu orain.
> > > > <https://signup.live.com/signup.aspx?id=60969>
> > >
> > > --
> > >
> > > Sergio Baños Calvo
> > >
> > > Jefe de desarrollos
> > > Sistemas Abiertos de Información Geográfica, S.L. (SAIG S.L.)
> > > Tlfno. móvil: 685005960
> > > Tlfno. fijo: (+34) 954788876
> > >
> > > E-mail: [email protected]
> > >
> >
> > ------------------------------------------------------------------------
> > Eskura ezazu Windows Live Hotmail doanik, beti eskura edukiko duzun
> > posta elektronikoko zerbitzua. Erregistratu orain.
> > <https://signup.live.com/signup.aspx?id=60969>
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Kosmo mailing list
> > [email protected]
> > http://lists.saig.es/mailman/listinfo/kosmo
> >
>
> --
>
> Sergio Baños Calvo
>
> Jefe de desarrollos
> Sistemas Abiertos de Información Geográfica, S.L. (SAIG S.L.)
> Tlfno. móvil: 685005960
> Tlfno. fijo: (+34) 954788876
>
> E-mail: [email protected]
>
_________________________________________________________________
Hotmail: konfiantzazko posta elektronikoa, egon babesturik nahi ez dituzun
mezuetatik.
https://signup.live.com/signup.aspx?id=60969_______________________________________________
Kosmo mailing list
[email protected]
http://lists.saig.es/mailman/listinfo/kosmo