calcXPosValue() always returns 0

TeeChart for Java (NetBeans, Eclipse, Android Studio, etc)
Post Reply
Ilan
Newbie
Newbie
Posts: 4
Joined: Tue Jan 27, 2004 5:00 am

calcXPosValue() always returns 0

Post by Ilan » Thu Sep 04, 2008 1:58 pm

I am drawing a chart with multiple lines on it, so now I want to add some custom text next to a line. In order to get the correct position of the text, I have tried the following:
chart.getAxes().getLeft().calcXPosValue(idx_timeD)
candleSeries.calcXPos(idx_timeD)
line.calcXPos(idx_timeD)
.. where idx_timeD is an int like 20 or 30.

Every time, calcXPos returns zero. I have also tried calling it with values 0, 1, and 2 (explicitly).

Also, as you can see I have tried using the chart, the series (it is displaying price chart candles) and my custom lines to get the point coordinates, but all return zero. Yet they are draw beautifully on my chart.

Here is some more complete code:
chart = new TChart();
chart.getGraphics3D().setSmoothingMode(true);
chart.getAspect().setView3D(false); // 2d
chart.getLegend().setVisible(false); // no legend

chart.getPanel().setMarginLeft(1);
chart.getPanel().setMarginRight(1);
chart.getPanel().setMarginTop(1);
chart.getPanel().setMarginBottom(1);
chart.getPanel().setBevelOuter(BevelStyle.NONE); // no bevel
chart.getPanel().setColor(new Color(broker.getBackgroundColour())); // set background color

chart.getWalls().setVisible(true); // walls not visible (for maximum chart area)
chart.getWalls().setSize(1);
chart.getWalls().setView3D(false);

chart.getAxes().getTop().setVisible(false); // hide top axis
chart.getAxes().getLeft().setVisible(false); // hide left axis

chart.getAxes().getRight().setVisible(true); // show right axis
chart.getAxes().getRight().getAxisPen().setWidth(1); // set right axis pen
chart.getAxes().getRight().setAutomatic(true); // set right axis to auto-scale
chart.getAxes().getRight().getGrid().setColor(new Color(broker.getAxisColour())); // set right axis colour
chart.getAxes().getRight().getGrid().setTransparency(85);
chart.getAxes().getRight().getTitle().setVisible(false);
chart.getAxes().getRight().getLabels().getFont().setSize(10);
chart.getAxes().getRight().getLabels().getFont().setName("Arial");

chart.getAxes().getBottom().setVisible(true); // show right axis
chart.getAxes().getBottom().getAxisPen().setWidth(1); // set right axis pen
chart.getAxes().getBottom().setAutomatic(true); // set axis to auto-scale
chart.getAxes().getBottom().getGrid().setColor(new Color(broker.getAxisColour())); // set bttom axis colour
chart.getAxes().getBottom().getGrid().setTransparency(85);
chart.getAxes().getBottom().getTitle().setVisible(false);
chart.getAxes().getBottom().getLabels().getFont().setSize(10);
chart.getAxes().getBottom().getLabels().getFont().setName("Arial");

chart.getHeader().setVisible(false); // no header

// candle series
com.steema.teechart.styles.Candle candleSeries = new com.steema.teechart.styles.Candle(chart.getChart());
candleSeries.setVerticalAxis(VerticalAxis.RIGHT); // apply to right axis
candleSeries.setDownCloseColor(new Color(broker.getCandleDownCloseColour())); // set colour of down close
candleSeries.setUpCloseColor(new Color(broker.getCandleUpCloseColour())); // set colour of up close
candleSeries.getXValues().setDateTime(false);
int candleWidth = (int)((width / pricegraph.size()) * 0.8);
if(candleWidth < 2) {
candleSeries.setCandleWidth( 2 );
} else if(candleWidth > 8) {
candleSeries.setCandleWidth( 8 );
} else {
candleSeries.setCandleWidth(candleWidth );
}


// XA line
com.steema.teechart.styles.Line xa = new com.steema.teechart.styles.Line(chart.getChart());
xa.setColor(new Color(broker.getSupportColour()));
xa.getLinePen().setWidth(2);
xa.setVerticalAxis(VerticalAxis.RIGHT); // apply to right axis
xa.getXValues().setDateTime(false);

// target line 1
com.steema.teechart.styles.Line t1 = new com.steema.teechart.styles.Line(chart.getChart());
t1.setColor(new Color(broker.getResistanceColour()));
t1.getLinePen().setWidth(1);
t1.setVerticalAxis(VerticalAxis.RIGHT); // apply to right axis
t1.getXValues().setDateTime(false);

// add lines
if (timeX.getTime() > 0) {
xa.add(idx_timeX, priceX);
}
if (timeA.getTime() > 0) {
xa.add(idx_timeA, priceA);
}
xa.add(idx_timeB, priceB);
xa.add(idx_timeC, priceC);
xa.add(idx_timeD, priceD);

// add target lines
t1.add(idx_timeD, target10);
t1.add(idx_timeD+50, target10);

//all return zero!!
System.out.println("candleSeries.calcXPos(idx_timeD) : " + candleSeries.calcXPos(idx_timeD));
System.out.println("candleSeries.calcXPosValue(idx_timeD) : " + candleSeries.calcXPosValue(idx_timeD));
System.out.println("" + t3.calcXPos(0));
System.out.println("" + t3.calcXPos(1));
System.out.println("" + t3.calcXPos(2));
System.out.println("" + t3.calcXPosValue(0));
System.out.println("" + t3.calcXPosValue(1));
System.out.println("" + t3.calcXPosValue(2));
System.out.println("chart.getAxes().getRight().calcPosValue(idx_timeD) : " + chart.getAxes().getRight().calcPosValue(idx_timeD));
System.out.println("chart.getAxes().getRight().calcXPosValue(1) : " + chart.getAxes().getRight().calcXPosValue(1));

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Post by Narcís » Thu Sep 04, 2008 2:16 pm

Hi Ilan,

You should try to do someting similar to the example Marc posted on this thread.

Hope this helps!
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

Ilan
Newbie
Newbie
Posts: 4
Joined: Tue Jan 27, 2004 5:00 am

Post by Ilan » Fri Sep 05, 2008 8:29 am

Dear Narcís

Thank you for the suggestion, however my problem is that I need to put text next to each of the five green horizontal lines in this graph:

Image

I draw hundred of these charts dynamically, so I need to be able to call some method will reveal the appropriate x and y coordinates of where the line is. These positions change for each chart.

I have run out of ideas of things to try.

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Post by Narcís » Fri Sep 05, 2008 8:39 am

Hi Ilan,

Could you please send us a simple example we can run "as-is" to reproduce a chart similar to the one in the image and we will try to help you?

Thanks in advance.
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

Ilan
Newbie
Newbie
Posts: 4
Joined: Tue Jan 27, 2004 5:00 am

Post by Ilan » Fri Sep 05, 2008 12:37 pm

Thanks again Narcis

Here is my entire class. You will not be able to run it "as-is" unfortunately because it connects to a database to retrieve the price data and there are some other custom packages that it uses. I don't know if you will find this useful, but it is as it created the image. You will also see my debug attempts.

Code: Select all

public class FibonacciChart {

	private TChart chart; 
    /**
     * @param pricegraph
     * @param broker
     * @param cpr
     */
    public void draw(OHLCVList pricegraph, Broker broker, FibonacciResult cpr, String filename, int width, int height) throws IOException {

    	final int targetColour = broker.getResistanceColour();
    	
		// get critical points from chart pattern result class
		Timestamp timeX = cpr.getTimeX();
		Timestamp timeA = cpr.getTimeA();
		Timestamp timeB = cpr.getTimeB();
		Timestamp timeC = cpr.getTimeC();
		Timestamp timeD = cpr.getTimeD();
    	
        
		// truncate the pricegraph from the front to take into account where the pattern length is so long that the pattern isn't visible
        int _from = 0;

        if (timeX.getTime() > 0) {
        	_from = pricegraph.getIndexOf(timeX);
        } else if (timeA.getTime() > 0) {
        	_from = pricegraph.getIndexOf(timeA);
        } else {
        	_from = pricegraph.getIndexOf(timeB);
    	}

		int maxlength = (pricegraph.size() - _from)*2;
		for(int i = 0; i < pricegraph.size()-maxlength; i++) {
			pricegraph.remove(0);
		}
		
    	
    	// calculate the indexes of all significant points
		int idx_timeX = timeX.getTime() > 0 ? pricegraph.getIndexOf(timeX) : -1; 
		int idx_timeA = timeA.getTime() > 0 ? pricegraph.getIndexOf(timeA) : -1; 
		int idx_timeB = pricegraph.getIndexOf(timeB); 
		int idx_timeC = pricegraph.getIndexOf(timeC); 
		int idx_timeD = pricegraph.getIndexOf(timeD); 

    	
        // set up the chart 
		chart = new TChart();
		chart.getGraphics3D().setSmoothingMode(true);
        chart.getAspect().setView3D(false);	// 2d
        chart.getLegend().setVisible(false);	// no legend

        chart.getPanel().setMarginLeft(1);
        chart.getPanel().setMarginRight(1);
        chart.getPanel().setMarginTop(1);
        chart.getPanel().setMarginBottom(1);
        chart.getPanel().setBevelOuter(BevelStyle.NONE);	// no bevel 
        chart.getPanel().setColor(new Color(broker.getBackgroundColour()));	// set background color
        
        chart.getWalls().setVisible(true);	// walls not visible (for maximum chart area)
        chart.getWalls().setSize(1);
        chart.getWalls().setView3D(false);
        
        chart.getAxes().getTop().setVisible(false);		// hide top axis
        chart.getAxes().getLeft().setVisible(false);	// hide left axis

        chart.getAxes().getRight().setVisible(true);	// show right axis
        chart.getAxes().getRight().getAxisPen().setWidth(1);	// set right axis pen
        chart.getAxes().getRight().setAutomatic(true);	// set right axis to auto-scale
        chart.getAxes().getRight().getGrid().setColor(new Color(broker.getAxisColour()));	// set right axis colour
        chart.getAxes().getRight().getGrid().setTransparency(85);
		chart.getAxes().getRight().getTitle().setVisible(false);
        chart.getAxes().getRight().getLabels().getFont().setSize(10);
        chart.getAxes().getRight().getLabels().getFont().setName("Arial");

        chart.getAxes().getBottom().setVisible(true);	// show right axis
        chart.getAxes().getBottom().getAxisPen().setWidth(1);	// set right axis pen
        chart.getAxes().getBottom().setAutomatic(true);	// set axis to auto-scale
        chart.getAxes().getBottom().getGrid().setColor(new Color(broker.getAxisColour()));	// set bttom axis colour
        chart.getAxes().getBottom().getGrid().setTransparency(85);
		chart.getAxes().getBottom().getTitle().setVisible(false);
        chart.getAxes().getBottom().getLabels().getFont().setSize(10);
        chart.getAxes().getBottom().getLabels().getFont().setName("Arial");
        
        chart.getHeader().setVisible(false);	// no header

        // candle series
		com.steema.teechart.styles.Candle candleSeries = new com.steema.teechart.styles.Candle(chart.getChart());
		candleSeries.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		candleSeries.setDownCloseColor(new Color(broker.getCandleDownCloseColour()));	// set colour of down close
		candleSeries.setUpCloseColor(new Color(broker.getCandleUpCloseColour()));		// set colour of up close
		candleSeries.getXValues().setDateTime(false);
		int candleWidth = (int)((width / pricegraph.size()) * 0.8);
		if(candleWidth < 2) {
			candleSeries.setCandleWidth( 2 );
		} else if(candleWidth > 8) {
			candleSeries.setCandleWidth( 8 );
		} else {
			candleSeries.setCandleWidth(candleWidth );
		}
		

		// XA line
		com.steema.teechart.styles.Line xa = new com.steema.teechart.styles.Line(chart.getChart());
        xa.setColor(new Color(broker.getSupportColour()));
        xa.getLinePen().setWidth(2);
        xa.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		xa.getXValues().setDateTime(false);
		
		// AB line
		com.steema.teechart.styles.Line ab = new com.steema.teechart.styles.Line(chart.getChart());
        ab.setColor(new Color(broker.getSupportColour()));
        ab.getLinePen().setWidth(2);
        ab.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		ab.getXValues().setDateTime(false);

		// BC line
		com.steema.teechart.styles.Line bc = new com.steema.teechart.styles.Line(chart.getChart());
        bc.setColor(new Color(broker.getSupportColour()));
        bc.getLinePen().setWidth(2);
        bc.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		bc.getXValues().setDateTime(false);

		// CD line
		com.steema.teechart.styles.Line cd = new com.steema.teechart.styles.Line(chart.getChart());
        cd.setColor(new Color(broker.getSupportColour()));
        cd.getLinePen().setWidth(2);
        cd.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		cd.getXValues().setDateTime(false);

		// target line 1
		com.steema.teechart.styles.Line t1 = new com.steema.teechart.styles.Line(chart.getChart());
        t1.setColor(new Color(broker.getResistanceColour()));
        t1.getLinePen().setWidth(1);
        t1.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		t1.getXValues().setDateTime(false);

		// target line 2
		com.steema.teechart.styles.Line t2 = new com.steema.teechart.styles.Line(chart.getChart());
        t2.setColor(new Color(broker.getResistanceColour()));
        t2.getLinePen().setWidth(1);
        t2.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		t2.getXValues().setDateTime(false);

		// target line 3
		com.steema.teechart.styles.Line t3 = new com.steema.teechart.styles.Line(chart.getChart());
        t3.setColor(new Color(broker.getResistanceColour()));
        t3.getLinePen().setWidth(1);
        t3.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		t3.getXValues().setDateTime(false);

		// target line 4
		com.steema.teechart.styles.Line t4 = new com.steema.teechart.styles.Line(chart.getChart());
        t4.setColor(new Color(broker.getResistanceColour()));
        t4.getLinePen().setWidth(1);
        t4.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		t4.getXValues().setDateTime(false);

		// target line 5
		com.steema.teechart.styles.Line t5 = new com.steema.teechart.styles.Line(chart.getChart());
        t5.setColor(new Color(broker.getResistanceColour()));
        t5.getLinePen().setWidth(1);
        t5.setVerticalAxis(VerticalAxis.RIGHT);	// apply to right axis
		t5.getXValues().setDateTime(false);

		// set the x and y labels
		if(broker.getShowXLabel()) {
	        AxisTitle xaxistitle = chart.getAxes().getBottom().getTitle();
	        xaxistitle.setCaption("Date");
	        xaxistitle.getFont().setSize(12);
	        xaxistitle.getFont().setBold(true);
	        xaxistitle.getFont().setName("Arial");
			chart.getAxes().getBottom().getTitle().setVisible(true);
		}
		if(broker.getShowYLabel()) {
	        AxisTitle yaxistitle = chart.getAxes().getRight().getTitle();
	        yaxistitle.setCaption("Price");
	        yaxistitle.getFont().setSize(12);
	        yaxistitle.getFont().setBold(true);
	        yaxistitle.getFont().setName("Arial");
			chart.getAxes().getRight().getTitle().setVisible(true);
		}
		
        
		// set the date format for the labels
		SimpleDateFormat sdf = null;
        if(cpr.getTimeGranularity() < 1440)
            sdf = new SimpleDateFormat(broker.getIntraDayDateFormat());
        else
        	sdf = new SimpleDateFormat(broker.getEODDateFormat());
		


        // add data and labels to the candle series
		StringList sl = new StringList(pricegraph.size());
        for(int i = 0; i< pricegraph.size(); i++) {
            OHLCV b = (OHLCV)pricegraph.get(i);
            candleSeries.add(b.getOpen(), b.getHigh(), b.getLow(), b.getClose());
            sl.add(sdf.format(b.getPriceDateTime()));
        }        
        candleSeries.setLabels(sl);
        
        
        // get the y points of the line
		double priceX;// = cpr.getPriceX(); 
		double priceA;// = cpr.getPriceA(); 
		double priceB;// = cpr.getPriceB(); 
		double priceC;// = cpr.getPriceC(); 
		double priceD;// = cpr.getPriceD(); 

		double target10 = cpr.getTarget10(); 
		double target16 = cpr.getTarget16(); 
		double target06 = cpr.getTarget06(); 
		double target12 = cpr.getTarget12(); 
		double target07 = cpr.getTarget07(); 

		boolean endHigh = cpr.getPriceC() < cpr.getPriceD() ? true : false;
		
		// add lines
		if (timeX.getTime() > 0) {
			priceX = endHigh ? candleSeries.getHighValues().getValue(idx_timeX) : candleSeries.getLowValues().getValue(idx_timeX);
			xa.add(idx_timeX, priceX);
		}
		if (timeA.getTime() > 0) {
			priceA = endHigh ? candleSeries.getLowValues().getValue(idx_timeA) : candleSeries.getHighValues().getValue(idx_timeA);
			xa.add(idx_timeA, priceA);
		}
		priceB = endHigh ? candleSeries.getHighValues().getValue(idx_timeB) : candleSeries.getLowValues().getValue(idx_timeB);
		priceC = endHigh ? candleSeries.getLowValues().getValue(idx_timeC) : candleSeries.getHighValues().getValue(idx_timeC);
		priceD = endHigh ? candleSeries.getHighValues().getValue(idx_timeD) : candleSeries.getLowValues().getValue(idx_timeD);

		xa.add(idx_timeB, priceB);
		xa.add(idx_timeC, priceC);
		xa.add(idx_timeD, priceD);
		
        // add target lines 
		t1.add(idx_timeD, target10);
		t1.add(idx_timeD+50, target10);
		t2.add(idx_timeD, target06);
		t2.add(idx_timeD+50, target06);
		t3.add(idx_timeD, target16);
		t3.add(idx_timeD+50, target16);
		t4.add(idx_timeD, target07);
		t4.add(idx_timeD+50, target07);
		t5.add(idx_timeD, target12);
		t5.add(idx_timeD+50, target12);
        
/*
		final int d = chart.getSeries(0).calcXPos(idx_timeD);
		final int t10 = chart.getSeries(0).calcYPos((int)Math.round(target10));
		final int t07 = t4.calcYPosValue(target07);
		final double t16 = t3.getMaxYValue();
		final int t12 = (int)Math.round(target12);
		final int t06 = (int)Math.round(target06);

        final int p1 = t3.calcXPos(1);
        final int p2 = t3.calcYPos(1);

        System.out.println("target10 :  " + target10);		
		System.out.println("t10 Ypos :  " + t10);		
		System.out.println("t16  :  " + t16);		
		System.out.println("t1.calcYpos:  " + t1.calcYPos(target10));		
		System.out.println("t1.calcYposVal:  " + t1.calcYPos(target10));		
		System.out.println("t16 chart YposVal:  " + chart.getSeries(0).calcYPosValue(target16));
		System.out.println("t16 candleSeries YposVal:  " + candleSeries.calcYPosValue(target16));
        System.out.println("t3.calcXPos(0) : " + t3.calcXPos(0));		
        System.out.println("t3.calcXPos(1) : " + t3.calcXPos(1));		
        System.out.println("t3.calcXPos(2) : " + t3.calcXPos(2));		
        System.out.println("t3.calcXPosValue(0) : " + t3.calcXPosValue(0));		
        System.out.println("t3.calcXPosValue(1) : " + t3.calcXPosValue(1));		
        System.out.println("t3.calcXPosValue(2) : " + t3.calcXPosValue(2));		
        System.out.println("candleSeries.calcXPos(idx_timeD) : " + candleSeries.calcXPos(idx_timeD));
        System.out.println("candleSeries.calcXPosValue(idx_timeD) : " + candleSeries.calcXPosValue(idx_timeD));
        System.out.println("candleSeries.calcPosValue(idx_timeD) : " + candleSeries.calcPosValue(idx_timeD) );
        candleSeries.getMaxXValue() : " + candleSeries.getMaxXValue() );
        System.out.println("candleSeries.calcYPos(idx_timeD) : " + candleSeries.calcYPos(idx_timeD));
        System.out.println("candleSeries.calcYPosValue(target10) : " + candleSeries.calcYPosValue(target10));
        System.out.println("chart.getAxes().getRight().calcPosValue(idx_timeD) : " + chart.getAxes().getRight().calcPosValue(idx_timeD));
        System.out.println("candleSeries.calcYSizeValue(idx_timeD) : " + candleSeries.calcYSizeValue(idx_timeD) );
        System.out.println("chart.getAxes().getLeft().calcXPosValue(idx_timeD) : " + chart.getAxes().getLeft().calcXPosValue(idx_timeD));
        System.out.println("chart.getAxes().getRight().calcXPosValue(1) : " + chart.getAxes().getRight().calcXPosValue(1));
        System.out.println("chart.getAxes().getLeft().calcXPosValue(2) : " + chart.getAxes().getLeft().calcXPosValue(2));
*/
        System.out.println("idx_timeD, target10 : " + idx_timeD + ", " + target10);
        System.out.println("xa.calcXPos(1)" + xa.calcXPos(1));		
        System.out.println("candleSeries.getHighValues().getValue(idx_timeD) : " + candleSeries.getHighValues().getValue(idx_timeD) );
        
        chart.addChartPaintListener( new ChartPaintAdapter() {  
            public void chartPainted(ChartDrawEvent pce) { 
                IGraphics3D g = chart.getGraphics3D();
                g.getFont().setColor(new Color(90, 90, 90));
                g.setTextSmooth(true);
                g.textOut(chart.getAxes().getBottom().iStartPos + 10, 
                		chart.getAxes().getLeft().iEndPos - 17, 
                        "Test"); 
                
                g.getFont().setColor(new Color(targetColour));
//                g.textOut(d, t10, "1.000");
//                g.textOut(p1 , p2, "1.618");
//                g.textOut(d, t12+20, "1.272");
//                g.textOut(d, t06+30, "0.618");
//                g.textOut(d, t07+40, "0.786");
            }; 
        });
                

        // save file to disk
        File imagefile = new File(filename);  
        BufferedImage image = (BufferedImage) chart.getExport().getImage().image(width, height);
        ImageIO.write(image, "PNG", imagefile);

        
        //ChartEditor.editChart(chart.getChart());
        
    }
	
    public static void main(String args[]) throws Exception {

    	//int uid = 24636593;
    	int uid = Integer.parseInt(args[0]);
    	

    	int brokerid = 24;
    	String filename = args[1];

    	SatelliteTestDataSource db = new SatelliteTestDataSource();
    	Connection con = db.getConnection();
    	
    	Broker broker = new Broker();
    	broker.load(con, brokerid);
    	
    	FibonacciResult fr = new FibonacciResult(con, uid, brokerid);
    	
    	OHLCVList pricegraph = new OHLCVList(con, fr, broker); 
    	
    	FibonacciChart chart = new FibonacciChart();
        chart.draw(pricegraph, broker, fr, filename, 423, 240);

    }
    
}

Narcís
Site Admin
Site Admin
Posts: 14730
Joined: Mon Jun 09, 2003 4:00 am
Location: Banyoles, Catalonia
Contact:

Post by Narcís » Fri Sep 05, 2008 1:41 pm

Hi Ilan,

Thanks for the code. I guess that calcYPos/calcYPosValue methods returns always zero because at the moment you retrieve it series haven't been painted on the chart yet. You should call chart.Refresh() before or call those methods in the ChartPaintListener implementation.

Hope this helps!
Best Regards,
Narcís Calvet / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

Post Reply