Added OutsideComponent.java; Implemented in ExternalComponent and Stage

OutsideComponent.java is an interface which describes components place outside the rocket (i.e. wing-tip pods, or strap-on boosters stages.

The interface is minimal, consisting merely of a couple getters and setters for the external position, rotation, and a flag to turn this on and off.
This commit is contained in:
Daniel_M_Williams 2015-06-03 10:41:01 -04:00
parent 7b6367b30b
commit 58d9e8f682
3 changed files with 190 additions and 36 deletions

View File

@ -16,8 +16,13 @@ import net.sf.openrocket.unit.UnitGroup;
* @author Sampo Niskanen <sampo.niskanen@iki.fi> * @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/ */
public abstract class ExternalComponent extends RocketComponent { public abstract class ExternalComponent extends RocketComponent implements OutsideComponent {
private boolean axial = true;
private double position_angular_rad = 0;
private double position_radial_m = 0;
private double rotation_rad = 0;
public enum Finish { public enum Finish {
//// Rough //// Rough
ROUGH("ExternalComponent.Rough", 500e-6), ROUGH("ExternalComponent.Rough", 500e-6),
@ -29,36 +34,36 @@ public abstract class ExternalComponent extends RocketComponent {
SMOOTH("ExternalComponent.Smoothpaint", 20e-6), SMOOTH("ExternalComponent.Smoothpaint", 20e-6),
//// Polished //// Polished
POLISHED("ExternalComponent.Polished", 2e-6); POLISHED("ExternalComponent.Polished", 2e-6);
private static final Translator trans = Application.getTranslator(); private static final Translator trans = Application.getTranslator();
private final String name; private final String name;
private final double roughnessSize; private final double roughnessSize;
Finish(String name, double roughness) { Finish(String name, double roughness) {
this.name = name; this.name = name;
this.roughnessSize = roughness; this.roughnessSize = roughness;
} }
public double getRoughnessSize() { public double getRoughnessSize() {
return roughnessSize; return roughnessSize;
} }
@Override @Override
public String toString() { public String toString() {
return trans.get(name) + " (" + UnitGroup.UNITS_ROUGHNESS.toStringUnit(roughnessSize) + ")"; return trans.get(name) + " (" + UnitGroup.UNITS_ROUGHNESS.toStringUnit(roughnessSize) + ")";
} }
} }
/** /**
* The material of the component. * The material of the component.
*/ */
protected Material material = null; protected Material material = null;
protected Finish finish = Finish.NORMAL; protected Finish finish = Finish.NORMAL;
/** /**
* Constructor that sets the relative position of the component. * Constructor that sets the relative position of the component.
*/ */
@ -66,13 +71,13 @@ public abstract class ExternalComponent extends RocketComponent {
super(relativePosition); super(relativePosition);
this.material = Application.getPreferences().getDefaultComponentMaterial(this.getClass(), Material.Type.BULK); this.material = Application.getPreferences().getDefaultComponentMaterial(this.getClass(), Material.Type.BULK);
} }
/** /**
* Returns the volume of the component. This value is used in calculating the mass * Returns the volume of the component. This value is used in calculating the mass
* of the object. * of the object.
*/ */
public abstract double getComponentVolume(); public abstract double getComponentVolume();
/** /**
* Calculates the mass of the component as the product of the volume and interior density. * Calculates the mass of the component as the product of the volume and interior density.
*/ */
@ -80,7 +85,7 @@ public abstract class ExternalComponent extends RocketComponent {
public double getComponentMass() { public double getComponentMass() {
return material.getDensity() * getComponentVolume(); return material.getDensity() * getComponentVolume();
} }
/** /**
* ExternalComponent has aerodynamic effect, so return true. * ExternalComponent has aerodynamic effect, so return true.
*/ */
@ -88,7 +93,7 @@ public abstract class ExternalComponent extends RocketComponent {
public boolean isAerodynamic() { public boolean isAerodynamic() {
return true; return true;
} }
/** /**
* ExternalComponent has effect on the mass, so return true. * ExternalComponent has effect on the mass, so return true.
*/ */
@ -96,50 +101,91 @@ public abstract class ExternalComponent extends RocketComponent {
public boolean isMassive() { public boolean isMassive() {
return true; return true;
} }
public Material getMaterial() { public Material getMaterial() {
return material; return material;
} }
public void setMaterial(Material mat) { public void setMaterial(Material mat) {
if (mat.getType() != Material.Type.BULK) { if (mat.getType() != Material.Type.BULK) {
throw new IllegalArgumentException("ExternalComponent requires a bulk material" + throw new IllegalArgumentException("ExternalComponent requires a bulk material" +
" type=" + mat.getType()); " type=" + mat.getType());
} }
if (material.equals(mat)) if (material.equals(mat))
return; return;
material = mat; material = mat;
clearPreset(); clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
} }
public Finish getFinish() { public Finish getFinish() {
return finish; return finish;
} }
public void setFinish(Finish finish) { public void setFinish(Finish finish) {
if (this.finish == finish) if (this.finish == finish)
return; return;
this.finish = finish; this.finish = finish;
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
} }
@Override
public boolean isInline() {
return this.axial;
}
@Override
public void setInline(final boolean inline) {
this.axial = inline;
}
@Override
public double getAngularPosition() {
return this.position_angular_rad;
}
@Override
public void setAngularPosition(final double phi) {
this.position_angular_rad = phi;
}
@Override
public double getRadialPosition() {
return this.position_radial_m;
}
@Override
public void setRadialPosition(final double radius) {
this.position_radial_m = radius;
}
@Override
public double getRotation() {
return this.rotation_rad;
}
@Override
public void setRotation(final double rotation) {
this.rotation_rad = rotation;
}
@Override @Override
protected void loadFromPreset(ComponentPreset preset) { protected void loadFromPreset(ComponentPreset preset) {
super.loadFromPreset(preset); super.loadFromPreset(preset);
// Surface finish is left unchanged // Surface finish is left unchanged
if ( preset.has(ComponentPreset.MATERIAL ) ) { if (preset.has(ComponentPreset.MATERIAL)) {
Material mat = preset.get(ComponentPreset.MATERIAL); Material mat = preset.get(ComponentPreset.MATERIAL);
if ( mat != null ) { if (mat != null) {
material = mat; material = mat;
} /* } /*
TODO - TODO -
else if (c.isMassOverridden()) { else if (c.isMassOverridden()) {
double mass = c.getOverrideMass(); double mass = c.getOverrideMass();
double volume = getComponentVolume(); double volume = getComponentVolume();
double density; double density;
@ -150,12 +196,12 @@ public abstract class ExternalComponent extends RocketComponent {
} }
mat = Material.newMaterial(Type.BULK, mat.getName(), density, true); mat = Material.newMaterial(Type.BULK, mat.getName(), density, true);
setMaterial(mat); setMaterial(mat);
} }
*/ */
} }
} }
@Override @Override
protected List<RocketComponent> copyFrom(RocketComponent c) { protected List<RocketComponent> copyFrom(RocketComponent c) {
ExternalComponent src = (ExternalComponent) c; ExternalComponent src = (ExternalComponent) c;
@ -163,5 +209,5 @@ public abstract class ExternalComponent extends RocketComponent {
this.material = src.material; this.material = src.material;
return super.copyFrom(c); return super.copyFrom(c);
} }
} }

View File

@ -0,0 +1,64 @@
package net.sf.openrocket.rocketcomponent;
public interface OutsideComponent {
/**
* Indicates whether this component is located inside or outside of the rest of the rocket. (Specifically, inside or outside its parent.)
*
* @return <code> True </code> This component is aligned with its parent
* <code> False </code> This component is offset from its parent -- like an external pod, or strap-on stage
*/
public boolean isInline();
/**
* Change whether this component is located inside or outside of the rest of the rocket. (Specifically, inside or outside its parent.)
*
* @param inline True indicates that this component axially aligned with its parent. False indicates an off-center component.
*/
public void setInline(final boolean inline);
/**
* Get the position of this component in polar coordinates
*
* @return Angular position in radians.
*/
public double getAngularPosition();
/**
* Set the position of this component in polar coordinates
*
* @param phi Angular position in radians
*/
public void setAngularPosition(final double phi);
/**
* Get the position of this component in polar coordinates
*
* @return Radial position in radians (m)
*/
public double getRadialPosition();
/**
* Get the position of this component in polar coordinates
*
* @param radius Radial distance in standard units. (m)
*/
public void setRadialPosition(final double radius);
/**
* If component is not symmetric, this is the axial rotation angle (around it's own center). Defaults to 0.
*
* @return Rotation angle in radians.
*/
public double getRotation();
/**
* If component is not symmetric, this is the axial rotation angle (around it's own center). Defaults to 0.
*
* @param rotation Rotation angle in radians.
*/
public void setRotation(final double rotation);
}

View File

@ -3,12 +3,16 @@ package net.sf.openrocket.rocketcomponent;
import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
public class Stage extends ComponentAssembly implements FlightConfigurableComponent { public class Stage extends ComponentAssembly implements FlightConfigurableComponent, OutsideComponent {
static final Translator trans = Application.getTranslator(); static final Translator trans = Application.getTranslator();
private FlightConfigurationImpl<StageSeparationConfiguration> separationConfigurations; private FlightConfigurationImpl<StageSeparationConfiguration> separationConfigurations;
private boolean axial = true;
private double position_angular_rad = 0;
private double position_radial_m = 0;
private double rotation_rad = 0;
public Stage() { public Stage() {
this.separationConfigurations = new FlightConfigurationImpl<StageSeparationConfiguration>(this, ComponentChangeEvent.EVENT_CHANGE, new StageSeparationConfiguration()); this.separationConfigurations = new FlightConfigurationImpl<StageSeparationConfiguration>(this, ComponentChangeEvent.EVENT_CHANGE, new StageSeparationConfiguration());
@ -61,4 +65,44 @@ public class Stage extends ComponentAssembly implements FlightConfigurableCompon
return copy; return copy;
} }
@Override
public boolean isInline() {
return this.axial;
}
@Override
public void setInline(final boolean inline) {
this.axial = inline;
}
@Override
public double getAngularPosition() {
return this.position_angular_rad;
}
@Override
public void setAngularPosition(final double phi) {
this.position_angular_rad = phi;
}
@Override
public double getRadialPosition() {
return this.position_radial_m;
}
@Override
public void setRadialPosition(final double radius) {
this.position_radial_m = radius;
}
@Override
public double getRotation() {
return this.rotation_rad;
}
@Override
public void setRotation(final double rotation) {
this.rotation_rad = rotation;
}
} }