浏览代码

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

Conflicts:
src/ui/view/GUI.java

Kevin Trometer 8 年之前
父节点
当前提交
c94b628a85

+ 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<CpsEdge>());
+		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
 	 */

+ 63 - 0
src/classes/HolonObject.java

@@ -26,6 +26,10 @@ public class HolonObject extends AbstractCpsObject {
 	private HashMap<String, Integer> eleIdx;
 	/* Total of consumption */
 	private float currentEnergy;
+	/* Array for tracking Production */
+	private float[] trackingProd;
+	/* Array for tracking Consumption */
+	private float[] trackingCons;
 
 	/*
 	 * 0 = no energy, 1 = not supplied, 2 = supplied, 3 producer
@@ -44,6 +48,8 @@ public class HolonObject extends AbstractCpsObject {
 		setElements(new ArrayList<HolonElement>());
 		setEleIdx(new HashMap<String, Integer>());
 		setState();
+		setTrackingProd(new float[100]);
+		setTrackingCons(new float[100]);
 	}
 
 	/**
@@ -57,6 +63,8 @@ public class HolonObject extends AbstractCpsObject {
 		setEleIdx(MultiPurposeController.copyHashMap(((HolonObject) obj).getEleIdx()));
 		setElements(copyElements(((HolonObject) obj).getElements()));
 		setState();
+		setTrackingProd(new float[100]);
+		setTrackingCons(new float[100]);
 	}
 
 	/**
@@ -331,4 +339,59 @@ public class HolonObject extends AbstractCpsObject {
 	public Color getColor() {
 		return stateColor;
 	}
+
+	/**
+	 * Set the Array Production
+	 */
+	public void setTrackingProd(float[] arr) {
+		this.trackingProd = arr;
+	}
+
+	/**
+	 * Get the Array Production
+	 */
+	public float[] getTrackingProd() {
+		return this.trackingProd;
+	}
+
+	/**
+	 * Set the Array Consumption
+	 */
+	public void setTrackingCons(float[] arr) {
+		this.trackingCons = arr;
+	}
+
+	/**
+	 * Get the Array Consumption
+	 */
+	public float[] getTrackingCons() {
+		return this.trackingCons;
+	}
+
+	/**
+	 * If the user track any HolonObject the tracking information will be
+	 * updated. (If the HolonObject enters into the untracked state, the array
+	 * will be reseted)
+	 */
+
+	public void updateTrackingInfo() {
+		float[] tempProd = new float[100];
+		float[] tempCons = new float[100];
+		for (int i = 0; i < 100; i++) {
+			float valueProd = 0;
+			float valueCons = 0;
+			for (HolonElement e : getElements()) {
+				if (e.getActive() && e.getSign() == '+') {
+					valueProd = valueProd + e.getTotalEnergyAtTimeStep(i);
+				}
+				if (e.getActive() && e.getSign() == '-') {
+					valueCons = valueCons + e.getTotalEnergyAtTimeStep(i);
+				}
+			}
+			tempProd[i] = valueProd;
+			tempCons[i] = valueCons;
+		}
+		this.trackingProd = tempProd;
+		this.trackingCons = tempCons;
+	}
 }

+ 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);
+		}
+	}
+
 }

+ 4 - 3
src/ui/controller/StatsController.java

@@ -24,9 +24,10 @@ public class StatsController {
 	}
 
 	public void addTrackingObj(HolonObject obj) {
-		ArrayList<HolonObject> objArr = model.getTrackingObj();
-		objArr.add(obj);
-		model.setTrackingObj(objArr);
+		model.getTrackingObj().add(obj);
+		for(int i = 0; i < model.getTrackingObj().size(); i++){
+			System.out.println(model.getTrackingObj().get(i).getName() + " " + model.getTrackingObj().get(i).getID());
+		}
 	}
 
 	public void removeTrackingObj(HolonObject obj) {

+ 4 - 2
src/ui/view/GUI.java

@@ -111,8 +111,8 @@ public class GUI<E> implements CategoryListener {
 	private String catOfObjToBeEdited;
 	private final JScrollPane statTab = new JScrollPane();
 	
-	private StatisticPane statPane = new StatisticPane();
-	private JScrollPane statScrollPane = new JScrollPane(statPane);
+	private StatisticPane statPane;
+	private JScrollPane statScrollPane;
 
 	private final JLabel maxGraph = new JLabel("100%");
 	private final JLabel medGraph = new JLabel("50%");
@@ -264,6 +264,8 @@ public class GUI<E> implements CategoryListener {
 	public GUI(Control control) {
 		this.controller = control;
 		this.model = control.getModel();
+		statPane = new StatisticPane(model, controller);
+		statScrollPane = new JScrollPane(statPane);
 		this.canvas = new MyCanvas(model, control);
 		this.unitGraph = new UnitGraph(model, control);
 		this.statGraph = new StatisticGraph(model, controller);

+ 13 - 8
src/ui/view/MyCanvas.java

@@ -135,19 +135,20 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				for (AbstractCpsObject o : model.getSelectedCpsObjects()) {
 					if (o instanceof HolonObject) {
 						boolean found = false;
-						if (control.getTrackingObj() != null) {
-							for (HolonObject obj : control.getTrackingObj()) {
+						if (controller.getTrackingObj() != null) {
+							for (HolonObject obj : controller.getTrackingObj()) {
 								if (obj.getID() == o.getID()) {
 									found = true;
 								}
 							}
 						}
 						if (!found) {
-							control.addTrackingObj((HolonObject) o);
+							controller.addTrackingObj((HolonObject) o);
+							((HolonObject) o).updateTrackingInfo();
 						}
 					}
 				}
-				System.out.println(control.getTrackingObj());
+				System.out.println(controller.getTrackingObj());
 			}
 		});
 
@@ -158,19 +159,23 @@ public class MyCanvas extends JPanel implements MouseListener, MouseMotionListen
 				for (AbstractCpsObject o : model.getSelectedCpsObjects()) {
 					if (o instanceof HolonObject) {
 						boolean found = false;
-						if (control.getTrackingObj() != null) {
-							for (HolonObject obj : control.getTrackingObj()) {
+						if (controller.getTrackingObj() != null) {
+							for (HolonObject obj : controller.getTrackingObj()) {
 								if (obj.getID() == o.getID()) {
 									found = true;
 								}
 							}
 						}
 						if (found) {
-							control.removeTrackingObj((HolonObject) o);
+							// Removed from tracking array and tracking
+							// information reseted
+							controller.removeTrackingObj((HolonObject) o);
+							((HolonObject) o).setTrackingProd(new float[100]);
+							((HolonObject) o).setTrackingCons(new float[100]);
 						}
 					}
 				}
-				System.out.println(control.getTrackingObj());
+				System.out.println(controller.getTrackingObj());
 			}
 		});
 

+ 89 - 51
src/ui/view/StatisticPane.java

@@ -14,15 +14,27 @@ import javax.swing.JCheckBox;
 import javax.swing.LayoutStyle.ComponentPlacement;
 import java.awt.Color;
 import javax.swing.SwingConstants;
+
+import ui.controller.Control;
+import ui.model.Model;
+
 import javax.swing.JComboBox;
+import javax.swing.JButton;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
 
 public class StatisticPane extends JPanel{
 	private JScrollPane listScrollPane = new JScrollPane();
     private JList objectList;
-    private DefaultListModel model =  new DefaultListModel();
+    private DefaultListModel listModel =  new DefaultListModel();
+    private Model model;
+    private Control controller;
+    private JPanel statGraph;
     
-    public StatisticPane(){
-    	objectList = new JList(model);
+    public StatisticPane(Model m, Control c){
+    	model = m;
+    	controller = c;
+    	objectList = new JList(listModel);
     	listScrollPane.setViewportView(objectList);
     	
     	JLabel lblOverallStatistics = new JLabel("Overall Statistics:");
@@ -51,70 +63,96 @@ public class StatisticPane extends JPanel{
     	JLabel lblGraph = new JLabel("  Graph:");
     	
     	JComboBox comboBox = new JComboBox();
+    	
+    	statGraph = new JPanel();
+    	
+    	JButton btnRefresh = new JButton("Refresh");
+    	btnRefresh.addActionListener(new ActionListener() {
+    		public void actionPerformed(ActionEvent e) {
+    			for(int i = 0; i < controller.getTrackingObj().size(); i++){
+    				listModel.addElement(controller.getTrackingObj().get(i).getName() +
+    						controller.getTrackingObj().get(i).getID());
+    			}
+    		}
+    	});
     	GroupLayout groupLayout = new GroupLayout(this);
     	groupLayout.setHorizontalGroup(
     		groupLayout.createParallelGroup(Alignment.LEADING)
     			.addGroup(groupLayout.createSequentialGroup()
     				.addContainerGap()
     				.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(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.LEADING, false)
-    									.addGroup(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, GroupLayout.PREFERRED_SIZE, 111, 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))
+    				.addPreferredGap(ComponentPlacement.RELATED, 37, Short.MAX_VALUE)
+    				.addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false)
+    					.addGroup(groupLayout.createSequentialGroup()
+    						.addComponent(btnRefresh)
+    						.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+    					.addComponent(statGraph, Alignment.TRAILING, GroupLayout.PREFERRED_SIZE, 226, GroupLayout.PREFERRED_SIZE)))
     	);
     	groupLayout.setVerticalGroup(
     		groupLayout.createParallelGroup(Alignment.LEADING)
     			.addGroup(groupLayout.createSequentialGroup()
-    				.addContainerGap()
-    				.addComponent(lblOverallStatistics)
-    				.addPreferredGap(ComponentPlacement.UNRELATED)
-    				.addComponent(chckbxNewCheckBox)
-    				.addPreferredGap(ComponentPlacement.UNRELATED)
-    				.addComponent(chckbxNewCheckBox_1)
-    				.addGap(18)
-    				.addComponent(lblObject)
-    				.addPreferredGap(ComponentPlacement.UNRELATED)
-    				.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
-    					.addComponent(lblNewLabel)
-    					.addComponent(lblName))
-    				.addPreferredGap(ComponentPlacement.UNRELATED)
-    				.addComponent(checkBox)
-    				.addPreferredGap(ComponentPlacement.UNRELATED)
-    				.addComponent(checkBox_1)
-    				.addPreferredGap(ComponentPlacement.UNRELATED)
-    				.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
-    					.addComponent(lblGraph)
-    					.addComponent(comboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
-    				.addGap(57)
-    				.addComponent(listScrollPane, GroupLayout.PREFERRED_SIZE, 177, GroupLayout.PREFERRED_SIZE)
-    				.addContainerGap(23, Short.MAX_VALUE))
+    				.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
+    					.addGroup(groupLayout.createSequentialGroup()
+    						.addGap(17)
+    						.addComponent(statGraph, GroupLayout.DEFAULT_SIZE, 156, Short.MAX_VALUE))
+    					.addGroup(groupLayout.createSequentialGroup()
+    						.addContainerGap()
+    						.addComponent(lblOverallStatistics)
+    						.addPreferredGap(ComponentPlacement.UNRELATED)
+    						.addComponent(chckbxNewCheckBox)
+    						.addPreferredGap(ComponentPlacement.UNRELATED)
+    						.addComponent(chckbxNewCheckBox_1)
+    						.addGap(18)
+    						.addComponent(lblObject)
+    						.addPreferredGap(ComponentPlacement.UNRELATED)
+    						.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
+    							.addComponent(lblNewLabel)
+    							.addComponent(lblName))
+    						.addPreferredGap(ComponentPlacement.UNRELATED)
+    						.addComponent(checkBox)))
+    				.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
+    					.addGroup(groupLayout.createSequentialGroup()
+    						.addPreferredGap(ComponentPlacement.UNRELATED)
+    						.addComponent(checkBox_1)
+    						.addPreferredGap(ComponentPlacement.UNRELATED)
+    						.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
+    							.addComponent(lblGraph)
+    							.addComponent(comboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
+    						.addGap(57)
+    						.addComponent(listScrollPane, GroupLayout.PREFERRED_SIZE, 177, GroupLayout.PREFERRED_SIZE))
+    					.addGroup(groupLayout.createSequentialGroup()
+    						.addGap(125)
+    						.addComponent(btnRefresh)))
+    				.addContainerGap(25, Short.MAX_VALUE))
     	);
     	setLayout(groupLayout);
-    	
-    	for(int i = 0; i < 20; i++){
-    		model.addElement(i*2000000000);
-    	}
 
     }
+    
+    public void updateGraphs(){
+    	statGraph.repaint();
+    }
 }