DGP - updated Rocksim export to support clusters
[debian/openrocket] / core / src / net / sf / openrocket / file / rocksim / export / InnerBodyTubeDTO.java
1 package net.sf.openrocket.file.rocksim.export;
2
3 import net.sf.openrocket.file.rocksim.RocksimCommonConstants;
4 import net.sf.openrocket.rocketcomponent.BodyTube;
5 import net.sf.openrocket.rocketcomponent.Bulkhead;
6 import net.sf.openrocket.rocketcomponent.CenteringRing;
7 import net.sf.openrocket.rocketcomponent.ClusterConfiguration;
8 import net.sf.openrocket.rocketcomponent.EngineBlock;
9 import net.sf.openrocket.rocketcomponent.InnerTube;
10 import net.sf.openrocket.rocketcomponent.MassObject;
11 import net.sf.openrocket.rocketcomponent.Parachute;
12 import net.sf.openrocket.rocketcomponent.RocketComponent;
13 import net.sf.openrocket.rocketcomponent.Streamer;
14 import net.sf.openrocket.rocketcomponent.Transition;
15 import net.sf.openrocket.rocketcomponent.TubeCoupler;
16 import net.sf.openrocket.util.Coordinate;
17
18 import javax.xml.bind.annotation.XmlAccessType;
19 import javax.xml.bind.annotation.XmlAccessorType;
20 import javax.xml.bind.annotation.XmlRootElement;
21 import java.util.List;
22
23 /**
24  */
25 @XmlRootElement(name = RocksimCommonConstants.BODY_TUBE)
26 @XmlAccessorType(XmlAccessType.FIELD)
27 public class InnerBodyTubeDTO extends BodyTubeDTO implements AttachedParts {
28
29     public InnerBodyTubeDTO() {
30         super.setInsideTube(true);
31     }
32
33     public InnerBodyTubeDTO(InnerTube bt, AttachedParts parent) {
34         super(bt);
35         setEngineOverhang(bt.getMotorOverhang() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
36         setID(bt.getInnerRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
37         setOD(bt.getOuterRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
38         setMotorDia((bt.getMotorMountDiameter() / 2) * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
39         setMotorMount(bt.isMotorMount());
40         setInsideTube(true);
41         setRadialAngle(bt.getRadialDirection());
42         setRadialLoc(bt.getRadialPosition() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
43
44             List<RocketComponent> children = bt.getChildren();
45             for (int i = 0; i < children.size(); i++) {
46                 RocketComponent rocketComponents = children.get(i);
47                 if (rocketComponents instanceof InnerTube) {
48                     final InnerTube innerTube = (InnerTube) rocketComponents;
49                     if (innerTube.getClusterCount() == 1) {
50                         attachedParts.add(new InnerBodyTubeDTO(innerTube, this));
51                     }
52                 } else if (rocketComponents instanceof BodyTube) {
53                     attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents));
54                 } else if (rocketComponents instanceof Transition) {
55                     attachedParts.add(new TransitionDTO((Transition) rocketComponents));
56                 } else if (rocketComponents instanceof EngineBlock) {
57                     attachedParts.add(new EngineBlockDTO((EngineBlock) rocketComponents));
58                 } else if (rocketComponents instanceof TubeCoupler) {
59                     attachedParts.add(new TubeCouplerDTO((TubeCoupler) rocketComponents));
60                 } else if (rocketComponents instanceof CenteringRing) {
61                     attachedParts.add(new CenteringRingDTO((CenteringRing) rocketComponents));
62                 } else if (rocketComponents instanceof Bulkhead) {
63                     attachedParts.add(new BulkheadDTO((Bulkhead) rocketComponents));
64                 } else if (rocketComponents instanceof Streamer) {
65                     attachedParts.add(new StreamerDTO((Streamer) rocketComponents));
66                 } else if (rocketComponents instanceof Parachute) {
67                     attachedParts.add(new ParachuteDTO((Parachute) rocketComponents));
68                 } else if (rocketComponents instanceof MassObject) {
69                     attachedParts.add(new MassObjectDTO((MassObject) rocketComponents));
70                 }
71             }
72
73         //Do the cluster.  For now this splits the cluster into separate tubes, which is how Rocksim represents it.
74         //The import (from Rocksim to OR) could be augmented to be more intelligent and try to determine if the
75         //co-located tubes are a cluster.
76         if (bt.getClusterConfiguration().getClusterCount() > 1) {
77             handleCluster(bt, parent);
78             parent.removeAttachedPart(this);
79         }
80     }
81
82     private void handleCluster(InnerTube it, AttachedParts p) {
83
84         Coordinate[] coords = {Coordinate.NUL};
85         coords = it.shiftCoordinates(coords);
86         for (int x = 0; x < coords.length; x++) {
87             InnerTube copy = (InnerTube) it.copy();
88             copy.setClusterConfiguration(ClusterConfiguration.SINGLE);
89             copy.setClusterRotation(0.0);
90             copy.setClusterScale(1.0);
91             copy.setRadialShift(coords[x].y, coords[x].z);
92             copy.setName(copy.getName() + " #" + (x + 1));
93             p.addAttachedPart(copy(copy, p));
94         }
95     }
96
97     private InnerBodyTubeDTO copy(InnerTube it, AttachedParts p) {
98         return new InnerBodyTubeDTO(it, p);
99     }
100
101     @Override
102     public void addAttachedPart(BasePartDTO part) {
103         attachedParts.add(part);
104     }
105
106     @Override
107     public void removeAttachedPart(BasePartDTO part) {
108         attachedParts.remove(part);
109     }
110 }