Browse Source

Adds simple link visualisation, and 128 distinct colors to Utility

Andreas T. Meyer-Berg 5 years ago
parent
commit
3784612201

+ 85 - 2
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/VisualisationPanel.java

@@ -5,6 +5,7 @@ import java.awt.Graphics;
 import java.awt.event.ComponentEvent;
 import java.awt.event.ComponentListener;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Observable;
 import java.util.Observer;
 
@@ -13,11 +14,13 @@ import javax.swing.JPanel;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.ConfigurationController;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.control.Controller;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Connection;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Link;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Model;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.Port;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.SmartDevice;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.core.util.Pair;
 import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.VisualisationInteractor;
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.util.Utility;
 
 /**
  * Panel which visualizes the SmartHome Network, it's Devices and Connections
@@ -28,6 +31,8 @@ import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.VisualisationInteractor;
 @SuppressWarnings("serial")
 public class VisualisationPanel extends JPanel implements Observer {
 
+	
+	
 	/**
 	 * Smart Home model which is visualized
 	 */
@@ -150,8 +155,61 @@ public class VisualisationPanel extends JPanel implements Observer {
 	 *            the Graphics object to visualize on
 	 */
 	public void paintDevices(Graphics g) {
+		/*
+		 * Visualization calculations for all devices
+		 */
+		/**
+		 * Number of Links in the Model
+		 */
+		int numberOfLinks = control.getLinks().size();
+		/**
+		 * Angle per Link in "linkSlice degrees"
+		 */
+		int linkSlice = (int) Math.round(360.0 / numberOfLinks);
+		/**
+		 * Map of links to Colors and position of the Color
+		 */
+		HashMap<Link, Pair<Integer,Color>> linkColors = null;
+		/**
+		 * Dimension of the link ring
+		 */
+		int linkDim = 6;
+		
+		if(config.isShowLinks()){
+			linkColors = new HashMap<Link, Pair<Integer,Color>>();
+			int i = 0;
+			for(Link l: control.getLinks()){
+				/**
+				 * Distinct Color as String containing the hex values (128 static ones should be enough)
+				 */
+				String colorHex = Utility.indexcolors[i%Utility.indexcolors.length];
+				/**
+				 * Color of the given Hex String (Base16)
+				 */
+				Color color =  new Color(
+						Integer.valueOf(colorHex.substring(1,3),16),
+			            Integer.valueOf(colorHex.substring(3,5),16),
+			            Integer.valueOf(colorHex.substring(5,7),16));
+				/**
+				 * Put position and Color into the HashMap
+				 */
+				linkColors.put(l, new Pair<Integer, Color>(i,color));
+				i++;
+			}
+		}
+		
+		/**
+		 * Paint Devices
+		 */
+		
 		//Values for dragging of multiple Devices
+		/**
+		 * Pixel offset of dragged devices on the x axis
+		 */
 		int x_offset = 0;
+		/**
+		 * Pixel offset of dragged devices on the y axis
+		 */
 		int y_offset = 0;
 		if(interactor.mode == VisualisationInteractor.SELECTED_DRAG && !interactor.selectedDevices.isEmpty()){
 			x_offset = interactor.dragged_x-interactor.dragged.getX();
@@ -159,19 +217,44 @@ public class VisualisationPanel extends JPanel implements Observer {
 		}
 		//Paint Devices
 		for (SmartDevice s: model.getDevices()) {
+			/**
+			 * x Position of the device
+			 */
 			int x = s.getX();
+			/**
+			 * y Position of the device
+			 */
 			int y = s.getY();
 			if(interactor.mode==VisualisationInteractor.SELECTED_DRAG && interactor.selectedDevices.contains(s)) {
 				// Update visualization of dragged object
 				x += x_offset;
 				y += y_offset;
 			}
+			//Paint Links of Device V0.0
+			if(config.isShowLinks()){
+				for(Link l:s.getLinks()){
+					/*
+					 * Split circle around the object into NumberOfLinks Sections, color the sections, connected with the device
+					 */
+					/**
+					 * Number and color of the current link
+					 */
+					Pair<Integer, Color> linkPos = linkColors.get(l);
+					if(l==null)continue;//Skip Links, which are not in the model
+					g.setColor(linkPos.getRight());
+					g.fillArc(x - config.getDeviceVisualizationRadius() - linkDim, y - config.getDeviceVisualizationRadius() - linkDim,
+							2 * config.getDeviceVisualizationRadius() - 1 + 2 * linkDim, 2 * config.getDeviceVisualizationRadius() - 1 + 2*linkDim,
+							linkPos.getLeft()*linkSlice, linkSlice);
+				}
+			
+			}
 			if(//(interactor.mode==VisualisationInteractor.SELECTED||interactor.mode==VisualisationInteractor.DRAG_SELECT ||interactor.mode == VisualisationInteractor.SELECTED_DRAG || interactor.mode == VisualisationInteractor.RIGHTCLICK_MENU)&&
 					(interactor.selectedDevices.contains(s)^interactor.selectedDevicesDrag.contains(s))){
 				//HighlightSelected Devices
 				g.setColor(new Color(135,206,235));
-			}else
+			}else{
 				g.setColor(Color.WHITE);
+			}
 			g.fillOval(x - config.getDeviceVisualizationRadius(), y - config.getDeviceVisualizationRadius(),
 					2 * config.getDeviceVisualizationRadius() - 1, 2 * config.getDeviceVisualizationRadius() - 1);
 			g.setColor(Color.BLACK);
@@ -185,7 +268,7 @@ public class VisualisationPanel extends JPanel implements Observer {
 			if(config.isShowSmartDeviceNames())
 				g.drawString(s.getName(),
 					x - g.getFontMetrics().stringWidth(s.getName()) / 2, y
-							+ config.getDeviceVisualizationRadius() + 11);
+							+ config.getDeviceVisualizationRadius() + 11 + (config.isShowLinks()?linkDim:0));
 		}
 	}
 	

+ 26 - 0
src/main/java/de/tu_darmstadt/tk/SmartHomeNetworkSim/view/util/Utility.java

@@ -7,6 +7,8 @@ import java.io.InputStream;
 
 import javax.imageio.ImageIO;
 
+import de.tu_darmstadt.tk.SmartHomeNetworkSim.view.VisualisationPanel;
+
 /**
  * Class for various helper methods.
  *
@@ -14,6 +16,30 @@ import javax.imageio.ImageIO;
  */
 public class Utility {
 
+	/**
+	 * Multiple distinct colors for various purposes, like {@link VisualisationPanel}'s link coloring.
+	 * This array is taken from {@link https://stackoverflow.com/questions/2328339/how-to-generate-n-different-colors-for-any-natural-number-n}
+	 */
+	public static final String[] indexcolors = new String[]{
+        "#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
+        "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
+        "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
+        "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
+        "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
+        "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
+        "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
+        "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",
+
+        "#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
+        "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
+        "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
+        "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
+        "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
+        "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
+        "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
+        "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58"
+	};
+	
 	/**
 	 * Loads resource image from the given path (resources/path). Returns default
 	 * image, if loading failed