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 NIXMLTrafficLightsHandler::addTlConnection(const SUMOSAXAttributes& attrs) { bool ok = true; // 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; } // retrieve connection const std::vector<NBEdge::Connection>& connections = from->getConnections(); std::vector<NBEdge::Connection>::const_iterator con_it; con_it = find_if(connections.begin(), connections.end(), NBEdge::connections_finder(fromLane, to, toLane)); if (con_it == connections.end()) { WRITE_ERROR("Connection from=" + from->getID() + " to=" + to->getID() + " fromLane=" + toString(fromLane) + " toLane=" + toString(toLane) + " not found"); return; } NBEdge::Connection c = *con_it; // read other attributes std::string tlID = attrs.getOptStringReporting(SUMO_ATTR_TLID, 0, ok, ""); if (tlID == "") { // we are updating an existing tl-controlled connection tlID = c.tlID; assert(tlID != ""); } int tlIndex = attrs.getOptIntReporting(SUMO_ATTR_TLLINKINDEX, 0, ok, -1); if (tlIndex == -1) { // we are updating an existing tl-controlled connection tlIndex = c.tlLinkNo; } // register the connection with all definitions const std::map<std::string, NBTrafficLightDefinition*>& programs = myTLLCont.getPrograms(tlID); if (programs.size() > 0) { 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->addConnection(from, c.toEdge, c.fromLane, c.toLane, tlIndex); } else { throw ProcessError("Corrupt traffic light definition '" + tlID + "' (program '" + it->first + "')"); } } } else { WRITE_ERROR("The traffic light '" + tlID + "' is not known."); } }
GNEEdge* GNENet::createEdge( GNEJunction* src, GNEJunction* dest, GNEEdge* tpl, GNEUndoList* undoList, const std::string& suggestedName, bool wasSplit, bool allowDuplicateGeom) { // prevent duplicate edge (same geometry) const EdgeVector& outgoing = src->getNBNode()->getOutgoingEdges(); for (EdgeVector::const_iterator it = outgoing.begin(); it != outgoing.end(); it++) { if ((*it)->getToNode() == dest->getNBNode() && (*it)->getGeometry().size() == 2) { if (!allowDuplicateGeom) { return 0; } } } std::string id; if (suggestedName != "" && !retrieveEdge(suggestedName, false)) { id = suggestedName; reserveEdgeID(id); } else { id = myEdgeIDSupplier.getNext(); } GNEEdge* edge; if (tpl) { NBEdge* nbeTpl = tpl->getNBEdge(); NBEdge* nbe = new NBEdge(id, src->getNBNode(), dest->getNBNode(), nbeTpl); edge = new GNEEdge(*nbe, this, wasSplit); } else { // default if no template is given SUMOReal defaultSpeed = 50 / 3.6; std::string defaultType = ""; int defaultNrLanes = 1; int defaultPriority = 1; SUMOReal defaultWidth = NBEdge::UNSPECIFIED_WIDTH; SUMOReal defaultOffset = NBEdge::UNSPECIFIED_OFFSET; NBEdge* nbe = new NBEdge(id, src->getNBNode(), dest->getNBNode(), defaultType, defaultSpeed, defaultNrLanes, defaultPriority, defaultWidth, defaultOffset); edge = new GNEEdge(*nbe, this, wasSplit); } undoList->p_begin("create edge"); undoList->add(new GNEChange_Edge(this, edge, true), true); src->setLogicValid(false, undoList); dest->setLogicValid(false, undoList); requireRecompute(); undoList->p_end(); assert(myEdges[id]); return edge; }