[Gvsig_usuarios] Imprimir elemento seleccionado

Joaquin Jose del Cerro Murciano jjdelcerro en gvsig.org
Sab Sep 19 10:34:28 CEST 2015


El 16 de septiembre de 2015, 11:07, sinorfavela <fircorreo en yahoo.es>
escribió:

> Muchas gracias por el script!
>
> Como no he hecho nunca uno, hago un par de preguntas (y así trato de
> aprender algo):
>
> -Para la duda que planteaba este hilo, si con este script es necesario
> seleccionar varios elementos no tendríamos una visualización distinta para
> el elemento seleccionado, ¿no?. Supongo que habría que introducir alguna
> línea más para que vaya seleccionando sucesivamente cada elemento de una
> capa.
>


Por lo que entiendo comentas dos cosas...
- Por un lado si se visualizan seleccionadas las geometrias al
  exportar a imagen
- Y por otro como hacer para que vaya exportando todas las geometrias
  de una capa en lugar de las seleccionadas.

Te voy comentando.

Este pequeño script no trabaja con el documento mapa (aunque podria
hacerlo),
si no con la opcion de exportar la vista a imagen. El problema de que no
muestra las geometrias seleccionadas esta en el "documento mapa", no en la
vista, y como estamos exportando la imagen de la vista estas si se
muestraran
seleccionadas.

Por otro lado, si lo que quisiesemos es exportar a imagen todas las
geometrias
de una capa y ademas que estas esten seleccionadas tendriamos que, en lugar
de recorrernos solo los elementos seleccionados

  ...
  for f in capa.getSelection():
  ...

Recorrernos todos los elementos de la capa:

  ...
  for f in capa.features():
  ...

Y si quisiesemos que cada elemento de la capa estuviese seleccionado,
tendriamos
que seleccionarlo:

  ...
  for f in capa.features():
    capa.getSelection().deselectAll()
    capa.getSelection().select(f)
  ...

El script completo quedaria:

#---------><-- inicio de script --><-----------------

from commonsdialog import *
from gvsig import *
from com.sun.jimi.core import Jimi
from org.gvsig.app import ApplicationLocator

import time

def main(*args):
  application = ApplicationLocator.getManager()
  docvista = currentView()
  capa = currentLayer()
  if docvista == None:
    msgbox("Debera tener activa una vista")
    return
  if capa == None:
    msgbox("Debera tener activa una capa con geometrias seleccionadas")
    return

  docwin = application.getDocumentWindow(docvista())
  n = 1
  for f in capa.features():
    # Seleccionamos el elemento para que salga seleccionado en
    # la imagen
    capa.getSelection().deselectAll()
    capa.getSelection().select(f)
    # Centramos la vista en la geometria asociada al elemento
    # seleccionado.
    encuadre = f.geometry().getEnvelope()
    docvista.getMapContext().getViewPort().setEnvelope(encuadre)
    # Esperamos un par de segundos a que se termine de pintar
    # la vista.
    time.sleep(2)
    # Obtenemos la imagen de la vista
    img = docwin.getMapControl().getImage()
    pathname = "/tmp/img%02d.png" % n
    Jimi.putImage(img,pathname)
    n += 1

#---------><-- fin de script --><-----------------

Por cierto, en el correo anterior me habia dejado un "import" al copiarlo.




>
> -Y esta ya es sólo para mis intereses. Me parece entender que con "encuadre
> = f.geometry().getEnvelope()" se centra la vista en la envolvente de cada
>


Con:
    encuadre = f.geometry().getEnvelope()
Calculamos la envolvente de la geometria actual (estamos en un bucle
recorriendo
los elementos) Y con:

    docvista.getMapContext().getViewPort().setEnvelope(encuadre)

Centramos la vista en esa envolvente.



> objeto. Si estos no son iguales y los quisiera a la misma escala, ¿tendría
> que añadir una línea más posterior que cambiase la vista a una escala común
> siempre?
>
>
Lo que comentas de mantener la misma escala puede estar mas complicado.
Una aproximacion simple podria ser que en lugar de centrar la vista en la
envolvente
de cada geometria lo que hiciesemos fuese calcular el centroide de la
geometria
y centrar la vista en ese punto manteniendo la misma area de visualizacion
que
tenemos en la vista inicialmente. El efecto seria el mismo que si fuesemos
haciendo "pan" sobre el centroide de cada elemento de la vista sin cambiar
la escala. Lleva algunos calculos mas pero no es complicado.

El script completo seria algo como:

#---------><-- inicio de script --><-----------------

from gvsig import *
from commonsdialog import *
from geom import *
from com.sun.jimi.core import Jimi
from org.gvsig.app import ApplicationLocator

import time

def centrarEnPunto(mapcontext, punto):
      # Obtenemos la extension actual del mapa que se esta visualizando
      envelope = mapcontext.getViewPort().getAdjustedEnvelope()

      # Calculamos cuanto hay que desplazarlo para que este centrado en el
      # punto que indicamos
      movX = punto.getX()-envelope.getCenter(0)
      movY = punto.getY()-envelope.getCenter(1)

      # Calculamos las nuevas "esquinas" del encuadre que queremos
      # tener.
      minx = envelope.getLowerCorner().getX() + movX;
      miny = envelope.getLowerCorner().getY() + movY;
      maxX = envelope.getUpperCorner().getX() + movX;
      maxY = envelope.getUpperCorner().getY() + movY;

      # Creamos el nuevo encuadre
      newenvelope = GeometryLocator.getGeometryManager().createEnvelope(
            minx, miny,
            maxX, maxY,
            Geometry.SUBTYPES.GEOM2D);
      # Asignamos el nuevo encuadre
      mapcontext.getViewPort().setEnvelope(newenvelope);

def main(*args):
  application = ApplicationLocator.getManager()
  docvista = currentView()
  capa = currentLayer()
  if docvista == None:
    msgbox("Debera tener activa una vista")
    return
  if capa == None:
    msgbox("Debera tener activa una capa con geometrias seleccionadas")
    return

  docwin = application.getDocumentWindow(docvista())
  n = 1
  for f in capa.features():
    # Seleccionamos el elemento para que salga seleccionado en
    # la imagen
    capa.getSelection().deselectAll()
    capa.getSelection().select(f)
    # Centramos la vista en la geometria asociada al elemento
    # seleccionado.
    centrarEnPunto(docvista.getMapContext(), f.geometry().centroid() )
    # Esperamos un par de segundos a que se termine de pintar
    # la vista.
    time.sleep(2)
    # Obtenemos la imagen de la vista
    img = docwin.getMapControl().getImage()
    pathname = "/tmp/img%02d.png" % n
    Jimi.putImage(img,pathname)
    n += 1

#---------><-- fin de script --><-----------------

El problema que nos podemos encontrar es que haya algun elemento que no
"quepa" en
la vista a la escala inicial que habiamos elegido, pero eso siempre nos
puede pasar
si queremos fijar la misma escala para todos los elementos.

Espero que te sirva
Un saludo
Joaquin





> Muchísimas gracias de nuevo por el esfuerzo!
>
>
>
>
> --
> View this message in context:
> http://osgeo-org.1560.x6.nabble.com/Imprimir-elemento-seleccionado-tp5224092p5224430.html
> Sent from the gvSIG usuarios mailing list archive at Nabble.com.
> _______________________________________________
> gvSIG_usuarios mailing list
> gvSIG_usuarios en 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_usuarios
>



-- 
--------------------------------------
Joaquin Jose del Cerro Murciano
Development and software arquitecture manager at gvSIG Team
jjdelcerro en gvsig.com
jjdelcerro en gvsig.org
gvSIG Association
www.gvsig.com
www.gvsig.org
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_usuarios/attachments/20150919/12f11128/attachment.htm 


Más información sobre la lista de distribución gvSIG_usuarios