[fixes #927] Fixed only current configuration updating instead of all the sims
This commit is contained in:
parent
2c2a7a2d3b
commit
d74df08e04
@ -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 <sampo.niskanen@iki.fi>
|
||||
* @author Bill Kuker <bkuker@billkuker.com>
|
||||
*/
|
||||
@ -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<Simulation> 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<Simulation> 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<Simulation> sims;
|
||||
|
||||
public BackgroundSimulationWorker(OpenRocketDocument doc, Simulation sim) {
|
||||
super(sim);
|
||||
public BackgroundSimulationWorker(OpenRocketDocument doc, List<Simulation> sims) {
|
||||
super(sims.get(0));
|
||||
this.sims = sims;
|
||||
this.doc = doc;
|
||||
List<CustomExpression> 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user