Eclipse SUMO - Simulation of Urban MObility
MSTransportable.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
20 // The common superclass for modelling transportable objects like persons and containers
21 /****************************************************************************/
22 #include <config.h>
23 
25 #include <utils/geom/GeomHelper.h>
29 #include <libsumo/TraCIConstants.h>
30 #include <microsim/MSEdge.h>
31 #include <microsim/MSLane.h>
32 #include <microsim/MSNet.h>
43 
45 
46 //#define DEBUG_PARKING
47 
48 // ===========================================================================
49 // method definitions
50 // ===========================================================================
52  SUMOTrafficObject(pars->id),
53  myParameter(pars), myVType(vtype), myPlan(plan),
54  myAmPerson(isPerson),
55  myNumericalID(myCurrentNumericalIndex++) {
56  myStep = myPlan->begin();
57  // init devices
59  for (MSStage* const stage : * myPlan) {
60  stage->init(this);
61  }
62 }
63 
64 
66  if (myStep != myPlan->end() && getCurrentStageType() == MSStageType::DRIVING) {
67  MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
68  if (stage->getVehicle() != nullptr) {
69  stage->getVehicle()->removeTransportable(this);
70  } else if (stage->getOriginStop() != nullptr) {
71  stage->getOriginStop()->removeTransportable(this);
72  }
73  }
74  if (myPlan != nullptr) {
75  for (MSTransportablePlan::const_iterator i = myPlan->begin(); i != myPlan->end(); ++i) {
76  delete *i;
77  }
78  delete myPlan;
79  myPlan = nullptr;
80  }
81  for (MSTransportableDevice* dev : myDevices) {
82  delete dev;
83  }
84  delete myParameter;
85  if (myVType->isVehicleSpecific()) {
87  }
88 }
89 
90 SumoRNG*
92  return getEdge()->getLanes()[0]->getRNG();
93 }
94 
95 int
97  return getEdge()->getLanes()[0]->getRNGIndex();
98 }
99 
100 bool
101 MSTransportable::proceed(MSNet* net, SUMOTime time, const bool vehicleArrived) {
102  MSStage* const prior = *myStep;
103  const std::string& error = prior->setArrived(net, this, time, vehicleArrived);
104  // must be done before increasing myStep to avoid invalid state for rendering
105  prior->getEdge()->removeTransportable(this);
106  myStep++;
107  if (error != "") {
108  throw ProcessError(error);
109  }
110  /* We need to check whether an access stage is needed (or maybe even two).
111  The general scheme is: If the prior stage ended at a stop and the next stage
112  starts at an edge which is not the one the stop is at, but the stop has an access to it
113  we need an access stage. The same is true if prior ends at an edge, the next stage
114  is allowed to start at any stop the edge has access to.
115  If we start at a stop or end at a stop no access is needed.
116  */
117  bool accessToStop = false;
118  if (prior->getStageType() == MSStageType::WALKING || prior->getStageType() == MSStageType::DRIVING) {
119  accessToStop = checkAccess(prior);
120  } else if (prior->getStageType() == MSStageType::WAITING_FOR_DEPART) {
121  for (MSTransportableDevice* const dev : myDevices) {
122  dev->notifyEnter(*this, MSMoveReminder::NOTIFICATION_DEPARTED, nullptr);
123  }
124  }
125  if (!accessToStop && (myStep == myPlan->end()
126  || ((*myStep)->getStageType() != MSStageType::DRIVING
127  && (*myStep)->getStageType() != MSStageType::TRIP))) {
128  MSStoppingPlace* priorStop = prior->getStageType() == MSStageType::TRIP ? prior->getOriginStop() : prior->getDestinationStop();
129  // a trip might resolve to DRIVING so we would have to stay at the stop
130  // if a trip resolves to something else, this step will do stop removal
131  if (priorStop != nullptr) {
132  priorStop->removeTransportable(this);
133  }
134  }
135  if (myStep != myPlan->end()) {
136  if ((*myStep)->getStageType() == MSStageType::WALKING && (prior->getStageType() != MSStageType::ACCESS || prior->getDestination() != (*myStep)->getFromEdge())) {
137  checkAccess(prior, false);
138  }
139  (*myStep)->proceed(net, this, time, prior);
140  return true;
141  } else {
143  return false;
144  }
145 }
146 
147 
148 void
149 MSTransportable::setID(const std::string& /*newID*/) {
150  throw ProcessError(TL("Changing a transportable ID is not permitted"));
151 }
152 
153 SUMOTime
155  return myParameter->depart;
156 }
157 
158 void
160  (*myStep)->setDeparted(now);
161 }
162 
163 SUMOTime
165  for (const MSStage* const stage : *myPlan) {
166  if (stage->getDeparted() >= 0) {
167  return stage->getDeparted();
168  }
169  }
170  return -1;
171 }
172 
173 
174 double
176  return (*myStep)->getEdgePos(MSNet::getInstance()->getCurrentTimeStep());
177 }
178 
179 double
181  return getEdgePos() - getVehicleType().getLength();
182 }
183 
184 int
186  return (*myStep)->getDirection();
187 }
188 
189 Position
191  return (*myStep)->getPosition(MSNet::getInstance()->getCurrentTimeStep());
192 }
193 
194 double
196  return (*myStep)->getAngle(MSNet::getInstance()->getCurrentTimeStep());
197 }
198 
199 double
201  return STEPS2TIME((*myStep)->getWaitingTime(MSNet::getInstance()->getCurrentTimeStep()));
202 }
203 
204 double
206  return (*myStep)->getSpeed();
207 }
208 
209 
210 void
212  os.openTag(isPerson() ? "personinfo" : "containerinfo");
216  if (isPerson()) {
218  }
219  SUMOTime duration = 0;
220  SUMOTime waitingTime = 0;
221  SUMOTime timeLoss = 0;
222  SUMOTime travelTime = 0;
223  bool durationOK = true;
224  bool waitingTimeOK = true;
225  bool timeLossOK = true;
226  bool travelTimeOK = true;
227  for (MSStage* const i : *myPlan) {
228  SUMOTime t = i->getDuration();
229  if (t != SUMOTime_MAX) {
230  duration += t;
231  } else {
232  durationOK = false;
233  }
234  t = i->getWaitingTime();
235  if (t != SUMOTime_MAX) {
236  waitingTime += t;
237  } else {
238  waitingTimeOK = false;
239  }
240  t = i->getTimeLoss(this);
241  if (t != SUMOTime_MAX) {
242  timeLoss += t;
243  } else {
244  timeLossOK = false;
245  }
246  t = i->getTravelTime();
247  if (t != SUMOTime_MAX) {
248  travelTime += t;
249  } else {
250  travelTimeOK = false;
251  }
252  }
253  os.writeAttr(SUMO_ATTR_DURATION, durationOK ? time2string(duration) : "-1");
254  os.writeAttr(SUMO_ATTR_WAITINGTIME, waitingTimeOK ? time2string(waitingTime) : "-1");
255  os.writeAttr(SUMO_ATTR_TIMELOSS, timeLossOK ? time2string(timeLoss) : "-1");
256  os.writeAttr(SUMO_ATTR_TRAVELTIME, travelTimeOK ? time2string(travelTime) : "-1");
257  for (MSStage* const i : *myPlan) {
258  i->tripInfoOutput(os, this);
259  }
260  os.closeTag();
261 }
262 
263 
264 void
265 MSTransportable::routeOutput(OutputDevice& os, const bool withRouteLength) const {
266  const std::string typeID = (
270  if (hasArrived()) {
271  os.writeAttr("arrival", time2string(MSNet::getInstance()->getCurrentTimeStep()));
272  }
273  const MSStage* previous = nullptr;
274  for (const MSStage* const stage : *myPlan) {
275  stage->routeOutput(myAmPerson, os, withRouteLength, previous);
276  previous = stage;
277  }
279  os.closeTag();
280  os.lf();
281 }
282 
283 
284 void
286  if (timeout < 0 && myAbortCommand != nullptr) {
288  myAbortCommand = nullptr;
289  return;
290  }
293 }
294 
295 
296 SUMOTime
298  WRITE_WARNINGF(TL("Teleporting % '%'; waited too long, from edge '%', time=%."),
299  isPerson() ? "person" : "container", getID(), (*myStep)->getEdge()->getID(), time2string(step));
302  (*myStep)->abort(this);
303  if (!proceed(MSNet::getInstance(), step)) {
304  tc.erase(this);
305  }
306  return 0;
307 }
308 
309 
310 
311 void
313  // myStep is invalidated upon modifying myPlan
314  const int stepIndex = (int)(myStep - myPlan->begin());
315  if (next < 0) {
316  myPlan->push_back(stage);
317  } else {
318  if (stepIndex + next > (int)myPlan->size()) {
319  throw ProcessError("invalid index '" + toString(next) + "' for inserting new stage into plan of '" + getID() + "'");
320  }
321  myPlan->insert(myPlan->begin() + stepIndex + next, stage);
322  }
323  myStep = myPlan->begin() + stepIndex;
324 }
325 
326 
327 void
328 MSTransportable::removeStage(int next, bool stayInSim) {
329  assert(myStep + next < myPlan->end());
330  assert(next >= 0);
331  if (next > 0) {
332  // myStep is invalidated upon modifying myPlan
333  int stepIndex = (int)(myStep - myPlan->begin());
334  delete *(myStep + next);
335  myPlan->erase(myStep + next);
336  myStep = myPlan->begin() + stepIndex;
337  } else {
338  if (myStep + 1 == myPlan->end() && stayInSim) {
339  // stay in the simulation until the start of simStep to allow appending new stages (at the correct position)
340  appendStage(new MSStageWaiting(getEdge(), nullptr, 0, 0, getEdgePos(), "last stage removed", false));
341  }
342  (*myStep)->abort(this);
345  }
346  }
347 }
348 
349 
350 void
352  for (MSTransportablePlan::const_iterator i = myStep; i != myPlan->end(); ++i) {
353  (*i)->setSpeed(speed);
354  }
355  getSingularType().setMaxSpeed(speed);
356 }
357 
358 
359 bool
360 MSTransportable::replaceRoute(ConstMSRoutePtr newRoute, const std::string& /* info */, bool /* onInit */, int /* offset */, bool /* addRouteStops */, bool /* removeStops */, std::string* /* msgReturn */) {
361  if (isPerson()) {
362  static_cast<MSPerson*>(this)->reroute(newRoute->getEdges(), getPositionOnLane(), 0, 1);
363  return true;
364  }
365  return false;
366 }
367 
368 
369 void
371  const SUMOVehicleClass oldVClass = myVType->getVehicleClass();
372  if (myVType->isVehicleSpecific()) {
374  }
375  if (isPerson()
376  && type->getVehicleClass() != oldVClass
377  && type->getVehicleClass() != SVC_PEDESTRIAN
379  WRITE_WARNINGF(TL("Person '%' receives type '%' which implicitly uses unsuitable vClass '%'."), getID(), type->getID(), toString(type->getVehicleClass()));
380  }
381  myVType = type;
382 }
383 
384 
387  if (myVType->isVehicleSpecific()) {
388  return *myVType;
389  }
390  MSVehicleType* type = myVType->buildSingularType(myVType->getID() + "@" + getID());
391  replaceVehicleType(type);
392  return *type;
393 }
394 
395 
398  PositionVector centerLine;
399  const Position p = getPosition();
400  const double angle = getAngle();
401  const double length = getVehicleType().getLength();
402  const Position back = p + Position(-cos(angle) * length, -sin(angle) * length);
403  centerLine.push_back(p);
404  centerLine.push_back(back);
405  centerLine.move2side(0.5 * getVehicleType().getWidth());
406  PositionVector result = centerLine;
407  centerLine.move2side(-getVehicleType().getWidth());
408  result.append(centerLine.reverse(), POSITION_EPS);
409  //std::cout << " transp=" << getID() << " p=" << p << " angle=" << GeomHelper::naviDegree(angle) << " back=" << back << " result=" << result << "\n";
410  return result;
411 }
412 
413 
414 std::string
415 MSTransportable::getStageSummary(int stageIndex) const {
416  assert(stageIndex < (int)myPlan->size());
417  assert(stageIndex >= 0);
418  return (*myPlan)[stageIndex]->getStageSummary(myAmPerson);
419 }
420 
421 
422 const std::set<SUMOTrafficObject::NumericalID>
424  std::set<SUMOTrafficObject::NumericalID> result;
425  for (auto step = myStep; step != myPlan->end(); ++step) {
426  for (const MSEdge* const e : (*step)->getEdges()) {
427  result.insert(e->getNumericalID());
428  }
429  }
430  return result;
431 }
432 
433 
434 bool
436  return myStep == myPlan->end();
437 }
438 
439 bool
441  return myPlan->size() > 0 && (myPlan->front()->getDeparted() >= 0 || myStep > myPlan->begin());
442 }
443 
444 
445 void
447  // check whether the transportable was riding to the orignal stop
448  // @note: parkingArea can currently not be set as myDestinationStop so we
449  // check for stops on the edge instead
450 #ifdef DEBUG_PARKING
451  std::cout << SIMTIME << " person=" << getID() << " rerouteParkingArea orig=" << orig->getID() << " replacement=" << replacement->getID() << "\n";
452 #endif
454  if (!myAmPerson) {
455  WRITE_WARNING(TL("parkingAreaReroute not support for containers"));
456  return;
457  }
458  if (getDestination() == &orig->getLane().getEdge()) {
459  MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
460  assert(stage != 0);
461  assert(stage->getVehicle() != 0);
462  // adapt plan
463  stage->setDestination(&replacement->getLane().getEdge(), replacement);
464  stage->setArrivalPos((replacement->getBeginLanePosition() + replacement->getEndLanePosition()) / 2);
465 #ifdef DEBUG_PARKING
466  std::cout << " set ride destination\n";
467 #endif
468  if (myStep + 1 == myPlan->end()) {
469  return;
470  }
471  // if the next step is a walk, adapt the route
472  MSStage* nextStage = *(myStep + 1);
473  if (nextStage->getStageType() == MSStageType::TRIP) {
474  dynamic_cast<MSStageTrip*>(nextStage)->setOrigin(stage->getDestination());
475 #ifdef DEBUG_PARKING
476  std::cout << " set subsequent trip origin\n";
477 #endif
478  } else if (nextStage->getStageType() == MSStageType::WALKING) {
479 #ifdef DEBUG_PARKING
480  std::cout << " replace subsequent walk with a trip\n";
481 #endif
482  MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
483  nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
484  removeStage(1);
485  appendStage(newStage, 1);
486  } else if (nextStage->getStageType() == MSStageType::WAITING) {
487 #ifdef DEBUG_PARKING
488  std::cout << " add subsequent walk to reach stop\n";
489  std::cout << " arrivalPos=" << nextStage->getArrivalPos() << "\n";
490 #endif
491  MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
492  nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
493  appendStage(newStage, 1);
494  }
495  // if the plan contains another ride with the same vehicle from the same
496  // parking area, adapt the preceeding walk to end at the replacement
497  for (auto it = myStep + 2; it != myPlan->end(); it++) {
498  MSStage* const futureStage = *it;
499  MSStage* const prevStage = *(it - 1);
500  if (futureStage->getStageType() == MSStageType::DRIVING) {
501  MSStageDriving* const ds = static_cast<MSStageDriving*>(futureStage);
502  // ride origin is set implicitly from the walk destination
503  ds->setOrigin(nullptr);
504  if (ds->getLines() == stage->getLines()
505  && prevStage->getDestination() == &orig->getLane().getEdge()) {
506  if (prevStage->getStageType() == MSStageType::TRIP) {
507  dynamic_cast<MSStageTrip*>(prevStage)->setDestination(stage->getDestination(), replacement);
508 #ifdef DEBUG_PARKING
509  std::cout << " replace later trip before ride (" << (it - myPlan->begin()) << ")\n";
510 #endif
511  } else if (prevStage->getStageType() == MSStageType::WALKING) {
512 #ifdef DEBUG_PARKING
513  std::cout << " replace later walk before ride (" << (it - myPlan->begin()) << ")\n";
514 #endif
515  MSStageTrip* newStage = new MSStageTrip(prevStage->getFromEdge(), nullptr, stage->getDestination(),
516  replacement, -1, 0, "", -1, 1, getID(), 0, true, stage->getArrivalPos());
517  int prevStageRelIndex = (int)(it - 1 - myStep);
518  removeStage(prevStageRelIndex);
519  appendStage(newStage, prevStageRelIndex);
520  }
521  break;
522  }
523  }
524  }
525  }
526 }
527 
528 
529 MSDevice*
530 MSTransportable::getDevice(const std::type_info& type) const {
531  for (MSTransportableDevice* const dev : myDevices) {
532  if (typeid(*dev) == type) {
533  return dev;
534  }
535  }
536  return nullptr;
537 }
538 
539 
540 void
541 MSTransportable::setJunctionModelParameter(const std::string& key, const std::string& value) {
544  const_cast<SUMOVehicleParameter&>(getParameter()).setParameter(key, value);
545  // checked in MSLink::ignoreFoe
546  } else {
547  throw InvalidArgument(getObjectType() + " '" + getID() + "' does not support junctionModel parameter '" + key + "'");
548  }
549 }
550 
551 
552 double
554  const MSEdge* edge = getEdge();
555  const double ep = getEdgePos();
556  const double gp = edge->getLanes()[0]->interpolateLanePosToGeometryPos(ep);
557  return edge->getLanes()[0]->getShape().slopeDegreeAtOffset(gp);
558 }
559 
560 
561 SUMOTime
562 MSTransportable::getWaitingTime(const bool /* accumulated */) const {
563  return (*myStep)->getWaitingTime(MSNet::getInstance()->getCurrentTimeStep());
564 }
565 
566 
567 double
569  return MIN2(getVehicleType().getMaxSpeed(), getVehicleType().getDesiredMaxSpeed() * getChosenSpeedFactor());
570 }
571 
572 
575  return getVehicleType().getVehicleClass();
576 }
577 
578 
579 int
583 }
584 
585 void
587  // this saves lots of departParameters which are only needed for transportables that did not yet depart
588  // the parameters may hold the name of a vTypeDistribution but we are interested in the actual type
594  }
595  int stepIdx = (int)(myStep - myPlan->begin());
596  for (auto it = myPlan->begin(); it != myStep; ++it) {
597  const MSStageType st = (*it)->getStageType();
598  if (st == MSStageType::TRIP || st == MSStageType::ACCESS) {
599  stepIdx--;
600  }
601  }
602  std::ostringstream state;
603  state << myParameter->parametersSet << " " << stepIdx;
604  (*myStep)->saveState(state);
605  out.writeAttr(SUMO_ATTR_STATE, state.str());
606  const MSStage* previous = nullptr;
607  for (const MSStage* const stage : *myPlan) {
608  stage->routeOutput(myAmPerson, out, false, previous);
609  previous = stage;
610  }
611  out.closeTag();
612 }
613 
614 
615 void
616 MSTransportable::loadState(const std::string& state) {
617  std::istringstream iss(state);
618  int step;
619  iss >> myParameter->parametersSet >> step;
620  myStep = myPlan->begin() + step;
621  (*myStep)->loadState(this, iss);
622 }
623 
624 
625 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
MSStageType
Definition: MSStage.h:54
#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 SUMOTime_MAX
Definition: SUMOTime.h:34
#define SIMTIME
Definition: SUMOTime.h:62
const long long int VTYPEPARS_VEHICLECLASS_SET
const std::string DEFAULT_PEDTYPE_ID
const std::string DEFAULT_CONTAINERTYPE_ID
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_PEDESTRIAN
pedestrian
const int VEHPARS_JUNCTIONMODEL_PARAMS_SET
const int VEHPARS_SPEEDFACTOR_SET
@ SUMO_TAG_CONTAINER
@ SUMO_TAG_PERSON
@ SUMO_ATTR_DEPART
@ SUMO_ATTR_WAITINGTIME
@ SUMO_ATTR_JM_IGNORE_IDS
@ SUMO_ATTR_TRAVELTIME
@ SUMO_ATTR_JM_IGNORE_TYPES
@ SUMO_ATTR_TIMELOSS
@ SUMO_ATTR_SPEEDFACTOR
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_ID
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_STATE
The state of a link.
int gPrecision
the precision for floating point outputs
Definition: StdDefs.cpp:26
int gPrecisionRandom
Definition: StdDefs.cpp:28
T MIN2(T a, T b)
Definition: StdDefs.h:76
T MAX2(T a, T b)
Definition: StdDefs.h:82
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
Abstract in-vehicle / in-person device.
Definition: MSDevice.h:62
static void buildTransportableDevices(MSTransportable &p, std::vector< MSTransportableDevice * > &into)
Build devices for the given person, if needed.
Definition: MSDevice.cpp:137
A road/street connecting two junctions.
Definition: MSEdge.h:77
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition: MSEdge.h:168
virtual void removeTransportable(MSTransportable *t) const
Definition: MSEdge.cpp:1133
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
Representation of a lane in the micro simulation.
Definition: MSLane.h:84
MSEdge & getEdge() const
Returns the lane's edge.
Definition: MSLane.h:756
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
The simulated network and simulation perfomer.
Definition: MSNet.h:89
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:182
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition: MSNet.cpp:1182
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:378
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition: MSNet.h:320
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition: MSNet.h:471
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition: MSNet.cpp:1173
const std::set< std::string > & getLines() const
MSStoppingPlace * getOriginStop() const
returns the origin stop (if any). only needed for MSStageTrip
SUMOVehicle * getVehicle() const
Current vehicle in which the transportable is driving (or nullptr)
double getArrivalPos() const
return default value for undefined arrivalPos
void setOrigin(const MSEdge *origin)
change origin for parking area rerouting
virtual MSStoppingPlace * getOriginStop() const
returns the origin stop (if any). only needed for MSStageTrip
Definition: MSStage.h:89
const MSEdge * getDestination() const
returns the destination edge
Definition: MSStage.cpp:65
virtual const MSEdge * getFromEdge() const
Definition: MSStage.cpp:77
virtual double getArrivalPos() const
Definition: MSStage.h:93
virtual const std::string setArrived(MSNet *net, MSTransportable *transportable, SUMOTime now, const bool vehicleArrived)
logs end of the step
Definition: MSStage.cpp:161
MSStoppingPlace * getDestinationStop() const
returns the destination stop (if any)
Definition: MSStage.h:84
MSStageType getStageType() const
Definition: MSStage.h:126
void setArrivalPos(double arrivalPos)
Definition: MSStage.h:101
void setDestination(const MSEdge *newDestination, MSStoppingPlace *newDestStop)
Definition: MSStage.cpp:189
virtual void routeOutput(const bool isPerson, OutputDevice &os, const bool withRouteLength, const MSStage *const previous) const =0
Called on writing vehroute output.
virtual const MSEdge * getEdge() const
Returns the current edge.
Definition: MSStage.cpp:71
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.
void removeTransportable(const MSTransportable *p)
Removes a transportable from this stop.
const MSLane & getLane() const
Returns the lane this stop is located at.
void registerTeleportAbortWait()
register a teleport after aborting a long wait
virtual void erase(MSTransportable *transportable)
removes a single transportable
Abstract in-person device.
virtual double getChosenSpeedFactor() const
the current speed factor of the transportable (where applicable)
virtual double getEdgePos() const
Return the position on the edge.
bool hasDeparted() const
return whether the transportable has started its plan
int getRNGIndex() const
returns the index of the associated RNG
SUMOVehicleClass getVClass() const
Returns the object's access class.
static NumericalID myCurrentNumericalIndex
SUMOTime getDeparture() const
logs depart time of the current stage
double getBackPositionOnLane(const MSLane *lane) const
Get the object's back position along the given lane.
virtual double getAngle() const
return the current angle of the transportable
void setAbortWaiting(const SUMOTime timeout)
void routeOutput(OutputDevice &os, const bool withRouteLength) const
Called on writing vehroute output.
void setJunctionModelParameter(const std::string &key, const std::string &value)
set individual junction model paramete (not type related)
virtual double getSpeed() const
the current speed of the transportable
PositionVector getBoundingBox() const
return the bounding box of the person
const bool myAmPerson
virtual bool checkAccess(const MSStage *const prior, const bool waitAtStop=true)
SUMOTime abortStage(SUMOTime step)
Abort current stage (used for aborting waiting for a vehicle)
std::string getStageSummary(int stageIndex) const
return textual summary for the given stage
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
void setDeparted(SUMOTime now)
logs depart time of the current stage
const std::set< NumericalID > getUpcomingEdgeIDs() const
returns the numerical IDs of edges to be used (possibly of future stages)
void setSpeed(double speed)
set the speed for all present and future (walking) stages and modify the vType so that stages added l...
virtual bool proceed(MSNet *net, SUMOTime time, const bool vehicleArrived=false)
MSTransportablePlan::iterator myStep
the iterator over the route
MSTransportablePlan * myPlan
the plan of the transportable
void removeStage(int next, bool stayInSim=true)
removes the nth next stage
MSVehicleType * myVType
This transportable's type. (mainly used for drawing related information Note sure if it is really nec...
SUMOTime getWaitingTime(const bool accumulated=false) const
const MSVehicleType & getVehicleType() const
Returns the object's "vehicle" type.
bool isPerson() const
Whether it is a person.
virtual Position getPosition() const
Return the Network coordinate of the transportable.
const SUMOVehicleParameter * myParameter
the plan of the transportable
double getPositionOnLane() const
Get the object's position along the lane.
void saveState(OutputDevice &out)
Saves the current state into the given stream.
bool isContainer() const
Whether it is a container.
virtual ~MSTransportable()
destructor
MSStageType getCurrentStageType() const
the current stage type of the transportable
void rerouteParkingArea(MSStoppingPlace *orig, MSStoppingPlace *replacement)
adapt plan when the vehicle reroutes and now stops at replacement instead of orig
std::string getObjectType()
const MSEdge * getEdge() const
Returns the current edge.
void loadState(const std::string &state)
Reconstructs the current state.
std::vector< MSTransportableDevice * > myDevices
The devices this transportable has.
virtual double getWaitingSeconds() const
the time this transportable spent waiting in seconds
MSTransportable(const SUMOVehicleParameter *pars, MSVehicleType *vtype, MSTransportablePlan *plan, const bool isPerson)
constructor
bool hasArrived() const
return whether the person has reached the end of its plan
double getSlope() const
Returns the slope of the road at object's position in degrees.
void tripInfoOutput(OutputDevice &os) const
Called on writing tripinfo output.
void appendStage(MSStage *stage, int next=-1)
Appends the given stage to the current plan.
SumoRNG * getRNG() const
returns the associated RNG
virtual int getRoutingMode() const
return routing mode (configures router choice but also handling of transient permission changes)
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
virtual int getDirection() const
Return the movement directon on the edge.
std::vector< MSStage * > MSTransportablePlan
the structure holding the plan of a transportable
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists or nullptr if not.
const MSEdge * getDestination() const
Returns the current destination.
void setID(const std::string &newID)
set the id (inherited from Named but forbidden for transportables)
WrappingCommand< MSTransportable > * myAbortCommand
void replaceVehicleType(MSVehicleType *type)
Replaces the current vehicle type by the one given.
SUMOTime getDesiredDepart() const
Returns the desired departure time.
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and physical maximum speed)
void removeVType(const MSVehicleType *vehType)
The car-following model and parameter.
Definition: MSVehicleType.h:63
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
void setMaxSpeed(const double &maxSpeed)
Set a new value for this type's maximum speed.
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
const std::string & getID() const
Returns the name of the vehicle type.
Definition: MSVehicleType.h:91
double getLength() const
Get vehicle's length [m].
const SUMOVTypeParameter & getParameter() const
MSVehicleType * buildSingularType(const std::string &id) const
Duplicates the microsim vehicle type giving the newly created type the given id, marking it as vehicl...
const std::string & getID() const
Returns the id.
Definition: Named.h:74
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:60
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
void lf()
writes a line feed if applicable
Definition: OutputDevice.h:242
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:254
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
A list of positions.
void append(const PositionVector &v, double sameThreshold=2.0)
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
PositionVector reverse() const
reverse position vector
Representation of a vehicle, person, or container.
long long int NumericalID
bool wasSet(long long int what) const
Returns whether the given parameter was set.
virtual void removeTransportable(MSTransportable *t)=0
removes a person or container
Structure representing possible vehicle parameter.
int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
void write(OutputDevice &dev, const OptionsCont &oc, const SumoXMLTag altTag=SUMO_TAG_VEHICLE, const std::string &typeID="") const
Writes the parameters as a beginning element.
bool wasSet(int what) const
Returns whether the given parameter was set.
void deschedule()
Marks this Command as being descheduled.
TRACI_CONST int ROUTING_MODE_DEFAULT