[Bugfix] Fixed Various configuration and motor UI bugs

- The active / default configuration is stored in the Rocket's ParameterSet.
    - Any use of it should be retrieved from here.
    - Don't Repeat Yourself
- RocketPanel updates the rocket's default/active configuration, and only draws that one
- updated code for setting new Motor to a MotorInstance (in the MotorMounts)
This commit is contained in:
Daniel_M_Williams 2015-10-23 14:42:08 -04:00
parent 3ae4b0d277
commit 86e8a96d06
14 changed files with 134 additions and 109 deletions

View File

@ -15,7 +15,6 @@ import net.sf.openrocket.motor.MotorInstanceConfiguration;
import net.sf.openrocket.motor.MotorInstanceId; import net.sf.openrocket.motor.MotorInstanceId;
import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.AxialStage;
import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.simulation.MassData; import net.sf.openrocket.simulation.MassData;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
@ -125,8 +124,7 @@ public class MassCalculator implements Monitorable {
if(MotorInstanceId.EMPTY_ID == inst.getMotorID()){ if(MotorInstanceId.EMPTY_ID == inst.getMotorID()){
throw new IllegalArgumentException(" detected empty motor from <FlightConfiguration>.getActiveMotors()"); throw new IllegalArgumentException(" detected empty motor from <FlightConfiguration>.getActiveMotors()");
} }
MotorMount mount = inst.getMount(); if( null == inst.getMount()){
if( null == mount ){
throw new NullPointerException(" detected null mount"); throw new NullPointerException(" detected null mount");
} }
if( null == inst.getMotor()){ if( null == inst.getMotor()){

View File

@ -378,22 +378,17 @@ public class BodyTube extends SymmetricComponent implements MotorMount, Coaxial
@Override @Override
public void setMotorInstance(final FlightConfigurationID fcid, final MotorInstance newMotorInstance){ public void setMotorInstance(final FlightConfigurationID fcid, final MotorInstance newMotorInstance){
if( null == fcid){
throw new NullPointerException(" null FCID passed passed to 'setMotorInstance(...)': bug ");
}
if( null == newMotorInstance){ if( null == newMotorInstance){
throw new NullPointerException(" null passed as MotorInstance to add to MotorSet ... bug "); throw new NullPointerException(" null passed as MotorInstance to add to MotorSet ... bug ");
}else{
if( null == newMotorInstance.getMount()){
newMotorInstance.setMount(this);
}else if( !this.equals( newMotorInstance.getMount())){
throw new BugException(" attempt to add a MotorInstance to a second mount, when it's already owned by another mount!");
}
} }
this.motors.set(fcid,newMotorInstance); this.motors.set(fcid,newMotorInstance);
if( newMotorInstance.isEmpty() ){
return;
}else if( null == newMotorInstance.getMount()){
newMotorInstance.setMount(this);
}else if( !this.equals( newMotorInstance.getMount())){
throw new BugException(" adding a MotorInstance to a mount that it isn't owned by... ");
}
} }

View File

@ -219,8 +219,8 @@ public class FlightConfiguration implements FlightConfigurableParameter<FlightCo
} }
} }
System.err.println("returning "+toReturn.size()+" active motor instances for this configuration: "+this.fcid.getShortKey()); //System.err.println("returning "+toReturn.size()+" active motor instances for this configuration: "+this.fcid.getShortKey());
System.err.println(this.rocket.getConfigurationSet().toDebug()); //System.err.println(this.rocket.getConfigurationSet().toDebug());
return toReturn; return toReturn;
} }

View File

@ -272,22 +272,17 @@ public class InnerTube extends ThicknessRingComponent implements Clusterable, Ra
@Override @Override
public void setMotorInstance(final FlightConfigurationID fcid, final MotorInstance newMotorInstance){ public void setMotorInstance(final FlightConfigurationID fcid, final MotorInstance newMotorInstance){
if( null == fcid){
throw new NullPointerException(" null FCID passed passed to 'setMotorInstance(...)': bug ");
}
if( null == newMotorInstance){ if( null == newMotorInstance){
throw new NullPointerException(" null passed as MotorInstance to add to MotorSet ... bug "); throw new NullPointerException(" null passed as MotorInstance to add to MotorSet ... bug ");
}else{
if( null == newMotorInstance.getMount()){
newMotorInstance.setMount(this);
}else if( !this.equals( newMotorInstance.getMount())){
throw new BugException(" attempt to add a MotorInstance to a second mount, when it's already owned by another mount!");
}
} }
this.motors.set(fcid,newMotorInstance); this.motors.set(fcid,newMotorInstance);
if( newMotorInstance.isEmpty() ){
return;
}else if( null == newMotorInstance.getMount()){
newMotorInstance.setMount(this);
}else if( !this.equals( newMotorInstance.getMount())){
throw new BugException(" adding a MotorInstance to a mount that it isn't owned by... ");
}
} }
@Override @Override

View File

@ -52,6 +52,7 @@ public class MotorConfigurationSet extends ParameterSet<MotorInstance> {
return buffer.toString(); return buffer.toString();
} }
// public void printDebug(FlightConfigurationID curFCID){ // public void printDebug(FlightConfigurationID curFCID){
// if( this.map.containsKey(curFCID)){ // if( this.map.containsKey(curFCID)){
// // no-op // // no-op

View File

@ -601,8 +601,21 @@ public class Rocket extends RocketComponent {
} }
public void setDefaultConfiguration(final FlightConfigurationID fcid) {
checkState();
if ( null == fcid ){
// silently ignore
return;
}else if( this.configSet.containsKey(fcid)){
configSet.setDefault( configSet.get(fcid));
}else{
return;
}
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
}
/** /**
* Set the name of the flight configuration. A name can be unset by passing * Associate the given ID and flight configuration.
* <code>null</code> or an empty string. * <code>null</code> or an empty string.
* *
* @param id the flight configuration id * @param id the flight configuration id

View File

@ -10,6 +10,9 @@ import javax.swing.event.EventListenerList;
import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener; import javax.swing.event.ListDataListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.FlightConfigurableParameter; import net.sf.openrocket.rocketcomponent.FlightConfigurableParameter;
import net.sf.openrocket.rocketcomponent.FlightConfigurationID; import net.sf.openrocket.rocketcomponent.FlightConfigurationID;
@ -22,7 +25,7 @@ import net.sf.openrocket.util.StateChangeListener;
*/ */
public class ParameterSetModel<T extends FlightConfigurableParameter<T>> implements ComboBoxModel<FlightConfigurationID>, StateChangeListener { public class ParameterSetModel<T extends FlightConfigurableParameter<T>> implements ComboBoxModel<FlightConfigurationID>, StateChangeListener {
//private static final Translator trans = Application.getTranslator(); //private static final Translator trans = Application.getTranslator();
private static final Logger log = LoggerFactory.getLogger(ParameterSetModel.class);
//private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class); //private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class);
private EventListenerList listenerList = new EventListenerList(); private EventListenerList listenerList = new EventListenerList();
@ -69,6 +72,7 @@ public class ParameterSetModel<T extends FlightConfigurableParameter<T>> impleme
} }
if (!(item instanceof FlightConfigurationID)) { if (!(item instanceof FlightConfigurationID)) {
throw new IllegalArgumentException("MotorConfigurationModel item=" + item); throw new IllegalArgumentException("MotorConfigurationModel item=" + item);
} }
FlightConfigurationID fcid= (FlightConfigurationID) item; FlightConfigurationID fcid= (FlightConfigurationID) item;

View File

@ -140,7 +140,7 @@ public class GeneralOptimizationDialog extends JDialog {
private final DescriptionArea selectedModifierDescription; private final DescriptionArea selectedModifierDescription;
private final SimulationModifierTree availableModifierTree; private final SimulationModifierTree availableModifierTree;
private final JComboBox<?> simulationSelectionCombo; private final JComboBox<String> simulationSelectionCombo;
private final JComboBox<?> optimizationParameterCombo; private final JComboBox<?> optimizationParameterCombo;
private final JComboBox<?> optimizationGoalCombo; private final JComboBox<?> optimizationGoalCombo;
@ -375,7 +375,7 @@ public class GeneralOptimizationDialog extends JDialog {
disableComponents.add(label); disableComponents.add(label);
sub.add(label, ""); sub.add(label, "");
simulationSelectionCombo = new JComboBox(); simulationSelectionCombo = new JComboBox<String>();
simulationSelectionCombo.setToolTipText(tip); simulationSelectionCombo.setToolTipText(tip);
populateSimulations(); populateSimulations();
simulationSelectionCombo.addActionListener(clearHistoryActionListener); simulationSelectionCombo.addActionListener(clearHistoryActionListener);
@ -389,7 +389,7 @@ public class GeneralOptimizationDialog extends JDialog {
disableComponents.add(label); disableComponents.add(label);
sub.add(label, ""); sub.add(label, "");
optimizationParameterCombo = new JComboBox(); optimizationParameterCombo = new JComboBox<String>();
optimizationParameterCombo.setToolTipText(tip); optimizationParameterCombo.setToolTipText(tip);
populateParameters(); populateParameters();
optimizationParameterCombo.addActionListener(clearHistoryActionListener); optimizationParameterCombo.addActionListener(clearHistoryActionListener);
@ -403,7 +403,7 @@ public class GeneralOptimizationDialog extends JDialog {
disableComponents.add(label); disableComponents.add(label);
sub.add(label, ""); sub.add(label, "");
optimizationGoalCombo = new JComboBox(new String[] { GOAL_MAXIMIZE, GOAL_MINIMIZE, GOAL_SEEK }); optimizationGoalCombo = new JComboBox<String>(new String[] { GOAL_MAXIMIZE, GOAL_MINIMIZE, GOAL_SEEK });
optimizationGoalCombo.setToolTipText(tip); optimizationGoalCombo.setToolTipText(tip);
optimizationGoalCombo.setEditable(false); optimizationGoalCombo.setEditable(false);
optimizationGoalCombo.addActionListener(clearHistoryActionListener); optimizationGoalCombo.addActionListener(clearHistoryActionListener);
@ -502,9 +502,7 @@ public class GeneralOptimizationDialog extends JDialog {
panel.add(sub, "span 2, grow, wrap para*2"); panel.add(sub, "span 2, grow, wrap para*2");
// // Rocket figure // // Rocket figure
FlightConfigurationID fcid = getSelectedSimulation().getOptions().getConfigID(); figure = new RocketFigure( getSelectedSimulation().getRocket() );
FlightConfiguration config = this.getSelectedSimulation().getRocket().getFlightConfiguration( fcid);
figure = new RocketFigure( config );
figure.setBorderPixels(1, 1); figure.setBorderPixels(1, 1);
ScaleScrollPane figureScrollPane = new ScaleScrollPane(figure); ScaleScrollPane figureScrollPane = new ScaleScrollPane(figure);
figureScrollPane.setFitting(true); figureScrollPane.setFitting(true);
@ -969,8 +967,6 @@ public class GeneralOptimizationDialog extends JDialog {
} }
Simulation sim = new Simulation(rocket); Simulation sim = new Simulation(rocket);
FlightConfiguration fc = new FlightConfiguration(fcid, rocket);
String name = createSimulationName(trans.get("basicSimulationName"), descriptor.format(rocket, fcid)); String name = createSimulationName(trans.get("basicSimulationName"), descriptor.format(rocket, fcid));
simulations.add(new Named<Simulation>(sim, name)); simulations.add(new Named<Simulation>(sim, name));
} }
@ -980,7 +976,7 @@ public class GeneralOptimizationDialog extends JDialog {
simulations.add(new Named<Simulation>(sim, name)); simulations.add(new Named<Simulation>(sim, name));
simulationSelectionCombo.setModel(new DefaultComboBoxModel(simulations.toArray())); simulationSelectionCombo.setModel(new DefaultComboBoxModel<String>((String[])simulations.toArray()));
simulationSelectionCombo.setSelectedIndex(0); simulationSelectionCombo.setSelectedIndex(0);
if (current != null) { if (current != null) {
for (int i = 0; i < simulations.size(); i++) { for (int i = 0; i < simulations.size(); i++) {
@ -1167,10 +1163,9 @@ public class GeneralOptimizationDialog extends JDialog {
selectedModifierDescription.setText(""); selectedModifierDescription.setText("");
} }
// Update the figure // Update the active configuration
FlightConfigurationID fcid = getSelectedSimulation().getOptions().getConfigID(); FlightConfigurationID fcid = getSelectedSimulation().getOptions().getConfigID();
FlightConfiguration config = this.getSelectedSimulation().getRocket().getFlightConfiguration( fcid); getSelectedSimulation().getRocket().setDefaultConfiguration(fcid);
figure.setConfiguration( config);
updating = false; updating = false;
} }

View File

@ -34,23 +34,24 @@ import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter; import javax.swing.event.MouseInputAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jogamp.opengl.util.awt.Overlay;
import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.gui.figureelements.CGCaret; import net.sf.openrocket.gui.figureelements.CGCaret;
import net.sf.openrocket.gui.figureelements.CPCaret; import net.sf.openrocket.gui.figureelements.CPCaret;
import net.sf.openrocket.gui.figureelements.FigureElement; import net.sf.openrocket.gui.figureelements.FigureElement;
import net.sf.openrocket.gui.main.Splash; import net.sf.openrocket.gui.main.Splash;
import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.FlightConfiguration;
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;
import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.startup.Preferences;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.MathUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jogamp.opengl.util.awt.Overlay;
/* /*
* @author Bill Kuker <bkuker@billkuker.com> * @author Bill Kuker <bkuker@billkuker.com>
*/ */
@ -74,7 +75,7 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
private static final int CARET_SIZE = 20; private static final int CARET_SIZE = 20;
private final OpenRocketDocument document; private final OpenRocketDocument document;
private final FlightConfiguration configuration; private final Rocket rkt;
private Component canvas; private Component canvas;
@ -95,9 +96,9 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
RocketRenderer rr = new FigureRenderer(); RocketRenderer rr = new FigureRenderer();
public RocketFigure3d(final OpenRocketDocument document, final FlightConfiguration config) { public RocketFigure3d(final OpenRocketDocument document) {
this.document = document; this.document = document;
this.configuration = config; this.rkt = document.getRocket();
this.setLayout(new BorderLayout()); this.setLayout(new BorderLayout());
//Only initizlize GL if 3d is enabled. //Only initizlize GL if 3d is enabled.
@ -292,8 +293,10 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
setupView(gl, glu); setupView(gl, glu);
final FlightConfiguration configuration = rkt.getDefaultConfiguration();
if (pickPoint != null) { if (pickPoint != null) {
gl.glDisable(GLLightingFunc.GL_LIGHTING); gl.glDisable(GLLightingFunc.GL_LIGHTING);
final RocketComponent picked = rr.pick(drawable, configuration, final RocketComponent picked = rr.pick(drawable, configuration,
pickPoint, pickEvent.isShiftDown() ? selection : null); pickPoint, pickEvent.isShiftDown() ? selection : null);
if (csl != null) { if (csl != null) {
@ -485,6 +488,7 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
return cachedBounds; return cachedBounds;
} else { } else {
final Bounds b = new Bounds(); final Bounds b = new Bounds();
final FlightConfiguration configuration = rkt.getDefaultConfiguration();
final Collection<Coordinate> bounds = configuration.getBounds(); final Collection<Coordinate> bounds = configuration.getBounds();
for (Coordinate c : bounds) { for (Coordinate c : bounds) {
b.xMax = Math.max(b.xMax, c.x); b.xMax = Math.max(b.xMax, c.x);

View File

@ -27,6 +27,7 @@ import net.sf.openrocket.gui.dialogs.flightconfiguration.MotorMountConfiguration
import net.sf.openrocket.gui.dialogs.motor.MotorChooserDialog; import net.sf.openrocket.gui.dialogs.motor.MotorChooserDialog;
import net.sf.openrocket.motor.Motor; import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.MotorInstance; import net.sf.openrocket.motor.MotorInstance;
import net.sf.openrocket.motor.ThrustCurveMotorInstance;
import net.sf.openrocket.rocketcomponent.FlightConfigurationID; import net.sf.openrocket.rocketcomponent.FlightConfigurationID;
import net.sf.openrocket.rocketcomponent.IgnitionEvent; import net.sf.openrocket.rocketcomponent.IgnitionEvent;
import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.MotorMount;
@ -212,11 +213,17 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
Motor m = motorChooserDialog.getSelectedMotor(); Motor m = motorChooserDialog.getSelectedMotor();
double d = motorChooserDialog.getSelectedDelay(); double d = motorChooserDialog.getSelectedDelay();
MotorInstance curInstance = curMount.getMotorInstance(fcid); //System.err.println("Just selected motor: "+m+" for config: "+fcid);
if (m != null) { if (m != null) {
curInstance = m.getNewInstance(); // DEBUG
//System.err.println(" >> new motor: "+m.getDesignation()+" delay: "+d);
ThrustCurveMotorInstance curInstance = (ThrustCurveMotorInstance) m.getNewInstance();
curInstance.setEjectionDelay(d); curInstance.setEjectionDelay(d);
curMount.setMotorInstance( fcid, curInstance); curMount.setMotorInstance( fcid, curInstance);
// DEBUG
//System.err.println(" set?: "+curMount.getMotorInstance(fcid).getMotor().getDesignation());
} }
fireTableDataChanged(); fireTableDataChanged();
@ -281,9 +288,9 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
MotorInstance curMotor = mount.getMotorInstance( configId); MotorInstance curMotor = mount.getMotorInstance( configId);
String motorString = getMotorSpecification( curMotor ); String motorString = getMotorSpecification( curMotor );
// if( mount instanceof BodyTube ){ // if( mount instanceof InnerTube ){
// System.err.println("Formatting Cell: fcid="+configId.key.substring(0, 8)); // System.err.println("Formatting Cell: fcid="+configId.key.substring(0, 8));
// ((BodyTube) mount).printMotorDebug(); // System.err.println( ((InnerTube) mount).toDebugString() );
// } // }
// System.err.println("rendering "+configId.getShortKey()+" cell: " ); // System.err.println("rendering "+configId.getShortKey()+" cell: " );
// if( rocket.getConfigurationSet().isDefault( configId) ){ // if( rocket.getConfigurationSet().isDefault( configId) ){

View File

@ -168,7 +168,7 @@ public class DesignReport {
configuration.setAllStages(); configuration.setAllStages();
PdfContentByte canvas = writer.getDirectContent(); PdfContentByte canvas = writer.getDirectContent();
final PrintFigure figure = new PrintFigure(configuration); final PrintFigure figure = new PrintFigure(rocket);
figure.setRotation(rotation); figure.setRotation(rotation);
FigureElement cp = panel.getExtraCP(); FigureElement cp = panel.getExtraCP();

View File

@ -4,21 +4,22 @@
package net.sf.openrocket.gui.print; package net.sf.openrocket.gui.print;
import net.sf.openrocket.gui.scalefigure.RocketFigure; import net.sf.openrocket.gui.scalefigure.RocketFigure;
import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.Rocket;
/** /**
* A figure used to override the scale factor in RocketFigure. This allows pinpoint scaling to allow a diagram * A figure used to override the scale factor in RocketFigure. This allows pinpoint scaling to allow a diagram
* to fit in the width of the chosen page size. * to fit in the width of the chosen page size.
*/ */
public class PrintFigure extends RocketFigure { public class PrintFigure extends RocketFigure {
private static final long serialVersionUID = -3843219909502782607L;
/** /**
* Constructor. * Constructor.
* *
* @param configuration the configuration * @param configuration the configuration
*/ */
public PrintFigure(final FlightConfiguration configuration) { public PrintFigure(final Rocket rkt) {
super(configuration); super(rkt);
} }
@Override @Override

View File

@ -59,7 +59,8 @@ public class RocketFigure extends AbstractScaleFigure {
public static final double SELECTED_WIDTH = 2.0; public static final double SELECTED_WIDTH = 2.0;
private FlightConfiguration configuration; private Rocket rocket;
private RocketComponent[] selection = new RocketComponent[0]; private RocketComponent[] selection = new RocketComponent[0];
private double figureWidth = 0, figureHeight = 0; private double figureWidth = 0, figureHeight = 0;
protected int figureWidthPx = 0, figureHeightPx = 0; protected int figureWidthPx = 0, figureHeightPx = 0;
@ -91,10 +92,9 @@ public class RocketFigure extends AbstractScaleFigure {
/** /**
* Creates a new rocket figure. * Creates a new rocket figure.
*/ */
public RocketFigure(FlightConfiguration configuration) { public RocketFigure(Rocket _rkt) {
super(); super();
this.rocket = _rkt;
this.configuration = configuration;
this.rotation = 0.0; this.rotation = 0.0;
this.transformation = Transformation.rotate_x(0.0); this.transformation = Transformation.rotate_x(0.0);
@ -102,15 +102,8 @@ public class RocketFigure extends AbstractScaleFigure {
updateFigure(); updateFigure();
} }
public FlightConfiguration getConfiguration() {
/** return this.rocket.getDefaultConfiguration();
* Set the configuration displayed by the figure. It may use the same or different rocket.
*
* @param configuration the configuration to display.
*/
public void setConfiguration(FlightConfiguration configuration) {
this.configuration = configuration;
updateFigure();
} }
@ -184,7 +177,8 @@ public class RocketFigure extends AbstractScaleFigure {
figureShapes.clear(); figureShapes.clear();
calculateSize(); calculateSize();
getShapes( figureShapes, configuration); FlightConfiguration config = rocket.getDefaultConfiguration();
getShapes( figureShapes, config);
repaint(); repaint();
fireChangeEvent(); fireChangeEvent();
@ -340,7 +334,8 @@ public class RocketFigure extends AbstractScaleFigure {
Color borderColor = ((SwingPreferences)Application.getPreferences()).getMotorBorderColor(); Color borderColor = ((SwingPreferences)Application.getPreferences()).getMotorBorderColor();
//MotorInstanceConfiguration mic = new MotorInstanceConfiguration(configuration); //MotorInstanceConfiguration mic = new MotorInstanceConfiguration(configuration);
for( MotorInstance curInstance : configuration.getActiveMotors()){ FlightConfiguration config = rocket.getDefaultConfiguration();
for( MotorInstance curInstance : config.getActiveMotors()){
MotorMount mount = curInstance.getMount(); MotorMount mount = curInstance.getMount();
Motor motor = curInstance.getMotor(); Motor motor = curInstance.getMotor();
double motorLength = motor.getLength(); double motorLength = motor.getLength();
@ -352,11 +347,9 @@ public class RocketFigure extends AbstractScaleFigure {
Coordinate[] mountLocations = mountComponent.getLocations(); Coordinate[] mountLocations = mountComponent.getLocations();
double mountLength = mountComponent.getLength(); double mountLength = mountComponent.getLength();
System.err.println("motors are drawing wrong... from here?"); //System.err.println("Drawing motor from here. Motor: "+motor.getDesignation()+" of length: "+motor.getLength());
for ( Coordinate curMountLocation : mountLocations ){ for ( Coordinate curMountLocation : mountLocations ){
Coordinate curMotorLocation = curMountLocation.add( mountLength - motorLength + mount.getMotorOverhang(), 0, 0); Coordinate curMotorLocation = curMountLocation.add( mountLength - motorLength + mount.getMotorOverhang(), 0, 0);
System.err.println("Translating from mount at "+curMountLocation+" to motor at "+curMotorLocation);
Coordinate coord = curMotorLocation; Coordinate coord = curMotorLocation;
{ {
@ -523,7 +516,7 @@ public class RocketFigure extends AbstractScaleFigure {
* The bounds are stored in the variables minX, maxX and maxR. * The bounds are stored in the variables minX, maxX and maxR.
*/ */
private void calculateFigureBounds() { private void calculateFigureBounds() {
Collection<Coordinate> bounds = configuration.getBounds(); Collection<Coordinate> bounds = rocket.getDefaultConfiguration().getBounds();
if (bounds.isEmpty()) { if (bounds.isEmpty()) {
minX = 0; minX = 0;

View File

@ -5,6 +5,8 @@ import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Font; import java.awt.Font;
import java.awt.Point; import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
@ -128,7 +130,6 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
private MassCalculator massCalculator; private MassCalculator massCalculator;
private final OpenRocketDocument document; private final OpenRocketDocument document;
private final FlightConfiguration configuration;
private Caret extraCP = null; private Caret extraCP = null;
private Caret extraCG = null; private Caret extraCG = null;
@ -169,17 +170,17 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
} }
public RocketPanel(OpenRocketDocument document) { public RocketPanel(OpenRocketDocument document) {
this.document = document; this.document = document;
configuration = document.getDefaultConfiguration(); Rocket rkt = document.getRocket();
// TODO: FUTURE: calculator selection // TODO: FUTURE: calculator selection
aerodynamicCalculator = new BarrowmanCalculator(); aerodynamicCalculator = new BarrowmanCalculator();
massCalculator = new MassCalculator(); massCalculator = new MassCalculator();
// Create figure and custom scroll pane // Create figure and custom scroll pane
figure = new RocketFigure(configuration); figure = new RocketFigure(rkt);
figure3d = new RocketFigure3d(document, configuration); figure3d = new RocketFigure3d(document);
figureHolder = new JPanel(new BorderLayout()); figureHolder = new JPanel(new BorderLayout());
@ -199,7 +200,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
is3d = true; is3d = true;
go2D(); go2D();
configuration.addChangeListener(new StateChangeListener() { rkt.addChangeListener(new StateChangeListener() {
@Override @Override
public void stateChanged(EventObject e) { public void stateChanged(EventObject e) {
updateExtras(); updateExtras();
@ -207,7 +208,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
} }
}); });
document.getRocket().addComponentChangeListener(new ComponentChangeListener() { rkt.addComponentChangeListener(new ComponentChangeListener() {
@Override @Override
public void componentChanged(ComponentChangeEvent e) { public void componentChanged(ComponentChangeEvent e) {
if (is3d) { if (is3d) {
@ -296,6 +297,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
add(scaleSelector); add(scaleSelector);
// Stage selector // Stage selector
final FlightConfiguration configuration = document.getDefaultConfiguration();
StageSelector stageSelector = new StageSelector(configuration); StageSelector stageSelector = new StageSelector(configuration);
add(stageSelector); add(stageSelector);
@ -305,14 +307,29 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
label.setHorizontalAlignment(JLabel.RIGHT); label.setHorizontalAlignment(JLabel.RIGHT);
add(label, "growx, right"); add(label, "growx, right");
// ?? this model should operate off of either: the rocket (or the FlightConfigurationSet contained in the rocket... )
ParameterSetModel<FlightConfiguration> psm = new ParameterSetModel<FlightConfiguration>( configuration.getRocket().getConfigurationSet()); ParameterSetModel<FlightConfiguration> psm = new ParameterSetModel<FlightConfiguration>( configuration.getRocket().getConfigurationSet());
JComboBox<FlightConfigurationID> flightConfigurationcomboBox = new JComboBox<FlightConfigurationID>(psm); JComboBox<FlightConfigurationID> flightConfigurationComboBox = new JComboBox<FlightConfigurationID>(psm);
add(flightConfigurationcomboBox, "wrap"); add(flightConfigurationComboBox, "wrap");
flightConfigurationComboBox.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
if( source instanceof JComboBox ){
JComboBox<FlightConfigurationID> box = (JComboBox<FlightConfigurationID>) source;
FlightConfiguration newConfig = (FlightConfiguration)box.getSelectedItem();
document.getRocket().getConfigurationSet().setDefault( newConfig);
updateExtras();
updateFigures();
// fireChangeEvent();
System.err.println(" processing actionevent for flight config combo box... cmd: "+ae.getActionCommand());
System.err.println(" seld key: "+newConfig);
}
}
});
// Create slider and scroll pane // Create slider and scroll pane
DoubleModel theta = new DoubleModel(figure, "Rotation", DoubleModel theta = new DoubleModel(figure, "Rotation",
UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI); UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI);
UnitSelector us = new UnitSelector(theta, true); UnitSelector us = new UnitSelector(theta, true);
@ -347,7 +364,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
} }
public FlightConfiguration getConfiguration() { public FlightConfiguration getConfiguration() {
return configuration; return document.getDefaultConfiguration();
} }
/** /**
@ -550,8 +567,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
Coordinate cp, cg; Coordinate cp, cg;
double cpx, cgx; double cpx, cgx;
FlightConfiguration curConfig = document.getDefaultConfiguration();
// TODO: MEDIUM: User-definable conditions // TODO: MEDIUM: User-definable conditions
FlightConditions conditions = new FlightConditions(configuration); FlightConditions conditions = new FlightConditions(curConfig);
warnings.clear(); warnings.clear();
if (!Double.isNaN(cpMach)) { if (!Double.isNaN(cpMach)) {
@ -577,13 +595,13 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
if (!Double.isNaN(cpTheta)) { if (!Double.isNaN(cpTheta)) {
conditions.setTheta(cpTheta); conditions.setTheta(cpTheta);
cp = aerodynamicCalculator.getCP(configuration, conditions, warnings); cp = aerodynamicCalculator.getCP(curConfig, conditions, warnings);
} else { } else {
cp = aerodynamicCalculator.getWorstCP(configuration, conditions, warnings); cp = aerodynamicCalculator.getWorstCP(curConfig, conditions, warnings);
} }
extraText.setTheta(cpTheta); extraText.setTheta(cpTheta);
cg = massCalculator.getCG(configuration, MassCalcType.LAUNCH_MASS); cg = massCalculator.getCG(curConfig, MassCalcType.LAUNCH_MASS);
// System.out.println("CG computed as "+cg+ " CP as "+cp); // System.out.println("CG computed as "+cg+ " CP as "+cp);
if (cp.weight > 0.000001) if (cp.weight > 0.000001)
@ -601,7 +619,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
// Length bound is assumed to be tight // Length bound is assumed to be tight
double length = 0, diameter = 0; double length = 0, diameter = 0;
Collection<Coordinate> bounds = configuration.getBounds(); Collection<Coordinate> bounds = curConfig.getBounds();
if (!bounds.isEmpty()) { if (!bounds.isEmpty()) {
double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY; double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY;
for (Coordinate c : bounds) { for (Coordinate c : bounds) {
@ -613,7 +631,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
length = maxX - minX; length = maxX - minX;
} }
for (RocketComponent c : configuration.getActiveComponents()) { for (RocketComponent c : curConfig.getActiveComponents()) {
if (c instanceof SymmetricComponent) { if (c instanceof SymmetricComponent) {
double d1 = ((SymmetricComponent) c).getForeRadius() * 2; double d1 = ((SymmetricComponent) c).getForeRadius() * 2;
double d2 = ((SymmetricComponent) c).getAftRadius() * 2; double d2 = ((SymmetricComponent) c).getAftRadius() * 2;
@ -652,18 +670,18 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
} }
// Check whether data is already up to date // Check whether data is already up to date
if (flightDataFunctionalID == configuration.getRocket().getFunctionalModID() && if (flightDataFunctionalID == curConfig.getRocket().getFunctionalModID() &&
flightDataMotorID == configuration.getFlightConfigurationID()) { flightDataMotorID == curConfig.getFlightConfigurationID()) {
return; return;
} }
flightDataFunctionalID = configuration.getRocket().getFunctionalModID(); flightDataFunctionalID = curConfig.getRocket().getFunctionalModID();
flightDataMotorID = configuration.getFlightConfigurationID(); flightDataMotorID = curConfig.getFlightConfigurationID();
// Stop previous computation (if any) // Stop previous computation (if any)
stopBackgroundSimulation(); stopBackgroundSimulation();
MotorInstanceConfiguration mic = new MotorInstanceConfiguration( configuration); MotorInstanceConfiguration mic = new MotorInstanceConfiguration( curConfig);
// Check that configuration has motors // Check that configuration has motors
if (!mic.hasMotors()){ if (!mic.hasMotors()){
@ -676,10 +694,10 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
if(((SwingPreferences) Application.getPreferences()).computeFlightInBackground()){ if(((SwingPreferences) Application.getPreferences()).computeFlightInBackground()){
extraText.setCalculatingData(true); extraText.setCalculatingData(true);
Rocket duplicate = (Rocket) configuration.getRocket().copy(); Rocket duplicate = (Rocket) document.getRocket().copy();
Simulation simulation = ((SwingPreferences) Application.getPreferences()).getBackgroundSimulation(duplicate); Simulation simulation = ((SwingPreferences) Application.getPreferences()).getBackgroundSimulation(duplicate);
simulation.getOptions().setMotorConfigurationID( simulation.getOptions().setMotorConfigurationID(
configuration.getFlightConfigurationID()); document.getDefaultConfiguration().getFlightConfigurationID());
backgroundSimulationWorker = new BackgroundSimulationWorker(document, simulation); backgroundSimulationWorker = new BackgroundSimulationWorker(document, simulation);
backgroundSimulationExecutor.execute(backgroundSimulationWorker); backgroundSimulationExecutor.execute(backgroundSimulationWorker);
@ -765,9 +783,10 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
* Adds the extra data to the figure. Currently this includes the CP and CG carets. * Adds the extra data to the figure. Currently this includes the CP and CG carets.
*/ */
private void addExtras() { private void addExtras() {
FlightConfiguration curConfig = document.getDefaultConfiguration();
extraCG = new CGCaret(0, 0); extraCG = new CGCaret(0, 0);
extraCP = new CPCaret(0, 0); extraCP = new CPCaret(0, 0);
extraText = new RocketInfo(configuration); extraText = new RocketInfo(curConfig);
updateExtras(); updateExtras();
figure.clearRelativeExtra(); figure.clearRelativeExtra();