[Feature] Implemented file saving for Parallel Stage auto-positioning.

radialoffset may be set to "auto" instead of a number.  In this case, the
radial offset of the stage will be auto positioned to just touch its
parent stage. (offset = radius_parent + radius_p-stage)
This commit is contained in:
Daniel_M_Williams 2015-11-22 10:41:24 -05:00
parent e3250c9a91
commit 52ee7ba750
4 changed files with 27 additions and 18 deletions

View File

@ -9,7 +9,6 @@ import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.rocketcomponent.AxialStage;
import net.sf.openrocket.rocketcomponent.BodyComponent;
import net.sf.openrocket.rocketcomponent.BodyTube;
import net.sf.openrocket.rocketcomponent.ParallelStage;
import net.sf.openrocket.rocketcomponent.Bulkhead;
import net.sf.openrocket.rocketcomponent.CenteringRing;
import net.sf.openrocket.rocketcomponent.DeploymentConfiguration;
@ -21,14 +20,15 @@ import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.FreeformFinSet;
import net.sf.openrocket.rocketcomponent.InnerTube;
import net.sf.openrocket.rocketcomponent.RailButton;
import net.sf.openrocket.rocketcomponent.LaunchLug;
import net.sf.openrocket.rocketcomponent.MassComponent;
import net.sf.openrocket.rocketcomponent.MassObject;
import net.sf.openrocket.rocketcomponent.NoseCone;
import net.sf.openrocket.rocketcomponent.Parachute;
import net.sf.openrocket.rocketcomponent.ParallelStage;
import net.sf.openrocket.rocketcomponent.PodSet;
import net.sf.openrocket.rocketcomponent.RadiusRingComponent;
import net.sf.openrocket.rocketcomponent.RailButton;
import net.sf.openrocket.rocketcomponent.RecoveryDevice;
import net.sf.openrocket.rocketcomponent.ReferenceType;
import net.sf.openrocket.rocketcomponent.RingComponent;
@ -91,6 +91,7 @@ class DocumentConfig {
// Other
constructors.put("stage", AxialStage.class.getConstructor(new Class<?>[0]));
constructors.put("boosterset", ParallelStage.class.getConstructor(new Class<?>[0]));
constructors.put("parallelstage", ParallelStage.class.getConstructor(new Class<?>[0]));
constructors.put("podset", PodSet.class.getConstructor(new Class<?>[0]));
} catch (NoSuchMethodException e) {
@ -148,12 +149,14 @@ class DocumentConfig {
"auto",
Reflection.findMethod(BodyTube.class, "setOuterRadiusAutomatic", boolean.class)));
// BoosterSet
setters.put("BoosterSet:instancecount", new IntSetter(
// ParallelStage
setters.put("ParallelStage:instancecount", new IntSetter(
Reflection.findMethod(ParallelStage.class, "setInstanceCount",int.class)));
setters.put("BoosterSet:radialoffset", new DoubleSetter(
Reflection.findMethod(ParallelStage.class, "setRadialOffset", double.class)));
setters.put("BoosterSet:angleoffset", new DoubleSetter(
setters.put("ParallelStage:radialoffset", new DoubleSetter(
Reflection.findMethod(ParallelStage.class, "setRadialOffset", double.class),
"auto",
Reflection.findMethod(ParallelStage.class, "setAutoRadialOffset", boolean.class)));
setters.put("ParallelStage:angleoffset", new DoubleSetter(
Reflection.findMethod(ParallelStage.class, "setAngularOffset", double.class)));
// SymmetricComponent

View File

@ -29,9 +29,9 @@ public class AxialStageSaver extends ComponentAssemblySaver {
}
} else {
if (c instanceof ParallelStage) {
list.add("<boosterset>");
list.add("<parallelstage>");
instance.addParams(c, list);
list.add("</boosterset>");
list.add("</parallelstage>");
}
}

View File

@ -4,9 +4,9 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.sf.openrocket.rocketcomponent.ParallelStage;
import net.sf.openrocket.rocketcomponent.ComponentAssembly;
import net.sf.openrocket.rocketcomponent.Instanceable;
import net.sf.openrocket.rocketcomponent.ParallelStage;
import net.sf.openrocket.rocketcomponent.PodSet;
import net.sf.openrocket.rocketcomponent.RingInstanceable;
import net.sf.openrocket.rocketcomponent.RocketComponent;
@ -24,11 +24,12 @@ public class ComponentAssemblySaver extends RocketComponentSaver {
list.add("<podset>");
instance.addParams(c, list);
list.add("</podset>");
} else if (c instanceof ParallelStage) {
list.add("<boosterset>");
instance.addParams(c, list);
list.add("</boosterset>");
}
// else if (c instanceof ParallelStage) {
// list.add("<boosterset>");
// instance.addParams(c, list);
// list.add("</boosterset>");
// }
}
return list;
@ -51,16 +52,21 @@ public class ComponentAssemblySaver extends RocketComponentSaver {
final String radoffs_tag = "radialoffset";
final String startangle_tag = "angleoffset";
if ( currentStage instanceof Instanceable) {
int instanceCount = currentStage.getInstanceCount();
elementsToReturn.add("<" + instCt_tag + ">" + instanceCount + "</" + instCt_tag + ">");
if( currentStage instanceof RingInstanceable ){
RingInstanceable ring = (RingInstanceable) currentStage;
double radialOffset = ring.getRadialOffset();
elementsToReturn.add("<" + radoffs_tag + ">" + radialOffset + "</" + radoffs_tag + ">");
if(( currentStage instanceof ParallelStage )&&( ((ParallelStage)currentStage).getAutoRadialOffset() )){
elementsToReturn.add("<" + radoffs_tag + ">auto</" + radoffs_tag + ">");
}else{
double radialOffset = ring.getRadialOffset();
elementsToReturn.add("<" + radoffs_tag + ">" + radialOffset + "</" + radoffs_tag + ">");
}
double angularOffset = ring.getAngularOffset();
elementsToReturn.add("<" + startangle_tag + ">" + angularOffset + "</" + startangle_tag + ">");
}
}

View File

@ -17,7 +17,7 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo
protected double angularSeparation = Math.PI;
protected double angularPosition_rad = 0;
protected boolean autoRadialPosition = true;
protected boolean autoRadialPosition = false;
protected double radialPosition_m = 0;
public ParallelStage() {