void RONetHandler::parseDistrict(const SUMOSAXAttributes& attrs) { myCurrentEdge = 0; bool ok = true; myCurrentName = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); if (!ok) { return; } ROEdge* sink = myEdgeBuilder.buildEdge(myCurrentName + "-sink", 0, 0, 0); sink->setType(ROEdge::ET_DISTRICT); myNet.addEdge(sink); ROEdge* source = myEdgeBuilder.buildEdge(myCurrentName + "-source", 0, 0, 0); source->setType(ROEdge::ET_DISTRICT); myNet.addEdge(source); if (attrs.hasAttribute(SUMO_ATTR_EDGES)) { std::vector<std::string> desc = attrs.getStringVector(SUMO_ATTR_EDGES); for (std::vector<std::string>::const_iterator i = desc.begin(); i != desc.end(); ++i) { ROEdge* edge = myNet.getEdge(*i); // check whether the edge exists if (edge == 0) { throw ProcessError("The edge '" + *i + "' within district '" + myCurrentName + "' is not known."); } source->addFollower(edge); edge->addFollower(sink); } } }
void RONetHandler::parseConnection(const SUMOSAXAttributes& attrs) { bool ok = true; std::string fromID = attrs.get<std::string>(SUMO_ATTR_FROM, 0, ok); std::string toID = attrs.get<std::string>(SUMO_ATTR_TO, 0, ok); int fromLane = attrs.get<int>(SUMO_ATTR_FROM_LANE, 0, ok); int toLane = attrs.get<int>(SUMO_ATTR_TO_LANE, 0, ok); std::string dir = attrs.get<std::string>(SUMO_ATTR_DIR, 0, ok); ROEdge* from = myNet.getEdge(fromID); ROEdge* to = myNet.getEdge(toID); if (from == 0) { throw ProcessError("unknown from-edge '" + fromID + "' in connection"); } if (to == 0) { throw ProcessError("unknown to-edge '" + toID + "' in connection"); } if (from->getType() == ROEdge::ET_INTERNAL) { // skip inner lane connections return; } if (from->getLanes().size() <= (size_t)fromLane) { throw ProcessError("invalid fromLane '" + toString(fromLane) + "' in connection from '" + fromID + "'."); } if (to->getLanes().size() <= (size_t)toLane) { throw ProcessError("invalid toLane '" + toString(toLane) + "' in connection to '" + toID + "'."); } from->getLanes()[fromLane]->addOutgoingLane(to->getLanes()[toLane]); from->addFollower(to, dir); }
void RONetHandler::parseDistrictEdge(const SUMOSAXAttributes& attrs, bool isSource) { bool ok = true; std::string id = attrs.get<std::string>(SUMO_ATTR_ID, myCurrentName.c_str(), ok); ROEdge* succ = myNet.getEdge(id); if (succ != 0) { // connect edge if (isSource) { myNet.getEdge(myCurrentName + "-source")->addFollower(succ); } else { succ->addFollower(myNet.getEdge(myCurrentName + "-sink")); } } else { WRITE_ERROR("At district '" + myCurrentName + "': succeeding edge '" + id + "' does not exist."); } }
void RONetHandler::parseConnection(const SUMOSAXAttributes& attrs) { bool ok = true; std::string fromID = attrs.get<std::string>(SUMO_ATTR_FROM, 0, ok); std::string toID = attrs.get<std::string>(SUMO_ATTR_TO, 0, ok); std::string dir = attrs.get<std::string>(SUMO_ATTR_DIR, 0, ok); if (fromID[0] == ':') { // skip inner lane connections return; } ROEdge* from = myNet.getEdge(fromID); ROEdge* to = myNet.getEdge(toID); if (from == 0) { throw ProcessError("unknown from-edge '" + fromID + "' in connection"); } if (to == 0) { throw ProcessError("unknown to-edge '" + toID + "' in connection"); } from->addFollower(to, dir); }