void NBLoadedSUMOTLDef::removeConnection(const NBConnection& conn, bool reconstruct) { NBConnectionVector::iterator it = myControlledLinks.begin(); // find the connection but ignore its TLIndex since it might have been // invalidated by an earlier removal for (; it != myControlledLinks.end(); ++it) { if (it->getFrom() == conn.getFrom() && it->getTo() == conn.getTo() && it->getFromLane() == conn.getFromLane() && it->getToLane() == conn.getToLane()) { break; } } if (it == myControlledLinks.end()) { // a traffic light doesn't always controll all connections at a junction // especially when using the option --tls.join return; } const int removed = it->getTLIndex(); // remove the connection myControlledLinks.erase(it); if (reconstruct) { // updating the edge is only needed for immediate use in NETEDIT. // It may conflict with loading diffs conn.getFrom()->setControllingTLInformation(conn, ""); // shift link numbers down so there is no gap for (NBConnectionVector::iterator it = myControlledLinks.begin(); it != myControlledLinks.end(); it++) { NBConnection& c = *it; if (c.getTLIndex() > removed) { c.setTLIndex(c.getTLIndex() - 1); } } // update controlling information with new link numbers setTLControllingInformation(); // rebuild the logic const std::vector<NBTrafficLightLogic::PhaseDefinition> phases = myTLLogic->getPhases(); NBTrafficLightLogic* newLogic = new NBTrafficLightLogic(getID(), getProgramID(), 0, myOffset, myType); for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator it = phases.begin(); it != phases.end(); it++) { std::string newState = it->state; newState.erase(newState.begin() + removed); newLogic->addStep(it->duration, newState); } delete myTLLogic; myTLLogic = newLogic; } }
void NBLoadedTLDef::SignalGroup::addConnection(const NBConnection& c) { assert(c.getFromLane() < 0 || c.getFrom()->getNumLanes() > (unsigned int)c.getFromLane()); myConnections.push_back(c); }