void Person::appendWalkingStage(const std::string& personID, const std::vector<std::string>& edgeIDs, double arrivalPos, double duration, double speed, const std::string& stopID) { MSTransportable* p = getPerson(personID); ConstMSEdgeVector edges; try { MSEdge::parseEdgesList(edgeIDs, edges, "<unknown>"); } catch (ProcessError& e) { throw TraCIException(e.what()); } if (edges.empty()) { throw TraCIException("Empty edge list for walking stage of person '" + personID + "'."); } if (fabs(arrivalPos) > edges.back()->getLength()) { throw TraCIException("Invalid arrivalPos for walking stage of person '" + personID + "'."); } if (arrivalPos < 0) { arrivalPos += edges.back()->getLength(); } if (speed < 0) { speed = p->getVehicleType().getMaxSpeed(); } MSStoppingPlace* bs = nullptr; if (stopID != "") { bs = MSNet::getInstance()->getStoppingPlace(stopID, SUMO_TAG_BUS_STOP); if (bs == nullptr) { throw TraCIException("Invalid stopping place id '" + stopID + "' for person: '" + personID + "'"); } } p->appendStage(new MSPerson::MSPersonStage_Walking(p->getID(), edges, bs, TIME2STEPS(duration), speed, p->getArrivalPos(), arrivalPos, 0)); }
/* ------------------------------------------------------------------------- * MSPerson::MSPersonStage_Walking - methods * ----------------------------------------------------------------------- */ MSPerson::MSPersonStage_Walking::MSPersonStage_Walking(const ConstMSEdgeVector& route, MSStoppingPlace* toStop, SUMOTime walkingTime, SUMOReal speed, SUMOReal departPos, SUMOReal arrivalPos) : MSTransportable::Stage(*route.back(), toStop, SUMOVehicleParameter::interpretEdgePos( arrivalPos, route.back()->getLength(), SUMO_ATTR_ARRIVALPOS, "person walking to " + route.back()->getID()), MOVING_WITHOUT_VEHICLE), myWalkingTime(walkingTime), myRoute(route), myCurrentInternalEdge(0), myDepartPos(departPos), mySpeed(speed), myPedestrianState(0) { myDepartPos = SUMOVehicleParameter::interpretEdgePos( myDepartPos, myRoute.front()->getLength(), SUMO_ATTR_DEPARTPOS, "person walking from " + myRoute.front()->getID()); if (walkingTime > 0) { mySpeed = computeAverageSpeed(); } }
void MSBaseVehicle::reroute(SUMOTime t, SUMOAbstractRouter<MSEdge, SUMOVehicle>& router, const bool onInit, const bool withTaz) { // check whether to reroute const MSEdge* source = withTaz && onInit ? MSEdge::dictionary(myParameter->fromTaz + "-source") : getRerouteOrigin(); if (source == 0) { source = getRerouteOrigin(); } const MSEdge* sink = withTaz ? MSEdge::dictionary(myParameter->toTaz + "-sink") : myRoute->getLastEdge(); if (sink == 0) { sink = myRoute->getLastEdge(); } ConstMSEdgeVector edges; const ConstMSEdgeVector stops = getStopEdges(); for (MSRouteIterator s = stops.begin(); s != stops.end(); ++s) { if (*s != source) { // !!! need to adapt t here router.compute(source, *s, this, t, edges); source = *s; edges.pop_back(); } } router.compute(source, sink, this, t, edges); if (!edges.empty() && edges.front()->getPurpose() == MSEdge::EDGEFUNCTION_DISTRICT) { edges.erase(edges.begin()); } if (!edges.empty() && edges.back()->getPurpose() == MSEdge::EDGEFUNCTION_DISTRICT) { edges.pop_back(); } replaceRouteEdges(edges, onInit); }