Browse Source

Stable No Batteries

Tom Troppmann 5 years ago
parent
commit
9eb3345f4b

+ 3 - 0
src/classes/CpsNode.java

@@ -24,4 +24,7 @@ public class CpsNode extends AbstractCpsObject {
 		this.setSav("CVS");
 		this.setId(IdCounter.nextId());
 	}
+	public String toString(){
+		return "Node ID:" + super.id;
+	}
 }

+ 1 - 1
src/classes/CpsUpperNode.java

@@ -13,7 +13,7 @@ public class CpsUpperNode extends AbstractCpsObject {
 	private HashMap<Integer, Integer> nodesIdx;
 	
 	@Expose
-	private int leftBorder;
+	private int leftBorder; //TODO Delete leftBorder, jet is just set to 0
 	@Expose
 	private String imgPath = "";
 	@Expose

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

@@ -10,6 +10,7 @@ import interfaces.CategoryListener;
 import org.apache.commons.compress.archivers.ArchiveException;
 
 import ui.model.Model;
+import ui.model.Model.FairnessModel;
 import ui.view.CreateTemplatePopUp;
 import ui.view.FlexiblePane;
 import ui.view.GUI;
@@ -805,7 +806,7 @@ public class Control {
     }
 
     public void addObjUpperNode(AbstractCpsObject object, CpsUpperNode upperNode) {
-        nodeController.addObjectInUpperNode(object, upperNode, true);
+    	nodeController.addObjectInUpperNode(object, upperNode, true);
         try {
             autoSave();
         } catch (IOException e) {
@@ -1027,9 +1028,9 @@ public class Control {
 	
 	/**
      * Sets fairness Model
-     * @param fairnessModel that should be used. 
+     * @param mininumdemandfirst that should be used. 
      */
-	public void setFairnessModel(short fairnessModel) {
+	public void setFairnessModel(FairnessModel fairnessModel) {
 		globalController.setFairnessModel(fairnessModel);
 	}
 	

+ 2 - 1
src/ui/controller/GlobalController.java

@@ -3,6 +3,7 @@ package ui.controller;
 import java.awt.Color;
 
 import ui.model.Model;
+import ui.model.Model.FairnessModel;
 import ui.view.StatisticGraphPanel;
 
 /**
@@ -177,7 +178,7 @@ public class GlobalController {
 	 * sets showSupplyBars
 	 * @param showSupplyBars
 	 */
-	public void setFairnessModel(short fairnessModel) {
+	public void setFairnessModel(FairnessModel fairnessModel) {
 		model.setFairnessModel(fairnessModel);
 	}
 }

+ 3 - 13
src/ui/controller/SimulationManager.java

@@ -14,6 +14,7 @@ import ui.model.DecoratedSwitch;
 import ui.model.MinimumModel;
 import ui.model.MinimumNetwork;
 import ui.model.Model;
+import ui.model.Model.FairnessModel;
 import ui.model.VisualRepresentationalState;
 import ui.view.FlexiblePane;
 import ui.view.GUI;
@@ -49,18 +50,6 @@ public class SimulationManager {
 	private GUI gui;
 	private HashMap<HolonElement, Float> flexDevicesTurnedOnThisTurn = new HashMap<>();
 
-	/**
-	 * One Element of each HolonObject will be powered first, starting with the
-	 * smallest Demand. If ale HolonObjects have an active Element, the
-	 * simulation will try to fully supply as many HolonObjects as possible.
-	 */
-	public static final short fairnessMininumDemandFirst = 0;
-
-	/**
-	 * All HolonObjects will receive the same amount of energy.
-	 */
-	public static final short fairnessAllEqual = 1;
-
 	/**
 	 * Constructor.
 	 *
@@ -116,8 +105,9 @@ public class SimulationManager {
 			}
 		}
 		ArrayList<DecoratedNetwork> decorNetworks = new ArrayList<DecoratedNetwork>();
+		FairnessModel actualFairnessModel = model.getFairnessModel();
 		for (MinimumNetwork net : list) {
-			decorNetworks.add(new DecoratedNetwork(net, timestep));
+			decorNetworks.add(new DecoratedNetwork(net, timestep, actualFairnessModel));
 		}
 		ArrayList<DecoratedCable> leftOverDecoratedCables = new ArrayList<DecoratedCable>();
 		

+ 1 - 14
src/ui/model/DecoratedGroupNode.java

@@ -30,20 +30,7 @@ public class DecoratedGroupNode {
 	private ArrayList<DecoratedGroupNode> groupNodeList;
 
 
-	public DecoratedGroupNode(CpsUpperNode model, ArrayList<Supplier> supplierList, ArrayList<Passiv> passivList,
-			ArrayList<Consumer> consumerList, ArrayList<CpsNode> nodeList, ArrayList<DecoratedCable> internCableList,
-			ArrayList<ExitCableV2> exitCableList, ArrayList<DecoratedSwitch> switchList,
-			ArrayList<DecoratedGroupNode> groupNodeList) {
-		this.model = model;
-		this.supplierList = supplierList;
-		this.passivList = passivList;
-		this.consumerList = consumerList;
-		this.nodeList = nodeList;
-		this.internCableList = internCableList;
-		this.exitCableList = exitCableList;
-		this.switchList = switchList;
-		this.groupNodeList = groupNodeList;
-	}
+
 	public DecoratedGroupNode(CpsUpperNode model) {
 		this.model = model;
 		this.supplierList = new ArrayList<Supplier>();

+ 90 - 39
src/ui/model/DecoratedNetwork.java

@@ -5,6 +5,7 @@ import java.util.ArrayList;
 import classes.HolonObject;
 import ui.model.DecoratedCable.CableState;
 import ui.model.DecoratedHolonObject.HolonObjectState;
+import ui.model.Model.FairnessModel;
 
 public class DecoratedNetwork {
 	private ArrayList<Supplier> supplierList = new ArrayList<Supplier>();
@@ -13,10 +14,19 @@ public class DecoratedNetwork {
 	private ArrayList<Passiv> passivNoEnergyList = new ArrayList<Passiv>();
 	private ArrayList<DecoratedCable> decoratedCableList = new ArrayList<DecoratedCable>();
 
-	public DecoratedNetwork(MinimumNetwork minimumNetwork, int Iteration){	
-		calculateMinimumDemandFirstNetwork(minimumNetwork, Iteration);
+	public DecoratedNetwork(MinimumNetwork minimumNetwork, int Iteration, FairnessModel actualFairnessModel){	
+		switch(actualFairnessModel) {
+		case AllEqual:
+			calculateAllEqualNetwork(minimumNetwork, Iteration);
+			break;
+		case MininumDemandFirst:
+		default:
+			calculateMinimumDemandFirstNetwork(minimumNetwork, Iteration);
+			break;		
+		}
 	}
 
+
 	//Getter:
 	public ArrayList<Supplier> getSupplierList() {
 		return supplierList;
@@ -43,50 +53,15 @@ public class DecoratedNetwork {
 	
 	//Calculations:
 	private void calculateMinimumDemandFirstNetwork(MinimumNetwork minimumNetwork, int Iteration) {
-		//Categorize
-		for(HolonObject hObject: minimumNetwork.getHolonObjectList()) {
-			float energyNeeded = hObject.getEnergyNeededFromConsumingElements(Iteration);
-			float energySelfProducing = hObject.getEnergySelfProducingFromProducingElements(Iteration);
-			if(energyNeeded < energySelfProducing) {
-				Supplier sup = new Supplier(hObject, energySelfProducing - energyNeeded);
-				supplierList.add(sup);
-			} else if (energyNeeded > energySelfProducing) {
-				Consumer con = new Consumer(hObject);
-				con.setEnergyNeededFromNetwork(energyNeeded - energySelfProducing);
-				con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergy(Iteration));
-				con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElements(Iteration));
-				con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElements(Iteration));
-				consumerList.add(con);
-			}else if(energyNeeded == energySelfProducing) {
-				
-				if (energySelfProducing == 0.0f) {
-					Passiv pas = new Passiv(hObject);
-					passivNoEnergyList.add(pas);
-				} else {
-					Consumer con = new Consumer(hObject);
-					con.setEnergyNeededFromNetwork(0.0f);
-					con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergy(Iteration));
-					con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElements(Iteration));
-					con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElements(Iteration));
-					consumerSelfSuppliedList.add(con);
-				}
-				
-			}
-		}
-		
-		
+		categorize(minimumNetwork, Iteration);
 		//Sort SupplierList according to the EnergyToSupplyNetwork maximum first.
 		//Sort ConsumerList according to the MinimumConsumingElementEnergy minimum first.
 		supplierList.sort((Supplier lhs,Supplier rhs) -> -Float.compare(lhs.getEnergyToSupplyNetwork(), rhs.getEnergyToSupplyNetwork()));
 		consumerList.sort((Consumer lhs,Consumer rhs) -> Float.compare(lhs.getMinimumConsumingElementEnergy()  , rhs.getMinimumConsumingElementEnergy()));
 		//consumerList.forEach((con) -> System.out.println(con.getMinimumConsumingElementEnergy()));
 		//consumerList.forEach((con) -> System.out.println("AfterSorting" + con));
-		//Minimum demand first:
 		float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
-		//DecoratedCables
-		for(CableWithState edge: minimumNetwork.getEdgeList()) {		
-			decoratedCableList.add(new DecoratedCable(edge.getModel(), edge.getState(), (edge.getState() == CableState.Working) ? energyToSupplyInTheNetwork : 0.0f));
-		}
+		decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
 		
 		outerLoop:
 			for(Consumer con : consumerList)
@@ -190,6 +165,50 @@ public class DecoratedNetwork {
 		
 		//consumerSelfSuppliedList.forEach((con) -> System.out.println("AfterOverSuppleiing" + con));
 		
+		calculateStates();
+	}
+
+
+	private void decorateCable(MinimumNetwork minimumNetwork, float energyToSupplyInTheNetwork) {
+		//DecoratedCables
+		//Minimum demand first:
+		for(CableWithState edge: minimumNetwork.getEdgeList()) {		
+			decoratedCableList.add(new DecoratedCable(edge.getModel(), edge.getState(), (edge.getState() == CableState.Working) ? energyToSupplyInTheNetwork : 0.0f));
+		}
+	}
+
+
+
+	private void calculateAllEqualNetwork(MinimumNetwork minimumNetwork, int Iteration) {
+		categorize(minimumNetwork, Iteration);
+		float energyToSupplyInTheNetwork = supplierList.stream().map(supplier -> supplier.getEnergyToSupplyNetwork() - supplier.getEnergySupplied()).reduce( 0.0f, (a, b) -> a + b);
+		float energyForEachConsumer = (consumerList.size() != 0) ? energyToSupplyInTheNetwork / consumerList.size() : 0.0f;
+		decorateCable(minimumNetwork, energyToSupplyInTheNetwork);
+		//Supply consumer equal 
+		outerLoop:
+		for(Consumer con : consumerList)
+		{
+			//gehe Supplier list durch wer ihn supplien kann.
+			float energyNeededForEqualSupply = energyForEachConsumer;
+			for(Supplier sup : supplierList) {
+				float  energyRdyToSupply = sup.getEnergyToSupplyNetwork() - sup.getEnergySupplied();
+				if(energyRdyToSupply == 0.0f) continue;
+				if(energyRdyToSupply>=energyNeededForEqualSupply) {
+					supply(con, sup, energyNeededForEqualSupply);
+					continue outerLoop;
+				}else
+				{
+					supply(con, sup, energyRdyToSupply);
+					energyNeededForEqualSupply -= energyRdyToSupply;
+				}
+			}
+			//No more Energy in the network
+			break;
+		}
+		calculateStates();
+	}
+
+	private void calculateStates() {
 		//CalculateStates:
 		supplierList.forEach(sup -> sup.setState(HolonObjectState.PRODUCER));
 		passivNoEnergyList.forEach(sup -> sup.setState(HolonObjectState.NO_ENERGY));
@@ -202,6 +221,38 @@ public class DecoratedNetwork {
 			setConsumerState(con);
 		}
 	}
+	private void categorize(MinimumNetwork minimumNetwork, int Iteration) {
+		//Categorize
+		for(HolonObject hObject: minimumNetwork.getHolonObjectList()) {
+			float energyNeeded = hObject.getEnergyNeededFromConsumingElements(Iteration);
+			float energySelfProducing = hObject.getEnergySelfProducingFromProducingElements(Iteration);
+			if(energyNeeded < energySelfProducing) {
+				Supplier sup = new Supplier(hObject, energySelfProducing - energyNeeded);
+				supplierList.add(sup);
+			} else if (energyNeeded > energySelfProducing) {
+				Consumer con = new Consumer(hObject);
+				con.setEnergyNeededFromNetwork(energyNeeded - energySelfProducing);
+				con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergy(Iteration));
+				con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElements(Iteration));
+				con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElements(Iteration));
+				consumerList.add(con);
+			}else if(energyNeeded == energySelfProducing) {
+				
+				if (energySelfProducing == 0.0f) {
+					Passiv pas = new Passiv(hObject);
+					passivNoEnergyList.add(pas);
+				} else {
+					Consumer con = new Consumer(hObject);
+					con.setEnergyNeededFromNetwork(0.0f);
+					con.setMinimumConsumingElementEnergy(hObject.getMinimumConsumingElementEnergy(Iteration));
+					con.setEnergyFromConsumingElemnets(hObject.getEnergyNeededFromConsumingElements(Iteration));
+					con.setEnergySelfSupplied(hObject.getEnergySelfProducingFromProducingElements(Iteration));
+					consumerSelfSuppliedList.add(con);
+				}
+				
+			}
+		}
+	}
 	
 	
 	private void setConsumerState(Consumer con) {

+ 21 - 3
src/ui/model/Model.java

@@ -78,8 +78,26 @@ public class Model {
     //TODO:
     private int iterations=100;
     
+    /**
+	 * All implemented FairnessModels:<br>
+	 * {@link FairnessModel#MininumDemandFirst}<br>
+	 * {@link FairnessModel#AllEqual}
+	 */
+	public enum FairnessModel{
+		/**
+		 * One Element of each HolonObject will be powered first, starting with the
+		 * smallest Demand. If ale HolonObjects have an active Element, the
+		 * simulation will try to fully supply as many HolonObjects as possible.
+		 */
+		MininumDemandFirst, 
+		/**
+		 * All HolonObjects will receive the same amount of energy.
+		 */
+		AllEqual
+	}
     /** the Fairness model in use */
-    private short fairnessModel = 0;
+    private FairnessModel fairnessModel = FairnessModel.MininumDemandFirst;
+    
     /*
      * Array of all categories in the model. It is set by default with the
      * categories ENERGY, BUILDINGS and COMPONENTS
@@ -952,14 +970,14 @@ public class Model {
 	/**
 	 * @return the fairnessModel
 	 */
-	public short getFairnessModel() {
+	public FairnessModel getFairnessModel() {
 		return fairnessModel;
 	}
 	
 	/**
 	 * @param fairnessModel the fairnessModel to set
 	 */
-	public void setFairnessModel(short fairnessModel) {
+	public void setFairnessModel(FairnessModel fairnessModel) {
 		this.fairnessModel = fairnessModel;
 	}
 	

+ 9 - 1
src/ui/view/AbstractCanvas.java

@@ -235,7 +235,15 @@ public abstract class AbstractCanvas extends JPanel {
 		}
 	}
 
-
+	protected class ACpsHandle{
+		public AbstractCpsObject object;
+		ACpsHandle(AbstractCpsObject object){
+			this.object = object;
+		}
+		public String toString() {
+			return object.toString();
+		}
+	}
 
 	void drawMarker() {
 		if (sx > x && sy > y) {

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

@@ -17,6 +17,7 @@ import ui.controller.SimulationManager;
 import ui.controller.UpdateController;
 import ui.model.DecoratedState;
 import ui.model.Model;
+import ui.model.Model.FairnessModel;
 import ui.view.NewPopUp.Option;
 
 import javax.swing.*;
@@ -63,7 +64,6 @@ public class GUI implements CategoryListener {
 	 * Menu on the Top containing File, Edit View Help etc
 	 */
 	private final JMenuBar menuBar = new JMenuBar();
-	
 	private final JMenu mnNewMenu = new JMenu("File");
 	private final JMenu mnNewMenuEdit = new JMenu("Edit");
 	private final JMenu mnNewMenuOptions = new JMenu("Options");
@@ -819,8 +819,7 @@ public class GUI implements CategoryListener {
 
 		mntmFairMinFirst
 				.addActionListener(arg0 -> {
-					controller
-							.setFairnessModel(SimulationManager.fairnessMininumDemandFirst);
+					controller.setFairnessModel(FairnessModel.MininumDemandFirst);
 					mntmFairMinFirst.setForeground(Color.BLUE);
 					mntmFairAlleEqual.setForeground(mnFairnessModel
 							.getForeground());
@@ -839,7 +838,7 @@ public class GUI implements CategoryListener {
 				.setToolTipText("HolonObjects will all get the same amount of energy.");
 
 		mntmFairAlleEqual.addActionListener(arg0 -> {
-			controller.setFairnessModel(SimulationManager.fairnessAllEqual);
+			controller.setFairnessModel(FairnessModel.AllEqual);
 			mntmFairAlleEqual.setForeground(Color.BLUE);
 			mntmFairMinFirst.setForeground(mnFairnessModel.getForeground());
 			controller.calculateStateForCurrentTimeStep();
@@ -950,9 +949,7 @@ public class GUI implements CategoryListener {
 		
 		mnNewMenuView.add(mntmOutLiner);
 		mntmOutLiner.addActionListener(actienEvent -> {
-			System.out.println("MyButton");
 			outlinerList.add(new Outliner(frmCyberPhysical, model, controller, this, outlinerList));
-			System.out.println("Size: " + outlinerList.size());
 		});
 		
 		
@@ -1838,14 +1835,12 @@ public class GUI implements CategoryListener {
 				try {
 					if (dragging) {
 						chooseTabTemp();
-
 						JScrollPane scrollPane = getScrollPaneFromTabbedPane();
 						Component canvasOrUpperNodeCanvas = scrollPane
 								.getViewport().getComponent(0);
 
 						if (canvasOrUpperNodeCanvas instanceof UpperNodeCanvas) {
 							UpperNodeCanvas unc = (UpperNodeCanvas) canvasOrUpperNodeCanvas;
-
 							int x = (int) unc.getMousePosition().getX() + 16;
 							int y = (int) unc.getMousePosition().getY() + 16;
 
@@ -1880,6 +1875,7 @@ public class GUI implements CategoryListener {
 								 */
 								unc.mayBeReplaced = null; 
 								unc.invalidate();
+								controller.calculateStateForCurrentTimeStep();
 								unc.repaint();
 								unc.setXY((int) canvas.getMousePosition()
 										.getX(), (int) canvas
@@ -1911,7 +1907,6 @@ public class GUI implements CategoryListener {
 							if(canvas.mayBeReplaced!=null &&canvas.mayBeReplaced instanceof CpsUpperNode){
 								canvas.closeUpperNodeTab(canvas.mayBeReplaced.getId());
 							}
-							
 							controller.addObjectCanvas(h);
 							/**
 							 * no object should get replaced

+ 21 - 0
src/ui/view/MyCanvas.java

@@ -34,10 +34,12 @@ import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 import java.awt.font.LineMetrics;
 import java.awt.geom.Line2D;
+import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.stream.Collectors;
 
 /**
  * This Class is the Canvas. All Objects will be visualized here
@@ -911,6 +913,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		toolTip = on;
 	}
 
+
 	/**
 	 * Draws or Deletes an Edge.
 	 */
@@ -953,6 +956,24 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 						if(!(cps instanceof CpsUpperNode || tempCps instanceof CpsUpperNode)) {
 							e = new CpsEdge(cps, tempCps, model.getMaxCapacity());
 							controller.addEdgeOnCanvas(e);
+						}else if (cps instanceof CpsUpperNode && !(tempCps instanceof CpsUpperNode)){
+							CpsUpperNode thisUpperNode = (CpsUpperNode)cps;
+							Object[] possibilities = thisUpperNode.getNodes().stream().map(aCps -> new ACpsHandle(aCps)).filter(aCpsHandle -> !(aCpsHandle.object instanceof CpsUpperNode)).toArray();
+							if(possibilities.length != 0) {
+								ACpsHandle selected = (ACpsHandle) JOptionPane.showInputDialog(this, "Select a inside Object:", "Connection To?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");
+								if(selected != null) {
+									e = new CpsEdge(selected.object, tempCps, model.getMaxCapacity());
+									controller.addEdgeUpperNode(e, (CpsUpperNode)cps);
+								}
+							}else {
+								CpsNode n = new CpsNode("Node");
+
+								n.setPosition(x, y);
+								controller.addObjUpperNode(n, thisUpperNode);
+								e = new CpsEdge(n, tempCps, model.getMaxCapacity());
+								controller.addEdgeUpperNode(e, (CpsUpperNode)cps);
+							}
+							
 						}
 						
 					}

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

@@ -795,7 +795,7 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 	 * @param obj
 	 */
 	public void update(ArrayList<AbstractCpsObject> obj) {
-		System.out.println("update");
+		
 	}
     
 

+ 23 - 328
src/ui/view/UpperNodeCanvas.java

@@ -72,7 +72,7 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
         scalediv20 = model.getScale() / 20;
 
         // Cps objecte aus dem border links schieben
-        upperNode.setLeftBorder((int) (50 + scalediv20 + scalediv20 + 10));
+        upperNode.setLeftBorder(/*(int) (50 + scalediv20 + scalediv20 + 10)*/ 0);
         for (AbstractCpsObject cps : upperNode.getNodes()) {
             if (cps.getPosition().x < model.getScaleDiv2() + upperNode.getLeftBorder() + 5) {
                 cps.setPosition(
@@ -555,57 +555,7 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
 		for(DecoratedCable cable : actualGroupNode.getInternCableList()) {
 			paintCable(g2d, cable, selectedEdges.contains(cable.getModel()));
 		}
-		//ExitCable:
-//		for(ExitCable exitCable : actualGroupNode.getExitCableList()) {
-//			Position start = exitCable.getInsideObject().getPosition();
-//			Position end =  exitCable.getOusideObject().getPosition();
-//			Vector2d vStart = new Vector2d(start.x, start.y);
-//			Vector2d vEnd = new Vector2d(end.x, end.y);
-//			float stretchFactor = 4 * model.getScale();
-//			stretchFactor =  (stretchFactor > vStart.getDistance(vEnd))? vStart.getDistance(vEnd) : stretchFactor;
-//			Vector2d vPosition = vStart.add((vEnd.subtract(vStart)).normalize().multiply(stretchFactor));// vStart + (direction to end) * magnitude; 
-//			float currentEnergy = exitCable.getCable().getFlowEnergy();
-//			float capacity = exitCable.getModel().getCapacity();
-//			switch(exitCable.getCable().getState()) {
-//			case Burned:
-//				g2d.setColor(Color.RED);
-//				g2d.setStroke(new BasicStroke(2));
-//				break;
-//			case Working:
-//				g2d.setColor(new Color(13, 175, 28));
-//				g2d.setStroke(new BasicStroke((currentEnergy / capacity* 2f) + 1));
-//				break;
-//			}
-//			Position result = new Position(Math.round(vPosition.getX()),Math.round(vPosition.getY()));
-//			g2d.drawLine(start.x, start.y, result.x, result.y);
-//			Position middle = new Position((start.x +result.x) / 2, (start.y + +result.y) / 2);
-//			g2d.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) )); 
-//			g2d.drawString(currentEnergy + "/" + capacity , middle.x, middle.y);
-//			drawCanvasObject(g2d, "/Images/arrowUp.png" , result);
-			//Get Window:
-//			int scale = controller.getScale() * 2 ;
-//			g2d.drawRect(result.x - scale/2 - 1 , result.y - scale/2 -1 ,scale + 2,scale + 2);
-//			Position groupNode = exitCable.getCpsUpperNode().getPosition();
-//			Position outSideNode = exitCable.getOusideObject().getPosition();;
-//			int smallX, smallY, bigX, bigY;
-//			smallX = Math.min(groupNode.x, outSideNode.x) - controller.getScaleDiv2() ;
-//			smallY = Math.min(groupNode.y, outSideNode.y) - controller.getScaleDiv2();
-//			bigX = Math.max(groupNode.x, outSideNode.x)+ controller.getScaleDiv2();
-//			bigY = Math.max(groupNode.y, outSideNode.y)+ controller.getScaleDiv2();
-//			smallX = groupNode.x - controller.getScaleDiv2() * 3;
-//			smallY = groupNode.y - controller.getScaleDiv2() * 3;
-//			bigX = groupNode.x + controller.getScaleDiv2() * 3;
-//			bigY = groupNode.y + controller.getScaleDiv2() * 3;
-//			smallX= (smallX < 0) ? 0: smallX;
-//			smallY = (smallY < 0) ? 0: smallY;
-//			bigX = (bigX < parentPreview.getWidth()) ? bigX :  parentPreview.getWidth();
-//			bigY = (bigY < parentPreview.getHeight()) ? bigY :  parentPreview.getHeight();
-//			float aspectratio =  ((float)bigX-smallX) /  ((float)bigY-smallY);
-//			g2d.drawImage(parentPreview.getSubimage(smallX, smallY,bigX-smallX,bigY-smallY).getScaledInstance(Math.round(((float)scale) * aspectratio), Math.round(((float)scale) / aspectratio), Image.SCALE_SMOOTH), 
-//					result.x - scale/2,
-//					result.y - scale/2,
-//					scale, scale , null);
-//		}
+	
 		
 		for(DecoratedGroupNode dGroupNode : actualGroupNode.getGroupNodeList()) {
 			paintGroupNode(g2d, dGroupNode);
@@ -667,252 +617,7 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
 		}
 		//<-- OldCode
 	}
-        
-//        ((JScrollPane) this.getParent().getParent()).setColumnHeaderView(breadCrumb);
-//        // Rendering
-//        g2 = (Graphics2D) g;
-//        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-//        g2.setRenderingHints(rh);
-//
-//        // Paint the Background
-//        if (!upperNode.getImagePath().isEmpty()) {
-//            img = new ImageIcon(upperNode.getImagePath()).getImage();
-//            switch (upperNode.getBackgroundMode()) {
-//                case BackgroundPopUp.IMAGE_PIXELS:
-//                    g2.drawImage(img, upperNode.getLeftBorder(), 0, img.getWidth(null), img.getHeight(null), null);
-//                    break;
-//                case BackgroundPopUp.STRETCHED:
-//                    g2.drawImage(img, upperNode.getLeftBorder(), 0, model.getCanvasX(), model.getCanvasY(), null);
-//                    break;
-//                case BackgroundPopUp.CUSTOM:
-//                    g2.drawImage(img, upperNode.getLeftBorder(), 0, upperNode.getImageWidht(), upperNode.getImageHeight(),
-//                            null);
-//                    break;
-//                default:
-//                    break;
-//            }
-//        }
-//
-//        // Draw Left Border
-//        g2.setColor(new Color(230, 230, 230));
-//        g2.fillRect(0, 0, upperNode.getLeftBorder(), this.getHeight());
-//        g2.setColor(Color.BLACK);
-//        g2.drawLine(0, 0, this.getWidth(), 0);
-//
-//        // Test SubNet Coloring
-//        int i = 0;
-//        for (SubNet s : controller.getSimManager().getSubNets()) {
-//
-//            if (model.getSubNetColors().size() - 1 < i) {
-//                controller.addSubNetColor(new Color((int) (Math.random() * 255), (int) (Math.random() * 255),
-//                        (int) (Math.random() * 255)));
-//            }
-//
-//            for (HolonObject cps : s.getObjects()) {
-//                cps.setBorderColor(model.getSubNetColors().get(i));
-//            }
-//            i++;
-//        }
-//
-//        // drawEdges that is being dragged
-//        if (drawEdge) {
-//            g2.setColor(Color.BLACK);
-//            g2.setStroke(new BasicStroke(2));
-//
-//            // If TempCps is an outside Object
-//            if (!upperNode.getNodes().contains(tempCps)) {
-//                int count = 0;
-//                for (CpsEdge e : upperNode.getConnections()) {
-//                    if (e.getA().equals(tempCps)) {
-//                        g2.drawLine(upperNode.getLeftBorder() >> 1, (int) (model.getScaleDiv2() + scalediv20 + 5
-//                                + (model.getScale() + scalediv20 + 10) * count), x, y);
-//                    } else if (e.getB().equals(tempCps)) {
-//                        g2.drawLine(upperNode.getLeftBorder() >> 1, (int) (model.getScaleDiv2() + scalediv20 + 5
-//                                + (model.getScale() + scalediv20 + 10) * count), x, y);
-//                    }
-//                    count++;
-//                }
-//            } else {
-//                g2.drawLine(tempCps.getPosition().x, tempCps.getPosition().y, x, y);
-//            }
-//        }
-//        // draw Edges
-//        for (CpsEdge con : upperNode.getNodeEdges()) {
-//            maxCap = paintEdge(con, maxCap);
-//        }
-//
-//        // Objects connected to upperNode
-//        int count = 0;
-//        for (CpsEdge e : upperNode.getConnections()) {
-//            AbstractCpsObject cps;
-//            if (e.getA().equals(this.upperNode)) {
-//                cps = e.getB();
-//            } else {
-//                cps = e.getA();
-//            }
-//            // Show and Highlight
-//            if (model.getSelectedCpsObjects().contains(cps) || showedInformation[4]) {
-//                for (CpsEdge ed : cps.getConnections()) {
-//                    AbstractCpsObject obj = null;
-//                    if (upperNode.getNodes().contains(ed.getA())) {
-//                        obj = ed.getA();
-//                    } else if (upperNode.getNodes().contains(ed.getB())) {
-//                        obj = ed.getB();
-//                    }
-//                    if (obj != null) {
-//                        if (ed.getConnected() == 0) {
-//
-//                            setEdgeState(ed);
-//
-//                            if (ed.getA().getId() == model.getSelectedObjectID()
-//                                    || ed.getB().getId() == model.getSelectedObjectID() || edgeHighlight == ed)
-//                                g2.setColor(Color.BLUE);
-//                        } else {
-//                            g2.setColor(Color.DARK_GRAY);
-//                            g2.setStroke(new BasicStroke(2));
-//                        }
-//                        g2.drawLine(obj.getPosition().x, obj.getPosition().y, (upperNode.getLeftBorder() >> 1),
-//                                (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) + 25);
-//                        if (showedInformation[0]) {
-//
-//                            maxCap = setCapacityString(ed, maxCap);
-//
-//                            if (ed.getConnected() == 0 || ed.getConnected() == 1) {
-//                                g2.drawString(ed.getFlow() + "/" + maxCap,
-//                                        (obj.getPosition().x + (upperNode.getLeftBorder() >> 1)) / 2,
-//                                        (obj.getPosition().y + (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count)
-//                                                + 25) / 2);
-//                            } else {
-//                                g2.drawString("not connected",
-//                                        (obj.getPosition().x + (upperNode.getLeftBorder() >> 1)) / 2,
-//                                        (obj.getPosition().y + (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count)
-//                                                + 25) / 2);
-//                            }
-//                        }
-//                    }
-//                }
-//            }
-//
-//            // Border Highlighting
-//            if (showedInformation[3]) {
-//                g2.setColor(cps.getBorderColor());
-//                if (g2.getColor() != Color.WHITE) {
-//                    g2.fillRect((int) ((upperNode.getLeftBorder() >> 1) - 25 - scalediv20) - 3,
-//                            (int) (scalediv20 + 5 + (25 + scalediv20 + 10) * count - scalediv20) - 3,
-//                            (int) (50 + ((scalediv20 + 3) * 2)), (int) (50 + ((scalediv20 + 3) * 2)));
-//                }
-//            }
-//
-//            // node image
-//            if (cps instanceof CpsNode && (cps == tempCps || model.getSelectedCpsObject() == cps
-//                    || model.getSelectedCpsObjects().contains(cps) || tempSelected.contains(cps))) {
-//            	img = Util.loadImage("/Images/node_selected.png");
-//            } else {
-//                if (cps instanceof HolonSwitch) {
-//                    if (((HolonSwitch) cps).getState(model.getCurIteration())) {
-//                        ((HolonSwitch) cps).setAutoState(true);
-//                    } else {
-//                        ((HolonSwitch) cps).setAutoState(false);
-//                    }
-//                }
-//                // Highlighting
-//                if ((cps == tempCps && model.getSelectedCpsObjects().size() == 0 && tempSelected.size() == 0)
-//                        || model.getSelectedCpsObjects().contains(cps) || tempSelected.contains(cps)) {
-//                    g2.setColor(Color.BLUE);
-//                    g2.fillRect((int) ((upperNode.getLeftBorder() >> 1) - 25 - scalediv20),
-//                            (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count - scalediv20),
-//                            (int) (50 + (scalediv20 * 2)), (int) (50 + (scalediv20 * 2)));
-//                } else if (cps instanceof HolonObject) {
-//                    g2.setColor(((HolonObject) cps).getColor());
-//
-//                    g2.fillRect((int) ((upperNode.getLeftBorder() >> 1) - 25 - scalediv20),
-//                            (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count - scalediv20),
-//                            (int) (50 + (scalediv20 * 2)), (int) (50 + (scalediv20 * 2)));
-//                }
-//                // draw image
-//                File checkPath = new File(cps.getImage());
-//                if (checkPath.exists()) {
-//                    img = new ImageIcon(cps.getImage()).getImage();
-//                } else {
-//                	img = Util.loadImage(cps.getImage());
-//                }
-//            }
-//            g2.drawImage(img, (upperNode.getLeftBorder() >> 1) - 25,
-//                    (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count), 50, 50, null);
-//            count++;
-//        }
-//        // Highlighted Edge
-//        if (model.getSelectedObjectID() > 0 || !model.getSelectedCpsObjects().isEmpty() || !tempSelected.isEmpty()) {
-//            g2.setColor(Color.BLUE);
-//            for (CpsEdge con : upperNode.getNodeEdges()) {
-//                if (con.getFlow() <= con.getCapacity()) {
-//                    g2.setStroke(new BasicStroke(Math.min((con.getFlow() / con.getCapacity() * 3) + 1, 4)));
-//                } else {
-//                    g2.setStroke(new BasicStroke(2));
-//                }
-//
-//                maxCap = drawEdgeLine(con, maxCap);
-//            }
-//        } else if (edgeHighlight != null) {
-//            g2.setColor(Color.BLUE);
-//            if (edgeHighlight.getFlow() <= edgeHighlight.getCapacity()) {
-//                g2.setStroke(
-//                        new BasicStroke(Math.min((edgeHighlight.getFlow() / edgeHighlight.getCapacity() * 3) + 1, 4)));
-//            } else {
-//                g2.setStroke(new BasicStroke(2));
-//            }
-//            if (upperNode.getNodeEdges().contains(edgeHighlight)) {
-//                g2.drawLine(edgeHighlight.getA().getPosition().x, edgeHighlight.getA().getPosition().y,
-//                        edgeHighlight.getB().getPosition().x, edgeHighlight.getB().getPosition().y);
-//
-//                maxCap = setCapacityString(edgeHighlight, maxCap);
-//
-//                if (showedInformation[0]) {
-//                    g2.drawString(edgeHighlight.getFlow() + "/" + maxCap,
-//                            (edgeHighlight.getA().getPosition().x + edgeHighlight.getB().getPosition().x) / 2,
-//                            (edgeHighlight.getA().getPosition().y + edgeHighlight.getB().getPosition().y) / 2);
-//                }
-//            }
-//        }
-//
-//
-//        //Draw ReplaceHighlight
-//        highlightMayBeReplaced(g2);
-//        
-//        // Objects in upper node
-//        for (AbstractCpsObject cps : upperNode.getNodes()) {
-//            // Border Highlighting
-//            if (showedInformation[3]) {
-//                g2.setColor(cps.getBorderColor());
-//                if (g2.getColor() != Color.WHITE) {
-//                    g2.fillRect((int) (cps.getPosition().x - controller.getScaleDiv2() - scalediv20 - 3),
-//                            (int) (cps.getPosition().y - model.getScaleDiv2() - scalediv20 - 3),
-//                            (int) (controller.getScale() + ((scalediv20 + 3) * 2)),
-//                            (int) (controller.getScale() + ((scalediv20 + 3) * 2)));
-//                }
-//            }
-//
-//            setEdgePictureAndHighlighting(cps);
-//
-//            g2.drawImage(img, cps.getPosition().x - model.getScaleDiv2(), cps.getPosition().y - model.getScaleDiv2(),
-//                    controller.getScale(), controller.getScale(), null);
-//            paintSupplyBar(g2,cps);
-//        }
-//        
-//        // Dragged marker Highlighting
-//        g2.setStroke(new BasicStroke(1));
-//        if (doMark) {
-//            g2.setColor(Color.BLACK);
-//            drawMarker();
-//        }
-//
-//        // Border Line
-//        g2.setColor(Color.BLACK);
-//        g2.drawLine(upperNode.getLeftBorder(), 0, upperNode.getLeftBorder(), this.getHeight());
-//
-//        // Tooltip
-//        showTooltip(g);
-
+   
 
     @Override
     public void mouseClicked(MouseEvent e) {
@@ -1170,7 +875,7 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
                 if(model.getSelectedCpsObjects().size()==1)
                 	checkForReplacement(upperNode.getNodes(), tempCps, x, y);
 
-                repaint();
+               repaint();
             } catch (Exception eex) {
 
             }
@@ -1235,7 +940,6 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
     public void mouseMoved(MouseEvent e) {
         x = e.getX();
         y = e.getY();
-
         // Everything for the tooltip :)
         boolean on = false;
         for (AbstractCpsObject cps : upperNode.getNodes()) {
@@ -1322,6 +1026,24 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
 						} else {
 							controller.addEdgeUpperNode(e, upperNode);
 						}
+					}else if (cps instanceof CpsUpperNode && !(tempCps instanceof CpsUpperNode)){
+						CpsUpperNode thisUpperNode = (CpsUpperNode)cps;
+						Object[] possibilities = thisUpperNode.getNodes().stream().map(aCps -> new ACpsHandle(aCps)).filter(aCpsHandle -> !(aCpsHandle.object instanceof CpsUpperNode)).toArray();
+						if(possibilities.length != 0) {
+							ACpsHandle selected = (ACpsHandle) JOptionPane.showInputDialog(this, "Select a inside Object:", "Connection To?",  JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");
+							if(selected != null) {
+								e = new CpsEdge(selected.object, tempCps, model.getMaxCapacity());
+								controller.addEdgeUpperNode(e, (CpsUpperNode)cps);
+							}
+						}else {
+							CpsNode n = new CpsNode("Node");
+
+							n.setPosition(x, y);
+							controller.addObjUpperNode(n, thisUpperNode);
+							e = new CpsEdge(n, tempCps, model.getMaxCapacity());
+							controller.addEdgeUpperNode(e, (CpsUpperNode)cps);
+						}
+						
 					}
                 }
             }
@@ -1523,23 +1245,7 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
         return null;
     }
 
-//    /**
-//     * sets the Edge Capacity.
-//     *
-//     * @param cap capacity
-//     */
-//    public void setEdgeCapacity(float cap) {
-//        controller.setMaxCapacity(cap);
-//    }
-
-//    /**
-//     * Returns if Information should be shown.
-//     *
-//     * @return Array of boolean [0] = connection, [1] = objects
-//     */
-//    public boolean[] getShowedInformation() {
-//        return showedInformation;
-//    }
+
 
     /**
      * copies a set of given informations
@@ -1550,17 +1256,6 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
         showedInformation = informations;
     }
 
-//    /**
-//     * Set the Background Image;
-//     *
-//     * @param imagePath Image Path
-//     * @param mode      Image Mode
-//     * @param width     Image custom width
-//     * @param height    Image custom height
-//     */
-//    public void setBackgroundImage(String imagePath, int mode, int width, int height) {
-//        upperNode.setBackgroundImage(imagePath, mode, width, height);
-//    }
 
     /**
      * set tooltIp