ConstROEdgeVector ROVehicle::getMandatoryEdges(const ROEdge* requiredStart, const ROEdge* requiredEnd) const { ConstROEdgeVector mandatory; if (requiredStart) { mandatory.push_back(requiredStart); } for (const ROEdge* e : getStopEdges()) { if (e->isInternal()) { // the edges before and after the internal edge are mandatory const ROEdge* before = e->getNormalBefore(); const ROEdge* after = e->getNormalAfter(); if (mandatory.size() == 0 || after != mandatory.back()) { mandatory.push_back(before); mandatory.push_back(after); } } else { if (mandatory.size() == 0 || e != mandatory.back()) { mandatory.push_back(e); } } } if (requiredEnd) { if (mandatory.size() < 2 || mandatory.back() != requiredEnd) { mandatory.push_back(requiredEnd); } } return mandatory; }
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); }