From f0c3f0206f33833932e5d7099935f309362f076b Mon Sep 17 00:00:00 2001 From: Michael Behrisch Date: Tue, 2 Jan 2024 16:08:18 +0100 Subject: [PATCH] first mini example with person rerouter working #1722 --- src/microsim/transportables/MSPerson.cpp | 15 +++++++++------ src/microsim/transportables/MSPerson.h | 2 +- .../transportables/MSTransportable.cpp | 7 +++++-- src/microsim/trigger/MSTriggeredRerouter.cpp | 19 +++++++++++++++---- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/microsim/transportables/MSPerson.cpp b/src/microsim/transportables/MSPerson.cpp index 10b43280277e..2d848a174c84 100644 --- a/src/microsim/transportables/MSPerson.cpp +++ b/src/microsim/transportables/MSPerson.cpp @@ -145,11 +145,14 @@ MSPerson::MSPersonStage_Walking::proceed(MSNet* net, MSTransportable* person, SU pControl.erase(person); return; } - const MSLane* const lane = getSidewalk(getEdge()); - if (lane != nullptr) { - for (MSMoveReminder* rem : lane->getMoveReminders()) { - if (rem->notifyEnter(*person, MSMoveReminder::NOTIFICATION_DEPARTED, lane)) { - myMoveReminders.push_back(rem); + if (previous->getStageType() != MSStageType::WALKING || previous->getEdge() != getEdge()) { + // we only need new move reminders if we are walking a different edge (else it is probably a rerouting) + const MSLane* const lane = getSidewalk(getEdge()); + if (lane != nullptr) { + for (MSMoveReminder* rem : lane->getMoveReminders()) { + if (rem->notifyEnter(*person, MSMoveReminder::NOTIFICATION_DEPARTED, lane)) { + myMoveReminders.push_back(rem); + } } } } @@ -633,7 +636,7 @@ MSPerson::getNextEdgePtr() const { void -MSPerson::reroute(ConstMSEdgeVector& newEdges, double departPos, int firstIndex, int nextIndex) { +MSPerson::reroute(const ConstMSEdgeVector& newEdges, double departPos, int firstIndex, int nextIndex) { assert(nextIndex > firstIndex); //std::cout << SIMTIME << " reroute person " << getID() // << " newEdges=" << toString(newEdges) diff --git a/src/microsim/transportables/MSPerson.h b/src/microsim/transportables/MSPerson.h index 6919602b46db..47f138effa2f 100644 --- a/src/microsim/transportables/MSPerson.h +++ b/src/microsim/transportables/MSPerson.h @@ -286,7 +286,7 @@ class MSPerson : public MSTransportable { bool isJammed() const; /// @brief set new walk and replace the stages with relative indices in the interval [firstIndex, nextIndex[ - void reroute(ConstMSEdgeVector& newEdges, double departPos, int firstIndex, int nextIndex); + void reroute(const ConstMSEdgeVector& newEdges, double departPos, int firstIndex, int nextIndex); /** @class Influencer diff --git a/src/microsim/transportables/MSTransportable.cpp b/src/microsim/transportables/MSTransportable.cpp index 7aa7c197884f..452a98bb1422 100644 --- a/src/microsim/transportables/MSTransportable.cpp +++ b/src/microsim/transportables/MSTransportable.cpp @@ -316,8 +316,11 @@ MSTransportable::setSpeed(double speed) { bool MSTransportable::replaceRoute(ConstMSRoutePtr newRoute, const std::string& /* info */, bool /* onInit */, int /* offset */, bool /* addRouteStops */, bool /* removeStops */, std::string* /* msgReturn */) { - const ConstMSEdgeVector& edges = newRoute->getEdges(); - return true; + if (isPerson()) { + static_cast(this)->reroute(newRoute->getEdges(), getPositionOnLane(), 0, 1); + return true; + } + return false; } diff --git a/src/microsim/trigger/MSTriggeredRerouter.cpp b/src/microsim/trigger/MSTriggeredRerouter.cpp index cb56510ad3a8..f2061f5627d3 100644 --- a/src/microsim/trigger/MSTriggeredRerouter.cpp +++ b/src/microsim/trigger/MSTriggeredRerouter.cpp @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include #include #include "MSTriggeredRerouter.h" @@ -566,12 +566,21 @@ MSTriggeredRerouter::notifyEnter(SUMOTrafficObject& tObject, MSMoveReminder::Not } } else { // person rerouting here - std::vector result; + std::vector items; MSTransportableRouter& router = hasReroutingDevice ? MSRoutingEngine::getIntermodalRouterTT(tObject.getRNGIndex(), rerouteDef->closed) : MSNet::getInstance()->getIntermodalRouter(tObject.getRNGIndex(), 0, rerouteDef->closed); - router.compute(tObject.getEdge(), newEdge, tObject.getPositionOnLane(), "", tObject.getParameter().arrivalPos, "", - tObject.getMaxSpeed(), nullptr, 0, now, result); + const bool success = router.compute(tObject.getEdge(), newEdge, tObject.getPositionOnLane(), "", + tObject.getParameter().arrivalPos, "", + tObject.getMaxSpeed(), nullptr, 0, now, items); + if (success) { + MSPerson& p = static_cast(tObject); + for (const MSTransportableRouter::TripItem& it : items) { + if (!it.edges.empty()) { + p.reroute(it.edges, tObject.getPositionOnLane(), 0, 1); + } + } + } } } return false; // XXX another interval could appear later but we would have to track whether the currenty interval was already used @@ -1261,4 +1270,6 @@ MSTriggeredRerouter::checkParkingRerouteConsistency() { } } } + + /****************************************************************************/