New panels.
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / grain / BurnPanel.java
1 package com.billkuker.rocketry.motorsim.grain;\r
2 \r
3 import java.awt.BorderLayout;\r
4 import java.text.NumberFormat;\r
5 \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
17 \r
18 import org.jscience.physics.amount.Amount;\r
19 \r
20 import com.billkuker.rocketry.motorsim.Burn;\r
21 import com.billkuker.rocketry.motorsim.visual.Chart;\r
22 \r
23 public class BurnPanel extends JPanel {\r
24         private Burn burn;\r
25         Chart<Duration, Pressure> pressure;\r
26         Chart<Duration, Force> thrust;\r
27         Chart<Pressure, Velocity> burnRate;\r
28         GrainPanel grain;\r
29         Amount<Duration> displayedTime = Amount.valueOf(0, SI.SECOND);\r
30         \r
31         public BurnPanel(Burn b){\r
32                 super( new BorderLayout() );\r
33                 burn = b;\r
34                 \r
35                 try {\r
36                         pressure = new Chart<Duration, Pressure>(\r
37                                         SI.SECOND,\r
38                                         SI.MEGA(SI.PASCAL),\r
39                                         b,\r
40                                         "pressure");\r
41                         pressure.setDomain(burn.getData().keySet());\r
42                         \r
43                         thrust = new Chart<Duration, Force>(\r
44                                         SI.SECOND,\r
45                                         SI.NEWTON,\r
46                                         b,\r
47                                         "thrust");\r
48                         thrust.setDomain(burn.getData().keySet());\r
49                         \r
50                         burnRate = new Chart<Pressure, Velocity>(\r
51                                         SI.MEGA(SI.PASCAL),\r
52                                         SI.METERS_PER_SECOND,\r
53                                         burn.getMotor().getFuel(),\r
54                                         "burnRate");\r
55                         burnRate.setDomain(\r
56                                         burnRate.new IntervalDomain(\r
57                                                         Amount.valueOf(0, SI.MEGA(SI.PASCAL)),\r
58                                                         Amount.valueOf(3, SI.MEGA(SI.PASCAL)),\r
59                                                         20\r
60                                                         ));\r
61                         \r
62                         \r
63                         JSplitPane tp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, thrust, pressure);\r
64                         tp.setDividerLocation(.5);\r
65                         tp.setResizeWeight(.5);\r
66                         \r
67                         grain = new GrainPanel(burn.getMotor().getGrain());\r
68                         \r
69                         JSplitPane grains = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, grain, burnRate);\r
70                         grains.setDividerLocation(.5);\r
71                         grains.setResizeWeight(.5);\r
72                         \r
73                         JSplitPane main = new JSplitPane(JSplitPane.VERTICAL_SPLIT, grains, tp);\r
74                         main.setDividerLocation(.5);\r
75                         main.setResizeWeight(.5);\r
76                         \r
77                         add( main, BorderLayout.CENTER );\r
78                         \r
79                         add( new SL(), BorderLayout.SOUTH);\r
80                         \r
81                 } catch (NoSuchMethodException e){\r
82                         throw new Error(e);\r
83                 }\r
84                 \r
85 \r
86         }\r
87         \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
91                 public SL(){\r
92                         addChangeListener(this);\r
93                         setMinimum(0);\r
94                         setMaximum(STEPS);\r
95                         setValue(0);\r
96                 }\r
97                 \r
98                 @Override\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
102                         \r
103                         //Find the nearest key in the data set\r
104                         displayedTime =burn.getData().tailMap(displayedTime).firstKey();\r
105                         \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
109                         \r
110                         pressure.mark(displayedTime);\r
111                         thrust.mark(displayedTime);\r
112                         \r
113                         grain.setDisplayedRegression(burn.getData().get(displayedTime).regression);\r
114                         \r
115                         burnRate.mark(burn.getData().get(displayedTime).chamberPressure);\r
116                         \r
117                         \r
118                         /*\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
126                         if ( xc != null )\r
127                                 xc.repaint();\r
128                         */\r
129                 }\r
130         }\r
131         \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
139         }\r
140 }\r