[Gvsig_desarrolladores] Ayuda en el dibujado de símbolos sobre la vista.

Joaquin Jose del Cerro Murciano jjdelcerro en gvsig.org
Jue Oct 22 11:00:56 CEST 2015


El 22 de octubre de 2015, 9:35, Tomás Cabezudo <tcabezudo en gmail.com>
escribió:

> Buenos días,
>
> estoy intentando pintar un símbolo(un ISimpleFillSymbol sencillo) sobre
> una feature en la vista y no lo consigo, a ver si alguien puede echar una
> mano.
>
> He probado varios caminos, pero ninguno con éxito.
>
>
>
> //aqui compongo el simbolo
>
> private ISymbol getSymbolMunicipios(){
>
>                         SymbologyManager sm =
> SymbologyLocator.getSymbologyManager();
>
>
>
>                         Color color = new Color(206,242,213);
>
>
>
>         ISimpleFillSymbol resp = sm.createSimpleFillSymbol();
>
>         resp.setFillColor(color);
>
>         resp.setOutline(null);
>
>
>
>         return resp;
>
> }
>
>
>
>
>
> //aqui intento pintarlo Utilizando el mapcontroldrawer:
>
> MapControl mapCtrl = ((DefaultViewPanel)vista).getMapControl();
>
> MapControlDrawer mapControlDrawer = mapCtrl.getMapControlDrawer();
>
> mapControlDrawer.draw(geomFeature, simbolo, feature);
>
>
>
> //Utilizando el graphics2d:
>
> Graphics2D g =  (mapCtrl.getImage()).createGraphics();
>
>
> simbolo.draw(g, g.getTransform(), geomFeature, feature, null);
>
>
>
> Ninguno de los caminos parece el correcto.
>
>
>


Hola Tomás,
me temo que lo que quieres hacer no se puede.
El pintado de la simbologia se encarga de hacerlo la
leyenda de forma automatica al hacer un draw de la capa.
No puedes forzar el pintado de una solo geometria.
Depende de lo que quieras tienes varias opciones, pero
necesitaria algo mas de descripcion de lo que quieres hacer
para orientarte mejor.

La opcion mas rapida si lo que quieres es pintar una geometria,
o unas pocas, sobre la vista con una simbologia en concreto es
usar el GraphicsLayer. Se trata de una capa virtual que se
pinta sobre todas las demas y en la que puedes insertar geometrias
con una simbologia en concreto y se pintaran sobre todas las
capas. Un pedacito de codigo...

        MapContext mapContext = ...;
        Geometry theGeom = ...;

        GraphicLayer gl = mapContext.getGraphicsLayer();

        ISymbol symbolMunicipios = getSymbolMunicipios();

        int symid = gl.getSymbolId(symbolMunicipios);
        if( symid<0 ) {
            symid = gl.addSymbol(symbolMunicipios);
        }
        gl.addGraphic("miGrupo", theGeom, symid);

        mapContext.invalidate();

No lo he probado pero la idea seria algo asi.

- Al mapContext le pedimos su GraphicsLayer.

- En el hay que registrar el simbolo o simbolos que
  vamos a usar con addSymbol.

- Tenemos que tener la precaucion de no registrar
  simbolos como locos, si ya lo hemos registrado
  no lo volvemos a registrar.
  Para eso, utilizaremos la funcion getSymbolId para
  consultar si ya hemos registrado ese simbolo y solo
  lo registraremos si no lo habiamos registrado antes.
  Ojo, que esto solo funciona si utilizamos la misma
  instanancia de simbolo. Si la funcion getSymbolMunicipios
  nos devuelve una instanancia distinta cada vez que se
  llama esto no ira.

- Añadiremos al GraphicsLayer la geometria indicandole que
  use el identificador del simbolo que hemos añadido.
  Ademas usaremos un identificador, "miGrupo" en el codigo
  que he picado, que identifique mi funcionalidad.
  Hay que tener en cuenta que el GraphicsLayer se usa
  en varias herramientas y cuando queremos borrar nuestros
  graficos de el, deberemos borrar solo los nuestros usando

  gl.removeGraphics("miGrupo");

  Para no borrar los de las demas herramientas que puedan
  haber insertado graficos en el.

- Por ultimo forzamos un refresco del mapa.

Ademas tendras que determinar cuando quieres eliminar los
datos que has introducido en el GraphicsLayer.

Otra opcion...
Puedes crear tu propia leyenda que es la que se encarga de
pintar las geometrias y asignarla a la capa. Asi sin pensarlo
mucho, podrias extender de "SingleSymbolLegend" y sobreescribir
el metodo:

  public ISymbol getSymbolByFeature(Feature feat)

para que en caso de que sea la feature que requieres un
pintado especial retorne el simbolo que toque, y para el
resto de casos llame al super.

La cosa se puede complicar un poco mas si en lugar de
usar una leyenda de simbolo unico quieres usar otra,
mas que nada por su inicializacion, pero la idea seria
la misma.

Espero que te sirva algo de lo que cuento, y lo dicho,
si me cuantas algo mas te puedo orientar mejor.

Espero que cuentes por donde tiras y nos digas como te va.

Un saludo
Joaquin




> Cualquier orientación será bienvenida, gracias
>
> Saludos
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores 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_desarrolladores
>
>


-- 
--------------------------------------
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_desarrolladores/attachments/20151022/932081f7/attachment.htm 


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