Buenos días de nuevo Rubén.
Vamos a ampliar un poco el comentario de nuestro compañero Paco para que
veas algunas cosas más que se pueden hacer en Kosmo.
Con el código que te envió Paco es posible actualizar un elemento
directamente en una capa, pero no permite deshacer los cambios y hace
efectivos tanto ese cambio como todos los cambios pendientes de
confirmar dentro de la misma capa.
Si quieres permitir deshacer los cambios introducidos por el usuario, y
obligar a que el usuario tenga que pulsar el botón "Salvar cambios" para
confirmar todos los cambios que haya realizado hasta el momento, debes
usar la clase UndoableCommand para que la acción del usuario entre
dentro del sistema de deshacer/rehacer. Te indico que cambios debes
introducir en el código de tu plugin para ello:
1) En el método execute, incluye al principio del mismo la línea siguiente:
reportNothingToUndoYet();
De esta forma evitas que al ejecutar el plugin se borre el histórico de
deshacer/rehacer (hay algunas operaciones que lo borran para indicar que
se trata de una acción que no puede deshacerse).
2) Antes de invocar tu formulario y modificar la feature seleccionada,
hazte una copia de la misma:
Feature clonedFeature = featSeleccionada.clone(true);
Usa este elemento clonado dentro del formulario, para evitar modificar
el original (ya sea de una feature nueva o actualizada, sobre todo para
el primer caso).
3) Por último, una vez tengas ya el elemento modificado, invoca un
UndoableCommand en tu plugin:
final List<Feature> featsToUpdate = new ArrayList<Feature>();
final List<Feature> featsSelectedToUpdate = new ArrayList<Feature>();
featsSelectedToUpdate.add(featSeleccionada); // El elemento que no hemos
modificado, el "original" antes de la ejecución
featsToUpdate.add(clonedFeature); // El elemento clonado, con los
cambios hechos en el formulario
execute(new UndoableCommand("Nombre descriptivo para el historial de
deshacer"){
public void execute() throws Exception {
selectionManager.unselectItems(affectedLayer);
if (!featsToUpdate.isEmpty()) {
miCapa.getFeatureCollectionWrapper().updateAll(featsToUpdate);
miCapa.getLayerManager().fireFeaturesChanged(featsToUpdate,
FeatureEventType.ATTRIBUTES_MODIFIED,
miCapa);
selectionManager.getFeatureSelection()
.selectItems(miCapa,
featsToUpdate);
}
}
public void unexecute() throws Exception {
selectionManager.unselectItems(affectedLayer);
if (!featsToUpdate.isEmpty()) {
miCapa.getFeatureCollectionWrapper().updateAll(featsSelectedToUpdate);
miCapa.getLayerManager().fireFeaturesChanged(featsSelectedToUpdate,
FeatureEventType.ATTRIBUTES_MODIFIED,
miCapa);
}
selectionManager.getFeatureSelection().selectItems(miCapa,
selectedFeatures);
}
});
Espero que te sirva. De todas formas intentaré añadir un ejemplo para
desarrollar algo parecido a lo que estás implementando en el manual de
extensiones de Kosmo en cuanto me sea posible ;).
Para cualquier duda, ya sabes donde encontrarnos.
Saludos,
Sergio Baños Calvo escribió:
Buenos días Ruben.
Si quieres enviar el log del error quizás te podamos dar una pista
sobre el problema.
Un cordial saludo,
Ruben Sanabrias escribió:
Gracias, Paco.
Esto resuelve mi problema... o casi.
Ahora me salta un error al hacer el commit en capas con BD postgis.
Pero no tiene pinta de estar relacionado con esto.
Gracias de nuevo, y un saludo. :)
El 23 de septiembre de 2008 7:51, Paco Abato <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> escribió:
Hola Rubén,
te falta algo parecido a esto para que el estado de la feature se
notifique:
FeatureCollection fc = tuLayer.getUltimateFeatureCollection();
fc.update(laFeatureModificada);
fc.commit();
Si además cambia la geometría del feature tienes que llamar a:
tuLayer.fireAppearanceChanged();
para que la vista se actualice.
Espero que eso resuelva tu problema. Un saludo.
Francisco Abato Helguera
Programador
Sistemas Abiertos de Información Geográfica, S.L. (SAIG S.L.)
Teléfono: +34 675 903 750
E-mail: [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
Ruben Sanabrias escribió:
Hola.
Estoy desarrollando un plugin para hacer una cosa bastante
sencilla, pero no
consigo que me salga.
Seguramente no estoy usando las clases adecuadas y agradecería
que alguien
me dijera cuales usar o qué parte del código de Kosmo debo
mirar que haga
algo parecido.
El plugin no es más que un formulario personalizado para
editar los
atributos de un elemento existente en una capa vectorial.
Funciona seleccionando el elemento y dando a un botón,
entonces sale una
pantallita con el valor actual de los atributos del elemento
seleccionado y
te permite cambiarlos.
Con elementos recien creados no me da problemas, porque acabas
de dibujar el
elemento (puntos en este caso) y si acto seguido edito los
atributos con mi
plugin y despues guardo la capa, el elemento se añade a la
capa con sus
valores seleccionados.
El problema es cuando trato de editar los atributos de un
elemento que ya
existía. todo parece funcionar igual, pero Kosmo no se
"entera" de que el
elemento ha cambiado y por tanto no se activa el botón de
"guardar cambios".
Sospecho que con elementos nuevos funciona porque como acabo
de dibujarlos,
la propia herramienta de dibujo ya ha notificado de alguna
forma que hay un
elemento nuevo que debe ser guardado, y si antes de guardarlo
edito los
atributos con mi plugin, mis cambios se guardan con el elemento.
Resumo los pasos que hago y que utilizo (por si alguien me
sabe decir si lo
estoy haciendo mal o me falta algo):
1) Saco el elemento seleccionado con:
Feature f = (Feature)
context.getLayerViewPanel().getSelectionManager().
getFeatureSelection().getFeaturesWithSelectedItems().iterator().next();
De esto obtengo una instancia de un objeto que implementa
org.vividsolutions.jump.feature.Feature
2) Doy nuevo valor al atributo que cambia con:
f.setAttribute("nombreAtributo", "nuevoValor");
En la traza veo que el Feature toma el nuevo valor y continua
la ejecución
sin problemas, pero ocurre lo que ya he descrito, la
modificación es como si
no hubiera ocurrido y no se activa el botón de "salvar
cambios" (del panel
de herramientas de dibujo).
Agradecería cualquier ayuda que alguien me pudiera ofrecer.
Gracias. :)
_______________________________________________
Kosmo mailing list
[email protected] <mailto:[email protected]>
http://lists.saig.es/mailman/listinfo/kosmo
------------------------------------------------------------------------
_______________________________________________
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]
_______________________________________________
Kosmo mailing list
[email protected]
http://lists.saig.es/mailman/listinfo/kosmo