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

#include <SceneCanvasVisualizer.h>

Inheritance diagram for inet::visualizer::SceneCanvasVisualizer:
inet::visualizer::SceneVisualizerBase inet::visualizer::VisualizerBase

Protected Member Functions

virtual void initialize (int stage) override
 
virtual void initializeAxis (double axisLength)
 
virtual void handleParameterChange (const char *name) override
 
virtual void refreshAxis (double axisLength)
 
virtual RotationMatrix parseViewAngle (const char *viewAngle, bool &invertY)
 
virtual cFigure::Point parse2D (const char *text, bool invertY=false)
 
virtual void displayDescription (const char *descriptionFigurePath)
 
- Protected Member Functions inherited from inet::visualizer::SceneVisualizerBase
virtual Box getSceneBounds ()
 
- Protected Member Functions inherited from inet::visualizer::VisualizerBase
virtual int numInitStages () const override
 
virtual Coord getPosition (const cModule *networkNode) const
 
virtual Coord getContactPosition (const cModule *networkNode, const Coord &fromPosition, const char *contactMode, double contactSpacing) const
 
virtual Quaternion getOrientation (const cModule *networkNode) const
 
virtual void mapChunks (const Ptr< const Chunk > &chunk, const std::function< void(const Ptr< const Chunk > &, int)> &thunk) const
 

Protected Attributes

double zIndex = NaN
 
CanvasProjectioncanvasProjection = nullptr
 
cGroupFigure * axisLayer = nullptr
 
- Protected Attributes inherited from inet::visualizer::SceneVisualizerBase
Coord sceneMin
 
Coord sceneMax
 
- Protected Attributes inherited from inet::visualizer::VisualizerBase
cModule * visualizationTargetModule = nullptr
 
cModule * visualizationSubjectModule = nullptr
 
const char * tags = nullptr
 

Member Function Documentation

◆ displayDescription()

void inet::visualizer::SceneCanvasVisualizer::displayDescription ( const char *  descriptionFigurePath)
protectedvirtual
214 {
215  cFigure *descriptionFigure = visualizationTargetModule->getCanvas()->getFigureByPath(descriptionFigurePath);
216  if (!descriptionFigure)
217  throw cRuntimeError("Figure \"%s\" not found", descriptionFigurePath);
218  auto descriptionTextFigure = check_and_cast<cAbstractTextFigure *>(descriptionFigure);
219 
220  auto config = getEnvir()->getConfigEx();
221  const char *activeConfig = config->getActiveConfigName();
222  std::string description = std::string(activeConfig) + ": " + config->getConfigDescription(activeConfig);
223  descriptionTextFigure->setText(description.c_str());
224 }

Referenced by initialize().

◆ handleParameterChange()

void inet::visualizer::SceneCanvasVisualizer::handleParameterChange ( const char *  name)
overrideprotectedvirtual
102 {
103  if (!hasGUI()) return;
104  if (name && !strcmp(name, "viewAngle")) {
105  bool invertY;
106  canvasProjection->setRotation(parseViewAngle(par("viewAngle"), invertY));
107  canvasProjection->setScale(parse2D(par("viewScale"), invertY));
108  // TODO update all visualizers
109  }
110  else if (name && !strcmp(name, "viewScale")) {
111  canvasProjection->setScale(parse2D(par("viewScale")));
112  // TODO update all visualizers
113  }
114  else if (name && !strcmp(name, "viewTranslation")) {
115  canvasProjection->setTranslation(parse2D(par("viewTranslation")));
116  // TODO update all visualizers
117  }
118  double axisLength = par("axisLength");
119  if (!std::isnan(axisLength))
120  refreshAxis(axisLength);
121 }

◆ initialize()

void inet::visualizer::SceneCanvasVisualizer::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented from inet::visualizer::SceneVisualizerBase.

19 {
21  if (!hasGUI()) return;
22  if (stage == INITSTAGE_LOCAL) {
23  zIndex = par("zIndex");
24  cCanvas *canvas = visualizationTargetModule->getCanvas();
25  bool invertY;
27  canvasProjection->setRotation(parseViewAngle(par("viewAngle"), invertY));
28  canvasProjection->setScale(parse2D(par("viewScale"), invertY));
29  canvasProjection->setTranslation(parse2D(par("viewTranslation")));
30  axisLayer = new cGroupFigure("axisLayer");
31  axisLayer->setZIndex(zIndex);
32  axisLayer->insertBelow(canvas->getSubmodulesLayer());
33  double axisLength = par("axisLength");
34  if (!std::isnan(axisLength))
35  initializeAxis(axisLength);
36  std::string descriptionFigurePath = par("descriptionFigure");
37  if (!descriptionFigurePath.empty())
38  displayDescription(descriptionFigurePath.c_str());
39  }
40 }

◆ initializeAxis()

void inet::visualizer::SceneCanvasVisualizer::initializeAxis ( double  axisLength)
protectedvirtual
43 {
44  cLineFigure *xAxis = new cLineFigure("xAxis");
45  cLineFigure *yAxis = new cLineFigure("yAxis");
46  cLineFigure *zAxis = new cLineFigure("zAxis");
47  auto axisTags = std::string("axis ") + tags;
48  xAxis->setTags(axisTags.c_str());
49  yAxis->setTags(axisTags.c_str());
50  zAxis->setTags(axisTags.c_str());
51  xAxis->setTooltip("Scene X axis");
52  yAxis->setTooltip("Scene Y axis");
53  zAxis->setTooltip("Scene Z axis");
54  xAxis->setLineWidth(1);
55  yAxis->setLineWidth(1);
56  zAxis->setLineWidth(1);
57  xAxis->setEndArrowhead(cFigure::ARROW_BARBED);
58  yAxis->setEndArrowhead(cFigure::ARROW_BARBED);
59  zAxis->setEndArrowhead(cFigure::ARROW_BARBED);
60  xAxis->setZoomLineWidth(false);
61  yAxis->setZoomLineWidth(false);
62  zAxis->setZoomLineWidth(false);
63  axisLayer->addFigure(xAxis);
64  axisLayer->addFigure(yAxis);
65  axisLayer->addFigure(zAxis);
66  cLabelFigure *xLabel = new cLabelFigure("xAxisLabel");
67  cLabelFigure *yLabel = new cLabelFigure("yAxisLabel");
68  cLabelFigure *zLabel = new cLabelFigure("zAxisLabel");
69  auto axisLabelTags = std::string("axis label ") + tags;
70  xLabel->setTags(axisLabelTags.c_str());
71  yLabel->setTags(axisLabelTags.c_str());
72  zLabel->setTags(axisLabelTags.c_str());
73  xLabel->setText("X");
74  yLabel->setText("Y");
75  zLabel->setText("Z");
76  axisLayer->addFigure(xLabel);
77  axisLayer->addFigure(yLabel);
78  axisLayer->addFigure(zLabel);
79  refreshAxis(axisLength);
80 }

Referenced by initialize().

◆ parse2D()

cFigure::Point inet::visualizer::SceneCanvasVisualizer::parse2D ( const char *  text,
bool  invertY = false 
)
protectedvirtual
206 {
207  double x, y;
208  if (sscanf(text, "%lf %lf", &x, &y) != 2)
209  throw cRuntimeError("The parameter must be a pair of doubles: %s", text);
210  return cFigure::Point(x, invertY ? -y : y);
211 }

Referenced by handleParameterChange(), and initialize().

◆ parseViewAngle()

RotationMatrix inet::visualizer::SceneCanvasVisualizer::parseViewAngle ( const char *  viewAngle,
bool &  invertY 
)
protectedvirtual
124 {
125  double a, b, c;
126  if (*viewAngle == 'x' || *viewAngle == 'y' || *viewAngle == 'z') {
127  double matrix[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
128  cStringTokenizer tokenizer(viewAngle);
129  while (tokenizer.hasMoreTokens()) {
130  const char *axisToken = tokenizer.nextToken();
131  if (axisToken == nullptr)
132  throw cRuntimeError("Missing token in viewAngle parameter value");
133  int i;
134  if (!strcmp(axisToken, "x"))
135  i = 0;
136  else if (!strcmp(axisToken, "y"))
137  i = 1;
138  else if (!strcmp(axisToken, "z"))
139  i = 2;
140  else
141  throw cRuntimeError("Invalid token in viewAngle parameter value: '%s'", axisToken);
142  const char *directionToken = tokenizer.nextToken();
143  if (directionToken == nullptr)
144  throw cRuntimeError("Missing token in viewAngle parameter value");
145  Coord v;
146  if (!strcmp(directionToken, "right"))
147  v = Coord::X_AXIS;
148  else if (!strcmp(directionToken, "left"))
149  v = -Coord::X_AXIS;
150  else if (!strcmp(directionToken, "up"))
151  v = Coord::Y_AXIS;
152  else if (!strcmp(directionToken, "down"))
153  v = -Coord::Y_AXIS;
154  else if (!strcmp(directionToken, "out"))
155  v = Coord::Z_AXIS;
156  else if (!strcmp(directionToken, "in"))
157  v = -Coord::Z_AXIS;
158  else
159  throw cRuntimeError("Invalid token in viewAngle parameter value: '%s'", directionToken);
160  if (matrix[0][i] != 0 || matrix[1][i] != 0 || matrix[2][i] != 0)
161  throw cRuntimeError("Invalid viewAngle parameter vale: '%s'", viewAngle);
162  matrix[0][i] = v.x;
163  matrix[1][i] = v.y;
164  matrix[2][i] = v.z;
165  }
166  // NOTE: the rotation matrix cannot contain flipping, so the following code flips the resulting Y axis if needed, because the OMNeT++ 2D canvas also flips Y axis while drawing
167  double determinant = matrix[0][0] * ((matrix[1][1] * matrix[2][2]) - (matrix[2][1] * matrix[1][2])) - matrix[0][1] * (matrix[1][0] * matrix[2][2] - matrix[2][0] * matrix[1][2]) + matrix[0][2] * (matrix[1][0] * matrix[2][1] - matrix[2][0] * matrix[1][1]);
168  if (determinant == -1) {
169  matrix[1][0] *= -1;
170  matrix[1][1] *= -1;
171  matrix[1][2] *= -1;
172  invertY = false;
173  }
174  else
175  invertY = true;
176  return RotationMatrix(matrix);
177  }
178  else if (!strncmp(viewAngle, "isometric", 9)) {
179  int v;
180  int l = strlen(viewAngle);
181  switch (l) {
182  case 9: v = 0; break;
183  case 10: v = viewAngle[9] - '0'; break;
184  case 11: v = (viewAngle[9] - '0') * 10 + viewAngle[10] - '0'; break;
185  default: throw cRuntimeError("Invalid isometric viewAngle parameter");
186  }
187  // 1st axis can point on the 2d plane in 6 directions
188  // 2nd axis can point on the 2d plane in 4 directions (the opposite direction is forbidden)
189  // 3rd axis can point on the 2d plane in 2 directions
190  // this results in 6 * 4 * 2 = 48 different configurations
191  deg alpha = deg(45 + v % 4 * 90);
192  deg beta = deg(v / 24 % 2 ? 35.27 : -35.27);
193  deg gamma = deg(30 + v / 4 % 6 * 60);
194  invertY = false;
195  return RotationMatrix(EulerAngles(alpha, beta, gamma));
196  }
197  else if (sscanf(viewAngle, "%lf %lf %lf", &a, &b, &c) == 3) {
198  invertY = false;
199  return RotationMatrix(EulerAngles(deg(a), deg(b), deg(c)));
200  }
201  else
202  throw cRuntimeError("Invalid viewAngle parameter value: '%s'", viewAngle);
203 }

Referenced by handleParameterChange(), and initialize().

◆ refreshAxis()

void inet::visualizer::SceneCanvasVisualizer::refreshAxis ( double  axisLength)
protectedvirtual
83 {
84  auto xAxis = check_and_cast<cLineFigure *>(axisLayer->getFigure(0));
85  auto yAxis = check_and_cast<cLineFigure *>(axisLayer->getFigure(1));
86  auto zAxis = check_and_cast<cLineFigure *>(axisLayer->getFigure(2));
87  auto xLabel = check_and_cast<cLabelFigure *>(axisLayer->getFigure(3));
88  auto yLabel = check_and_cast<cLabelFigure *>(axisLayer->getFigure(4));
89  auto zLabel = check_and_cast<cLabelFigure *>(axisLayer->getFigure(5));
93  xAxis->setEnd(canvasProjection->computeCanvasPoint(Coord(axisLength, 0, 0)));
94  yAxis->setEnd(canvasProjection->computeCanvasPoint(Coord(0, axisLength, 0)));
95  zAxis->setEnd(canvasProjection->computeCanvasPoint(Coord(0, 0, axisLength)));
96  xLabel->setPosition(canvasProjection->computeCanvasPoint(Coord(axisLength, 0, 0)));
97  yLabel->setPosition(canvasProjection->computeCanvasPoint(Coord(0, axisLength, 0)));
98  zLabel->setPosition(canvasProjection->computeCanvasPoint(Coord(0, 0, axisLength)));
99 }

Referenced by handleParameterChange(), and initializeAxis().

Member Data Documentation

◆ axisLayer

cGroupFigure* inet::visualizer::SceneCanvasVisualizer::axisLayer = nullptr
protected

◆ canvasProjection

CanvasProjection* inet::visualizer::SceneCanvasVisualizer::canvasProjection = nullptr
protected

◆ zIndex

double inet::visualizer::SceneCanvasVisualizer::zIndex = NaN
protected

Referenced by initialize().


The documentation for this class was generated from the following files:
inet::CanvasProjection::setTranslation
void setTranslation(const cFigure::Point &translation)
Definition: CanvasProjection.h:36
inet::units::constants::c
const value< double, compose< units::m, pow< units::s, -1 > > > c(299792458)
inet::visualizer::SceneCanvasVisualizer::displayDescription
virtual void displayDescription(const char *descriptionFigurePath)
Definition: SceneCanvasVisualizer.cc:213
inet::visualizer::SceneCanvasVisualizer::zIndex
double zIndex
Definition: SceneCanvasVisualizer.h:21
inet::units::units::deg
fscale< rad, rad2degScale > deg
Definition: Units.h:1158
inet::Coord::ZERO
static const Coord ZERO
Definition: Coord.h:27
inet::CanvasProjection::getCanvasProjection
static CanvasProjection * getCanvasProjection(const cCanvas *canvas)
Definition: CanvasProjection.cc:53
inet::visualizer::SceneCanvasVisualizer::refreshAxis
virtual void refreshAxis(double axisLength)
Definition: SceneCanvasVisualizer.cc:82
inet::visualizer::VisualizerBase::visualizationTargetModule
cModule * visualizationTargetModule
Definition: VisualizerBase.h:25
inet::visualizer::SceneCanvasVisualizer::canvasProjection
CanvasProjection * canvasProjection
Definition: SceneCanvasVisualizer.h:22
inet::visualizer::SceneCanvasVisualizer::parseViewAngle
virtual RotationMatrix parseViewAngle(const char *viewAngle, bool &invertY)
Definition: SceneCanvasVisualizer.cc:123
inet::visualizer::SceneCanvasVisualizer::axisLayer
cGroupFigure * axisLayer
Definition: SceneCanvasVisualizer.h:23
inet::Coord::Z_AXIS
static const Coord Z_AXIS
Definition: Coord.h:31
inet::CanvasProjection::computeCanvasPoint
cFigure::Point computeCanvasPoint(const Coord &point) const
Definition: CanvasProjection.cc:34
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::Coord::X_AXIS
static const Coord X_AXIS
Definition: Coord.h:29
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
inet::units::constants::alpha
const value< double, units::unit > alpha(7.2973525376e-3)
inet::CanvasProjection::setRotation
void setRotation(const RotationMatrix &rotation)
Definition: CanvasProjection.h:30
inet::visualizer::VisualizerBase::tags
const char * tags
Definition: VisualizerBase.h:27
inet::visualizer::SceneCanvasVisualizer::initializeAxis
virtual void initializeAxis(double axisLength)
Definition: SceneCanvasVisualizer.cc:42
inet::CanvasProjection::setScale
void setScale(const cFigure::Point &scale)
Definition: CanvasProjection.h:33
inet::visualizer::SceneCanvasVisualizer::parse2D
virtual cFigure::Point parse2D(const char *text, bool invertY=false)
Definition: SceneCanvasVisualizer.cc:205
inet::visualizer::SceneVisualizerBase::initialize
virtual void initialize(int stage) override
Definition: SceneVisualizerBase.cc:20
inet::Coord::Y_AXIS
static const Coord Y_AXIS
Definition: Coord.h:30