[#1746] Fix units in rocket optimizer "seek value of"

This commit is contained in:
SiboVG 2022-10-17 17:18:30 +02:00
parent 1b813ed4b4
commit a2f8e25360
3 changed files with 36 additions and 14 deletions

View File

@ -580,7 +580,7 @@ public class DoubleModel implements StateChangeListener, ChangeSource, Invalidat
private final ArrayList<EventListener> listeners = new ArrayList<EventListener>();
private final UnitGroup units;
private UnitGroup units;
private Unit currentUnit;
private final double minValue;
@ -877,6 +877,13 @@ public class DoubleModel implements StateChangeListener, ChangeSource, Invalidat
currentUnit = u;
fireStateChanged();
}
public void setUnitGroup(UnitGroup unitGroup) {
this.units = unitGroup;
this.currentUnit = units.getDefaultUnit();
this.lastValue = this.currentUnit.toUnit(this.lastValue);
fireStateChanged();
}
/**

View File

@ -380,6 +380,12 @@ public class GeneralOptimizationDialog extends JDialog {
optimizationParameterCombo.setToolTipText(tip);
populateParameters();
optimizationParameterCombo.addActionListener(clearHistoryActionListener);
optimizationParameterCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateSeekValueUnits();
}
});
disableComponents.add(optimizationParameterCombo);
sub.add(optimizationParameterCombo, "growx, wrap unrel");
@ -554,6 +560,7 @@ public class GeneralOptimizationDialog extends JDialog {
Collections.unmodifiableMap(evaluationHistory),
Collections.unmodifiableList(selectedModifiers),
getSelectedParameter(),
optimizationGoalUnitSelector.getSelectedUnit(),
UnitGroup.stabilityUnits(getSelectedSimulation().getRocket()),
GeneralOptimizationDialog.this);
dialog.setVisible(true);
@ -606,6 +613,7 @@ public class GeneralOptimizationDialog extends JDialog {
this.add(new JScrollPane(panel));
clearHistory();
updateComponents();
updateSeekValueUnits();
GUIUtil.setDisposableDialogOptions(this, null);
int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
@ -650,7 +658,8 @@ public class GeneralOptimizationDialog extends JDialog {
} else if (GOAL_MINIMIZE.equals(value)) {
goal = new MinimizationGoal();
} else if (GOAL_SEEK.equals(value)) {
goal = new ValueSeekGoal(optimizationSeekValue.getValue());
Unit u = parameter.getUnitGroup().getDefaultUnit();
goal = new ValueSeekGoal(u.toUnit(optimizationSeekValue.getValue()));
} else {
throw new BugException("optimizationGoalCombo had invalid value: " + value);
}
@ -834,13 +843,22 @@ public class GeneralOptimizationDialog extends JDialog {
evaluationHistory.clear();
optimizationPath.clear();
bestValue = Double.NaN;
bestValueUnit = getSelectedParameter().getUnitGroup().getDefaultUnit();
bestValueUnit = optimizationGoalUnitSelector.getSelectedUnit();
stepCount = 0;
evaluationCount = 0;
stepSize = 0.5;
updateCounters();
updateComponents();
}
private void updateSeekValueUnits() {
if (optimizationSeekValue != null && optimizationGoalUnitSelector != null) {
optimizationSeekValue.setUnitGroup(getSelectedParameter().getUnitGroup());
optimizationSeekValue.setValue(0);
optimizationGoalUnitSelector.setModel(optimizationSeekValue);
optimizationGoalUnitSelector.revalidate();
}
}
private void applyDesign() {
// TODO: MEDIUM: Apply also potential changes to simulations
@ -1168,7 +1186,7 @@ public class GeneralOptimizationDialog extends JDialog {
writer.write(fieldSeparator);
}
writer.write(getSelectedParameter().getName() + " / " +
getSelectedParameter().getUnitGroup().getDefaultUnit().getUnit());
optimizationGoalUnitSelector.getSelectedUnit().getUnit());
writer.write("\n");
}
@ -1187,7 +1205,7 @@ public class GeneralOptimizationDialog extends JDialog {
}
if (data.getParameterValue() != null) {
writer.write(TextUtil.doubleToString(data.getParameterValue().getUnitValue()));
writer.write(TextUtil.doubleToString(optimizationGoalUnitSelector.getSelectedUnit().toUnit(data.getParameterValue().getValue())));
} else {
writer.write("N/A");
}

View File

@ -80,7 +80,7 @@ public class OptimizationPlotDialog extends JDialog {
public OptimizationPlotDialog(List<Point> path, Map<Point, FunctionEvaluationData> evaluations,
List<SimulationModifier> modifiers, OptimizableParameter parameter, UnitGroup stabilityUnit, Window parent) {
List<SimulationModifier> modifiers, OptimizableParameter parameter, Unit parameterUnit, UnitGroup stabilityUnit, Window parent) {
super(parent, trans.get("title"), ModalityType.APPLICATION_MODAL);
@ -88,9 +88,9 @@ public class OptimizationPlotDialog extends JDialog {
ChartPanel chart;
if (modifiers.size() == 1) {
chart = create1DPlot(path, evaluations, modifiers, parameter, stabilityUnit);
chart = create1DPlot(path, evaluations, modifiers, parameter, parameterUnit, stabilityUnit);
} else if (modifiers.size() == 2) {
chart = create2DPlot(path, evaluations, modifiers, parameter, stabilityUnit);
chart = create2DPlot(path, evaluations, modifiers, parameter, parameterUnit, stabilityUnit);
} else {
throw new IllegalArgumentException("Invalid dimensionality, dim=" + modifiers.size());
}
@ -126,11 +126,11 @@ public class OptimizationPlotDialog extends JDialog {
* Create a 1D plot of the optimization path.
*/
private ChartPanel create1DPlot(List<Point> path, Map<Point, FunctionEvaluationData> evaluations,
List<SimulationModifier> modifiers, OptimizableParameter parameter, UnitGroup stabilityUnit) {
List<SimulationModifier> modifiers, OptimizableParameter parameter, Unit parameterUnit, UnitGroup stabilityUnit) {
SimulationModifier modX = modifiers.get(0);
Unit xUnit = modX.getUnitGroup().getDefaultUnit();
Unit yUnit = parameter.getUnitGroup().getDefaultUnit();
Unit yUnit = parameterUnit;
// Create the optimization path (with autosort)
XYSeries series = new XYSeries(trans.get("plot1d.series"), true, true);
@ -224,10 +224,7 @@ public class OptimizationPlotDialog extends JDialog {
* Create a 2D plot of the optimization path.
*/
private ChartPanel create2DPlot(List<Point> path, Map<Point, FunctionEvaluationData> evaluations,
List<SimulationModifier> modifiers, OptimizableParameter parameter, UnitGroup stabilityUnit) {
Unit parameterUnit = parameter.getUnitGroup().getDefaultUnit();
List<SimulationModifier> modifiers, OptimizableParameter parameter, Unit parameterUnit, UnitGroup stabilityUnit) {
SimulationModifier modX = modifiers.get(0);
SimulationModifier modY = modifiers.get(1);