From defcf24c86e4d3b062fa1f0e6df7ba5beb964deb Mon Sep 17 00:00:00 2001 From: Daniel_M_Williams Date: Wed, 2 Dec 2015 19:44:55 -0500 Subject: [PATCH] [Bugfix] Fixed several Config Id-Simulation Display Issues - Initial selected configuration is the last loaded - Correctly loads the correct config Id for each simulation - Can correctly display the Config Id for each sim. (both in table, and edit) --- .../document/OpenRocketDocument.java | 8 ++- .../sf/openrocket/document/Simulation.java | 14 +++-- .../importt/ComponentParameterHandler.java | 7 +++ .../importt/SimulationConditionsHandler.java | 8 +-- .../rocketcomponent/FlightConfiguration.java | 4 +- .../FlightConfigurationID.java | 20 +++++-- .../rocketcomponent/ParameterSet.java | 21 ++++++- .../sf/openrocket/rocketcomponent/Rocket.java | 60 ++++++++++++------- .../BasicEventSimulationEngine.java | 21 +------ .../simulation/SimulationConditions.java | 6 +- .../simulation/SimulationOptions.java | 15 ++--- .../openrocket/gui/main/SimulationPanel.java | 12 +++- .../FlightConfigurationPanel.java | 2 +- .../gui/scalefigure/RocketPanel.java | 5 +- .../gui/simulation/SimulationEditDialog.java | 19 +++--- 15 files changed, 139 insertions(+), 83 deletions(-) diff --git a/core/src/net/sf/openrocket/document/OpenRocketDocument.java b/core/src/net/sf/openrocket/document/OpenRocketDocument.java index d7155bba8..6d2c672d7 100644 --- a/core/src/net/sf/openrocket/document/OpenRocketDocument.java +++ b/core/src/net/sf/openrocket/document/OpenRocketDocument.java @@ -252,6 +252,10 @@ public class OpenRocketDocument implements ComponentChangeListener { public void addSimulation(Simulation simulation) { simulations.add(simulation); + FlightConfigurationID simId = simulation.getId(); + if( !rocket.containsFlightConfigurationID( simId )){ + rocket.createFlightConfiguration(simId); + } fireDocumentChangeEvent(new SimulationChangeEvent(simulation)); } @@ -628,12 +632,12 @@ public class OpenRocketDocument implements ComponentChangeListener { } } - public String getSimulationDetail(){ + public String toSimulationDetail(){ StringBuilder str = new StringBuilder(); str.append(">> Dumping simulation list:\n"); int simNum = 0; for( Simulation s : this.simulations ){ - str.append(String.format(" [%d] %s \n", simNum, s.getName(), s.getOptions().getId().toShortKey() )); + str.append(String.format(" [%d] %s (%s) \n", simNum, s.getName(), s.getOptions().getId().toShortKey() )); simNum++; } diff --git a/core/src/net/sf/openrocket/document/Simulation.java b/core/src/net/sf/openrocket/document/Simulation.java index 7bb32abdb..81091ff17 100644 --- a/core/src/net/sf/openrocket/document/Simulation.java +++ b/core/src/net/sf/openrocket/document/Simulation.java @@ -14,6 +14,7 @@ import net.sf.openrocket.formatting.RocketDescriptor; import net.sf.openrocket.masscalc.MassCalculator; import net.sf.openrocket.motor.MotorInstance; import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationID; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.simulation.BasicEventSimulationEngine; import net.sf.openrocket.simulation.DefaultSimulationOptionFactory; @@ -114,7 +115,8 @@ public class Simulation implements ChangeSource, Cloneable { DefaultSimulationOptionFactory f = Application.getInjector().getInstance(DefaultSimulationOptionFactory.class); options.copyConditionsFrom(f.getDefault()); - options.setFlightConfigurationId(rocket.getDefaultConfiguration().getFlightConfigurationID()); + FlightConfigurationID fcid = rocket.getDefaultConfiguration().getFlightConfigurationID(); + options.setFlightConfigurationId(fcid); options.addChangeListener(new ConditionListener()); } @@ -132,7 +134,7 @@ public class Simulation implements ChangeSource, Cloneable { throw new IllegalArgumentException("options cannot be null"); this.rocket = rocket; - + if (status == Status.UPTODATE) { this.status = Status.LOADED; } else if (data == null) { @@ -170,8 +172,11 @@ public class Simulation implements ChangeSource, Cloneable { mutex.verify(); return rocket; } -// -// + + public FlightConfigurationID getId(){ + return this.options.getFlightConfigurationId(); + } + // /** // * Return a newly created Configuration for this simulation. The configuration // * has the motor ID set and all stages active. @@ -515,4 +520,5 @@ public class Simulation implements ChangeSource, Cloneable { } } } + } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/ComponentParameterHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/ComponentParameterHandler.java index a23673e72..7bc42fe54 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/ComponentParameterHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/ComponentParameterHandler.java @@ -61,6 +61,13 @@ class ComponentParameterHandler extends AbstractElementHandler { } return new MotorConfigurationHandler((Rocket) component, context); } + if (element.equals("flightconfiguration")) { + if (!(component instanceof Rocket)) { + warnings.add(Warning.fromString("Illegal component defined for flight configuration.")); + return null; + } + return new MotorConfigurationHandler((Rocket) component, context); + } if ( element.equals("deploymentconfiguration")) { if ( !(component instanceof RecoveryDevice) ) { warnings.add(Warning.fromString("Illegal component defined as recovery device.")); diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/SimulationConditionsHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/SimulationConditionsHandler.java index 0ce6b87b0..ca9cd5d1a 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/SimulationConditionsHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/SimulationConditionsHandler.java @@ -50,11 +50,9 @@ class SimulationConditionsHandler extends AbstractElementHandler { if (element.equals("configid")) { - if (content.equals("")) { - conditions.setFlightConfigurationId(null); - } else { - conditions.setFlightConfigurationId(new FlightConfigurationID(content)); - } + // the ID constructor is designed to always return a valid value + FlightConfigurationID idToSet= new FlightConfigurationID(content); + conditions.setFlightConfigurationId(idToSet); } else if (element.equals("launchrodlength")) { if (Double.isNaN(d)) { warnings.add("Illegal launch rod length defined, ignoring."); diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java index c3f57a092..8d4121281 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java @@ -73,7 +73,7 @@ public class FlightConfiguration implements FlightConfigurableParameter(); config.stages.putAll( (Map) this.stages); config.motors.populate( this.motors ); diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationID.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationID.java index 78572c482..71d59b231 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationID.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationID.java @@ -12,11 +12,10 @@ public final class FlightConfigurationID implements Comparable> implements F public int size() { return map.size(); } - + @Override public FlightConfigurationID get(E testValue) { if( null == testValue ){ @@ -111,9 +111,26 @@ public class ParameterSet> implements F return null; } + + public E get(final int index) { + if( 0 > index){ + throw new ArrayIndexOutOfBoundsException("Attempt to retrieve a configurable parameter by an index less than zero: "+index); + } + if(( 0 > index) || ( this.map.size() <= index )){ + throw new ArrayIndexOutOfBoundsException("Attempt to retrieve a configurable parameter with an index larger " + +" than the stored values: "+index+"/"+this.map.size()); + } + + List ids = this.getSortedConfigurationIDs(); + FlightConfigurationID selectedId = ids.get(index); + return this.map.get(selectedId); + } @Override public E get(FlightConfigurationID id) { + if( id.hasError() ){ + throw new NullPointerException("Attempted to retrieve a parameter with an error key!"); + } E toReturn; if (map.containsKey(id)) { toReturn = map.get(id); @@ -224,7 +241,7 @@ public class ParameterSet> implements F if( this.isDefault(inst)){ shortKey = "*"+shortKey+"*"; } - buf.append(String.format(" >> [%s]= %s\n", shortKey, inst.toString() )); + buf.append(String.format(" >> [%s]= %s\n", shortKey, inst )); } } return buf.toString(); diff --git a/core/src/net/sf/openrocket/rocketcomponent/Rocket.java b/core/src/net/sf/openrocket/rocketcomponent/Rocket.java index 24f9f646c..41c53a665 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Rocket.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Rocket.java @@ -84,7 +84,7 @@ public class Rocket extends RocketComponent { treeModID = modID; functionalModID = modID; - FlightConfiguration defaultConfiguration = new FlightConfiguration( null, this); + FlightConfiguration defaultConfiguration = new FlightConfiguration( this, null); this.configSet = new FlightConfigurationSet(this, ComponentChangeEvent.CONFIG_CHANGE, defaultConfiguration); } @@ -520,12 +520,15 @@ public class Rocket extends RocketComponent { public FlightConfiguration createFlightConfiguration( final FlightConfigurationID fcid) { checkState(); - if( configSet.containsKey(fcid)){ + if( fcid.hasError() ){ + throw new NullPointerException("Attempted to create a flightConfiguration from an error key!"); + }else if( configSet.containsKey(fcid)){ return this.configSet.get(fcid); }else{ - FlightConfiguration nextConfig = new FlightConfiguration(fcid, this); + FlightConfiguration nextConfig = new FlightConfiguration(this, fcid); this.configSet.set(fcid, nextConfig); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + this.configSet.setDefault( nextConfig); + fireComponentChangeEvent(ComponentChangeEvent.TREE_CHANGE); return nextConfig; } } @@ -552,8 +555,9 @@ public class Rocket extends RocketComponent { */ public void removeFlightConfigurationID(FlightConfigurationID fcid) { checkState(); - if (fcid == null) + if( fcid.hasError() ){ return; + } // Get current configuration: this.configSet.set(fcid, null); @@ -569,8 +573,10 @@ public class Rocket extends RocketComponent { */ public boolean containsFlightConfigurationID(FlightConfigurationID id) { checkState(); - FlightConfiguration config = configSet.get( id); - return (null != config); + if( id.hasError() ){ + return false; + } + return configSet.containsKey( id); } @@ -582,8 +588,9 @@ public class Rocket extends RocketComponent { */ public boolean hasMotors(FlightConfigurationID fcid) { checkState(); - if (fcid == null) + if( fcid.hasError() ){ return false; + } Iterator iterator = this.iterator(); while (iterator.hasNext()) { @@ -608,23 +615,33 @@ public class Rocket extends RocketComponent { * @param id the flight configuration id * @return a FlightConfiguration instance */ - public FlightConfiguration getFlightConfiguration(final FlightConfigurationID id) { + public FlightConfiguration getFlightConfiguration(final FlightConfigurationID fcid) { checkState(); - return this.configSet.get(id); + return this.createFlightConfiguration(fcid); + } + + /** + * Return a flight configuration. If the supplied index is out of bounds, an exception is thrown. + * + * @param id the flight configuration index number + * @return a FlightConfiguration instance + */ + public FlightConfiguration getFlightConfiguration(final int configIndex) { + checkState(); + return this.configSet.get(configIndex); } public void setDefaultConfiguration(final FlightConfigurationID fcid) { checkState(); - if ( null == fcid ){ - // silently ignore + + if( fcid.hasError() ){ + log.error("attempt to set a 'fcid = config' with a error fcid. Ignored.", new IllegalArgumentException("error id:"+fcid)); return; }else if( this.configSet.containsKey(fcid)){ configSet.setDefault( configSet.get(fcid)); - }else{ - return; + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } - fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } /** @@ -636,18 +653,19 @@ public class Rocket extends RocketComponent { */ public void setFlightConfiguration(final FlightConfigurationID fcid, FlightConfiguration newConfig) { checkState(); - if (( null == fcid ) || (null == newConfig)){ - // silently ignore + if( fcid.hasError() ){ + log.error("attempt to set a 'fcid = config' with a error fcid. Ignored.", new IllegalArgumentException("error id:"+fcid)); return; - }else{ - configSet.set(fcid, newConfig); } + + if (null == newConfig){ + newConfig = createFlightConfiguration(fcid); + } + configSet.set(fcid, newConfig); fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } - - //////// Obligatory component information @Override public String getComponentName() { diff --git a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java index b22b3ba28..44b849ae8 100644 --- a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java +++ b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java @@ -65,8 +65,8 @@ public class BasicEventSimulationEngine implements SimulationEngine { FlightData flightData = new FlightData(); // Set up rocket configuration - FlightConfiguration configuration = setupConfiguration(simulationConditions); - this.fcid = configuration.getFlightConfigurationID(); + this.fcid = simulationConditions.getConfigurationID(); + FlightConfiguration configuration = simulationConditions.getRocket().getFlightConfiguration( this.fcid); List activeMotors = configuration.getActiveMotors(); if ( activeMotors.isEmpty() ) { @@ -245,22 +245,7 @@ public class BasicEventSimulationEngine implements SimulationEngine { } return status.getFlightData(); - } - - /** - * Create a rocket configuration from the launch conditions. - * - * @param simulation the launch conditions. - * @return a rocket configuration with all stages attached. - */ - private FlightConfiguration setupConfiguration(SimulationConditions simulation) { - FlightConfiguration configuration = new FlightConfiguration(simulation.getMotorConfigurationID(), simulation.getRocket()); - configuration.setAllStages(); - - return configuration; - } - - + } /** * Handles events occurring during the flight from the event queue. diff --git a/core/src/net/sf/openrocket/simulation/SimulationConditions.java b/core/src/net/sf/openrocket/simulation/SimulationConditions.java index 64c5e7153..24297b431 100644 --- a/core/src/net/sf/openrocket/simulation/SimulationConditions.java +++ b/core/src/net/sf/openrocket/simulation/SimulationConditions.java @@ -114,10 +114,14 @@ public class SimulationConditions implements Monitorable, Cloneable { this.rocket = rocket; } - + public FlightConfigurationID getMotorConfigurationID() { return configID; } + + public FlightConfigurationID getConfigurationID() { + return configID; + } public void setFlightConfigurationID(FlightConfigurationID _fcid) { this.configID = _fcid; diff --git a/core/src/net/sf/openrocket/simulation/SimulationOptions.java b/core/src/net/sf/openrocket/simulation/SimulationOptions.java index f370adc7e..f7167a187 100644 --- a/core/src/net/sf/openrocket/simulation/SimulationOptions.java +++ b/core/src/net/sf/openrocket/simulation/SimulationOptions.java @@ -51,7 +51,7 @@ public class SimulationOptions implements ChangeSource, Cloneable { protected final Preferences preferences = Application.getPreferences(); private final Rocket rocket; - private FlightConfigurationID configId = null; + private FlightConfigurationID configId = FlightConfigurationID.ERROR_CONFIGURATION_FCID; /* * NOTE: When adding/modifying parameters, they must also be added to the @@ -100,7 +100,7 @@ public class SimulationOptions implements ChangeSource, Cloneable { return rocket; } - public FlightConfigurationID getFlightConfiguratioId() { + public FlightConfigurationID getFlightConfigurationId() { return getId(); } @@ -109,16 +109,17 @@ public class SimulationOptions implements ChangeSource, Cloneable { } /** - * Set the motor configuration ID. This must be a valid motor configuration ID of - * the rocket, otherwise the configuration is set to null. + * Set the motor configuration ID. If this id does not yet exist, it will be created. * * @param id the configuration to set. */ public void setFlightConfigurationId(FlightConfigurationID fcid) { - if (! fcid.isValid() ){ - return; // error + if ( null == fcid ){ + throw new NullPointerException("Attempted to set a null Config id in simulation options. Not allowed!"); + }else if ( fcid.hasError() ){ + throw new IllegalArgumentException("Attempted to set the configuration to an error id. Not Allowed!"); }else if (!rocket.containsFlightConfigurationID(fcid)){ - return; + rocket.createFlightConfiguration(fcid); } if( fcid.equals(this.configId)){ diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index 2c23d75c6..34c622cbc 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -48,6 +48,8 @@ import net.sf.openrocket.gui.simulation.SimulationRunDialog; import net.sf.openrocket.gui.simulation.SimulationWarningDialog; import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.FlightConfigurationID; import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeListener; import net.sf.openrocket.rocketcomponent.FlightConfiguration; @@ -126,6 +128,7 @@ public class SimulationPanel extends JPanel { if (selection.length == 0) { return; } + Simulation[] sims = new Simulation[selection.length]; for (int i = 0; i < selection.length; i++) { selection[i] = simulationTable.convertRowIndexToModel(selection[i]); @@ -333,10 +336,13 @@ public class SimulationPanel extends JPanel { new Column(trans.get("simpanel.col.Configuration")) { @Override public Object getValueAt(int row) { - if (row < 0 || row >= document.getSimulationCount()) + if (row < 0 || row >= document.getSimulationCount()){ return null; - FlightConfiguration c = new FlightConfiguration( null, document.getSimulation(row).getRocket()); - return descriptor.format(c.getRocket(), c.getFlightConfigurationID()); + } + + Rocket rkt = document.getRocket(); + FlightConfigurationID fcid = document.getSimulation(row).getId(); + return descriptor.format( rkt, fcid); } @Override diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java index 039b5b80a..7e7c288de 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java @@ -124,7 +124,7 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe private void addConfiguration() { FlightConfigurationID newFCID = new FlightConfigurationID(); - FlightConfiguration newConfig = new FlightConfiguration( newFCID, rocket ); + FlightConfiguration newConfig = new FlightConfiguration( rocket, newFCID ); rocket.setFlightConfiguration(newFCID, newConfig); diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java index 179c40c97..fabfdd3d4 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java @@ -309,6 +309,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change ParameterSetModel psm = new ParameterSetModel( configuration.getRocket().getConfigurationSet()); JComboBox flightConfigurationComboBox = new JComboBox(psm); add(flightConfigurationComboBox, "wrap, width 16%, wmin 100"); + flightConfigurationComboBox.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ae) { @@ -320,10 +321,6 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change 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); } } }); diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java index 4184b1e3e..cb18f8cca 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java @@ -25,6 +25,7 @@ import net.sf.openrocket.gui.adaptors.ParameterSetModel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationID; import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.simulation.extension.SimulationExtension; import net.sf.openrocket.startup.Application; @@ -36,7 +37,6 @@ public class SimulationEditDialog extends JDialog { private final Simulation[] simulation; private final OpenRocketDocument document; private final SimulationOptions conditions; - private final FlightConfiguration configuration; private static final Translator trans = Application.getTranslator(); JPanel cards; @@ -50,7 +50,6 @@ public class SimulationEditDialog extends JDialog { this.parentWindow = parent; this.simulation = sims; this.conditions = simulation[0].getOptions(); - configuration = simulation[0].getRocket().getDefaultConfiguration(); this.cards = new JPanel(new CardLayout()); this.add(cards); @@ -150,18 +149,22 @@ public class SimulationEditDialog extends JDialog { label.setToolTipText(trans.get("simedtdlg.lbl.ttip.Flightcfg")); panel.add(label, "growx 0, gapright para"); - ParameterSetModel psm = new ParameterSetModel( configuration.getRocket().getConfigurationSet()); - JComboBox combo = new JComboBox(psm); + ParameterSetModel psm = new ParameterSetModel( document.getRocket().getConfigurationSet()); + final JComboBox configCombo = new JComboBox(psm); + FlightConfiguration config = document.getRocket().getFlightConfiguration(simulation[0].getId()); + configCombo.setSelectedItem( config ); //// Select the motor configuration to use. - combo.setToolTipText(trans.get("simedtdlg.combo.ttip.Flightcfg")); - combo.addActionListener(new ActionListener() { + configCombo.setToolTipText(trans.get("simedtdlg.combo.ttip.Flightcfg")); + configCombo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - conditions.setFlightConfigurationId(configuration.getFlightConfigurationID()); + FlightConfiguration config = (FlightConfiguration) configCombo.getSelectedItem(); + FlightConfigurationID id = config.getFlightConfigurationID(); + conditions.setFlightConfigurationId( id ); } }); - panel.add(combo, "span"); + panel.add(configCombo, "span"); panel.add(new JPanel(), "growx, wrap");