Browse Source

Merge branch 'master' of https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons

Edgardo Palza 8 years ago
parent
commit
a702d03220

+ 32 - 0
src/classes/CpsUpperNode.java

@@ -6,6 +6,8 @@ import java.util.HashMap;
 public class CpsUpperNode extends AbstractCpsObject{
 
 	private ArrayList<AbstractCpsObject> nodes;
+	private ArrayList<CpsEdge> nodeEdges;
+	private ArrayList<CpsEdge> oldEdges;
 	private HashMap<Integer, Integer> nodesIdx;
 	
 	public CpsUpperNode(String nodeName) {
@@ -15,6 +17,8 @@ public class CpsUpperNode extends AbstractCpsObject{
 		this.setSav("CVS");
 		this.setID(IdCounter.nextId());
 		this.setNodes(new ArrayList<AbstractCpsObject>());
+		this.setNodeEdges(new ArrayList<>());
+		this.setOldEdges(new ArrayList<CpsEdge>());
 		this.setNodesIdx(new HashMap<Integer,Integer>());
 		// TODO Auto-generated constructor stub
 	}
@@ -33,6 +37,34 @@ public class CpsUpperNode extends AbstractCpsObject{
 		this.nodes = nodes;
 	}
 
+	/**
+	 * @return the nodeEdges
+	 */
+	public ArrayList<CpsEdge> getNodeEdges() {
+		return nodeEdges;
+	}
+
+	/**
+	 * @param nodeEdges the nodeEdges to set
+	 */
+	public void setNodeEdges(ArrayList<CpsEdge> nodeEdges) {
+		this.nodeEdges = nodeEdges;
+	}
+
+	/**
+	 * @return the oldEdges
+	 */
+	public ArrayList<CpsEdge> getOldEdges() {
+		return oldEdges;
+	}
+
+	/**
+	 * @param oldEdges the oldEdges to set
+	 */
+	public void setOldEdges(ArrayList<CpsEdge> oldEdges) {
+		this.oldEdges = oldEdges;
+	}
+
 	/**
 	 * @return the nodesIdx
 	 */

+ 95 - 12
src/ui/controller/NodeController.java

@@ -1,6 +1,7 @@
 package ui.controller;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 
 import classes.AbstractCpsObject;
 import classes.CpsEdge;
@@ -11,24 +12,106 @@ public class NodeController {
 
 	private Model model;
 	private MultiPurposeController mpC;
-	
+
 	public NodeController(Model model, MultiPurposeController mpC) {
 		// TODO Auto-generated constructor stub
 		this.model = model;
 		this.mpC = mpC;
 	}
-	
-	public void addNode(CpsUpperNode node) {
-		model.getCvsObjIdx().put(node.getID(), model.getObjectsOnCanvas().size());
+
+	/**
+	 * Add a CpsUpperNode into Canvas
+	 * 
+	 * @param nodeName
+	 */
+	public void addNode(CpsUpperNode nodeName) {
+		CpsUpperNode node = nodeName;
+		connectAdjacent(node);
+		makeNodeOfNodes(node);
 		model.getObjectsOnCanvas().add(node);
 	}
-	
-	public void addNewObject() {
-		
-		CpsUpperNode node = new CpsUpperNode("UpperNode");
-		node.setSav("CVS");
-		node.setConnections(new ArrayList<CpsEdge>());
-		addNode(node);
+
+	/**
+	 * 
+	 * @param node
+	 */
+	public void makeNodeOfNodes(CpsUpperNode node) {
+
+		ArrayList<AbstractCpsObject> nodes = node.getNodes();
+		ArrayList<CpsEdge> nodeEdges = node.getNodeEdges();
+
+		for (Iterator<AbstractCpsObject> it = model.getSelectedCpsObjects().iterator(); it.hasNext();) {
+
+			AbstractCpsObject obj = it.next();
+			nodes.add(obj);
+			model.getObjectsOnCanvas().remove(obj);
+		}
+
+		for (Iterator<CpsEdge> it = model.getEdgesOnCanvas().iterator(); it.hasNext();) {
+
+			CpsEdge edge = it.next();
+			if (nodes.contains(edge.getA()) && nodes.contains(edge.getB())) {
+				nodeEdges.add(edge);
+				model.removeEdgesOnCanvas(edge);
+			}
+
+		}
+
 	}
-	
+
+	/**
+	 * 
+	 * @return
+	 */
+	private void connectAdjacent(CpsUpperNode node) {
+
+		ArrayList<AbstractCpsObject> adj = new ArrayList<>();
+		ArrayList<Float> maxCapacity = new ArrayList<>();
+		ArrayList<CpsEdge> oldEdges = node.getOldEdges();
+
+		// float maxCapacity = 0;
+
+		// für alle Edges auf dem Canvas
+		for (Iterator<CpsEdge> it = model.getEdgesOnCanvas().iterator(); it.hasNext();) {
+
+			CpsEdge edge = it.next();
+
+			// if (edge.getCapacity() > maxCapacity)
+			// maxCapacity = edge.getCapacity();
+
+			// wenn ausgewählte Objekte in edge und andere auserhalb
+			if (model.getSelectedCpsObjects().contains(edge.getA())
+					&& !model.getSelectedCpsObjects().contains(edge.getB())) {
+				// und wenn in der adj noch nicht vorhanden
+				if (!adj.contains(edge.getA()))
+					adj.add(edge.getB());
+				// wenn vorhanden teste maxCapacity
+				else if (maxCapacity.get(adj.indexOf(edge.getB())) < edge.getCapacity())
+					maxCapacity.set(adj.indexOf(edge.getB()), edge.getCapacity());
+				// speichere alte edge
+				oldEdges.add(edge);
+				model.getEdgesOnCanvas().remove(edge);
+			}
+
+			// Analog
+			else if (!model.getSelectedCpsObjects().contains(edge.getA())
+					&& model.getSelectedCpsObjects().contains(edge.getB())) {
+				if (!adj.contains(edge.getB()))
+					adj.add(edge.getA());
+				else if (maxCapacity.get(adj.indexOf(edge.getA())) < edge.getCapacity())
+					maxCapacity.set(adj.indexOf(edge.getA()), edge.getCapacity());
+
+				oldEdges.add(edge);
+				model.getEdgesOnCanvas().remove(edge);
+			}
+		}
+		// für alle objekte in adjazenzliste mach
+		for (AbstractCpsObject cps : adj) {
+			CpsEdge newEdge = new CpsEdge(cps, node, maxCapacity.get(adj.indexOf(cps)));
+			// !! Eventuell noch bei getConnections() hinzufügem
+			model.addEdgeOnCanvas(newEdge);
+			node.getConnections().add(newEdge);
+		}
+	}
+
 }

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

@@ -114,7 +114,6 @@ public class GUI<E> implements CategoryListener {
 	private StatisticPane statPane = new StatisticPane();
 	private JScrollPane statScrollPane = new JScrollPane(statPane);
 
-
 	private final JLabel maxGraph = new JLabel("100%");
 	private final JLabel medGraph = new JLabel("50%");
 	private final JLabel minGraph = new JLabel("0%");
@@ -223,6 +222,7 @@ public class GUI<E> implements CategoryListener {
 	private Console console = new Console();
 	private MyCanvas canvas;
 	private UnitGraph unitGraph;
+	private StatisticGraph statGraph;
 	private final JSplitPane splitPane3 = new JSplitPane();
 	private final JSlider sizeSlider = new JSlider();
 	private final JLabel lblImageSize = new JLabel(Languages.getLanguage()[94]);
@@ -266,6 +266,7 @@ public class GUI<E> implements CategoryListener {
 		this.model = control.getModel();
 		this.canvas = new MyCanvas(model, control);
 		this.unitGraph = new UnitGraph(model, control);
+		this.statGraph = new StatisticGraph(model, controller);
 		control.initListener(this);
 		controller.setCanvas(canvas);
 		model.setConsole(console);
@@ -1571,6 +1572,7 @@ public class GUI<E> implements CategoryListener {
 				controller.calculateStateForTimeStep(i);
 
 				unitGraph.repaint();
+				statGraph.repaint();
 			}
 		});
 		splitPane.setRightComponent(splitPane1);

+ 121 - 21
src/ui/view/StatisticGraph.java

@@ -6,23 +6,34 @@ import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.geom.GeneralPath;
-import java.util.LinkedList;
+import java.util.ArrayList;
 
 import javax.swing.JPanel;
 
+import classes.HolonElement;
 import classes.HolonObject;
 import ui.controller.Control;
 import ui.model.Model;
 
 public class StatisticGraph extends JPanel {
-	public StatisticGraph() {
-	}
 
 	/**
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
 
+	// Max Objects
+	final int MAX_OBJECTS = 8;
+
+	// Maximum y Value
+	double maximum = 0;
+
+	// is the Simulation running?
+	private boolean isSimRunning;
+
+	// Colours
+	private ArrayList<Color> colors = new ArrayList<>();
+
 	// model and controller
 	private Model model;
 	private Control controller;
@@ -32,7 +43,8 @@ public class StatisticGraph extends JPanel {
 	GeneralPath path = new GeneralPath();
 
 	// Data
-	private LinkedList<HolonObject> objects = new LinkedList<>();
+	private ArrayList<HolonObject> objects = new ArrayList<>();
+	private ArrayList<GeneralPath> objPaths = new ArrayList<>();
 
 	/**
 	 * Constructor.
@@ -45,9 +57,18 @@ public class StatisticGraph extends JPanel {
 	public StatisticGraph(final Model model, Control control) {
 		this.controller = control;
 		this.model = model;
-
+		colors.add(Color.BLUE);
+		colors.add(Color.RED);
+		colors.add(Color.GREEN);
+		colors.add(Color.CYAN);
+		colors.add(Color.ORANGE);
+		colors.add(Color.PINK);
+		colors.add(Color.MAGENTA);
+		colors.add(Color.YELLOW);
+		
+		
+		
 		this.setBackground(Color.WHITE);
-
 	}
 
 	/**
@@ -59,35 +80,114 @@ public class StatisticGraph extends JPanel {
 	 */
 	public void paintComponent(Graphics g) {
 		super.paintComponent(g);
-		path.reset();
-		
+
+		// Graphics2D init
 		g2 = (Graphics2D) g;
 		RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 		g2.setRenderingHints(rh);
 
+		// Paint the Grid
 		g2.setStroke(new BasicStroke(0));
-
 		g2.setColor(Color.BLACK);
 		for (int i = 0; i <= this.getWidth(); i += 10) {
 			g2.drawLine(i, 0, i, this.getHeight());
 		}
-
 		for (int i = 0; i <= this.getHeight(); i += 5) {
 			g2.drawLine(0, i, this.getWidth(), i);
 		}
 
-		g2.setColor(Color.BLUE);
-		g2.setStroke(new BasicStroke(2));
-		
-		path.moveTo(0,this.getHeight());
-		for (int i = 0; i <= 49; i++) {
-			double coordY = Math.random()*this.getHeight();
-			controller.addTextToConsole(""+i);
-			path.lineTo(i*this.getWidth()/49, coordY);
-			path.moveTo(i*this.getWidth()/49, coordY);
+		// Reset?
+		if (!isSimRunning && model.getIsSimulation()) {
+			for (int i = 0; i < objects.size(); i++) {
+				objPaths.get(i).reset();
+				objPaths.get(i).moveTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1,
+						convertToCanvasY(Math.abs(objects.get(i).getCurrentEnergy())));
+			}
 		}
-		
-		g2.draw(path);
+
+		isSimRunning = model.getIsSimulation();
+
+		// if sim is on
+		if (isSimRunning) {
+			maximum = 0;
+			for (HolonObject obj : objects) {
+				if (maximum <= (Math.abs(obj.getCurrentEnergy()))) {
+					maximum = (Math.abs(obj.getCurrentEnergy()));
+				}
+			}
+
+			for (int i = 0; i < objects.size(); i++) {
+				g2.setColor(new Color((int) (Math.random() * 255), (int) (Math.random() * 255),
+						(int) (Math.random() * 255)));
+				objPaths.get(i).lineTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1,
+						convertToCanvasY(Math.abs(getEnergyAtCurrentTimeStep(objects.get(i)))));
+				objPaths.get(i).moveTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1,
+						convertToCanvasY(Math.abs(getEnergyAtCurrentTimeStep(objects.get(i)))));
+
+			}
+		}
+		g2.setStroke(new BasicStroke(3));
+		for (int i = 0; i < objPaths.size(); i++) {
+			g2.setColor(colors.get(i));
+			g2.draw(objPaths.get(i));
+		}
+
+	}
+
+	/**
+	 * Add an Object to the Graph if the maximum has not reached yet.
+	 * 
+	 * @param obj
+	 *            the Object to add
+	 */
+	public void addObject(HolonObject obj) {
+		if (objects.size() < MAX_OBJECTS && !objects.contains(obj)) {
+			objects.add((HolonObject) obj);
+			objPaths.add(new GeneralPath());
+			objPaths.get(objPaths.size() - 1)
+					.moveTo(model.getCurIteration() * this.getWidth() / model.getIterations() - 1, convertToCanvasY(Math
+							.abs(objects.get(objects.size() - 1).getCurrentEnergyAtTimeStep(model.getCurIteration()))));
+		}
+	}
+
+	/**
+	 * Removes an Object from the Graph.
+	 * 
+	 * @param obj
+	 *            the Object to remove
+	 */
+	public void removeObject(HolonObject obj) {
+		if (objects.contains(obj)) {
+			objPaths.remove(objects.indexOf(obj));
+			objects.remove(obj);
+		}
+	}
+
+	/**
+	 * converts the number to fit the canvas.
+	 * 
+	 * @param d
+	 *            the number to convert
+	 * @return the converted number
+	 */
+	public double convertToCanvasY(float d) {
+		return Math.abs((this.getHeight() - (d * (this.getHeight() / maximum))));
+	}
+	
+	/**
+	 * Does take into account which timestep is watched, calculates the max
+	 * values.
+	 * 
+	 * @return the currentEnergy
+	 */
+	public float getEnergyAtCurrentTimeStep(HolonObject obj) {
+		float temp = 0;
+		for (HolonElement e : obj.getElements()) {
+			if (e.getActive()) {
+				temp = temp + e.getEnergyAt()[model.getCurIteration()];
+			}
+		}
+		return temp;
 	}
 
 }

+ 27 - 33
src/ui/view/StatisticPane.java

@@ -17,13 +17,13 @@ import javax.swing.SwingConstants;
 import javax.swing.JComboBox;
 
 public class StatisticPane extends JPanel{
-	private JScrollPane myScrollPane = new JScrollPane();
+	private JScrollPane listScrollPane = new JScrollPane();
     private JList objectList;
     private DefaultListModel model =  new DefaultListModel();
     
     public StatisticPane(){
     	objectList = new JList(model);
-    	myScrollPane.setViewportView(objectList);
+    	listScrollPane.setViewportView(objectList);
     	
     	JLabel lblOverallStatistics = new JLabel("Overall Statistics:");
     	lblOverallStatistics.setFont(new Font("Tahoma", Font.PLAIN, 13));
@@ -55,38 +55,32 @@ public class StatisticPane extends JPanel{
     	groupLayout.setHorizontalGroup(
     		groupLayout.createParallelGroup(Alignment.LEADING)
     			.addGroup(groupLayout.createSequentialGroup()
+    				.addContainerGap()
     				.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    					.addGroup(groupLayout.createSequentialGroup()
-    						.addContainerGap()
-    						.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    							.addComponent(lblOverallStatistics, GroupLayout.PREFERRED_SIZE, 126, GroupLayout.PREFERRED_SIZE)
-    							.addGroup(groupLayout.createSequentialGroup()
-    								.addGap(10)
-    								.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    									.addComponent(chckbxNewCheckBox_1)
-    									.addComponent(chckbxNewCheckBox)))))
-    					.addGroup(groupLayout.createSequentialGroup()
-    						.addContainerGap()
-    						.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
-    							.addComponent(lblObject, GroupLayout.PREFERRED_SIZE, 56, GroupLayout.PREFERRED_SIZE)
-    							.addGroup(groupLayout.createSequentialGroup()
-    								.addGap(10)
-    								.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
+    					.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
+    						.addGroup(groupLayout.createSequentialGroup()
+    							.addGap(10)
+    							.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
+    								.addComponent(chckbxNewCheckBox_1)
+    								.addComponent(chckbxNewCheckBox)))
+    						.addComponent(lblObject, GroupLayout.PREFERRED_SIZE, 56, GroupLayout.PREFERRED_SIZE)
+    						.addGroup(groupLayout.createSequentialGroup()
+    							.addGap(10)
+    							.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
+    								.addGroup(groupLayout.createSequentialGroup()
+    									.addGap(4)
+    									.addComponent(lblName)
+    									.addPreferredGap(ComponentPlacement.RELATED)
+    									.addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 107, GroupLayout.PREFERRED_SIZE))
+    								.addComponent(checkBox_1, GroupLayout.PREFERRED_SIZE, 101, GroupLayout.PREFERRED_SIZE)
+    								.addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false)
     									.addGroup(groupLayout.createSequentialGroup()
-    										.addGap(4)
-    										.addComponent(lblName)
+    										.addComponent(lblGraph, GroupLayout.PREFERRED_SIZE, 54, GroupLayout.PREFERRED_SIZE)
     										.addPreferredGap(ComponentPlacement.RELATED)
-    										.addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 107, GroupLayout.PREFERRED_SIZE))
-    									.addComponent(checkBox_1, GroupLayout.PREFERRED_SIZE, 101, GroupLayout.PREFERRED_SIZE)
-    									.addGroup(groupLayout.createParallelGroup(Alignment.TRAILING, false)
-    										.addGroup(Alignment.LEADING, groupLayout.createSequentialGroup()
-    											.addComponent(lblGraph, GroupLayout.PREFERRED_SIZE, 54, GroupLayout.PREFERRED_SIZE)
-    											.addPreferredGap(ComponentPlacement.RELATED)
-    											.addComponent(comboBox, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
-    										.addComponent(checkBox, Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 111, GroupLayout.PREFERRED_SIZE))))))
-    					.addGroup(groupLayout.createSequentialGroup()
-    						.addContainerGap()
-    						.addComponent(myScrollPane, GroupLayout.PREFERRED_SIZE, 177, GroupLayout.PREFERRED_SIZE)))
+    										.addComponent(comboBox, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+    									.addComponent(checkBox, GroupLayout.PREFERRED_SIZE, 111, GroupLayout.PREFERRED_SIZE)))))
+    					.addComponent(lblOverallStatistics, GroupLayout.PREFERRED_SIZE, 126, GroupLayout.PREFERRED_SIZE)
+    					.addComponent(listScrollPane, GroupLayout.PREFERRED_SIZE, 177, GroupLayout.PREFERRED_SIZE))
     				.addContainerGap(263, Short.MAX_VALUE))
     	);
     	groupLayout.setVerticalGroup(
@@ -113,8 +107,8 @@ public class StatisticPane extends JPanel{
     					.addComponent(lblGraph)
     					.addComponent(comboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
     				.addGap(57)
-    				.addComponent(myScrollPane, GroupLayout.PREFERRED_SIZE, 177, GroupLayout.PREFERRED_SIZE)
-    				.addGap(1))
+    				.addComponent(listScrollPane, GroupLayout.PREFERRED_SIZE, 177, GroupLayout.PREFERRED_SIZE)
+    				.addContainerGap(23, Short.MAX_VALUE))
     	);
     	setLayout(groupLayout);
     	

+ 1 - 1
src/ui/view/UnitGraph.java

@@ -20,6 +20,7 @@ import java.awt.Point;
 import javax.swing.JPanel;
 
 import classes.HolonElement;
+import classes.HolonObject;
 import ui.controller.Control;
 import ui.model.Model;
 import classes.HolonSwitch;
@@ -747,5 +748,4 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 											// (py + z * ry));
 		}
 	} // end intersection line-line
-
 }