Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUIBaseVehicle.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-2025 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/****************************************************************************/
21// A MSVehicle extended by some values for usage within the gui
22/****************************************************************************/
23#include <config.h>
24
25#include <cmath>
26#include <vector>
27#include <string>
28#include <functional>
43#include <mesosim/MEVehicle.h>
44#include <mesosim/MELoop.h>
45#include <microsim/MSVehicle.h>
46#include <microsim/MSLane.h>
50#include <microsim/MSStop.h>
58#include <gui/GUIGlobals.h>
60
61#include "GUIBaseVehicle.h"
62#include "GUIChargingStation.h"
63#include "GUIPerson.h"
64#include "GUIContainer.h"
65#include "GUINet.h"
66#include "GUIEdge.h"
67#include "GUILane.h"
68#include "GUIParkingArea.h"
69
70//#define DRAW_BOUNDING_BOX
71
72// ===========================================================================
73// FOX callback mapping
74// ===========================================================================
75FXDEFMAP(GUIBaseVehicle::GUIBaseVehiclePopupMenu) GUIBaseVehiclePopupMenuMap[] = {
94};
95
96// Object implementation
97FXIMPLEMENT(GUIBaseVehicle::GUIBaseVehiclePopupMenu, GUIGLObjectPopupMenu, GUIBaseVehiclePopupMenuMap, ARRAYNUMBER(GUIBaseVehiclePopupMenuMap))
98
99// ===========================================================================
100// method definitions
101// ===========================================================================
102/* -------------------------------------------------------------------------
103 * GUIBaseVehicle::GUIBaseVehiclePopupMenu - methods
104 * ----------------------------------------------------------------------- */
109
110
112
113
114long
116 assert(myObject->getType() == GLO_VEHICLE);
117 if (!static_cast<GUIBaseVehicle*>(myObject)->hasActiveAddVisualisation(myParent, VO_SHOW_ALL_ROUTES)) {
118 static_cast<GUIBaseVehicle*>(myObject)->addActiveAddVisualisation(myParent, VO_SHOW_ALL_ROUTES);
119 }
120 return 1;
121}
122
123long
125 assert(myObject->getType() == GLO_VEHICLE);
126 static_cast<GUIBaseVehicle*>(myObject)->removeActiveAddVisualisation(myParent, VO_SHOW_ALL_ROUTES);
127 return 1;
128}
129
130
131long
133 assert(myObject->getType() == GLO_VEHICLE);
134 if (!static_cast<GUIBaseVehicle*>(myObject)->hasActiveAddVisualisation(myParent, VO_SHOW_ROUTE)) {
135 static_cast<GUIBaseVehicle*>(myObject)->addActiveAddVisualisation(myParent, VO_SHOW_ROUTE);
136 }
137 return 1;
138}
139
140long
142 assert(myObject->getType() == GLO_VEHICLE);
143 static_cast<GUIBaseVehicle*>(myObject)->removeActiveAddVisualisation(myParent, VO_SHOW_ROUTE);
144 return 1;
145}
146
147
148long
150 assert(myObject->getType() == GLO_VEHICLE);
151 if (!static_cast<GUIBaseVehicle*>(myObject)->hasActiveAddVisualisation(myParent, VO_SHOW_FUTURE_ROUTE)) {
152 static_cast<GUIBaseVehicle*>(myObject)->addActiveAddVisualisation(myParent, VO_SHOW_FUTURE_ROUTE);
153 }
154 return 1;
155}
156
157long
159 assert(myObject->getType() == GLO_VEHICLE);
160 static_cast<GUIBaseVehicle*>(myObject)->removeActiveAddVisualisation(myParent, VO_SHOW_FUTURE_ROUTE);
161 return 1;
162}
163
164
165long
167 assert(myObject->getType() == GLO_VEHICLE);
168 if (!static_cast<GUIBaseVehicle*>(myObject)->hasActiveAddVisualisation(myParent, VO_SHOW_ROUTE_NOLOOP)) {
169 static_cast<GUIBaseVehicle*>(myObject)->addActiveAddVisualisation(myParent, VO_SHOW_ROUTE_NOLOOP);
170 }
171 return 1;
172}
173
174long
176 assert(myObject->getType() == GLO_VEHICLE);
177 static_cast<GUIBaseVehicle*>(myObject)->removeActiveAddVisualisation(myParent, VO_SHOW_ROUTE_NOLOOP);
178 return 1;
179}
180
181
182long
184 assert(myObject->getType() == GLO_VEHICLE);
185 if (!static_cast<GUIBaseVehicle*>(myObject)->hasActiveAddVisualisation(myParent, VO_SHOW_BEST_LANES)) {
186 static_cast<GUIBaseVehicle*>(myObject)->addActiveAddVisualisation(myParent, VO_SHOW_BEST_LANES);
187 }
188 return 1;
189}
190
191long
193 assert(myObject->getType() == GLO_VEHICLE);
194 static_cast<GUIBaseVehicle*>(myObject)->removeActiveAddVisualisation(myParent, VO_SHOW_BEST_LANES);
195 return 1;
196}
197
198
199long
201 assert(myObject->getType() == GLO_VEHICLE);
202 if (myParent->getTrackedID() != static_cast<GUIBaseVehicle*>(myObject)->getGlID()) {
203 myParent->startTrack(static_cast<GUIBaseVehicle*>(myObject)->getGlID());
204 }
205 return 1;
206}
207
208long
210 assert(myObject->getType() == GLO_VEHICLE);
211 myParent->stopTrack();
212 return 1;
213}
214
215
216long
218 assert(myObject->getType() == GLO_VEHICLE);
219 if (!static_cast<GUIBaseVehicle*>(myObject)->hasActiveAddVisualisation(myParent, VO_SHOW_LFLINKITEMS)) {
220 static_cast<GUIBaseVehicle*>(myObject)->addActiveAddVisualisation(myParent, VO_SHOW_LFLINKITEMS);
221 }
222 return 1;
223}
224
225long
227 assert(myObject->getType() == GLO_VEHICLE);
228 static_cast<GUIBaseVehicle*>(myObject)->removeActiveAddVisualisation(myParent, VO_SHOW_LFLINKITEMS);
229 return 1;
230}
231
232long
234 assert(myObject->getType() == GLO_VEHICLE);
235 static_cast<GUIBaseVehicle*>(myObject)->selectBlockingFoes();
236 myParent->update();
237 return 1;
238}
239
240
241long
243 assert(myObject->getType() == GLO_VEHICLE);
244 const MSBaseVehicle& veh = static_cast<GUIBaseVehicle*>(myObject)->getVehicle();
245 for (const MSTransportable* t : veh.getPersons()) {
246 gSelected.select((static_cast<const GUIPerson*>(t))->getGlID());
247 }
248 for (MSTransportable* t : veh.getContainers()) {
249 gSelected.select((static_cast<const GUIContainer*>(t))->getGlID());
250 }
251 myParent->update();
252 return 1;
253}
254
255long
257 GUIBaseVehicle* baseVeh = static_cast<GUIBaseVehicle*>(myObject);
258 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(&baseVeh->myVehicle);
259 if (microVeh != nullptr) {
260 MSLane* lane = microVeh->getMutableLane();
261 if (lane != nullptr) {
262 lane->getVehiclesSecure();
264 }
266 if (lane != nullptr) {
267 lane->releaseVehicles();
268 }
269 } else {
270 MEVehicle* mesoVeh = dynamic_cast<MEVehicle*>(&baseVeh->myVehicle);
272 }
274 myParent->destroyPopup();
275 myParent->update();
276 return 1;
277}
278
279
280long
282 GUIBaseVehicle* baseVeh = static_cast<GUIBaseVehicle*>(myObject);
283 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(&baseVeh->myVehicle);
284 if (microVeh != nullptr) {
285 if (microVeh->isStopped()) {
286 microVeh->resumeFromStopping();
287 } else {
288 std::string errorOut;
289 const double brakeGap = microVeh->getCarFollowModel().brakeGap(microVeh->getSpeed());
290 std::pair<const MSLane*, double> stopPos = microVeh->getLanePosAfterDist(brakeGap);
291 if (stopPos.first != nullptr) {
293 stop.lane = stopPos.first->getID();
294 stop.startPos = stopPos.second;
295 stop.endPos = stopPos.second + POSITION_EPS;
296 stop.duration = TIME2STEPS(3600);
297 microVeh->addTraciStop(stop, errorOut);
298 if (errorOut != "") {
299 WRITE_WARNING(errorOut);
300 }
301 }
302 }
303 } else {
304 WRITE_WARNING(TL("GUI-triggered stop not implemented for meso"));
305 }
306 myParent->update();
307 return 1;
308}
309
310
311/* -------------------------------------------------------------------------
312 * GUIBaseVehicle - methods
313 * ----------------------------------------------------------------------- */
314
316 GUIGlObject(GLO_VEHICLE, vehicle.getID(), GUIIconSubSys::getIcon(GUIIcon::VEHICLE)),
317 myVehicle(vehicle),
318 myPopup(nullptr) {
319 // as it is possible to show all vehicle routes, we have to store them... (bug [ 2519761 ])
321 myVehicle.myMoveReminders.push_back(std::make_pair(myRoutes, 0.));
322 mySeatPositions.push_back(Seat()); // ensure length 1
323 myContainerPositions.push_back(Seat()); // ensure length 1
324}
325
326
328 myLock.lock();
329 for (std::map<GUISUMOAbstractView*, int>::iterator i = myAdditionalVisualizations.begin(); i != myAdditionalVisualizations.end(); ++i) {
330 if (i->first->getTrackedID() == getGlID()) {
331 i->first->stopTrack();
332 }
333 while (i->first->removeAdditionalGLVisualisation(this));
334 }
335 myLock.unlock();
336 delete myRoutes;
337 if (myPopup != nullptr) {
339 }
340}
341
342
345 GUIGLObjectPopupMenu* ret = new GUIBaseVehiclePopupMenu(app, parent, this);
346 buildPopupHeader(ret, app);
350 //
352 GUIDesigns::buildFXMenuCommand(ret, TL("Hide Current Route"), nullptr, ret, MID_HIDE_CURRENTROUTE);
353 } else {
354 GUIDesigns::buildFXMenuCommand(ret, TL("Show Current Route"), nullptr, ret, MID_SHOW_CURRENTROUTE);
355 }
357 GUIDesigns::buildFXMenuCommand(ret, TL("Hide Future Route"), nullptr, ret, MID_HIDE_FUTUREROUTE);
358 } else {
359 GUIDesigns::buildFXMenuCommand(ret, TL("Show Future Route"), nullptr, ret, MID_SHOW_FUTUREROUTE);
360 }
362 GUIDesigns::buildFXMenuCommand(ret, TL("Hide All Routes"), nullptr, ret, MID_HIDE_ALLROUTES);
363 } else {
364 GUIDesigns::buildFXMenuCommand(ret, TL("Show All Routes"), nullptr, ret, MID_SHOW_ALLROUTES);
365 }
367 FXMenuCheck* showLoops = new FXMenuCheck(ret, TL("Draw looped routes"), ret, MID_HIDE_ROUTE_NOLOOPS);
368 showLoops->setCheck(false);
369 } else {
370 FXMenuCheck* showLoops = new FXMenuCheck(ret, TL("Draw looped routes"), ret, MID_SHOW_ROUTE_NOLOOPS);
371 showLoops->setCheck(true);
372 }
374 GUIDesigns::buildFXMenuCommand(ret, TL("Hide Best Lanes"), nullptr, ret, MID_HIDE_BEST_LANES);
375 } else {
376 GUIDesigns::buildFXMenuCommand(ret, TL("Show Best Lanes"), nullptr, ret, MID_SHOW_BEST_LANES);
377 }
379 GUIDesigns::buildFXMenuCommand(ret, TL("Hide Link Items"), nullptr, ret, MID_HIDE_LFLINKITEMS);
380 } else {
381 GUIDesigns::buildFXMenuCommand(ret, TL("Show Link Items"), nullptr, ret, MID_SHOW_LFLINKITEMS);
382 }
383 new FXMenuSeparator(ret);
384 if (parent.getTrackedID() != getGlID()) {
385 GUIDesigns::buildFXMenuCommand(ret, TL("Start Tracking"), nullptr, ret, MID_START_TRACK);
386 } else {
387 GUIDesigns::buildFXMenuCommand(ret, TL("Stop Tracking"), nullptr, ret, MID_STOP_TRACK);
388 }
389 GUIDesigns::buildFXMenuCommand(ret, TL("Select Foes"), nullptr, ret, MID_SHOW_FOES);
390 if (myVehicle.getPersons().size() + myVehicle.getContainers().size() > 0) {
391 GUIDesigns::buildFXMenuCommand(ret, TL("Select transported"), nullptr, ret, MID_SELECT_TRANSPORTED);
392 }
393 GUIDesigns::buildFXMenuCommand(ret, myVehicle.isStopped() ? TL("Abort stop") : TL("Stop"), nullptr, ret, MID_TOGGLE_STOP);
394 GUIDesigns::buildFXMenuCommand(ret, TL("Remove"), nullptr, ret, MID_REMOVE_OBJECT);
395
396 new FXMenuSeparator(ret);
397 //
398 buildShowParamsPopupEntry(ret, false);
400 buildPositionCopyEntry(ret, app);
401 myPopup = ret;
402 return ret;
403}
404
405
406void
410
411
412double
417
418
426
427
428const std::string
432
433
434void
435GUIBaseVehicle::drawOnPos(const GUIVisualizationSettings& s, const Position& pos, const double angle) const {
438 Position p1 = pos;
439 const double degAngle = RAD2DEG(angle + M_PI / 2.);
440 const double length = getVType().getLength();
441 if (s.trueZ) {
442 glTranslated(p1.x(), p1.y(), p1.z() + 1);
443 } else {
444 glTranslated(p1.x(), p1.y(), getType());
445 }
446 glRotated(degAngle, 0, 0, 1);
447 RGBColor col = setColor(s);
448 // scale
449 const double upscale = getExaggeration(s);
450 const bool s2 = s.secondaryShape;
451
452 if (upscale > 1 && s.laneWidthExaggeration > 1 && myVehicle.isOnRoad()) {
453 // optionally shift according to edge exaggeration
454 double offsetFromLeftBorder = myVehicle.getCurrentEdge()->getWidth() - myVehicle.getRightSideOnEdge() - myVehicle.getVehicleType().getWidth() / 2;
455 glTranslated((s.laneWidthExaggeration - 1) * -offsetFromLeftBorder / 2, 0, 0);
456 }
457
458 double upscaleLength = MSTrainHelper::getUpscaleLength(upscale, length, getVType().getWidth(), s.vehicleQuality);
459 glScaled(upscale, upscaleLength, 1);
460 /*
461 MSLaneChangeModel::DK2004 &m2 = static_cast<MSLaneChangeModel::DK2004&>(veh->getLaneChangeModel());
462 if((m2.getState()&LCA_URGENT)!=0) {
463 glColor3d(1, .4, .4);
464 } else if((m2.getState()&LCA_SPEEDGAIN)!=0) {
465 glColor3d(.4, .4, 1);
466 } else {
467 glColor3d(.4, 1, .4);
468 }
469 */
470 // draw the vehicle
471 bool drawCarriages = false;
472 // do not upscale vehicles on physically impossible geometry factors > 1
473 const double geometryFactor = (s.scaleLength ?
474 MIN2(1.0, (myVehicle.getLane() != nullptr
476 : (myVehicle.getEdge()->getLanes().size() > 0 ? myVehicle.getEdge()->getLanes()[0]->getLengthGeometryFactor(s2) : 1)))
477 : 1);
478 double scaledLength = length * geometryFactor;
479 if (col.alpha() != 0) {
480 switch (s.vehicleQuality) {
481 case 0:
483 break;
484 case 1:
486 break;
487 case 2:
488 drawCarriages = drawAction_drawVehicleAsPolyWithCarriagges(s, scaledLength);
489 // draw flashing blue light for emergency vehicles
490 if (getVType().getGuiShape() == SUMOVehicleShape::EMERGENCY) {
491 glTranslated(0, 0, .1);
493 }
494 break;
495 case 3:
496 drawCarriages = drawAction_drawVehicleAsPolyWithCarriagges(s, scaledLength, true);
497 break;
498 case 4: {
499 // do not scale circle radius by lengthGeometryFactor nor length and reduce the effect of width
500 const double w = 1.8 * sqrt(getVType().getWidth() / 1.8);
502 // display text at circle center
503 scaledLength = 0;
504 break;
505 }
506 default:
507 break;
508 }
509 if (s.drawMinGap) {
510 const double minGap = -getVType().getMinGap();
511 glColor3d(0., 1., 0.);
512 glBegin(GL_LINES);
513 glVertex2d(0., 0);
514 glVertex2d(0., minGap);
515 glVertex2d(-.5, minGap);
516 glVertex2d(.5, minGap);
517 glEnd();
518 }
521 const double brakeGap = -static_cast<MSVehicle&>(myVehicle).getCarFollowModel().brakeGap(myVehicle.getSpeed());
522 glColor3d(1., 0., 0.);
523 glBegin(GL_LINES);
524 glVertex2d(0., 0);
525 glVertex2d(0., brakeGap);
526 glVertex2d(-.5, brakeGap);
527 glVertex2d(.5, brakeGap);
528 glEnd();
529 }
530 if (s.showBTRange) {
532 if (dev != nullptr) {
533 glColor3d(1., 0., 0.);
534 GLHelper::drawOutlineCircle(dev->getRange(), dev->getRange() - .2, 32);
535 }
536 }
537 // draw the blinker and brakelights if wished
538 if (s.showBlinker) {
539 glTranslated(0, 0, .1);
540 switch (getVType().getGuiShape()) {
550 break;
553 drawAction_drawVehicleBlinker(scaledLength);
554 drawAction_drawVehicleBrakeLight(scaledLength, true);
555 break;
556 default:
557 // only SUMOVehicleShape::RAIL_CAR has blinkers and brake lights but they are drawn along with the carriages
558 if (!drawCarriages) {
559 drawAction_drawVehicleBlinker(scaledLength);
561 }
562 break;
563 }
564 }
565 // draw the wish to change the lane
567 /*
568 if(gSelected.isSelected(GLO_VEHICLE, veh->getGlID())) {
569 MSLaneChangeModel::DK2004 &m = static_cast<MSLaneChangeModel::DK2004&>(veh->getLaneChangeModel());
570 glColor3d(.5, .5, 1);
571 glBegin(GL_LINES);
572 glVertex2f(0, 0);
573 glVertex2f(m.getChangeProbability(), .5);
574 glEnd();
575
576 glColor3d(1, 0, 0);
577 glBegin(GL_LINES);
578 glVertex2f(0.1, 0);
579 glVertex2f(0.1, m.myMaxJam1);
580 glEnd();
581
582 glColor3d(0, 1, 0);
583 glBegin(GL_LINES);
584 glVertex2f(-0.1, 0);
585 glVertex2f(-0.1, m.myTDist);
586 glEnd();
587 }
588 */
589 }
590 }
591 glTranslated(0, MIN2(scaledLength / 2, double(5)), -getType()); // drawing name at GLO_MAX fails unless translating z
592 glScaled(1 / upscale, 1 / upscaleLength, 1);
593 glRotated(-degAngle, 0, 0, 1);
594 drawName(Position(0, 0), s.scale, s.vehicleName, s.angle);
595 if (s.vehicleName.show(this) && myVehicle.getParameter().line != "") {
596 glRotated(-s.angle, 0, 0, 1);
597 glTranslated(0, 0.7 * s.vehicleName.scaledSize(s.scale), 0);
598 glRotated(s.angle, 0, 0, 1);
600 }
601 if (s.vehicleValue.show(this)) {
602 glRotated(-s.angle, 0, 0, 1);
603 glTranslated(0, 0.7 * s.vehicleName.scaledSize(s.scale), 0);
604 glRotated(s.angle, 0, 0, 1);
605 const double value = getColorValue(s, s.vehicleColorer.getActive());
606 if (value != s.MISSING_DATA) {
608 }
609 }
610 if (s.vehicleScaleValue.show(this)) {
611 glRotated(-s.angle, 0, 0, 1);
612 glTranslated(0, 0.7 * s.vehicleName.scaledSize(s.scale), 0);
613 glRotated(s.angle, 0, 0, 1);
614 const double value = getScaleValue(s, s.vehicleScaler.getActive());
615 if (value != s.MISSING_DATA) {
617 }
618 }
619 if (s.vehicleText.show(this)) {
620 std::string error;
621 std::string value = myVehicle.getPrefixedParameter(s.vehicleTextParam, error);
622 if (value != "") {
624 glRotated(-s.angle, 0, 0, 1);
625 glTranslated(0, 0.7 * s.vehicleText.scaledSize(s.scale) * (double)lines.size(), 0);
626 glRotated(s.angle, 0, 0, 1);
627 for (std::string& line : lines) {
629 glRotated(-s.angle, 0, 0, 1);
630 glTranslated(0, -0.7 * s.vehicleText.scaledSize(s.scale), 0);
631 glRotated(s.angle, 0, 0, 1);
632 }
633 }
634 }
637 glRotated(-s.angle, 0, 0, 1);
638 glTranslated(0, 0.7 * s.vehicleName.scaledSize(s.scale), 0);
639 glRotated(s.angle, 0, 0, 1);
640 const double value = myVehicle.getNumberParkingReroutes();
642 }
643
644 if (!drawCarriages) {
645 mySeatPositions.clear();
646 myContainerPositions.clear();
647 int requiredSeats = getNumPassengers();
648 int requiredContainerPositions = getNumContainers();
649 const Position back = (p1 + Position(-scaledLength * upscaleLength, 0)).rotateAround2D(angle, p1);
650 double extraOffset = scaledLength * 0.15;
651 computeSeats(p1, back, SUMO_const_waitingPersonWidth, getVType().getPersonCapacity(), upscale, requiredSeats, mySeatPositions, extraOffset);
652 computeSeats(p1, back, SUMO_const_waitingContainerWidth, getVType().getContainerCapacity(), upscale, requiredContainerPositions, myContainerPositions, extraOffset);
653 }
654
658}
659
660
661void
665
666
667void
669 if (!myVehicle.isOnRoad()) {
670 drawGL(s);
671 }
674 glTranslated(0, 0, getType() - .1); // don't draw on top of other cars
677 }
678 bool noLoop = hasActiveAddVisualisation(parent, VO_SHOW_ROUTE_NOLOOP);
680 drawRoute(s, 0, 0.25, false, noLoop);
681 }
683 drawRoute(s, 0, 0.25, true, noLoop);
684 }
686 if (myVehicle.getNumberReroutes() > 0) {
687 const int noReroutePlus1 = myVehicle.getNumberReroutes() + 1;
688 for (int i = noReroutePlus1 - 1; i >= 0; i--) {
689 double darken = double(0.4) / double(noReroutePlus1) * double(i);
690 drawRoute(s, i, darken);
691 }
692 } else {
693 drawRoute(s, 0, 0.25, false, noLoop);
694 }
695 }
698 }
701}
702
703
704void
705GUIBaseVehicle::drawLinkItem(const Position& pos, SUMOTime arrivalTime, SUMOTime leaveTime, double exagerate) {
706 glTranslated(pos.x(), pos.y(), -.1);
708 std::string times = toString(STEPS2TIME(arrivalTime)) + "/" + toString(STEPS2TIME(leaveTime));
709 GLHelper::drawText(times.c_str(), Position(), .1, 1.6 * exagerate, RGBColor::GREEN, 0);
710 glTranslated(-pos.x(), -pos.y(), .1);
711}
712
713
716 RGBColor col;
717 const GUIColorer& c = s.vehicleColorer;
718 if (!setFunctionalColor(c.getActive(), &myVehicle, col)) {
719 col = c.getScheme().getColor(getColorValue(s, c.getActive()));
720 }
722 return col;
723}
724
725
726bool
727GUIBaseVehicle::setFunctionalColor(int activeScheme, const MSBaseVehicle* veh, RGBColor& col) {
728 switch (activeScheme) {
729 case 0: {
730 //test for emergency vehicle
732 col = RGBColor::WHITE;
733 return true;
734 }
735 //test for firebrigade
737 col = RGBColor::RED;
738 return true;
739 }
740 //test for police car
742 col = RGBColor::BLUE;
743 return true;
744 }
746 col = veh->getParameter().color;
747 return true;
748 }
750 col = veh->getVehicleType().getColor();
751 return true;
752 }
753 if (&(veh->getRoute().getColor()) != &RGBColor::DEFAULT_COLOR) {
754 col = veh->getRoute().getColor();
755 return true;
756 }
757 return false;
758 }
759 case 2: {
761 col = veh->getParameter().color;
762 return true;
763 }
764 return false;
765 }
766 case 3: {
768 col = veh->getVehicleType().getColor();
769 return true;
770 }
771 return false;
772 }
773 case 4: {
774 if (&(veh->getRoute().getColor()) != &RGBColor::DEFAULT_COLOR) {
775 col = veh->getRoute().getColor();
776 return true;
777 }
778 return false;
779 }
780 case 5: {
781 Position p = veh->getRoute().getEdges()[0]->getLanes()[0]->getShape()[0];
782 const Boundary& b = ((GUINet*) MSNet::getInstance())->getBoundary();
783 Position center = b.getCenter();
784 double hue = 180. + atan2(center.x() - p.x(), center.y() - p.y()) * 180. / M_PI;
785 double sat = p.distanceTo(center) / center.distanceTo(Position(b.xmin(), b.ymin()));
786 col = RGBColor::fromHSV(hue, sat, 1.);
787 return true;
788 }
789 case 6: {
790 Position p = veh->getRoute().getEdges().back()->getLanes()[0]->getShape()[-1];
791 const Boundary& b = ((GUINet*) MSNet::getInstance())->getBoundary();
792 Position center = b.getCenter();
793 double hue = 180. + atan2(center.x() - p.x(), center.y() - p.y()) * 180. / M_PI;
794 double sat = p.distanceTo(center) / center.distanceTo(Position(b.xmin(), b.ymin()));
795 col = RGBColor::fromHSV(hue, sat, 1.);
796 return true;
797 }
798 case 7: {
799 Position pb = veh->getRoute().getEdges()[0]->getLanes()[0]->getShape()[0];
800 Position pe = veh->getRoute().getEdges().back()->getLanes()[0]->getShape()[-1];
801 const Boundary& b = ((GUINet*) MSNet::getInstance())->getBoundary();
802 double hue = 180. + atan2(pb.x() - pe.x(), pb.y() - pe.y()) * 180. / M_PI;
803 Position minp(b.xmin(), b.ymin());
804 Position maxp(b.xmax(), b.ymax());
805 double sat = pb.distanceTo(pe) / minp.distanceTo(maxp);
806 col = RGBColor::fromHSV(hue, sat, 1.);
807 return true;
808 }
809 case 35: { // color randomly (by pointer hash)
810 std::hash<const MSBaseVehicle*> ptr_hash;
811 const double hue = (double)(ptr_hash(veh) % 360); // [0-360]
812 const double sat = (double)((ptr_hash(veh) / 360) % 67) / 100.0 + 0.33; // [0.33-1]
813 col = RGBColor::fromHSV(hue, sat, 1.);
814 return true;
815 }
816 case 36: { // color by angle
817 double hue = GeomHelper::naviDegree(veh->getAngle());
818 col = RGBColor::fromHSV(hue, 1., 1.);
819 return true;
820 }
821 }
822 return false;
823}
824
825
826double
828 switch (activeScheme) {
829 case 0: // uniform
830 return 0;
831 case 1: // selection
832 return myVehicle.isSelected();
833 case 2: // by speed
834 if (myVehicle.isStopped()) {
835 return myVehicle.isParking() ? -2 : -1;
836 }
837 return myVehicle.getSpeed();
838 case 3:
840 case 4: {
841 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(&myVehicle);
842 return (microVeh != nullptr ? microVeh->getAccumulatedWaitingSeconds() : 0);
843 }
844 case 5: {
845 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(&myVehicle);
846 return (microVeh != nullptr ? microVeh->getLane()->getVehicleMaxSpeed(microVeh) : myVehicle.getEdge()->getVehicleMaxSpeed(&myVehicle));
847 }
848 case 6:
850 case 7: {
851 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(&myVehicle);
852 return (microVeh != nullptr
853 ? (microVeh->getLaneChangeModel().isOpposite() ? -100 : microVeh->getBestLaneOffset())
854 : 0);
855 }
856 case 8:
857 return myVehicle.getAcceleration();
858 case 9: {
859 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(&myVehicle);
860 return (microVeh != nullptr ? microVeh->getTimeGapOnLane() : 0);
861 }
862 case 10:
864 case 11:
866 case 12:
867 return myVehicle.getStopDelay();
868 case 13:
870 case 14: // by numerical param value
871 std::string error;
872 std::string val = myVehicle.getPrefixedParameter(s.vehicleScaleParam, error);
873 try {
874 if (val == "") {
875 return 0;
876 } else {
877 return StringUtils::toDouble(val);
878 }
879 } catch (NumberFormatException&) {
880 try {
881 return StringUtils::toBool(val);
882 } catch (BoolFormatException&) {
883 WRITE_WARNINGF(TL("Vehicle parameter '%' key '%' is not a number for vehicle '%'."),
885 return -1;
886 }
887 }
888 }
889 return 0;
890}
891
892
893// ------------ Additional visualisations
894bool
896 return myAdditionalVisualizations.find(parent) != myAdditionalVisualizations.end() && (myAdditionalVisualizations.find(parent)->second & which) != 0;
897}
898
899
900void
902 if (myAdditionalVisualizations.find(parent) == myAdditionalVisualizations.end()) {
903 myAdditionalVisualizations[parent] = 0;
904 }
905 myAdditionalVisualizations[parent] |= which;
906 if (which != VO_TRACK) {
907 parent->addAdditionalGLVisualisation(this);
908 }
909}
910
911
912void
914 myAdditionalVisualizations[parent] &= ~which;
915 if (myAdditionalVisualizations[parent] == 0) {
916 myAdditionalVisualizations.erase(parent);
917 }
919}
920
921
922void
923GUIBaseVehicle::drawRoute(const GUIVisualizationSettings& s, int routeNo, double darken, bool future, bool noLoop) const {
924 RGBColor vehColor = setColor(s);
925 RGBColor darker = vehColor.changedBrightness((int)(darken * -255));
926 if (darker == RGBColor::BLACK) {
927 darker = vehColor.multiply(1 - darken);
928 }
929 GLHelper::setColor(darker);
930 if (routeNo == 0) {
931 drawRouteHelper(s, myVehicle.getRoutePtr(), future, noLoop, darker);
932 return;
933 }
934 ConstMSRoutePtr route = myRoutes->getRoute(routeNo - 1); // only prior routes are stored
935 if (route != nullptr) {
936 drawRouteHelper(s, route, future, noLoop, darker);
937 }
938}
939
940
941void
942GUIBaseVehicle::drawStopLabels(const GUIVisualizationSettings& s, bool noLoop, const RGBColor& col) const {
943 // (vertical shift for repeated stops at the same position
944 std::map<const MSLane*, int> repeat; // count repeated occurrences of the same position
945 int stopIndex = 0;
946 for (const MSStop& stop : myVehicle.getStops()) {
947 double stopLanePos;
948 if (stop.getSpeed() > 0) {
949 stopLanePos = stop.reached ? stop.pars.endPos : stop.pars.startPos;
950 } else {
951 stopLanePos = stop.reached ? myVehicle.getPositionOnLane() : MAX2(0.0, stop.getEndPos(myVehicle));
952 }
953 if (stop.isOpposite && !stop.reached) {
954 stopLanePos = stop.lane->getLength() - stopLanePos;
955 }
956 Position pos = stop.lane->geometryPositionAtOffset(stopLanePos);
958 GLHelper::drawBoxLines(stop.lane->getShape().getOrthogonal(pos, 10, true, stop.lane->getWidth()), 0.1);
959 std::string label = (stop.getSpeed() > 0
960 ? (stop.reached ? "passing waypoint" : "waypoint ")
961 : (stop.reached ? "stopped" : "stop "));
962 if (!stop.reached) {
963 label += toString(stopIndex);
964 }
965
966 if (stop.isOpposite) {
967 label += " (opposite)";
968 }
969#ifdef _DEBUG
970 label += " (" + toString(stop.edge - myVehicle.getCurrentRouteEdge()) + "e)";
971#endif
973 label += " triggered:";
974 if (stop.triggered) {
975 label += "person";
976 if (stop.numExpectedPerson > 0) {
977 label += "(" + toString(stop.numExpectedPerson) + ")";
978 }
979 }
980 if (stop.containerTriggered) {
981 label += "container";
982 if (stop.numExpectedContainer > 0) {
983 label += "(" + toString(stop.numExpectedContainer) + ")";
984 }
985 }
986 if (stop.joinTriggered) {
987 label += "join";
988 if (stop.pars.join != "") {
989 label += "(" + stop.pars.join + ")";
990 }
991 }
992 }
993 if (stop.pars.ended >= 0 && MSGlobals::gUseStopEnded) {
994 label += " ended:" + time2string(stop.pars.ended);
995 } else if (stop.pars.until >= 0) {
996 label += " until:" + time2string(stop.pars.until);
997 }
998 if (stop.duration >= 0 || stop.pars.duration > 0) {
999 if (STEPS2TIME(stop.duration) > 3600 * 24) {
1000 label += " duration:1day+";
1001 } else {
1002 label += " duration:" + time2string(stop.duration);
1003 }
1004 }
1005 if (stop.getSpeed() > 0) {
1006 if (stop.skipOnDemand) {
1007 label += " onDemand (skipped)";
1008 } else {
1009 label += " speed:" + toString(stop.getSpeed());
1010 }
1011 }
1012 if (stop.pars.actType != "") {
1013 label += " actType:" + stop.pars.actType;
1014 }
1015 const double nameSize = s.vehicleName.size / s.scale;
1016 Position pos2 = pos - Position(0, nameSize * repeat[stop.lane]);
1017 if (noLoop && repeat[stop.lane] > 0) {
1018 break;
1019 }
1020 GLHelper::drawTextSettings(s.vehicleText, label, pos2, s.scale, s.angle, 1.0);
1021 repeat[stop.lane]++;
1022 stopIndex++;
1023 }
1024 // indicate arrivalPos if set
1026 const int arrivalEdge = myVehicle.getParameter().arrivalEdge >= 0
1028 : (int)myVehicle.getRoute().getEdges().size() - 1;
1029 const MSLane* arrivalLane = myVehicle.getRoute().getEdges()[arrivalEdge]->getLanes()[MAX2(0, myVehicle.getArrivalLane())];
1031 GLHelper::setColor(col);
1032 GLHelper::drawBoxLines(arrivalLane->getShape().getOrthogonal(pos, 10, true, arrivalLane->getWidth() * 0.5, 90), 0.1);
1033 GLHelper::drawBoxLines(arrivalLane->getShape().getOrthogonal(pos, 10, true, arrivalLane->getWidth() * 0.5, 270), 0.1);
1034 GLHelper::drawTextSettings(s.vehicleText, "arrival", pos, s.scale, s.angle, 1.0);
1035
1036 }
1037}
1038
1039void
1041 if (s.showParkingInfo) {
1043 if (pm != nullptr) {
1044 for (auto item : *pm) {
1045 const GUIParkingArea* pa = dynamic_cast<const GUIParkingArea*>(item.first);
1046 if (item.second.blockedAtTime >= 0) {
1047 std::string seenAgo = time2string(SIMSTEP - item.second.blockedAtTime);
1048 //if (item.second.blockedAtTime >= 0) {
1049 // seenAgo += ", " + time2string(SIMSTEP - item.second.blockedAtTimeLocal);
1050 //}
1051 GLHelper::drawTextSettings(s.vehicleValue, seenAgo, pa->getSignPos(), s.scale, s.angle, 1.0);
1052 }
1053 if (item.second.score != "") {
1054 const double dist = 0.4 * (s.vehicleText.scaledSize(s.scale) + s.vehicleValue.scaledSize(s.scale));
1055 Position shift(0, -dist);
1056 GLHelper::drawTextSettings(s.vehicleText, item.second.score, pa->getSignPos() + shift, s.scale, s.angle, 1.0);
1057 }
1058 }
1059 }
1060 }
1061}
1062
1063void
1065 if (s.showChargingInfo) {
1067 if (pm != nullptr) {
1068 for (auto item : *pm) {
1069 const GUIChargingStation* cs = dynamic_cast<const GUIChargingStation*>(item.first);
1070 if (item.second.blockedAtTime >= 0) {
1071 std::string seenAgo = time2string(SIMSTEP - item.second.blockedAtTime);
1072 GLHelper::drawTextSettings(s.vehicleValue, seenAgo, cs->getSignPos(), s.scale, s.angle, 1.0);
1073 }
1074 if (item.second.score != "") {
1075 const double dist = 0.4 * (s.vehicleText.scaledSize(s.scale) + s.vehicleValue.scaledSize(s.scale));
1076 Position shift(0, -dist);
1077 GLHelper::drawTextSettings(s.vehicleText, item.second.score, cs->getSignPos() + shift, s.scale, s.angle, 1.0);
1078 }
1079 }
1080 }
1081 }
1082}
1083
1085GUIBaseVehicle::getSeatPosition(int personIndex) const {
1087 return mySeatPositions[MIN2(personIndex, (int)mySeatPositions.size() - 1)];
1088}
1089
1091GUIBaseVehicle::getContainerPosition(int containerIndex) const {
1093 return myContainerPositions[MIN2(containerIndex, (int)myContainerPositions.size() - 1)];
1094}
1095
1096
1097void
1099 if (myVehicle.myPersonDevice != nullptr) {
1100 const std::vector<MSTransportable*>& ps = myVehicle.myPersonDevice->getTransportables();
1101 int personIndex = 0;
1102 for (std::vector<MSTransportable*>::const_iterator i = ps.begin(); i != ps.end(); ++i) {
1103 GUIPerson* person = dynamic_cast<GUIPerson*>(*i);
1104 assert(person != 0);
1105 person->setPositionInVehicle(getSeatPosition(personIndex++));
1106 person->drawGL(s);
1107 }
1108 }
1109 if (myVehicle.myContainerDevice != nullptr) {
1110 const std::vector<MSTransportable*>& cs = myVehicle.myContainerDevice->getTransportables();
1111 int containerIndex = 0;
1112 for (std::vector<MSTransportable*>::const_iterator i = cs.begin(); i != cs.end(); ++i) {
1113 GUIContainer* container = dynamic_cast<GUIContainer*>(*i);
1114 assert(container != 0);
1115 container->setPositionInVehicle(getContainerPosition(containerIndex++));
1116 container->drawGL(s);
1117 }
1118 }
1119#ifdef DRAW_BOUNDING_BOX
1121 MSVehicle& microVeh = dynamic_cast<MSVehicle&>(myVehicle);
1124 glTranslated(0, 0, getType());
1125 PositionVector smallBB = microVeh.getBoundingPoly();
1126 glColor3d(0.5, .8, 0);
1127 GLHelper::drawBoxLines(smallBB, 0.3);
1128 glTranslated(0, 0, 0.1);
1129 PositionVector boundingBox = microVeh.getBoundingBox();
1130 boundingBox.push_back(boundingBox.front());
1131 glColor3d(1, 0, 0);
1132 GLHelper::drawBoxLines(boundingBox, 0.15);
1135 }
1136#endif
1137}
1138
1139bool
1143
1144bool
1146 if (getVType().getParameter().carriageLength > 0 &&
1148 drawAction_drawCarriageClass(s, scaledLength, asImage);
1149 return true;
1150 } else {
1152 s, getVType().getImgFile(), this, getVType().getWidth(), scaledLength)) {
1153 return false;
1154 }
1155 GUIBaseVehicleHelper::drawAction_drawVehicleAsPoly(s, getVType().getGuiShape(), getVType().getWidth(), scaledLength, -1, myVehicle.isStopped(), drawReversed(s));
1156 return false;
1157 }
1158}
1159
1160
1161int
1163 if (myVehicle.getPersonDevice() != nullptr) {
1164 return (int)myVehicle.getPersonDevice()->size();
1165 }
1166 return 0;
1167}
1168
1169
1170int
1172 if (myVehicle.getContainerDevice() != nullptr) {
1173 return (int)myVehicle.getContainerDevice()->size();
1174 }
1175 return 0;
1176}
1177
1178std::string
1180 std::vector<std::string> devs;
1181 for (MSDevice* d : myVehicle.getDevices()) {
1182 devs.push_back(d->deviceName());
1183 }
1184 return joinToString(devs, " ");
1185}
1186
1187
1188void
1189GUIBaseVehicle::computeSeats(const Position& front, const Position& back, double seatOffset, int maxSeats, double exaggeration, int& requiredSeats, Seats& into, double extraOffset) const {
1190 if (requiredSeats <= 0) {
1191 return;
1192 }
1193 maxSeats = MAX2(maxSeats, 1); // compute at least one seat
1194 seatOffset *= exaggeration;
1195 const double vehWidth = getVType().getSeatingWidth() * exaggeration;
1196 const double length = front.distanceTo2D(back);
1197 const int rowSize = MAX2(1, (int)floor(vehWidth / seatOffset));
1198 const double frontSeatPos = getVType().getFrontSeatPos() + extraOffset;
1199 const double rowOffset = MAX2(1.0, (length - frontSeatPos - 1)) / ceil((double)maxSeats / rowSize);
1200 const double sideOffset = (rowSize - 1) / 2.0 * seatOffset;
1201 double rowPos = frontSeatPos - rowOffset;
1202 double angle = back.angleTo2D(front);
1203 const int fillDirection = MSGlobals::gLefthand ? -1 : 1;
1204 //if (myVehicle.getID() == "v0") std::cout << SIMTIME << " seatOffset=" << seatOffset << " max=" << maxSeats << " ex=" << exaggeration << " req=" << requiredSeats << " rowSize=" << rowSize << " sideOffset=" << sideOffset << " front=" << front << " back=" << back << " a=" << angle << " da=" << RAD2DEG(angle) << "\n";
1205 for (int i = 0; requiredSeats > 0 && i < maxSeats; i++) {
1206 int seat = (i % rowSize);
1207 if (seat == 0) {
1208 rowPos += rowOffset;
1209 }
1210 into.push_back(Seat(PositionVector::positionAtOffset2D(front, back, rowPos, (sideOffset - seat * seatOffset) * fillDirection), angle));
1211 requiredSeats--;
1212 }
1213}
1214
1215
1216/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ MID_HIDE_ALLROUTES
Hide all vehicle's routes.
Definition GUIAppEnum.h:513
@ MID_HIDE_BEST_LANES
Hide vehicle's best lanes.
Definition GUIAppEnum.h:509
@ MID_HIDE_CURRENTROUTE
Hide vehicle's current route.
Definition GUIAppEnum.h:497
@ MID_SHOW_FOES
select foes of a vehicle
Definition GUIAppEnum.h:519
@ MID_SHOW_BEST_LANES
Show vehicle's best lanes.
Definition GUIAppEnum.h:507
@ MID_START_TRACK
Start to track a vehicle.
Definition GUIAppEnum.h:515
@ MID_SHOW_ALLROUTES
Show all vehicle's routes.
Definition GUIAppEnum.h:511
@ MID_SHOW_LFLINKITEMS
Definition GUIAppEnum.h:520
@ MID_SHOW_ROUTE_NOLOOPS
Show vehicle's future route (without loops)
Definition GUIAppEnum.h:503
@ MID_HIDE_ROUTE_NOLOOPS
Hide vehicle's future route (without loops)
Definition GUIAppEnum.h:505
@ MID_TOGGLE_STOP
toggle stop state of a vehicle or person
Definition GUIAppEnum.h:525
@ MID_HIDE_LFLINKITEMS
Definition GUIAppEnum.h:521
@ MID_REMOVE_OBJECT
remove a vehicle or person
Definition GUIAppEnum.h:527
@ MID_SHOW_FUTUREROUTE
Show vehicle's future route.
Definition GUIAppEnum.h:499
@ MID_HIDE_FUTUREROUTE
Hide vehicle's future route.
Definition GUIAppEnum.h:501
@ MID_SHOW_CURRENTROUTE
Show vehicle's current route.
Definition GUIAppEnum.h:495
@ MID_STOP_TRACK
Stop to track a vehicle.
Definition GUIAppEnum.h:517
@ MID_SELECT_TRANSPORTED
select transportables of a vehicle
Definition GUIAppEnum.h:523
FXDEFMAP(GUIBaseVehicle::GUIBaseVehiclePopupMenu) GUIBaseVehiclePopupMenuMap[]
@ GLO_VEHICLE
a vehicle
GUISelectedStorage gSelected
A global holder of selected objects.
GUIIcon
An enumeration of icons used by the gui applications.
Definition GUIIcons.h:33
#define RAD2DEG(x)
Definition GeomHelper.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define SIMSTEP
Definition SUMOTime.h:61
#define TIME2STEPS(x)
Definition SUMOTime.h:57
const long long int VTYPEPARS_COLOR_SET
@ RAIL_CARGO
render as a cargo train
@ EMERGENCY
render as an emergency vehicle
@ RAIL
render as a rail
@ SCOOTER
render as a scooter
@ RAIL_CAR
render as a (city) rail without locomotive
@ SHIP
render as a arbitrary ship
@ BICYCLE
render as a bicycle
@ MOTORCYCLE
render as a motorcycle
@ ANT
render as a giant ant
@ AIRCRAFT
render as aircraft
@ FIREBRIGADE
render as a fire brigade
@ MOPED
render as a moped
@ POLICE
render as a police car
@ PEDESTRIAN
render as a pedestrian
const long long int VEHPARS_COLOR_SET
const long long int VEHPARS_ARRIVALPOS_SET
T MIN2(T a, T b)
Definition StdDefs.h:80
T MAX2(T a, T b)
Definition StdDefs.h:86
const double SUMO_const_waitingContainerWidth
Definition StdDefs.h:58
const double SUMO_const_waitingPersonWidth
Definition StdDefs.h:56
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition ToString.h:283
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
Position getCenter() const
Returns the center of the boundary.
Definition Boundary.cpp:109
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition Boundary.cpp:75
double ymin() const
Returns minimum y-coordinate.
Definition Boundary.cpp:127
double xmin() const
Returns minimum x-coordinate.
Definition Boundary.cpp:115
Boundary & grow(double by)
extends the boundary by the given amount
Definition Boundary.cpp:340
double ymax() const
Returns maximum y-coordinate.
Definition Boundary.cpp:133
double xmax() const
Returns maximum x-coordinate.
Definition Boundary.cpp:121
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition GLHelper.cpp:649
static void drawOutlineCircle(double radius, double iRadius, int steps=8)
Draws an unfilled circle around (0,0)
Definition GLHelper.cpp:591
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 drawBoxLines(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double width, int cornerDetail=0, double offset=0)
Draws thick lines.
Definition GLHelper.cpp:348
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:742
static void drawTextSettings(const GUIVisualizationTextSettings &settings, const std::string &text, const Position &pos, const double scale, const double angle=0, const double layer=2048, const int align=0)
Definition GLHelper.cpp:773
long onCmdHideFutureRoute(FXObject *, FXSelector, void *)
Called if the current route of the vehicle shall be hidden.
long onCmdStartTrack(FXObject *, FXSelector, void *)
Called if the vehicle shall be tracked.
long onCmdHideBestLanes(FXObject *, FXSelector, void *)
Called if the vehicle's best lanes shall be hidden.
long onCmdHideCurrentRoute(FXObject *, FXSelector, void *)
Called if the current route of the vehicle shall be hidden.
long onCmdShowBestLanes(FXObject *, FXSelector, void *)
Called if the vehicle's best lanes shall be shown.
long onCmdShowRouteNoLoops(FXObject *, FXSelector, void *)
Called if the current route of the vehicle shall be shown.
long onCmdShowLFLinkItems(FXObject *, FXSelector, void *)
Called if all routes of the vehicle shall be shown.
long onCmdShowFoes(FXObject *, FXSelector, void *)
Called to show (select) a vehicles foes.
long onCmdHideRouteNoLoops(FXObject *, FXSelector, void *)
Called if the current route of the vehicle shall be hidden.
long onCmdShowFutureRoute(FXObject *, FXSelector, void *)
Called if the current route of the vehicle shall be shown.
long onCmdShowAllRoutes(FXObject *, FXSelector, void *)
Called if all routes of the vehicle shall be shown.
long onCmdToggleStop(FXObject *, FXSelector, void *)
Called when toggling stop state.
long onCmdStopTrack(FXObject *, FXSelector, void *)
Called if the current shall not be tracked any longer.
long onCmdSelectTransported(FXObject *, FXSelector, void *)
Called to select all riding persons and containers.
long onCmdRemoveObject(FXObject *, FXSelector, void *)
Called when removing the vehicle.
long onCmdHideAllRoutes(FXObject *, FXSelector, void *)
Called if all routes of the vehicle shall be hidden.
long onCmdHideLFLinkItems(FXObject *, FXSelector, void *)
Called if all routes of the vehicle shall be hidden.
long onCmdShowCurrentRoute(FXObject *, FXSelector, void *)
Called if the current route of the vehicle shall be shown.
static bool drawAction_drawVehicleAsImage(const GUIVisualizationSettings &s, const std::string &file, const GUIGlObject *o, const double width, double length)
try to draw vehicle as raster image and return true if successful
static void drawAction_drawVehicleAsCircle(const double width, double detail)
draw vehicle as a circle
static void drawAction_drawVehicleAsTrianglePlus(const double width, const double length, bool amReversed=false)
draw vehicle as a triangle
static void drawAction_drawVehicleAsPoly(const GUIVisualizationSettings &s, const SUMOVehicleShape shape, const double width, const double length, int carriageIndex=-1, bool isStopped=false, bool amReversed=false)
draw vehicle as a polygon
static void drawAction_drawVehicleAsBoxPlus(const double width, const double length, bool amReversed=false)
draw vehicle as a Box
A MSVehicle extended by some values for usage within the gui.
const Seat & getContainerPosition(int containerIndex) const
static bool setFunctionalColor(int activeScheme, const MSBaseVehicle *veh, RGBColor &col)
sets the color according to the current scheme index and some vehicle function
const std::string getOptionalName() const
Returns the value for generic parameter 'name' or ''.
virtual void drawAction_drawLinkItems(const GUIVisualizationSettings &) const
const Seat & getSeatPosition(int personIndex) const
returns the seat position for the person with the given index
RGBColor setColor(const GUIVisualizationSettings &s) const
sets the color according to the current settings
int getNumContainers() const
return the number of passengers
void drawOnPos(const GUIVisualizationSettings &s, const Position &pos, const double angle) const
Draws the object on the specified position with the specified angle.
GUIGLObjectPopupMenu * myPopup
current popup (to clean up in destructor). GUIBaseVehicle is not responsible for removal
void drawParkingInfo(const GUIVisualizationSettings &s) const
GUIBaseVehicle(MSBaseVehicle &vehicle)
MSDevice_Vehroutes * myRoutes
virtual void drawAction_drawPersonsAndContainers(const GUIVisualizationSettings &s) const
virtual void drawAction_drawCarriageClass(const GUIVisualizationSettings &s, double scaledLength, bool asImage) const =0
draws the given guiShape with distinct carriages/modules
bool hasActiveAddVisualisation(GUISUMOAbstractView *const parent, int which) const
Returns whether the named feature is enabled in the given view.
virtual void drawRouteHelper(const GUIVisualizationSettings &s, ConstMSRoutePtr r, bool future, bool noLoop, const RGBColor &col) const =0
Draws the route.
void removeActiveAddVisualisation(GUISUMOAbstractView *const parent, int which)
Adds the named visualisation feature to the given view.
void drawRoute(const GUIVisualizationSettings &s, int routeNo, double darken, bool future=false, bool noLoop=false) const
Chooses the route to draw and draws it, darkening it as given.
virtual Position getVisualPosition(bool s2, const double offset=0) const =0
Return current position taking into account secondary shape.
std::vector< Seat > Seats
MSBaseVehicle & myVehicle
The vehicle to which all calls should be delegated.
virtual void drawAction_drawVehicleBlinker(double) const
void removedPopupMenu()
notify object about popup menu removal
void addActiveAddVisualisation(GUISUMOAbstractView *const parent, int which)
Adds the named visualisation feature to the given view.
static void drawLinkItem(const Position &pos, SUMOTime arrivalTime, SUMOTime leaveTime, double exagerate)
double getScaleValue(const GUIVisualizationSettings &s, int activeScheme) const
gets the size multiplier value according to the current scheme index
virtual void drawBestLanes() const
Draws the vehicle's best lanes.
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
void drawChargingInfo(const GUIVisualizationSettings &s) const
virtual Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
@ VO_SHOW_LFLINKITEMS
LFLinkItems.
@ VO_SHOW_ALL_ROUTES
show all vehicle's routes
@ VO_TRACK
track the vehicle (only needed for cleaning up)
@ VO_SHOW_ROUTE_NOLOOP
show vehicle's routes without loops
@ VO_SHOW_FUTURE_ROUTE
show vehicle's current continued from the current position
@ VO_SHOW_ROUTE
show vehicle's current route
@ VO_SHOW_BEST_LANES
show vehicle's best lanes
virtual void drawGLAdditional(GUISUMOAbstractView *const parent, const GUIVisualizationSettings &s) const
Draws additionally triggered visualisations.
bool drawReversed(const GUIVisualizationSettings &s) const
whether to reverse trains in their reversed state
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
FXMutex myLock
The mutex used to avoid concurrent updates of the vehicle buffer.
virtual void drawAction_drawVehicleBrakeLight(double length, bool onlyOne=false) const
void computeSeats(const Position &front, const Position &back, double seatOffset, int maxSeats, double exaggeration, int &requiredSeats, Seats &into, double extraOffset=0) const
add seats to mySeatPositions and update requiredSeats
virtual double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const =0
gets the color value according to the current scheme index
int getNumPassengers() const
return the number of passengers
bool drawAction_drawVehicleAsPolyWithCarriagges(const GUIVisualizationSettings &s, double scaledLength, bool asImage=false) const
draw vehicle body and return whether carriages are being drawn
~GUIBaseVehicle()
destructor
double getExaggeration(const GUIVisualizationSettings &s) const
return exaggeration associated with this GLObject
virtual void drawAction_drawVehicleBlueLight() const
std::map< GUISUMOAbstractView *, int > myAdditionalVisualizations
Enabled visualisations, per view.
virtual void selectBlockingFoes() const =0
adds the blocking foes to the current selection
void drawStopLabels(const GUIVisualizationSettings &s, bool noLoop, const RGBColor &col) const
Seats mySeatPositions
positions of seats in the vehicle (updated at every drawing step)
const MSBaseVehicle & getVehicle()
std::string getDeviceDescription()
lists equipped device (types) for the current vehicle
virtual double getVisualAngle(bool s2) const =0
Returns the vehicle's direction in radians taking into account secondary shape.
const MSVehicleType & getVType() const
A shortcut to myVehicle.myType.
A lane area vehicles can halt at (gui-version)
const Position & getSignPos() const
void setPositionInVehicle(const GUIBaseVehicle::Seat &pos)
void drawGL(const GUIVisualizationSettings &s) const override
Draws the object.
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
The popup menu of a globject.
GUISUMOAbstractView * getParentView()
return the real owner of this popup
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app, bool addSeparator=true) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
void buildShowTypeParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the type parameter window.
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
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.
GUIGlID getGlID() const
Returns the numerical id of the object.
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0, bool forceShow=false) const
draw name of item
static bool gSecondaryShape
whether secondary shapes are currently being drawn
Definition GUIGlobals.h:49
A MSNet extended by some values for usage within the gui.
Definition GUINet.h:82
A lane area vehicles can halt at (gui-version)
const Position & getSignPos() const
void setPositionInVehicle(const GUIBaseVehicle::Seat &pos)
void drawGL(const GUIVisualizationSettings &s) const override
Draws the object.
T getColor(const double value) const
bool removeAdditionalGLVisualisation(GUIGlObject *const which)
Removes an object from the list of objects that show additional things.
void destroyPopup()
destroys the popup
bool addAdditionalGLVisualisation(GUIGlObject *const which)
Adds an object to call its additional visualisation method.
virtual GUIGlID getTrackedID() const
get tracked id
void select(GUIGlID id, bool update=true)
Adds the object with the given id.
Stores the information about how to visualize structures.
GUIVisualizationTextSettings vehicleName
GUIVisualizationSizeSettings vehicleSize
bool showBlinker
Information whether vehicle blinkers shall be drawn.
GUIColorer vehicleColorer
The vehicle colorer.
GUIVisualizationTextSettings vehicleScaleValue
bool trueZ
drawl all objects according to their z data
std::string vehicleScaleParam
key for scaling by vehicle parameter
bool showParkingInfo
Set whether parking related information should be shown.
GUIVisualizationTextSettings vehicleValue
int vehicleQuality
The quality of vehicle drawing.
double laneWidthExaggeration
The lane exaggeration (upscale thickness)
std::string vehicleTextParam
key for rendering vehicle textual parameter
bool scaleLength
Whether vehicle length shall be scaled with length/geometry factor.
GUIScaler vehicleScaler
The size scaling settings for vehicles.
bool showChargingInfo
Set whether the charging search related information should be shown.
double scale
information about a lane's width (temporary, used for a single view)
bool secondaryShape
whether secondary lane shape shall be drawn
bool drawMinGap
Information whether the minimum gap shall be drawn.
GUIVisualizationTextSettings vehicleText
bool showBTRange
Information whether the communication range shall be drawn.
bool drawReversed
Whether to draw reversed vehicles in their reversed state.
bool drawBrakeGap
Information whether the brake gap shall be drawn.
bool drawLaneChangePreference
Information whether the lane change preference shall be drawn.
double angle
The current view rotation angle.
static double naviDegree(const double angle)
void vaporizeCar(MEVehicle *v, MSMoveReminder::Notification reason)
remove the given car and clean up the relevant data structures
Definition MELoop.cpp:266
A vehicle from the mesoscopic point of view.
Definition MEVehicle.h:42
The base class for microscopic and mesoscopic vehicles.
ConstMSRoutePtr getRoutePtr() const
Returns the current route.
virtual bool isSelected() const
whether this vehicle is selected in the GUI
const StoppingPlaceMemory * getParkingMemory() const
const std::vector< MSTransportable * > & getPersons() const
retrieve riding persons
const std::vector< MSVehicleDevice * > & getDevices() const
Returns this vehicle's devices.
virtual double getArrivalPos() const
Returns this vehicle's desired arrivalPos for its current route (may change on reroute)
virtual double getStopDelay() const
Returns the estimated public transport stop (departure) delay in seconds.
MoveReminderCont myMoveReminders
Currently relevant move reminders.
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
int getNumberParkingReroutes() const
std::vector< MSVehicleDevice * > myDevices
The devices this vehicle has.
virtual const MSEdge * getCurrentEdge() const
Returns the edge the vehicle is currently at (possibly an internal edge)
bool isReversed() const
Returns whether the logical state of the vehicle is reversed - for drawing.
virtual double getTimeLossSeconds() const
Returns the time loss in seconds.
const MSRouteIterator & getCurrentRouteEdge() const
Returns an iterator pointing to the current edge in this vehicles route.
bool isParking() const
Returns whether the vehicle is parking.
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
virtual int getArrivalLane() const
MSDevice_Transportable * myContainerDevice
The containers this vehicle may have.
const std::list< MSStop > & getStops() const
double getWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s)
const MSDevice_Transportable * getPersonDevice() const
MSDevice_Transportable * myPersonDevice
The passengers this vehicle may have.
const MSStop & getNextStop() const
std::string getPrefixedParameter(const std::string &key, std::string &error) const
retrieve parameters of devices, models and the vehicle itself
virtual double getStopArrivalDelay() const
Returns the estimated public transport stop arrival delay in seconds.
bool isStoppedTriggered() const
Returns whether the vehicle is on a triggered stop.
virtual double getAcceleration() const
Returns the vehicle's acceleration.
virtual double getRightSideOnEdge(const MSLane *lane=0) const
Get the vehicle's lateral position on the edge of the given lane (or its current edge if lane == 0)
const MSRoute & getRoute() const
Returns the current route.
const MSDevice_Transportable * getContainerDevice() const
SUMOTime getDepartDelay() const
Returns the depart delay.
int getNumberReroutes() const
Returns the number of new routes this vehicle got.
virtual bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
const std::vector< MSTransportable * > & getContainers() const
retrieve riding containers
const StoppingPlaceMemory * getChargingMemory() const
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
bool isStopped() const
Returns whether the vehicle is at a stop.
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists, nullptr otherwise.
double brakeGap(const double speed) const
Returns the distance the vehicle needs to halt including driver's reaction time tau (i....
Definition MSCFModel.h:408
static double getRange()
Returns the configured range.
const std::vector< MSTransportable * > & getTransportables() const
Returns the list of transportables using this vehicle.
int size() const
Return the number of passengers / containers.
ConstMSRoutePtr getRoute(int index) const
Called on route retrieval.
static MSDevice_Vehroutes * buildVehicleDevices(SUMOVehicle &v, std::vector< MSVehicleDevice * > &into, int maxRoutes=std::numeric_limits< int >::max())
Build devices for the given vehicle, if needed.
Abstract in-vehicle / in-person device.
Definition MSDevice.h:62
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
double getWidth() const
Returns the edges's width (sum over all lanes)
Definition MSEdge.h:664
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the maximum speed the vehicle may use on this edge.
Definition MSEdge.cpp:1180
static bool gUseMesoSim
Definition MSGlobals.h:106
static MELoop * gMesoNet
mesoscopic simulation infrastructure
Definition MSGlobals.h:112
static bool gLefthand
Whether lefthand-drive is being simulated.
Definition MSGlobals.h:174
static bool gUseStopEnded
whether the simulation should replay previous stop times
Definition MSGlobals.h:133
Representation of a lane in the micro simulation.
Definition MSLane.h:84
virtual MSVehicle * removeVehicle(MSVehicle *remVehicle, MSMoveReminder::Notification notification, bool notify=true)
Definition MSLane.cpp:2833
virtual double getLengthGeometryFactor(bool) const
Definition MSLane.h:290
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition MSLane.h:574
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
Definition MSLane.h:483
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
Definition MSLane.h:513
virtual const PositionVector & getShape(bool) const
Definition MSLane.h:294
double getWidth() const
Returns the lane's width.
Definition MSLane.h:640
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition MSLane.h:560
@ NOTIFICATION_VAPORIZED_GUI
The vehicle got removed via the GUI.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:186
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:392
bool parkOnRoad() const
whether vehicles park on the road
const ConstMSEdgeVector & getEdges() const
Definition MSRoute.h:125
const RGBColor & getColor() const
Returns the color.
Definition MSRoute.cpp:395
MSParkingArea * parkingarea
(Optional) parkingArea if one is assigned to the stop
Definition MSStop.h:58
double getUpscaleLength() const
void scheduleVehicleRemoval(SUMOVehicle *veh, bool checkDuplicate=false)
Removes a vehicle after it has ended.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
double getTimeGapOnLane() const
Returns the time gap in seconds to the leader of the vehicle on the same lane.
PositionVector getBoundingPoly(double offset=0) const
get bounding polygon
double getAccumulatedWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s) within the last millisecs.
Definition MSVehicle.h:714
MSAbstractLaneChangeModel & getLaneChangeModel()
bool addTraciStop(SUMOVehicleParameter::Stop stop, std::string &errorMsg)
PositionVector getBoundingBox(double offset=0) const
get bounding rectangle
void onRemovalFromNet(const MSMoveReminder::Notification reason)
Called when the vehicle is removed from the network.
bool resumeFromStopping()
int getBestLaneOffset() const
const MSLane * getLane() const
Returns the lane the vehicle is on.
Definition MSVehicle.h:581
MSLane * getMutableLane() const
Returns the lane the vehicle is on Non const version indicates that something volatile is going on.
Definition MSVehicle.h:589
std::pair< const MSLane *, double > getLanePosAfterDist(double distance) const
return lane and position along bestlanes at the given distance
double getSpeed() const
Returns the vehicle's current speed.
Definition MSVehicle.h:490
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
Definition MSVehicle.h:969
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
double getSeatingWidth() const
Get the width of the passenger compartment when being drawn.
double getMinGap() const
Get the free space in front of vehicles of this class.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
double getFrontSeatPos() const
Get offset of first seat from vehicle front.
double getLength() const
Get vehicle's length [m].
SUMOVehicleShape getGuiShape() const
Get this vehicle type's shape.
const RGBColor & getColor() const
Returns this type's color.
const std::string & getID() const
Returns the id.
Definition Named.h:74
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
Definition Position.h:273
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimensions
Definition Position.h:263
double x() const
Returns the x-position.
Definition Position.h:52
double z() const
Returns the z-position.
Definition Position.h:62
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position (in radians bet...
Definition Position.h:283
double y() const
Returns the y-position.
Definition Position.h:57
A list of positions.
PositionVector getOrthogonal(const Position &p, double extend, bool before, double length=1.0, double deg=90) const
return orthogonal through p (extending this vector if necessary)
Position positionAtOffset2D(double pos, double lateralOffset=0, bool extrapolateBeyond=false) const
Returns the position at the given length.
static const RGBColor WHITE
Definition RGBColor.h:195
static const RGBColor BLUE
Definition RGBColor.h:190
unsigned char alpha() const
Returns the alpha-amount of the color.
Definition RGBColor.cpp:92
RGBColor multiply(double factor) const
Returns a new color with altered brightness.
Definition RGBColor.cpp:230
static const RGBColor GREEN
Definition RGBColor.h:189
static RGBColor fromHSV(double h, double s, double v)
Converts the given hsv-triplet to rgb, inspired by http://alvyray.com/Papers/CG/hsv2rgb....
Definition RGBColor.cpp:403
static const RGBColor BLACK
Definition RGBColor.h:196
RGBColor changedBrightness(int change, int toChange=3) const
Returns a new color with altered brightness.
Definition RGBColor.cpp:200
static const RGBColor DEFAULT_COLOR
The default color (for vehicle types and vehicles)
Definition RGBColor.h:202
static const RGBColor RED
named colors
Definition RGBColor.h:188
virtual const MSLane * getLane() const =0
Returns the lane the object is currently at.
virtual double getSpeed() const =0
Returns the object's current speed.
virtual double getPositionOnLane() const =0
Get the object's position along the lane.
virtual double getAngle() const =0
Get the vehicle's angle.
Definition of vehicle stop (position and duration)
std::string lane
The lane to stop at.
double startPos
The stopping position start.
double endPos
The stopping position end.
SUMOTime duration
The stopping duration.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
RGBColor color
The vehicle's color, TraCI may change this.
int arrivalEdge
(optional) The final edge within the route of the vehicle
std::string line
The vehicle's line (mainly for public transport)
static const int NEWLINE
identifier for splitting the given string at all newline characters
std::vector< std::string > getVector()
return vector of strings
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
#define M_PI
Definition odrSpiral.cpp:45
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values
bool constantSizeSelected
whether only selected objects shall be drawn with constant
bool show(const GUIGlObject *o) const
whether to show the text
double scaledSize(double scale, double constFactor=0.1) const
get scale size