Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUITriggeredRerouter.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
20// Reroutes vehicles passing an edge (gui version)
21/****************************************************************************/
22#include <config.h>
23
24#include <string>
27#include <utils/geom/Boundary.h>
31#include <microsim/MSNet.h>
32#include <microsim/MSLane.h>
33#include <microsim/MSEdge.h>
34#include <microsim/MSRoute.h>
35#include <microsim/MSVehicle.h>
36#include <guisim/GUINet.h>
37#include <guisim/GUIEdge.h>
41#include <gui/GUIGlobals.h>
49
50
51// ===========================================================================
52// FOX callback mapping
53// ===========================================================================
54/* -------------------------------------------------------------------------
55 * GUITriggeredRerouter::GUITriggeredRerouterPopupMenu - mapping
56 * ----------------------------------------------------------------------- */
62
63// Object implementation
65
66
67/* -------------------------------------------------------------------------
68 * GUITriggeredRerouter::GUIManip_TriggeredRerouter - mapping
69 * ----------------------------------------------------------------------- */
77
78FXIMPLEMENT(GUITriggeredRerouter::GUIManip_TriggeredRerouter, GUIManipulator, GUIManip_TriggeredRerouterMap, ARRAYNUMBER(GUIManip_TriggeredRerouterMap))
79
80
81// ===========================================================================
82// method definitions
83// ===========================================================================
84/* -------------------------------------------------------------------------
85 * GUITriggeredRerouter::GUIManip_TriggeredRerouter - methods
86 * ----------------------------------------------------------------------- */
88 GUIMainWindow& app, const std::string& name, GUITriggeredRerouter& o) :
89 GUIManipulator(app, name, 0, 0), myParent(&app),
90 myChosenValue(0), myChosenTarget(myChosenValue, nullptr, MID_OPTION),
91 myUsageProbability(o.getProbability()), myUsageProbabilityTarget(myUsageProbability),
92 myObject(&o) {
93 myChosenTarget.setTarget(this);
94 FXVerticalFrame* f1 =
95 new FXVerticalFrame(this, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0);
96
97 FXGroupBox* gp = new FXGroupBox(f1, "Change Trigger Probability",
98 GROUPBOX_TITLE_LEFT | FRAME_SUNKEN | FRAME_RIDGE,
99 0, 0, 0, 0, 4, 4, 1, 1, 2, 0);
100 {
101 // default
102 FXHorizontalFrame* gf1 =
103 new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
104 new FXRadioButton(gf1, "Default", &myChosenTarget, FXDataTarget::ID_OPTION + 0,
105 ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP,
106 0, 0, 0, 0, 2, 2, 0, 0);
107 }
108 {
109 // free
110 FXHorizontalFrame* gf12 =
111 new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
112 new FXRadioButton(gf12, "User Given: ", &myChosenTarget, FXDataTarget::ID_OPTION + 1,
113 ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP | LAYOUT_CENTER_Y,
114 0, 0, 0, 0, 2, 2, 0, 0);
115 myUsageProbabilityDial =
116 new FXRealSpinner(gf12, 10, this, MID_USER_DEF,
117 LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK);
118 //myUsageProbabilityDial->setFormatString("%.2f");
119 //myUsageProbabilityDial->setIncrements(.1, .1, .1);
120 myUsageProbabilityDial->setIncrement(.1);
121 myUsageProbabilityDial->setRange(0, 1);
122 myUsageProbabilityDial->setValue(myObject->getUserProbability());
123 }
124 {
125 // off
126 FXHorizontalFrame* gf13 =
127 new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
128 new FXRadioButton(gf13, "Off", &myChosenTarget, FXDataTarget::ID_OPTION + 2,
129 ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP,
130 0, 0, 0, 0, 2, 2, 0, 0);
131 }
132 myChosenValue = myObject->inUserMode()
133 ? myObject->getUserProbability() > 0
134 ? 1 : 2
135 : 0;
136
137 FXGroupBox* gp2 = new FXGroupBox(f1, "Change Route Probability",
138 GROUPBOX_TITLE_LEFT | FRAME_SUNKEN | FRAME_RIDGE,
139 0, 0, 0, 0, 4, 4, 1, 1, 2, 0);
140 GUIDesigns::buildFXButton(gp2, "Shift", "", "", nullptr, this, MID_SHIFT_PROBS,
141 BUTTON_INITIAL | BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 30, 30, 4, 4);
142
143 GUIDesigns::buildFXButton(f1, "Close", "", "", nullptr, this, MID_CLOSE,
144 BUTTON_INITIAL | BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 30, 30, 4, 4);
145
146}
147
148
150
151
152long
154 destroy();
155 return 1;
156}
157
158
159long
161 myUsageProbability = (double)(myUsageProbabilityDial->getValue());
162 static_cast<GUITriggeredRerouter*>(myObject)->setUserUsageProbability(myUsageProbability);
163 static_cast<GUITriggeredRerouter*>(myObject)->setUserMode(true);
164 myParent->updateChildren();
165 return 1;
166}
167
168
169long
171 sender->handle(this,
172 myChosenValue != 1 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
173 ptr);
174 myParent->updateChildren();
175 return 1;
176}
177
178
179long
181 static_cast<GUITriggeredRerouter*>(myObject)->setUserUsageProbability(myUsageProbability);
182 switch (myChosenValue) {
183 case 0:
184 static_cast<GUITriggeredRerouter*>(myObject)->setUserMode(false);
185 break;
186 case 1:
187 static_cast<GUITriggeredRerouter*>(myObject)->setUserMode(true);
188 break;
189 case 2:
190 static_cast<GUITriggeredRerouter*>(myObject)->setUserUsageProbability(0);
191 static_cast<GUITriggeredRerouter*>(myObject)->setUserMode(true);
192 break;
193 default:
194 throw 1;
195 }
196 myParent->updateChildren();
197 return 1;
198}
199
200long
202 static_cast<GUITriggeredRerouter*>(myObject)->shiftProbs();
203 myParent->updateChildren();
204 return 1;
205}
206
207
208
209/* -------------------------------------------------------------------------
210 * GUITriggeredRerouter::GUITriggeredRerouterPopupMenu - methods
211 * ----------------------------------------------------------------------- */
216
217
219
220
221long
223 FXSelector,
224 void*) {
225 static_cast<GUITriggeredRerouter*>(myObject)->openManipulator(
226 *myApplication, *myParent);
227 return 1;
228}
229
230// -------------------------------------------------------------------------
231// GUITriggeredRerouter - methods
232// -------------------------------------------------------------------------
233
234GUITriggeredRerouter::GUITriggeredRerouter(const std::string& id, const MSEdgeVector& edges, double prob,
235 bool off, bool optional, SUMOTime timeThreshold, const std::string& vTypes, const Position& pos, const double radius, SUMORTree& rtree) :
236 MSTriggeredRerouter(id, edges, prob, off, optional, timeThreshold, vTypes, pos, radius),
239 // add visualisation objects for edges which trigger the rerouter
240 for (MSEdgeVector::const_iterator it = edges.begin(); it != edges.end(); ++it) {
241 myEdgeVisualizations.push_back(new GUITriggeredRerouterEdge(dynamic_cast<GUIEdge*>(*it), this, REROUTER_TRIGGER_EDGE));
243 myBoundary.add(myEdgeVisualizations.back()->getCenteringBoundary());
244 }
245}
246
247
249 for (std::vector<GUITriggeredRerouterEdge*>::iterator it = myEdgeVisualizations.begin(); it != myEdgeVisualizations.end(); ++it) {
250 delete *it;
251 }
252 myEdgeVisualizations.clear();
253}
254
255
256void
259 if (element == SUMO_TAG_INTERVAL) {
260 // add visualisation objects for closed edges
261 const RerouteInterval& ri = myIntervals.back();
262 for (MSEdgeVector::const_iterator it = ri.closed.begin(); it != ri.closed.end(); ++it) {
263 myEdgeVisualizations.push_back(new GUITriggeredRerouterEdge(dynamic_cast<GUIEdge*>(*it), this, REROUTER_CLOSED_EDGE));
264 dynamic_cast<GUINet*>(GUINet::getInstance())->getVisualisationSpeedUp().addAdditionalGLObject(myEdgeVisualizations.back());
265 myBoundary.add(myEdgeVisualizations.back()->getCenteringBoundary());
266 }
267 // add visualisation objects for switches
268 if (ri.routeProbs.getProbs().size() > 1) {
269 // find last common edge of all routes
270 ConstMSRoutePtr route0 = ri.routeProbs.getVals()[0];
271 const MSEdge* lastEdge = nullptr;
272 int nextIndex = 0;
273 for (int i = 0; i < (int)route0->getEdges().size(); i++) {
274 const MSEdge* cand = route0->getEdges()[i];
275 for (ConstMSRoutePtr route : ri.routeProbs.getVals()) {
276 const MSEdge* nextEdge = i < (int)route->getEdges().size() ? route->getEdges()[i] : nullptr;
277 if (nextEdge != cand) {
278 cand = nullptr;
279 }
280 }
281 if (cand != nullptr) {
282 lastEdge = cand;
283 } else {
284 nextIndex = i;
285 break;
286 }
287 }
288 if (lastEdge != nullptr) {
289 for (int i = 0; i < (int)ri.routeProbs.getVals().size(); i++) {
290 const ConstMSEdgeVector& edges = ri.routeProbs.getVals()[i]->getEdges();
291 if (nextIndex < (int)edges.size()) {
292 GUIEdge* edge = dynamic_cast<GUIEdge*>(const_cast<MSEdge*>(edges[nextIndex]));
294 dynamic_cast<GUINet*>(GUINet::getInstance())->getVisualisationSpeedUp().addAdditionalGLObject(myEdgeVisualizations.back());
295 myBoundary.add(myEdgeVisualizations.back()->getCenteringBoundary());
296 }
297 }
298 }
299 }
300 }
301}
302
303
316
317
323
324
325void
329
330
334 b.grow(20);
335 return b;
336}
337
338
339double
343
344
349 gui->create();
350 gui->show(PLACEMENT_SCREEN);
351 return gui;
352}
353
354
355void
357 const RerouteInterval* const ri = getCurrentReroute(MSNet::getInstance()->getCurrentTimeStep());
358 if (ri != nullptr && ri->routeProbs.getProbs().size() > 1) {
359 auto& rp = const_cast<RandomDistributor<ConstMSRoutePtr>&>(ri->routeProbs);
361 double prob = rp.getProbs()[myShiftProbDistIndex];
362 rp.add(rp.getVals()[myShiftProbDistIndex], -prob);
363 myShiftProbDistIndex = (myShiftProbDistIndex + 1) % rp.getProbs().size();
364 rp.add(rp.getVals()[myShiftProbDistIndex], prob);
365 // notify vehicles currently on a trigger edge
366 for (auto rrEdge : myEdgeVisualizations) {
367 if (rrEdge->getRerouterEdgeType() == REROUTER_TRIGGER_EDGE) {
369 for (MSLane* lane : rrEdge->getEdge()->getLanes()) {
370 for (const MSVehicle* veh : lane->getVehiclesSecure()) {
371 const_cast<MSVehicle*>(veh)->addReminder(this);
372 }
373 lane->releaseVehicles();
374 }
375 }
376 }
377 }
378 }
379}
380
381
382/* -------------------------------------------------------------------------
383 * GUITriggeredRerouterEdge - methods
384 * ----------------------------------------------------------------------- */
386 GUIGlObject(GLO_REROUTER_EDGE, parent->getID() + ":" + edge->getID(), GUIIconSubSys::getIcon(GUIIcon::REROUTER)),
387 myParent(parent),
388 myEdge(edge),
389 myEdgeType(edgeType),
390 myDistIndex(distIndex) {
391 const std::vector<MSLane*>& lanes = edge->getLanes();
392 myFGPositions.reserve(lanes.size());
393 myFGRotations.reserve(lanes.size());
394 for (const MSLane* lane : lanes) {
395 if ((lane->getPermissions() & ~SVC_PEDESTRIAN) == 0) {
396 continue;
397 }
398 const PositionVector& v = lane->getShape();
399 const double pos = edgeType == REROUTER_TRIGGER_EDGE ? MAX2(0.0, v.length() - 6) : MIN2(v.length(), 3.0);
400 myFGPositions.push_back(v.positionAtOffset(pos));
401 myFGRotations.push_back(-v.rotationDegreeAtOffset(pos));
403 myHalfWidths.push_back(lane->getWidth() * 0.5 * 0.875);
404 }
405}
406
407
409
410
413 GUISUMOAbstractView& parent) {
414 return myParent->getPopUpMenu(app, parent);
415}
416
417
423
424
425void
427 const double exaggeration = getExaggeration(s);
428 if (s.scale * exaggeration >= 3) {
430 const double prob = myParent->getProbability();
431 if (myEdgeType == REROUTER_CLOSED_EDGE) {
432 // draw closing symbol onto all lanes
433 const RerouteInterval* const ri =
434 myParent->getCurrentReroute(MSNet::getInstance()->getCurrentTimeStep());
435 if (ri != nullptr && prob > 0) {
436 // draw only if the edge is closed at this time
437 if (std::find(ri->closed.begin(), ri->closed.end(), myEdge) != ri->closed.end()) {
438 const int noLanes = (int)myFGPositions.size();
439 for (int j = 0; j < noLanes; ++j) {
440 Position pos = myFGPositions[j];
441 double rot = myFGRotations[j];
443 glTranslated(pos.x(), pos.y(), 0);
444 glRotated(rot, 0, 0, 1);
445 glTranslated(0, -1.5, 0);
446 int noPoints = 9;
447 if (s.scale > 25) {
448 noPoints = (int)(9.0 + s.scale / 10.0);
449 if (noPoints > 36) {
450 noPoints = 36;
451 }
452 }
453 glTranslated(0, 0, getType());
454 //glScaled(exaggeration, exaggeration, 1);
455 glColor3d(0.7, 0, 0);
456 GLHelper::drawFilledCircle((double) 1.3, noPoints);
457 glTranslated(0, 0, .1);
458 glColor3d(1, 0, 0);
459 GLHelper::drawFilledCircle((double) 1.3, noPoints, 0, prob * 360);
460 glTranslated(0, 0, .1);
461 glColor3d(1, 1, 1);
462 glRotated(-90, 0, 0, 1);
463 glBegin(GL_TRIANGLES);
464 glVertex2d(0 - .3, -1.);
465 glVertex2d(0 - .3, 1.);
466 glVertex2d(0 + .3, 1.);
467 glVertex2d(0 + .3, -1.);
468 glVertex2d(0 - .3, -1.);
469 glVertex2d(0 + .3, 1.);
470 glEnd();
472 }
473 }
474 }
475
476 } else if (myEdgeType == REROUTER_TRIGGER_EDGE) {
477 // draw rerouter symbol onto all lanes
478 for (int i = 0; i < (int)myFGPositions.size(); ++i) {
479 const Position& pos = myFGPositions[i];
480 double rot = myFGRotations[i];
481 const double w = myHalfWidths[i];
483 glTranslated(pos.x(), pos.y(), 0);
484 glRotated(rot, 0, 0, 1);
485 glTranslated(0, 0, getType());
486 glScaled(exaggeration, exaggeration, 1);
487 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
488
489 glBegin(GL_TRIANGLES);
490 glColor3d(1, .8f, 0);
491 // base
492 glVertex2d(0 - w, 0);
493 glVertex2d(0 - w, 6);
494 glVertex2d(0 + w, 6);
495 glVertex2d(0 + w, 0);
496 glVertex2d(0 - w, 0);
497 glVertex2d(0 + w, 6);
498 glEnd();
499
500 // draw "U"
501 GLHelper::drawText("U", Position(0, 2), .1, 3 * (w / 1.4), RGBColor::BLACK, 180);
502
503 // draw Probability
504 GLHelper::drawText((toString((int)(prob * 100)) + "%").c_str(), Position(0, 4), .1, 0.7, RGBColor::BLACK, 180);
505
507 }
508 } else if (myEdgeType == REROUTER_SWITCH_EDGE) {
509 const RerouteInterval* const ri =
510 myParent->getCurrentReroute(MSNet::getInstance()->getCurrentTimeStep());
511 const double routeProb = ri != nullptr && prob > 0 ? ri->routeProbs.getProbs()[myDistIndex] / ri->routeProbs.getOverallProb() : 0;
512 if (routeProb > 0) {
513 for (int i = 0; i < (int)myFGPositions.size(); ++i) {
514 const Position& pos = myFGPositions[i];
515 double rot = myFGRotations[i];
516 const double w = myHalfWidths[i];
518 glTranslated(pos.x(), pos.y(), 0);
519 glRotated(rot, 0, 0, 1);
520 glTranslated(0, 0, getType());
521 glScaled(exaggeration, exaggeration, 1);
522 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
523
524 glBegin(GL_TRIANGLES);
525 glColor3d(0, 1, 1);
526 // base
527 glVertex2d(0 - 0.0, 0);
528 glVertex2d(0 - w, 6);
529 glVertex2d(0 + w, 6);
530 glVertex2d(0 + 0.0, 0);
531 glVertex2d(0 + w, 6);
532 glEnd();
533
534 // draw "P"
535 GLHelper::drawText("P", Position(0, 3.5), .1, 2, RGBColor::BLACK, 180);
536
537 // draw Probability for this target edge
538 GLHelper::drawText((toString((int)(routeProb * 100)) + "%").c_str(), Position(0, 5), .1, 0.7, RGBColor::BLACK, 180);
539
541 }
542 }
543 }
545 }
546}
547
548
549double
553
554
561
562
563void
565 myParent->shiftProbs();
566}
567
568
569/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ MID_MANIP
Open the object's manipulator.
Definition GUIAppEnum.h:489
@ GLO_REROUTER_EDGE
a Rerouter over edge
@ GLO_REROUTER
a Rerouter
GUIIcon
An enumeration of icons used by the gui applications.
Definition GUIIcons.h:33
FXDEFMAP(GUITriggeredRerouter::GUIManip_TriggeredRerouter) GUIManip_TriggeredRerouterMap[]
GUITriggeredRerouterPopupMenuMap[]
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:74
std::vector< MSEdge * > MSEdgeVector
Definition MSEdge.h:73
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
@ SVC_PEDESTRIAN
pedestrian
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
#define UNUSED_PARAMETER(x)
Definition StdDefs.h:30
T MIN2(T a, T b)
Definition StdDefs.h:76
T MAX2(T a, T b)
Definition StdDefs.h:82
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
A class that stores a 2D geometrical boundary.
Definition Boundary.h:39
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition Boundary.cpp:78
Boundary & grow(double by)
extends the boundary by the given amount
Definition Boundary.cpp:343
static void pushName(unsigned int name)
push Name
Definition GLHelper.cpp:140
static void drawFilledCircle(const double widradiusth, const int steps=8)
Draws a filled circle around (0,0)
Definition GLHelper.cpp:564
static void popMatrix()
pop matrix
Definition GLHelper.cpp:131
static void popName()
pop Name
Definition GLHelper.cpp:149
static void pushMatrix()
push matrix
Definition GLHelper.cpp:118
static void drawText(const std::string &text, const Position &pos, const double layer, const double size, const RGBColor &col=RGBColor::BLACK, const double angle=0, const int align=0, double width=-1)
Definition GLHelper.cpp:751
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
A road/street connecting two junctions (gui-version)
Definition GUIEdge.h:51
The popup menu of a globject.
void buildShowManipulatorPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the manipulator window.
const std::string & getFullName() const
Definition GUIGlObject.h:94
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
GUIGlID getGlID() const
Returns the numerical id of the object.
A MSNet extended by some values for usage within the gui.
Definition GUINet.h:82
A window containing a gl-object's parameter.
long onUpdUserDef(FXObject *, FXSelector, void *)
long onCmdChangeOption(FXObject *, FXSelector, void *)
long onCmdShiftProbs(FXObject *, FXSelector, void *)
long onCmdUserDef(FXObject *, FXSelector, void *)
void onLeftBtnPress(void *data)
notify object about left click
Boundary myBoundary
The boundary of this rerouter.
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
GUITriggeredRerouterEdge(GUIEdge *edge, GUITriggeredRerouter *parent, RerouterEdgeType edgeType, int distIndex=-1)
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
std::vector< double > myHalfWidths
The sign half-widths.
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
PosCont myFGPositions
The positions in full-geometry mode.
double getExaggeration(const GUIVisualizationSettings &s) const
return exaggeration associated with this GLObject
RotCont myFGRotations
The rotations in full-geometry mode.
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
long onCmdOpenManip(FXObject *, FXSelector, void *)
Called if the object's manipulator shall be shown.
Reroutes vehicles passing an edge One rerouter can be active on multiple edges. To reduce drawing loa...
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
std::vector< GUITriggeredRerouterEdge * > myEdgeVisualizations
void shiftProbs()
shift route probabilities
GUIManipulator * openManipulator(GUIMainWindow &app, GUISUMOAbstractView &parent)
void myEndElement(int element)
Called when a closing tag occurs.
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
double getExaggeration(const GUIVisualizationSettings &s) const
return exaggeration associated with this GLObject
GUITriggeredRerouter(const std::string &id, const MSEdgeVector &edges, double prob, bool off, bool optional, SUMOTime timeThreshold, const std::string &vTypes, const Position &pos, const double radius, SUMORTree &rtree)
Constructor.
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
Boundary myBoundary
The boundary of this rerouter.
Stores the information about how to visualize structures.
GUIVisualizationSizeSettings addSize
double scale
information about a lane's width (temporary, used for a single view)
A road/street connecting two junctions.
Definition MSEdge.h:77
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
static bool gUseMesoSim
Definition MSGlobals.h:106
Representation of a lane in the micro simulation.
Definition MSLane.h:84
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:186
Reroutes traffic objects passing an edge.
void setUserUsageProbability(double prob)
Sets the probability with which a vehicle is rerouted given by the user.
virtual void myEndElement(int element)
Called when a closing tag occurs.
const RerouteInterval * getCurrentReroute(SUMOTime time, SUMOTrafficObject &obj) const
Returns the rerouting definition valid for the given time and object, nullptr if none.
std::vector< RerouteInterval > myIntervals
List of rerouting definition intervals.
void setUserMode(bool val)
Sets whether the process is currently steered by the user.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
double x() const
Returns the x-position.
Definition Position.h:55
double y() const
Returns the y-position.
Definition Position.h:60
A list of positions.
double length() const
Returns the length.
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
static const RGBColor BLACK
Definition RGBColor.h:193
Represents a generic random distribution.
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
const std::vector< T > & getVals() const
Returns the members of the distribution.
const std::vector< double > & getProbs() const
Returns the probabilities assigned to the members of the distribution.
A RT-tree for efficient storing of SUMO's GL-objects.
Definition SUMORTree.h:66
void addAdditionalGLObject(GUIGlObject *o, const double exaggeration=1)
Adds an additional object (detector/shape/trigger) for visualisation.
Definition SUMORTree.h:124
Definition json.hpp:4471
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values
RandomDistributor< ConstMSRoutePtr > routeProbs
The distributions of new routes to use.
MSEdgeVector closed
The list of closed edges.