[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