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