DGP - updated Rocksim export to support clusters

This commit is contained in:
Doug Pedrick 2012-01-14 05:33:15 +00:00
parent c329a7d789
commit e5d891765e
4 changed files with 57 additions and 20 deletions

View File

@ -29,7 +29,7 @@ import java.util.List;
* Transition to a Rocksim Transition.
*/
@XmlAccessorType(XmlAccessType.FIELD)
public class AbstractTransitionDTO extends BasePartDTO {
public class AbstractTransitionDTO extends BasePartDTO implements AttachedParts {
@XmlElement(name = RocksimCommonConstants.SHAPE_CODE)
private int shapeCode = 1;
@ -80,7 +80,7 @@ public class AbstractTransitionDTO extends BasePartDTO {
for (int i = 0; i < children.size(); i++) {
RocketComponent rocketComponents = children.get(i);
if (rocketComponents instanceof InnerTube) {
attachedParts.add(new InnerBodyTubeDTO((InnerTube) rocketComponents));
attachedParts.add(new InnerBodyTubeDTO((InnerTube) rocketComponents, this));
} else if (rocketComponents instanceof BodyTube) {
attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents));
} else if (rocketComponents instanceof Transition) {
@ -136,4 +136,14 @@ public class AbstractTransitionDTO extends BasePartDTO {
public void setShapeParameter(double theShapeParameter) {
shapeParameter = theShapeParameter;
}
@Override
public void addAttachedPart(BasePartDTO part) {
attachedParts.add(part);
}
@Override
public void removeAttachedPart(BasePartDTO part) {
attachedParts.remove(part);
}
}

View File

@ -0,0 +1,9 @@
package net.sf.openrocket.file.rocksim.export;
/**
*/
public interface AttachedParts {
void removeAttachedPart(BasePartDTO part);
void addAttachedPart(BasePartDTO part);
}

View File

@ -30,7 +30,7 @@ import java.util.List;
*/
@XmlRootElement(name = RocksimCommonConstants.BODY_TUBE)
@XmlAccessorType(XmlAccessType.FIELD)
public class BodyTubeDTO extends BasePartDTO {
public class BodyTubeDTO extends BasePartDTO implements AttachedParts {
@XmlElement(name = RocksimCommonConstants.OD)
private double od = 0d;
@ -77,7 +77,11 @@ public class BodyTubeDTO extends BasePartDTO {
for (int i = 0; i < children.size(); i++) {
RocketComponent rocketComponents = children.get(i);
if (rocketComponents instanceof InnerTube) {
attachedParts.add(new InnerBodyTubeDTO((InnerTube) rocketComponents));
final InnerTube innerTube = (InnerTube) rocketComponents;
final InnerBodyTubeDTO innerBodyTubeDTO = new InnerBodyTubeDTO(innerTube, this);
if (innerTube.getClusterCount() == 1) {
attachedParts.add(innerBodyTubeDTO);
}
} else if (rocketComponents instanceof BodyTube) {
attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents));
} else if (rocketComponents instanceof Transition) {
@ -175,7 +179,13 @@ public class BodyTubeDTO extends BasePartDTO {
return attachedParts;
}
public void addAttachedParts(BasePartDTO thePart) {
@Override
public void addAttachedPart(BasePartDTO thePart) {
attachedParts.add(thePart);
}
}
@Override
public void removeAttachedPart(BasePartDTO part) {
attachedParts.remove(part);
}
}

View File

@ -24,17 +24,13 @@ import java.util.List;
*/
@XmlRootElement(name = RocksimCommonConstants.BODY_TUBE)
@XmlAccessorType(XmlAccessType.FIELD)
public class InnerBodyTubeDTO extends BodyTubeDTO {
public class InnerBodyTubeDTO extends BodyTubeDTO implements AttachedParts {
public InnerBodyTubeDTO() {
super.setInsideTube(true);
}
public InnerBodyTubeDTO(InnerTube bt) {
this(bt, true);
}
public InnerBodyTubeDTO(InnerTube bt, boolean deep) {
public InnerBodyTubeDTO(InnerTube bt, AttachedParts parent) {
super(bt);
setEngineOverhang(bt.getMotorOverhang() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
setID(bt.getInnerRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS);
@ -45,12 +41,14 @@ public class InnerBodyTubeDTO extends BodyTubeDTO {
setRadialAngle(bt.getRadialDirection());
setRadialLoc(bt.getRadialPosition() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH);
if (deep) {
List<RocketComponent> children = bt.getChildren();
for (int i = 0; i < children.size(); i++) {
RocketComponent rocketComponents = children.get(i);
if (rocketComponents instanceof InnerTube) {
attachedParts.add(new InnerBodyTubeDTO((InnerTube) rocketComponents));
final InnerTube innerTube = (InnerTube) rocketComponents;
if (innerTube.getClusterCount() == 1) {
attachedParts.add(new InnerBodyTubeDTO(innerTube, this));
}
} else if (rocketComponents instanceof BodyTube) {
attachedParts.add(new BodyTubeDTO((BodyTube) rocketComponents));
} else if (rocketComponents instanceof Transition) {
@ -71,17 +69,17 @@ public class InnerBodyTubeDTO extends BodyTubeDTO {
attachedParts.add(new MassObjectDTO((MassObject) rocketComponents));
}
}
}
//Do the cluster. For now this splits the cluster into separate tubes, which is how Rocksim represents it.
//The import (from Rocksim to OR) could be augmented to be more intelligent and try to determine if the
//co-located tubes are a cluster.
if (bt.getClusterConfiguration().getClusterCount() > 1) {
handleCluster(bt);
handleCluster(bt, parent);
parent.removeAttachedPart(this);
}
}
private void handleCluster(InnerTube it) {
private void handleCluster(InnerTube it, AttachedParts p) {
Coordinate[] coords = {Coordinate.NUL};
coords = it.shiftCoordinates(coords);
@ -92,11 +90,21 @@ public class InnerBodyTubeDTO extends BodyTubeDTO {
copy.setClusterScale(1.0);
copy.setRadialShift(coords[x].y, coords[x].z);
copy.setName(copy.getName() + " #" + (x + 1));
attachedParts.add(copy(copy));
p.addAttachedPart(copy(copy, p));
}
}
private InnerBodyTubeDTO copy(InnerTube it) {
return new InnerBodyTubeDTO(it, false);
private InnerBodyTubeDTO copy(InnerTube it, AttachedParts p) {
return new InnerBodyTubeDTO(it, p);
}
@Override
public void addAttachedPart(BasePartDTO part) {
attachedParts.add(part);
}
@Override
public void removeAttachedPart(BasePartDTO part) {
attachedParts.remove(part);
}
}