[Feature] Implemented RailButton IO code.

This commit is contained in:
Daniel_M_Williams 2015-11-22 16:25:36 -05:00
parent 52ee7ba750
commit 643fa71478
5 changed files with 99 additions and 13 deletions

View File

@ -19,14 +19,15 @@ import net.sf.openrocket.document.Simulation;
import net.sf.openrocket.document.StorageOptions; import net.sf.openrocket.document.StorageOptions;
import net.sf.openrocket.file.RocketSaver; import net.sf.openrocket.file.RocketSaver;
import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.AxialStage;
import net.sf.openrocket.rocketcomponent.ParallelStage;
import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent;
import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent; import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent;
import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.FlightConfigurationID; import net.sf.openrocket.rocketcomponent.FlightConfigurationID;
import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.rocketcomponent.ParallelStage;
import net.sf.openrocket.rocketcomponent.PodSet; import net.sf.openrocket.rocketcomponent.PodSet;
import net.sf.openrocket.rocketcomponent.RailButton;
import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.RecoveryDevice;
import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.RocketComponent;
@ -227,8 +228,9 @@ public class OpenRocketSaver extends RocketSaver {
* NOTE: Remember to update the supported versions in DocumentConfig as well! * NOTE: Remember to update the supported versions in DocumentConfig as well!
* *
* File version 1.8 is required for: * File version 1.8 is required for:
* - external or parallel booster stages * - external/parallel booster stages
* - external pods * - external pods
* - Rail Buttons
* *
* File version 1.7 is required for: * File version 1.7 is required for:
* - simulation extensions * - simulation extensions
@ -259,7 +261,7 @@ public class OpenRocketSaver extends RocketSaver {
///////////////// /////////////////
// Search the rocket for any Boosters or Pods (version 1.8) // Search the rocket for any Boosters or Pods (version 1.8)
for (RocketComponent c : document.getRocket()) { for (RocketComponent c : document.getRocket()) {
if ((c instanceof ParallelStage) || (c instanceof PodSet)) { if ((c instanceof ParallelStage) || (c instanceof PodSet) || (c instanceof RailButton)) {
return FILE_VERSION_DIVISOR + 8; return FILE_VERSION_DIVISOR + 8;
} }
} }

View File

@ -75,6 +75,7 @@ class DocumentConfig {
constructors.put("freeformfinset", FreeformFinSet.class.getConstructor(new Class<?>[0])); constructors.put("freeformfinset", FreeformFinSet.class.getConstructor(new Class<?>[0]));
constructors.put("tubefinset", TubeFinSet.class.getConstructor(new Class<?>[0])); constructors.put("tubefinset", TubeFinSet.class.getConstructor(new Class<?>[0]));
constructors.put("launchlug", LaunchLug.class.getConstructor(new Class<?>[0])); constructors.put("launchlug", LaunchLug.class.getConstructor(new Class<?>[0]));
constructors.put("railbutton", RailButton.class.getConstructor(new Class<?>[0]));
// Internal components // Internal components
constructors.put("engineblock", EngineBlock.class.getConstructor(new Class<?>[0])); constructors.put("engineblock", EngineBlock.class.getConstructor(new Class<?>[0]));
@ -177,6 +178,17 @@ class DocumentConfig {
setters.put("LaunchLug:instanceseparation", new DoubleSetter( setters.put("LaunchLug:instanceseparation", new DoubleSetter(
Reflection.findMethod( LaunchLug.class, "setInstanceSeparation", double.class))); Reflection.findMethod( LaunchLug.class, "setInstanceSeparation", double.class)));
// RailButton
setters.put("RailButton:instancecount", new IntSetter(
Reflection.findMethod(LaunchLug.class, "setInstanceCount",int.class)));
setters.put("RailButton:instanceseparation", new DoubleSetter(
Reflection.findMethod( LaunchLug.class, "setInstanceSeparation", double.class)));
setters.put("RailButton:height", new DoubleSetter(
Reflection.findMethod( LaunchLug.class, "setTotalHeight", double.class)));
setters.put("RailButton:outerdiameter", new DoubleSetter(
Reflection.findMethod( LaunchLug.class, "setOuterDiameter", double.class)));
// Transition // Transition
setters.put("Transition:shape", new EnumSetter<Transition.Shape>( setters.put("Transition:shape", new EnumSetter<Transition.Shape>(
Reflection.findMethod(Transition.class, "setType", Transition.Shape.class), Reflection.findMethod(Transition.class, "setType", Transition.Shape.class),

View File

@ -0,0 +1,42 @@
package net.sf.openrocket.file.openrocket.savers;
import java.util.ArrayList;
import java.util.List;
import net.sf.openrocket.rocketcomponent.RailButton;
public class RailButtonSaver extends ExternalComponentSaver {
private static final RailButtonSaver instance = new RailButtonSaver();
public static List<String> getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) {
List<String> list = new ArrayList<String>();
list.add("<railbutton>");
instance.addParams(c, list);
list.add("</railbutton>");
return list;
}
@Override
protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, List<String> elements) {
super.addParams(c, elements);
RailButton rb = (RailButton) c;
addElement( elements, "outerradius", rb.getOuterRadius());
addElement( elements, "height", rb.getTotalHeight());
addElement( elements, "radialDirection", rb.getRadialDirection());
}
protected static void addElement( final List<String> elements, final String enclosingTag, final double value){
addElement( elements, enclosingTag, Double.toString( value ));
}
protected static void addElement( final List<String> elements, final String enclosingTag, final String value){
elements.add("<"+enclosingTag+">" + value + "</"+enclosingTag+">");
}
}

View File

@ -7,6 +7,7 @@ import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
public class ParallelStage extends AxialStage implements FlightConfigurableComponent, RingInstanceable { public class ParallelStage extends AxialStage implements FlightConfigurableComponent, RingInstanceable {
@ -209,7 +210,7 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo
@Override @Override
public void setAngularOffset(final double angle_rad) { public void setAngularOffset(final double angle_rad) {
mutex.verify(); mutex.verify();
this.angularPosition_rad = angle_rad; this.angularPosition_rad = MathUtil.reduce180( angle_rad);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
} }

View File

@ -28,7 +28,6 @@ public class RailButton extends ExternalComponent implements LineInstanceable {
/* /*
* Rail Button Dimensions (side view) * Rail Button Dimensions (side view)
* *
*
* <= outer dia => * <= outer dia =>
* v * v
* ^ [[[[[[]]]]]] lipThickness * ^ [[[[[[]]]]]] lipThickness
@ -50,23 +49,34 @@ public class RailButton extends ExternalComponent implements LineInstanceable {
protected final static double MINIMUM_STANDOFF= 0.001; protected final static double MINIMUM_STANDOFF= 0.001;
private double radialDirection = 0; private double radialDirection = 0;
private int instanceCount = 1; private int instanceCount = 1;
private double instanceSeparation = 0; // front-front along the positive rocket axis. i.e. [1,0,0]; private double instanceSeparation = 0; // front-front along the positive rocket axis. i.e. [1,0,0];
public RailButton( final double id, final double od, final double ht ) { public RailButton(){
this( od, id, ht, ht/4, ht/4); super(Position.MIDDLE);
this.outerDiameter = 0;
this.height = 0;
this.innerDiameter = 0;
this.thickness = 0;
this.setStandoff( 0);
this.setInstanceSeparation( 1.0);
}
public RailButton( final double od, final double ht ) {
this();
this.setOuterDiameter( od);
this.setTotalHeight( ht);
} }
public RailButton( final double od, final double id, final double h, final double _thickness, final double _standoff ) { public RailButton( final double od, final double id, final double h, final double _thickness, final double _standoff ) {
super(Position.MIDDLE); super(Position.MIDDLE);
this.innerDiameter = id;
this.outerDiameter = od; this.outerDiameter = od;
this.height = h-_standoff; this.height = h-_standoff;
this.innerDiameter = id;
this.thickness = _thickness; this.thickness = _thickness;
this.setStandoff( _standoff); this.setStandoff( _standoff);
this.instanceSeparation = od*2; this.setInstanceSeparation( od*2);
} }
private static final RailButton make1010Button(){ private static final RailButton make1010Button(){
@ -79,6 +89,8 @@ public class RailButton extends ExternalComponent implements LineInstanceable {
rb1010.setMassOverridden(true); rb1010.setMassOverridden(true);
rb1010.setOverrideMass(0.0019); rb1010.setOverrideMass(0.0019);
rb1010.setInstanceCount(1);
rb1010.setInstanceSeparation( od*6 );
return rb1010; return rb1010;
} }
@ -121,20 +133,37 @@ public class RailButton extends ExternalComponent implements LineInstanceable {
public void setInnerDiameter( final double newID ){ public void setInnerDiameter( final double newID ){
this.innerDiameter = newID; this.innerDiameter = newID;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
} }
public void setOuterDiameter( final double newOD ){ public void setOuterDiameter( final double newOD ){
this.outerDiameter = newOD; this.outerDiameter = newOD;
if( 0 == this.innerDiameter){
this.innerDiameter = this.outerDiameter*0.8;
}
if( 0 == this.instanceSeparation ){
this.instanceSeparation = newOD*8;
}
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
} }
public void setTotalHeight( final double newHeight ) { public void setTotalHeight( final double newHeight ) {
this.height = newHeight-this.standoff; if( 0 == this.thickness){
this.thickness = newHeight*0.25;
}
if( 0 == this.standoff){
this.height = newHeight*0.75;
this.offset = newHeight*0.25;
}else{
this.height = newHeight-this.standoff;
}
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
} }
public void setThickness( final double newThickness ) { public void setThickness( final double newThickness ) {
this.thickness = newThickness; this.thickness = newThickness;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
} }
// public void setThickness(double thickness) { // public void setThickness(double thickness) {