void NIXMLTrafficLightsHandler::removeTlConnection(const SUMOSAXAttributes& attrs) { bool ok = true; std::string tlID = attrs.getStringReporting(SUMO_ATTR_TLID, 0, ok); // does the traffic light still exist? const std::map<std::string, NBTrafficLightDefinition*>& programs = myTLLCont.getPrograms(tlID); if (programs.size() > 0) { // parse identifying attributes NBEdge* from = retrieveEdge(attrs, SUMO_ATTR_FROM, ok); NBEdge* to = retrieveEdge(attrs, SUMO_ATTR_TO, ok); if (!ok) { return; } int fromLane = retrieveLaneIndex(attrs, SUMO_ATTR_FROM_LANE, from, ok); int toLane = retrieveLaneIndex(attrs, SUMO_ATTR_TO_LANE, to, ok); if (!ok) { return; } int tlIndex = attrs.getIntReporting(SUMO_ATTR_TLLINKINDEX, 0, ok); NBConnection conn(from, fromLane, to, toLane, tlIndex); // remove the connection from all definitions std::map<std::string, NBTrafficLightDefinition*>::const_iterator it; for (it = programs.begin(); it != programs.end(); it++) { NBLoadedSUMOTLDef* tlDef = dynamic_cast<NBLoadedSUMOTLDef*>(it->second); if (tlDef) { tlDef->removeConnection(conn, false); } else { throw ProcessError("Corrupt traffic light definition '" + tlID + "' (program '" + it->first + "')"); } } } }
void GNEJunction::invalidateTLS(GNEUndoList* undoList, const NBConnection& deletedConnection) { assert(undoList->hasCommandGroup()); // NBLoadedSUMOTLDef becomes invalid, replace with NBOwnTLDef which will be dynamically recomputed const std::set<NBTrafficLightDefinition*> tls = myNBNode.getControllingTLS(); // make a copy! for (std::set<NBTrafficLightDefinition*>::iterator it = tls.begin(); it != tls.end(); it++) { NBLoadedSUMOTLDef* tlDef = dynamic_cast<NBLoadedSUMOTLDef*>(*it); if (tlDef != 0) { NBTrafficLightDefinition* replacementDef = 0; std::string newID = tlDef->getID(); // + "_reguessed"; // changes due to reguessing will be visible in diff if (deletedConnection != NBConnection::InvalidConnection) { // create replacement before deleting the original because deletion will mess up saving original nodes NBLoadedSUMOTLDef* repl = new NBLoadedSUMOTLDef(tlDef, tlDef->getLogic()); repl->removeConnection(deletedConnection); replacementDef = repl; } else { replacementDef = new NBOwnTLDef(newID, tlDef->getOffset(), tlDef->getType()); } undoList->add(new GNEChange_TLS(this, tlDef, false), true); undoList->add(new GNEChange_TLS(this, replacementDef, true, false, newID), true); // the removed traffic light may have controlled more than one junction. These too have become invalid now const std::vector<NBNode*> coNodes = tlDef->getNodes(); // make a copy! for (std::vector<NBNode*>::const_iterator it_node = coNodes.begin(); it_node != coNodes.end(); it_node++) { GNEJunction* sharing = myNet->retrieveJunction((*it_node)->getID()); undoList->add(new GNEChange_TLS(sharing, tlDef, false), true); undoList->add(new GNEChange_TLS(sharing, replacementDef, true, false, newID), true); } } } }