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

Responder a