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.awt.geom.Area;
\r
10 import java.beans.PropertyChangeEvent;
\r
11 import java.beans.PropertyChangeListener;
\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
18 import org.jscience.physics.amount.Amount;
\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.Motor;
\r
25 import com.billkuker.rocketry.motorsim.Nozzle;
\r
26 import com.billkuker.rocketry.motorsim.visual.workbench.MotorEditor;
\r
28 public class HardwarePanel extends JPanel {
\r
29 private static final long serialVersionUID = 1L;
\r
33 private PropertyChangeListener repainter = new PropertyChangeListener(){
\r
34 public void propertyChange(PropertyChangeEvent evt) {
\r
39 public HardwarePanel(Motor m){
\r
41 Nozzle nozzle = m.getNozzle();
\r
42 Chamber chamber = m.getChamber();
\r
43 if ( nozzle instanceof ChangeListening.Subject ){
\r
44 ((ChangeListening.Subject)nozzle).addPropertyChangeListener(repainter);
\r
46 if ( chamber instanceof ChangeListening.Subject ){
\r
47 ((ChangeListening.Subject)chamber).addPropertyChangeListener(repainter);
\r
51 public void paint(Graphics g){
\r
53 Graphics2D g2d = (Graphics2D)g;
\r
54 g2d.translate(10, 10);
\r
56 g2d.setColor(Color.black);
\r
58 Nozzle nozzle = m.getNozzle();
\r
59 Chamber chamber = m.getChamber();
\r
61 Shape c = chamber.chamberShape();
\r
63 Shape n = nozzle.nozzleShape(Amount.valueOf(c.getBounds().getWidth(), SI.MILLIMETER));
\r
66 Rectangle cb = c.getBounds();
\r
67 Rectangle nb = n.getBounds();
\r
69 w = Math.max(cb.getWidth(), nb.getWidth());
\r
70 h = cb.getHeight() + nb.getHeight();
\r
73 mw = getHeight() - 10;
\r
74 mh = getWidth() - 10;
\r
79 s = Math.min(sw, sh);
\r
81 g2d.rotate(-Math.PI / 2);
\r
83 g2d.translate(0, -cb.getY() - 5);
\r
85 g2d.translate(-(getHeight()/(s*2)), 0);
\r
87 g2d.setStroke(new BasicStroke(1));
\r
90 g2d.translate(0, cb.getHeight());
\r
94 Shape grain = m.getGrain().getSideView(Amount.valueOf(0, SI.MILLIMETER));
\r
95 Shape grain2 = m.getGrain().getSideView(Amount.valueOf(1, SI.MILLIMETER));
\r
96 Area burning = new Area(grain);
\r
97 burning.subtract(new Area(grain2));
\r
98 Rectangle gb = grain.getBounds();
\r
99 double x = -gb.getMaxX() + gb.getWidth()/2.0;
\r
100 g2d.translate(x, -gb.getMaxY());
\r
102 g2d.setColor(Color.GRAY);
\r
104 g2d.setColor(Color.RED);
\r
108 public void showAsWindow(){
\r
109 JFrame f = new JFrame();
\r
110 f.setSize(220,250);
\r
111 f.setContentPane(this);
\r
112 f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
\r
113 f.setVisible(true);
\r
116 public static void main(String args[]) throws Exception{
\r
117 Motor m = MotorEditor.defaultMotor();
\r
118 new HardwarePanel(m).showAsWindow();
\r