(no commit message)
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / visual / HardwarePanel.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.awt.geom.Area;\r
10 import java.beans.PropertyChangeEvent;\r
11 import java.beans.PropertyChangeListener;\r
12 \r
13 import javax.measure.unit.SI;\r
14 import javax.swing.JFrame;\r
15 import javax.swing.JPanel;\r
16 import javax.swing.WindowConstants;\r
17 \r
18 import org.jscience.physics.amount.Amount;\r
19 \r
20 import com.billkuker.rocketry.motorsim.Chamber;\r
21 import com.billkuker.rocketry.motorsim.ChangeListening;\r
22 import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;\r
23 import com.billkuker.rocketry.motorsim.CylindricalChamber;\r
24 import com.billkuker.rocketry.motorsim.Nozzle;\r
25 \r
26 public class HardwarePanel extends JPanel {\r
27         private static final long serialVersionUID = 1L;\r
28         private Nozzle nozzle;\r
29         private Chamber chamber;\r
30         \r
31         public HardwarePanel(Nozzle n, Chamber c){\r
32                 nozzle = n;\r
33                 chamber = c;\r
34                 if ( n instanceof ChangeListening.Subject ){\r
35                         ((ChangeListening.Subject)n).addPropertyChangeListener(new PropertyChangeListener(){\r
36                                 public void propertyChange(PropertyChangeEvent evt) {\r
37                                         repaint();\r
38                                 }\r
39                         });\r
40                 }\r
41                 if ( c instanceof ChangeListening.Subject ){\r
42                         ((ChangeListening.Subject)c).addPropertyChangeListener(new PropertyChangeListener(){\r
43                                 public void propertyChange(PropertyChangeEvent evt) {\r
44                                         repaint();\r
45                                 }\r
46                         });\r
47                 }\r
48         }\r
49         \r
50         public void paint(Graphics g){\r
51                 super.paint(g);\r
52                 Graphics2D g2d = (Graphics2D)g;\r
53                 g2d.translate(10, 10);\r
54 \r
55                 g2d.setColor(Color.black);\r
56                 \r
57                 Shape c = chamber.chamberShape();\r
58                 \r
59                 Shape n = nozzle.nozzleShape(((CylindricalChamber)chamber).getID());\r
60                 \r
61                 Rectangle cb = c.getBounds();\r
62                 Rectangle nb = n.getBounds();\r
63                 double w, h;\r
64                 w = Math.max(cb.getWidth(), nb.getWidth());\r
65                 h = cb.getHeight() + nb.getHeight();\r
66                 \r
67                 double mw, mh;\r
68                 mw = getWidth() - 10;\r
69                 mh = getHeight() - 10;\r
70                 \r
71                 double sw, sh, s;\r
72                 sw = mw / w;\r
73                 sh = mh / h;\r
74                 s = Math.min(sw, sh);\r
75                 \r
76                 g2d.translate(0, -cb.getY() - 5);\r
77                 g2d.scale(s, s);\r
78                 g2d.translate(-cb.getX(), 0);\r
79                 \r
80                 g2d.setStroke(new BasicStroke(1));\r
81                 g2d.draw( c );\r
82                 g2d.translate(0, cb.getHeight());\r
83                 \r
84                 g2d.draw(n);\r
85         }\r
86         \r
87         public void showAsWindow(){\r
88                 JFrame f = new JFrame();\r
89                 f.setSize(220,250);\r
90                 f.setContentPane(this);\r
91                 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
92                 f.setVisible(true);\r
93         }\r
94         \r
95         public static void main(String args[]) throws Exception{\r
96                 ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();\r
97                 CylindricalChamber c = new CylindricalChamber();\r
98                 n.setThroatDiameter(Amount.valueOf(10, SI.MILLIMETER));\r
99                 n.setExitDiameter(Amount.valueOf(20, SI.MILLIMETER));\r
100                 //new Editor(n).showAsWindow();\r
101                 new HardwarePanel(n,c).showAsWindow();\r
102         }\r
103 }\r