De-localize Material and FlightDataType objects when persisting in ork files. Added...
[debian/openrocket] / core / src / net / sf / openrocket / file / openrocket / OpenRocketSaver.java
index 7ad6c6af7714e1799406c3d3e962a7d234ffcedf..e7e42c85b5b3f3c0ccfe34edca88ebc18d035d14 100644 (file)
@@ -19,9 +19,12 @@ import net.sf.openrocket.file.RocketSaver;
 import net.sf.openrocket.logging.LogHelper;
 import net.sf.openrocket.rocketcomponent.FinSet;
 import net.sf.openrocket.rocketcomponent.MotorMount;
+import net.sf.openrocket.rocketcomponent.RecoveryDevice;
+import net.sf.openrocket.rocketcomponent.RecoveryDevice.DeployEvent;
 import net.sf.openrocket.rocketcomponent.Rocket;
 import net.sf.openrocket.rocketcomponent.RocketComponent;
 import net.sf.openrocket.rocketcomponent.TubeCoupler;
+import net.sf.openrocket.simulation.CustomExpression;
 import net.sf.openrocket.simulation.FlightData;
 import net.sf.openrocket.simulation.FlightDataBranch;
 import net.sf.openrocket.simulation.FlightDataType;
@@ -186,6 +189,7 @@ public class OpenRocketSaver extends RocketSaver {
                /*
                 * File version 1.5 is requires for:
                 *  - saving designs using ComponentPrests
+                *  - recovery device deployment on lower stage separation
                 *  
                 * File version 1.4 is required for:
                 *  - saving simulation data
@@ -198,31 +202,29 @@ public class OpenRocketSaver extends RocketSaver {
                 * Otherwise use version 1.0.
                 */
                
-               // Search the rocket for any ComponentPrests
-               {
-                       Rocket r = document.getRocket();
-                       Iterator<RocketComponent> componentIterator = r.iterator();
-                       boolean usesComponentPreset = false;
-                       while ( !usesComponentPreset && componentIterator.hasNext() ) {
-                               RocketComponent c = componentIterator.next();
-                               if ( c.getPresetComponent() != null ) {
-                                       usesComponentPreset = true;
-                               }
-                       }
-                       if ( usesComponentPreset ) {
+               // Search the rocket for any ComponentPresets (version 1.5)
+               for (RocketComponent c : document.getRocket()) {
+                       if (c.getPresetComponent() != null) {
                                return FILE_VERSION_DIVISOR + 5;
                        }
                }
                
+               // Search for recovery device deployment type LOWER_STAGE_SEPARATION (version 1.5)
+               for (RocketComponent c : document.getRocket()) {
+                       if (c instanceof RecoveryDevice) {
+                               if (((RecoveryDevice) c).getDeployEvent() == DeployEvent.LOWER_STAGE_SEPARATION) {
+                                       return FILE_VERSION_DIVISOR + 5;
+                               }
+                       }
+               }
+               
                // Check if design has simulations defined (version 1.4)
                if (document.getSimulationCount() > 0) {
                        return FILE_VERSION_DIVISOR + 4;
                }
                
                // Check for motor definitions (version 1.4)
-               Iterator<RocketComponent> iterator = document.getRocket().iterator();
-               while (iterator.hasNext()) {
-                       RocketComponent c = iterator.next();
+               for (RocketComponent c : document.getRocket()) {
                        if (!(c instanceof MotorMount))
                                continue;
                        
@@ -235,10 +237,7 @@ public class OpenRocketSaver extends RocketSaver {
                }
                
                // Check for fin tabs (version 1.1)
-               iterator = document.getRocket().iterator();
-               while (iterator.hasNext()) {
-                       RocketComponent c = iterator.next();
-                       
+               for (RocketComponent c : document.getRocket()) {
                        // Check for fin tabs
                        if (c instanceof FinSet) {
                                FinSet fin = (FinSet) c;
@@ -324,10 +323,25 @@ public class OpenRocketSaver extends RocketSaver {
                
                writeln("<name>" + escapeXML(simulation.getName()) + "</name>");
                // TODO: MEDIUM: Other simulators/calculators
+               
                writeln("<simulator>RK4Simulator</simulator>");
                writeln("<calculator>BarrowmanCalculator</calculator>");
-               writeln("<conditions>");
-               indent++;
+               
+               // Write out custom expressions
+               if (!simulation.getCustomExpressions().isEmpty()){
+                       writeln("<customexpressions>"); indent++;
+                       for (CustomExpression expression : simulation.getCustomExpressions()){
+                               writeln("<expression>"); indent++;
+                               writeElement("name", expression.getName());
+                               writeElement("symbol", expression.getSymbol());
+                               writeElement("unit", expression.getUnit());
+                               writeElement("expressionstring", expression.getExpressionString());
+                               indent--; writeln("</expression>");
+                       }
+                       indent--; writeln("</customexpressions>");
+               }
+               
+               writeln("<conditions>"); indent++;
                
                writeElement("configid", cond.getMotorConfigurationID());
                writeElement("launchrodlength", cond.getLaunchRodLength());
@@ -361,7 +375,6 @@ public class OpenRocketSaver extends RocketSaver {
                        writeElement("listener", escapeXML(s));
                }
                
-               
                // Write basic simulation data
                
                FlightData data = simulation.getSimulatedData();
@@ -439,6 +452,14 @@ public class OpenRocketSaver extends RocketSaver {
                StringBuilder sb = new StringBuilder();
                sb.append("<databranch name=\"");
                sb.append(escapeXML(branch.getBranchName()));
+               
+               
+               sb.append("\" typekeys=\"");
+               for (int i = 0; i < types.length; i++) {
+                       if (i > 0)
+                               sb.append(",");
+                       sb.append(types[i].getKey());
+               }
                sb.append("\" types=\"");
                for (int i = 0; i < types.length; i++) {
                        if (i > 0)