SUMO - Simulation of Urban MObility
GNERerouter.cpp
Go to the documentation of this file.
1 /****************************************************************************/
7 //
8 /****************************************************************************/
9 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
10 // Copyright (C) 2001-2017 DLR (http://www.dlr.de/) and contributors
11 /****************************************************************************/
12 //
13 // This file is part of SUMO.
14 // SUMO is free software: you can redistribute it and/or modify
15 // it under the terms of the GNU General Public License as published by
16 // the Free Software Foundation, either version 3 of the License, or
17 // (at your option) any later version.
18 //
19 /****************************************************************************/
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #ifdef _MSC_VER
25 #include <windows_config.h>
26 #else
27 #include <config.h>
28 #endif
29 
30 #include <string>
31 #include <iostream>
32 #include <utility>
38 #include <utils/common/ToString.h>
39 #include <utils/geom/GeomHelper.h>
46 #include <utils/gui/div/GLHelper.h>
50 
51 #include "GNEViewNet.h"
52 #include "GNERerouter.h"
53 #include "GNERerouterDialog.h"
54 #include "GNERerouterInterval.h"
55 #include "GNELane.h"
56 #include "GNEEdge.h"
57 #include "GNEViewNet.h"
58 #include "GNEUndoList.h"
59 #include "GNENet.h"
60 #include "GNEChange_Attribute.h"
61 
62 
63 // ===========================================================================
64 // member method definitions
65 // ===========================================================================
66 
67 GNERerouter::GNERerouter(const std::string& id, GNEViewNet* viewNet, Position pos, std::vector<GNEEdge*> edges, const std::string& filename, double probability, bool off) :
69  myPosition(pos),
70  myEdges(edges),
71  myFilename(filename),
72  myProbability(probability),
73  myOff(off) {
74  // Update geometry;
76 }
77 
78 
80 }
81 
82 
83 void
85  // Clear shape
86  myShape.clear();
87 
88  // Set block icon position
90 
91  // Set block icon offset
92  myBlockIconOffset = Position(-0.5, -0.5);
93 
94  // Set block icon rotation, and using their rotation for draw logo
96 
97  // Set position
98  myShape.push_back(myPosition);
99 
100  /*
101  // Add shape of childs (To avoid graphics errors)
102  for (childEdges::iterator i = myChildEdges.begin(); i != myChildEdges.end(); i++) {
103  myShape.append(i->edge->getLanes().at(0)->getShape());
104  }
105 
106  // Update geometry of additional parent
107  updateConnections();
108  */
109  // Refresh element (neccesary to avoid grabbing problems)
111 }
112 
113 
114 Position
116  return myPosition;
117 }
118 
119 
120 void
122  // Open rerouter dialog
123  GNERerouterDialog(this);
124 }
125 
126 
127 void
128 GNERerouter::moveGeometry(const Position& newPosition) {
129  // change Position
130  myPosition = newPosition;
131  updateGeometry();
132 }
133 
134 
135 void
137  undoList->p_begin("position of " + toString(getTag()));
138  undoList->p_add(new GNEChange_Attribute(this, SUMO_ATTR_POSITION, toString(myPosition), true, toString(oldPos)));
139  undoList->p_end();
140  // Refresh element
142 }
143 
144 
145 void
146 GNERerouter::writeAdditional(OutputDevice& device, bool /*volatileOptionsEnabled*/) const {
147  // Write parameters
148  device.openTag(getTag());
149  device.writeAttr(SUMO_ATTR_ID, getID());
150  // obtain ID's of Edges
151  std::vector<std::string> edgeIDs;
152  for (std::vector<GNEEdge*>::const_iterator i = myEdges.begin(); i != myEdges.end(); i++) {
153  edgeIDs.push_back((*i)->getID());
154  }
155  device.writeAttr(SUMO_ATTR_EDGES, joinToString(edgeIDs, " ").c_str());
157  if (!myFilename.empty()) {
159  }
160  device.writeAttr(SUMO_ATTR_OFF, myOff);
161  device.writeAttr(SUMO_ATTR_X, myPosition.x());
162  device.writeAttr(SUMO_ATTR_Y, myPosition.y());
163  if (myBlocked) {
165  }
166  // write intervals
167  for (std::vector<GNERerouterInterval>::const_iterator i = myRerouterIntervals.begin(); i != myRerouterIntervals.end(); i++) {
168  device.openTag(i->getTag());
169  device.writeAttr(SUMO_ATTR_BEGIN, i->getBegin());
170  device.writeAttr(SUMO_ATTR_END, i->getEnd());
171 
172  // write closing lane reroutes
173  for (std::vector<GNEClosingLaneReroute>::const_iterator j = i->getClosingLaneReroutes().begin(); j != i->getClosingLaneReroutes().end(); j++) {
174  device.openTag(j->getTag());
175  device.writeAttr(SUMO_ATTR_LANE, j->getClosedLane()->getID());
176  device.writeAttr(SUMO_ATTR_ALLOW, getVehicleClassNames(j->getAllowedVehicles()));
177  device.writeAttr(SUMO_ATTR_DISALLOW, getVehicleClassNames(j->getDisallowedVehicles()));
178  device.closeTag();
179  }
180 
181  // write closing reroutes
182  for (std::vector<GNEClosingReroute>::const_iterator j = i->getClosingReroutes().begin(); j != i->getClosingReroutes().end(); j++) {
183  device.openTag(j->getTag());
184  device.writeAttr(SUMO_ATTR_EDGE, j->getClosedEdge()->getID());
185  device.writeAttr(SUMO_ATTR_ALLOW, getVehicleClassNames(j->getAllowedVehicles()));
186  device.writeAttr(SUMO_ATTR_DISALLOW, getVehicleClassNames(j->getDisallowedVehicles()));
187  device.closeTag();
188  }
189 
190  // write dest prob reroutes
191  for (std::vector<GNEDestProbReroute>::const_iterator j = i->getDestProbReroutes().begin(); j != i->getDestProbReroutes().end(); j++) {
192  device.openTag(j->getTag());
193  device.writeAttr(SUMO_ATTR_EDGE, j->getNewDestination()->getID());
194  device.writeAttr(SUMO_ATTR_PROB, j->getProbability());
195  device.closeTag();
196  }
197 
198  // write route prob reroutes
199  for (std::vector<GNERouteProbReroute>::const_iterator j = i->getRouteProbReroutes().begin(); j != i->getRouteProbReroutes().end(); j++) {
200  device.openTag(j->getTag());
201  device.writeAttr(SUMO_ATTR_ROUTE, j->getNewRouteId());
202  device.writeAttr(SUMO_ATTR_PROB, j->getProbability());
203  device.closeTag();
204  }
205 
206  // Close tag
207  device.closeTag();
208  }
209 
210  // Close tag
211  device.closeTag();
212 }
213 
214 
215 void
217  // Check that edge is valid and doesn't exist previously
218  if (edge == NULL) {
219  throw InvalidArgument("Trying to add an empty " + toString(SUMO_TAG_EDGE) + " child in " + toString(getTag()) + " with ID='" + getID() + "'");
220  } else if (std::find(myEdges.begin(), myEdges.end(), edge) != myEdges.end()) {
221  throw InvalidArgument("Trying to add a duplicate " + toString(SUMO_TAG_EDGE) + " child in " + toString(getTag()) + " with ID='" + getID() + "'");
222  } else {
223  myEdges.push_back(edge);
224  }
225 }
226 
227 
228 void
230  // Check that edge is valid and exist previously
231  if (edge == NULL) {
232  throw InvalidArgument("Trying to remove an empty " + toString(SUMO_TAG_EDGE) + " child in " + toString(getTag()) + " with ID='" + getID() + "'");
233  } else if (std::find(myEdges.begin(), myEdges.end(), edge) == myEdges.end()) {
234  throw InvalidArgument("Trying to remove a non previously inserted " + toString(SUMO_TAG_EDGE) + " child in " + toString(getTag()) + " with ID='" + getID() + "'");
235  } else {
236  myEdges.erase(std::find(myEdges.begin(), myEdges.end(), edge));
237  }
238 }
239 
240 
241 const std::vector<GNEEdge*>&
243  return myEdges;
244 }
245 
246 
247 bool
249  // obtain a copy of current rerouter Intervals to check overlapping
250  std::vector<GNERerouterInterval> copyOfMyRerouterIntervals;
251  copyOfMyRerouterIntervals.push_back(rerouterInterval);
252  if (checkOverlapping(copyOfMyRerouterIntervals)) {
253  myRerouterIntervals = copyOfMyRerouterIntervals;
254  return true;
255  } else {
256  return false;
257  }
258 }
259 
260 
261 const std::vector<GNERerouterInterval>&
263  return myRerouterIntervals;
264 }
265 
266 
267 bool
268 GNERerouter::setRerouterIntervals(const std::vector<GNERerouterInterval>& rerouterIntervals) {
269  if (checkOverlapping(rerouterIntervals)) {
270  myRerouterIntervals = rerouterIntervals;
271  return true;
272  } else {
273  return false;
274  }
275 }
276 
277 
278 const std::string&
280  return myViewNet->getNet()->getMicrosimID();
281 }
282 
283 
284 void
286  // Start drawing adding an gl identificator
287  glPushName(getGlID());
288 
289  // Add a draw matrix for drawing logo
290  glPushMatrix();
291  glTranslated(myShape[0].x(), myShape[0].y(), getType());
292  glColor3d(1, 1, 1);
293  glRotated(180, 0, 0, 1);
294 
295  // Draw icon depending of rerouter is or isn't selected
296  if (isAdditionalSelected()) {
298  } else {
300  }
301 
302  // Pop draw matrix
303  glPopMatrix();
304 
305  // Show Lock icon depending of the Edit mode
306  drawLockIcon(0.4);
307 
308  /*
309  // Draw symbols in every lane
310  const double exaggeration = s.addSize.getExaggeration(s);
311 
312  if (s.scale * exaggeration >= 3) {
313  // draw rerouter symbol over all lanes
314 
315  for (childEdges::const_iterator i = myChildEdges.begin(); i != myChildEdges.end(); i++) {
316  for (int lanePosIt = 0; lanePosIt < (int)i->positionsOverLanes.size(); lanePosIt++) {
317  glPushMatrix();
318  glTranslated(i->positionsOverLanes.at(lanePosIt).x(), i->positionsOverLanes.at(lanePosIt).y(), 0);
319  glRotated(i->rotationsOverLanes.at(lanePosIt), 0, 0, 1);
320  glTranslated(0, 0, getType());
321  glScaled(exaggeration, exaggeration, 1);
322  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
323 
324  glBegin(GL_TRIANGLES);
325  glColor3d(1, .8f, 0);
326  // base
327  glVertex2d(0 - 1.4, 0);
328  glVertex2d(0 - 1.4, 6);
329  glVertex2d(0 + 1.4, 6);
330  glVertex2d(0 + 1.4, 0);
331  glVertex2d(0 - 1.4, 0);
332  glVertex2d(0 + 1.4, 6);
333  glEnd();
334 
335  glTranslated(0, 0, .1);
336  glColor3d(0, 0, 0);
337  pfSetPosition(0, 0);
338  pfSetScale(3.f);
339  double w = pfdkGetStringWidth("U");
340  glRotated(180, 0, 1, 0);
341  glTranslated(-w / 2., 2, 0);
342  pfDrawString("U");
343 
344  glTranslated(w / 2., -2, 0);
345  std::string str = toString((int)(myProbability * 100)) + "%";
346  pfSetPosition(0, 0);
347  pfSetScale(.7f);
348  w = pfdkGetStringWidth(str.c_str());
349  glTranslated(-w / 2., 4, 0);
350  pfDrawString(str.c_str());
351  glPopMatrix();
352  }
353  }
354  glPopName();
355  }
356 
357  // Draw connections
358  drawConnections();
359  */
360  // Pop name
361  glPopName();
362 
363  // Draw name
364  drawName(getCenteringBoundary().getCenter(), s.scale, s.addName);
365 }
366 
367 
368 std::string
370  switch (key) {
371  case SUMO_ATTR_ID:
372  return getAdditionalID();
373  case SUMO_ATTR_EDGES: {
374  // obtain ID's of Edges
375  std::vector<std::string> edgeIDs;
376  for (std::vector<GNEEdge*>::const_iterator i = myEdges.begin(); i != myEdges.end(); i++) {
377  edgeIDs.push_back((*i)->getID());
378  }
379  return joinToString(edgeIDs, " ");
380  }
381  case SUMO_ATTR_POSITION:
382  return toString(myPosition);
383  case SUMO_ATTR_FILE:
384  return myFilename;
385  case SUMO_ATTR_PROB:
386  return toString(myProbability);
387  case SUMO_ATTR_OFF:
388  return toString(myOff);
390  return toString(myBlocked);
391  default:
392  throw InvalidArgument(toString(getTag()) + " doesn't have an attribute of type '" + toString(key) + "'");
393  }
394 }
395 
396 
397 void
398 GNERerouter::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {
399  if (value == getAttribute(key)) {
400  return; //avoid needless changes, later logic relies on the fact that attributes have changed
401  }
402  switch (key) {
403  case SUMO_ATTR_ID:
404  case SUMO_ATTR_EDGES:
405  case SUMO_ATTR_POSITION:
406  case SUMO_ATTR_FILE:
407  case SUMO_ATTR_PROB:
408  case SUMO_ATTR_OFF:
410  undoList->p_add(new GNEChange_Attribute(this, key, value));
411  updateGeometry();
412  break;
413  default:
414  throw InvalidArgument(toString(getTag()) + " doesn't have an attribute of type '" + toString(key) + "'");
415  }
416 }
417 
418 
419 bool
420 GNERerouter::isValid(SumoXMLAttr key, const std::string& value) {
421  switch (key) {
422  case SUMO_ATTR_ID:
423  if (isValidID(value) && (myViewNet->getNet()->getAdditional(getTag(), value) == NULL)) {
424  return true;
425  } else {
426  return false;
427  }
428  case SUMO_ATTR_EDGES: {
429  std::vector<std::string> edgeIds = GNEAttributeCarrier::parse<std::vector<std::string> > (value);
430  // Empty Edges aren't valid
431  if (edgeIds.empty()) {
432  return false;
433  }
434  // Iterate over parsed edges and check that exists
435  for (int i = 0; i < (int)edgeIds.size(); i++) {
436  if (myViewNet->getNet()->retrieveEdge(edgeIds.at(i), false) == NULL) {
437  return false;
438  }
439  }
440  // all edges exist, then is valid
441  return true;
442  }
443  case SUMO_ATTR_POSITION:
444  bool ok;
445  return GeomConvHelper::parseShapeReporting(value, "user-supplied position", 0, ok, false).size() == 1;
446  case SUMO_ATTR_FILE:
447  return isValidFilename(value);
448  case SUMO_ATTR_PROB:
449  return canParse<double>(value) && (parse<double>(value) >= 0) && (parse<double>(value) <= 1);
450  case SUMO_ATTR_OFF:
451  return canParse<bool>(value);
453  return canParse<bool>(value);
454  default:
455  throw InvalidArgument(toString(getTag()) + " doesn't have an attribute of type '" + toString(key) + "'");
456  }
457 }
458 
459 
460 void
461 GNERerouter::setAttribute(SumoXMLAttr key, const std::string& value) {
462  switch (key) {
463  case SUMO_ATTR_ID:
464  setAdditionalID(value);
465  break;
466  case SUMO_ATTR_EDGES: {
467  // Declare auxiliar variables
468  std::vector<std::string> edgeIds = GNEAttributeCarrier::parse<std::vector<std::string> > (value);
469  GNEEdge* edge;
470  // first remove references of current rerouter in all edge childs
471  for (std::vector<GNEEdge*>::iterator i = myEdges.begin(); i != myEdges.end(); i++) {
472  (*i)->removeGNERerouter(this);
473  }
474  // clear previous edges
475  myEdges.clear();
476  // Iterate over parsed edges and obtain pointer to edges
477  for (int i = 0; i < (int)edgeIds.size(); i++) {
478  edge = myViewNet->getNet()->retrieveEdge(edgeIds.at(i), false);
479  if (edge) {
480  myEdges.push_back(edge);
481  edge->addGNERerouter(this);
482  } else {
483  throw InvalidArgument("Trying to set an non-valid edge in " + getID());
484  }
485  }
486  break;
487  }
488  case SUMO_ATTR_POSITION:
489  bool ok;
490  myPosition = GeomConvHelper::parseShapeReporting(value, "user-supplied position", 0, ok, false)[0];
491  updateGeometry();
492  getViewNet()->update();
493  break;
494  case SUMO_ATTR_FILE:
495  myFilename = value;
496  break;
497  case SUMO_ATTR_PROB:
498  myProbability = parse<double>(value);
499  break;
500  case SUMO_ATTR_OFF:
501  myOff = parse<bool>(value);
502  break;
504  myBlocked = parse<bool>(value);
505  getViewNet()->update();
506  break;
507  default:
508  throw InvalidArgument(toString(getTag()) + " doesn't have an attribute of type '" + toString(key) + "'");
509  }
510 }
511 
512 
513 bool
514 GNERerouter::checkOverlapping(std::vector<GNERerouterInterval> rerouterIntervals) {
515  // only can be overlapping if there are more than two elements
516  if (rerouterIntervals.size() <= 1) {
517  return true;
518  }
519  // first short vector
520  std::sort(rerouterIntervals.begin(), rerouterIntervals.end());
521 
522  // first check that all Begins are differents
523  for (std::vector<GNERerouterInterval>::const_iterator i = (rerouterIntervals.begin() + 1); i != rerouterIntervals.end(); i++) {
524  if ((i - 1)->getBegin() == i->getBegin()) {
525  return false;
526  }
527  }
528  // now check that end of every interval isn't overlapped with the begin of the next interval
529  for (std::vector<GNERerouterInterval>::const_iterator i = rerouterIntervals.begin(); i != (rerouterIntervals.end() - 1); i++) {
530  if (i->getEnd() > (i + 1)->getBegin()) {
531  return false;
532  }
533  }
534 
535  // all ok, then return true
536  return true;
537 }
538 /****************************************************************************/
static void drawTexturedBox(int which, double size)
Draws a named texture as a box with the given size.
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
std::string getVehicleClassNames(SVCPermissions permissions, bool expand)
Returns the ids of the given classes, divided using a &#39; &#39;.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:261
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0) const
draw name of item
void setBlockIconRotation()
GNEEdge * retrieveEdge(const std::string &id, bool failHard=true)
get edge by id
Definition: GNENet.cpp:899
double scale
information about a lane&#39;s width (temporary, used for a single view)
~GNERerouter()
Destructor.
Definition: GNERerouter.cpp:79
GUIVisualizationTextSettings addName
static GUIGlID getTexture(GUITexture which)
returns a texture previously defined in the enum GUITexture
double x() const
Returns the x-position.
Definition: Position.h:63
Stores the information about how to visualize structures.
bool isAdditionalSelected() const
Position myPosition
position of rerouter in view
Definition: GNERerouter.h:158
weights: time range begin
const std::string & getParentName() const
Returns the name of the parent object (if any)
void removeEdgeChild(GNEEdge *edge)
remove edge child
bool myOff
attribute to enable or disable inactive initially
Definition: GNERerouter.h:170
void p_begin(const std::string &description)
Begin undo command sub-group. This begins a new group of commands that are treated as a single comman...
Definition: GNEUndoList.cpp:85
std::string getAttribute(SumoXMLAttr key) const
This functions has to be implemented in allGNEAttributeCarrier.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
double myProbability
probability of rerouter
Definition: GNERerouter.h:167
static bool isValidFilename(const std::string &value)
true if value is a valid file value
GUIGlID getGlID() const
Returns the numerical id of the object.
void moveGeometry(const Position &newPosition)
change the position of the element geometry without saving in undoList
void commitGeometryMoving(const Position &oldPos, GNEUndoList *undoList)
commit geometry changes in the attributes of an element after use of moveGeometry(...)
GNEViewNet * myViewNet
The GNEViewNet this additional element belongs.
virtual const std::string & getMicrosimID() const
Returns the id of the object as known to microsim.
void p_add(GNEChange_Attribute *cmd)
special method, avoid empty changes, always execute
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
method for setting the attribute and letting the object perform additional changes ...
static bool isValidID(const std::string &value)
true if value is a valid sumo ID
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
Dialog for edit rerouters.
bool isValid(SumoXMLAttr key, const std::string &value)
method for checking if the key and their conrrespond attribute are valids
void writeAdditional(OutputDevice &device, bool volatileOptionsEnabled) const
writte additional element into a xml file
GNEViewNet * getViewNet() const
Returns a pointer to GNEViewNet in which additional element is located.
the edges of a route
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:56
const std::string & getAdditionalID() const
returns the ID of additional
void refreshAdditional(GNEAdditional *additional)
refreshes boundary information of an additional after a geometry update
Definition: GNENet.cpp:998
PositionVector myShape
The shape of the additional element.
bool addRerouterInterval(const GNERerouterInterval &rerouterInterval)
add rerouter interval
std::string myFilename
filename of rerouter
Definition: GNERerouter.h:164
void p_end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise, the sub-group will be added as a new command into parent group. A matching begin() must have been called previously.
Definition: GNEUndoList.cpp:92
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:46
bool checkOverlapping(std::vector< GNERerouterInterval > rerouterIntervals)
check overlapping of a vector of rerouter intervals
const std::vector< GNERerouterInterval > & getRerouterIntervals() const
get rerouter intervals
bool setRerouterIntervals(const std::vector< GNERerouterInterval > &rerouterIntervals)
set rerouter intervals
void removeGNERerouter(GNERerouter *rerouter)
remove a reference to a rerouter that has this edge as parameter
Definition: GNEEdge.cpp:1228
friend class GNEChange_Attribute
declare friend class
double y() const
Returns the y-position.
Definition: Position.h:68
block movement of a graphic element
void setAdditionalID(const std::string &id)
set the ID of additional
const std::string getID() const
function to support debugging
void drawLockIcon(double size=0.5) const
draw lock icon
const std::vector< GNEEdge * > & getEdgeChilds() const
get edge chidls
Position myBlockIconOffset
The offSet of the block icon.
begin/end of the description of an edge
GNERerouter(const std::string &id, GNEViewNet *viewNet, Position pos, std::vector< GNEEdge * > edges, const std::string &filename, double probability, bool off)
Constructor.
Definition: GNERerouter.cpp:67
A road/street connecting two junctions (netedit-version)
Definition: GNEEdge.h:58
GNEAdditional * getAdditional(SumoXMLTag type, const std::string &id) const
Returns the named additional.
Definition: GNENet.cpp:1680
std::vector< GNEEdge * > myEdges
edges of Rerouter
Definition: GNERerouter.h:161
bool myBlocked
boolean to check if additional element is blocked (i.e. cannot be moved with mouse) ...
An Element which don&#39;t belongs to GNENet but has influency in the simulation.
Definition: GNEAdditional.h:62
weights: time range end
void addEdgeChild(GNEEdge *edge)
add edge child
GNENet * getNet() const
get the net object
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
void updateGeometry()
update pre-computed geometry information
Definition: GNERerouter.cpp:84
Position getPositionInView() const
Returns position of additional in view.
SumoXMLTag getTag() const
get XML Tag assigned to this object
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:71
bool closeTag()
Closes the most recently opened tag.
static PositionVector parseShapeReporting(const std::string &shpdef, const std::string &objecttype, const char *objectid, bool &ok, bool allowEmpty, bool report=true)
Builds a PositionVector from a string representation, reporting occured errors.
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition: ToString.h:237
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
std::vector< GNERerouterInterval > myRerouterIntervals
set with the GNERerouterInterval
Definition: GNERerouter.h:173
void openAdditionalDialog()
open GNERerouterDialog
Position myBlockIconPosition
position of the block icon