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
98 // cleanupFurtherLanes will be called again in MSVehicle. However, we must
99 // first call it here to avoid stale pointers to a partially destructed
100 // GUIVehicle in MSLane::myPartialVehicles
103}
104
105
109 const bool isElecHybrid = getDevice(typeid(MSDevice_ElecHybrid)) != nullptr ? true : false;
110 const bool hasBattery = getDevice(typeid(MSDevice_Battery)) != nullptr;
112 // add items
113 ret->mkItem(TL("lane [id]"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLaneID));
115 ret->mkItem(TL("shadow lane [id]"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getShadowLaneID));
116 }
118 ret->mkItem(TL("target lane [id]"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getTargetLaneID));
119 }
120 if (isSelected()) {
121 ret->mkItem(TL("back lanes [id,..]"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getBackLaneIDs));
122 }
123 ret->mkItem(TL("position [m]"), true,
125 ret->mkItem(TL("lateral offset [m]"), true,
127 ret->mkItem(TL("speed [m/s]"), true,
129 ret->mkItem(TL("lateral speed [m/s]"), true,
131 ret->mkItem(TL("acceleration [m/s^2]"), true,
133 ret->mkItem(TL("angle [degree]"), true,
135 ret->mkItem(TL("slope [degree]"), true,
137 ret->mkItem(TL("speed factor"), true,
139 ret->mkItem(TL("time gap on lane [s]"), true,
141 ret->mkItem(TL("waiting time [s]"), true,
143 ret->mkItem(TLF("waiting time (accumulated, % s) [s]", time2string(MSGlobals::gWaitingTimeMemory)).c_str(), true,
145 ret->mkItem(TL("time since startup [s]"), true,
147 ret->mkItem(TL("time loss [s]"), true,
149 ret->mkItem(TL("impatience"), true,
151 ret->mkItem(TL("last lane change [s]"), true,
153 ret->mkItem(TL("desired depart [s]"), false, time2string(getParameter().depart));
154 ret->mkItem(TL("depart delay [s]"), false, time2string(getDepartDelay()));
155 ret->mkItem(TL("odometer [m]"), true,
157 if (getParameter().repetitionNumber < std::numeric_limits<long long int>::max()) {
158 ret->mkItem(TL("remaining [#]"), false, (long long int) getParameter().repetitionNumber - getParameter().repetitionsDone);
159 }
160 if (getParameter().repetitionOffset > 0) {
161 ret->mkItem(TL("insertion period [s]"), false, time2string(getParameter().repetitionOffset));
162 }
163 if (getParameter().repetitionProbability > 0) {
164 ret->mkItem(TL("insertion probability"), false, getParameter().repetitionProbability);
165 }
166 if (getParameter().poissonRate > 0) {
167 ret->mkItem(TL("poisson rate"), false, getParameter().poissonRate);
168 }
169 ret->mkItem(TL("stop info"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getStopInfo));
170 ret->mkItem(TL("line"), false, myParameter->line);
171 ret->mkItem(TL("CO2 [mg/s]"), true,
172 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::CO2>));
173 ret->mkItem(TL("CO [mg/s]"), true,
174 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::CO>));
175 ret->mkItem(TL("HC [mg/s]"), true,
176 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::HC>));
177 ret->mkItem(TL("NOx [mg/s]"), true,
178 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::NO_X>));
179 ret->mkItem(TL("PMx [mg/s]"), true,
180 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::PM_X>));
181 ret->mkItem(TL("fuel [mg/s]"), true,
182 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::FUEL>));
183 ret->mkItem(TL("electricity [Wh/s]"), true,
184 new FunctionBinding<GUIVehicle, double>(this, &MSVehicle::getEmissions<PollutantsInterface::ELEC>));
185 ret->mkItem(TL("noise (Harmonoise) [dB]"), true,
187 ret->mkItem(TL("devices"), false, getDeviceDescription());
188 ret->mkItem(TL("persons"), true,
190 ret->mkItem(TL("containers"), true,
192 ret->mkItem(TL("lcState right"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLCStateRight));
193 ret->mkItem(TL("lcState left"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLCStateLeft));
194 ret->mkItem(TL("parking badges"), false, joinToString(getParkingBadges(), " "));
195 // close building
197 ret->mkItem(TL("lcState center"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLCStateCenter));
198 ret->mkItem(TL("right side on edge [m]"), true, new FunctionBinding<GUIVehicle, double>(this, &GUIVehicle::getRightSideOnEdge2));
199 ret->mkItem(TL("left side on edge [m]"), true, new FunctionBinding<GUIVehicle, double>(this, &GUIVehicle::getLeftSideOnEdge));
200 ret->mkItem(TL("rightmost edge sublane [#]"), true, new FunctionBinding<GUIVehicle, int>(this, &GUIVehicle::getRightSublaneOnEdge));
201 ret->mkItem(TL("leftmost edge sublane [#]"), true, new FunctionBinding<GUIVehicle, int>(this, &GUIVehicle::getLeftSublaneOnEdge));
202 ret->mkItem(TL("lane change maneuver distance [m]"), true, new FunctionBinding<GUIVehicle, double>(this, &GUIVehicle::getManeuverDist));
203 }
204 if (isRailway(getVClass())) {
205 ret->mkItem(TL("driveways"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getDriveWays));
206 }
207 if (hasBattery || isElecHybrid) {
208 ret->mkItem(TL("present state of charge [Wh]"), true,
210 }
211 if (hasBattery) {
212 ret->mkItem(TL("relative state of charge (SoC) [-]"), true,
214 ret->mkItem(TL("current timestep charge [Wh]"), true,
216 ret->mkItem(TL("maximum charge rate [W]"), true,
218 }
219 if (isElecHybrid) {
220 ret->mkItem(TL("present electric current [A]"), true,
222 }
223 if (hasInfluencer()) {
225 ret->mkItem(TL("speed mode"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getSpeedMode));
226 }
228 ret->mkItem(TL("lane change mode"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getLaneChangeMode));
229 }
230 }
232 return ret;
233}
234
235
238 GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this, "vType:" + myType->getID());
239 ret->mkItem(TL("type"), false, myType->getID());
240 ret->mkItem(TL("length [m]"), false, myType->getLength());
241 ret->mkItem(TL("width [m]"), false, myType->getWidth());
242 ret->mkItem(TL("height [m]"), false, myType->getHeight());
243 ret->mkItem(TL("minGap [m]"), false, myType->getMinGap());
244 ret->mkItem(TL("vehicle class"), false, SumoVehicleClassStrings.getString(myType->getVehicleClass()));
245 ret->mkItem(TL("emission class"), false, PollutantsInterface::getName(myType->getEmissionClass()));
246 ret->mkItem(TL("mass [kg]"), false, myType->getMass());
247 ret->mkItem(TL("car-following model"), false, SUMOXMLDefinitions::CarFollowModels.getString((SumoXMLTag)getCarFollowModel().getModelID()));
248 ret->mkItem(TL("lane-change model"), false, SUMOXMLDefinitions::LaneChangeModels.getString(getLaneChangeModel().getModelID()));
249 ret->mkItem(TL("guiShape"), false, getVehicleShapeName(myType->getGuiShape()));
250 ret->mkItem(TL("maximum speed [m/s]"), false, getVehicleType().getMaxSpeed());
251 ret->mkItem(TL("desired maximum speed [m/s]"), false, getVehicleType().getDesiredMaxSpeed());
252 ret->mkItem(TL("maximum acceleration [m/s^2]"), false, getCarFollowModel().getMaxAccel());
253 ret->mkItem(TL("maximum deceleration [m/s^2]"), false, getCarFollowModel().getMaxDecel());
254 ret->mkItem(TL("emergency deceleration [m/s^2]"), false, getCarFollowModel().getEmergencyDecel());
255 ret->mkItem(TL("apparent deceleration [m/s^2]"), false, getCarFollowModel().getApparentDecel());
256 ret->mkItem(TL("imperfection (sigma)"), false, getCarFollowModel().getImperfection());
257 ret->mkItem(TL("desired headway (tau) [s]"), false, getCarFollowModel().getHeadwayTime());
258 ret->mkItem(TL("speedfactor"), false, myType->getParameter().speedFactor.toStr(gPrecision));
259 ret->mkItem(TL("startupDelay [s]"), false, STEPS2TIME(getCarFollowModel().getStartupDelay()));
261 ret->mkItem(TL("action step length [s]"), false, myType->getActionStepLengthSecs());
262 }
263 ret->mkItem(TL("person capacity"), false, myType->getPersonCapacity());
264 ret->mkItem(TL("boarding time [s]"), false, STEPS2TIME(myType->getLoadingDuration(true)));
265 ret->mkItem(TL("container capacity"), false, myType->getContainerCapacity());
266 ret->mkItem(TL("loading time [s]"), false, STEPS2TIME(myType->getLoadingDuration(false)));
268 ret->mkItem(TL("minGapLat [m]"), false, myType->getMinGapLat());
269 ret->mkItem(TL("maxSpeedLat [m/s]"), false, myType->getMaxSpeedLat());
270 ret->mkItem(TL("latAlignment"), true, new FunctionBindingString<GUIVehicle>(this, &GUIVehicle::getDynamicAlignment));
271 } else if (MSGlobals::gLaneChangeDuration > 0) {
272 ret->mkItem(TL("maxSpeedLat [m/s]"), false, myType->getMaxSpeedLat());
273 }
274 for (auto item : myType->getParameter().lcParameter) {
275 ret->mkItem(toString(item.first).c_str(), false, toString(item.second));
276 }
277 for (auto item : myType->getParameter().jmParameter) {
278 ret->mkItem(toString(item.first).c_str(), false, toString(item.second));
279 }
281 ret->mkItem(TL("manoeuver Angle vs Times"), false, myType->getParameter().getManoeuverAngleTimesS());
282 }
284 return ret;
285}
286
287
288std::string
293 std::string align2 = toString(getLaneChangeModel().getDesiredAlignment());
294 if (align2 != align) {
295 align = align2 + " (default: " + align + ")";
296 }
297 return align;
298}
299
300void
302 glTranslated(0, 0, getType() + .2); // draw on top of cars
303 for (DriveItemVector::const_iterator i = myLFLinkLanes.begin(); i != myLFLinkLanes.end(); ++i) {
304 if ((*i).myLink == nullptr) {
305 continue;
306 }
307 MSLink* link = (*i).myLink;
308 MSLane* via = link->getViaLaneOrLane();
309 if (via != nullptr) {
310 Position p = via->getShape()[0];
311 if ((*i).mySetRequest) {
312 glColor3d(0, .8, 0);
313 } else {
314 glColor3d(.8, 0, 0);
315 }
316 const SUMOTime leaveTime = (*i).myLink->getLeaveTime(
317 (*i).myArrivalTime, (*i).myArrivalSpeed, (*i).getLeaveSpeed(), getVehicleType().getLength());
318 drawLinkItem(p, (*i).myArrivalTime, leaveTime, s.vehicleName.size / s.scale);
319 // the time slot that ego vehicle uses when checking opened may
320 // differ from the one it requests in setApproaching
321 MSLink::ApproachingVehicleInformation avi = (*i).myLink->getApproaching(this);
322 assert(avi.arrivalTime == (*i).myArrivalTime && avi.leavingTime == leaveTime);
323 UNUSED_PARAMETER(avi); // only used for assertion
324 }
325 }
326 glTranslated(0, 0, getType() - .2); // draw on top of cars
327}
328
329
330void
331GUIVehicle::drawAction_drawCarriageClass(const GUIVisualizationSettings& s, double scaledLength, bool asImage) const {
332 RGBColor current = GLHelper::getColor();
333 RGBColor darker = current.changedBrightness(-20);
334 const double exaggeration = (s.vehicleSize.getExaggeration(s, this)
336 if (exaggeration == 0) {
337 return;
338 }
339 MSTrainHelper trainHelper(this, scaledLength, isReversed() && s.drawReversed, s.secondaryShape, exaggeration, s.vehicleQuality);
340 const int numCarriages = trainHelper.getNumCarriages();
341 const int firstPassengerCarriage = trainHelper.getFirstPassengerCarriage();
342 const int noPersonsBackCarriages = (getVehicleType().getGuiShape() == SUMOVehicleShape::TRUCK_SEMITRAILER || getVehicleType().getGuiShape() == SUMOVehicleShape::TRUCK_1TRAILER) && numCarriages > 1 ? 1 : 0;
343 const int firstContainerCarriage = numCarriages == 1 || getVehicleType().getGuiShape() == SUMOVehicleShape::TRUCK_1TRAILER ? 0 : 1;
344 const int seatsPerCarriage = (int)ceil(getVType().getPersonCapacity() / (numCarriages - firstPassengerCarriage - noPersonsBackCarriages));
345 const int containersPerCarriage = (int)ceil(getVType().getContainerCapacity() / (numCarriages - firstContainerCarriage));
346 // Handle seats.
347 int requiredSeats = getNumPassengers();
348 int requiredPositions = getNumContainers();
349 if (requiredSeats > 0) {
350 mySeatPositions.clear();
351 }
352 if (requiredPositions > 0) {
353 myContainerPositions.clear();
354 }
355 GLHelper::popMatrix(); // undo initial translation and rotation
356 const double xCornerCut = 0.3 * exaggeration;
357 const double yCornerCut = MIN2(0.4 * trainHelper.getUpscaleLength(), trainHelper.getUpscaleLength() * scaledLength / 4);
358 Position front, back;
359 double angle = 0.0;
360 double curCLength = trainHelper.getFirstCarriageLength();
361 const std::vector<MSTrainHelper::Carriage*>& carriages = trainHelper.getCarriages();
362 for (int i = 0; i < numCarriages; ++i) {
363 front = carriages[i]->front;
364 back = carriages[i]->back;
365 if (front == back) {
366 // No place for drawing available.
367 continue;
368 }
369 const double drawnCarriageLength = front.distanceTo2D(back);
370 angle = atan2((front.x() - back.x()), (back.y() - front.y())) * (double) 180.0 / (double) M_PI;
371 // if we are in reverse 'first' carriages are drawn last so the >= test doesn't work
372 const bool reversed = trainHelper.isReversed();
373 if (reversed) {
374 if (i <= numCarriages - firstPassengerCarriage) {
375 computeSeats(back, front, SUMO_const_waitingPersonWidth, seatsPerCarriage, exaggeration, requiredSeats, mySeatPositions);
376 }
377 if (i <= numCarriages - firstContainerCarriage) {
378 computeSeats(front, back, SUMO_const_waitingContainerWidth, containersPerCarriage, exaggeration, requiredPositions, myContainerPositions);
379 }
380 } else {
381 if (i >= firstPassengerCarriage) {
382 computeSeats(front, back, SUMO_const_waitingPersonWidth, seatsPerCarriage, exaggeration, requiredSeats, mySeatPositions);
383 }
384 if (i >= firstContainerCarriage) {
385 computeSeats(front, back, SUMO_const_waitingContainerWidth, containersPerCarriage, exaggeration, requiredPositions, myContainerPositions);
386 }
387 }
388 curCLength = (i == trainHelper.getFirstCarriageNo() ? trainHelper.getFirstCarriageLength() : trainHelper.getCarriageLength());
390 if (s.trueZ) {
391 glTranslated(front.x(), front.y(), front.z() + 1);
392 } else {
393 glTranslated(front.x(), front.y(), getType());
394 }
395 glRotated(angle, 0, 0, 1);
396 double halfWidth = trainHelper.getHalfWidth();
397 std::string imgFile = getVType().getImgFile();
398 if (asImage && i != trainHelper.getFirstCarriageNo()) {
399 const size_t nImages = getVType().getParameter().carriageImages.size();
400 if (nImages > 0) {
401 const int carIndex = trainHelper.isReversed() ? numCarriages - i : i;
402 imgFile = getVType().getParameter().carriageImages[MIN2((int)nImages - 1, carIndex - 1)];
403 }
404 }
405 if (!asImage || !GUIBaseVehicleHelper::drawAction_drawVehicleAsImage(s, imgFile, this, getVType().getWidth() * exaggeration, curCLength)) {
406 switch (getVType().getGuiShape()) {
409 if (i == trainHelper.getFirstCarriageNo()) { // at the moment amReversed is only ever set for rail - so has no impact in this call
411 if (getVType().getGuiShape() == SUMOVehicleShape::TRUCK_SEMITRAILER) {
412 // default drawing uses a fixed cab length but we want to scale here
413 glScaled(1, curCLength / 2.5, 1);
414 }
415 GUIBaseVehicleHelper::drawAction_drawVehicleAsPoly(s, getVType().getGuiShape(), getVType().getWidth() * exaggeration, curCLength, 0, false, reversed);
417 } else {
418 GLHelper::setColor(current);
419 GLHelper::drawBoxLine(Position(0, 0), 180, curCLength, halfWidth);
420 }
421 break;
422 default: {
423 if (i == trainHelper.getFirstCarriageNo()) {
424 GLHelper::setColor(darker);
425 } else {
426 GLHelper::setColor(current);
427 }
428 // generic rail carriage
429 glBegin(GL_TRIANGLE_FAN);
430 glVertex2d(-halfWidth + xCornerCut, 0);
431 glVertex2d(-halfWidth, yCornerCut);
432 glVertex2d(-halfWidth, drawnCarriageLength - yCornerCut);
433 glVertex2d(-halfWidth + xCornerCut, drawnCarriageLength);
434 glVertex2d(halfWidth - xCornerCut, drawnCarriageLength);
435 glVertex2d(halfWidth, drawnCarriageLength - yCornerCut);
436 glVertex2d(halfWidth, yCornerCut);
437 glVertex2d(halfWidth - xCornerCut, 0);
438 glEnd();
439 // indicate front of the head of the train
440 if (i == trainHelper.getFirstCarriageNo()) {
441 glTranslated(0, 0, 0.1);
442 glColor3d(0, 0, 0);
443 glBegin(GL_TRIANGLE_FAN);
444 if (reversed) { // not quite correct as its drawing at the wrong end of the locomotive - however useful as visual indicator of reverse?
445 glVertex2d(-halfWidth + xCornerCut, yCornerCut);
446 glVertex2d(-halfWidth + 2 * xCornerCut, 3 * yCornerCut);
447 glVertex2d(halfWidth - 2 * xCornerCut, 3 * yCornerCut);
448 glVertex2d(halfWidth - xCornerCut, yCornerCut);
449 } else {
450 glVertex2d(-halfWidth + 2 * xCornerCut, yCornerCut);
451 glVertex2d(-halfWidth + xCornerCut, 3 * yCornerCut);
452 glVertex2d(halfWidth - xCornerCut, 3 * yCornerCut);
453 glVertex2d(halfWidth - 2 * xCornerCut, yCornerCut);
454 }
455 glEnd();
456 glTranslated(0, 0, -0.1);
457 }
458 }
459 }
460 }
462 }
463 if (getVType().getGuiShape() == SUMOVehicleShape::RAIL_CAR) {
465 if (s.trueZ) {
466 glTranslated(front.x(), front.y(), front.z() + 1);
467 } else {
468 glTranslated(front.x(), front.y(), getType());
469 }
470 glRotated(angle, 0, 0, 1);
474 }
475 // restore matrix
477 front = getPosition();
478 glTranslated(front.x(), front.y(), getType());
479 const double degAngle = RAD2DEG(getAngle() + M_PI / 2.);
480 glRotated(degAngle, 0, 0, 1);
481 glScaled(exaggeration, trainHelper.getUpscaleLength(), 1);
482 if (mySeatPositions.size() == 0) {
483 mySeatPositions.push_back(Seat(back, DEG2RAD(angle)));
484 }
485 if (myContainerPositions.size() == 0) {
486 myContainerPositions.push_back(Seat(back, DEG2RAD(angle)));
487 }
488}
489
490#define BLINKER_POS_FRONT .5
491#define BLINKER_POS_BACK .5
492
493inline void
494drawAction_drawBlinker(double dir, double length) {
495 glColor3d(1.f, .8f, 0);
497 glTranslated(dir, BLINKER_POS_FRONT, -0.1);
501 glTranslated(dir, length - BLINKER_POS_BACK, -0.1);
504}
505
506
507void
524
525
526inline void
527GUIVehicle::drawAction_drawVehicleBrakeLight(double length, bool onlyOne) const {
529 return;
530 }
531 glColor3f(1.f, .2f, 0);
533 if (onlyOne) {
534 glTranslated(0, length, -0.1);
536 } else {
537 glTranslated(-getVehicleType().getWidth() * 0.5, length, -0.1);
541 glTranslated(getVehicleType().getWidth() * 0.5, length, -0.1);
543 }
545}
546
547inline void
551 glTranslated(0, 2.5, .5);
552 glColor3f(0, 0, 1);
555 }
556}
557
558
559double
560GUIVehicle::getColorValue(const GUIVisualizationSettings& s, int activeScheme) const {
561 switch (activeScheme) {
562 case 8:
563 if (isStopped() && getNextStop().getSpeed() <= 0) {
564 return isParking() ? -2 : -1;
565 }
566 return getSpeed();
567 case 9:
568 // color by action step
569 if (isActionStep(SIMSTEP)) {
570 // Upcoming simstep is actionstep (t was already increased before drawing)
571 return 1.;
572 } else if (isActive()) {
573 // Completed simstep was actionstep
574 return 2.;
575 } else {
576 // not active
577 return 0.;
578 }
579 case 10:
580 return getWaitingSeconds();
581 case 11:
583 case 12:
585 case 13:
586 return getLane()->getVehicleMaxSpeed(this);
587 case 14:
588 return getEmissions<PollutantsInterface::CO2>();
589 case 15:
590 return getEmissions<PollutantsInterface::CO>();
591 case 16:
592 return getEmissions<PollutantsInterface::PM_X>();
593 case 17:
594 return getEmissions<PollutantsInterface::NO_X>();
595 case 18:
596 return getEmissions<PollutantsInterface::HC>();
597 case 19:
598 return getEmissions<PollutantsInterface::FUEL>();
599 case 20:
601 case 21:
602 return getNumberReroutes();
603 case 22:
605 case 23:
606 return getLaneChangeModel().isOpposite() ? -100 : getBestLaneOffset();
607 case 24:
608 return getAcceleration();
609 case 25:
610 return getTimeGapOnLane();
611 case 26:
612 return STEPS2TIME(getDepartDelay());
613 case 27:
614 return getEmissions<PollutantsInterface::ELEC>();
615 case 28:
617 case 29:
618 return getChargedEnergy();
619 case 30:
620 return getTimeLossSeconds();
621 case 31:
622 return getStopDelay();
623 case 32:
624 return getStopArrivalDelay();
625 case 33:
627 case 34: // by numerical param value
628 std::string error;
629 std::string val = getPrefixedParameter(s.vehicleParam, error);
630 try {
631 if (val == "") {
633 } else {
634 return StringUtils::toDouble(val);
635 }
636 } catch (NumberFormatException&) {
637 try {
638 return StringUtils::toBool(val);
639 } catch (BoolFormatException&) {
640 WRITE_WARNINGF(TL("Vehicle parameter '%' key '%' is not a number for vehicle '%'."),
643 }
644 }
645 }
646 return 0;
647}
648
649
650void
652 myLock.lock();
653 std::vector<std::vector<MSVehicle::LaneQ> > bestLanes = myBestLanes;
654 myLock.unlock();
655 for (std::vector<std::vector<MSVehicle::LaneQ> >::iterator j = bestLanes.begin(); j != bestLanes.end(); ++j) {
656 std::vector<MSVehicle::LaneQ>& lanes = *j;
657 double gmax = -1;
658 double rmax = -1;
659 for (std::vector<MSVehicle::LaneQ>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
660 gmax = MAX2((*i).length, gmax);
661 rmax = MAX2((*i).occupation, rmax);
662 }
663 for (std::vector<MSVehicle::LaneQ>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
664 const PositionVector& shape = (*i).lane->getShape();
665 double g = (*i).length / gmax;
666 double r = (*i).occupation / rmax;
667 glColor3d(r, g, 0);
668 double width = 0.5 / (1 + abs((*i).bestLaneOffset));
669 GLHelper::drawBoxLines(shape, width);
670
671 PositionVector s1 = shape;
672 s1.move2side((double) .1);
673 glColor3d(r, 0, 0);
675 s1.move2side((double) - .2);
676 glColor3d(0, g, 0);
678
679 glColor3d(r, g, 0);
680 }
681 }
682}
683
684
685void
686GUIVehicle::drawRouteHelper(const GUIVisualizationSettings& s, ConstMSRoutePtr r, bool future, bool noLoop, const RGBColor& col) const {
687 const double exaggeration = s.vehicleSize.getExaggeration(s, this) * (s.gaming ? 0.5 : 1);
688 MSRouteIterator start = future ? myCurrEdge : r->begin();
689 MSRouteIterator i = start;
690 const std::vector<MSLane*>& bestLaneConts = getBestLanesContinuation();
691 // draw continuation lanes when drawing the current route where available
692 int bestLaneIndex = (r == myRoute ? 0 : (int)bestLaneConts.size());
693 std::map<const MSLane*, int> repeatLane; // count repeated occurrences of the same edge
694 const double textSize = s.vehicleName.size / s.scale;
695 const GUILane* prevLane = nullptr;
696 int reversalIndex = 0;
697 const int indexDigits = (int)toString(r->size()).size();
698 if (!isOnRoad() && !isParking()) {
699 // simulation time has already advanced so isRemoteControlled is always false
700 const std::string offRoadLabel = hasInfluencer() && getInfluencer()->isRemoteAffected(SIMSTEP) ? "offRoad" : "teleporting";
701 GLHelper::drawTextSettings(s.vehicleValue, offRoadLabel, getPosition(), s.scale, s.angle, 1.0);
702 } else if (myLane->isInternal()) {
703 bestLaneIndex++;
704 }
705 const bool s2 = s.secondaryShape;
706 for (; i != r->end(); ++i) {
707 const GUILane* lane;
708 if (bestLaneIndex < (int)bestLaneConts.size() && bestLaneConts[bestLaneIndex] != 0 && (*i) == &(bestLaneConts[bestLaneIndex]->getEdge())) {
709 lane = static_cast<GUILane*>(bestLaneConts[bestLaneIndex]);
710 ++bestLaneIndex;
711 } else {
712 const std::vector<MSLane*>* allowed = (*i)->allowedLanes(getVClass());
713 if (allowed != nullptr && allowed->size() != 0) {
714 lane = static_cast<GUILane*>((*allowed)[0]);
715 } else {
716 lane = static_cast<GUILane*>((*i)->getLanes()[0]);
717 }
718 }
720 GLHelper::drawBoxLines(lane->getShape(s2), lane->getShapeRotations(s2), lane->getShapeLengths(s2), exaggeration);
721 if (prevLane != nullptr && lane->getBidiLane() == prevLane) {
722 // indicate train reversal
723 std::string label = "reverse:" + toString(reversalIndex++);
724 if (s.showRouteIndex) {
725 label += "@r" + toString((int)(i - myCurrEdge));
726 }
727 Position pos = lane->geometryPositionAtOffset(lane->getLength() / 2) - Position(0, textSize * repeatLane[lane]);
728 GLHelper::drawTextSettings(s.vehicleValue, label, pos, s.scale, s.angle, 1.0);
729 }
730 if (s.showRouteIndex) {
731 std::string label = toString((int)(i - myCurrEdge));
732 const double laneAngle = lane->getShape(s2).angleAt2D(0);
733 Position pos = lane->getShape(s2).front() - Position(0, textSize * repeatLane[lane]) + Position(
734 (laneAngle >= -0.25 * M_PI && laneAngle < 0.75 * M_PI ? 1 : -1) * 0.4 * indexDigits * textSize, 0);
735 //GLHelper::drawText(label, pos, 1.0, textSize, s.vehicleName.color);
736 GLHelper::drawTextSettings(s.vehicleName, label, pos, s.scale, s.angle, 1.0);
737 }
738 repeatLane[lane]++;
739 prevLane = lane;
740 if (noLoop && i != start && (*i) == (*start)) {
741 break;
742 }
743 }
744 drawStopLabels(s, noLoop, col);
747}
748
749
750double
754
755
756std::string
758 std::string result = "";
759 if (isParking()) {
760 result += "parking";
761 } else if (isStopped()) {
762 result += "stopped";
763 } else if (hasStops()) {
764 return "next: " + myStops.front().getDescription();
765 } else {
766 return "";
767 }
768 if (myStops.front().pars.triggered) {
769 result += ", triggered";
770 }
771 if (myStops.front().pars.containerTriggered) {
772 result += ", containerTriggered";
773 }
774 if (myStops.front().pars.collision) {
775 result += ", collision";
776 }
777 if (myStops.front().pars.arrival != -1) {
778 result += ", arrival=" + time2string(myStops.front().pars.arrival);
779 }
780 if (myStops.front().pars.started != -1) {
781 result += ", started=" + time2string(myStops.front().pars.started);
782 }
783 if (myStops.front().pars.until != -1) {
784 result += ", until=" + time2string(myStops.front().pars.until);
785 }
786 if (myStops.front().pars.extension != -1) {
787 result += ", extension=" + time2string(myStops.front().pars.extension);
788 }
789 if (!myStops.front().pars.permitted.empty()) {
790 result += ", permitted=" + toString(myStops.front().pars.permitted);
791 }
792 if (myStops.front().pars.actType != "") {
793 result += ", actType=" + myStops.front().pars.actType;
794 }
795 result += ", duration=" + time2string(myStops.front().duration);
796 return StringUtils::wrapText(result, 60);
797}
798
799
800void
802 double dist = myLane->getLength() - getPositionOnLane();
803#ifdef DEBUG_FOES
804 gDebugFlag1 = true;
805 std::cout << SIMTIME << " selectBlockingFoes veh=" << getID() << " dist=" << dist << " numLinks=" << myLFLinkLanes.size() << "\n";
806#endif
807 for (DriveItemVector::const_iterator i = myLFLinkLanes.begin(); i != myLFLinkLanes.end(); ++i) {
808 const DriveProcessItem& dpi = *i;
809 if (dpi.myLink == nullptr) {
811 continue;
812 }
813 MSLink::BlockingFoes blockingFoes;
814 std::vector<const MSPerson*> blockingPersons;
815#ifdef DEBUG_FOES
816 std::cout << " foeLink=" << dpi.myLink->getViaLaneOrLane()->getID() << "\n";
817 const bool isOpen =
818#endif
821#ifdef DEBUG_FOES
822 if (!isOpen) {
823 std::cout << " closed due to:\n";
824 for (const auto& item : blockingFoes) {
825 std::cout << " " << item->getID() << "\n";
826 }
827 }
828#endif
829 if (getLaneChangeModel().getShadowLane() != nullptr) {
831 if (parallelLink != nullptr) {
832 const double shadowLatPos = getLateralPositionOnLane() - getLaneChangeModel().getShadowDirection() * 0.5 * (
834#ifdef DEBUG_FOES
835 const bool isShadowOpen =
836#endif
837 parallelLink->opened(dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(),
840 getWaitingTime(), shadowLatPos, &blockingFoes, false, this, dpi.myDistance);
841#ifdef DEBUG_FOES
842 if (!isShadowOpen) {
843 std::cout << " foes at shadow link=" << parallelLink->getViaLaneOrLane()->getID() << ":\n";
844 for (const auto& item : blockingFoes) {
845 std::cout << " " << item->getID() << "\n";
846 }
847 }
848#endif
849 }
850 }
851 for (const auto& item : blockingFoes) {
852 if (item->isVehicle()) {
853 gSelected.select(static_cast<const GUIVehicle*>(item)->getGlID());
854 } else {
855 gSelected.select(static_cast<const GUIPerson*>(item)->getGlID());
856 }
857 }
858 const MSLink::LinkLeaders linkLeaders = (dpi.myLink)->getLeaderInfo(this, dist, &blockingPersons);
859#ifdef DEBUG_FOES
860 gDebugFlag1 = false;
861#endif
862 for (MSLink::LinkLeaders::const_iterator it = linkLeaders.begin(); it != linkLeaders.end(); ++it) {
863 // the vehicle to enter the junction first has priority
864 const GUIVehicle* leader = dynamic_cast<const GUIVehicle*>(it->vehAndGap.first);
865 if (leader != nullptr) {
866 if (isLeader(dpi.myLink, leader, it->vehAndGap.second) || it->inTheWay()) {
867 gSelected.select(leader->getGlID());
868#ifdef DEBUG_FOES
869 std::cout << " linkLeader=" << leader->getID() << "\n";
870#endif
871 }
872 } else {
873 for (std::vector<const MSPerson*>::iterator it_p = blockingPersons.begin(); it_p != blockingPersons.end(); ++it_p) {
874 const GUIPerson* foe = dynamic_cast<const GUIPerson*>(*it_p);
875 if (foe != nullptr) {
876 gSelected.select(foe->getGlID());
877 //std::cout << SIMTIME << " veh=" << getID() << " is blocked on link " << dpi.myLink->getRespondIndex() << " to " << dpi.myLink->getViaLaneOrLane()->getID() << " by pedestrian. dist=" << it->second << "\n";
878 }
879 }
880 }
881 }
882 dist += dpi.myLink->getViaLaneOrLane()->getLength();
883 }
884}
885
886
887void
891 if (view != nullptr) {
892 if (add) {
896 }
897 } else {
899 myAdditionalVisualizations[view] &= ~VO_DRAW_OUTSIDE_NETWORK;
900 }
901 }
902}
903
904bool
908
909int
911 const double rightSide = getRightSideOnEdge();
912 const std::vector<double>& sublaneSides = myLane->getEdge().getSubLaneSides();
913 for (int i = 0; i < (int)sublaneSides.size(); ++i) {
914 if (sublaneSides[i] > rightSide) {
915 return MAX2(i - 1, 0);
916 }
917 }
918 return (int)sublaneSides.size() - 1;
919}
920
921int
923 const double leftSide = getLeftSideOnEdge();
924 const std::vector<double>& sublaneSides = myLane->getEdge().getSubLaneSides();
925 for (int i = (int)sublaneSides.size() - 1; i >= 0; --i) {
926 if (sublaneSides[i] < leftSide) {
927 return i;
928 }
929 }
930 return -1;
931}
932
933
934std::string
936 return toString((LaneChangeAction)getLaneChangeModel().getSavedState(-1).second);
937}
938
939std::string
941 return toString((LaneChangeAction)getLaneChangeModel().getSavedState(1).second);
942}
943
944std::string
946 return toString((LaneChangeAction)getLaneChangeModel().getSavedState(0).second);
947}
948
949std::string
951 return Named::getIDSecure(myLane, "n/a");
952}
953
954std::string
958
959std::string
961 return Named::getIDSecure(getLaneChangeModel().getShadowLane(), "");
962}
963
964std::string
966 return Named::getIDSecure(getLaneChangeModel().getTargetLane(), "");
967}
968
969
970std::string
972 std::vector<std::string> result;
973 for (auto item : myMoveReminders) {
974 const MSDriveWay* dw = dynamic_cast<const MSDriveWay*>(item.first);
975 if (dw) {
976 result.push_back(dw->getID());
977 }
978 }
979 return StringUtils::wrapText(joinToStringSorting(result, " "), 60);
980}
981
982double
986
987std::string
989 return std::bitset<7>(getInfluencer()->getSpeedMode()).to_string();
990}
991
992std::string
994 return std::bitset<12>(getInfluencer()->getLaneChangeMode()).to_string();
995}
996
997void
999 SUMOTime intermediateDuration = TIME2STEPS(20);
1000 SUMOTime finalDuration = SUMOTime_MAX;
1001 if (myParameter->stops.size() >= 2) {
1002 // copy durations from the original stops
1003 intermediateDuration = myParameter->stops.front().duration;
1004 finalDuration = myParameter->stops.back().duration;
1005 }
1006 // if the stop is already in the list of stops, cancel all stops that come
1007 // after it and set the stop duration
1008 std::string line = "";
1009 int destinations = 0;
1010 bool add = true;
1011 for (auto it = myStops.begin(); it != myStops.end(); it++) {
1012 if (!it->reached && destinations < 2 && it->busstop != nullptr) {
1013 line += it->busstop->getID();
1014 destinations++;
1015 }
1016 if (it->busstop == busStop) {
1017 it->duration = finalDuration;
1018 myStops.erase(++it, myStops.end());
1019 add = false;
1020 break;
1021 } else {
1022 it->duration = MIN2(it->duration, intermediateDuration);
1023 }
1024 }
1025 if (destinations < 2) {
1026 line += busStop->getID();
1027 }
1028 if (add) {
1029 // create new stop
1031 stopPar.busstop = busStop->getID();
1032 stopPar.lane = busStop->getLane().getID();
1033 stopPar.startPos = busStop->getBeginLanePosition();
1034 stopPar.endPos = busStop->getEndLanePosition();
1035 stopPar.duration = finalDuration;
1036 stopPar.until = -1;
1037 stopPar.triggered = false;
1038 stopPar.containerTriggered = false;
1039 stopPar.parking = ParkingType::ONROAD;
1040 stopPar.index = STOP_INDEX_FIT;
1042 // clean up prior route to improve visualisation, ensure that the stop can be added immediately
1043 ConstMSEdgeVector edges = myRoute->getEdges();
1044 edges.erase(edges.begin(), edges.begin() + getRoutePosition());
1045 edges.push_back(&busStop->getLane().getEdge());
1046 replaceRouteEdges(edges, -1, 0, "DRT.tmp", false, false, false);
1047 std::string errorMsg;
1048 // add stop
1049 addStop(stopPar, errorMsg);
1050 }
1051 const bool hasReroutingDevice = getDevice(typeid(MSDevice_Routing)) != nullptr;
1052 SUMOAbstractRouter<MSEdge, SUMOVehicle>& router = hasReroutingDevice
1055 // reroute to ensure the new stop is reached
1056 reroute(MSNet::getInstance()->getCurrentTimeStep(), "DRT", router);
1057 myParameter->line = line;
1058 assert(haveValidStopEdges());
1059}
1060
1062GUIVehicle::getVisualPosition(bool s2, const double offset) const {
1063 if (s2) {
1064 // see MSVehicle::getPosition
1065 if (myLane == nullptr) {
1066 return Position::INVALID;
1067 }
1068 if (isParking()) {
1069 if (myStops.begin()->parkingarea != nullptr) {
1070 return myStops.begin()->parkingarea->getVehiclePosition(*this);
1071 } else {
1072 // position beside the road
1073 PositionVector shp = myLane->getEdge().getLanes()[0]->getShape(s2);
1075 return shp.positionAtOffset((getPositionOnLane() + offset) * myLane->getLengthGeometryFactor(s2));
1076 }
1077 }
1078 const PositionVector& shape = myLane->getShape(s2);
1079 const double posLat = (MSGlobals::gLefthand ? 1 : -1) * getLateralPositionOnLane();
1080 return shape.positionAtOffset((getPositionOnLane() + offset) * myLane->getLengthGeometryFactor(s2), posLat);
1081 } else {
1082 return getPosition(offset);
1083 }
1084}
1085
1086
1087double
1089 if (s2) {
1090 // see MSVehicle::computeAngle
1091 const PositionVector& shape = myLane->getShape(s2);
1092 if (isParking()) {
1093 if (myStops.begin()->parkingarea != nullptr) {
1094 return myStops.begin()->parkingarea->getVehicleAngle(*this);
1095 } else {
1097 }
1098 }
1099 // if (myLaneChangeModel->isChangingLanes()) {
1100 const double lefthandSign = (MSGlobals::gLefthand ? -1 : 1);
1101 Position p1 = getVisualPosition(s2);
1102 Position p2 = getVisualPosition(s2, MAX2(0.0, -myType->getLength()));
1103 double result = (p1 != p2 ? p2.angleTo2D(p1) :
1106 result += lefthandSign * DEG2RAD(myLaneChangeModel->getAngleOffset());
1107 }
1108 return result;
1109 } else {
1110 return getAngle();
1111 }
1112}
1113/****************************************************************************/
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:44
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:330
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition ToString.h:314
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
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:1135
const PositionVector & getShape(bool secondary) const override
Definition GUILane.cpp:1129
const std::vector< double > & getShapeLengths(bool secondary) const
Definition GUILane.cpp:1141
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:285
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:165
static double gLateralResolution
Definition MSGlobals.h:100
static bool gLefthand
Whether lefthand-drive is being simulated.
Definition MSGlobals.h:177
static bool gSublane
whether sublane simulation is enabled (sublane model or continuous lanechanging)
Definition MSGlobals.h:168
static SUMOTime gLaneChangeDuration
Definition MSGlobals.h:97
static SUMOTime gWaitingTimeMemory
length of memory for waiting times (in millisecs)
Definition MSGlobals.h:118
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:632
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:2659
MSLane * getBidiLane() const
retrieve bidirectional lane or nullptr
Definition MSLane.cpp:4750
virtual const PositionVector & getShape(bool) const
Definition MSLane.h:294
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:790
double getWidth() const
Returns the lane's width.
Definition MSLane.h:661
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:199
MSVehicleRouter & getRouterTT(int rngIndex, const Prohibitions &prohibited={}) const
Definition MSNet.cpp:1645
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
void cleanupFurtherLanes()
remove vehicle from further lanes (on leaving the network)
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:1911
std::vector< MSLane * > myFurtherLanes
The information into which lanes the vehicle laps into.
Definition MSVehicle.h:1938
bool signalSet(int which) const
Returns whether the given signal is on.
Definition MSVehicle.h:1194
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:1116
@ VEH_SIGNAL_BRAKELIGHT
The brake lights are on.
Definition MSVehicle.h:1122
@ VEH_SIGNAL_EMERGENCY_BLUE
A blue emergency light is on.
Definition MSVehicle.h:1138
@ VEH_SIGNAL_BLINKER_LEFT
Left blinker lights are switched on.
Definition MSVehicle.h:1118
@ VEH_SIGNAL_BLINKER_EMERGENCY
Blinker lights on both sides are switched on.
Definition MSVehicle.h:1120
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:1921
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:973
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:1909
bool hasInfluencer() const
whether the vehicle is individually influenced (via TraCI or special parameters)
Definition MSVehicle.h:1706
DriveItemVector myLFLinkLanes
container for the planned speeds in the current step
Definition MSVehicle.h:2046
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:66
const std::string & getID() const
Returns the id.
Definition Named.h:73
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:210
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:1985
double getLeaveSpeed() const
Definition MSVehicle.h:2036