Show events and times on the chart. The achartengine needs some work to get the labels in a better place. Enhance the SimulationSeriesDialog to allow selection of events.
This commit is contained in:
parent
3f957e56d3
commit
c5122ebef5
@ -4,12 +4,14 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical" >
|
android:orientation="vertical" >
|
||||||
|
|
||||||
<!-- shim to get dialog correct size ?? -->
|
<!-- shim to get dialog correct size ?? -->
|
||||||
|
<!--
|
||||||
<View
|
<View
|
||||||
android:layout_width="200dp"
|
android:layout_width="200dp"
|
||||||
android:layout_height="0px"
|
android:layout_height="0px"
|
||||||
android:layout_margin="0px"
|
android:layout_margin="0px"
|
||||||
android:orientation="horizontal" />
|
android:orientation="horizontal" />
|
||||||
|
-->
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -33,10 +35,16 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:drawSelectorOnTop="true" />
|
android:drawSelectorOnTop="true" />
|
||||||
|
|
||||||
|
<ListView
|
||||||
|
android:id="@+id/simulationEventsList"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/simulationOkButton"
|
android:id="@+id/simulationOkButton"
|
||||||
android:layout_width="70dp"
|
android:layout_width="70dp"
|
||||||
android:layout_height="70dp"
|
android:layout_height="45dp"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:text="ok" />
|
android:text="ok" />
|
||||||
|
|
||||||
|
11
android/res/layout/simulation_series_event_list_item.xml
Normal file
11
android/res/layout/simulation_series_event_list_item.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@android:id/text1"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?android:attr/listPreferredItemHeight"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
|
||||||
|
android:paddingLeft="8dip"
|
||||||
|
android:paddingRight="8dip"
|
||||||
|
/>
|
@ -10,8 +10,9 @@
|
|||||||
<string name="Download">Download</string>
|
<string name="Download">Download</string>
|
||||||
<string name="About">About</string>
|
<string name="About">About</string>
|
||||||
<string name="Preferences">Preferences</string>
|
<string name="Preferences">Preferences</string>
|
||||||
<string name="select_series">Select Series</string>
|
<string name="select_series">Change Plot</string>
|
||||||
<string name="view_events">View Events</string>
|
<string name="view_events">View Events</string>
|
||||||
|
<string name="simulationPlotDialogTitle">Select Series And Events</string>
|
||||||
|
|
||||||
<string-array name="PreferenceMotorBrowserGroupingEntries">
|
<string-array name="PreferenceMotorBrowserGroupingEntries">
|
||||||
<item>Case</item>
|
<item>Case</item>
|
||||||
|
@ -17,13 +17,16 @@ package net.sf.openrocket.android.simulation;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import net.sf.openrocket.android.util.AndroidLogWrapper;
|
import net.sf.openrocket.android.util.AndroidLogWrapper;
|
||||||
import net.sf.openrocket.document.OpenRocketDocument;
|
import net.sf.openrocket.document.OpenRocketDocument;
|
||||||
import net.sf.openrocket.document.Simulation;
|
import net.sf.openrocket.document.Simulation;
|
||||||
import net.sf.openrocket.simulation.FlightDataBranch;
|
import net.sf.openrocket.simulation.FlightDataBranch;
|
||||||
import net.sf.openrocket.simulation.FlightDataType;
|
import net.sf.openrocket.simulation.FlightDataType;
|
||||||
|
import net.sf.openrocket.simulation.FlightEvent;
|
||||||
import net.sf.openrocket.unit.Unit;
|
import net.sf.openrocket.unit.Unit;
|
||||||
|
|
||||||
import org.achartengine.chart.LineChart;
|
import org.achartengine.chart.LineChart;
|
||||||
@ -55,6 +58,7 @@ public class SimulationChart implements Serializable {
|
|||||||
private final int simulationIndex;
|
private final int simulationIndex;
|
||||||
private transient FlightDataType series1;
|
private transient FlightDataType series1;
|
||||||
private transient FlightDataType series2;
|
private transient FlightDataType series2;
|
||||||
|
private transient Map<Double,String> events;
|
||||||
|
|
||||||
// Define 4 different colors and point styles to use for the series.
|
// Define 4 different colors and point styles to use for the series.
|
||||||
// For now only 2 series are supported though.
|
// For now only 2 series are supported though.
|
||||||
@ -79,6 +83,10 @@ public class SimulationChart implements Serializable {
|
|||||||
this.series2 = series2;
|
this.series2 = series2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setEvents( Map<Double,String> events ) {
|
||||||
|
this.events = events;
|
||||||
|
}
|
||||||
|
|
||||||
public FlightDataBranch getFlightDataBranch( OpenRocketDocument rocketDocument ) {
|
public FlightDataBranch getFlightDataBranch( OpenRocketDocument rocketDocument ) {
|
||||||
Simulation sim = rocketDocument.getSimulation(simulationIndex);
|
Simulation sim = rocketDocument.getSimulation(simulationIndex);
|
||||||
FlightDataBranch flightDataBranch = sim.getSimulatedData().getBranch(0);
|
FlightDataBranch flightDataBranch = sim.getSimulatedData().getBranch(0);
|
||||||
@ -101,6 +109,13 @@ public class SimulationChart implements Serializable {
|
|||||||
if (series2== null) {
|
if (series2== null) {
|
||||||
series2 = flightDataBranch.getTypes()[2];
|
series2 = flightDataBranch.getTypes()[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( events == null ) {
|
||||||
|
events = new HashMap<Double,String>();
|
||||||
|
for ( FlightEvent event : flightDataBranch.getEvents() ) {
|
||||||
|
events.put(event.getTime(), event.getType().toString() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO -
|
* TODO -
|
||||||
@ -124,6 +139,12 @@ public class SimulationChart implements Serializable {
|
|||||||
renderer.setShowGrid(true);
|
renderer.setShowGrid(true);
|
||||||
renderer.setZoomButtonsVisible(true);
|
renderer.setZoomButtonsVisible(true);
|
||||||
renderer.setChartTitle(sim.getName());
|
renderer.setChartTitle(sim.getName());
|
||||||
|
renderer.setShowCustomTextGrid(true);
|
||||||
|
renderer.setXLabelsAlign(Align.RIGHT);
|
||||||
|
renderer.setXLabelsAngle(90); // rotate right
|
||||||
|
for( Map.Entry<Double,String> event : events.entrySet() ) {
|
||||||
|
renderer.addXTextLabel(event.getKey(), event.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
renderer.setMargins(new int[] { 50, 30, 0, 20 });
|
renderer.setMargins(new int[] { 50, 30, 0, 20 });
|
||||||
{
|
{
|
||||||
|
@ -1,19 +1,27 @@
|
|||||||
package net.sf.openrocket.android.simulation;
|
package net.sf.openrocket.android.simulation;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import net.sf.openrocket.R;
|
import net.sf.openrocket.R;
|
||||||
import net.sf.openrocket.android.CurrentRocketHolder;
|
import net.sf.openrocket.android.CurrentRocketHolder;
|
||||||
import net.sf.openrocket.document.OpenRocketDocument;
|
import net.sf.openrocket.document.OpenRocketDocument;
|
||||||
|
import net.sf.openrocket.simulation.FlightDataBranch;
|
||||||
import net.sf.openrocket.simulation.FlightDataType;
|
import net.sf.openrocket.simulation.FlightDataType;
|
||||||
|
import net.sf.openrocket.simulation.FlightEvent;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.DialogFragment;
|
import android.support.v4.app.DialogFragment;
|
||||||
|
import android.util.SparseBooleanArray;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.ListView;
|
||||||
import android.widget.Spinner;
|
import android.widget.Spinner;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
@ -23,6 +31,7 @@ public class SimulationSeriesDialog extends DialogFragment {
|
|||||||
public void onConfirm();
|
public void onConfirm();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ListView eventList;
|
||||||
private Spinner series1Spinner;
|
private Spinner series1Spinner;
|
||||||
private Spinner series2Spinner;
|
private Spinner series2Spinner;
|
||||||
|
|
||||||
@ -40,24 +49,18 @@ public class SimulationSeriesDialog extends DialogFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
if (savedInstanceState != null ) {
|
if (savedInstanceState != null ) {
|
||||||
chart = (SimulationChart) savedInstanceState.getSerializable("chart");
|
chart = (SimulationChart) savedInstanceState.getSerializable("chart");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(Bundle arg0) {
|
|
||||||
super.onSaveInstanceState(arg0);
|
|
||||||
arg0.putSerializable("chart", chart);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
||||||
|
|
||||||
View v = inflater.inflate(R.layout.simulation_series_dialog, container, false);
|
|
||||||
|
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle(R.string.simulationPlotDialogTitle);
|
||||||
|
|
||||||
|
final LayoutInflater inflater = getActivity().getLayoutInflater();
|
||||||
|
View v = inflater.inflate(R.layout.simulation_series_dialog, null);
|
||||||
|
builder.setView(v);
|
||||||
|
|
||||||
OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();
|
OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();
|
||||||
|
|
||||||
Button okButton = (Button) v.findViewById(R.id.simulationOkButton);
|
Button okButton = (Button) v.findViewById(R.id.simulationOkButton);
|
||||||
@ -65,6 +68,19 @@ public class SimulationSeriesDialog extends DialogFragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
|
Map<Double,String> eventsToShow = new HashMap<Double,String>();
|
||||||
|
{
|
||||||
|
SparseBooleanArray eventsSelected = eventList.getCheckedItemPositions();
|
||||||
|
List<FlightEvent> flightEvents = chart.getFlightDataBranch(CurrentRocketHolder.getCurrentRocket().getRocketDocument()).getEvents();
|
||||||
|
for( int i=0; i< flightEvents.size(); i++ ) {
|
||||||
|
if ( eventsSelected.get(i) ) {
|
||||||
|
FlightEvent event = flightEvents.get(i);
|
||||||
|
eventsToShow.put( event.getTime(), event.getType().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
chart.setEvents(eventsToShow);
|
||||||
|
|
||||||
chart.setSeries1((FlightDataType)series1Spinner.getSelectedItem());
|
chart.setSeries1((FlightDataType)series1Spinner.getSelectedItem());
|
||||||
chart.setSeries2((FlightDataType)series2Spinner.getSelectedItem());
|
chart.setSeries2((FlightDataType)series2Spinner.getSelectedItem());
|
||||||
|
|
||||||
@ -103,10 +119,42 @@ public class SimulationSeriesDialog extends DialogFragment {
|
|||||||
|
|
||||||
};
|
};
|
||||||
series1Spinner.setAdapter(serieses);
|
series1Spinner.setAdapter(serieses);
|
||||||
|
series1Spinner.setSelection(0);
|
||||||
series2Spinner.setAdapter(serieses);
|
series2Spinner.setAdapter(serieses);
|
||||||
|
series2Spinner.setSelection(1);
|
||||||
|
|
||||||
|
eventList = (ListView) v.findViewById(R.id.simulationEventsList);
|
||||||
|
|
||||||
return v;
|
FlightDataBranch data = chart.getFlightDataBranch(CurrentRocketHolder.getCurrentRocket().getRocketDocument());
|
||||||
|
// Initialize the eventList
|
||||||
|
|
||||||
|
ArrayAdapter<FlightEvent> events = new ArrayAdapter<FlightEvent>(getActivity(),android.R.layout.simple_list_item_1,data.getEvents()) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(int position, View convertView,
|
||||||
|
ViewGroup parent) {
|
||||||
|
View v = convertView;
|
||||||
|
if ( v == null ) {
|
||||||
|
LayoutInflater li = inflater;
|
||||||
|
v = li.inflate(android.R.layout.simple_list_item_multiple_choice,null);
|
||||||
|
}
|
||||||
|
FlightEvent event = this.getItem(position);
|
||||||
|
((TextView)v.findViewById(android.R.id.text1)).setText( event.getType().toString() + " " + event.getTime() + " (s)" );
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
eventList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
|
||||||
|
eventList.setAdapter(events);
|
||||||
|
|
||||||
|
return builder.create();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle arg0) {
|
||||||
|
super.onSaveInstanceState(arg0);
|
||||||
|
arg0.putSerializable("chart", chart);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user