void NIImporter_MATSim::EdgesHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { bool ok = true; if (element == MATSIM_TAG_NETWORK) { if (attrs.hasAttribute(MATSIM_ATTR_CAPDIVIDER)) { int capDivider = attrs.get<int>(MATSIM_ATTR_CAPDIVIDER, "network", ok); if (ok) { myCapacityNorm = (SUMOReal)(capDivider * 3600); } } } if (element == MATSIM_TAG_LINKS) { bool ok = true; std::string capperiod = attrs.get<std::string>(MATSIM_ATTR_CAPPERIOD, "links", ok); StringTokenizer st(capperiod, ":"); if (st.size() != 3) { WRITE_ERROR("Bogus capacity period format; requires 'hh:mm:ss'."); return; } try { int hours = TplConvert::_2int(st.next().c_str()); int minutes = TplConvert::_2int(st.next().c_str()); int seconds = TplConvert::_2int(st.next().c_str()); myCapacityNorm = (SUMOReal)(hours * 3600 + minutes * 60 + seconds); } catch (NumberFormatException&) { } catch (EmptyData&) { } return; } // parse "link" elements if (element != MATSIM_TAG_LINK) { return; } std::string id = attrs.get<std::string>(MATSIM_ATTR_ID, 0, ok); std::string fromNodeID = attrs.get<std::string>(MATSIM_ATTR_FROM, id.c_str(), ok); std::string toNodeID = attrs.get<std::string>(MATSIM_ATTR_TO, id.c_str(), ok); SUMOReal length = attrs.get<SUMOReal>(MATSIM_ATTR_LENGTH, id.c_str(), ok); // override computed? SUMOReal freeSpeed = attrs.get<SUMOReal>(MATSIM_ATTR_FREESPEED, id.c_str(), ok); // SUMOReal capacity = attrs.get<SUMOReal>(MATSIM_ATTR_CAPACITY, id.c_str(), ok); // override permLanes? SUMOReal permLanes = attrs.get<SUMOReal>(MATSIM_ATTR_PERMLANES, id.c_str(), ok); //bool oneWay = attrs.getOpt<bool>(MATSIM_ATTR_ONEWAY, id.c_str(), ok, true); // mandatory? std::string modes = attrs.getOpt<std::string>(MATSIM_ATTR_MODES, id.c_str(), ok, ""); // which values? std::string origid = attrs.getOpt<std::string>(MATSIM_ATTR_ORIGID, id.c_str(), ok, ""); NBNode* fromNode = myNodeCont.retrieve(fromNodeID); NBNode* toNode = myNodeCont.retrieve(toNodeID); if (fromNode == 0) { WRITE_ERROR("Could not find from-node for edge '" + id + "'."); } if (toNode == 0) { WRITE_ERROR("Could not find to-node for edge '" + id + "'."); } if (fromNode == 0 || toNode == 0) { return; } if (myLanesFromCapacity) { permLanes = myCapacity2Lanes.get(capacity); } NBEdge* edge = new NBEdge(id, fromNode, toNode, "", freeSpeed, (unsigned int) permLanes, -1, NBEdge::UNSPECIFIED_WIDTH, NBEdge::UNSPECIFIED_OFFSET); edge->addParameter("capacity", toString(capacity)); if (myKeepEdgeLengths) { edge->setLoadedLength(length); } if (!myEdgeCont.insert(edge)) { delete edge; WRITE_ERROR("Could not add edge '" + id + "'. Probably declared twice."); } }