Refactor PlotConfiguration to SimulationPlotConfiguration

This commit is contained in:
SiboVG 2024-08-13 21:49:57 +02:00
parent 8a0a12cd94
commit c3a2bb8d29
4 changed files with 52 additions and 53 deletions

View File

@ -15,7 +15,6 @@ import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -89,9 +88,9 @@ public class SimulationPlot {
private final JFreeChart chart; private final JFreeChart chart;
private final PlotConfiguration config; private final SimulationPlotConfiguration config;
private final Simulation simulation; private final Simulation simulation;
private final PlotConfiguration filled; private final SimulationPlotConfiguration filled;
private final List<EventDisplayInfo> eventList; private final List<EventDisplayInfo> eventList;
private final List<ModifiedXYItemRenderer> renderers = new ArrayList<>(); private final List<ModifiedXYItemRenderer> renderers = new ArrayList<>();
@ -129,7 +128,7 @@ public class SimulationPlot {
errorAnnotations.setCurrent(branch); errorAnnotations.setCurrent(branch);
} }
SimulationPlot(Simulation simulation, PlotConfiguration config, boolean initialShowPoints) { SimulationPlot(Simulation simulation, SimulationPlotConfiguration config, boolean initialShowPoints) {
this.simulation = simulation; this.simulation = simulation;
this.config = config; this.config = config;
this.branchCount = simulation.getSimulatedData().getBranchCount(); this.branchCount = simulation.getSimulatedData().getBranchCount();
@ -163,7 +162,7 @@ public class SimulationPlot {
this.filled = config.fillAutoAxes(mainBranch); this.filled = config.fillAutoAxes(mainBranch);
// Compute the axes based on the min and max value of all branches // Compute the axes based on the min and max value of all branches
PlotConfiguration plotConfig = filled.clone(); SimulationPlotConfiguration plotConfig = filled.clone();
plotConfig.fitAxes(simulation.getSimulatedData().getBranches()); plotConfig.fitAxes(simulation.getSimulatedData().getBranches());
List<Axis> minMaxAxes = plotConfig.getAllAxes(); List<Axis> minMaxAxes = plotConfig.getAllAxes();

View File

@ -17,17 +17,17 @@ import info.openrocket.core.util.MathUtil;
import info.openrocket.core.util.Pair; import info.openrocket.core.util.Pair;
public class PlotConfiguration implements Cloneable { public class SimulationPlotConfiguration implements Cloneable {
private static final Translator trans = Application.getTranslator(); private static final Translator trans = Application.getTranslator();
public static final PlotConfiguration[] DEFAULT_CONFIGURATIONS; public static final SimulationPlotConfiguration[] DEFAULT_CONFIGURATIONS;
static { static {
ArrayList<PlotConfiguration> configs = new ArrayList<>(); ArrayList<SimulationPlotConfiguration> configs = new ArrayList<>();
PlotConfiguration config; SimulationPlotConfiguration config;
//// Vertical motion vs. time //// Vertical motion vs. time
config = new PlotConfiguration(trans.get("PlotConfiguration.Verticalmotion")); config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Verticalmotion"));
config.addPlotDataType(FlightDataType.TYPE_ALTITUDE, 0); config.addPlotDataType(FlightDataType.TYPE_ALTITUDE, 0);
config.addPlotDataType(FlightDataType.TYPE_VELOCITY_Z); config.addPlotDataType(FlightDataType.TYPE_VELOCITY_Z);
config.addPlotDataType(FlightDataType.TYPE_ACCELERATION_Z); config.addPlotDataType(FlightDataType.TYPE_ACCELERATION_Z);
@ -43,7 +43,7 @@ public class PlotConfiguration implements Cloneable {
configs.add(config); configs.add(config);
//// Total motion vs. time //// Total motion vs. time
config = new PlotConfiguration(trans.get("PlotConfiguration.Totalmotion")); config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Totalmotion"));
config.addPlotDataType(FlightDataType.TYPE_ALTITUDE, 0); config.addPlotDataType(FlightDataType.TYPE_ALTITUDE, 0);
config.addPlotDataType(FlightDataType.TYPE_VELOCITY_TOTAL); config.addPlotDataType(FlightDataType.TYPE_VELOCITY_TOTAL);
config.addPlotDataType(FlightDataType.TYPE_ACCELERATION_TOTAL); config.addPlotDataType(FlightDataType.TYPE_ACCELERATION_TOTAL);
@ -59,7 +59,7 @@ public class PlotConfiguration implements Cloneable {
configs.add(config); configs.add(config);
//// Flight side profile //// Flight side profile
config = new PlotConfiguration(trans.get("PlotConfiguration.Flightside"), FlightDataType.TYPE_POSITION_X); config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Flightside"), FlightDataType.TYPE_POSITION_X);
config.addPlotDataType(FlightDataType.TYPE_ALTITUDE); config.addPlotDataType(FlightDataType.TYPE_ALTITUDE);
config.setEvent(FlightEvent.Type.IGNITION, true); config.setEvent(FlightEvent.Type.IGNITION, true);
config.setEvent(FlightEvent.Type.BURNOUT, true); config.setEvent(FlightEvent.Type.BURNOUT, true);
@ -74,7 +74,7 @@ public class PlotConfiguration implements Cloneable {
//// Ground track //// Ground track
config = new PlotConfiguration(trans.get("PlotConfiguration.Groundtrack"), FlightDataType.TYPE_POSITION_X); config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Groundtrack"), FlightDataType.TYPE_POSITION_X);
config.addPlotDataType(FlightDataType.TYPE_POSITION_Y, 0); config.addPlotDataType(FlightDataType.TYPE_POSITION_Y, 0);
config.addPlotDataType(FlightDataType.TYPE_ALTITUDE, 1); config.addPlotDataType(FlightDataType.TYPE_ALTITUDE, 1);
config.setEvent(FlightEvent.Type.IGNITION, true); config.setEvent(FlightEvent.Type.IGNITION, true);
@ -87,7 +87,7 @@ public class PlotConfiguration implements Cloneable {
configs.add(config); configs.add(config);
//// Stability vs. time //// Stability vs. time
config = new PlotConfiguration(trans.get("PlotConfiguration.Stability")); config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Stability"));
config.addPlotDataType(FlightDataType.TYPE_STABILITY, 0); config.addPlotDataType(FlightDataType.TYPE_STABILITY, 0);
config.addPlotDataType(FlightDataType.TYPE_CP_LOCATION, 1); config.addPlotDataType(FlightDataType.TYPE_CP_LOCATION, 1);
config.addPlotDataType(FlightDataType.TYPE_CG_LOCATION, 1); config.addPlotDataType(FlightDataType.TYPE_CG_LOCATION, 1);
@ -102,7 +102,7 @@ public class PlotConfiguration implements Cloneable {
configs.add(config); configs.add(config);
//// Drag coefficients vs. Mach number //// Drag coefficients vs. Mach number
config = new PlotConfiguration(trans.get("PlotConfiguration.Dragcoef"), config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Dragcoef"),
FlightDataType.TYPE_MACH_NUMBER); FlightDataType.TYPE_MACH_NUMBER);
config.addPlotDataType(FlightDataType.TYPE_DRAG_COEFF, 0); config.addPlotDataType(FlightDataType.TYPE_DRAG_COEFF, 0);
config.addPlotDataType(FlightDataType.TYPE_FRICTION_DRAG_COEFF, 0); config.addPlotDataType(FlightDataType.TYPE_FRICTION_DRAG_COEFF, 0);
@ -113,7 +113,7 @@ public class PlotConfiguration implements Cloneable {
configs.add(config); configs.add(config);
//// Roll characteristics //// Roll characteristics
config = new PlotConfiguration(trans.get("PlotConfiguration.Rollcharacteristics")); config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Rollcharacteristics"));
config.addPlotDataType(FlightDataType.TYPE_ROLL_RATE, 0); config.addPlotDataType(FlightDataType.TYPE_ROLL_RATE, 0);
config.addPlotDataType(FlightDataType.TYPE_ROLL_MOMENT_COEFF, 1); config.addPlotDataType(FlightDataType.TYPE_ROLL_MOMENT_COEFF, 1);
config.addPlotDataType(FlightDataType.TYPE_ROLL_FORCING_COEFF, 1); config.addPlotDataType(FlightDataType.TYPE_ROLL_FORCING_COEFF, 1);
@ -131,7 +131,7 @@ public class PlotConfiguration implements Cloneable {
configs.add(config); configs.add(config);
//// Angle of attack and orientation vs. time //// Angle of attack and orientation vs. time
config = new PlotConfiguration(trans.get("PlotConfiguration.Angleofattack")); config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Angleofattack"));
config.addPlotDataType(FlightDataType.TYPE_AOA, 0); config.addPlotDataType(FlightDataType.TYPE_AOA, 0);
config.addPlotDataType(FlightDataType.TYPE_ORIENTATION_PHI); config.addPlotDataType(FlightDataType.TYPE_ORIENTATION_PHI);
config.addPlotDataType(FlightDataType.TYPE_ORIENTATION_THETA); config.addPlotDataType(FlightDataType.TYPE_ORIENTATION_THETA);
@ -147,7 +147,7 @@ public class PlotConfiguration implements Cloneable {
configs.add(config); configs.add(config);
//// Simulation time step and computation time //// Simulation time step and computation time
config = new PlotConfiguration(trans.get("PlotConfiguration.Simulationtime")); config = new SimulationPlotConfiguration(trans.get("PlotConfiguration.Simulationtime"));
config.addPlotDataType(FlightDataType.TYPE_TIME_STEP); config.addPlotDataType(FlightDataType.TYPE_TIME_STEP);
config.addPlotDataType(FlightDataType.TYPE_COMPUTATION_TIME); config.addPlotDataType(FlightDataType.TYPE_COMPUTATION_TIME);
config.setEvent(FlightEvent.Type.IGNITION, true); config.setEvent(FlightEvent.Type.IGNITION, true);
@ -161,7 +161,7 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.SIM_ABORT, true); config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config); configs.add(config);
DEFAULT_CONFIGURATIONS = configs.toArray(new PlotConfiguration[0]); DEFAULT_CONFIGURATIONS = configs.toArray(new SimulationPlotConfiguration[0]);
} }
@ -208,15 +208,15 @@ public class PlotConfiguration implements Cloneable {
private String name = null; private String name = null;
public PlotConfiguration() { public SimulationPlotConfiguration() {
this(null, FlightDataType.TYPE_TIME); this(null, FlightDataType.TYPE_TIME);
} }
public PlotConfiguration(String name) { public SimulationPlotConfiguration(String name) {
this(name, FlightDataType.TYPE_TIME); this(name, FlightDataType.TYPE_TIME);
} }
public PlotConfiguration(String name, FlightDataType domainType) { public SimulationPlotConfiguration(String name, FlightDataType domainType) {
this.name = name; this.name = name;
// Two axes // Two axes
allAxes.add(new Axis()); allAxes.add(new Axis());
@ -370,7 +370,7 @@ public class PlotConfiguration implements Cloneable {
} }
/** /**
* Returns the name of this PlotConfiguration. * Returns the name of this SimulationPlotConfiguration.
*/ */
@Override @Override
public String toString() { public String toString() {
@ -382,11 +382,11 @@ public class PlotConfiguration implements Cloneable {
/** /**
* Find the best combination of the auto-selectable axes. * Find the best combination of the auto-selectable axes.
* *
* @return a new PlotConfiguration with the best fitting auto-selected axes and * @return a new SimulationPlotConfiguration with the best fitting auto-selected axes and
* axes ranges selected. * axes ranges selected.
*/ */
public PlotConfiguration fillAutoAxes(FlightDataBranch data) { public SimulationPlotConfiguration fillAutoAxes(FlightDataBranch data) {
PlotConfiguration config = recursiveFillAutoAxes(data).getU(); SimulationPlotConfiguration config = recursiveFillAutoAxes(data).getU();
//System.out.println("BEST FOUND, fitting"); //System.out.println("BEST FOUND, fitting");
config.fitAxes(data); config.fitAxes(data);
return config; return config;
@ -399,13 +399,13 @@ public class PlotConfiguration implements Cloneable {
* Recursively search for the best combination of the auto-selectable axes. * Recursively search for the best combination of the auto-selectable axes.
* This is a brute-force search method. * This is a brute-force search method.
* *
* @return a new PlotConfiguration with the best fitting auto-selected axes and * @return a new SimulationPlotConfiguration with the best fitting auto-selected axes and
* axes ranges selected, and the goodness value * axes ranges selected, and the goodness value
*/ */
private Pair<PlotConfiguration, Double> recursiveFillAutoAxes(FlightDataBranch data) { private Pair<SimulationPlotConfiguration, Double> recursiveFillAutoAxes(FlightDataBranch data) {
// Create copy to fill in // Create copy to fill in
PlotConfiguration copy = this.clone(); SimulationPlotConfiguration copy = this.clone();
int autoindex; int autoindex;
for (autoindex = 0; autoindex < plotDataAxes.size(); autoindex++) { for (autoindex = 0; autoindex < plotDataAxes.size(); autoindex++) {
@ -421,11 +421,11 @@ public class PlotConfiguration implements Cloneable {
// Set the auto-selected index one at a time and choose the best one // Set the auto-selected index one at a time and choose the best one
PlotConfiguration best = null; SimulationPlotConfiguration best = null;
double bestValue = Double.NEGATIVE_INFINITY; double bestValue = Double.NEGATIVE_INFINITY;
for (int i = 0; i < axesCount; i++) { for (int i = 0; i < axesCount; i++) {
copy.plotDataAxes.set(autoindex, i); copy.plotDataAxes.set(autoindex, i);
Pair<PlotConfiguration, Double> result = copy.recursiveFillAutoAxes(data); Pair<SimulationPlotConfiguration, Double> result = copy.recursiveFillAutoAxes(data);
if (result.getV() > bestValue) { if (result.getV() > bestValue) {
best = result.getU(); best = result.getU();
bestValue = result.getV(); bestValue = result.getV();
@ -690,11 +690,11 @@ public class PlotConfiguration implements Cloneable {
/** /**
* Reset the units of this configuration to the default units. Returns this * Reset the units of this configuration to the default units. Returns this
* PlotConfiguration. * SimulationPlotConfiguration.
* *
* @return this PlotConfiguration. * @return this SimulationPlotConfiguration.
*/ */
public PlotConfiguration resetUnits() { public SimulationPlotConfiguration resetUnits() {
for (int i = 0; i < plotDataTypes.size(); i++) { for (int i = 0; i < plotDataTypes.size(); i++) {
plotDataUnits.set(i, plotDataTypes.get(i).getUnitGroup().getDefaultUnit()); plotDataUnits.set(i, plotDataTypes.get(i).getUnitGroup().getDefaultUnit());
} }
@ -705,10 +705,10 @@ public class PlotConfiguration implements Cloneable {
@Override @Override
public PlotConfiguration clone() { public SimulationPlotConfiguration clone() {
try { try {
PlotConfiguration copy = (PlotConfiguration) super.clone(); SimulationPlotConfiguration copy = (SimulationPlotConfiguration) super.clone();
// Shallow-clone all immutable lists // Shallow-clone all immutable lists
copy.plotDataTypes = this.plotDataTypes.clone(); copy.plotDataTypes = this.plotDataTypes.clone();

View File

@ -52,7 +52,7 @@ public class SimulationPlotDialog extends JDialog {
initColors(); initColors();
} }
private SimulationPlotDialog(Window parent, Simulation simulation, PlotConfiguration config) { private SimulationPlotDialog(Window parent, Simulation simulation, SimulationPlotConfiguration config) {
//// Flight data plot //// Flight data plot
super(parent, simulation.getName()); super(parent, simulation.getName());
this.setModalityType(ModalityType.DOCUMENT_MODAL); this.setModalityType(ModalityType.DOCUMENT_MODAL);
@ -247,7 +247,7 @@ public class SimulationPlotDialog extends JDialog {
* @param simulation the simulation to plot. * @param simulation the simulation to plot.
* @param config the configuration of the plot. * @param config the configuration of the plot.
*/ */
public static SimulationPlotDialog getPlot(Window parent, Simulation simulation, PlotConfiguration config) { public static SimulationPlotDialog getPlot(Window parent, Simulation simulation, SimulationPlotConfiguration config) {
return new SimulationPlotDialog(parent, simulation, config); return new SimulationPlotDialog(parent, simulation, config);
} }

View File

@ -35,11 +35,11 @@ import info.openrocket.core.preferences.ApplicationPreferences;
import info.openrocket.core.unit.Unit; import info.openrocket.core.unit.Unit;
import info.openrocket.core.util.Utils; import info.openrocket.core.util.Utils;
import info.openrocket.swing.gui.plot.SimulationPlotConfiguration;
import info.openrocket.swing.gui.widgets.GroupableAndSearchableComboBox; import info.openrocket.swing.gui.widgets.GroupableAndSearchableComboBox;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import info.openrocket.swing.gui.components.DescriptionArea; import info.openrocket.swing.gui.components.DescriptionArea;
import info.openrocket.swing.gui.components.UnitSelector; import info.openrocket.swing.gui.components.UnitSelector;
import info.openrocket.swing.gui.plot.PlotConfiguration;
import info.openrocket.swing.gui.plot.SimulationPlotDialog; import info.openrocket.swing.gui.plot.SimulationPlotDialog;
import info.openrocket.swing.gui.util.GUIUtil; import info.openrocket.swing.gui.util.GUIUtil;
import info.openrocket.swing.gui.util.Icons; import info.openrocket.swing.gui.util.Icons;
@ -74,32 +74,32 @@ public class SimulationPlotPanel extends JPanel {
private static final String CUSTOM = trans.get("simplotpanel.CUSTOM"); private static final String CUSTOM = trans.get("simplotpanel.CUSTOM");
/** The "Custom" configuration - not to be used for anything other than the title. */ /** The "Custom" configuration - not to be used for anything other than the title. */
private static final PlotConfiguration CUSTOM_CONFIGURATION; private static final SimulationPlotConfiguration CUSTOM_CONFIGURATION;
static { static {
CUSTOM_CONFIGURATION = new PlotConfiguration(CUSTOM); CUSTOM_CONFIGURATION = new SimulationPlotConfiguration(CUSTOM);
} }
/** The array of presets for the combo box. */ /** The array of presets for the combo box. */
private static final PlotConfiguration[] PRESET_ARRAY; private static final SimulationPlotConfiguration[] PRESET_ARRAY;
static { static {
PRESET_ARRAY = Arrays.copyOf(PlotConfiguration.DEFAULT_CONFIGURATIONS, PRESET_ARRAY = Arrays.copyOf(SimulationPlotConfiguration.DEFAULT_CONFIGURATIONS,
PlotConfiguration.DEFAULT_CONFIGURATIONS.length + 1); SimulationPlotConfiguration.DEFAULT_CONFIGURATIONS.length + 1);
PRESET_ARRAY[PRESET_ARRAY.length - 1] = CUSTOM_CONFIGURATION; PRESET_ARRAY[PRESET_ARRAY.length - 1] = CUSTOM_CONFIGURATION;
} }
/** The current default configuration, set each time a plot is made. */ /** The current default configuration, set each time a plot is made. */
private static PlotConfiguration defaultConfiguration = private static SimulationPlotConfiguration defaultConfiguration =
PlotConfiguration.DEFAULT_CONFIGURATIONS[0].resetUnits(); SimulationPlotConfiguration.DEFAULT_CONFIGURATIONS[0].resetUnits();
private final Simulation simulation; private final Simulation simulation;
private final FlightDataType[] types; private final FlightDataType[] types;
private PlotConfiguration configuration; private SimulationPlotConfiguration configuration;
private JComboBox<PlotConfiguration> configurationSelector; private JComboBox<SimulationPlotConfiguration> configurationSelector;
private GroupableAndSearchableComboBox<FlightDataTypeGroup, FlightDataType> domainTypeSelector; private GroupableAndSearchableComboBox<FlightDataTypeGroup, FlightDataType> domainTypeSelector;
private UnitSelector domainUnitSelector; private UnitSelector domainUnitSelector;
@ -135,7 +135,7 @@ public class SimulationPlotPanel extends JPanel {
// Setup the combo box // Setup the combo box
configurationSelector = new JComboBox<>(PRESET_ARRAY); configurationSelector = new JComboBox<>(PRESET_ARRAY);
for (PlotConfiguration config : PRESET_ARRAY) { for (SimulationPlotConfiguration config : PRESET_ARRAY) {
if (config.getName().equals(configuration.getName())) { if (config.getName().equals(configuration.getName())) {
configurationSelector.setSelectedItem(config); configurationSelector.setSelectedItem(config);
} }
@ -154,7 +154,7 @@ public class SimulationPlotPanel extends JPanel {
} }
if (modifying > 0) if (modifying > 0)
return; return;
PlotConfiguration conf = (PlotConfiguration) configurationSelector.getSelectedItem(); SimulationPlotConfiguration conf = (SimulationPlotConfiguration) configurationSelector.getSelectedItem();
if (conf == CUSTOM_CONFIGURATION) if (conf == CUSTOM_CONFIGURATION)
return; return;
modifying++; modifying++;
@ -421,7 +421,7 @@ public class SimulationPlotPanel extends JPanel {
return SimulationPlotDialog.getPlot(parent, simulation, configuration); return SimulationPlotDialog.getPlot(parent, simulation, configuration);
} }
private void setConfiguration(PlotConfiguration conf) { private void setConfiguration(SimulationPlotConfiguration conf) {
boolean modified = false; boolean modified = false;
@ -479,7 +479,7 @@ public class SimulationPlotPanel extends JPanel {
/** /**
* A JPanel which configures a single plot of a PlotConfiguration. * A JPanel which configures a single plot of a SimulationPlotConfiguration.
*/ */
private class PlotTypeSelector extends JPanel { private class PlotTypeSelector extends JPanel {
private static final long serialVersionUID = 9056324972817542570L; private static final long serialVersionUID = 9056324972817542570L;
@ -565,7 +565,7 @@ public class SimulationPlotPanel extends JPanel {
this.add(button, "gapright 0"); this.add(button, "gapright 0");
} }
} }
private class FlightEventTableModel extends AbstractTableModel { private class FlightEventTableModel extends AbstractTableModel {