Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / file / rocksim / export / RocksimSaver.java
index 6ead563917785fb8dc69f088e5c3b4a9cc21a764..9d601efb287d80b466aba82960fad12c4958ac0d 100644 (file)
@@ -3,13 +3,13 @@ package net.sf.openrocket.file.rocksim.export;
 import net.sf.openrocket.document.OpenRocketDocument;
 import net.sf.openrocket.document.StorageOptions;
 import net.sf.openrocket.file.RocketSaver;
+import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
 import net.sf.openrocket.logging.LogHelper;
-import net.sf.openrocket.rocketcomponent.BodyTube;
-import net.sf.openrocket.rocketcomponent.NoseCone;
+import net.sf.openrocket.masscalc.BasicMassCalculator;
+import net.sf.openrocket.masscalc.MassCalculator;
+import net.sf.openrocket.rocketcomponent.Configuration;
 import net.sf.openrocket.rocketcomponent.Rocket;
-import net.sf.openrocket.rocketcomponent.RocketComponent;
 import net.sf.openrocket.rocketcomponent.Stage;
-import net.sf.openrocket.rocketcomponent.Transition;
 import net.sf.openrocket.startup.Application;
 
 import javax.xml.bind.JAXBContext;
@@ -19,21 +19,21 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.StringWriter;
-import java.util.List;
 
 /**
  * This class is responsible for converting an OpenRocket design to a Rocksim design.
  */
 public class RocksimSaver extends RocketSaver {
 
-    /** The logger. */
+    /**
+     * The logger.
+     */
     private static final LogHelper log = Application.getLogger();
 
     /**
      * This method marshals an OpenRocketDocument (OR design) to Rocksim-compliant XML.
      *
-     * @param doc  the OR design
-     *
+     * @param doc the OR design
      * @return Rocksim-compliant XML
      */
     public String marshalToRocksim(OpenRocketDocument doc) {
@@ -48,7 +48,7 @@ public class RocksimSaver extends RocketSaver {
             marshaller.marshal(toRocksimDocumentDTO(doc), sw);
             return sw.toString();
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("Could not marshall a design to Rocksim format. " + e.getMessage());
         }
 
         return null;
@@ -72,8 +72,7 @@ public class RocksimSaver extends RocketSaver {
     /**
      * Root conversion method.  It iterates over all subcomponents.
      *
-     * @param doc  the OR design
-     *
+     * @param doc the OR design
      * @return a corresponding Rocksim representation
      */
     private RocksimDocumentDTO toRocksimDocumentDTO(OpenRocketDocument doc) {
@@ -92,47 +91,39 @@ public class RocksimSaver extends RocketSaver {
 
     private RocketDesignDTO toRocketDesignDTO(Rocket rocket) {
         RocketDesignDTO result = new RocketDesignDTO();
-        result.setName(rocket.getName());
+
+        MassCalculator massCalc = new BasicMassCalculator();
+
+        final double cg = massCalc.getCG(new Configuration(rocket), MassCalculator.MassCalcType.NO_MOTORS).x *
+                RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
         int stageCount = rocket.getStageCount();
+        if (stageCount == 3) {
+            result.setStage321CG(cg);
+        } else if (stageCount == 2) {
+            result.setStage32CG(cg);
+        } else {
+            result.setStage3CG(cg);
+        }
+
+        result.setName(rocket.getName());
         result.setStageCount(stageCount);
         if (stageCount > 0) {
-            result.setStage3(toStageDTO(rocket.getChild(0).getStage()));
+            result.setStage3(toStageDTO(rocket.getChild(0).getStage(), result, 3));
         }
         if (stageCount > 1) {
-            result.setStage2(toStageDTO(rocket.getChild(1).getStage()));
+            result.setStage2(toStageDTO(rocket.getChild(1).getStage(), result, 2));
         }
         if (stageCount > 2) {
-            result.setStage1(toStageDTO(rocket.getChild(2).getStage()));
-        }
-        return result;
-    }
-
-    private StageDTO toStageDTO(Stage stage) {
-        StageDTO result = new StageDTO();
-
-        List<RocketComponent> children = stage.getChildren();
-        for (int i = 0; i < children.size(); i++) {
-            RocketComponent rocketComponents = children.get(i);
-            if (rocketComponents instanceof NoseCone) {
-                result.addExternalPart(toNoseConeDTO((NoseCone) rocketComponents));
-            } else if (rocketComponents instanceof BodyTube) {
-                result.addExternalPart(toBodyTubeDTO((BodyTube) rocketComponents));
-            } else if (rocketComponents instanceof Transition) {
-                result.addExternalPart(toTransitionDTO((Transition) rocketComponents));
-            }
+            result.setStage1(toStageDTO(rocket.getChild(2).getStage(), result, 1));
         }
+        //Set the last serial number element and reset it.
+        result.setLastSerialNumber(BasePartDTO.getCurrentSerialNumber());
+        BasePartDTO.resetCurrentSerialNumber();
         return result;
     }
 
-    private NoseConeDTO toNoseConeDTO(NoseCone nc) {
-        return new NoseConeDTO(nc);
-    }
-
-    private BodyTubeDTO toBodyTubeDTO(BodyTube bt) {
-        return new BodyTubeDTO(bt);
+    private StageDTO toStageDTO(Stage stage, RocketDesignDTO designDTO, int stageNumber) {
+        return new StageDTO(stage, designDTO, stageNumber);
     }
 
-    private TransitionDTO toTransitionDTO(Transition tran) {
-        return new TransitionDTO(tran);
-    }
 }