1 package com.billkuker.rocketry.motorsim.visual;
\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
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
17 import org.jscience.physics.amount.Amount;
\r
19 import com.billkuker.rocketry.motorsim.Chamber;
\r
20 import com.billkuker.rocketry.motorsim.ChangeListening;
\r
21 import com.billkuker.rocketry.motorsim.ConvergentDivergentNozzle;
\r
22 import com.billkuker.rocketry.motorsim.CylindricalChamber;
\r
23 import com.billkuker.rocketry.motorsim.Nozzle;
\r
25 public class HardwarePanel extends JPanel {
\r
26 private static final long serialVersionUID = 1L;
\r
27 private Nozzle nozzle;
\r
28 private Chamber chamber;
\r
30 public HardwarePanel(Nozzle n, Chamber c){
\r
33 if ( n instanceof ChangeListening.Subject ){
\r
34 ((ChangeListening.Subject)n).addPropertyChangeListener(new PropertyChangeListener(){
\r
35 public void propertyChange(PropertyChangeEvent evt) {
\r
40 if ( c instanceof ChangeListening.Subject ){
\r
41 ((ChangeListening.Subject)c).addPropertyChangeListener(new PropertyChangeListener(){
\r
42 public void propertyChange(PropertyChangeEvent evt) {
\r
49 public void paint(Graphics g){
\r
51 Graphics2D g2d = (Graphics2D)g;
\r
52 g2d.translate(10, 10);
\r
54 g2d.setColor(Color.black);
\r
56 Shape c = chamber.chamberShape();
\r
58 Shape n = nozzle.nozzleShape(((CylindricalChamber)chamber).getID());
\r
60 Rectangle cb = c.getBounds();
\r
61 Rectangle nb = n.getBounds();
\r
63 w = Math.max(cb.getWidth(), nb.getWidth());
\r
64 h = cb.getHeight() + nb.getHeight();
\r
67 mw = getHeight() - 10;
\r
68 mh = getWidth() - 10;
\r
73 s = Math.min(sw, sh);
\r
75 g2d.rotate(-Math.PI / 2);
\r
77 g2d.translate(0, -cb.getY() - 5);
\r
79 g2d.translate(-(getHeight()/(s*2)), 0);
\r
81 g2d.setStroke(new BasicStroke(1));
\r
83 g2d.translate(0, cb.getHeight());
\r
88 public void showAsWindow(){
\r
89 JFrame f = new JFrame();
\r
91 f.setContentPane(this);
\r
92 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
\r
96 public static void main(String args[]) throws Exception{
\r
97 ConvergentDivergentNozzle n = new ConvergentDivergentNozzle();
\r
98 CylindricalChamber c = new CylindricalChamber();
\r
99 n.setThroatDiameter(Amount.valueOf(10, SI.MILLIMETER));
\r
100 n.setExitDiameter(Amount.valueOf(20, SI.MILLIMETER));
\r
101 //new Editor(n).showAsWindow();
\r
102 new HardwarePanel(n,c).showAsWindow();
\r