Browse Source

Better StatisticGraph behaviour

Kevin Trometer 7 năm trước cách đây
mục cha
commit
e3b7328408

+ 10 - 3
src/classes/TrackedDataSet.java

@@ -58,9 +58,7 @@ public class TrackedDataSet {
 		this.property = property;
 		this.color = color;
 		this.values = new float[100];
-		for (int i = 0; i < values.length; i++) {
-			values[i] = -1;
-		}
+		resetValues();
 	}
 
 	public AbstractCpsObject getCpsObject() {
@@ -82,4 +80,13 @@ public class TrackedDataSet {
 	public void setValAt(float val, int at){
 		this.values[at] = val;
 	}
+	
+	/**
+	 * Resets all values.
+	 */
+	public void resetValues(){
+		for (int i = 0; i < values.length; i++) {
+			values[i] = -1;
+		}
+	}
 }

+ 8 - 0
src/ui/controller/Control.java

@@ -551,6 +551,7 @@ public class Control {
 	 * including a reset of all Edges to the default "is working" state
 	 */
 	public void resetSimulation(){
+		setIsSimRunning(false);
 		simulationManager.resetSimulation();
 	}
 
@@ -939,5 +940,12 @@ public class Control {
 	public Hashtable<String, StatisticGraphPanel> getGraphTable(){
 		return model.getGraphTable();
 	}
+	
+	/**
+	 * Sets if the Simulation is running
+	 */
+	public void setIsSimRunning(boolean isRunning){
+		globalController.setIsSimRunning(isRunning);
+	}
 
 }

+ 14 - 0
src/ui/controller/GlobalController.java

@@ -3,6 +3,7 @@ package ui.controller;
 import java.awt.Color;
 
 import ui.model.Model;
+import ui.view.StatisticGraphPanel;
 
 /**
  * Controller for the Global Variables.
@@ -142,4 +143,17 @@ public class GlobalController {
 	public int getHolonBodyScale() {
 		return model.getHolonBodyScale();
 	}
+	
+	/**
+	 * Sets if the Simulation is running
+	 */
+	public void setIsSimRunning(boolean isRunning){
+		model.setIsSimRunning(isRunning);
+		//Reset the Graph if isRunning == true
+		if (isRunning) {
+			for (StatisticGraphPanel sg : model.getGraphTable().values()) {
+				sg.resetGraph();
+			}
+		}
+	}
 }

+ 19 - 1
src/ui/model/Model.java

@@ -70,6 +70,8 @@ public class Model {
 	private int autoSaveNr = -1;
 	// number of max simultaneous autosaves
 	private int numberOfSaves = 35;
+	// if the simulation is running and has not been reseted
+	private boolean isSimRunning = false;
 	/*
 	 * Array of all categories in the model. It is set by default with the
 	 * categories ENERGY, BUILDINGS and COMPONENTS
@@ -872,9 +874,25 @@ public class Model {
 	}
 	
 	/**
-	 * Returns the graphtable for Statistic Graphs
+	 * Returns the graphtable for Statistic Graphs.
 	 */
 	public Hashtable<String, StatisticGraphPanel> getGraphTable(){
 		return statisticGraphTable;
 	}
+	
+	/**
+	 * Returns if the Simulation is running.
+	 */
+	public boolean getIsSimRunning(){
+		return isSimRunning;
+	}
+
+	/**
+	 * Sets isSimRunning.
+	 * @param isRunning
+	 */
+	public void setIsSimRunning(boolean isRunning) {
+		isSimRunning = isRunning;
+	}
 }
+

+ 3 - 1
src/ui/view/GUI.java

@@ -1851,7 +1851,9 @@ public class GUI<E> implements CategoryListener {
 				controller.runAlgorithm(model, controller);
 				controller.calculateStateForTimeStep(i);
 				unitGraph.repaint();
-				statSplitPane.repaintGraphs();
+				if (model.getIsSimRunning()) {
+					statSplitPane.repaintGraphs();
+				}
 				contentPane.updateUI();
 			}
 		});

+ 66 - 54
src/ui/view/StatisticGraph.java

@@ -83,60 +83,54 @@ public class StatisticGraph extends JPanel {
 			g2.drawLine(0, i, this.getWidth(), i);
 		}
 
-		isSimRunning = true;
-
-		// if sim is on
-		if (isSimRunning) {
-			g2.setStroke(new BasicStroke(3));
-
-			// Calculate the Maximum
-			// calcMaximum();
-
-			// Calculate values for each set and add them
-			// addValues();
-
-			// Create Paths and draw them
-			for (TrackedDataSet set : dataSets) {
-				path.reset();
-				switch (set.getProperty()) {
-				case TrackedDataSet.CONSUMPTION:
-				case TrackedDataSet.PRODUCTION:
-				case TrackedDataSet.ACTIVATED_ELEMENTS:
-				case TrackedDataSet.TOTAL_PRODUCTION:
-				case TrackedDataSet.TOTAL_CONSUMPTION:
-				case TrackedDataSet.AMOUNT_HOLONS:
-				case TrackedDataSet.GROUP_CONSUMPTION:
-				case TrackedDataSet.GROUP_PRODUCTION:
-				case TrackedDataSet.AMOUNT_CLOSED_SWITCHES:
-				case TrackedDataSet.AVG_AMOUNT_OBJECTS_IN_HOLONS:
-				case TrackedDataSet.AVG_AMOUNT_ELEMENTS_IN_HOLONS:
-				case TrackedDataSet.AVG_AMOUNT_PRODUCERS_IN_HOLONS:
-				case TrackedDataSet.AVG_CONSUMED_ENERGY_IN_HOLONS:
-				case TrackedDataSet.AVG_WASTED_ENERGY_IN_HOLONS:
-				case TrackedDataSet.AMOUNT_BROKEN_EDGES:
-				case TrackedDataSet.AVG_AMOUNT_CLOSED_SWITCHES_IN_HOLONS:
-				case TrackedDataSet.AVG_AMOUNT_ACTIVE_ELEMENTS_IN_HOLONS:
-				case TrackedDataSet.AVG_AMOUNT_INACTIVE_ELEMENTS_IN_HOLONS:
-				case TrackedDataSet.AVG_PRODUCED_ENERGY_IN_HOLONS:
-					createPathFloats(set);
-					break;
-				case TrackedDataSet.ON_OFF:
-					createPathBooleans(set);
-					break;
-				case TrackedDataSet.PERCENT_SUPPLIED:
-				case TrackedDataSet.PERCENT_NOT_SUPPLIED:
-				case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
-				case TrackedDataSet.RATIO_PRODUCERS_CONSUMERS:
-					createPathPercent(set);
-					break;
-				default:
-					break;
-				}
-				g2.setColor(set.getColor());
-				g2.draw(path);
+		g2.setStroke(new BasicStroke(3));
+
+		// Calculate the Maximum
+		// calcMaximum();
+
+		// Calculate values for each set and add them
+		// addValues();
+
+		// Create Paths and draw them
+		for (TrackedDataSet set : dataSets) {
+			path.reset();
+			switch (set.getProperty()) {
+			case TrackedDataSet.CONSUMPTION:
+			case TrackedDataSet.PRODUCTION:
+			case TrackedDataSet.ACTIVATED_ELEMENTS:
+			case TrackedDataSet.TOTAL_PRODUCTION:
+			case TrackedDataSet.TOTAL_CONSUMPTION:
+			case TrackedDataSet.AMOUNT_HOLONS:
+			case TrackedDataSet.GROUP_CONSUMPTION:
+			case TrackedDataSet.GROUP_PRODUCTION:
+			case TrackedDataSet.AMOUNT_CLOSED_SWITCHES:
+			case TrackedDataSet.AVG_AMOUNT_OBJECTS_IN_HOLONS:
+			case TrackedDataSet.AVG_AMOUNT_ELEMENTS_IN_HOLONS:
+			case TrackedDataSet.AVG_AMOUNT_PRODUCERS_IN_HOLONS:
+			case TrackedDataSet.AVG_CONSUMED_ENERGY_IN_HOLONS:
+			case TrackedDataSet.AVG_WASTED_ENERGY_IN_HOLONS:
+			case TrackedDataSet.AMOUNT_BROKEN_EDGES:
+			case TrackedDataSet.AVG_AMOUNT_CLOSED_SWITCHES_IN_HOLONS:
+			case TrackedDataSet.AVG_AMOUNT_ACTIVE_ELEMENTS_IN_HOLONS:
+			case TrackedDataSet.AVG_AMOUNT_INACTIVE_ELEMENTS_IN_HOLONS:
+			case TrackedDataSet.AVG_PRODUCED_ENERGY_IN_HOLONS:
+				createPathFloats(set);
+				break;
+			case TrackedDataSet.ON_OFF:
+				createPathBooleans(set);
+				break;
+			case TrackedDataSet.PERCENT_SUPPLIED:
+			case TrackedDataSet.PERCENT_NOT_SUPPLIED:
+			case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
+			case TrackedDataSet.RATIO_PRODUCERS_CONSUMERS:
+				createPathPercent(set);
+				break;
+			default:
+				break;
 			}
+			g2.setColor(set.getColor());
+			g2.draw(path);
 		}
-
 	}
 
 	/**
@@ -537,17 +531,21 @@ public class StatisticGraph extends JPanel {
 	 * @param set
 	 */
 	private void createPathFloats(TrackedDataSet set) {
+		int range = model.getCurIteration(); //to which iteration
+		if (!model.getIsSimRunning()) {
+			range = model.getIterations()-1;
+		}
 		if (set.getValues()[0] != -1) {
 			path.moveTo(0, convertToCanvasY(set.getValues()[0]));
 		} else {
 			path.moveTo(1 * this.getWidth() / model.getIterations(), convertToCanvasY(set.getValues()[1]));
 		}
-		for (int i = 0; i < model.getCurIteration(); i++) {
+		for (int i = 0; i < range; i++) {
 			if (set.getValues()[i + 1] != -1) {
 				path.lineTo((i + 1) * this.getWidth() / model.getIterations(),
 						convertToCanvasY(set.getValues()[i + 1]));
 			} else {
-				if (i + 2 < model.getCurIteration()) {
+				if (i + 2 < range) {
 					path.moveTo((i + 2) * this.getWidth() / model.getIterations(),
 							convertToCanvasY(set.getValues()[i + 2]));
 				}
@@ -714,8 +712,22 @@ public class StatisticGraph extends JPanel {
 		return stateObjectss / count;
 	}
 
+	/**
+	 * Return all TrackedDataSets
+	 * 
+	 * @return ArrayList of TrackedDataSet
+	 */
 	public ArrayList<TrackedDataSet> getDataSets() {
 		return dataSets;
 	}
 
+	/**
+	 * Reset the Graph. Delete all calculated values.
+	 */
+	public void resetGraph() {
+		for (TrackedDataSet s : dataSets) {
+			s.resetValues();
+		}
+	}
+
 }

+ 6 - 0
src/ui/view/StatisticGraphPanel.java

@@ -296,5 +296,11 @@ public class StatisticGraphPanel extends JPanel {
 	public void setStatisticGraph(StatisticGraph sG){
 		this.sGraph = sG;
 	}
+	/**
+	 *	Reset the Graph. Delete all calculated values.
+	 */
+	public void resetGraph(){
+		sGraph.resetGraph();
+	}
 	
 }

+ 15 - 3
src/ui/view/TimePanel.java

@@ -128,6 +128,9 @@ public class TimePanel extends JPanel {
 			@Override
 			public void mousePressed(MouseEvent e) {
 				controller.resetSimulation();
+				if (running) {
+					playBtn.doClick();
+				}
 			}
 		});
 
@@ -135,6 +138,9 @@ public class TimePanel extends JPanel {
 			@Override
 			public void mouseDragged(MouseEvent e) {
 				controller.resetSimulation();
+				if (running) {
+					playBtn.doClick();
+				}
 			}
 		});
 
@@ -155,6 +161,9 @@ public class TimePanel extends JPanel {
 			public void actionPerformed(ActionEvent e) {
 				running = !running;
 				if (running) {
+					if (!model.getIsSimRunning()) {
+						controller.setIsSimRunning(true);
+					}
 					timer.start();
 					timer.setDelay(model.getTimerSpeed());
 					playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/pause.png"))
@@ -178,6 +187,9 @@ public class TimePanel extends JPanel {
 				controller.setCurIteration(timeSlider.getValue());
 				// controller.calculateStateForCurrentTimeStep();
 				controller.resetSimulation();
+				if (running) {
+					playBtn.doClick();
+				}
 			}
 		});
 		timeForwardBtn.setToolTipText(Languages.getLanguage()[91]);
@@ -222,17 +234,17 @@ public class TimePanel extends JPanel {
 		speedSlider.setMaximum(5000);
 		speedSlider.setMinimum(500);
 		speedSlider.setValue(1000);
-		//speedSlider.setMajorTickSpacing(100);
+		// speedSlider.setMajorTickSpacing(100);
 		speedSlider.addChangeListener(new ChangeListener() {
 			@Override
 			public void stateChanged(ChangeEvent e) {
 				controller.setTimerSpeed(speedSlider.getValue());
-				speedSlider.setToolTipText("Speed: "+speedSlider.getValue());
+				speedSlider.setToolTipText("Speed: " + speedSlider.getValue());
 			}
 		});
 
 		// Buttons and Speed Panel
-		btnAndSpeedPanel.setLayout(new BorderLayout(0,0));
+		btnAndSpeedPanel.setLayout(new BorderLayout(0, 0));
 		btnAndSpeedPanel.setBorder(null);
 		btnAndSpeedPanel.add(timeBtnPanel, BorderLayout.NORTH);
 		btnAndSpeedPanel.add(speedPanel, BorderLayout.CENTER);