]> git.gag.com Git - debian/openrocket/blobdiff - core/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java
create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / file / openrocket / OpenRocketSaver.java
index c04cce9b2d0bdb0fc94ff76ce882441ac94891e7..0a5e04790caa407459640e5ef3d95ddd0abf59a7 100644 (file)
@@ -8,6 +8,7 @@ import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.zip.GZIPOutputStream;
 
 import net.sf.openrocket.aerodynamics.Warning;
@@ -18,6 +19,8 @@ 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;
@@ -26,6 +29,7 @@ import net.sf.openrocket.simulation.FlightDataBranch;
 import net.sf.openrocket.simulation.FlightDataType;
 import net.sf.openrocket.simulation.FlightEvent;
 import net.sf.openrocket.simulation.SimulationOptions;
+import net.sf.openrocket.simulation.customexpression.CustomExpression;
 import net.sf.openrocket.startup.Application;
 import net.sf.openrocket.util.BugException;
 import net.sf.openrocket.util.BuildProperties;
@@ -36,7 +40,7 @@ import net.sf.openrocket.util.TextUtil;
 public class OpenRocketSaver extends RocketSaver {
        private static final LogHelper log = Application.getLogger();
        
-
+       
        /**
         * Divisor used in converting an integer version to the point-represented version.
         * The integer version divided by this value is the major version and the remainder is
@@ -44,13 +48,13 @@ public class OpenRocketSaver extends RocketSaver {
         */
        public static final int FILE_VERSION_DIVISOR = 100;
        
-
+       
        private static final String OPENROCKET_CHARSET = "UTF-8";
        
        private static final String METHOD_PACKAGE = "net.sf.openrocket.file.openrocket.savers";
        private static final String METHOD_SUFFIX = "Saver";
        
-
+       
        // Estimated storage used by different portions
        // These have been hand-estimated from saved files
        private static final int BYTES_PER_COMPONENT_UNCOMPRESSED = 590;
@@ -60,7 +64,7 @@ public class OpenRocketSaver extends RocketSaver {
        private static final int BYTES_PER_DATAPOINT_UNCOMPRESSED = 350;
        private static final int BYTES_PER_DATAPOINT_COMPRESSED = 100;
        
-
+       
        private int indent;
        private Writer dest;
        
@@ -83,10 +87,10 @@ public class OpenRocketSaver extends RocketSaver {
                                (fileVersion / FILE_VERSION_DIVISOR) + "." + (fileVersion % FILE_VERSION_DIVISOR);
                log.debug("Storing file version " + fileVersionString);
                
-
+               
                this.indent = 0;
                
-
+               
                writeln("<?xml version='1.0' encoding='utf-8'?>");
                writeln("<openrocket version=\"" + fileVersionString + "\" creator=\"OpenRocket "
                                + BuildProperties.getVersion() + "\">");
@@ -97,6 +101,9 @@ public class OpenRocketSaver extends RocketSaver {
                
                writeln("");
                
+               // Save custom expressions;
+               saveCustomDatatypes(document);
+               
                // Save all simulations
                writeln("<simulations>");
                indent++;
@@ -120,8 +127,42 @@ public class OpenRocketSaver extends RocketSaver {
                }
        }
        
+       /*
+        * Save all the custom expressions
+        */
+       private void saveCustomDatatypes(OpenRocketDocument doc) throws IOException {
+               
+               if (doc.getCustomExpressions().isEmpty())
+                       return;
+               
+               writeln("<datatypes>");
+               indent++;
+               
+               for (CustomExpression exp : doc.getCustomExpressions()) {
+                       saveCustomExpressionDatatype(exp);
+               }
+               
+               indent--;
+               writeln("</datatypes>");
+               writeln("");
+       }
+       
+       /*
+        * Save one custom expression datatype
+        */
+       private void saveCustomExpressionDatatype(CustomExpression exp) throws IOException {
+               // Write out custom expression
+               
+               writeln("<type source=\"customexpression\">");
+               indent++;
+               writeln("<name>" + exp.getName() + "</name>");
+               writeln("<symbol>" + exp.getSymbol() + "</symbol>");
+               writeln("<unit unittype=\"auto\">" + exp.getUnit() + "</unit>"); // auto unit type means it will be determined from string
+               writeln("<expression>" + exp.getExpressionString() + "</expression>");
+               indent--;
+               writeln("</type>");
+       }
        
-
        @Override
        public long estimateFileSize(OpenRocketDocument doc, StorageOptions options) {
                
@@ -141,14 +182,14 @@ public class OpenRocketSaver extends RocketSaver {
                else
                        size += componentCount * BYTES_PER_COMPONENT_UNCOMPRESSED;
                
-
+               
                // Size per simulation
                if (options.isCompressionEnabled())
                        size += doc.getSimulationCount() * BYTES_PER_SIMULATION_COMPRESSED;
                else
                        size += doc.getSimulationCount() * BYTES_PER_SIMULATION_UNCOMPRESSED;
                
-
+               
                // Size per flight data point
                int pointCount = 0;
                double timeSkip = options.getSimulationTimeSkip();
@@ -183,7 +224,13 @@ public class OpenRocketSaver extends RocketSaver {
         */
        private int calculateNecessaryFileVersion(OpenRocketDocument document, StorageOptions opts) {
                /*
-                * File version 1.2 is required for:
+                * File version 1.5 is requires for:
+                *  - saving designs using ComponentPrests
+                *  - recovery device deployment on lower stage separation
+                *  - custom expressions
+                *  
+                * File version 1.4 is required for:
+                *  - saving simulation data
                 *  - saving motor data
                 * 
                 * File version 1.1 is required for:
@@ -192,32 +239,48 @@ public class OpenRocketSaver extends RocketSaver {
                 * 
                 * Otherwise use version 1.0.
                 */
-
-               // Check if design has simulations defined (version 1.3)
+               
+               // 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 for custom expressions
+               if (!document.getCustomExpressions().isEmpty()) {
+                       return FILE_VERSION_DIVISOR + 5;
+               }
+               
+               // Check if design has simulations defined (version 1.4)
                if (document.getSimulationCount() > 0) {
-                       return FILE_VERSION_DIVISOR + 3;
+                       return FILE_VERSION_DIVISOR + 4;
                }
                
-               // Check for motor definitions (version 1.2)
-               Iterator<RocketComponent> iterator = document.getRocket().iterator();
-               while (iterator.hasNext()) {
-                       RocketComponent c = iterator.next();
+               // Check for motor definitions (version 1.4)
+               for (RocketComponent c : document.getRocket()) {
                        if (!(c instanceof MotorMount))
                                continue;
                        
                        MotorMount mount = (MotorMount) c;
                        for (String id : document.getRocket().getMotorConfigurationIDs()) {
                                if (mount.getMotor(id) != null) {
-                                       return FILE_VERSION_DIVISOR + 2;
+                                       return FILE_VERSION_DIVISOR + 4;
                                }
                        }
                }
                
                // 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;
@@ -240,7 +303,7 @@ public class OpenRocketSaver extends RocketSaver {
        }
        
        
-
+       
        @SuppressWarnings("unchecked")
        private void saveComponent(RocketComponent component) throws IOException {
                
@@ -303,8 +366,10 @@ 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++;
                
@@ -317,7 +382,7 @@ public class OpenRocketSaver extends RocketSaver {
                writeElement("launchaltitude", cond.getLaunchAltitude());
                writeElement("launchlatitude", cond.getLaunchLatitude());
                writeElement("launchlongitude", cond.getLaunchLongitude());
-               writeElement("geodeticmethod", cond.getGeodeticComputation().name().toLowerCase());
+               writeElement("geodeticmethod", cond.getGeodeticComputation().name().toLowerCase(Locale.ENGLISH));
                
                if (cond.isISAAtmosphere()) {
                        writeln("<atmosphere model=\"isa\"/>");
@@ -335,12 +400,11 @@ public class OpenRocketSaver extends RocketSaver {
                indent--;
                writeln("</conditions>");
                
-
+               
                for (String s : simulation.getSimulationListeners()) {
                        writeElement("listener", escapeXML(s));
                }
                
-
                // Write basic simulation data
                
                FlightData data = simulation.getSimulatedData();
@@ -393,7 +457,7 @@ public class OpenRocketSaver extends RocketSaver {
        }
        
        
-
+       
        private void saveFlightDataBranch(FlightDataBranch branch, double timeSkip)
                        throws IOException {
                double previousTime = -100000;
@@ -418,6 +482,17 @@ public class OpenRocketSaver extends RocketSaver {
                StringBuilder sb = new StringBuilder();
                sb.append("<databranch name=\"");
                sb.append(escapeXML(branch.getBranchName()));
+               
+               // Kevins version where typekeys are used
+               /*
+               sb.append("\" typekeys=\"");
+               for (int i = 0; i < types.length; i++) {
+                       if (i > 0)
+                               sb.append(",");
+                       sb.append(escapeXML(types[i].getKey()));
+               }
+               */
+               
                sb.append("\" types=\"");
                for (int i = 0; i < types.length; i++) {
                        if (i > 0)
@@ -462,7 +537,7 @@ public class OpenRocketSaver extends RocketSaver {
        }
        
        
-
+       
        /* TODO: LOW: This is largely duplicated from above! */
        private int countFlightDataBranchPoints(FlightDataBranch branch, double timeSkip) {
                int count = 0;
@@ -506,7 +581,7 @@ public class OpenRocketSaver extends RocketSaver {
        }
        
        
-
+       
        private void writeDataPointString(List<List<Double>> data, int index, StringBuilder sb)
                        throws IOException {
                sb.setLength(0);
@@ -521,7 +596,7 @@ public class OpenRocketSaver extends RocketSaver {
        }
        
        
-
+       
        private void writeElement(String element, Object content) throws IOException {
                if (content == null)
                        content = "";
@@ -529,7 +604,7 @@ public class OpenRocketSaver extends RocketSaver {
        }
        
        
-
+       
        private void writeln(String str) throws IOException {
                if (str.length() == 0) {
                        dest.write("\n");
@@ -543,8 +618,8 @@ public class OpenRocketSaver extends RocketSaver {
        }
        
        
-
-
+       
+       
        /**
         * Return the XML equivalent of an enum name.
         * 
@@ -552,7 +627,7 @@ public class OpenRocketSaver extends RocketSaver {
         * @return              the corresponding XML name.
         */
        public static String enumToXMLName(Enum<?> e) {
-               return e.name().toLowerCase().replace("_", "");
+               return e.name().toLowerCase(Locale.ENGLISH).replace("_", "");
        }
        
 }