1 package net.sf.openrocket.file.rocksim.export;
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;
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;
25 @XmlRootElement(name = RocksimCommonConstants.BODY_TUBE)
26 @XmlAccessorType(XmlAccessType.FIELD)
27 public class InnerBodyTubeDTO extends BodyTubeDTO {
29 public InnerBodyTubeDTO() {
30 super.setInsideTube(true);
33 public InnerBodyTubeDTO(InnerTube bt) {
37 public InnerBodyTubeDTO(InnerTube bt, boolean deep) {
39 setEngineOverhang(bt.getMotorOverhang() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
40 setID(bt.getInnerRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
41 setOD(bt.getOuterRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
42 setMotorDia((bt.getMotorMountDiameter() / 2) * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
43 setMotorMount(bt.isMotorMount());
45 setRadialAngle(bt.getRadialDirection());
46 setRadialLoc(bt.getRadialPosition() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
49 List<RocketComponent> children = bt.getChildren();
50 for (int i = 0; i < children.size(); i++) {
51 RocketComponent rocketComponents = children.get(i);
52 if (rocketComponents instanceof InnerTube) {
53 attachedParts.add(new InnerBodyTubeDTO((InnerTube) rocketComponents));
54 } else if (rocketComponents instanceof BodyTube) {
55 attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents));
56 } else if (rocketComponents instanceof Transition) {
57 attachedParts.add(new TransitionDTO((Transition) rocketComponents));
58 } else if (rocketComponents instanceof EngineBlock) {
59 attachedParts.add(new EngineBlockDTO((EngineBlock) rocketComponents));
60 } else if (rocketComponents instanceof TubeCoupler) {
61 attachedParts.add(new TubeCouplerDTO((TubeCoupler) rocketComponents));
62 } else if (rocketComponents instanceof CenteringRing) {
63 attachedParts.add(new CenteringRingDTO((CenteringRing) rocketComponents));
64 } else if (rocketComponents instanceof Bulkhead) {
65 attachedParts.add(new BulkheadDTO((Bulkhead) rocketComponents));
66 } else if (rocketComponents instanceof Streamer) {
67 attachedParts.add(new StreamerDTO((Streamer) rocketComponents));
68 } else if (rocketComponents instanceof Parachute) {
69 attachedParts.add(new ParachuteDTO((Parachute) rocketComponents));
70 } else if (rocketComponents instanceof MassObject) {
71 attachedParts.add(new MassObjectDTO((MassObject) rocketComponents));
76 //Do the cluster. For now this splits the cluster into separate tubes, which is how Rocksim represents it.
77 //The import (from Rocksim to OR) could be augmented to be more intelligent and try to determine if the
78 //co-located tubes are a cluster.
79 if (bt.getClusterConfiguration().getClusterCount() > 1) {
84 private void handleCluster(InnerTube it) {
86 Coordinate[] coords = {Coordinate.NUL};
87 coords = it.shiftCoordinates(coords);
88 for (int x = 0; x < coords.length; x++) {
89 InnerTube copy = (InnerTube) it.copy();
90 copy.setClusterConfiguration(ClusterConfiguration.SINGLE);
91 copy.setClusterRotation(0.0);
92 copy.setClusterScale(1.0);
93 copy.setRadialShift(coords[x].y, coords[x].z);
94 copy.setName(copy.getName() + " #" + (x + 1));
95 attachedParts.add(copy(copy));
99 private InnerBodyTubeDTO copy(InnerTube it) {
100 return new InnerBodyTubeDTO(it, false);