[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)
This commit is contained in:
Daniel_M_Williams 2015-12-02 19:44:55 -05:00
parent 040c451a3d
commit defcf24c86
15 changed files with 139 additions and 83 deletions

View File

@ -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++;
}

View File

@ -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());
}
@ -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 {
}
}
}
}

View File

@ -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."));

View File

@ -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.");

View File

@ -73,7 +73,7 @@ public class FlightConfiguration implements FlightConfigurableParameter<FlightCo
* @param _fcid the ID this configuration should have.
* @param rocket the rocket
*/
public FlightConfiguration(final FlightConfigurationID _fcid, Rocket rocket ) {
public FlightConfiguration(final Rocket rocket, final FlightConfigurationID _fcid ) {
if( null == _fcid){
this.fcid = new FlightConfigurationID();
}else{
@ -456,7 +456,7 @@ public class FlightConfiguration implements FlightConfigurableParameter<FlightCo
*/
@Override
public FlightConfiguration clone() {
FlightConfiguration config = new FlightConfiguration( this.fcid, this.getRocket() );
FlightConfiguration config = new FlightConfiguration( this.getRocket(), this.fcid );
config.listenerList = new ArrayList<EventListener>();
config.stages.putAll( (Map<Integer, StageFlags>) this.stages);
config.motors.populate( this.motors );

View File

@ -12,11 +12,10 @@ public final class FlightConfigurationID implements Comparable<FlightConfigurati
private final static long DEFAULT_MOST_SIG_BITS = 0xF4F2F1F0;
private final static UUID ERROR_CONFIGURATION_UUID = new UUID( DEFAULT_MOST_SIG_BITS, 2489);
// private final static String DEFAULT_CONFIGURATION_KEYTEXT = "default_configuration_6602";
private final static String ERROR_KEY_NAME = "<Error_Key>";
private final static UUID DEFAULT_VALUE_UUID = new UUID( DEFAULT_MOST_SIG_BITS, 5676);
public final static FlightConfigurationID ERROR_CONFIGURATION_FCID = new FlightConfigurationID( FlightConfigurationID.ERROR_CONFIGURATION_UUID);
// public final static FlightConfigurationID DEFAULT_CONFIGURATION_FCID = new FlightConfigurationID( FlightConfigurationID.DEFAULT_CONFIGURATION_KEYTEXT );
public final static FlightConfigurationID DEFAULT_VALUE_FCID = new FlightConfigurationID( FlightConfigurationID.DEFAULT_VALUE_UUID );
public FlightConfigurationID() {
@ -24,8 +23,12 @@ public final class FlightConfigurationID implements Comparable<FlightConfigurati
}
public FlightConfigurationID(final String _str) {
if("".equals(_str)){
this.key = UUID.randomUUID();
}else{
this.key = UUID.fromString( _str);
}
}
public FlightConfigurationID(final UUID _val) {
if (null == _val){
@ -46,7 +49,11 @@ public final class FlightConfigurationID implements Comparable<FlightConfigurati
}
public String toShortKey(){
if( isValid()){
return this.key.toString().substring(0,8);
}else{
return ERROR_KEY_NAME;
}
}
public String getFullKeyText(){
@ -62,8 +69,11 @@ public final class FlightConfigurationID implements Comparable<FlightConfigurati
return this.key;
}
public boolean hasError(){
return (ERROR_CONFIGURATION_UUID == this.key);
}
public boolean isValid() {
return (this.key != ERROR_CONFIGURATION_UUID);
return !hasError();
}
@Override

View File

@ -112,8 +112,25 @@ public class ParameterSet<E extends FlightConfigurableParameter<E>> 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<FlightConfigurationID> 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<E extends FlightConfigurableParameter<E>> 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();

View File

@ -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<RocketComponent> iterator = this.iterator();
while (iterator.hasNext()) {
@ -608,24 +615,34 @@ 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);
}
}
/**
* Associate the given ID and flight configuration.
@ -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() {

View File

@ -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<MotorInstance> activeMotors = configuration.getActiveMotors();
if ( activeMotors.isEmpty() ) {
@ -247,21 +247,6 @@ 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.
* Each event that has occurred before or at the current simulation time is

View File

@ -119,6 +119,10 @@ public class SimulationConditions implements Monitorable, Cloneable {
return configID;
}
public FlightConfigurationID getConfigurationID() {
return configID;
}
public void setFlightConfigurationID(FlightConfigurationID _fcid) {
this.configID = _fcid;
this.modID++;

View File

@ -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 <code>null</code>.
* 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)){

View File

@ -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

View File

@ -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);

View File

@ -309,6 +309,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
ParameterSetModel<FlightConfiguration> psm = new ParameterSetModel<FlightConfiguration>( configuration.getRocket().getConfigurationSet());
JComboBox<FlightConfiguration> flightConfigurationComboBox = new JComboBox<FlightConfiguration>(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);
}
}
});

View File

@ -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<FlightConfiguration> psm = new ParameterSetModel<FlightConfiguration>( configuration.getRocket().getConfigurationSet());
JComboBox<FlightConfiguration> combo = new JComboBox<FlightConfiguration>(psm);
ParameterSetModel<FlightConfiguration> psm = new ParameterSetModel<FlightConfiguration>( document.getRocket().getConfigurationSet());
final JComboBox<FlightConfiguration> configCombo = new JComboBox<FlightConfiguration>(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");