1 package com.billkuker.rocketry.motorsim.grain;
\r
3 import java.awt.BorderLayout;
\r
4 import java.text.NumberFormat;
\r
6 import javax.measure.quantity.Duration;
\r
7 import javax.measure.quantity.Force;
\r
8 import javax.measure.quantity.Pressure;
\r
9 import javax.measure.quantity.Velocity;
\r
10 import javax.measure.unit.SI;
\r
11 import javax.swing.JFrame;
\r
12 import javax.swing.JPanel;
\r
13 import javax.swing.JSlider;
\r
14 import javax.swing.JSplitPane;
\r
15 import javax.swing.event.ChangeEvent;
\r
16 import javax.swing.event.ChangeListener;
\r
18 import org.jscience.physics.amount.Amount;
\r
20 import com.billkuker.rocketry.motorsim.Burn;
\r
21 import com.billkuker.rocketry.motorsim.visual.Chart;
\r
23 public class BurnPanel extends JPanel {
\r
25 Chart<Duration, Pressure> pressure;
\r
26 Chart<Duration, Force> thrust;
\r
27 Chart<Pressure, Velocity> burnRate;
\r
29 Amount<Duration> displayedTime = Amount.valueOf(0, SI.SECOND);
\r
31 public BurnPanel(Burn b){
\r
32 super( new BorderLayout() );
\r
36 pressure = new Chart<Duration, Pressure>(
\r
41 pressure.setDomain(burn.getData().keySet());
\r
43 thrust = new Chart<Duration, Force>(
\r
48 thrust.setDomain(burn.getData().keySet());
\r
50 burnRate = new Chart<Pressure, Velocity>(
\r
52 SI.METERS_PER_SECOND,
\r
53 burn.getMotor().getFuel(),
\r
56 burnRate.new IntervalDomain(
\r
57 Amount.valueOf(0, SI.MEGA(SI.PASCAL)),
\r
58 Amount.valueOf(3, SI.MEGA(SI.PASCAL)),
\r
63 JSplitPane tp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, thrust, pressure);
\r
64 tp.setDividerLocation(.5);
\r
65 tp.setResizeWeight(.5);
\r
67 grain = new GrainPanel(burn.getMotor().getGrain());
\r
69 JSplitPane grains = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, grain, burnRate);
\r
70 grains.setDividerLocation(.5);
\r
71 grains.setResizeWeight(.5);
\r
73 JSplitPane main = new JSplitPane(JSplitPane.VERTICAL_SPLIT, grains, tp);
\r
74 main.setDividerLocation(.5);
\r
75 main.setResizeWeight(.5);
\r
77 add( main, BorderLayout.CENTER );
\r
79 add( new SL(), BorderLayout.SOUTH);
\r
81 } catch (NoSuchMethodException e){
\r
88 private class SL extends JSlider implements ChangeListener{
\r
89 private static final long serialVersionUID = 1L;
\r
90 private static final int STEPS = 150;
\r
92 addChangeListener(this);
\r
99 public void stateChanged(ChangeEvent e) {
\r
100 double t = ((SL)e.getSource()).getValue();
\r
101 displayedTime = burn.burnTime().divide(STEPS).times(t);
\r
103 //Find the nearest key in the data set
\r
104 displayedTime =burn.getData().tailMap(displayedTime).firstKey();
\r
106 NumberFormat nf = NumberFormat.getInstance();
\r
107 nf.setMaximumFractionDigits(2);
\r
108 //System.out.println("Time: " + nf.format(displayedTime.doubleValue(SI.SECOND)) + "s");
\r
110 pressure.mark(displayedTime);
\r
111 thrust.mark(displayedTime);
\r
113 grain.setDisplayedRegression(burn.getData().get(displayedTime).regression);
\r
115 burnRate.mark(burn.getData().get(displayedTime).chamberPressure);
\r
119 double r = ((SL)e.getSource()).getValue();
\r
120 displayedRegression = grain.webThickness().divide(STEPS).times(r);
\r
121 NumberFormat nf = NumberFormat.getInstance();
\r
122 nf.setMaximumFractionDigits(2);
\r
123 l.setText("Regression: " + nf.format(displayedRegression.doubleValue(SI.MILLIMETER)) + "mm");
\r
124 area.mark(displayedRegression);
\r
125 volume.mark(displayedRegression);
\r
132 public void show(){
\r
133 JFrame f = new JFrame();
\r
134 f.setSize(1280,720);
\r
135 f.setLocation(0, 0);
\r
136 f.setContentPane(this);
\r
137 f.setDefaultCloseOperation(f.DISPOSE_ON_CLOSE);
\r
138 f.setVisible(true);
\r