void NIXMLEdgesHandler::addSplit(const SUMOSAXAttributes& attrs) { if (myCurrentEdge == 0) { if (!OptionsCont::getOptions().isInStringVector("remove-edges.explicit", myCurrentID)) { WRITE_WARNING("Ignoring 'split' because it cannot be assigned to an edge"); } return; } bool ok = true; Split e; e.pos = attrs.get<SUMOReal>(SUMO_ATTR_POSITION, 0, ok); if (ok) { if (fabs(e.pos) > myCurrentEdge->getGeometry().length()) { WRITE_ERROR("Edge '" + myCurrentID + "' has a split at invalid position " + toString(e.pos) + "."); return; } std::vector<Split>::iterator i = find_if(mySplits.begin(), mySplits.end(), split_by_pos_finder(e.pos)); if (i != mySplits.end()) { WRITE_ERROR("Edge '" + myCurrentID + "' has already a split at position " + toString(e.pos) + "."); return; } const std::string nameid = toString((int)e.pos); if (e.pos < 0) { e.pos += myCurrentEdge->getGeometry().length(); } std::vector<std::string> lanes; SUMOSAXAttributes::parseStringVector(attrs.getOpt<std::string>(SUMO_ATTR_LANES, 0, ok, ""), lanes); for (std::vector<std::string>::iterator i = lanes.begin(); i != lanes.end(); ++i) { try { int lane = TplConvert::_2int((*i).c_str()); e.lanes.push_back(lane); } catch (NumberFormatException&) { WRITE_ERROR("Error on parsing a split (edge '" + myCurrentID + "')."); } catch (EmptyData&) { WRITE_ERROR("Error on parsing a split (edge '" + myCurrentID + "')."); } } if (e.lanes.empty()) { for (int l = 0; l < myCurrentEdge->getNumLanes(); ++l) { e.lanes.push_back(l); } } e.speed = attrs.getOpt(SUMO_ATTR_SPEED, 0, ok, myCurrentEdge->getSpeed()); if (attrs.hasAttribute(SUMO_ATTR_SPEED) && myOptions.getBool("speed-in-kmh")) { e.speed /= (SUMOReal) 3.6; } e.idBefore = attrs.getOpt(SUMO_ATTR_ID_BEFORE, 0, ok, std::string("")); e.idAfter = attrs.getOpt(SUMO_ATTR_ID_AFTER, 0, ok, std::string("")); if (!ok) { return; } e.node = new NBNode(myCurrentID + "." + nameid, myCurrentEdge->getGeometry().positionAtOffset(e.pos)); NIXMLNodesHandler::processNodeType(attrs, e.node, e.node->getID(), e.node->getPosition(), false, myNodeCont, myTLLogicCont); mySplits.push_back(e); } }
void NIXMLEdgesHandler::addSplit(const SUMOSAXAttributes& attrs) { if (myCurrentEdge == 0) { WRITE_WARNING("Ignoring 'split' because it cannot be assigned to an edge"); return; } bool ok = true; Split e; e.pos = attrs.get<SUMOReal>(SUMO_ATTR_POSITION, 0, ok); if (ok) { if (fabs(e.pos) > myCurrentEdge->getGeometry().length()) { WRITE_ERROR("Edge '" + myCurrentID + "' has a split at invalid position " + toString(e.pos) + "."); return; } std::vector<Split>::iterator i = find_if(mySplits.begin(), mySplits.end(), split_by_pos_finder(e.pos)); if (i != mySplits.end()) { WRITE_ERROR("Edge '" + myCurrentID + "' has already a split at position " + toString(e.pos) + "."); return; } e.nameid = (int)e.pos; if (myCurrentEdge == 0) { if (!OptionsCont::getOptions().isInStringVector("remove-edges.explicit", myCurrentID)) { WRITE_ERROR("Additional lane information could not be set - the edge with id '" + myCurrentID + "' is not known."); } return; } if (e.pos < 0) { e.pos += myCurrentEdge->getGeometry().length(); } std::vector<std::string> lanes; SUMOSAXAttributes::parseStringVector(attrs.getOpt<std::string>(SUMO_ATTR_LANES, 0, ok, ""), lanes); for (std::vector<std::string>::iterator i = lanes.begin(); i != lanes.end(); ++i) { try { int lane = TplConvert::_2int((*i).c_str()); e.lanes.push_back(lane); } catch (NumberFormatException&) { WRITE_ERROR("Error on parsing a split (edge '" + myCurrentID + "')."); } catch (EmptyData&) { WRITE_ERROR("Error on parsing a split (edge '" + myCurrentID + "')."); } } if (e.lanes.empty()) { for (size_t l = 0; l < myCurrentEdge->getNumLanes(); ++l) { e.lanes.push_back((int) l); } } mySplits.push_back(e); } }