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

View File

@ -378,22 +378,17 @@ public class BodyTube extends SymmetricComponent implements MotorMount, Coaxial
@Override
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){
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);
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(this.rocket.getConfigurationSet().toDebug());
//System.err.println("returning "+toReturn.size()+" active motor instances for this configuration: "+this.fcid.getShortKey());
//System.err.println(this.rocket.getConfigurationSet().toDebug());
return toReturn;
}

View File

@ -272,22 +272,17 @@ public class InnerTube extends ThicknessRingComponent implements Clusterable, Ra
@Override
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){
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);
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

View File

@ -52,6 +52,7 @@ public class MotorConfigurationSet extends ParameterSet<MotorInstance> {
return buffer.toString();
}
// public void printDebug(FlightConfigurationID curFCID){
// if( this.map.containsKey(curFCID)){
// // 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.
*
* @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.ListDataListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.FlightConfigurableParameter;
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 {
//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 EventListenerList listenerList = new EventListenerList();
@ -69,6 +72,7 @@ public class ParameterSetModel<T extends FlightConfigurableParameter<T>> impleme
}
if (!(item instanceof FlightConfigurationID)) {
throw new IllegalArgumentException("MotorConfigurationModel item=" + item);
}
FlightConfigurationID fcid= (FlightConfigurationID) item;

View File

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

View File

@ -34,23 +34,24 @@ import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
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.gui.figureelements.CGCaret;
import net.sf.openrocket.gui.figureelements.CPCaret;
import net.sf.openrocket.gui.figureelements.FigureElement;
import net.sf.openrocket.gui.main.Splash;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.startup.Preferences;
import net.sf.openrocket.util.Coordinate;
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>
*/
@ -74,7 +75,7 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
private static final int CARET_SIZE = 20;
private final OpenRocketDocument document;
private final FlightConfiguration configuration;
private final Rocket rkt;
private Component canvas;
@ -95,9 +96,9 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
RocketRenderer rr = new FigureRenderer();
public RocketFigure3d(final OpenRocketDocument document, final FlightConfiguration config) {
public RocketFigure3d(final OpenRocketDocument document) {
this.document = document;
this.configuration = config;
this.rkt = document.getRocket();
this.setLayout(new BorderLayout());
//Only initizlize GL if 3d is enabled.
@ -292,8 +293,10 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
setupView(gl, glu);
final FlightConfiguration configuration = rkt.getDefaultConfiguration();
if (pickPoint != null) {
gl.glDisable(GLLightingFunc.GL_LIGHTING);
final RocketComponent picked = rr.pick(drawable, configuration,
pickPoint, pickEvent.isShiftDown() ? selection : null);
if (csl != null) {
@ -485,6 +488,7 @@ public class RocketFigure3d extends JPanel implements GLEventListener {
return cachedBounds;
} else {
final Bounds b = new Bounds();
final FlightConfiguration configuration = rkt.getDefaultConfiguration();
final Collection<Coordinate> bounds = configuration.getBounds();
for (Coordinate c : bounds) {
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.motor.Motor;
import net.sf.openrocket.motor.MotorInstance;
import net.sf.openrocket.motor.ThrustCurveMotorInstance;
import net.sf.openrocket.rocketcomponent.FlightConfigurationID;
import net.sf.openrocket.rocketcomponent.IgnitionEvent;
import net.sf.openrocket.rocketcomponent.MotorMount;
@ -212,11 +213,17 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
Motor m = motorChooserDialog.getSelectedMotor();
double d = motorChooserDialog.getSelectedDelay();
MotorInstance curInstance = curMount.getMotorInstance(fcid);
//System.err.println("Just selected motor: "+m+" for config: "+fcid);
if (m != null) {
curInstance = m.getNewInstance();
// DEBUG
//System.err.println(" >> new motor: "+m.getDesignation()+" delay: "+d);
ThrustCurveMotorInstance curInstance = (ThrustCurveMotorInstance) m.getNewInstance();
curInstance.setEjectionDelay(d);
curMount.setMotorInstance( fcid, curInstance);
// DEBUG
//System.err.println(" set?: "+curMount.getMotorInstance(fcid).getMotor().getDesignation());
}
fireTableDataChanged();
@ -281,9 +288,9 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount>
MotorInstance curMotor = mount.getMotorInstance( configId);
String motorString = getMotorSpecification( curMotor );
// if( mount instanceof BodyTube ){
// if( mount instanceof InnerTube ){
// 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: " );
// if( rocket.getConfigurationSet().isDefault( configId) ){

View File

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

View File

@ -4,21 +4,22 @@
package net.sf.openrocket.gui.print;
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
* to fit in the width of the chosen page size.
*/
public class PrintFigure extends RocketFigure {
private static final long serialVersionUID = -3843219909502782607L;
/**
* Constructor.
*
* @param configuration the configuration
*/
public PrintFigure(final FlightConfiguration configuration) {
super(configuration);
public PrintFigure(final Rocket rkt) {
super(rkt);
}
@Override

View File

@ -59,7 +59,8 @@ public class RocketFigure extends AbstractScaleFigure {
public static final double SELECTED_WIDTH = 2.0;
private FlightConfiguration configuration;
private Rocket rocket;
private RocketComponent[] selection = new RocketComponent[0];
private double figureWidth = 0, figureHeight = 0;
protected int figureWidthPx = 0, figureHeightPx = 0;
@ -91,10 +92,9 @@ public class RocketFigure extends AbstractScaleFigure {
/**
* Creates a new rocket figure.
*/
public RocketFigure(FlightConfiguration configuration) {
public RocketFigure(Rocket _rkt) {
super();
this.configuration = configuration;
this.rocket = _rkt;
this.rotation = 0.0;
this.transformation = Transformation.rotate_x(0.0);
@ -102,15 +102,8 @@ public class RocketFigure extends AbstractScaleFigure {
updateFigure();
}
/**
* 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();
public FlightConfiguration getConfiguration() {
return this.rocket.getDefaultConfiguration();
}
@ -184,7 +177,8 @@ public class RocketFigure extends AbstractScaleFigure {
figureShapes.clear();
calculateSize();
getShapes( figureShapes, configuration);
FlightConfiguration config = rocket.getDefaultConfiguration();
getShapes( figureShapes, config);
repaint();
fireChangeEvent();
@ -340,7 +334,8 @@ public class RocketFigure extends AbstractScaleFigure {
Color borderColor = ((SwingPreferences)Application.getPreferences()).getMotorBorderColor();
//MotorInstanceConfiguration mic = new MotorInstanceConfiguration(configuration);
for( MotorInstance curInstance : configuration.getActiveMotors()){
FlightConfiguration config = rocket.getDefaultConfiguration();
for( MotorInstance curInstance : config.getActiveMotors()){
MotorMount mount = curInstance.getMount();
Motor motor = curInstance.getMotor();
double motorLength = motor.getLength();
@ -352,11 +347,9 @@ public class RocketFigure extends AbstractScaleFigure {
Coordinate[] mountLocations = mountComponent.getLocations();
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 ){
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;
{
@ -523,7 +516,7 @@ public class RocketFigure extends AbstractScaleFigure {
* The bounds are stored in the variables minX, maxX and maxR.
*/
private void calculateFigureBounds() {
Collection<Coordinate> bounds = configuration.getBounds();
Collection<Coordinate> bounds = rocket.getDefaultConfiguration().getBounds();
if (bounds.isEmpty()) {
minX = 0;

View File

@ -5,6 +5,8 @@ import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
@ -128,7 +130,6 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
private MassCalculator massCalculator;
private final OpenRocketDocument document;
private final FlightConfiguration configuration;
private Caret extraCP = null;
private Caret extraCG = null;
@ -169,17 +170,17 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
}
public RocketPanel(OpenRocketDocument document) {
this.document = document;
configuration = document.getDefaultConfiguration();
Rocket rkt = document.getRocket();
// TODO: FUTURE: calculator selection
aerodynamicCalculator = new BarrowmanCalculator();
massCalculator = new MassCalculator();
// Create figure and custom scroll pane
figure = new RocketFigure(configuration);
figure3d = new RocketFigure3d(document, configuration);
figure = new RocketFigure(rkt);
figure3d = new RocketFigure3d(document);
figureHolder = new JPanel(new BorderLayout());
@ -199,7 +200,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
is3d = true;
go2D();
configuration.addChangeListener(new StateChangeListener() {
rkt.addChangeListener(new StateChangeListener() {
@Override
public void stateChanged(EventObject e) {
updateExtras();
@ -207,7 +208,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
}
});
document.getRocket().addComponentChangeListener(new ComponentChangeListener() {
rkt.addComponentChangeListener(new ComponentChangeListener() {
@Override
public void componentChanged(ComponentChangeEvent e) {
if (is3d) {
@ -296,6 +297,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
add(scaleSelector);
// Stage selector
final FlightConfiguration configuration = document.getDefaultConfiguration();
StageSelector stageSelector = new StageSelector(configuration);
add(stageSelector);
@ -305,14 +307,29 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
label.setHorizontalAlignment(JLabel.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());
JComboBox<FlightConfigurationID> flightConfigurationcomboBox = new JComboBox<FlightConfigurationID>(psm);
add(flightConfigurationcomboBox, "wrap");
JComboBox<FlightConfigurationID> flightConfigurationComboBox = new JComboBox<FlightConfigurationID>(psm);
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
DoubleModel theta = new DoubleModel(figure, "Rotation",
UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI);
UnitSelector us = new UnitSelector(theta, true);
@ -347,7 +364,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
}
public FlightConfiguration getConfiguration() {
return configuration;
return document.getDefaultConfiguration();
}
/**
@ -550,8 +567,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
Coordinate cp, cg;
double cpx, cgx;
FlightConfiguration curConfig = document.getDefaultConfiguration();
// TODO: MEDIUM: User-definable conditions
FlightConditions conditions = new FlightConditions(configuration);
FlightConditions conditions = new FlightConditions(curConfig);
warnings.clear();
if (!Double.isNaN(cpMach)) {
@ -577,13 +595,13 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
if (!Double.isNaN(cpTheta)) {
conditions.setTheta(cpTheta);
cp = aerodynamicCalculator.getCP(configuration, conditions, warnings);
cp = aerodynamicCalculator.getCP(curConfig, conditions, warnings);
} else {
cp = aerodynamicCalculator.getWorstCP(configuration, conditions, warnings);
cp = aerodynamicCalculator.getWorstCP(curConfig, conditions, warnings);
}
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);
if (cp.weight > 0.000001)
@ -601,7 +619,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
// Length bound is assumed to be tight
double length = 0, diameter = 0;
Collection<Coordinate> bounds = configuration.getBounds();
Collection<Coordinate> bounds = curConfig.getBounds();
if (!bounds.isEmpty()) {
double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY;
for (Coordinate c : bounds) {
@ -613,7 +631,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
length = maxX - minX;
}
for (RocketComponent c : configuration.getActiveComponents()) {
for (RocketComponent c : curConfig.getActiveComponents()) {
if (c instanceof SymmetricComponent) {
double d1 = ((SymmetricComponent) c).getForeRadius() * 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
if (flightDataFunctionalID == configuration.getRocket().getFunctionalModID() &&
flightDataMotorID == configuration.getFlightConfigurationID()) {
if (flightDataFunctionalID == curConfig.getRocket().getFunctionalModID() &&
flightDataMotorID == curConfig.getFlightConfigurationID()) {
return;
}
flightDataFunctionalID = configuration.getRocket().getFunctionalModID();
flightDataMotorID = configuration.getFlightConfigurationID();
flightDataFunctionalID = curConfig.getRocket().getFunctionalModID();
flightDataMotorID = curConfig.getFlightConfigurationID();
// Stop previous computation (if any)
stopBackgroundSimulation();
MotorInstanceConfiguration mic = new MotorInstanceConfiguration( configuration);
MotorInstanceConfiguration mic = new MotorInstanceConfiguration( curConfig);
// Check that configuration has motors
if (!mic.hasMotors()){
@ -676,10 +694,10 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
if(((SwingPreferences) Application.getPreferences()).computeFlightInBackground()){
extraText.setCalculatingData(true);
Rocket duplicate = (Rocket) configuration.getRocket().copy();
Rocket duplicate = (Rocket) document.getRocket().copy();
Simulation simulation = ((SwingPreferences) Application.getPreferences()).getBackgroundSimulation(duplicate);
simulation.getOptions().setMotorConfigurationID(
configuration.getFlightConfigurationID());
document.getDefaultConfiguration().getFlightConfigurationID());
backgroundSimulationWorker = new BackgroundSimulationWorker(document, simulation);
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.
*/
private void addExtras() {
FlightConfiguration curConfig = document.getDefaultConfiguration();
extraCG = new CGCaret(0, 0);
extraCP = new CPCaret(0, 0);
extraText = new RocketInfo(configuration);
extraText = new RocketInfo(curConfig);
updateExtras();
figure.clearRelativeExtra();