Josep, si más o menos he entendido bien, lo que necesitas sería imprimir N 
fichas y en cada una de ellas adjuntar los valores de texto y un bounding box 
de 
la geometría del registro.

A bote pronto, se me ocurre que te podría funcionar algo así:

- tu panel implementa LayerDrawingListener.
- la primera vez, al darle al botón de "imprimir": añade el listener y ejecuta 
el zoom más o menos como lo tienes (quitando fuera lo del listener).
- en el método afterGraphicLayerDraw ejecuta la función de impresión de 1 
reporte y si hay siguiente registro (si no es el último) haz zoom al siguiente.

Por poner pseudocódigo:

   void actionPerformed(Event e) {
     if(isPrintButtonClicked()){
       mapcontext.addLayerDrawingLister(this);
       zoom(nro_elemento);
     }
   }

   ...

   void zoom(nro_elemento){
     haz lo necesario para refrescar la vista en el elemento que toca
   }

   ...

   void afterGraphicLayerDraw(){
     printReport(nro_elemento);
     if(nro_elemento+1 < nro_total_elementos){
       zoom(nro_elemento +1);
     }
   }

La clave me parece ver que no necesitas el bucle que recorre los elementos, ya 
que hasta que refresque la vista no puedes imprimir. La función de impresión 
deberías hacerla en el afterGraphicLayerDraw. Puedes aprovechar ahí lanzar el 
siguiente evento (refrescando la vista con el zoom) y así tienes la 
funcionalidad del bucle.

Andrés

On 08/02/12 09:36, Josep Gimeno wrote:
> Hola de nuevo.
>
> Bueno, gracias por lo indicado pero no acabo de captar que es lo que está
> pasando...a ver si me dais alguna pista.
>
> Siguiendo lo que me habéis comentado, he implementado la interfaz
> LayerDrawingListener en mi clase (cuadro de diálogo) para escuchar los eventos
> de pintado de las capas.
>
> En el método zoomseleccion() he añadido el listener al mapContext.
>
>
>         private void zoomseleccion(){
>              if (selectable!=null){
>                  selectable.clearSelection();
>              }
>
>              FBitSet fBitSet = selectable.getSelection();
>              fBitSet.set(getSelectedRow());
>              selectable.setSelection(fBitSet);
>              SelectedZoomVisitor visitor = new SelectedZoomVisitor();
>              try {
>                  ((VectorialData)capaDatos).process(visitor);
>              } catch (ReadDriverException e) {
>                  // TODO Auto-generated catch block
>                  e.printStackTrace();
>              } catch (VisitorException e) {
>                  // TODO Auto-generated catch block
>                  e.printStackTrace();
>              }
>              Rectangle2D.Double r= (java.awt.geom.Rectangle2D.Double)
>     visitor.getSelectBound();
>              Point2D.Double pCenter = new
>     Point2D.Double(r.getCenterX(),r.getCenterY());
>
>              Double novah = r.height * 1.05;
>              Double novaw = r.width * 1.05;
>
>              r.setFrame(pCenter.getX()-(novaw/2.0), pCenter.getY() -
>     (novah/2.0), novaw, novah);
>
>              selectable.clearSelection();
>              MapContext mapcontext = 
> vistaActual.getMapControl().getMapContext();
>              mapcontext.addLayerDrawingListener(this);
>              mapcontext.getViewPort().setExtent(r);
>              mapcontext.getViewPort().refreshExtent();
>          }
>
>
> Lo que viene ahora no es muy académico pero es que creo que lo he probado 
> todo ya...
>
> En el evento afterGraphicLayerDraw  le doy valor a una variable auxiliar (de
> instancia) que me controlará el momento en que acaba de pintar la última capa.
>
> y en el bucle que me genera todas las fichas le meto un while que se repetirá
> hasta que la variable auxiliar cambie... el caso es que no cambia nunca, para
> que cambie he puesto un JOptionPane dentro del while.
>
>
>                      if(chckbxTodos.isSelected()){
>                          for(int i=0; i<comboBox.getItemCount(); i++){
>
>                                  comboBox.setSelectedIndex(i);
>                                  zoomseleccion();
>                                  while(aux!=1){
>                                      
> JOptionPane.showMessageDialog(null,"espera
>     un momento!");
>                                  }
>                                  openReport();
>                          }
>
>       PluginServices.getMDIManager().closeWindow(generaFichaPanel.this);
>                      }else{
>                          zoomseleccion();
>                          openReport();
>                      }
>
>
>
> Bueno, como podéis ver el tema de los hilos lo llevo un poco verde pero es que
> no se me ocurre nada... no creo que sea por abusar de las variables de 
> instancia no?
>
>
>
> 2012/2/7 Andrés Maneiro <amane...@icarto.es <mailto:amane...@icarto.es>>
>
>     El hilo que comenta Fran me parece que es éste:
>     
> http://osgeo-org.1560.n6.nabble.com/Get-image-from-view-problems-integrating-it-with-viewport-setExtent-td4175839.html
>
>     Al final de todo tienes un ejemplillo de cómo lo hicimos. A ver si te 
> ayuda
>     Josep.
>
>     Andrés
>
>     On 06/02/12 10:01, Francisco José Peñarrubia wrote:
>      > Hola Josep.
>      >
>      > El pintado de la vista se hace en un thread aparte, así que cuando 
> lanzas
>     todas
>      > las fichas, seguramente lo que te está pasando es que no le das tiempo 
> a
>     que la
>      > dibuje.
>      > Creo que en los correos anteriores ya se habló de esto, igual 
> encuentras ese
>      > mensaje.
>      >
>      > Más o menos de memoria, lo que tienes que hacer es dibujar la vista 
> con el
>      > mapContext, o meter algo que se espere hasta que reciba un evento de
>     pintado de
>      > la última capa. Yo suelo utilizar la capa de trackLayer (la de 
> gráficos).
>     Así me
>      > aseguro que es la última (evento afterLayerDraw).
>      >
>      > Saludos.
>      >
>      > Fran.
>      >
>      > El 06/02/2012 9:48, Josep Gimeno escribió:
>      >> Hola a todos, a ver si me podéis ayudar .
>      >>
>      >> He diseñado un pequeño plugin que me genera unas fichas (layout)
>     partiendo de
>      >> los datos contenidos en un shape.
>      >>
>      >> El diseño de la ficha se encuentra definido en una plantilla gvt que
>     contiene
>      >> textos, y elementos del tipo FFrameView. A la generación de las fichas
>      >> accedemos a través de un cuadro de diálogo que contiene un combo que 
> nos
>      >> permite elegir el identificador de la ficha, y otro combo que nos 
> permite
>      >> elegir el tipo de ficha. cuando pulsamos en el botón de aceptar, se 
> nos abre
>      >> la ficha y automáticamente se genera un pdf.
>      >>
>      >> El cuadro de diálogo también tiene un checkbox que, cuando lo 
> marcamos, nos
>      >> permite generar las fichas de todos los elementos.
>      >>
>      >> El problema viene en este punto, cuando marco el checkbox, se me 
> generan
>     todas
>      >> las fichas de todos los registros contenidos en la tabla del shape, 
> pero si
>      >> miro el contenido de cada ficha, solo me rellena correctamente los 
> campos de
>      >> texto. Los campos de tipo FFrameView (que contienen la vista ajustada 
> al
>      >> elemento seleccionado) no se generan correctamente (bueno, únicamente
>     para el
>      >> primer elemento).
>      >>
>      >> Si genero las fichas una por una todo funciona correctamente.
>      >>
>      >> El código asociado al botón aceptar es el siguiente, aunque es muy 
> simple...
>      >> (supongo que el error estará en el bucle porque generadas una por una,
>      >> funciona correctamente)
>      >>
>      >> if(chckbxTodos.isSelected()){
>      >> for(int i=0; i<comboBox.getItemCount(); i++){
>      >> comboBox.setSelectedIndex(i);
>      >> openReport();
>      >> }
>      >> PluginServices.getMDIManager().closeWindow(generaFichaPanel.this);
>      >> }else{
>      >> openReport();
>      >> }
>      >>
>      >> Alguien sabe a que puede ser debido?
>      >>
>      >> Un saludo.
>      >>
>      >> Josep Gimeno.
>      >>
>      >>
>      >> _______________________________________________
>      >> gvSIG_desarrolladores mailing list
>      >> gvSIG_desarrolladores@listserv.gva.es
>     <mailto: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:http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>      >
>      > --
>      > Fran Peñarrubia
>      > Scolab
>      > www.scolab.es <http://www.scolab.es>
>      >
>      > Asociación gvSIG
>      > www.gvsig.com <http://www.gvsig.com>
>      >
>      >
>      >
>      > _______________________________________________
>      > gvSIG_desarrolladores mailing list
>      > gvSIG_desarrolladores@listserv.gva.es
>     <mailto: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:
>     http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>     _______________________________________________
>     gvSIG_desarrolladores mailing list
>     gvSIG_desarrolladores@listserv.gva.es
>     <mailto: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:
>     http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>
>
>
>
> _______________________________________________
> 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: 
> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
_______________________________________________
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: 
http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores

Responder a