[#1321] Move tube coupler child components outside of parent in RockSim export

This commit is contained in:
SiboVG 2022-10-30 14:27:23 +01:00
parent e8d971a9df
commit 6c54ed5fbf
4 changed files with 98 additions and 39 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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));
}
}
}
}