Merge with commit f8cfebe from kruland2607/openrocket

This commit is contained in:
Daniel_M_Williams 2016-01-01 16:04:33 -05:00
parent 206214e47a
commit 513e74fd15
8 changed files with 261 additions and 213 deletions

View File

@ -192,27 +192,27 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
// With the implementation of ParallelStages and Pods, this is no longer true. -Daniel Williams // With the implementation of ParallelStages and Pods, this is no longer true. -Daniel Williams
// //
// // Check for discontinuities // // Check for discontinuities
// if (component instanceof SymmetricComponent) { if (component instanceof SymmetricComponent) {
// SymmetricComponent sym = (SymmetricComponent) component; SymmetricComponent sym = (SymmetricComponent) component;
// // TODO:LOW: Ignores other cluster components (not clusterable) // TODO:LOW: Ignores other cluster components (not clusterable)
// double x = component.toAbsolute(Coordinate.NUL)[0].x; double x = component.toAbsolute(Coordinate.NUL)[0].x;
//
// // Check for lengthwise discontinuity // Check for lengthwise discontinuity
// if (x > componentX + 0.0001) { if (x > componentX + 0.0001) {
// if (!MathUtil.equals(radius, 0)) { if (!MathUtil.equals(radius, 0)) {
// warnings.add(Warning.DISCONTINUITY); warnings.add(Warning.DISCONTINUITY);
// radius = 0; radius = 0;
// } }
// } }
// componentX = component.toAbsolute(new Coordinate(component.getLength()))[0].x; componentX = component.toAbsolute(new Coordinate(component.getLength()))[0].x;
//
// // Check for radius discontinuity // Check for radius discontinuity
// if (!MathUtil.equals(sym.getForeRadius(), radius)) { if (!MathUtil.equals(sym.getForeRadius(), radius)) {
// warnings.add(Warning.DISCONTINUITY); warnings.add(Warning.DISCONTINUITY);
// // TODO: MEDIUM: Apply correction to values to cp and to map // TODO: MEDIUM: Apply correction to values to cp and to map
// } }
// radius = sym.getAftRadius(); radius = sym.getAftRadius();
// } }
// Call calculation method // Call calculation method
forces.zero(); forces.zero();

View File

@ -28,6 +28,7 @@ public class MassCalculator implements Monitorable {
public Coordinate getCG(Motor motor) { public Coordinate getCG(Motor motor) {
return Coordinate.NUL; return Coordinate.NUL;
} }
}, },
LAUNCH_MASS { LAUNCH_MASS {
@Override @Override
@ -43,6 +44,25 @@ public class MassCalculator implements Monitorable {
}; };
public abstract Coordinate getCG(Motor motor); public abstract Coordinate getCG(Motor motor);
/**
* Compute the cg contribution of the motor relative to the rocket's coordinates
*
* @param motorConfig
* @return
*/
public Coordinate getCG(MotorConfiguration motorConfig) {
Coordinate cg = getCG(motorConfig.getMotor());
cg = cg.add(motorConfig.getPosition());
RocketComponent motorMount = (RocketComponent) motorConfig.getMount();
Coordinate totalCG = new Coordinate();
for (Coordinate cord : motorMount.toAbsolute(cg) ) {
totalCG = totalCG.average(cord);
}
return totalCG;
}
} }
private static final Logger log = LoggerFactory.getLogger(MassCalculator.class); private static final Logger log = LoggerFactory.getLogger(MassCalculator.class);
@ -152,6 +172,12 @@ public class MassCalculator implements Monitorable {
// a *bit* hacky :P // a *bit* hacky :P
Coordinate curMotorCM = localCM.setX( localCM.x + locations[0].x + motorXPosition ); Coordinate curMotorCM = localCM.setX( localCM.x + locations[0].x + motorXPosition );
// alternate version:
// double Ir = inst.getRotationalInertia();
// double It = inst.getLongitudinalInertia();
// +
// + Coordinate curMotorCM = type.getCG(inst);
double motorMass = curMotorCM.weight; double motorMass = curMotorCM.weight;
double Ir_single = mtrConfig.getUnitRotationalInertia()*motorMass; double Ir_single = mtrConfig.getUnitRotationalInertia()*motorMass;
double It_single = mtrConfig.getUnitLongitudinalInertia()*motorMass; double It_single = mtrConfig.getUnitLongitudinalInertia()*motorMass;

View File

@ -23,7 +23,6 @@ public class MotorConfiguration implements FlightConfigurableParameter<MotorConf
protected boolean ignitionOveride = false; protected boolean ignitionOveride = false;
protected double ignitionDelay = 0.0; protected double ignitionDelay = 0.0;
protected IgnitionEvent ignitionEvent = IgnitionEvent.NEVER; protected IgnitionEvent ignitionEvent = IgnitionEvent.NEVER;
protected double ignitionTime = 0.0;
protected int modID = 0; protected int modID = 0;
@ -43,13 +42,11 @@ public class MotorConfiguration implements FlightConfigurableParameter<MotorConf
public MotorState getSimulationState() { public MotorState getSimulationState() {
MotorState state = motor.getNewInstance(); MotorState state = motor.getNewInstance();
if( ignitionOveride ) { if( ignitionOveride ) {
state.setIgnitionTime( this.ignitionTime );
state.setIgnitionEvent( this.ignitionEvent ); state.setIgnitionEvent( this.ignitionEvent );
state.setIgnitionDelay( this.ignitionDelay ); state.setIgnitionDelay( this.ignitionDelay );
state.setEjectionDelay( this.ejectionDelay ); state.setEjectionDelay( this.ejectionDelay );
} else { } else {
MotorConfiguration defInstance = mount.getDefaultMotorInstance(); MotorConfiguration defInstance = mount.getDefaultMotorInstance();
state.setIgnitionTime( defInstance.ignitionTime );
state.setIgnitionEvent( defInstance.ignitionEvent ); state.setIgnitionEvent( defInstance.ignitionEvent );
state.setIgnitionDelay( defInstance.ignitionDelay ); state.setIgnitionDelay( defInstance.ignitionDelay );
state.setEjectionDelay( defInstance.ejectionDelay ); state.setEjectionDelay( defInstance.ejectionDelay );
@ -110,20 +107,10 @@ public class MotorConfiguration implements FlightConfigurableParameter<MotorConf
return mount.getLength() - motor.getLength() + mount.getMotorOverhang(); return mount.getLength() - motor.getLength() + mount.getMotorOverhang();
} }
public double getIgnitionTime() {
return this.ignitionTime;
}
public void useDefaultIgnition() { public void useDefaultIgnition() {
this.ignitionOveride = false; this.ignitionOveride = false;
} }
public void setIgnitionTime(double _time) {
this.ignitionTime = _time;
this.ignitionOveride = true;
modID++;
}
public double getIgnitionDelay() { public double getIgnitionDelay() {
return this.ignitionDelay; return this.ignitionDelay;
} }
@ -212,7 +199,6 @@ public class MotorConfiguration implements FlightConfigurableParameter<MotorConf
clone.ignitionOveride = this.ignitionOveride; clone.ignitionOveride = this.ignitionOveride;
clone.ignitionDelay = this.ignitionDelay; clone.ignitionDelay = this.ignitionDelay;
clone.ignitionEvent = this.ignitionEvent; clone.ignitionEvent = this.ignitionEvent;
clone.ignitionTime = this.ignitionTime;
return clone; return clone;
} }

View File

@ -164,6 +164,7 @@ public class FlightEvent implements Comparable<FlightEvent> {
@Override @Override
public String toString() { public String toString() {
return "FlightEvent[type=" + type.name() + ",time=" + time + ",source=" + source + "]"; return "FlightEvent[type=" + type.name() + ",time=" + time + ",source=" + source + ",data=" + String.valueOf(data) + "]";
} }
} }

View File

@ -432,23 +432,6 @@ public class TestRockets {
return rocket; return rocket;
} }
// This function is used for unit, integration tests, DO NOT CHANGE (without updating tests).
public static final MotorConfiguration getTestD12Motor() {
// Estes D12:
// http://nar.org/SandT/pdf/Estes/D12.pdf
ThrustCurveMotor motor = new ThrustCurveMotor(
Manufacturer.getManufacturer("Estes"),
"D12-X", "Test Motor", Motor.Type.SINGLE, new double[] {0,3,5,7},
0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 10.2, 0 },
new Coordinate[] { new Coordinate(0.0035,0,0,44.0),
new Coordinate(0.0035,0,0,30.0),
new Coordinate(0.0035,0,0,21.0)},
"digest_D12");
MotorConfiguration inst = new MotorConfiguration(motor);
inst.setEjectionDelay(5);
return inst;
}
public static Rocket makeSmallFlyable() { public static Rocket makeSmallFlyable() {
double noseconeLength = 0.10, noseconeRadius = 0.01; double noseconeLength = 0.10, noseconeRadius = 0.01;
double bodytubeLength = 0.20, bodytubeRadius = 0.01, bodytubeThickness = 0.001; double bodytubeLength = 0.20, bodytubeRadius = 0.01, bodytubeThickness = 0.001;

View File

@ -11,11 +11,8 @@ import com.google.inject.Injector;
import com.google.inject.Module; import com.google.inject.Module;
import net.sf.openrocket.ServicesForTesting; import net.sf.openrocket.ServicesForTesting;
import net.sf.openrocket.motor.MotorConfiguration;
import net.sf.openrocket.plugin.PluginModule; import net.sf.openrocket.plugin.PluginModule;
import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.FlightConfigurationId;
import net.sf.openrocket.rocketcomponent.InnerTube;
import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
@ -64,16 +61,10 @@ public class BarrowmanCalculatorTest {
public void testCPSimpleWithMotor() { public void testCPSimpleWithMotor() {
Rocket rkt = TestRockets.makeEstesAlphaIII(); Rocket rkt = TestRockets.makeEstesAlphaIII();
FlightConfiguration config = rkt.getSelectedConfiguration(); FlightConfiguration config = rkt.getSelectedConfiguration();
FlightConfigurationId fcid = config.getFlightConfigurationID();
AerodynamicCalculator calc = new BarrowmanCalculator(); AerodynamicCalculator calc = new BarrowmanCalculator();
FlightConditions conditions = new FlightConditions(config); FlightConditions conditions = new FlightConditions(config);
WarningSet warnings = new WarningSet(); WarningSet warnings = new WarningSet();
MotorConfiguration inst = TestRockets.getTestD12Motor();
InnerTube motorTube = (InnerTube)rkt.getChild(0).getChild(1).getChild(1);
motorTube.setMotorInstance(fcid, inst);
motorTube.setMotorMount(true);
motorTube.setMotorOverhang(0.005);
// calculated from OpenRocket 15.03 // calculated from OpenRocket 15.03
double expCPx = 0.225; // cm double expCPx = 0.225; // cm

View File

@ -55,9 +55,10 @@ import net.sf.openrocket.gui.util.GUIUtil;
import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.masscalc.MassCalculator; import net.sf.openrocket.masscalc.MassCalculator;
import net.sf.openrocket.masscalc.MassCalculator.MassCalcType; import net.sf.openrocket.masscalc.MassCalculator.MassCalcType;
import net.sf.openrocket.motor.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.AxialStage;
import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.FlightConfigurationId;
import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
@ -85,11 +86,10 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
private final ColumnTableModel dragTableModel; private final ColumnTableModel dragTableModel;
private final ColumnTableModel rollTableModel; private final ColumnTableModel rollTableModel;
private final JList warningList; private final JList<Object> warningList;
private final List<AerodynamicForces> cpData = new ArrayList<AerodynamicForces>(); private final List<Object[]> cgData = new ArrayList<Object[]>();
private final List<Coordinate> cgData = new ArrayList<Coordinate>();
private final List<AerodynamicForces> dragData = new ArrayList<AerodynamicForces>(); private final List<AerodynamicForces> dragData = new ArrayList<AerodynamicForces>();
private double totalCD = 0; private double totalCD = 0;
private final List<AerodynamicForces> rollData = new ArrayList<AerodynamicForces>(); private final List<AerodynamicForces> rollData = new ArrayList<AerodynamicForces>();
@ -102,7 +102,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
JTable table; JTable table;
JPanel panel = new JPanel(new MigLayout("fill", "[][35lp::][fill][fill]")); JPanel panel = new JPanel(new MigLayout("fill"));
add(panel); add(panel);
this.configuration = rocketPanel.getConfiguration(); this.configuration = rocketPanel.getConfiguration();
@ -144,7 +144,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
panel.add(worstToggle, ""); panel.add(worstToggle, "");
warningList = new JList(); warningList = new JList<>();
JScrollPane scrollPane = new JScrollPane(warningList); JScrollPane scrollPane = new JScrollPane(warningList);
////Warnings: ////Warnings:
scrollPane.setBorder(BorderFactory.createTitledBorder(trans.get("componentanalysisdlg.TitledBorder.warnings"))); scrollPane.setBorder(BorderFactory.createTitledBorder(trans.get("componentanalysisdlg.TitledBorder.warnings")));
@ -164,7 +164,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.rollrate")), "width 120lp!"); panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.rollrate")), "width 120lp!");
panel.add(new UnitSelector(roll, true), "width 50lp!"); panel.add(new UnitSelector(roll, true), "width 50lp!");
panel.add(new BasicSlider(roll.getSliderModel(-20 * 2 * Math.PI, 20 * 2 * Math.PI)), panel.add(new BasicSlider(roll.getSliderModel(-20 * 2 * Math.PI, 20 * 2 * Math.PI)),
"growx, wrap paragraph"); "growx, wrap");
// Stage and motor selection: // Stage and motor selection:
@ -194,7 +194,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
new Column(trans.get("componentanalysisdlg.TabStability.Col.Component")) { new Column(trans.get("componentanalysisdlg.TabStability.Col.Component")) {
@Override @Override
public Object getValueAt(int row) { public Object getValueAt(int row) {
RocketComponent c = cpData.get(row).getComponent(); Object c = cgData.get(row)[0];
if (c instanceof Rocket) { if (c instanceof Rocket) {
return trans.get("componentanalysisdlg.TOTAL"); return trans.get("componentanalysisdlg.TOTAL");
} }
@ -211,7 +211,11 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
@Override @Override
public Object getValueAt(int row) { public Object getValueAt(int row) {
return unit.toString(cgData.get(row).x); Coordinate cg = (Coordinate) cgData.get(row)[1];
if ( cg == null ) {
return null;
}
return unit.toString(cg.x);
} }
}, },
new Column(trans.get("componentanalysisdlg.TabStability.Col.Mass") + " / " + UnitGroup.UNITS_MASS.getDefaultUnit().getUnit()) { new Column(trans.get("componentanalysisdlg.TabStability.Col.Mass") + " / " + UnitGroup.UNITS_MASS.getDefaultUnit().getUnit()) {
@ -219,7 +223,11 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
@Override @Override
public Object getValueAt(int row) { public Object getValueAt(int row) {
return unit.toString(cgData.get(row).weight); Coordinate cg = (Coordinate) cgData.get(row)[1];
if ( cg == null ) {
return null;
}
return unit.toString(cg.weight);
} }
}, },
new Column(trans.get("componentanalysisdlg.TabStability.Col.CP") + " / " + UnitGroup.UNITS_LENGTH.getDefaultUnit().getUnit()) { new Column(trans.get("componentanalysisdlg.TabStability.Col.CP") + " / " + UnitGroup.UNITS_LENGTH.getDefaultUnit().getUnit()) {
@ -227,20 +235,34 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
@Override @Override
public Object getValueAt(int row) { public Object getValueAt(int row) {
return unit.toString(cpData.get(row).getCP().x); AerodynamicForces forces = (AerodynamicForces) cgData.get(row)[2];
if ( forces == null ) {
return null;
}
return unit.toString(forces.getCP().x);
} }
}, },
new Column("<html>C<sub>N<sub>" + ALPHA + "</sub></sub>") { new Column("<html>C<sub>N<sub>" + ALPHA + "</sub></sub>") {
@Override @Override
public Object getValueAt(int row) { public Object getValueAt(int row) {
return NOUNIT.toString(cpData.get(row).getCP().weight); AerodynamicForces forces = (AerodynamicForces) cgData.get(row)[2];
if ( forces == null ) {
return null;
}
return NOUNIT.toString(forces.getCP().weight);
} }
} }
) { ) {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override @Override
public int getRowCount() { public int getRowCount() {
return cpData.size(); return cgData.size();
} }
}; };
@ -310,6 +332,11 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
} }
} }
) { ) {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override @Override
public int getRowCount() { public int getRowCount() {
return dragData.size(); return dragData.size();
@ -372,6 +399,11 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
} }
} }
) { ) {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override @Override
public int getRowCount() { public int getRowCount() {
return rollData.size(); return rollData.size();
@ -383,7 +415,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setSelectionBackground(Color.LIGHT_GRAY); table.setSelectionBackground(Color.LIGHT_GRAY);
table.setSelectionForeground(Color.BLACK); table.setSelectionForeground(Color.BLACK);
rollTableModel.setColumnWidths(table.getColumnModel()); table.setDefaultRenderer(Object.class, new CustomCellRenderer());
scrollpane = new JScrollPane(table); scrollpane = new JScrollPane(table);
scrollpane.setPreferredSize(new Dimension(600, 200)); scrollpane.setPreferredSize(new Dimension(600, 200));
@ -467,7 +499,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
ComponentAnalysisDialog.this.dispose(); ComponentAnalysisDialog.this.dispose();
} }
}); });
panel.add(button, "span, split, tag cancel"); panel.add(button, "span, tag cancel");
this.setLocationByPlatform(true); this.setLocationByPlatform(true);
@ -508,20 +540,28 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
massCalculator.getCGAnalysis(configuration, MassCalcType.LAUNCH_MASS); massCalculator.getCGAnalysis(configuration, MassCalcType.LAUNCH_MASS);
cpData.clear();
cgData.clear(); cgData.clear();
dragData.clear(); dragData.clear();
rollData.clear(); rollData.clear();
for (RocketComponent c : configuration.getActiveComponents()) { for (RocketComponent c : configuration.getActiveComponents()) {
forces = aeroData.get(c); if ( c instanceof AxialStage ) {
Coordinate cg = massData.get(c);
if (forces == null)
continue; continue;
if (forces.getCP() != null) {
cpData.add(forces);
cgData.add(cg);
} }
Object[] data = new Object[3];
cgData.add(data);
data[0] = c;
Coordinate cg = massData.get(c);
data[1] = cg;
forces = aeroData.get(c);
if (forces == null) {
continue;
}
if (forces.getCP() != null) {
data[2] = forces;
}
if (!Double.isNaN(forces.getCD())) { if (!Double.isNaN(forces.getCD())) {
dragData.add(forces); dragData.add(forces);
} }
@ -529,10 +569,23 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
rollData.add(forces); rollData.add(forces);
} }
} }
for ( MotorConfiguration motorConfig : configuration.getActiveMotors()) {
Object [] data = new Object[3];
cgData.add(data);
data[0] = motorConfig.getMotor().getDesignation();
data[1] = MassCalcType.LAUNCH_MASS.getCG(motorConfig);
}
forces = aeroData.get(configuration.getRocket()); forces = aeroData.get(configuration.getRocket());
if (forces != null) { if (forces != null) {
cpData.add(forces); Object[] data = new Object[3];
cgData.add(massData.get(configuration.getRocket())); cgData.add(data);
data[0] = configuration.getRocket();
data[1] = massData.get(configuration.getRocket());
data[2] = forces;
dragData.add(forces); dragData.add(forces);
rollData.add(forces); rollData.add(forces);
totalCD = forces.getCD(); totalCD = forces.getCD();
@ -556,6 +609,10 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
private class CustomCellRenderer extends JLabel implements TableCellRenderer { private class CustomCellRenderer extends JLabel implements TableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
private final Font normalFont; private final Font normalFont;
private final Font boldFont; private final Font boldFont;
@ -569,12 +626,12 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
public Component getTableCellRendererComponent(JTable table, Object value, public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) { boolean isSelected, boolean hasFocus, int row, int column) {
this.setText(value.toString()); this.setText(value == null ? null : value.toString());
if ((row < 0) || (row >= cpData.size())) if ((row < 0) || (row >= cgData.size()))
return this; return this;
if (cpData.get(row).getComponent() instanceof Rocket) { if (cgData.get(row)[0] instanceof Rocket) {
this.setFont(boldFont); this.setFont(boldFont);
} else { } else {
this.setFont(normalFont); this.setFont(normalFont);
@ -586,6 +643,10 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
private class DragCellRenderer extends JLabel implements TableCellRenderer { private class DragCellRenderer extends JLabel implements TableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
private final Font normalFont; private final Font normalFont;
private final Font boldFont; private final Font boldFont;