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