Added some fun motor examples
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / visual / CrappyEditor.java
1 package com.billkuker.rocketry.motorsim.visual;\r
2 \r
3 import java.awt.BorderLayout;\r
4 import java.awt.FlowLayout;\r
5 import java.awt.event.ActionEvent;\r
6 import java.awt.event.ActionListener;\r
7 import java.beans.PropertyVetoException;\r
8 import java.io.IOException;\r
9 \r
10 import javax.measure.unit.SI;\r
11 import javax.swing.ButtonGroup;\r
12 import javax.swing.JButton;\r
13 import javax.swing.JFrame;\r
14 import javax.swing.JPanel;\r
15 import javax.swing.JRadioButton;\r
16 import javax.swing.JTabbedPane;\r
17 import javax.swing.UIManager;\r
18 \r
19 import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;\r
20 import org.fife.ui.rsyntaxtextarea.SyntaxConstants;\r
21 import org.jscience.physics.amount.Amount;\r
22 \r
23 import com.billkuker.rocketry.motorsim.Burn;\r
24 import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;\r
25 import com.billkuker.rocketry.motorsim.CylindricalChamber;\r
26 import com.billkuker.rocketry.motorsim.Motor;\r
27 import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;\r
28 import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
29 import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
30 import com.billkuker.rocketry.motorsim.grain.MultiGrain;\r
31 import com.billkuker.rocketry.motorsim.io.MotorIO;\r
32 import com.billkuker.rocketry.motorsim.motors.example.CSlot;\r
33 import com.billkuker.rocketry.motorsim.motors.example.EndBurner;\r
34 \r
35 public class CrappyEditor extends JFrame {\r
36         JTabbedPane tabs;\r
37 \r
38         public CrappyEditor() {\r
39                 setTitle("MotorSim v0.2");\r
40                 setSize(1024, 768);\r
41                 setDefaultCloseOperation(DISPOSE_ON_CLOSE);\r
42 \r
43 \r
44                 try {\r
45                         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());\r
46                 } catch (Exception e1) {\r
47                         e1.printStackTrace();\r
48                 }\r
49                 tabs = new JTabbedPane();\r
50                 setContentPane(tabs);\r
51                 tabs.addTab("Edit", new Editor(defaultMotor()));\r
52 \r
53         }\r
54 \r
55         private class Editor extends JPanel {\r
56                 RSyntaxTextArea text = new RSyntaxTextArea();\r
57 \r
58                 Editor(Motor m) {\r
59                         setLayout(new BorderLayout());\r
60                         add(text, BorderLayout.CENTER);\r
61                         JPanel buttons = new JPanel(new FlowLayout());\r
62 \r
63                         buttons.add(new JButton("Burn!") {\r
64                                 {\r
65                                         addActionListener(new ActionListener() {\r
66                                                 public void actionPerformed(ActionEvent arg0) {\r
67                                                         burn();\r
68                                                 }\r
69                                         });\r
70                                 }\r
71                         });\r
72 \r
73 \r
74                         JRadioButton s, n;\r
75                         buttons.add(s = new JRadioButton("SI"));\r
76                         buttons.add(n = new JRadioButton("NonSI"));\r
77                         ButtonGroup g = new ButtonGroup();\r
78                         g.add(s);\r
79                         g.add(n);\r
80                         s.setSelected(true);\r
81                         s.addActionListener(new ActionListener() {\r
82                                 public void actionPerformed(ActionEvent arg0) {\r
83                                         UnitPreference.preference = UnitPreference.SI;\r
84                                 }\r
85                         });\r
86                         n.addActionListener(new ActionListener() {\r
87                                 public void actionPerformed(ActionEvent arg0) {\r
88                                         UnitPreference.preference = UnitPreference.NONSI;\r
89                                 }\r
90                         });\r
91                         \r
92                         buttons.add(new JButton("End Burner Example") {\r
93                                 {\r
94                                         addActionListener(new ActionListener() {\r
95                                                 public void actionPerformed(ActionEvent arg0) {\r
96                                                                 tabs.addTab(getText(), new BurnPanel(new Burn(new EndBurner())));\r
97                                                 }\r
98                                         });\r
99                                 }\r
100                         });\r
101                         \r
102                         buttons.add(new JButton("C-Slot Example") {\r
103                                 {\r
104                                         addActionListener(new ActionListener() {\r
105                                                 public void actionPerformed(ActionEvent arg0) {\r
106                                                                 tabs.addTab(getText(), new BurnPanel(new Burn(new CSlot())));\r
107                                                 }\r
108                                         });\r
109                                 }\r
110                         });\r
111                         \r
112                         add(buttons, BorderLayout.SOUTH);\r
113                         text.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML);\r
114 \r
115                         try {\r
116                                 text.setText(MotorIO.writeMotor(m));\r
117                         } catch (IOException e) {\r
118                                 e.printStackTrace();\r
119                         }\r
120 \r
121                 }\r
122 \r
123                 private void burn() {\r
124                         try {\r
125                                 Motor m = MotorIO.readMotor(text.getText());\r
126                                 Burn b = new Burn(m);\r
127                                 tabs.addTab(m.getName() + " Output", new BurnPanel(b));\r
128                         } catch (IOException e) {\r
129                                 e.printStackTrace();\r
130                         }\r
131                 }\r
132         }\r
133 \r
134         private Motor defaultMotor() {\r
135                 Motor m = new Motor();\r
136                 m.setName("PVC9");\r
137                 m.setFuel(new KNSU());\r
138 \r
139                 CylindricalChamber c = new CylindricalChamber();\r
140                 c.setLength(Amount.valueOf(200, SI.MILLIMETER));\r
141                 c.setID(Amount.valueOf(25, SI.MILLIMETER));\r
142                 m.setChamber(c);\r
143 \r
144                 CoredCylindricalGrain g = new CoredCylindricalGrain();\r
145                 try {\r
146                         g.setLength(Amount.valueOf(70, SI.MILLIMETER));\r
147                         g.setOD(Amount.valueOf(23.5, SI.MILLIMETER));\r
148                         g.setID(Amount.valueOf(7.9375, SI.MILLIMETER));\r
149                 } catch (PropertyVetoException v) {\r
150                         throw new Error(v);\r
151                 }\r
152 \r
153                 m.setGrain(new MultiGrain(g, 2));\r
154 \r
155                 ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
156                 n.setThroatDiameter(Amount.valueOf(7.962, SI.MILLIMETER));\r
157                 n.setExitDiameter(Amount.valueOf(13.79, SI.MILLIMETER));\r
158                 n.setEfficiency(.85);\r
159                 m.setNozzle(n);\r
160 \r
161                 return m;\r
162         }\r
163         \r
164 \r
165         public static void main(String args[]) {\r
166                 new CrappyEditor().show();\r
167         }\r
168 }\r