SR Fuel Editor, not integrated with motors
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / visual / NozzlePanel.java
1 package com.billkuker.rocketry.motorsim.visual;\r
2 \r
3 import java.awt.BasicStroke;\r
4 import java.awt.Color;\r
5 import java.awt.Graphics;\r
6 import java.awt.Graphics2D;\r
7 import java.awt.Rectangle;\r
8 import java.awt.Shape;\r
9 import java.beans.PropertyChangeEvent;\r
10 import java.beans.PropertyChangeListener;\r
11 \r
12 import javax.measure.unit.SI;\r
13 import javax.swing.JFrame;\r
14 import javax.swing.JPanel;\r
15 import javax.swing.WindowConstants;\r
16 \r
17 import org.jscience.physics.amount.Amount;\r
18 \r
19 import com.billkuker.rocketry.motorsim.ChangeListening;\r
20 import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;\r
21 import com.billkuker.rocketry.motorsim.Nozzle;\r
22 \r
23 public class NozzlePanel extends JPanel {\r
24         private static final long serialVersionUID = 1L;\r
25         private Nozzle nozzle;\r
26         public NozzlePanel(Nozzle n){\r
27                 nozzle = n;\r
28                 \r
29                 if ( n instanceof ChangeListening.Subject ){\r
30                         ((ChangeListening.Subject)n).addPropertyChangeListener(new PropertyChangeListener(){\r
31                                 public void propertyChange(PropertyChangeEvent evt) {\r
32                                         repaint();\r
33                                 }\r
34                         });\r
35                 }\r
36         }\r
37         \r
38         public void paint(Graphics g){\r
39                 super.paint(g);\r
40                 Graphics2D g2d = (Graphics2D)g;\r
41                 g2d.translate(10, 10);\r
42 \r
43                 g2d.setColor(Color.black);\r
44                 \r
45                 \r
46                 Shape a = nozzle.nozzleShape(Amount.valueOf(30, SI.MILLIMETER));\r
47                 \r
48                 Rectangle bounds = a.getBounds();\r
49                 double max = bounds.getWidth();\r
50                 if ( bounds.getHeight() > max )\r
51                         max = bounds.getHeight();\r
52                 \r
53                 g2d.scale(200 / max, 200 / max);\r
54                 g2d.translate(-bounds.getX(), -bounds.getY());\r
55                 \r
56                 g2d.setStroke(new BasicStroke(4*(float)max/200f));\r
57                 \r
58                 g2d.draw( a );\r
59         }\r
60         \r
61         public void showAsWindow(){\r
62                 JFrame f = new JFrame();\r
63                 f.setSize(220,250);\r
64                 f.setContentPane(this);\r
65                 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
66                 f.setVisible(true);\r
67         }\r
68         \r
69         public static void main(String args[]) throws Exception{\r
70                 ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
71                 n.setThroatDiameter(Amount.valueOf(5, SI.MILLIMETER));\r
72                 n.setExitDiameter(Amount.valueOf(9, SI.MILLIMETER));\r
73                 new Editor(n).showAsWindow();\r
74                 new NozzlePanel(n).showAsWindow();\r
75         }\r
76 }\r