Page 1 of 1

Diversas marcas fijas en una gráfica estática

Posted: Fri Mar 23, 2007 9:41 am
by 7663010
Hola,

No consigo dejar marcas fijas en la gráfica, ni tampoco más de una.
Utilizando la herramienta 'mark tips', va poniendo marcas correctamente, aunque me gustaria que no existiera delay sino que simplemente se quedaran fijas, y mediant la herramienta 'nearest point' no sale ningun tipo de marca en la gráfica.

Gracias por la ayuda

Carlos.

Posted: Fri Mar 23, 2007 11:40 am
by Marc
Hola Carlos,

Para conseguir Marcas permanentes:
Ejemplo:

Setting Marks to Visible

Code: Select all

lineSeries = new com.steema.teechart.styles.Line(tChart.getChart()); 
lineSeries.getMarks().setVisible(true);
Se puede modificar otros aspectos de las marcas por la misma clase:

Ej.

Code: Select all

lineSeries.getMarks().setBackColor(com.steema.teechart.drawing.Color.ORANGE);
lineSeries.getMarks().setTransparency(30);
saludos,
Marc Meumann

Posted: Fri Mar 23, 2007 11:57 am
by 7663010
Mi intencion es mas bien que el usuario tenga la opcion de elegir un punto de la grafica, y por ejemplo haciendo clic con el raton, aparezca una marca.

Esto se puede conseguir facilmente con 'tool->mark tips', pero no quiero que desaparezca, sino que se quede fija y que pueda ir a otro punto y marcarlo tambien.

Habia pensado en, por ejemplo, utilizar el boton derecho del raton, o sea, utilizar 'mark tips' con movimiento en vez de con el clic del raton, que el usuario haga un clic en el boton derecho cuando quiera que se quede marcado ese punto, y que aparezca una marca (que no es la misma que con 'mark tips') de manera permanente, sin que se borre con el tiempo.
Podria hacerse con una anotacion verdad?, o sea, en el momento que reciba el evento del boton derecho del mouse, recoger su posicion, recoger de alguna manera la serie a la que se refiere, y crear una anotacion en esa posicion con los datos que me interesen de la serie.

Hay muchos problemas en hacerlo asi?, o hay alguna otra manera mas sencilla de conseguir lo que quiero?

Gracias por la ayuda

Carlos.

Posted: Fri Mar 23, 2007 12:41 pm
by narcis
Hola Carlos,

En este caso yo utilizaria AnnotationTools. Puedes encontrar ejemplos en la sección All Features\Welcome!\Tools\Annotation de la demo TeeChart.Features.jar, incluida con la instalación.

También agradeceriamos que, si es possible, escribieras tus mensajes en inglés. De este modo muchos mas usuarios de los foros pueden seguir las discusiones.

Gracias de antemano.

Posted: Fri Mar 23, 2007 2:59 pm
by Marc
Hola Carlos,

Si. Lo podrias hacer con Annotation.

Una manera seria utilizar 'clicked' del Series.

Ej.

Code: Select all

private int pointIndex=-1;

private void initTChart(){ 

    tChart.setHeight(100); 
    tChart.setMinimumSize(new java.awt.Dimension(100, 100)); 
    tChart.setPreferredSize(new java.awt.Dimension(100, 100)); 
    tChart.setWidth(100); 

    mat = new double[15][24]; 
    for(int i=0; i<1; i++){ 
        lineSeries = new com.steema.teechart.styles.Line(tChart.getChart()); 
        lineSeries.setClickableLine(false); 
        lineSeries.getPointer().setVisible(true);

        for(int j=0; j<24; j++){ 
            lineSeries.add(10*Math.random()); 
        } 

        tChart.addMouseMotionListener( new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    double tmpX = tChart.getAxes().getBottom().calcPosPoint(e.getX());
                    int i = (int)Math.round(tmpX);
                    double tmpY;
                    try
                    {
                      tmpY = lineSeries.getYValues().getValue(i);
                    }
                    catch(ArrayIndexOutOfBoundsException ee)
                    {
                      return;
                    }

                    int yValue = tChart.getAxes().getLeft().calcPosValue(tmpY);

                    int tmpPoint = lineSeries.clicked(e.getX(), e.getY());
                    pointIndex = tmpPoint;
                    tChart.repaint();
               }
        });

        tChart.addChartPaintListener( new com.steema.teechart.events.ChartPaintAdapter() {

            public void chartPainted(com.steema.teechart.events.ChartDrawEvent pce) {
                if (pointIndex!=-1) {
                    com.steema.teechart.tools.Annotation anno=new com.steema.teechart.tools.Annotation(tChart.getChart());
                    anno.setText(Integer.toString(pointIndex));
                    anno.setLeft(lineSeries.calcXPos(pointIndex));
                    anno.setTop(lineSeries.calcYPos(pointIndex));
                    }
                }
        });
    } 

    tChart.getFooter().setVisible(true); 
    tChart.getHeader().setVisible(true); 
    tChart.getAspect().setView3D(false); 
    tChart.getLegend().setVisible(false); 
    tChart.setBackground(Color.WHITE); 

    jFrameTeeChartCommander = new Commander(tChart.getChart()); 
    jFrameTeeChartCommander.setFloatable(false); 
    jFrameTeeChartCommander.setVisible(true); 
    jFrameTeeChartCommander.setRollover(true); 

    jPanel1.setLayout(new BorderLayout()); 
    jPanel1.add(jFrameTeeChartCommander, BorderLayout.PAGE_START); 
    jPanel1.add(tChart, BorderLayout.CENTER); 
    jPanel1.repaint(); 
    jPanel1.validate(); 
}
Las Annotations se activan cuando pasas el mouse sobre los puntos de la Series.

saludos,
Marc

Posted: Mon Mar 26, 2007 8:01 am
by 7663010
Estoy probando un poco con el codigo que has pasado, aun tengo problemillas con la posicion de la Annotation y cosillas por el estilo, supongo que es por haber fusilado el codigo directamente, sigo mirandolo :)

Otra preguntilla, para borrar estas anotaciones?, por si se hace un zoom y tal, donde se 'guardan'?

Y el tema de ingles, lo siento pero no tengo suficiente nivel como para poder escribir bien, pero a partir de ahora (este post), intentare secuestrar a alguien para que me vaya traduciendo.

Gracias

Carlos.

Posted: Mon Mar 26, 2007 8:37 am
by narcis
Hola Carlos,
Otra preguntilla, para borrar estas anotaciones?, por si se hace un zoom y tal, donde se 'guardan'?
Cada vez que se hace zoom tendrias que actualizar la posición de las anotaciones en el evento Zoomed del chart.

Puedes acceder las anotaciones como se muestra abajo. Ten en cuenta que seguramente tendrás que hacer un "type casting" de las tools en la colección getTools ya que puede que no todas las tools sean anotaciones.

Code: Select all

    for(int i=0; i<tChart.getTools().size(); i++){ 
       //tChart.getTools().getTool(i) //type casting necesario        
    }
Y el tema de ingles, lo siento pero no tengo suficiente nivel como para poder escribir bien, pero a partir de ahora (este post), intentare secuestrar a alguien para que me vaya traduciendo.


De acuerdo, ningún problema, puedes seguir escribiendo en castellano.

Posted: Mon Mar 26, 2007 1:09 pm
by 7663010
Ya he conseguido lo de las anotaciones, aunque he aprovechado otro codigo que teneis en los ejemplos:

Code: Select all

tempX = tChart.getAxes().getBottom().calcPosPoint(e.getX());
        Series lineSeries = tChart.getSeries(3);
        pointIndex = getNearestPoint(lineSeries, e.getX(), e.getY());
        int i = (int)Math.round(tempX);
        try
        {
          tempY = lineSeries.getYValues().getValue(pointIndex);
        }
        catch(ArrayIndexOutOfBoundsException ee)
        {
            ee.printStackTrace();
          return;
        }        
        com.steema.teechart.tools.Annotation anno=new com.steema.teechart.tools.Annotation(tChart.getChart());
            
        anno.setText(Double.toString(tempX) +", "+ Double.toString(tempY));
        anno.setLeft(lineSeries.calcXPos(pointIndex));
        anno.setTop(lineSeries.calcYPos(pointIndex));
        tChart.repaint();

Code: Select all

private int getNearestPoint(Series aSeries, int x, int y) {
        int tmpResult = -1;
        int difference = -1;
        int tmpDif, tmpX, tmpY;

        for (int t=0; t < aSeries.getCount(); t++) {

            tmpX = aSeries.calcXPos(t) - x;
            tmpY = aSeries.calcYPos(t) - y;
            tmpDif = MathUtils.round(Math.sqrt(MathUtils.sqr(tmpX) + MathUtils.sqr(tmpY)));

            if ((difference==-1) || (tmpDif<difference)) {
                difference = tmpDif;
                tmpResult = t;
            }
        }

        return tmpResult;
    }

Code: Select all

public void mouseDragged(MouseEvent e) {
        for(int i=0; i<tChart.getTools().size(); i++){
            if (tChart.getTools().getTool(i) instanceof com.steema.teechart.tools.Annotation) {
                tChart.getTools().remove(i);
            }
        }   
        pointIndex = -1;
    }
Por ahora hay una serie puesta a pelo, pero bueno, son las tonterias que me faltan por modificar.

Gracias de nuevo

Carlos.