RORoute * RORouteDef_Complete::buildCurrentRoute(SUMOAbstractRouter<ROEdge,ROVehicle> &router, SUMOTime begin, const ROVehicle &veh) const { if (myTryRepair) { const std::vector<const ROEdge*> &oldEdges = myEdges; if (oldEdges.size()==0) { MsgHandler *m = OptionsCont::getOptions().getBool("continue-on-unbuild") ? MsgHandler::getWarningInstance() : MsgHandler::getErrorInstance(); m->inform("Could not repair empty route of vehicle '" + veh.getID() + "'."); return new RORoute(myID, 0, 1, std::vector<const ROEdge*>(), copyColorIfGiven()); } std::vector<const ROEdge*> newEdges; newEdges.push_back(*(oldEdges.begin())); for (std::vector<const ROEdge*>::const_iterator i=oldEdges.begin()+1; i!=oldEdges.end(); ++i) { if ((*(i-1))->isConnectedTo(*i)) { newEdges.push_back(*i); } else { std::vector<const ROEdge*> edges; router.compute(*(i-1), *i, &veh, begin, edges); if (edges.size()==0) { return 0; } std::copy(edges.begin()+1, edges.end(), back_inserter(newEdges)); } } if (myEdges!=newEdges) { MsgHandler::getWarningInstance()->inform("Repaired route of vehicle '" + veh.getID() + "'."); } myEdges = newEdges; } SUMOReal costs = router.recomputeCosts(myEdges, &veh, begin); if (costs<0) { throw ProcessError("Route '" + getID() + "' (vehicle '" + veh.getID() + "') is not valid."); } return new RORoute(myID, 0, 1, myEdges, copyColorIfGiven()); }
RORouteDef* RORouteDef_Complete::copy(const std::string& id) const { return new RORouteDef_Complete(id, copyColorIfGiven(), myEdges, myTryRepair); }