diff --git a/core/src/net/sf/openrocket/file/rocksim/export/AbstractTransitionDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/AbstractTransitionDTO.java index 82af6467e..4a2748be0 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/AbstractTransitionDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/AbstractTransitionDTO.java @@ -80,27 +80,27 @@ public class AbstractTransitionDTO extends BasePartDTO implements AttachablePart for (int i = 0; i < children.size(); i++) { RocketComponent rocketComponents = children.get(i); if (rocketComponents instanceof InnerTube) { - attachedParts.add(new InnerBodyTubeDTO((InnerTube) rocketComponents, this)); + addAttachedPart(new InnerBodyTubeDTO((InnerTube) rocketComponents, this)); } else if (rocketComponents instanceof BodyTube) { - attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents)); + addAttachedPart(new BodyTubeDTO((BodyTube) rocketComponents)); } else if (rocketComponents instanceof Transition) { - attachedParts.add(new TransitionDTO((Transition) rocketComponents)); + addAttachedPart(new TransitionDTO((Transition) rocketComponents)); } else if (rocketComponents instanceof EngineBlock) { - attachedParts.add(new EngineBlockDTO((EngineBlock) rocketComponents)); + addAttachedPart(new EngineBlockDTO((EngineBlock) rocketComponents)); } else if (rocketComponents instanceof TubeCoupler) { - attachedParts.add(new TubeCouplerDTO((TubeCoupler) rocketComponents)); + addAttachedPart(new TubeCouplerDTO((TubeCoupler) rocketComponents, this)); } else if (rocketComponents instanceof CenteringRing) { - attachedParts.add(new CenteringRingDTO((CenteringRing) rocketComponents)); + addAttachedPart(new CenteringRingDTO((CenteringRing) rocketComponents)); } else if (rocketComponents instanceof Bulkhead) { - attachedParts.add(new BulkheadDTO((Bulkhead) rocketComponents)); + addAttachedPart(new BulkheadDTO((Bulkhead) rocketComponents)); } else if (rocketComponents instanceof Parachute) { - attachedParts.add(new ParachuteDTO((Parachute) rocketComponents)); + addAttachedPart(new ParachuteDTO((Parachute) rocketComponents)); } else if (rocketComponents instanceof MassObject) { - attachedParts.add(new MassObjectDTO((MassObject) rocketComponents)); + addAttachedPart(new MassObjectDTO((MassObject) rocketComponents)); } else if (rocketComponents instanceof FreeformFinSet) { - attachedParts.add(new CustomFinSetDTO((FreeformFinSet) rocketComponents)); + addAttachedPart(new CustomFinSetDTO((FreeformFinSet) rocketComponents)); } else if (rocketComponents instanceof FinSet) { - attachedParts.add(new FinSetDTO((FinSet) rocketComponents)); + addAttachedPart(new FinSetDTO((FinSet) rocketComponents)); } } } @@ -139,7 +139,9 @@ public class AbstractTransitionDTO extends BasePartDTO implements AttachablePart @Override public void addAttachedPart(BasePartDTO part) { - attachedParts.add(part); + if (!attachedParts.contains(part)) { + attachedParts.add(part); + } } @Override diff --git a/core/src/net/sf/openrocket/file/rocksim/export/BodyTubeDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/BodyTubeDTO.java index dee6ceaa6..479b35132 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/BodyTubeDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/BodyTubeDTO.java @@ -97,34 +97,34 @@ public class BodyTubeDTO extends BasePartDTO implements AttachableParts { final InnerBodyTubeDTO innerBodyTubeDTO = new InnerBodyTubeDTO(innerTube, this); //Only add the inner tube if it is NOT a cluster. if (innerTube.getInstanceCount() == 1) { - attachedParts.add(innerBodyTubeDTO); + addAttachedPart(innerBodyTubeDTO); } } else if (rocketComponents instanceof BodyTube) { - attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents)); + addAttachedPart(new BodyTubeDTO((BodyTube) rocketComponents)); } else if (rocketComponents instanceof Transition) { - attachedParts.add(new TransitionDTO((Transition) rocketComponents)); + addAttachedPart(new TransitionDTO((Transition) rocketComponents)); } else if (rocketComponents instanceof EngineBlock) { - attachedParts.add(new EngineBlockDTO((EngineBlock) rocketComponents)); + addAttachedPart(new EngineBlockDTO((EngineBlock) rocketComponents)); } else if (rocketComponents instanceof TubeCoupler) { - attachedParts.add(new TubeCouplerDTO((TubeCoupler) rocketComponents)); + addAttachedPart(new TubeCouplerDTO((TubeCoupler) rocketComponents, this)); } else if (rocketComponents instanceof CenteringRing) { - attachedParts.add(new CenteringRingDTO((CenteringRing) rocketComponents)); + addAttachedPart(new CenteringRingDTO((CenteringRing) rocketComponents)); } else if (rocketComponents instanceof Bulkhead) { - attachedParts.add(new BulkheadDTO((Bulkhead) rocketComponents)); + addAttachedPart(new BulkheadDTO((Bulkhead) rocketComponents)); } else if (rocketComponents instanceof LaunchLug) { - attachedParts.add(new LaunchLugDTO((LaunchLug) rocketComponents)); + addAttachedPart(new LaunchLugDTO((LaunchLug) rocketComponents)); } else if (rocketComponents instanceof Streamer) { - attachedParts.add(new StreamerDTO((Streamer) rocketComponents)); + addAttachedPart(new StreamerDTO((Streamer) rocketComponents)); } else if (rocketComponents instanceof Parachute) { - attachedParts.add(new ParachuteDTO((Parachute) rocketComponents)); + addAttachedPart(new ParachuteDTO((Parachute) rocketComponents)); } else if (rocketComponents instanceof MassObject) { - attachedParts.add(new MassObjectDTO((MassObject) rocketComponents)); + addAttachedPart(new MassObjectDTO((MassObject) rocketComponents)); } else if (rocketComponents instanceof FreeformFinSet) { - attachedParts.add(new CustomFinSetDTO((FreeformFinSet) rocketComponents)); + addAttachedPart(new CustomFinSetDTO((FreeformFinSet) rocketComponents)); } else if (rocketComponents instanceof FinSet) { - attachedParts.add(new FinSetDTO((FinSet) rocketComponents)); + addAttachedPart(new FinSetDTO((FinSet) rocketComponents)); } else if (rocketComponents instanceof TubeFinSet) { - attachedParts.add(new TubeFinSetDTO((TubeFinSet) rocketComponents)); + addAttachedPart(new TubeFinSetDTO((TubeFinSet) rocketComponents)); } } } @@ -199,8 +199,10 @@ public class BodyTubeDTO extends BasePartDTO implements AttachableParts { } @Override - public void addAttachedPart(BasePartDTO thePart) { - attachedParts.add(thePart); + public void addAttachedPart(BasePartDTO part) { + if (!attachedParts.contains(part)) { + attachedParts.add(part); + } } @Override diff --git a/core/src/net/sf/openrocket/file/rocksim/export/InnerBodyTubeDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/InnerBodyTubeDTO.java index ee0ce37f8..f3d9463ad 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/InnerBodyTubeDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/InnerBodyTubeDTO.java @@ -63,26 +63,26 @@ public class InnerBodyTubeDTO extends BodyTubeDTO implements AttachableParts { //to the list of attached parts. If it is a cluster, then it is handled specially outside of this //loop. if (innerTube.getInstanceCount() == 1) { - attachedParts.add(new InnerBodyTubeDTO(innerTube, this)); + addAttachedPart(new InnerBodyTubeDTO(innerTube, this)); } } else if (rocketComponents instanceof BodyTube) { - attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents)); + addAttachedPart(new BodyTubeDTO((BodyTube) rocketComponents)); } else if (rocketComponents instanceof Transition) { - attachedParts.add(new TransitionDTO((Transition) rocketComponents)); + addAttachedPart(new TransitionDTO((Transition) rocketComponents)); } else if (rocketComponents instanceof EngineBlock) { - attachedParts.add(new EngineBlockDTO((EngineBlock) rocketComponents)); + addAttachedPart(new EngineBlockDTO((EngineBlock) rocketComponents)); } else if (rocketComponents instanceof TubeCoupler) { - attachedParts.add(new TubeCouplerDTO((TubeCoupler) rocketComponents)); + addAttachedPart(new TubeCouplerDTO((TubeCoupler) rocketComponents)); } else if (rocketComponents instanceof CenteringRing) { - attachedParts.add(new CenteringRingDTO((CenteringRing) rocketComponents)); + addAttachedPart(new CenteringRingDTO((CenteringRing) rocketComponents)); } else if (rocketComponents instanceof Bulkhead) { - attachedParts.add(new BulkheadDTO((Bulkhead) rocketComponents)); + addAttachedPart(new BulkheadDTO((Bulkhead) rocketComponents)); } else if (rocketComponents instanceof Streamer) { - attachedParts.add(new StreamerDTO((Streamer) rocketComponents)); + addAttachedPart(new StreamerDTO((Streamer) rocketComponents)); } else if (rocketComponents instanceof Parachute) { - attachedParts.add(new ParachuteDTO((Parachute) rocketComponents)); + addAttachedPart(new ParachuteDTO((Parachute) rocketComponents)); } else if (rocketComponents instanceof MassObject) { - attachedParts.add(new MassObjectDTO((MassObject) rocketComponents)); + addAttachedPart(new MassObjectDTO((MassObject) rocketComponents)); } } //Do the cluster. For now this splits the cluster into separate tubes, which is how Rocksim represents it. @@ -119,7 +119,9 @@ public class InnerBodyTubeDTO extends BodyTubeDTO implements AttachableParts { @Override public void addAttachedPart(BasePartDTO part) { - attachedParts.add(part); + if (!attachedParts.contains(part)) { + attachedParts.add(part); + } } @Override diff --git a/core/src/net/sf/openrocket/file/rocksim/export/TubeCouplerDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/TubeCouplerDTO.java index 84ee63095..be4d32a40 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/TubeCouplerDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/TubeCouplerDTO.java @@ -1,11 +1,26 @@ package net.sf.openrocket.file.rocksim.export; import net.sf.openrocket.file.rocksim.RockSimCommonConstants; +import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.Bulkhead; +import net.sf.openrocket.rocketcomponent.CenteringRing; +import net.sf.openrocket.rocketcomponent.EngineBlock; +import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.rocketcomponent.FreeformFinSet; +import net.sf.openrocket.rocketcomponent.InnerTube; +import net.sf.openrocket.rocketcomponent.MassObject; +import net.sf.openrocket.rocketcomponent.Parachute; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.Streamer; +import net.sf.openrocket.rocketcomponent.Transition; import net.sf.openrocket.rocketcomponent.TubeCoupler; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.util.ArrayList; +import java.util.List; /** * Conversion DTO for a TubeCoupler. TubeCoupler's are represented as Rings in Rocksim. @@ -23,4 +38,42 @@ public class TubeCouplerDTO extends CenteringRingDTO { super(tc); setUsageCode(UsageCode.TubeCoupler); } + + /** + * Full copy constructor. + * + * @param tc the corresponding OR tube coupler + * @param parent the attached parts (subcomponents in RockSim speak) of the TubeCoupler's parent. This instance + * is a member of those attached parts, as well as all sibling components. This is passed in the + * event that the tube coupler is a cluster. In that situation this instance will be removed and + * individual instances for each cluster member will be added. + */ + public TubeCouplerDTO(TubeCoupler tc, AttachableParts parent) { + super(tc); + setUsageCode(UsageCode.TubeCoupler); + + // Add this component first, then the children + parent.addAttachedPart(this); + + for (RocketComponent component : tc.getChildren()) { + component.setAxialMethod(AxialMethod.ABSOLUTE); + if (component instanceof InnerTube) { + parent.addAttachedPart(new InnerBodyTubeDTO((InnerTube) component, parent)); + } else if (component instanceof EngineBlock) { + parent.addAttachedPart(new EngineBlockDTO((EngineBlock) component)); + } else if (component instanceof TubeCoupler) { + new TubeCouplerDTO((TubeCoupler) component, parent); + } else if (component instanceof CenteringRing) { + parent.addAttachedPart(new CenteringRingDTO((CenteringRing) component)); + } else if (component instanceof Bulkhead) { + parent.addAttachedPart(new BulkheadDTO((Bulkhead) component)); + } else if (component instanceof Parachute) { + parent.addAttachedPart(new ParachuteDTO((Parachute) component)); + } else if (component instanceof Streamer) { + parent.addAttachedPart(new StreamerDTO((Streamer) component)); + } else if (component instanceof MassObject) { + parent.addAttachedPart(new MassObjectDTO((MassObject) component)); + } + } + } }