package net.sf.openrocket.android.motor;\r
\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.Vector;\r
-\r
-import net.sf.openrocket.R;\r
import net.sf.openrocket.android.db.DbAdapter;\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+\r
+import org.achartengine.GraphicalView;\r
+import org.achartengine.chart.LineChart;\r
+import org.achartengine.chart.PointStyle;\r
+import org.achartengine.chart.XYChart;\r
+import org.achartengine.model.XYMultipleSeriesDataset;\r
+import org.achartengine.model.XYSeries;\r
+import org.achartengine.renderer.XYMultipleSeriesRenderer;\r
+import org.achartengine.renderer.XYSeriesRenderer;\r
+\r
import android.graphics.Color;\r
-import android.graphics.PointF;\r
+import android.graphics.Paint.Align;\r
import android.os.Bundle;\r
import android.support.v4.app.Fragment;\r
import android.view.LayoutInflater;\r
import android.view.View;\r
import android.view.ViewGroup;\r
\r
-import com.androidplot.xy.LineAndPointFormatter;\r
-import com.androidplot.xy.LineAndPointRenderer;\r
-import com.androidplot.xy.SimpleXYSeries;\r
-import com.androidplot.xy.XYPlot;\r
-import com.androidplot.xy.YValueMarker;\r
-\r
public class BurnPlotFragment extends Fragment {\r
\r
private ExtendedThrustCurveMotor motor;\r
private long motorId;\r
\r
- private XYPlot mySimpleXYPlot;\r
- private SimpleXYSeries mySeries;\r
+ /** The encapsulated graphical view. */\r
+ private GraphicalView mView;\r
+ /** The chart to be drawn. */\r
+ private XYChart mChart;\r
\r
public static BurnPlotFragment newInstance( long motorId ) {\r
BurnPlotFragment frag = new BurnPlotFragment();\r
public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
Bundle savedInstanceState) {\r
AndroidLogWrapper.d(BurnPlotFragment.class,"onCreateView");\r
- View v = inflater.inflate(R.layout.motor_burn, container, false);\r
- mySimpleXYPlot = (XYPlot) v.findViewById(R.id.xyplot);\r
+ \r
init(motor);\r
- return v;\r
- }\r
-\r
- private static List<Double> fromArray( double[] arry ) {\r
- List<Double> l = new ArrayList<Double>(arry.length);\r
- for( double d: arry ) {\r
- l.add(d);\r
- }\r
- return l;\r
+ mView = new GraphicalView(container.getContext(), mChart);\r
+ return mView;\r
}\r
\r
private void init( ExtendedThrustCurveMotor motor ) {\r
\r
- mySimpleXYPlot.setUserDomainOrigin(0);\r
- mySimpleXYPlot.setUserRangeOrigin(0);\r
- mySimpleXYPlot.setRangeLabel("impuse (n)");\r
- mySimpleXYPlot.setDomainLabel("time (s)");\r
- YValueMarker average = new YValueMarker(motor.getThrustCurveMotor().getAverageThrustEstimate(),"average" );\r
- average.getLinePaint().setColor(Color.BLACK);\r
- average.getTextPaint().setColor(Color.BLACK);\r
- mySimpleXYPlot.addMarker( average );\r
- mySimpleXYPlot.disableAllMarkup();\r
-\r
- try {\r
- mySeries = new SimpleXYSeries( \r
- fromArray(motor.getThrustCurveMotor().getTimePoints()),\r
- fromArray(motor.getThrustCurveMotor().getThrustPoints()), \r
- motor.getThrustCurveMotor().getManufacturer().getDisplayName() + " " + motor.getThrustCurveMotor().getDesignation()\r
- );\r
- } catch ( Exception ex ) {\r
-\r
- Vector<Double> data = new Vector<Double>();\r
- data.add(0.0);\r
- data.add(0.0);\r
- data.add(1.0);\r
- data.add(1.0);\r
- mySeries = new SimpleXYSeries(data, SimpleXYSeries.ArrayFormat.XY_VALS_INTERLEAVED,"no data");\r
+ XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(1);\r
+\r
+ renderer.setAxisTitleTextSize(16);\r
+ renderer.setChartTitleTextSize(20);\r
+ renderer.setLabelsTextSize(15);\r
+ renderer.setLegendTextSize(15);\r
+ renderer.setPointSize(5f);\r
+ renderer.setXLabels(10);\r
+ renderer.setYLabels(10);\r
+ renderer.setShowGrid(true);\r
+ renderer.setZoomButtonsVisible(false);\r
+ renderer.setZoomEnabled(false,false);\r
+ renderer.setPanEnabled(false,false);\r
+ renderer.setMargins(new int[] { 50, 40, 10, 20 });\r
+ renderer.setShowLegend(false);\r
+ renderer.setAxesColor(Color.LTGRAY);\r
+ renderer.setLabelsColor(Color.LTGRAY);\r
+\r
+ renderer.setChartTitle(motor.getThrustCurveMotor().getManufacturer() + " " + motor.getThrustCurveMotor().getDesignation());\r
+\r
+ renderer.setXTitle("time (s)");\r
+ renderer.setXLabelsAlign(Align.RIGHT);\r
+\r
+ renderer.setYTitle("impuse (n)");\r
+ renderer.setYLabelsAlign(Align.RIGHT,0);\r
+\r
+ XYSeriesRenderer r = new XYSeriesRenderer();\r
+ r.setColor(Color.RED);\r
+ r.setPointStyle(PointStyle.CIRCLE);\r
+ r.setFillPoints(true);\r
+ renderer.addSeriesRenderer(r);\r
+ // setting the YAximMin to 0 locks the origins.\r
+ renderer.setYAxisMin(0.0, 0);\r
+\r
+ // TODO get markers working in achartengine\r
+ //YValueMarker average = new YValueMarker(motor.getThrustCurveMotor().getAverageThrustEstimate(),"average" );\r
+ //average.getLinePaint().setColor(Color.BLACK);\r
+ //average.getTextPaint().setColor(Color.BLACK);\r
+ //mySimpleXYPlot.addMarker( average );\r
+\r
+ XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();\r
+\r
+ XYSeries series = new XYSeries(motor.getThrustCurveMotor().getDesignation(), 0);\r
+ \r
+ double[] timePoints = motor.getThrustCurveMotor().getTimePoints();\r
+ double[] thrustPoints = motor.getThrustCurveMotor().getThrustPoints();\r
+\r
+ // We are going to abuse this loop to also compute the Y axis max.\r
+ int maxy = 0;\r
+ int datasize = timePoints.length;\r
+ for( int i = 0; i<datasize; i++ ) {\r
+ series.add(timePoints[i], thrustPoints[i]);\r
+ int ceil = new Double(Math.ceil(thrustPoints[i])).intValue();\r
+ if ( ceil > maxy ) {\r
+ maxy = ceil;\r
+ }\r
}\r
+ renderer.setYAxisMax(maxy);\r
+ \r
+ // Find the X axis max. compute it as next larger integer if t_max > 2 else round up to next tenth.\r
+ double maxx = timePoints[datasize-1];\r
+ if ( maxx >= 2.0 ) {\r
+ maxx = Math.ceil(maxx);\r
+ } else {\r
+ maxx = new Double( Math.ceil(maxx*10.0) ).intValue() /10.0;\r
+ }\r
+ renderer.setXAxisMax(maxx);\r
+ \r
+ dataset.addSeries(series);\r
\r
- LineAndPointFormatter formatter= new LineAndPointFormatter(Color.GREEN, Color.GREEN, Color.GREEN);\r
-\r
- formatter.getLinePaint().setShadowLayer(0, 0, 0, 0);\r
- formatter.getVertexPaint().setShadowLayer(0, 0, 0, 0);\r
- mySimpleXYPlot.addSeries(mySeries, LineAndPointRenderer.class,formatter);\r
-\r
- //Set of internal variables for keeping track of the boundaries\r
- mySimpleXYPlot.calculateMinMaxVals();\r
-\r
- mySimpleXYPlot.redraw();\r
+ mChart = new LineChart(dataset, renderer);\r
\r
}\r
\r