Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUIVehicle.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-2026 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// A MSVehicle extended by some values for usage within the gui
21/****************************************************************************/
22#include <config.h>
23
24#include <cmath>
25#include <vector>
26#include <string>
27#include <bitset>
43#include <microsim/MSGlobals.h>
44#include <microsim/MSVehicle.h>
45#include <microsim/MSJunction.h>
46#include <microsim/MSLane.h>
47#include <microsim/MSLink.h>
48#include <microsim/MSStop.h>
63#include <gui/GUIGlobals.h>
64#include "GUIVehicle.h"
65#include "GUIPerson.h"
66#include "GUIContainer.h"
67#include "GUINet.h"
68#include "GUIEdge.h"
69#include "GUILane.h"
70
71#define SPEEDMODE_DEFAULT 31
72#define LANECHANGEMODE_DEFAULT 1621
73//#define DEBUG_FOES
74
75
76// ===========================================================================
77// member method definitions
78// ===========================================================================
79/* -------------------------------------------------------------------------
80 * GUIVehicle - methods
81 * ----------------------------------------------------------------------- */
82#ifdef _MSC_VER
83#pragma warning(push)
84#pragma warning(disable: 4355) // mask warning about "this" in initializers
85#endif
87 MSVehicleType* type, const double speedFactor) :
88 MSVehicle(pars, route, type, speedFactor),
89 GUIBaseVehicle((MSBaseVehicle&) * this) {
90}
91#ifdef _MSC_VER
92#pragma warning(pop)
93#endif
94
95
100
101
105 const bool isElecHybrid = getDevice(typeid(MSDevice_ElecHybrid)) != nullptr ? true : false;
106 const bool hasBattery = getDevice(typeid(MSDevice_Battery)) != nullptr;
108 // add items
109 ret->mkItem(TL("lane [id]"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLaneID));
111 ret->mkItem(TL("shadow lane [id]"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getShadowLaneID));
112 }
114 ret->mkItem(TL("target lane [id]"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getTargetLaneID));
115 }
116 if (isSelected()) {
117 ret->mkItem(TL("back lanes [id,..]"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getBackLaneIDs));
118 }
119 ret->mkItem(TL("position [m]"), true,
121 ret->mkItem(TL("lateral offset [m]"), true,
123 ret->mkItem(TL("speed [m/s]"), true,
125 ret->mkItem(TL("lateral speed [m/s]"), true,
127 ret->mkItem(TL("acceleration [m/s^2]"), true,
129 ret->mkItem(TL("angle [degree]"), true,
131 ret->mkItem(TL("slope [degree]"), true,
133 ret->mkItem(TL("speed factor"), true,
135 ret->mkItem(TL("time gap on lane [s]"), true,
137 ret->mkItem(TL("waiting time [s]"), true,
139 ret->mkItem(TLF("waiting time (accumulated, % s) [s]", time2string(MSGlobals::gWaitingTimeMemory)).c_str(), true,
141 ret->mkItem(TL("time since startup [s]"), true,
143 ret->mkItem(TL("time loss [s]"), true,
145 ret->mkItem(TL("impatience"), true,
147 ret->mkItem(TL("last lane change [s]"), true,
149 ret->mkItem(TL("desired depart [s]"), false, time2string(getParameter().depart));
150 ret->mkItem(TL("depart delay [s]"), false, time2string(getDepartDelay()));
151 ret->mkItem(TL("odometer [m]"), true,
153 if (getParameter().repetitionNumber < std::numeric_limits<long long int>::max()) {
154 ret->mkItem(TL("remaining [#]"), false, (long long int) getParameter().repetitionNumber - getParameter().repetitionsDone);
155 }
156 if (getParameter().repetitionOffset > 0) {
157 ret->mkItem(TL("insertion period [s]"), false, time2string(getParameter().repetitionOffset));
158 }
159 if (getParameter().repetitionProbability > 0) {
160 ret->mkItem(TL("insertion probability"), false, getParameter().repetitionProbability);
161 }
162 if (getParameter().poissonRate > 0) {
163 ret->mkItem(TL("poisson rate"), false, getParameter().poissonRate);
164 }
165 ret->mkItem(TL("stop info"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getStopInfo));
166 ret->mkItem(TL("line"), false, myParameter->line);
167 ret->mkItem(TL("CO2 [mg/s]"), true,
168 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::CO2>));
169 ret->mkItem(TL("CO [mg/s]"), true,
170 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::CO>));
171 ret->mkItem(TL("HC [mg/s]"), true,
172 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::HC>));
173 ret->mkItem(TL("NOx [mg/s]"), true,
174 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::NO_X>));
175 ret->mkItem(TL("PMx [mg/s]"), true,
176 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::PM_X>));
177 ret->mkItem(TL("fuel [mg/s]"), true,
178 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::FUEL>));
179 ret->mkItem(TL("electricity [Wh/s]"), true,
180 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::ELEC>));
181 ret->mkItem(TL("noise (Harmonoise) [dB]"), true,
183 ret->mkItem(TL("devices"), false, getDeviceDescription());
184 ret->mkItem(TL("persons"), true,
186 ret->mkItem(TL("containers"), true,
188 ret->mkItem(TL("lcState right"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLCStateRight));
189 ret->mkItem(TL("lcState left"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLCStateLeft));
190 ret->mkItem(TL("parking badges"), false, joinToString(getParkingBadges(), " "));
191 // close building
193 ret->mkItem(TL("lcState center"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLCStateCenter));
194 ret->mkItem(TL("right side on edge [m]"), true, new FunctionBinding<GUIVehicle, double>(this, &GUIVehicle::getRightSideOnEdge2));
195 ret->mkItem(TL("left side on edge [m]"), true, new FunctionBinding<GUIVehicle, double>(this, &GUIVehicle::getLeftSideOnEdge));
196 ret->mkItem(TL("rightmost edge sublane [#]"), true, new FunctionBinding<GUIVehicle, int>(this, &GUIVehicle::getRightSublaneOnEdge));
197 ret->mkItem(TL("leftmost edge sublane [#]"), true, new FunctionBinding<GUIVehicle, int>(this, &GUIVehicle::getLeftSublaneOnEdge));
198 ret->mkItem(TL("lane change maneuver distance [m]"), true, new FunctionBinding<GUIVehicle, double>(this, &GUIVehicle::getManeuverDist));
199 }
200 if (isRailway(getVClass())) {
201 ret->mkItem(TL("driveways"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getDriveWays));
202 }
203 if (hasBattery || isElecHybrid) {
204 ret->mkItem(TL("present state of charge [Wh]"), true,
206 }
207 if (hasBattery) {
208 ret->mkItem(TL("relative state of charge (SoC) [-]"), true,
210 ret->mkItem(TL("current timestep charge [Wh]"), true,
212 ret->mkItem(TL("maximum charge rate [W]"), true,
214 }
215 if (isElecHybrid) {
216 ret->mkItem(TL("present electric current [A]"), true,
218 }
219 if (hasInfluencer()) {
221 ret->mkItem(TL("speed mode"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getSpeedMode));
222 }
224 ret->mkItem(TL("lane change mode"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLaneChangeMode));
225 }
226 }
228 return ret;
229}
230
231
234 GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this, "vType:" + myType->getID());
235 ret->mkItem(TL("type"), false, myType->getID());
236 ret->mkItem(TL("length [m]"), false, myType->getLength());
237 ret->mkItem(TL("width [m]"), false, myType->getWidth());
238 ret->mkItem(TL("height [m]"), false, myType->getHeight());
239 ret->mkItem(TL("minGap [m]"), false, myType->getMinGap());
240 ret->mkItem(TL("vehicle class"), false, SumoVehicleClassStrings.getString(myType->getVehicleClass()));
241 ret->mkItem(TL("emission class"), false, PollutantsInterface::getName(myType->getEmissionClass()));
242 ret->mkItem(TL("mass [kg]"), false, myType->getMass());
243 ret->mkItem(TL("car-following model"), false, SUMOXMLDefinitions::CarFollowModels.getString((SumoXMLTag)getCarFollowModel().getModelID()));
244 ret->mkItem(TL("lane-change model"), false, SUMOXMLDefinitions::LaneChangeModels.getString(getLaneChangeModel().getModelID()));
245 ret->mkItem(TL("guiShape"), false, getVehicleShapeName(myType->getGuiShape()));
246 ret->mkItem(TL("maximum speed [m/s]"), false, getVehicleType().getMaxSpeed());
247 ret->mkItem(TL("desired maximum speed [m/s]"), false, getVehicleType().getDesiredMaxSpeed());
248 ret->mkItem(TL("maximum acceleration [m/s^2]"), false, getCarFollowModel().getMaxAccel());
249 ret->mkItem(TL("maximum deceleration [m/s^2]"), false, getCarFollowModel().getMaxDecel());
250 ret->mkItem(TL("emergency deceleration [m/s^2]"), false, getCarFollowModel().getEmergencyDecel());
251 ret->mkItem(TL("apparent deceleration [m/s^2]"), false, getCarFollowModel().getApparentDecel());
252 ret->mkItem(TL("imperfection (sigma)"), false, getCarFollowModel().getImperfection());
253 ret->mkItem(TL("desired headway (tau) [s]"), false, getCarFollowModel().getHeadwayTime());
254 ret->mkItem(TL("speedfactor"), false, myType->getParameter().speedFactor.toStr(gPrecision));
255 ret->mkItem(TL("startupDelay [s]"), false, STEPS2TIME(getCarFollowModel().getStartupDelay()));
257 ret->mkItem(TL("action step length [s]"), false, myType->getActionStepLengthSecs());
258 }
259 ret->mkItem(TL("person capacity"), false, myType->getPersonCapacity());
260 ret->mkItem(TL("boarding time [s]"), false, STEPS2TIME(myType->getLoadingDuration(true)));
261 ret->mkItem(TL("container capacity"), false, myType->getContainerCapacity());
262 ret->mkItem(TL("loading time [s]"), false, STEPS2TIME(myType->getLoadingDuration(false)));
264 ret->mkItem(TL("minGapLat [m]"), false, myType->getMinGapLat());
265 ret->mkItem(TL("maxSpeedLat [m/s]"), false, myType->getMaxSpeedLat());
266 ret->mkItem(TL("latAlignment"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getDynamicAlignment));
267 } else if (MSGlobals::gLaneChangeDuration > 0) {
268 ret->mkItem(TL("maxSpeedLat [m/s]"), false, myType->getMaxSpeedLat());
269 }
270 for (auto item : myType->getParameter().lcParameter) {
271 ret->mkItem(toString(item.first).c_str(), false, toString(item.second));
272 }
273 for (auto item : myType->getParameter().jmParameter) {
274 ret->mkItem(toString(item.first).c_str(), false, toString(item.second));
275 }
277 ret->mkItem(TL("manoeuver Angle vs Times"), false, myType->getParameter().getManoeuverAngleTimesS());
278 }
280 return ret;
281}
282
283
284std::string
289 std::string align2 = toString(getLaneChangeModel().getDesiredAlignment());
290 if (align2 != align) {
291 align = align2 + " (default: " + align + ")";
292 }
293 return align;
294}
295
296void
298 glTranslated(0, 0, getType() + .2); // draw on top of cars
299 for (DriveItemVector::const_iterator i = myLFLinkLanes.begin(); i != myLFLinkLanes.end(); ++i) {
300 if ((*i).myLink == nullptr) {
301 continue;
302 }
303 MSLink* link = (*i).myLink;
304 MSLane* via = link->getViaLaneOrLane();
305 if (via != nullptr) {
306 Position p = via->getShape()[0];
307 if ((*i).mySetRequest) {
308 glColor3d(0, .8, 0);
309 } else {
310 glColor3d(.8, 0, 0);
311 }
312 const SUMOTime leaveTime = (*i).myLink->getLeaveTime(
313 (*i).myArrivalTime, (*i).myArrivalSpeed, (*i).getLeaveSpeed(), getVehicleType().getLength());
314 drawLinkItem(p, (*i).myArrivalTime, leaveTime, s.vehicleName.size / s.scale);
315 // the time slot that ego vehicle uses when checking opened may
316 // differ from the one it requests in setApproaching
317 MSLink::ApproachingVehicleInformation avi = (*i).myLink->getApproaching(this);
318 assert(avi.arrivalTime == (*i).myArrivalTime && avi.leavingTime == leaveTime);
319 UNUSED_PARAMETER(avi); // only used for assertion
320 }
321 }
322 glTranslated(0, 0, getType() - .2); // draw on top of cars
323}
324
325
326void
327GUIVehicle::drawAction_drawCarriageClass(const GUIVisualizationSettings& s, double scaledLength, bool asImage) const {
328 RGBColor current = GLHelper::getColor();
329 RGBColor darker = current.changedBrightness(-51);
330 const double exaggeration = (s.vehicleSize.getExaggeration(s, this)
332 if (exaggeration == 0) {
333 return;
334 }
335 MSTrainHelper trainHelper(this, scaledLength, isReversed() && s.drawReversed, s.secondaryShape, exaggeration, s.vehicleQuality);
336 const int numCarriages = trainHelper.getNumCarriages();
337 const int firstPassengerCarriage = trainHelper.getFirstPassengerCarriage();
338 const int noPersonsBackCarriages = (getVehicleType().getGuiShape() == SUMOVehicleShape::TRUCK_SEMITRAILER || getVehicleType().getGuiShape() == SUMOVehicleShape::TRUCK_1TRAILER) && numCarriages > 1 ? 1 : 0;
339 const int firstContainerCarriage = numCarriages == 1 || getVehicleType().getGuiShape() == SUMOVehicleShape::TRUCK_1TRAILER ? 0 : 1;
340 const int seatsPerCarriage = (int)ceil(getVType().getPersonCapacity() / (numCarriages - firstPassengerCarriage - noPersonsBackCarriages));
341 const int containersPerCarriage = (int)ceil(getVType().getContainerCapacity() / (numCarriages - firstContainerCarriage));
342 // Handle seats.
343 int requiredSeats = getNumPassengers();
344 int requiredPositions = getNumContainers();
345 if (requiredSeats > 0) {
346 mySeatPositions.clear();
347 }
348 if (requiredPositions > 0) {
349 myContainerPositions.clear();
350 }
351 GLHelper::popMatrix(); // undo initial translation and rotation
352 const double xCornerCut = 0.3 * exaggeration;
353 const double yCornerCut = MIN2(0.4 * trainHelper.getUpscaleLength(), trainHelper.getUpscaleLength() * scaledLength / 4);
354 Position front, back;
355 double angle = 0.0;
356 double curCLength = trainHelper.getFirstCarriageLength();
357 const std::vector<MSTrainHelper::Carriage*>& carriages = trainHelper.getCarriages();
358 for (int i = 0; i < numCarriages; ++i) {
359 front = carriages[i]->front;
360 back = carriages[i]->back;
361 if (front == back) {
362 // No place for drawing available.
363 continue;
364 }
365 const double drawnCarriageLength = front.distanceTo2D(back);
366 angle = atan2((front.x() - back.x()), (back.y() - front.y())) * (double) 180.0 / (double) M_PI;
367 // if we are in reverse 'first' carriages are drawn last so the >= test doesn't work
368 const bool reversed = trainHelper.isReversed();
369 if (reversed) {
370 if (i <= numCarriages - firstPassengerCarriage) {
371 computeSeats(back, front, SUMO_const_waitingPersonWidth, seatsPerCarriage, exaggeration, requiredSeats, mySeatPositions);
372 }
373 if (i <= numCarriages - firstContainerCarriage) {
374 computeSeats(front, back, SUMO_const_waitingContainerWidth, containersPerCarriage, exaggeration, requiredPositions, myContainerPositions);
375 }
376 } else {
377 if (i >= firstPassengerCarriage) {
378 computeSeats(front, back, SUMO_const_waitingPersonWidth, seatsPerCarriage, exaggeration, requiredSeats, mySeatPositions);
379 }
380 if (i >= firstContainerCarriage) {
381 computeSeats(front, back, SUMO_const_waitingContainerWidth, containersPerCarriage, exaggeration, requiredPositions, myContainerPositions);
382 }
383 }
384 curCLength = (i == trainHelper.getFirstCarriageNo() ? trainHelper.getFirstCarriageLength() : trainHelper.getCarriageLength());
386 if (s.trueZ) {
387 glTranslated(front.x(), front.y(), front.z() + 1);
388 } else {
389 glTranslated(front.x(), front.y(), getType());
390 }
391 glRotated(angle, 0, 0, 1);
392 double halfWidth = trainHelper.getHalfWidth();
393 std::string imgFile = getVType().getImgFile();
394 if (asImage && i != trainHelper.getFirstCarriageNo()) {
395 const size_t nImages = getVType().getParameter().carriageImages.size();
396 if (nImages > 0) {
397 const int carIndex = trainHelper.isReversed() ? numCarriages - i : i;
398 imgFile = getVType().getParameter().carriageImages[MIN2((int)nImages - 1, carIndex - 1)];
399 }
400 }
401 if (!asImage || !GUIBaseVehicleHelper::drawAction_drawVehicleAsImage(s, imgFile, this, getVType().getWidth() * exaggeration, curCLength)) {
402 switch (getVType().getGuiShape()) {
405 if (i == trainHelper.getFirstCarriageNo()) { // at the moment amReversed is only ever set for rail - so has no impact in this call
407 if (getVType().getGuiShape() == SUMOVehicleShape::TRUCK_SEMITRAILER) {
408 // default drawing uses a fixed cab length but we want to scale here
409 glScaled(1, curCLength / 2.5, 1);
410 }
411 GUIBaseVehicleHelper::drawAction_drawVehicleAsPoly(s, getVType().getGuiShape(), getVType().getWidth() * exaggeration, curCLength, 0, false, reversed);
413 } else {
414 GLHelper::setColor(current);
415 GLHelper::drawBoxLine(Position(0, 0), 180, curCLength, halfWidth);
416 }
417 break;
418 default: {
419 if (i == trainHelper.getFirstCarriageNo()) {
420 GLHelper::setColor(darker);
421 } else {
422 GLHelper::setColor(current);
423 }
424 // generic rail carriage
425 glBegin(GL_TRIANGLE_FAN);
426 glVertex2d(-halfWidth + xCornerCut, 0);
427 glVertex2d(-halfWidth, yCornerCut);
428 glVertex2d(-halfWidth, drawnCarriageLength - yCornerCut);
429 glVertex2d(-halfWidth + xCornerCut, drawnCarriageLength);
430 glVertex2d(halfWidth - xCornerCut, drawnCarriageLength);
431 glVertex2d(halfWidth, drawnCarriageLength - yCornerCut);
432 glVertex2d(halfWidth, yCornerCut);
433 glVertex2d(halfWidth - xCornerCut, 0);
434 glEnd();
435 // indicate front of the head of the train
436 if (i == trainHelper.getFirstCarriageNo()) {
437 glTranslated(0, 0, 0.1);
438 glColor3d(0, 0, 0);
439 glBegin(GL_TRIANGLE_FAN);
440 if (reversed) { // not quite correct as its drawing at the wrong end of the locomotive - however useful as visual indicator of reverse?
441 glVertex2d(-halfWidth + xCornerCut, yCornerCut);
442 glVertex2d(-halfWidth + 2 * xCornerCut, 3 * yCornerCut);
443 glVertex2d(halfWidth - 2 * xCornerCut, 3 * yCornerCut);
444 glVertex2d(halfWidth - xCornerCut, yCornerCut);
445 } else {
446 glVertex2d(-halfWidth + 2 * xCornerCut, yCornerCut);
447 glVertex2d(-halfWidth + xCornerCut, 3 * yCornerCut);
448 glVertex2d(halfWidth - xCornerCut, 3 * yCornerCut);
449 glVertex2d(halfWidth - 2 * xCornerCut, yCornerCut);
450 }
451 glEnd();
452 glTranslated(0, 0, -0.1);
453 }
454 }
455 }
456 }
458 }
459 if (getVType().getGuiShape() == SUMOVehicleShape::RAIL_CAR) {
461 if (s.trueZ) {
462 glTranslated(front.x(), front.y(), front.z() + 1);
463 } else {
464 glTranslated(front.x(), front.y(), getType());
465 }
466 glRotated(angle, 0, 0, 1);
470 }
471 // restore matrix
473 front = getPosition();
474 glTranslated(front.x(), front.y(), getType());
475 const double degAngle = RAD2DEG(getAngle() + M_PI / 2.);
476 glRotated(degAngle, 0, 0, 1);
477 glScaled(exaggeration, trainHelper.getUpscaleLength(), 1);
478 if (mySeatPositions.size() == 0) {
479 mySeatPositions.push_back(Seat(back, DEG2RAD(angle)));
480 }
481 if (myContainerPositions.size() == 0) {
482 myContainerPositions.push_back(Seat(back, DEG2RAD(angle)));
483 }
484}
485
486#define BLINKER_POS_FRONT .5
487#define BLINKER_POS_BACK .5
488
489inline void
490drawAction_drawBlinker(double dir, double length) {
491 glColor3d(1.f, .8f, 0);
493 glTranslated(dir, BLINKER_POS_FRONT, -0.1);
497 glTranslated(dir, length - BLINKER_POS_BACK, -0.1);
500}
501
502
503void
520
521
522inline void
523GUIVehicle::drawAction_drawVehicleBrakeLight(double length, bool onlyOne) const {
525 return;
526 }
527 glColor3f(1.f, .2f, 0);
529 if (onlyOne) {
530 glTranslated(0, length, -0.1);
532 } else {
533 glTranslated(-getVehicleType().getWidth() * 0.5, length, -0.1);
537 glTranslated(getVehicleType().getWidth() * 0.5, length, -0.1);
539 }
541}
542
543inline void
547 glTranslated(0, 2.5, .5);
548 glColor3f(0, 0, 1);
551 }
552}
553
554
555double
556GUIVehicle::getColorValue(const GUIVisualizationSettings& s, int activeScheme) const {
557 switch (activeScheme) {
558 case 8:
559 if (isStopped() && getNextStop().getSpeed() <= 0) {
560 return isParking() ? -2 : -1;
561 }
562 return getSpeed();
563 case 9:
564 // color by action step
565 if (isActionStep(SIMSTEP)) {
566 // Upcoming simstep is actionstep (t was already increased before drawing)
567 return 1.;
568 } else if (isActive()) {
569 // Completed simstep was actionstep
570 return 2.;
571 } else {
572 // not active
573 return 0.;
574 }
575 case 10:
576 return getWaitingSeconds();
577 case 11:
579 case 12:
581 case 13:
582 return getLane()->getVehicleMaxSpeed(this);
583 case 14:
584 return getEmissions<PollutantsInterface::CO2>();
585 case 15:
586 return getEmissions<PollutantsInterface::CO>();
587 case 16:
588 return getEmissions<PollutantsInterface::PM_X>();
589 case 17:
590 return getEmissions<PollutantsInterface::NO_X>();
591 case 18:
592 return getEmissions<PollutantsInterface::HC>();
593 case 19:
594 return getEmissions<PollutantsInterface::FUEL>();
595 case 20:
597 case 21:
598 return getNumberReroutes();
599 case 22:
601 case 23:
602 return getLaneChangeModel().isOpposite() ? -100 : getBestLaneOffset();
603 case 24:
604 return getAcceleration();
605 case 25:
606 return getTimeGapOnLane();
607 case 26:
608 return STEPS2TIME(getDepartDelay());
609 case 27:
610 return getEmissions<PollutantsInterface::ELEC>();
611 case 28:
613 case 29:
614 return getChargedEnergy();
615 case 30:
616 return getTimeLossSeconds();
617 case 31:
618 return getStopDelay();
619 case 32:
620 return getStopArrivalDelay();
621 case 33:
623 case 34: // by numerical param value
624 std::string error;
625 std::string val = getPrefixedParameter(s.vehicleParam, error);
626 try {
627 if (val == "") {
629 } else {
630 return StringUtils::toDouble(val);
631 }
632 } catch (NumberFormatException&) {
633 try {
634 return StringUtils::toBool(val);
635 } catch (BoolFormatException&) {
636 WRITE_WARNINGF(TL("Vehicle parameter '%' key '%' is not a number for vehicle '%'."),
639 }
640 }
641 }
642 return 0;
643}
644
645
646void
648 myLock.lock();
649 std::vector<std::vector<MSVehicle::LaneQ> > bestLanes = myBestLanes;
650 myLock.unlock();
651 for (std::vector<std::vector<MSVehicle::LaneQ> >::iterator j = bestLanes.begin(); j != bestLanes.end(); ++j) {
652 std::vector<MSVehicle::LaneQ>& lanes = *j;
653 double gmax = -1;
654 double rmax = -1;
655 for (std::vector<MSVehicle::LaneQ>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
656 gmax = MAX2((*i).length, gmax);
657 rmax = MAX2((*i).occupation, rmax);
658 }
659 for (std::vector<MSVehicle::LaneQ>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
660 const PositionVector& shape = (*i).lane->getShape();
661 double g = (*i).length / gmax;
662 double r = (*i).occupation / rmax;
663 glColor3d(r, g, 0);
664 double width = 0.5 / (1 + abs((*i).bestLaneOffset));
665 GLHelper::drawBoxLines(shape, width);
666
667 PositionVector s1 = shape;
668 s1.move2side((double) .1);
669 glColor3d(r, 0, 0);
671 s1.move2side((double) - .2);
672 glColor3d(0, g, 0);
674
675 glColor3d(r, g, 0);
676 }
677 }
678}
679
680
681void
682GUIVehicle::drawRouteHelper(const GUIVisualizationSettings& s, ConstMSRoutePtr r, bool future, bool noLoop, const RGBColor& col) const {
683 const double exaggeration = s.vehicleSize.getExaggeration(s, this) * (s.gaming ? 0.5 : 1);
684 MSRouteIterator start = future ? myCurrEdge : r->begin();
685 MSRouteIterator i = start;
686 const std::vector<MSLane*>& bestLaneConts = getBestLanesContinuation();
687 // draw continuation lanes when drawing the current route where available
688 int bestLaneIndex = (r == myRoute ? 0 : (int)bestLaneConts.size());
689 std::map<const MSLane*, int> repeatLane; // count repeated occurrences of the same edge
690 const double textSize = s.vehicleName.size / s.scale;
691 const GUILane* prevLane = nullptr;
692 int reversalIndex = 0;
693 const int indexDigits = (int)toString(r->size()).size();
694 if (!isOnRoad() && !isParking()) {
695 // simulation time has already advanced so isRemoteControlled is always false
696 const std::string offRoadLabel = hasInfluencer() && getInfluencer()->isRemoteAffected(SIMSTEP) ? "offRoad" : "teleporting";
697 GLHelper::drawTextSettings(s.vehicleValue, offRoadLabel, getPosition(), s.scale, s.angle, 1.0);
698 } else if (myLane->isInternal()) {
699 bestLaneIndex++;
700 }
701 const bool s2 = s.secondaryShape;
702 for (; i != r->end(); ++i) {
703 const GUILane* lane;
704 if (bestLaneIndex < (int)bestLaneConts.size() && bestLaneConts[bestLaneIndex] != 0 && (*i) == &(bestLaneConts[bestLaneIndex]->getEdge())) {
705 lane = static_cast<GUILane*>(bestLaneConts[bestLaneIndex]);
706 ++bestLaneIndex;
707 } else {
708 const std::vector<MSLane*>* allowed = (*i)->allowedLanes(getVClass());
709 if (allowed != nullptr && allowed->size() != 0) {
710 lane = static_cast<GUILane*>((*allowed)[0]);
711 } else {
712 lane = static_cast<GUILane*>((*i)->getLanes()[0]);
713 }
714 }
716 GLHelper::drawBoxLines(lane->getShape(s2), lane->getShapeRotations(s2), lane->getShapeLengths(s2), exaggeration);
717 if (prevLane != nullptr && lane->getBidiLane() == prevLane) {
718 // indicate train reversal
719 std::string label = "reverse:" + toString(reversalIndex++);
720 if (s.showRouteIndex) {
721 label += "@r" + toString((int)(i - myCurrEdge));
722 }
723 Position pos = lane->geometryPositionAtOffset(lane->getLength() / 2) - Position(0, textSize * repeatLane[lane]);
724 GLHelper::drawTextSettings(s.vehicleValue, label, pos, s.scale, s.angle, 1.0);
725 }
726 if (s.showRouteIndex) {
727 std::string label = toString((int)(i - myCurrEdge));
728 const double laneAngle = lane->getShape(s2).angleAt2D(0);
729 Position pos = lane->getShape(s2).front() - Position(0, textSize * repeatLane[lane]) + Position(
730 (laneAngle >= -0.25 * M_PI && laneAngle < 0.75 * M_PI ? 1 : -1) * 0.4 * indexDigits * textSize, 0);
731 //GLHelper::drawText(label, pos, 1.0, textSize, s.vehicleName.color);
732 GLHelper::drawTextSettings(s.vehicleName, label, pos, s.scale, s.angle, 1.0);
733 }
734 repeatLane[lane]++;
735 prevLane = lane;
736 if (noLoop && i != start && (*i) == (*start)) {
737 break;
738 }
739 }
740 drawStopLabels(s, noLoop, col);
743}
744
745
746double
750
751
752std::string
754 std::string result = "";
755 if (isParking()) {
756 result += "parking";
757 } else if (isStopped()) {
758 result += "stopped";
759 } else if (hasStops()) {
760 return "next: " + myStops.front().getDescription();
761 } else {
762 return "";
763 }
764 if (myStops.front().pars.triggered) {
765 result += ", triggered";
766 }
767 if (myStops.front().pars.containerTriggered) {
768 result += ", containerTriggered";
769 }
770 if (myStops.front().pars.collision) {
771 result += ", collision";
772 }
773 if (myStops.front().pars.arrival != -1) {
774 result += ", arrival=" + time2string(myStops.front().pars.arrival);
775 }
776 if (myStops.front().pars.started != -1) {
777 result += ", started=" + time2string(myStops.front().pars.started);
778 }
779 if (myStops.front().pars.until != -1) {
780 result += ", until=" + time2string(myStops.front().pars.until);
781 }
782 if (myStops.front().pars.extension != -1) {
783 result += ", extension=" + time2string(myStops.front().pars.extension);
784 }
785 if (!myStops.front().pars.permitted.empty()) {
786 result += ", permitted=" + toString(myStops.front().pars.permitted);
787 }
788 if (myStops.front().pars.actType != "") {
789 result += ", actType=" + myStops.front().pars.actType;
790 }
791 result += ", duration=" + time2string(myStops.front().duration);
792 return StringUtils::wrapText(result, 60);
793}
794
795
796void
798 double dist = myLane->getLength() - getPositionOnLane();
799#ifdef DEBUG_FOES
800 gDebugFlag1 = true;
801 std::cout << SIMTIME << " selectBlockingFoes veh=" << getID() << " dist=" << dist << " numLinks=" << myLFLinkLanes.size() << "\n";
802#endif
803 for (DriveItemVector::const_iterator i = myLFLinkLanes.begin(); i != myLFLinkLanes.end(); ++i) {
804 const DriveProcessItem& dpi = *i;
805 if (dpi.myLink == nullptr) {
807 continue;
808 }
809 MSLink::BlockingFoes blockingFoes;
810 std::vector<const MSPerson*> blockingPersons;
811#ifdef DEBUG_FOES
812 std::cout << " foeLink=" << dpi.myLink->getViaLaneOrLane()->getID() << "\n";
813 const bool isOpen =
814#endif
817#ifdef DEBUG_FOES
818 if (!isOpen) {
819 std::cout << " closed due to:\n";
820 for (const auto& item : blockingFoes) {
821 std::cout << " " << item->getID() << "\n";
822 }
823 }
824#endif
825 if (getLaneChangeModel().getShadowLane() != nullptr) {
827 if (parallelLink != nullptr) {
828 const double shadowLatPos = getLateralPositionOnLane() - getLaneChangeModel().getShadowDirection() * 0.5 * (
830#ifdef DEBUG_FOES
831 const bool isShadowOpen =
832#endif
833 parallelLink->opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
836 getWaitingTime(), shadowLatPos, &blockingFoes, false, this, dpi.myDistance);
837#ifdef DEBUG_FOES
838 if (!isShadowOpen) {
839 std::cout << " foes at shadow link=" << parallelLink->getViaLaneOrLane()->getID() << ":\n";
840 for (const auto& item : blockingFoes) {
841 std::cout << " " << item->getID() << "\n";
842 }
843 }
844#endif
845 }
846 }
847 for (const auto& item : blockingFoes) {
848 if (item->isVehicle()) {
849 gSelected.select(static_cast<const GUIVehicle*>(item)->getGlID());
850 } else {
851 gSelected.select(static_cast<const GUIPerson*>(item)->getGlID());
852 }
853 }
854 const MSLink::LinkLeaders linkLeaders = (dpi.myLink)->getLeaderInfo(this, dist, &blockingPersons);
855#ifdef DEBUG_FOES
856 gDebugFlag1 = false;
857#endif
858 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
859 // the vehicle to enter the junction first has priority
860 const GUIVehicle* leader = dynamic_cast<const GUIVehicle*>(it->vehAndGap.first);
861 if (leader != nullptr) {
862 if (isLeader(dpi.myLink, leader, it->vehAndGap.second) || it->inTheWay()) {
863 gSelected.select(leader->getGlID());
864#ifdef DEBUG_FOES
865 std::cout << " linkLeader=" << leader->getID() << "\n";
866#endif
867 }
868 } else {
869 for (std::vector<const MSPerson*>::iterator it_p = blockingPersons.begin(); it_p != blockingPersons.end(); ++it_p) {
870 const GUIPerson* foe = dynamic_cast<const GUIPerson*>(*it_p);
871 if (foe != nullptr) {
872 gSelected.select(foe->getGlID());
873 //std::cout << SIMTIME << " veh=" << getID() << " is blocked on link " << dpi.myLink->getRespondIndex() << " to " << dpi.myLink->getViaLaneOrLane()->getID() << " by pedestrian. dist=" << it->second << "\n";
874 }
875 }
876 }
877 }
878 dist += dpi.myLink->getViaLaneOrLane()->getLength();
879 }
880}
881
882
883void
887 if (view != nullptr) {
888 if (add) {
892 }
893 } else {
895 myAdditionalVisualizations[view] &= ~VO_DRAW_OUTSIDE_NETWORK;
896 }
897 }
898}
899
900bool
904
905int
907 const double rightSide = getRightSideOnEdge();
908 const std::vector<double>& sublaneSides = myLane->getEdge().getSubLaneSides();
909 for (int i = 0; i < (int)sublaneSides.size(); ++i) {
910 if (sublaneSides[i] > rightSide) {
911 return MAX2(i - 1, 0);
912 }
913 }
914 return (int)sublaneSides.size() - 1;
915}
916
917int
919 const double leftSide = getLeftSideOnEdge();
920 const std::vector<double>& sublaneSides = myLane->getEdge().getSubLaneSides();
921 for (int i = (int)sublaneSides.size() - 1; i >= 0; --i) {
922 if (sublaneSides[i] < leftSide) {
923 return i;
924 }
925 }
926 return -1;
927}
928
929
930std::string
932 return toString((LaneChangeAction)getLaneChangeModel().getSavedState(-1).second);
933}
934
935std::string
937 return toString((LaneChangeAction)getLaneChangeModel().getSavedState(1).second);
938}
939
940std::string
942 return toString((LaneChangeAction)getLaneChangeModel().getSavedState(0).second);
943}
944
945std::string
947 return Named::getIDSecure(myLane, "n/a");
948}
949
950std::string
954
955std::string
957 return Named::getIDSecure(getLaneChangeModel().getShadowLane(), "");
958}
959
960std::string
962 return Named::getIDSecure(getLaneChangeModel().getTargetLane(), "");
963}
964
965
966std::string
968 std::vector<std::string> result;
969 for (auto item : myMoveReminders) {
970 const MSDriveWay* dw = dynamic_cast<const MSDriveWay*>(item.first);
971 if (dw) {
972 result.push_back(dw->getID());
973 }
974 }
975 return StringUtils::wrapText(joinToStringSorting(result, " "), 60);
976}
977
978double
982
983std::string
985 return std::bitset<7>(getInfluencer()->getSpeedMode()).to_string();
986}
987
988std::string
990 return std::bitset<12>(getInfluencer()->getLaneChangeMode()).to_string();
991}
992
993void
995 SUMOTime intermediateDuration = TIME2STEPS(20);
996 SUMOTime finalDuration = SUMOTime_MAX;
997 if (myParameter->stops.size() >= 2) {
998 // copy durations from the original stops
999 intermediateDuration = myParameter->stops.front().duration;
1000 finalDuration = myParameter->stops.back().duration;
1001 }
1002 // if the stop is already in the list of stops, cancel all stops that come
1003 // after it and set the stop duration
1004 std::string line = "";
1005 int destinations = 0;
1006 bool add = true;
1007 for (auto it = myStops.begin(); it != myStops.end(); it++) {
1008 if (!it->reached && destinations < 2 && it->busstop != nullptr) {
1009 line += it->busstop->getID();
1010 destinations++;
1011 }
1012 if (it->busstop == busStop) {
1013 it->duration = finalDuration;
1014 myStops.erase(++it, myStops.end());
1015 add = false;
1016 break;
1017 } else {
1018 it->duration = MIN2(it->duration, intermediateDuration);
1019 }
1020 }
1021 if (destinations < 2) {
1022 line += busStop->getID();
1023 }
1024 if (add) {
1025 // create new stop
1027 stopPar.busstop = busStop->getID();
1028 stopPar.lane = busStop->getLane().getID();
1029 stopPar.startPos = busStop->getBeginLanePosition();
1030 stopPar.endPos = busStop->getEndLanePosition();
1031 stopPar.duration = finalDuration;
1032 stopPar.until = -1;
1033 stopPar.triggered = false;
1034 stopPar.containerTriggered = false;
1035 stopPar.parking = ParkingType::ONROAD;
1036 stopPar.index = STOP_INDEX_FIT;
1038 // clean up prior route to improve visualisation, ensure that the stop can be added immediately
1039 ConstMSEdgeVector edges = myRoute->getEdges();
1040 edges.erase(edges.begin(), edges.begin() + getRoutePosition());
1041 edges.push_back(&busStop->getLane().getEdge());
1042 replaceRouteEdges(edges, -1, 0, "DRT.tmp", false, false, false);
1043 std::string errorMsg;
1044 // add stop
1045 addStop(stopPar, errorMsg);
1046 }
1047 const bool hasReroutingDevice = getDevice(typeid(MSDevice_Routing)) != nullptr;
1048 SUMOAbstractRouter<MSEdge, SUMOVehicle>& router = hasReroutingDevice
1051 // reroute to ensure the new stop is reached
1052 reroute(MSNet::getInstance()->getCurrentTimeStep(), "DRT", router);
1053 myParameter->line = line;
1054 assert(haveValidStopEdges());
1055}
1056
1058GUIVehicle::getVisualPosition(bool s2, const double offset) const {
1059 if (s2) {
1060 // see MSVehicle::getPosition
1061 if (myLane == nullptr) {
1062 return Position::INVALID;
1063 }
1064 if (isParking()) {
1065 if (myStops.begin()->parkingarea != nullptr) {
1066 return myStops.begin()->parkingarea->getVehiclePosition(*this);
1067 } else {
1068 // position beside the road
1069 PositionVector shp = myLane->getEdge().getLanes()[0]->getShape(s2);
1071 return shp.positionAtOffset((getPositionOnLane() + offset) * myLane->getLengthGeometryFactor(s2));
1072 }
1073 }
1074 const PositionVector& shape = myLane->getShape(s2);
1075 const double posLat = (MSGlobals::gLefthand ? 1 : -1) * getLateralPositionOnLane();
1076 return shape.positionAtOffset((getPositionOnLane() + offset) * myLane->getLengthGeometryFactor(s2), posLat);
1077 } else {
1078 return getPosition(offset);
1079 }
1080}
1081
1082
1083double
1085 if (s2) {
1086 // see MSVehicle::computeAngle
1087 const PositionVector& shape = myLane->getShape(s2);
1088 if (isParking()) {
1089 if (myStops.begin()->parkingarea != nullptr) {
1090 return myStops.begin()->parkingarea->getVehicleAngle(*this);
1091 } else {
1093 }
1094 }
1095 // if (myLaneChangeModel->isChangingLanes()) {
1096 const double lefthandSign = (MSGlobals::gLefthand ? -1 : 1);
1097 Position p1 = getVisualPosition(s2);
1098 Position p2 = getVisualPosition(s2, MAX2(0.0, -myType->getLength()));
1099 double result = (p1 != p2 ? p2.angleTo2D(p1) :
1102 result += lefthandSign * DEG2RAD(myLaneChangeModel->getAngleOffset());
1103 }
1104 return result;
1105 } else {
1106 return getAngle();
1107 }
1108}
1109/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ GLO_VEHICLE
a vehicle
GUISelectedStorage gSelected
A global holder of selected objects.
#define BLINKER_POS_FRONT
#define LANECHANGEMODE_DEFAULT
#define SPEEDMODE_DEFAULT
void drawAction_drawBlinker(double dir, double length)
#define BLINKER_POS_BACK
#define DEG2RAD(x)
Definition GeomHelper.h:35
#define RAD2DEG(x)
Definition GeomHelper.h:36
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:74
ConstMSEdgeVector::const_iterator MSRouteIterator
Definition MSRoute.h:57
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
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:58
#define SIMSTEP
Definition SUMOTime.h:64
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SIMTIME
Definition SUMOTime.h:65
#define TIME2STEPS(x)
Definition SUMOTime.h:60
const long long int VTYPEPARS_ACTIONSTEPLENGTH_SET
@ GIVEN
The alignment as offset is given.
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permissions is a (exclusive) railway edge.
std::string getVehicleShapeName(SUMOVehicleShape id)
Returns the class name of the shape class given by its id.
StringBijection< SUMOVehicleClass > SumoVehicleClassStrings(sumoVehicleClassStringInitializer, SVC_CUSTOM2, false)
@ RAIL_CAR
render as a (city) rail without locomotive
@ TRUCK_1TRAILER
render as a transport vehicle with one trailer
@ TRUCK_SEMITRAILER
render as a semi-trailer transport vehicle ("Sattelschlepper")
const int STOP_START_SET
const int STOP_INDEX_FIT
const int STOP_END_SET
SumoXMLTag
Numbers representing SUMO-XML - element names.
LaneChangeAction
The state of a vehicle's lane-change behavior.
int gPrecision
the precision for floating point outputs
Definition StdDefs.cpp:27
bool gDebugFlag1
global utility flags for debugging
Definition StdDefs.cpp:43
const double SUMO_const_laneWidth
Definition StdDefs.h:52
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 joinToStringSorting(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition ToString.h:305
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition ToString.h:289
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
std::string toStr(std::streamsize accuracy) const
Returns the string representation of this distribution.
static void drawLine(const Position &beg, double rot, double visLength)
Draws a thin line.
Definition GLHelper.cpp:433
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition GLHelper.cpp:649
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 RGBColor getColor()
gets the gl-color
Definition GLHelper.cpp:655
static void drawBoxLine(const Position &beg, double rot, double visLength, double width, double offset=0)
Draws a thick line.
Definition GLHelper.cpp:296
static void pushMatrix()
push matrix
Definition GLHelper.cpp:118
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
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_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
A MSVehicle extended by some values for usage within the gui.
int getNumContainers() const
return the number of passengers
void drawParkingInfo(const GUIVisualizationSettings &s) const
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
void drawChargingInfo(const GUIVisualizationSettings &s) const
@ VO_DRAW_OUTSIDE_NETWORK
draw vehicle outside the road network
FXMutex myLock
The mutex used to avoid concurrent updates of the vehicle buffer.
double getNaviDegree() const
return the current angle in navigational degrees
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
int getNumPassengers() const
return the number of passengers
std::map< GUISUMOAbstractView *, int > myAdditionalVisualizations
Enabled visualisations, per view.
void drawStopLabels(const GUIVisualizationSettings &s, bool noLoop, const RGBColor &col) const
Seats mySeatPositions
positions of seats in the vehicle (updated at every drawing step)
std::string getDeviceDescription()
lists equipped device (types) for the current vehicle
const MSVehicleType & getVType() const
A shortcut to myVehicle.myType.
void cleanupOnDestruction()
to be called by child class to ensure cleanup in correct order
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
GUIGlID getGlID() const
Returns the numerical id of the object.
Representation of a lane in the micro simulation (gui-version)
Definition GUILane.h:60
const std::vector< double > & getShapeRotations(bool secondary) const
Definition GUILane.cpp:1132
const PositionVector & getShape(bool secondary) const override
Definition GUILane.cpp:1126
const std::vector< double > & getShapeLengths(bool secondary) const
Definition GUILane.cpp:1138
GUISUMOAbstractView * getActiveView() const
get the active view or 0
static GUIMainWindow * getInstance()
get instance
A window containing a gl-object's parameter.
void mkItem(const char *name, bool dynamic, ValueSource< T > *src)
Adds a row which obtains its value from a ValueSource.
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
T getColor(const double value) const
bool removeAdditionalGLVisualisation(GUIGlObject *const which)
Removes an object from the list of objects that show additional things.
bool addAdditionalGLVisualisation(GUIGlObject *const which)
Adds an object to call its additional visualisation method.
void select(GUIGlID id, bool update=true)
Adds the object with the given id.
bool isSelected(GUIGlObjectType type, GUIGlID id)
Returns the information whether the object with the given type and id is selected.
void deselect(GUIGlID id)
Deselects the object with the given id.
A MSVehicle extended by some values for usage within the gui.
Definition GUIVehicle.h:52
void drawAction_drawVehicleBlueLight() const override
int getLeftSublaneOnEdge() const
Position getVisualPosition(bool s2, const double offset=0) const override
Return current position taking into account secondary shape.
std::string getDynamicAlignment() const
return the current lateral alignment as string
bool isSelected() const override
whether this vehicle is selected in the GUI
void drawOutsideNetwork(bool add) override
register vehicle for drawing while outside the network
double getLastLaneChangeOffset() const override
Returns the time since the last lane change in seconds.
double getAngle() const override
Return current angle.
Definition GUIVehicle.h:82
int getRightSublaneOnEdge() const
return the righmost sublane on the edge occupied by the vehicle
Position getPosition(const double offset=0) const override
Return current position (x/y, cartesian)
Definition GUIVehicle.h:72
void drawBestLanes() const override
Draws the vehicle's best lanes.
void drawAction_drawVehicleBlinker(double length) const override
std::string getBackLaneIDs() const
void drawRouteHelper(const GUIVisualizationSettings &s, ConstMSRoutePtr r, bool future, bool noLoop, const RGBColor &col) const override
Draws the route.
double getLeftSideOnEdge() const
return left vehicle side on current edge
Definition GUIVehicle.h:145
std::string getStopInfo() const override
retrieve information about the current stop state
std::string getShadowLaneID() const
double getManeuverDist() const
return the lane-change maneuver distance
double getRightSideOnEdge2() const
return right vehicle side on current edge (without argument)
Definition GUIVehicle.h:140
std::string getSpeedMode() const
return the speed mode as bit string
GUIVehicle(SUMOVehicleParameter *pars, ConstMSRoutePtr route, MSVehicleType *type, const double speedFactor)
Constructor.
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const override
gets the color value according to the current scheme index
void rerouteDRTStop(MSStoppingPlace *busStop)
handle route to accomodate to given stop
void drawAction_drawLinkItems(const GUIVisualizationSettings &s) const override
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own parameter window.
std::string getLCStateRight() const
return the lanechange state
GUIParameterTableWindow * getTypeParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own type parameter window.
void drawAction_drawCarriageClass(const GUIVisualizationSettings &s, double scaledLength, bool asImage) const override
draws the given guiShape with distinct carriages/modules
std::string getLaneID() const
return vehicle lane id
void drawAction_drawVehicleBrakeLight(double length, bool onlyOne=false) const override
std::string getTargetLaneID() const
std::string getLCStateLeft() const
void selectBlockingFoes() const override
adds the blocking foes to the current selection
double getVisualAngle(bool s2) const override
Returns the vehicle's direction in radians taking into account secondary shape.
std::string getDriveWays() const
~GUIVehicle()
destructor
std::string getLCStateCenter() const
std::string getLaneChangeMode() const
return the lane change mode as bit string
Stores the information about how to visualize structures.
GUIVisualizationTextSettings vehicleName
GUIVisualizationSizeSettings vehicleSize
bool trueZ
drawl all objects according to their z data
GUIVisualizationTextSettings vehicleValue
int vehicleQuality
The quality of vehicle drawing.
bool gaming
whether the application is in gaming mode or not
std::string vehicleParam
key for coloring by vehicle parameter
GUIScaler vehicleScaler
The size scaling settings for vehicles.
double scale
information about a lane's width (temporary, used for a single view)
bool secondaryShape
whether secondary lane shape shall be drawn
bool drawReversed
Whether to draw reversed vehicles in their reversed state.
bool showRouteIndex
Information whether the route index should be shown.
double angle
The current view rotation angle.
double getManeuverDist() const
Returns the remaining unblocked distance for the current maneuver. (only used by sublane model)
MSLane * getShadowLane() const
Returns the lane the vehicle's shadow is on during continuous/sublane lane change.
int getShadowDirection() const
return the direction in which the current shadow lane lies
double getSpeedLat() const
return the lateral speed of the current lane change maneuver
double getAngleOffset() const
return the angle offset resulting from lane change and sigma
bool isChangingLanes() const
return true if the vehicle currently performs a lane change maneuver
The base class for microscopic and mesoscopic vehicles.
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and technical maximum speed)
bool haveValidStopEdges(bool silent=false) const
check whether all stop.edge MSRouteIterators are valid and in order
std::list< MSStop > myStops
The vehicle's list of stops.
double getImpatience() const
Returns this vehicles impatience.
virtual double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
MoveReminderCont myMoveReminders
Currently relevant move reminders.
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
double getMaxChargeRate() const
Returns the maximum charge rate allowed by the battery in the current time step (W)
double getChosenSpeedFactor() const
Returns the precomputed factor by which the driver wants to be faster than the speed limit.
bool isReversed() const
Returns whether the logical state of the vehicle is reversed - for drawing.
double getOdometer() const
Returns the distance that was already driven by this vehicle.
const MSVehicleType * myType
This vehicle's type.
double getLength() const
Returns the vehicle's length.
bool isParking() const
Returns whether the vehicle is parking.
double getHarmonoise_NoiseEmissions() const
Returns noise emissions of the current state.
int getPersonNumber() const
Returns the number of persons.
double getRelativeStateOfCharge() const
Returns actual relative state of charge of battery (-)
MSRouteIterator myCurrEdge
Iterator to current route-edge.
const std::vector< std::string > & getParkingBadges() const
get the valid parking access rights (vehicle settings override vehicle type settings)
ConstMSRoutePtr myRoute
This vehicle's route.
double getWidth() const
Returns the vehicle's width.
double getStateOfCharge() const
Returns actual state of charge of battery (Wh) RICE_CHECK: This may be a misnomer,...
double getDesiredMaxSpeed() const
double getWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s)
bool hasStops() const
Returns whether the vehicle has to stop somewhere.
const MSStop & getNextStop() const
std::string getPrefixedParameter(const std::string &key, std::string &error) const
retrieve parameters of devices, models and the vehicle itself
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
bool addStop(const SUMOVehicleParameter::Stop &stopPar, std::string &errorMsg, SUMOTime untilOffset=0, MSRouteIterator *searchStart=nullptr)
Adds a stop.
double getChargedEnergy() const
Returns the energy charged to the battery in the current time step (Wh)
int getRoutePosition() const
return index of edge within route
SUMOTime getDepartDelay() const
Returns the depart delay.
double getElecHybridCurrent() const
Returns actual current (A) of ElecHybrid device RICE_CHECK: Is this the current consumed from the ove...
const SUMOVehicleParameter * myParameter
This vehicle's parameter.
int getNumberReroutes() const
Returns the number of new routes this vehicle got.
bool reroute(SUMOTime t, const std::string &info, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router, const bool onInit=false, const bool withTaz=false, const bool silent=false, const MSEdge *sink=nullptr)
Performs a rerouting using the given router.
int getRNGIndex() 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.
int getContainerNumber() const
Returns the number of containers.
bool replaceRouteEdges(ConstMSEdgeVector &edges, double cost, double savings, const std::string &info, bool onInit=false, bool check=false, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given edges.
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
Definition MSCFModel.h:269
Battery device for electric vehicles.
A device which collects info on the vehicle trip (mainly on departure and arrival)
A device that performs vehicle rerouting based on current edge speeds.
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
const std::vector< double > getSubLaneSides() const
Returns the right side offsets of this edge's sublanes.
Definition MSEdge.h:670
static bool gModelParkingManoeuver
whether parking simulation includes manoeuver time and any associated lane blocking
Definition MSGlobals.h:162
static double gLateralResolution
Definition MSGlobals.h:100
static bool gLefthand
Whether lefthand-drive is being simulated.
Definition MSGlobals.h:174
static bool gSublane
whether sublane simulation is enabled (sublane model or continuous lanechanging)
Definition MSGlobals.h:165
static SUMOTime gLaneChangeDuration
Definition MSGlobals.h:97
static SUMOTime gWaitingTimeMemory
length of memory for waiting times (in millisecs)
Definition MSGlobals.h:115
Representation of a lane in the micro simulation.
Definition MSLane.h:84
virtual double getLengthGeometryFactor(bool) const
Definition MSLane.h:290
double getLength() const
Returns the lane's length.
Definition MSLane.h:617
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition MSLane.h:575
bool isInternal() const
Definition MSLane.cpp:2626
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
Definition MSLane.cpp:4691
virtual const PositionVector & getShape(bool) const
Definition MSLane.h:294
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:775
double getWidth() const
Returns the lane's width.
Definition MSLane.h:646
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition MSLane.h:561
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:187
MSVehicleRouter & getRouterTT(int rngIndex, const Prohibitions &prohibited={}) const
Definition MSNet.cpp:1615
static MSVehicleRouter & getRouterTT(const int rngIndex, SUMOVehicleClass svc, const Prohibitions &prohibited={})
return the vehicle router instance
A lane area vehicles can halt at.
double getBeginLanePosition() const
Returns the begin position of this stop.
double getEndLanePosition() const
Returns the end position of this stop.
const MSLane & getLane() const
Returns the lane this stop is located at.
A class that helps computing positions of a train's carriages and additional structures.
int getFirstCarriageNo() const
double getFirstCarriageLength() const
bool isReversed() const
const std::vector< Carriage * > & getCarriages() const
double getCarriageLength() const
int getNumCarriages() const
double getUpscaleLength() const
int getFirstPassengerCarriage() const
double getHalfWidth() const
bool isRemoteAffected(SUMOTime t) const
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
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)
double getTimeGapOnLane() const
Returns the time gap in seconds to the leader of the vehicle on the same lane.
double getStopDelay() const
Returns the public transport stop delay in seconds.
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
Definition MSVehicle.h:605
bool isActive() const
Returns whether the current simulation step is an action point for the vehicle.
Definition MSVehicle.h:628
double getTimeLossSeconds() const
Returns the time loss in seconds.
Definition MSVehicle.h:720
double getAccumulatedWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s) within the last millisecs.
Definition MSVehicle.h:714
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the SUMOTime waited (speed was lesser than 0.1m/s)
Definition MSVehicle.h:670
double getTimeSinceStartupSeconds() const
Definition MSVehicle.h:691
MSAbstractLaneChangeModel & getLaneChangeModel()
bool isActionStep(SUMOTime t) const
Returns whether the next simulation step will be an action point for the vehicle.
Definition MSVehicle.h:635
MSAbstractLaneChangeModel * myLaneChangeModel
Definition MSVehicle.h:1904
std::vector< MSLane * > myFurtherLanes
The information into which lanes the vehicle laps into.
Definition MSVehicle.h:1931
bool signalSet(int which) const
Returns whether the given signal is on.
Definition MSVehicle.h:1190
double getAcceleration() const
Returns the vehicle's acceleration in m/s (this is computed as the last step's mean acceleration in c...
Definition MSVehicle.h:514
const std::vector< MSLane * > & getBestLanesContinuation() const
Returns the best sequence of lanes to continue the route starting at myLane.
int getBestLaneOffset() const
double getStopArrivalDelay() const
Returns the estimated public transport stop arrival delay in seconds.
@ VEH_SIGNAL_BLINKER_RIGHT
Right blinker lights are switched on.
Definition MSVehicle.h:1112
@ VEH_SIGNAL_BRAKELIGHT
The brake lights are on.
Definition MSVehicle.h:1118
@ VEH_SIGNAL_EMERGENCY_BLUE
A blue emergency light is on.
Definition MSVehicle.h:1134
@ VEH_SIGNAL_BLINKER_LEFT
Left blinker lights are switched on.
Definition MSVehicle.h:1114
@ VEH_SIGNAL_BLINKER_EMERGENCY
Blinker lights on both sides are switched on.
Definition MSVehicle.h:1116
const MSLane * getLane() const
Returns the lane the vehicle is on.
Definition MSVehicle.h:581
bool isLeader(const MSLink *link, const MSVehicle *veh, const double gap) const
whether the given vehicle must be followed at the given junction
Influencer & getInfluencer()
std::vector< std::vector< LaneQ > > myBestLanes
Definition MSVehicle.h:1914
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
Definition MSVehicle.h:413
double getSlope() const
Returns the slope of the road at vehicle's position in degrees.
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 getPositionOnLane() const
Get the vehicle's position along the lane.
Definition MSVehicle.h:374
MSLane * myLane
The lane the vehicle is on.
Definition MSVehicle.h:1902
bool hasInfluencer() const
whether the vehicle is individually influenced (via TraCI or special parameters)
Definition MSVehicle.h:1702
DriveItemVector myLFLinkLanes
container for the planned speeds in the current step
Definition MSVehicle.h:2035
The car-following model and parameter.
double getMinGapLat() const
Get the minimum lateral gap that vehicles of this type maintain.
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
const LatAlignmentDefinition & getPreferredLateralAlignment() const
Get vehicle's preferred lateral alignment procedure.
int getPersonCapacity() const
Get this vehicle type's person capacity.
const std::string & getID() const
Returns the name of the vehicle type.
double getMinGap() const
Get the free space in front of vehicles of this class.
SUMOTime getLoadingDuration(const bool isPerson) const
Get this vehicle type's loading duration.
double getHeight() const
Get the height which vehicles of this class shall have when being drawn.
double getActionStepLengthSecs() const
Returns this type's default action step length in seconds.
double getMaxSpeedLat() const
Get vehicle's maximum lateral speed [m/s].
SUMOEmissionClass getEmissionClass() const
Get this vehicle type's emission class.
double getLength() const
Get vehicle's length [m].
SUMOVehicleShape getGuiShape() const
Get this vehicle type's shape.
double getMass() const
Get this vehicle type's mass.
std::string getImgFile() const
Get this vehicle type's raster model file name.
const SUMOVTypeParameter & getParameter() const
double getPreferredLateralAlignmentOffset() const
Get vehicle's preferred lateral alignment offset (in m from center line)
int getContainerCapacity() const
Get this vehicle type's container capacity.
static std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
Definition Named.h:67
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.
static std::string getName(const SUMOEmissionClass c)
Checks whether the string describes a known vehicle class.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
static const Position INVALID
used to indicate that a position is valid
Definition Position.h:323
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
Definition Position.h:273
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.
double length() const
Returns the length.
double rotationAtOffset(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.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
double angleAt2D(int pos) const
get angle in certain position of position vector (in radians between -M_PI and M_PI)
RGBColor changedBrightness(int change, int toChange=3) const
Returns a new color with altered brightness.
Definition RGBColor.cpp:200
bool wasSet(long long int what) const
Returns whether the given parameter was set.
std::vector< std::string > carriageImages
Image files for additional carriages.
Distribution_Parameterized speedFactor
The factor by which the maximum speed may deviate from the allowed max speed on the street.
SubParams lcParameter
Lane-changing parameter.
SubParams jmParameter
Junction-model parameter.
std::string getManoeuverAngleTimesS() const
Returns myManoeuverAngleTimes as a string for xml output.
Definition of vehicle stop (position and duration)
ParkingType parking
whether the vehicle is removed from the net while stopping
std::string lane
The lane to stop at.
double startPos
The stopping position start.
int parametersSet
Information for the output which parameter were set.
int index
at which position in the stops list
SUMOTime until
The time at which the vehicle may continue its journey.
bool triggered
whether an arriving person lets the vehicle continue
double endPos
The stopping position end.
std::string busstop
(Optional) bus stop if one is assigned to the stop
bool containerTriggered
whether an arriving container lets the vehicle continue
SUMOTime duration
The stopping duration.
Structure representing possible vehicle parameter.
std::vector< Stop > stops
List of the stops the vehicle will make, TraCI may add entries here.
std::string line
The vehicle's line (mainly for public transport)
static StringBijection< SumoXMLTag > CarFollowModels
car following models
static StringBijection< LaneChangeModel > LaneChangeModels
lane change models
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
static std::string wrapText(const std::string s, int width)
remove leading and trailing whitespace
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
#define UNUSED_PARAMETER(x)
#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
Drive process items represent bounds on the safe velocity corresponding to the upcoming links.
Definition MSVehicle.h:1974
double getLeaveSpeed() const
Definition MSVehicle.h:2025