INET Framework for OMNeT++/OMNEST
inet::visualizer::NetworkNodeCanvasVisualization Class Reference

#include <NetworkNodeCanvasVisualization.h>

Inheritance diagram for inet::visualizer::NetworkNodeCanvasVisualization:
inet::visualizer::NetworkNodeVisualizerBase::NetworkNodeVisualization

Classes

class  Annotation
 

Public Member Functions

 NetworkNodeCanvasVisualization (cModule *networkNode, double annotationSpacing, double placementPenalty)
 
virtual void refreshDisplay () override
 
virtual int getNumAnnotations () const
 
virtual void addAnnotation (cFigure *figure, cFigure::Point size, Placement placement=PLACEMENT_ANY, double placementPriority=0)
 
virtual void removeAnnotation (cFigure *figure)
 
virtual void removeAnnotation (int index)
 
virtual void setAnnotationSize (cFigure *figure, cFigure::Point size)
 
virtual void setAnnotationVisible (cFigure *figure, bool visible)
 
- Public Member Functions inherited from inet::visualizer::NetworkNodeVisualizerBase::NetworkNodeVisualization
 NetworkNodeVisualization (const cModule *networkNode)
 
virtual ~NetworkNodeVisualization ()
 

Protected Member Functions

virtual void layout ()
 

Protected Attributes

double annotationSpacing = NaN
 
double placementPenalty = NaN
 
bool isLayoutInvalid = false
 
cFigure::Rectangle submoduleBounds
 
std::vector< Annotationannotations
 
cPanelFigure * annotationFigure = nullptr
 

Additional Inherited Members

- Public Attributes inherited from inet::visualizer::NetworkNodeVisualizerBase::NetworkNodeVisualization
const cModule * networkNode
 

Constructor & Destructor Documentation

◆ NetworkNodeCanvasVisualization()

inet::visualizer::NetworkNodeCanvasVisualization::NetworkNodeCanvasVisualization ( cModule *  networkNode,
double  annotationSpacing,
double  placementPenalty 
)
27  :
28  NetworkNodeVisualizerBase::NetworkNodeVisualization(networkNode),
29  cGroupFigure(networkNode->getFullName()),
32 {
33  annotationFigure = new cPanelFigure("annotation");
34  addFigure(annotationFigure);
35  submoduleBounds = getEnvir()->getSubmoduleBounds(networkNode);
36  submoduleBounds.height += 32; // KLUDGE extend bounds for submodule name label
37  submoduleBounds.x = -submoduleBounds.width / 2;
38  submoduleBounds.y = -submoduleBounds.height / 2;
39  if (networkNode->hasPar("canvasImage") && strlen(networkNode->par("canvasImage")) != 0) {
40  auto imageFigure = new cImageFigure("node");
41  imageFigure->setTooltip("This image represents a network node");
42  imageFigure->setTooltip("");
43  imageFigure->setAssociatedObject(networkNode);
44  imageFigure->setImageName(networkNode->par("canvasImage"));
45  if (networkNode->hasPar("canvasImageColor") && strlen(networkNode->par("canvasImageColor")) != 0)
46  imageFigure->setTintColor(cFigure::parseColor(networkNode->par("canvasImageColor")));
47  addFigure(imageFigure);
48  }
49 }

Member Function Documentation

◆ addAnnotation()

void inet::visualizer::NetworkNodeCanvasVisualization::addAnnotation ( cFigure *  figure,
cFigure::Point  size,
Placement  placement = PLACEMENT_ANY,
double  placementPriority = 0 
)
virtual
60 {
61  annotations.push_back(Annotation(figure, size, placementHint, placementPriority));
62  annotationFigure->addFigure(figure);
63  isLayoutInvalid = true;
64 }

Referenced by inet::visualizer::Ieee80211CanvasVisualizer::addIeee80211Visualization(), and inet::visualizer::RadioCanvasVisualizer::addRadioVisualization().

◆ getNumAnnotations()

virtual int inet::visualizer::NetworkNodeCanvasVisualization::getNumAnnotations ( ) const
inlinevirtual
51 { return annotations.size(); }

◆ layout()

void inet::visualizer::NetworkNodeCanvasVisualization::layout ( )
protectedvirtual
214 {
215  std::vector<cFigure::Rectangle> rcs; // rectangles of annotations already positioned
216  std::vector<cFigure::Point> pts; // candidate points where annotations may be positioned
217  cFigure::Rectangle extendendSubmoduleBounds = submoduleBounds;
218  extendendSubmoduleBounds.x -= annotationSpacing / 2;
219  extendendSubmoduleBounds.y -= annotationSpacing / 2;
220  extendendSubmoduleBounds.width += annotationSpacing;
221  extendendSubmoduleBounds.height += annotationSpacing;
222  rcs.push_back(extendendSubmoduleBounds);
223  pts.push_back(getTopLeft(extendendSubmoduleBounds));
224  pts.push_back(getTopCenter(extendendSubmoduleBounds));
225  pts.push_back(getTopRight(extendendSubmoduleBounds));
226  pts.push_back(getCenterLeft(extendendSubmoduleBounds));
227  pts.push_back(getCenterCenter(extendendSubmoduleBounds));
228  pts.push_back(getCenterRight(extendendSubmoduleBounds));
229  pts.push_back(getBottomLeft(extendendSubmoduleBounds));
230  pts.push_back(getBottomCenter(extendendSubmoduleBounds));
231  pts.push_back(getBottomRight(extendendSubmoduleBounds));
232 
234 
235  // delete all annotation positions
236  for (auto it = annotations.begin(); it != annotations.end(); it++) {
237  auto& annotation = *it;
238  annotation.bounds.x = NaN;
239  annotation.bounds.y = NaN;
240  }
241 
242  for (auto it = annotations.begin(); it != annotations.end(); it++) {
243  auto& annotation = *it;
244  if (!annotation.figure->isVisible())
245  continue;
246  cFigure::Point rs = cFigure::Point(annotation.bounds.width + annotationSpacing, annotation.bounds.height + annotationSpacing);
247 
248  // find the best minimizing the distance cost function
249  double bestDistance = std::numeric_limits<double>::infinity();
250  cFigure::Rectangle bestRc;
251 
252  // for all candidate points
253  for (auto pt : pts) {
254  // align annotation to candidate points with its various points
255  for (int k = 0; k < 9; k++) {
256  cFigure::Rectangle candidateRc;
257  switch (k) {
258  case 0:
259  // candidate point is top left
260  candidateRc = createRectangle(pt - cFigure::Point(0, 0), rs);
261  break;
262  case 1:
263  // candidate point is top center
264  candidateRc = createRectangle(pt - cFigure::Point(rs.x / 2, 0), rs);
265  break;
266  case 2:
267  // candidate point is top right
268  candidateRc = createRectangle(pt - cFigure::Point(rs.x, 0), rs);
269  break;
270  case 3:
271  // candidate point is center left
272  candidateRc = createRectangle(pt - cFigure::Point(0, rs.y / 2), rs);
273  break;
274  case 4:
275  // candidate point is center center
276  candidateRc = createRectangle(pt - cFigure::Point(rs.x / 2, rs.y / 2), rs);
277  break;
278  case 5:
279  // candidate point is center right
280  candidateRc = createRectangle(pt - cFigure::Point(rs.x, rs.y / 2), rs);
281  break;
282  case 6:
283  // candidate point is bottom left
284  candidateRc = createRectangle(pt - cFigure::Point(0, rs.y), rs);
285  break;
286  case 7:
287  // candidate point is bottom center
288  candidateRc = createRectangle(pt - cFigure::Point(rs.x / 2, rs.y), rs);
289  break;
290  case 8:
291  // candidate point is bottom right
292  candidateRc = createRectangle(pt - cFigure::Point(rs.x, rs.y), rs);
293  break;
294  default:
295  throw cRuntimeError("Invalid case");
296  }
297 
298  double distance = 0;
299  if (annotation.placementHint != PLACEMENT_CENTER_CENTER) {
300  distance += getClosestPlacementDistance(submoduleBounds, annotation.placementHint, getTopLeft(candidateRc)) * placementPenalty;
301  distance += getClosestPlacementDistance(submoduleBounds, annotation.placementHint, getTopRight(candidateRc)) * placementPenalty;
302  distance += getClosestPlacementDistance(submoduleBounds, annotation.placementHint, getBottomLeft(candidateRc)) * placementPenalty;
303  distance += getClosestPlacementDistance(submoduleBounds, annotation.placementHint, getBottomRight(candidateRc)) * placementPenalty;
304 
305  // find an already positioned annotation which would intersect the candidate rectangle
306  bool intersects = false;
307  for (const auto& rc : rcs) {
308  if (intersectsRectangle(candidateRc, rc)) {
309  intersects = true;
310  break;
311  }
312  }
313  if (intersects)
314  continue;
315  }
316 
317  // if better than the current best
318  distance += getCenterCenter(submoduleBounds).distanceTo(getCenterCenter(candidateRc));
319  if (distance < bestDistance) {
320  bestRc = candidateRc;
321  bestDistance = distance;
322  if (distance == 0)
323  goto found;
324  }
325  }
326  }
327 
328  found:
329  // store position and rectangle
330  annotation.bounds.x = bestRc.x + annotationSpacing / 2;
331  annotation.bounds.y = bestRc.y + annotationSpacing / 2;
332  annotation.figure->setTransform(cFigure::Transform().translate(annotation.bounds.x, annotation.bounds.y));
333 
334  // delete candidate points covered by best rc
335  for (auto j = pts.begin(); j != pts.end();) {
336  if (containsPoint(bestRc, *j))
337  j = pts.erase(j);
338  else
339  ++j;
340  }
341 
342  // push new candidates
343  pushUnlessContains(pts, rcs, getTopLeft(bestRc));
344  pushUnlessContains(pts, rcs, getTopCenter(bestRc));
345  pushUnlessContains(pts, rcs, getTopRight(bestRc));
346  pushUnlessContains(pts, rcs, getCenterLeft(bestRc));
347  pushUnlessContains(pts, rcs, getCenterCenter(bestRc));
348  pushUnlessContains(pts, rcs, getCenterRight(bestRc));
349  pushUnlessContains(pts, rcs, getBottomLeft(bestRc));
350  pushUnlessContains(pts, rcs, getBottomCenter(bestRc));
351  pushUnlessContains(pts, rcs, getBottomRight(bestRc));
352 
353  rcs.push_back(bestRc);
354  }
355 }

Referenced by refreshDisplay().

◆ refreshDisplay()

void inet::visualizer::NetworkNodeCanvasVisualization::refreshDisplay ( )
overridevirtual
52 {
53  if (isLayoutInvalid) {
54  layout();
55  isLayoutInvalid = false;
56  }
57 }

◆ removeAnnotation() [1/2]

void inet::visualizer::NetworkNodeCanvasVisualization::removeAnnotation ( cFigure *  figure)
virtual
67 {
68  for (auto it = annotations.begin(); it != annotations.end(); it++) {
69  auto& annotation = *it;
70  if (annotation.figure == figure) {
71  annotations.erase(it);
72  break;
73  }
74  }
75  annotationFigure->removeFigure(figure);
76  isLayoutInvalid = true;
77 }

Referenced by inet::visualizer::Ieee80211CanvasVisualizer::removeIeee80211Visualization(), inet::visualizer::RadioCanvasVisualizer::removeRadioVisualization(), and inet::visualizer::StatisticCanvasVisualizer::removeStatisticVisualization().

◆ removeAnnotation() [2/2]

void inet::visualizer::NetworkNodeCanvasVisualization::removeAnnotation ( int  index)
virtual
80 {
81  auto it = annotations.begin() + index;
82  auto figure = (*it).figure;
83  annotations.erase(it);
84  annotationFigure->removeFigure(figure);
85  isLayoutInvalid = true;
86 }

◆ setAnnotationSize()

void inet::visualizer::NetworkNodeCanvasVisualization::setAnnotationSize ( cFigure *  figure,
cFigure::Point  size 
)
virtual
89 {
90  for (auto it = annotations.begin(); it != annotations.end(); it++) {
91  auto& annotation = *it;
92  if (annotation.figure == figure) {
93  annotation.bounds.width = size.x;
94  annotation.bounds.height = size.y;
95  break;
96  }
97  }
98  isLayoutInvalid = true;
99 }

◆ setAnnotationVisible()

void inet::visualizer::NetworkNodeCanvasVisualization::setAnnotationVisible ( cFigure *  figure,
bool  visible 
)
virtual
102 {
103  figure->setVisible(visible);
104  isLayoutInvalid = true;
105 }

Member Data Documentation

◆ annotationFigure

cPanelFigure* inet::visualizer::NetworkNodeCanvasVisualization::annotationFigure = nullptr
protected

◆ annotations

std::vector<Annotation> inet::visualizer::NetworkNodeCanvasVisualization::annotations
protected

◆ annotationSpacing

double inet::visualizer::NetworkNodeCanvasVisualization::annotationSpacing = NaN
protected

Referenced by layout().

◆ isLayoutInvalid

bool inet::visualizer::NetworkNodeCanvasVisualization::isLayoutInvalid = false
protected

◆ placementPenalty

double inet::visualizer::NetworkNodeCanvasVisualization::placementPenalty = NaN
protected

Referenced by layout().

◆ submoduleBounds

cFigure::Rectangle inet::visualizer::NetworkNodeCanvasVisualization::submoduleBounds
protected

The documentation for this class was generated from the following files:
inet::visualizer::NetworkNodeCanvasVisualization::submoduleBounds
cFigure::Rectangle submoduleBounds
Definition: NetworkNodeCanvasVisualization.h:39
inet::sort
void sort(std::vector< T > &v)
Definition: stlutils.h:129
inet::visualizer::NetworkNodeCanvasVisualization::layout
virtual void layout()
Definition: NetworkNodeCanvasVisualization.cc:213
inet::visualizer::NetworkNodeCanvasVisualization::annotations
std::vector< Annotation > annotations
Definition: NetworkNodeCanvasVisualization.h:40
inet::visualizer::NetworkNodeVisualizerBase::NetworkNodeVisualization::networkNode
const cModule * networkNode
Definition: NetworkNodeVisualizerBase.h:23
inet::visualizer::PLACEMENT_CENTER_CENTER
@ PLACEMENT_CENTER_CENTER
Definition: Placement.h:23
inet::visualizer::NetworkNodeCanvasVisualization::isLayoutInvalid
bool isLayoutInvalid
Definition: NetworkNodeCanvasVisualization.h:38
NaN
#define NaN
Definition: INETMath.h:91
inet::visualizer::NetworkNodeCanvasVisualization::annotationFigure
cPanelFigure * annotationFigure
Definition: NetworkNodeCanvasVisualization.h:41
inet::physicallayer::k
const double k
Definition: Qam1024Modulation.cc:14
inet::visualizer::NetworkNodeCanvasVisualization::placementPenalty
double placementPenalty
Definition: NetworkNodeCanvasVisualization.h:36
inet::visualizer::NetworkNodeCanvasVisualization::Annotation::comparePlacementPriority
static bool comparePlacementPriority(const Annotation &a1, const Annotation &a2)
Definition: NetworkNodeCanvasVisualization.cc:209
inet::visualizer::NetworkNodeCanvasVisualization::annotationSpacing
double annotationSpacing
Definition: NetworkNodeCanvasVisualization.h:35