From d74df08e04eee48d006ae3297119c55605932a0b Mon Sep 17 00:00:00 2001 From: Sibo Van Gool Date: Sun, 11 Jul 2021 23:14:42 +0200 Subject: [PATCH] [fixes #927] Fixed only current configuration updating instead of all the sims --- .../gui/scalefigure/RocketPanel.java | 124 ++++++++++++------ 1 file changed, 83 insertions(+), 41 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java index 1caf8388e..9b1e8f564 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java @@ -8,11 +8,11 @@ import java.awt.Point; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.util.ArrayList; -import java.util.Collection; import java.util.EventListener; import java.util.EventObject; import java.util.List; -import java.util.concurrent.Executor; +import java.util.LinkedList; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; @@ -63,6 +63,7 @@ import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; +import net.sf.openrocket.simulation.BasicEventSimulationEngine; import net.sf.openrocket.simulation.FlightData; import net.sf.openrocket.simulation.customexpression.CustomExpression; import net.sf.openrocket.simulation.customexpression.CustomExpressionSimulationListener; @@ -76,11 +77,13 @@ import net.sf.openrocket.util.Chars; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.StateChangeListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** - * A JPanel that contains a RocketFigure and buttons to manipulate the figure. - * + * A JPanel that contains a RocketFigure and buttons to manipulate the figure. + * * @author Sampo Niskanen * @author Bill Kuker */ @@ -88,6 +91,7 @@ import net.sf.openrocket.util.StateChangeListener; public class RocketPanel extends JPanel implements TreeSelectionListener, ChangeSource { private static final Translator trans = Application.getTranslator(); + private static final Logger log = LoggerFactory.getLogger(RocketPanel.class); public enum VIEW_TYPE { SideView(false, RocketFigure.VIEW_SIDE), @@ -129,7 +133,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change /* Calculation of CP and CG */ private AerodynamicCalculator aerodynamicCalculator; - + private final OpenRocketDocument document; private Caret extraCP = null; @@ -155,7 +159,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change * This uses a fixed-sized thread pool for all background simulations * with all threads in daemon mode and with minimum priority. */ - private static final Executor backgroundSimulationExecutor; + private static final ExecutorService backgroundSimulationExecutor; static { backgroundSimulationExecutor = Executors.newFixedThreadPool(SwingPreferences.getMaxThreadCount(), new ThreadFactory() { @@ -171,7 +175,6 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change }); } - public OpenRocketDocument getDocument(){ return this.document; } @@ -369,7 +372,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change /** * Get the center of pressure figure element. - * + * * @return center of pressure info */ public Caret getExtraCP() { @@ -378,7 +381,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change /** * Get the center of gravity figure element. - * + * * @return center of gravity info */ public Caret getExtraCG() { @@ -387,7 +390,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change /** * Get the extra text figure element. - * + * * @return extra text that contains info about the rocket design */ public RocketInfo getExtraText() { @@ -492,12 +495,12 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change /** * Handle clicking on figure shapes. The functioning is the following: - * + * * Get the components clicked. * If no component is clicked, do nothing. - * If the currently selected component is in the set, keep it, - * unless the selector specified is pressed. If it is pressed, cycle to - * the next component. Otherwise select the first component in the list. + * If the currently selected component is in the set, keep it, + * unless the selector specified is pressed. If it is pressed, cycle to + * the next component. Otherwise select the first component in the list. */ public static final int CYCLE_SELECTION_MODIFIER = InputEvent.SHIFT_DOWN_MASK; @@ -647,7 +650,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change figure3d.setCG(new Coordinate(Double.NaN, Double.NaN)); figure3d.setCP(new Coordinate(Double.NaN, Double.NaN)); } - + if (figure.getType() == RocketPanel.VIEW_TYPE.SideView && length > 0) { extraCP.setPosition(cpx, cpy); extraCG.setPosition(cgx, cgy); @@ -686,34 +689,64 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } // Start calculation process - if(((SwingPreferences) Application.getPreferences()).computeFlightInBackground()){ - extraText.setCalculatingData(true); + if (Application.getPreferences().getAutoRunSimulations()) { + updateSims(false); + } + } - Rocket duplicate = (Rocket) document.getRocket().copy(); + /** + * Updates the simulations. If *currentConfig* is true, only update the simulation of the current flight + * configuration. If it is false, update all the simulations. + * + * @param currentConfig flag to check whether to update all the simulations (false) or only the current + * flight config sim (true) + */ + private void updateSims(boolean currentConfig) { + // Stop previous computation (if any) + stopBackgroundSimulation(); - // find a Simulation based on the current flight configuration - FlightConfigurationId curID = curConfig.getFlightConfigurationID(); - Simulation simulation = null; - for (Simulation sim : document.getSimulations()) { + FlightConfigurationId curID = document.getSelectedConfiguration().getFlightConfigurationID(); + extraText.setCalculatingData(true); + Rocket duplicate = (Rocket)document.getRocket().copy(); + + // Re-run the present simulation(s) + List sims = new LinkedList<>(); + for (Simulation sim : document.getSimulations()) { + // Find a Simulation based on the current flight configuration + if (currentConfig) { if (sim.getFlightConfigurationId().compareTo(curID) == 0) { - simulation = sim; + sims.add(sim); break; } } - - // I *think* every FlightConfiguration has at least one associated simulation; just in case I'm wrong, - // if there isn't one we'll create a new simulation to update the statistics in the panel using the - // default simulation conditions - if (simulation == null) { - System.out.println("creating new simulation"); - simulation = ((SwingPreferences) Application.getPreferences()).getBackgroundSimulation(duplicate); - simulation.setFlightConfigurationId( document.getSelectedConfiguration().getId()); - } else - System.out.println("using pre-existing simulation"); - - backgroundSimulationWorker = new BackgroundSimulationWorker(document, simulation); - backgroundSimulationExecutor.execute(backgroundSimulationWorker); + else + sims.add(sim); } + runBackgroundSimulations(sims, duplicate); + } + + /** + * Runs a new background simulation for simulations *sims*. It will run all the simulations in sims sequentially + * in the background. + * + * @param sims simulations which should be run + * @param rkt rocket for which the simulations are run + */ + private void runBackgroundSimulations(List sims, Rocket rkt) { + // I *think* every FlightConfiguration has at least one associated simulation; just in case I'm wrong, + // if there isn't one we'll create a new simulation to update the statistics in the panel using the + // default simulation conditions + for (Simulation sim : sims) { + if (sim == null) { + log.info("creating new simulation"); + sim = ((SwingPreferences) Application.getPreferences()).getBackgroundSimulation(rkt); + sim.setFlightConfigurationId(document.getSelectedConfiguration().getId()); + } else + log.info("using pre-existing simulation"); + } + + backgroundSimulationWorker = new BackgroundSimulationWorker(document, sims); + backgroundSimulationExecutor.execute(backgroundSimulationWorker); } /** @@ -734,16 +767,19 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change private class BackgroundSimulationWorker extends SimulationWorker { private final CustomExpressionSimulationListener exprListener; + private final OpenRocketDocument doc; + private List sims; - public BackgroundSimulationWorker(OpenRocketDocument doc, Simulation sim) { - super(sim); + public BackgroundSimulationWorker(OpenRocketDocument doc, List sims) { + super(sims.get(0)); + this.sims = sims; + this.doc = doc; List exprs = doc.getCustomExpressions(); exprListener = new CustomExpressionSimulationListener(exprs); } @Override protected FlightData doInBackground() { - // Pause a little while to allow faster UI reaction try { Thread.sleep(300); @@ -751,7 +787,6 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } if (isCancelled() || backgroundSimulationWorker != this) return null; - return super.doInBackground(); } @@ -766,6 +801,13 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change figure.repaint(); figure3d.repaint(); document.fireDocumentChangeEvent(new SimulationChangeEvent(simulation)); + + // Run the new simulation after this one has ended + this.sims.remove(0); + if (this.sims.size() > 0) { + backgroundSimulationWorker = new BackgroundSimulationWorker(this.doc, this.sims); + backgroundSimulationExecutor.execute(backgroundSimulationWorker); + } } @Override @@ -815,7 +857,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } /** - * Updates the selection in the FigureParameters and repaints the figure. + * Updates the selection in the FigureParameters and repaints the figure. * Ignores the event itself. */ @Override