1 package net.sf.openrocket.file.rocksim.export;
3 import net.sf.openrocket.document.OpenRocketDocument;
4 import net.sf.openrocket.document.StorageOptions;
5 import net.sf.openrocket.file.RocketSaver;
6 import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
7 import net.sf.openrocket.logging.LogHelper;
8 import net.sf.openrocket.masscalc.BasicMassCalculator;
9 import net.sf.openrocket.masscalc.MassCalculator;
10 import net.sf.openrocket.rocketcomponent.Configuration;
11 import net.sf.openrocket.rocketcomponent.Rocket;
12 import net.sf.openrocket.rocketcomponent.Stage;
13 import net.sf.openrocket.startup.Application;
15 import javax.xml.bind.JAXBContext;
16 import javax.xml.bind.Marshaller;
17 import java.io.BufferedWriter;
18 import java.io.IOException;
19 import java.io.OutputStream;
20 import java.io.OutputStreamWriter;
21 import java.io.StringWriter;
24 * This class is responsible for converting an OpenRocket design to a Rocksim design.
26 public class RocksimSaver extends RocketSaver {
29 private static final LogHelper log = Application.getLogger();
32 * This method marshals an OpenRocketDocument (OR design) to Rocksim-compliant XML.
34 * @param doc the OR design
36 * @return Rocksim-compliant XML
38 public String marshalToRocksim(OpenRocketDocument doc) {
41 JAXBContext binder = JAXBContext.newInstance(RocksimDocumentDTO.class);
42 Marshaller marshaller = binder.createMarshaller();
43 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
44 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
45 StringWriter sw = new StringWriter();
47 marshaller.marshal(toRocksimDocumentDTO(doc), sw);
49 } catch (Exception e) {
57 public void save(OutputStream dest, OpenRocketDocument doc, StorageOptions options) throws IOException {
58 log.info("Saving .rkt file");
60 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(dest, "UTF-8"));
61 writer.write(marshalToRocksim(doc));
67 public long estimateFileSize(OpenRocketDocument doc, StorageOptions options) {
68 return marshalToRocksim(doc).length();
72 * Root conversion method. It iterates over all subcomponents.
74 * @param doc the OR design
76 * @return a corresponding Rocksim representation
78 private RocksimDocumentDTO toRocksimDocumentDTO(OpenRocketDocument doc) {
79 RocksimDocumentDTO rsd = new RocksimDocumentDTO();
81 rsd.setDesign(toRocksimDesignDTO(doc.getRocket()));
86 private RocksimDesignDTO toRocksimDesignDTO(Rocket rocket) {
87 RocksimDesignDTO result = new RocksimDesignDTO();
88 result.setDesign(toRocketDesignDTO(rocket));
92 private RocketDesignDTO toRocketDesignDTO(Rocket rocket) {
93 RocketDesignDTO result = new RocketDesignDTO();
95 MassCalculator massCalc = new BasicMassCalculator();
97 final double cg = massCalc.getCG(new Configuration(rocket), MassCalculator.MassCalcType.NO_MOTORS).x *
98 RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
99 int stageCount = rocket.getStageCount();
100 if (stageCount == 3) {
101 result.setStage321CG(cg);
103 else if (stageCount == 2) {
104 result.setStage32CG(cg);
107 result.setStage3CG(cg);
110 result.setName(rocket.getName());
111 result.setStageCount(stageCount);
112 if (stageCount > 0) {
113 result.setStage3(toStageDTO(rocket.getChild(0).getStage(), result, 3));
115 if (stageCount > 1) {
116 result.setStage2(toStageDTO(rocket.getChild(1).getStage(), result, 2));
118 if (stageCount > 2) {
119 result.setStage1(toStageDTO(rocket.getChild(2).getStage(), result, 1));
124 private StageDTO toStageDTO(Stage stage, RocketDesignDTO designDTO, int stageNumber) {
125 return new StageDTO(stage, designDTO, stageNumber);