Commit 162b0813 authored by Clemens Krug's avatar Clemens Krug
Browse files

Adjustments for the movement

+ Added a new transition strategy for social movement where destinations must be manually assigned or the nodes won't move.
+ Made it possible to specify a visualisation class for the ModularMovement.
+ Added a visualisation class which allows it to use icons for the nodes.
parent 6db7cf65
package de.tud.kom.p2psim.impl.topology.movement.modularosm;
/**
* Created by Clemens on 04.01.2017.
*/
public class ClassIconMapping {
private String classname;
private String iconpath;
public void setClassname(String icon)
{
classname = icon;
}
public void setIconPath(String path)
{
iconpath = path;
}
public String getClassname() {
return classname;
}
public String getIconpath() {
return iconpath;
}
}
package de.tud.kom.p2psim.impl.topology.movement.modularosm;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView;
import de.tudarmstadt.maki.simonstrator.api.*;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Point2D;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Clemens on 04.01.2017.
*/
public class ModularMovementIconVis extends ModularMovementModelViz implements EventHandler
{
private HashMap<Class, String> pathMap;
private HashMap<Class, Image> iconMap;
private boolean init = false;
public ModularMovementIconVis()
{
init();
pathMap = new HashMap<>();
iconMap = new HashMap<>();
// scheduling initalization!
de.tudarmstadt.maki.simonstrator.api.Event.scheduleImmediately(this, null, 0);
}
private void initialize()
{
assert !init : "ModularMovementIconVis: Was already initialized!";
VisualizationTopologyView.VisualizationInjector.getTopologyView().setShowNodes(false);
for(Map.Entry<Class, String> e : pathMap.entrySet())
{
try {
Image icon = ImageIO.read(new File(e.getValue())).getScaledInstance(-1, 15, Image.SCALE_FAST);
iconMap.put(e.getKey(), icon);
} catch (IOException ioe) {
Monitor.log(ModularMovementIconVis.class, Monitor.Level.WARN, "Could not load icon from path %s", e.getValue());
}
}
init = true;
}
@Override
public void paint(Graphics g) {
super.paintSuper(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (showAttractionPoints) {
super.drawAttractionPoints(g2);
}
if (showNodePositions) {
for (SimLocationActuator comp : movementModel
.getAllLocationActuators()) {
drawNodePosition(g2, comp);
}
}
}
@Override
protected void drawNodePosition(Graphics2D g2, SimLocationActuator comp)
{
boolean iconNotFound = false;
Host host = comp.getHost();
Point2D pt = comp.getRealPosition().asPoint();
g2.setColor(Color.GRAY);
for(Map.Entry<Class, Image> e : iconMap.entrySet())
{
try {
host.getComponent(e.getKey());
g2.drawImage(e.getValue(), (int) pt.getX(), (int) pt.getY(), null);
iconNotFound = false;
break;
} catch (ComponentNotAvailableException nae) {
iconNotFound = true;
}
}
if(iconNotFound) super.drawNodePosition(g2, comp);
}
@Override
public void eventOccurred(Object content, int type) {
if (type == 0) {
initialize();
}
}
public void setClassIcon(ClassIconMapping classIcon)
{
try {
pathMap.put(Class.forName(classIcon.getClassname()), classIcon.getIconpath());
} catch (ClassNotFoundException e) {
Monitor.log(ModularMovementIconVis.class, Monitor.Level.WARN, "Class %s not found!", classIcon.getClassname());
}
}
}
......@@ -44,6 +44,7 @@ import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractio
import de.tud.kom.p2psim.impl.topology.movement.modularosm.mapvisualization.IMapVisualization;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.transition.ITransitionStrategy;
import de.tud.kom.p2psim.impl.topology.views.VisualizationTopologyView.VisualizationInjector;
import de.tud.kom.p2psim.impl.topology.views.visualization.ui.VisualizationComponent;
import de.tud.kom.p2psim.impl.util.Either;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Event;
......@@ -83,7 +84,12 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.LocationAc
* destination point (AttractionPoint), so that not all hosts, which are
* assigned to one {@link AttractionPoint}, lies on the same point.<br>
*
*
* CHANGELOG
*
* - 04.01.2017 Clemens Krug: Added the possibility to configure the model
* visualisation via XML. If not specified, the visualisation will use the
* {@link ModularMovementModelViz}, just as before. Thus there shouldn't be any problems
* with older code.
*
* @author Martin Hellwig, Christoph Muenker
* @version 1.0, 07.07.2015
......@@ -104,6 +110,8 @@ public class ModularMovementModel implements MovementModel, EventHandler {
protected IMapVisualization mapVisualization;
private ModularMovementModelViz modelVisualisation;
private Set<SimLocationActuator> moveableHosts = new LinkedHashSet<SimLocationActuator>();
private Map<SimLocationActuator, PositionVector> offsetPosition = new LinkedHashMap<SimLocationActuator, PositionVector>();
......@@ -119,6 +127,9 @@ public class ModularMovementModel implements MovementModel, EventHandler {
.getWorldDimensions();
this.rand = Randoms.getRandom(ModularMovementModel.class);
// Setting this model as default to prevent older code from braking. See Changelog.
if(modelVisualisation == null) modelVisualisation = new ModularMovementModelViz(this);
// scheduling initalization!
Event.scheduleImmediately(this, null, EVENT_INIT);
}
......@@ -130,7 +141,7 @@ public class ModularMovementModel implements MovementModel, EventHandler {
public void initialize() {
if (!initialized) {
VisualizationInjector.injectComponent(new ModularMovementModelViz(this));
VisualizationInjector.injectComponent(modelVisualisation);
if (mapVisualization != null) {
VisualizationInjector.injectComponent(mapVisualization);
}
......@@ -297,6 +308,12 @@ public class ModularMovementModel implements MovementModel, EventHandler {
this.mapVisualization = mapVisualization;
}
public void setModelVisualisation(ModularMovementModelViz modelVis)
{
modelVisualisation = modelVis;
modelVisualisation.setMovementModel(this);
}
@Override
public void eventOccurred(Object content, int type) {
if (type == EVENT_INIT) {
......@@ -314,4 +331,6 @@ public class ModularMovementModel implements MovementModel, EventHandler {
public List<AttractionPoint> getAttractionPoints() {
return new Vector<AttractionPoint>(transition.getAllAttractionPoints());
}
}
......@@ -52,7 +52,7 @@ import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Attraction
public class ModularMovementModelViz extends JComponent
implements VisualizationComponent {
private ModularMovementModel movementModel;
protected ModularMovementModel movementModel;
protected boolean showAttractionPoints = true;
......@@ -66,16 +66,26 @@ public class ModularMovementModelViz extends JComponent
private static Color COLOR_ATTR_POINT = Color.decode("#4A7B9D");
public ModularMovementModelViz()
{
init();
}
protected void init()
{
setBounds(0, 0, VisualizationInjector.getWorldX(),
VisualizationInjector.getWorldY());
setOpaque(true);
setVisible(true);
menu = new JMenu("Mobility Model");
menu.add(createCheckboxAp());
menu.add(createCheckboxNodePositions());
}
public ModularMovementModelViz(ModularMovementModel model) {
setBounds(0, 0, VisualizationInjector.getWorldX(),
VisualizationInjector.getWorldY());
setOpaque(true);
setVisible(true);
init();
this.movementModel = model;
menu = new JMenu("Mobility Model");
menu.add(createCheckboxAp());
menu.add(createCheckboxNodePositions());
}
private JCheckBoxMenuItem createCheckboxAp() {
......@@ -112,36 +122,73 @@ public class ModularMovementModelViz extends JComponent
RenderingHints.VALUE_ANTIALIAS_ON);
if (showAttractionPoints) {
for (AttractionPoint aPoint : movementModel.getAttractionPoints()) {
Point point = ((PositionVector) aPoint).asPoint();
// draw border
g2.setColor(Color.BLACK);
g2.setFont(VisualizationTopologyView.FONT_MEDIUM);
g2.drawString(aPoint.getName(),
VisualizationInjector.scaleValue(point.x) - ATTR_PAD,
VisualizationInjector.scaleValue(point.y) - ATTR_PAD);
g2.setColor(COLOR_ATTR_POINT);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
g2.fillOval(
VisualizationInjector.scaleValue(point.x) - ATTR_PAD,
VisualizationInjector.scaleValue(point.y) - ATTR_PAD,
ATTR_PAD * 2 + 1, ATTR_PAD * 2 + 1);
}
drawAttractionPoints(g2);
}
if (showNodePositions) {
for (SimLocationActuator comp : movementModel
.getAllLocationActuators()) {
Point2D pt = comp.getRealPosition().asPoint();
g2.setColor(Color.GRAY);
g2.fillOval((int) pt.getX() - NODE_PAD,
(int) pt.getY() - NODE_PAD, NODE_PAD * 2 + 1,
NODE_PAD * 2 + 1);
}
for (SimLocationActuator comp : movementModel
.getAllLocationActuators()) {
drawNodePosition(g2, comp);
}
}
}
/**
* Provides access super.paintComponent() for extending classes.
* @param g the Graphics object for painting.
*/
protected void paintSuper(Graphics g)
{
super.paintComponent(g);
}
/**
* Draws the attraction points. This method has been extracted from paint()
* to make it possible for extending class to override only this bit while leaving everything
* else untouched.
* @param g2 the Graphics2D object for painting.
*/
protected void drawAttractionPoints(Graphics2D g2)
{
for (AttractionPoint aPoint : movementModel.getAttractionPoints()) {
Point point = ((PositionVector) aPoint).asPoint();
// draw border
g2.setColor(Color.BLACK);
g2.setFont(VisualizationTopologyView.FONT_MEDIUM);
g2.drawString(aPoint.getName(),
VisualizationInjector.scaleValue(point.x) - ATTR_PAD,
VisualizationInjector.scaleValue(point.y) - ATTR_PAD);
g2.setColor(COLOR_ATTR_POINT);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
g2.fillOval(
VisualizationInjector.scaleValue(point.x) - ATTR_PAD,
VisualizationInjector.scaleValue(point.y) - ATTR_PAD,
ATTR_PAD * 2 + 1, ATTR_PAD * 2 + 1);
}
}
/**
* Draws the position of the node. This method has been extracted from paint()
* to make it possible for extending class to override only this bit while leaving everything
* else untouched. Instead of painting all of the nodes, only a specific one gets painted. This allows
* extending class to fall back to this implementation if one specific node could not be drawn for whatever reason.
* @param g2 the Graphics2D object for painting.
*/
protected void drawNodePosition(Graphics2D g2, SimLocationActuator comp)
{
Point2D pt = comp.getRealPosition().asPoint();
g2.setColor(Color.GRAY);
g2.fillOval((int) pt.getX() - NODE_PAD,
(int) pt.getY() - NODE_PAD, NODE_PAD * 2 + 1,
NODE_PAD * 2 + 1);
}
protected void setMovementModel(ModularMovementModel model)
{
movementModel = model;
}
@Override
public String getDisplayName() {
return "Mobility Model";
......
package de.tud.kom.p2psim.impl.topology.movement.modularosm.transition;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import java.util.*;
/**
* Created by Clemens on 04.01.2017.
*/
public class ManualAssignmentStrategy implements ITransitionStrategy
{
private LinkedHashSet<AttractionPoint> aPoints = new LinkedHashSet<>();
private Map<SimLocationActuator, AttractionPoint> assignments = new HashMap<>();
@Override
public Map<SimLocationActuator, AttractionPoint> getAssignments() {
return assignments;
}
@Override
public void setAttractionPoints(Collection<AttractionPoint> attractionPoints) {
aPoints.addAll(attractionPoints);
}
@Override
public Set<AttractionPoint> getAllAttractionPoints() {
return aPoints;
}
@Override
public void addComponent(SimLocationActuator ms) {
}
@Override
public void reachedAttractionPoint(SimLocationActuator ms) {
}
@Override
public void updateTargetAttractionPoint(SimLocationActuator comp, AttractionPoint attractionPoint) {
assignments.put(comp, attractionPoint);
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment