create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / file / rocksim / export / BasePartDTO.java
index 9f87a41403029cf5411e86ab371a1224e03e53fc..102f364377646ecd2e2fd45a09bb7a0627722e44 100644 (file)
@@ -7,7 +7,6 @@ import net.sf.openrocket.file.rocksim.RocksimLocationMode;
 import net.sf.openrocket.file.rocksim.importt.BaseHandler;
 import net.sf.openrocket.rocketcomponent.ExternalComponent;
 import net.sf.openrocket.rocketcomponent.FinSet;
-import net.sf.openrocket.rocketcomponent.MassObject;
 import net.sf.openrocket.rocketcomponent.RecoveryDevice;
 import net.sf.openrocket.rocketcomponent.RingComponent;
 import net.sf.openrocket.rocketcomponent.RocketComponent;
@@ -25,6 +24,12 @@ import javax.xml.bind.annotation.XmlRootElement;
 @XmlAccessorType(XmlAccessType.FIELD)
 public abstract class BasePartDTO {
 
+    /**
+     * The very important Rocksim serial number.  Each component needs one.  This is not multi-thread safe.  Trying
+     * to save multiple files at the same time will have unpredictable results with respect to the serial numbering.
+     */
+    private static int currentSerialNumber = 1;
+
     @XmlElement(name = RocksimCommonConstants.KNOWN_MASS)
     private double knownMass = 0d;
     @XmlElement(name = RocksimCommonConstants.DENSITY)
@@ -55,11 +60,14 @@ public abstract class BasePartDTO {
     private double len = 0d;
     @XmlElement(name = RocksimCommonConstants.FINISH_CODE)
     private int finishCode = 0;
+    @XmlElement(name = RocksimCommonConstants.SERIAL_NUMBER)
+    private int serialNumber = -1;
 
     /**
      * Default constructor.
      */
     protected BasePartDTO() {
+        serialNumber = currentSerialNumber++;
     }
 
     /**
@@ -68,10 +76,11 @@ public abstract class BasePartDTO {
      * @param ec
      */
     protected BasePartDTO(RocketComponent ec) {
+        serialNumber = currentSerialNumber++;
         setCalcCG(ec.getCG().x * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
         setCalcMass(ec.getComponentMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
         setKnownCG(ec.getOverrideCGX() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
-        setKnownMass(ec.getOverrideMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
+        setKnownMass(ec.getMass() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS);
 
         if (! (ec instanceof FinSet)) {
             setLen(ec.getLength() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
@@ -136,11 +145,6 @@ public abstract class BasePartDTO {
             setRadialAngle(rc.getRadialDirection());
             setRadialLoc(rc.getRadialPosition() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
         }
-        else if (ec instanceof MassObject) {
-            MassObject rc = (MassObject)ec;
-            setRadialAngle(rc.getRadialDirection());
-            setRadialLoc(rc.getRadialPosition() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
-        }
     }
 
     public Double getKnownMass() {
@@ -263,4 +267,14 @@ public abstract class BasePartDTO {
         finishCode = theFinishCode;
     }
 
+    public static int getCurrentSerialNumber() {
+        return currentSerialNumber - 1;
+    }
+
+    /**
+     * Reset the serial number, which needs to happen after each file save.
+     */
+    public static void resetCurrentSerialNumber() {
+        currentSerialNumber = 0;
+    }
 }