void NIImporter_VISUM::parse_Connectors() { if (OptionsCont::getOptions().getBool("visum.no-connectors")) { // do nothing, if connectors shall not be imported return; } // get the source district std::string bez = NBHelpers::normalIDRepresentation(myLineParser.get("BezNr")); // get the destination node NBNode* dest = getNamedNode("KnotNr"); if (dest == 0) { return; } // get the weight of the connection SUMOReal proz = getWeightedFloat("Proz"); if (proz > 0) { proz /= 100.; } else { proz = 1; } // get the duration to wait (unused) // SUMOReal retard = -1; // if (myLineParser.know("t0-IV")) { // retard = getNamedFloat("t0-IV", -1); // } // get the type; // use a standard type with a large speed when a type is not given std::string type = myLineParser.know("Typ") ? NBHelpers::normalIDRepresentation(myLineParser.get("Typ")) : ""; // add the connectors as an edge std::string id = bez + "-" + dest->getID(); // get the information whether this is a sink or a source std::string dir = myLineParser.get("Richtung"); if (dir.length() == 0) { dir = "QZ"; } // build the source when needed if (dir.find('Q') != std::string::npos) { const EdgeVector& edges = dest->getOutgoingEdges(); bool hasContinuation = false; for (EdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) { if (!(*i)->isMacroscopicConnector()) { hasContinuation = true; } } if (!hasContinuation) { // obviously, there is no continuation on the net WRITE_WARNING("Incoming connector '" + id + "' will not be build - would be not connected to network."); } else { NBNode* src = buildDistrictNode(bez, dest, true); if (src == 0) { WRITE_ERROR("The district '" + bez + "' could not be built."); return; } NBEdge* edge = new NBEdge(id, src, dest, "VisumConnector", OptionsCont::getOptions().getFloat("visum.connector-speeds"), OptionsCont::getOptions().getInt("visum.connectors-lane-number"), -1, NBEdge::UNSPECIFIED_WIDTH, NBEdge::UNSPECIFIED_OFFSET, "", LANESPREAD_RIGHT); edge->setAsMacroscopicConnector(); if (!myNetBuilder.getEdgeCont().insert(edge)) { WRITE_ERROR("A duplicate edge id occured (ID='" + id + "')."); return; } edge = myNetBuilder.getEdgeCont().retrieve(id); if (edge != 0) { myNetBuilder.getDistrictCont().addSource(bez, edge, proz); } } } // build the sink when needed if (dir.find('Z') != std::string::npos) { const EdgeVector& edges = dest->getIncomingEdges(); bool hasPredeccessor = false; for (EdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) { if (!(*i)->isMacroscopicConnector()) { hasPredeccessor = true; } } if (!hasPredeccessor) { // obviously, the network is not connected to this node WRITE_WARNING("Outgoing connector '" + id + "' will not be build - would be not connected to network."); } else { NBNode* src = buildDistrictNode(bez, dest, false); if (src == 0) { WRITE_ERROR("The district '" + bez + "' could not be built."); return; } id = "-" + id; NBEdge* edge = new NBEdge(id, dest, src, "VisumConnector", OptionsCont::getOptions().getFloat("visum.connector-speeds"), OptionsCont::getOptions().getInt("visum.connectors-lane-number"), -1, NBEdge::UNSPECIFIED_WIDTH, NBEdge::UNSPECIFIED_OFFSET, "", LANESPREAD_RIGHT); edge->setAsMacroscopicConnector(); if (!myNetBuilder.getEdgeCont().insert(edge)) { WRITE_ERROR("A duplicate edge id occured (ID='" + id + "')."); return; } edge = myNetBuilder.getEdgeCont().retrieve(id); if (edge != 0) { myNetBuilder.getDistrictCont().addSink(bez, edge, proz); } } } }