Did the bits I needed so you can open a rocket AFTER you open motors and it still...
authorBill Kuker <bkuker@billkuker.com>
Tue, 24 Jan 2012 15:33:59 +0000 (15:33 +0000)
committerBill Kuker <bkuker@billkuker.com>
Tue, 24 Jan 2012 15:33:59 +0000 (15:33 +0000)
gpl/com/billkuker/rocketry/motorsim/visual/openRocket/OneMotorDatabase.java
gpl/com/billkuker/rocketry/motorsim/visual/openRocket/RocketSimTable.java
gpl/com/billkuker/rocketry/motorsim/visual/openRocket/Test.java

index 0c6a69f9c8d3773cfa98bff456d680f79018901d..cdd31d67bc875b42e4200c82a4e23debce7545b8 100644 (file)
@@ -30,6 +30,8 @@ public class OneMotorDatabase implements MotorDatabase {
        static Coordinate cg[];\r
        static double[] time;\r
        static double[] thrust;\r
+       \r
+       static Object lock = new Object();\r
 \r
        static Motor motor = new Motor() {\r
 \r
index b267a46bf8a05ce3ae3eee755db2c493d29eaf19..445991c75458459849be8b52bfe5be0d5f451433 100644 (file)
@@ -6,8 +6,10 @@ import java.awt.Component;
 import java.awt.event.MouseAdapter;\r
 import java.awt.event.MouseEvent;\r
 import java.io.File;\r
+import java.util.HashSet;\r
 import java.util.Iterator;\r
 import java.util.List;\r
+import java.util.Set;\r
 import java.util.Vector;\r
 \r
 import javax.measure.unit.SI;\r
@@ -68,7 +70,6 @@ public class RocketSimTable extends JPanel implements BurnWatcher,
                Burn b;\r
        }\r
 \r
-       List<Entry> entries = new Vector<Entry>();\r
 \r
        class TM extends AbstractTableModel {\r
                private static final long serialVersionUID = 1L;\r
@@ -144,6 +145,8 @@ public class RocketSimTable extends JPanel implements BurnWatcher,
        private TM tm = new TM();\r
        private JTable table = new JTable(tm);\r
        private OpenRocketDocument doc;\r
+       List<Entry> entries = new Vector<Entry>();\r
+       Set<Burn> burns = new HashSet<Burn>();\r
 \r
        public RocketSimTable() {\r
                setLayout(new BorderLayout());\r
@@ -200,32 +203,44 @@ public class RocketSimTable extends JPanel implements BurnWatcher,
                JLabel name = new JLabel("File: " + f.getAbsolutePath());\r
                rocketInfo.add(name);\r
                add(rocketInfo, BorderLayout.NORTH);\r
+               \r
+               entries = new Vector<Entry>();\r
+               for ( Burn b : burns ){\r
+                       entries.add(toEntry(b));\r
+               }\r
+               tm.fireTableDataChanged();\r
                revalidate();\r
        }\r
 \r
-       private Entry toEntry(Burn b) {\r
+       private Entry toEntry(final Burn b) {\r
                final Entry e = new Entry(b.getMotor(), doc.getSimulation(0).copy(), b);\r
-               OneMotorDatabase.setBurn(b);\r
-\r
-               e.s.getConfiguration().getMotorConfigurationID();\r
-               Iterator<RocketComponent> iterator = doc.getRocket().iterator();\r
-               while (iterator.hasNext()) {\r
-                       RocketComponent c = iterator.next();\r
-                       if (c instanceof MotorMount) {\r
-                               ((MotorMount) c).setMotorDelay(e.s.getConfiguration()\r
-                                               .getMotorConfigurationID(), b.getMotor()\r
-                                               .getEjectionDelay().doubleValue(SI.SECOND));\r
-                       }\r
-               }\r
-\r
                tm.fireTableDataChanged();\r
                new Thread() {\r
                        @Override\r
                        public void run() {\r
                                try {\r
-                                       e.s.simulate();\r
-                                       e.ready = true;\r
-                                       tm.fireTableDataChanged();\r
+                                       synchronized (OneMotorDatabase.lock) {\r
+\r
+                                               OneMotorDatabase.setBurn(b);\r
+\r
+                                               e.s.getConfiguration().getMotorConfigurationID();\r
+                                               Iterator<RocketComponent> iterator = doc.getRocket()\r
+                                                               .iterator();\r
+                                               while (iterator.hasNext()) {\r
+                                                       RocketComponent c = iterator.next();\r
+                                                       if (c instanceof MotorMount) {\r
+                                                               ((MotorMount) c).setMotorDelay(e.s\r
+                                                                               .getConfiguration()\r
+                                                                               .getMotorConfigurationID(), b\r
+                                                                               .getMotor().getEjectionDelay()\r
+                                                                               .doubleValue(SI.SECOND));\r
+                                                       }\r
+                                               }\r
+\r
+                                               e.s.simulate();\r
+                                               e.ready = true;\r
+                                               tm.fireTableDataChanged();\r
+                                       }\r
                                } catch (SimulationException e1) {\r
                                        e1.printStackTrace();\r
                                }\r
@@ -238,6 +253,9 @@ public class RocketSimTable extends JPanel implements BurnWatcher,
 \r
        @Override\r
        public void replace(Burn oldBurn, Burn newBurn) {\r
+               burns.add(newBurn);\r
+               burns.remove(oldBurn);\r
+               \r
                if (doc == null) {\r
                        return; // TODO, deal with changing rockets\r
                }\r
index e4fb4f3ccfed3a8bf92c9776e871f1200ca3003f..a1a2d191bc82c2218ac5452abbf2ffbbc4ea7725 100644 (file)
@@ -25,7 +25,7 @@ public class Test {
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r
 \r
                RocketSimTable st = new RocketSimTable();\r
-               st.openRocket(new File("simple.ork"));\r
+\r
 \r
                com.billkuker.rocketry.motorsim.Motor m = new PVC9();\r
                m.setEjectionDelay(Amount.valueOf(1, SI.SECOND));\r
@@ -33,8 +33,12 @@ public class Test {
                b.burn();\r
                st.replace(null, b);\r
 \r
+               st.openRocket(new File("simple.ork"));\r
+               \r
                frame.setContentPane(st);\r
                frame.setVisible(true);\r
+               \r
+\r
 \r
        }\r
 \r