void RORouteHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { SUMORouteHandler::myStartElement(element, attrs); switch (element) { case SUMO_TAG_PERSON: myActivePlan = new OutputDevice_String(false, 1); myActivePlanSize = 0; myActivePlan->openTag(SUMO_TAG_PERSON); (*myActivePlan) << attrs; break; case SUMO_TAG_RIDE: { myActivePlan->openTag(SUMO_TAG_RIDE); (*myActivePlan) << attrs; myActivePlan->closeTag(); myActivePlanSize++; break; } case SUMO_TAG_WALK: { if (attrs.hasAttribute(SUMO_ATTR_EDGES)) { // copy walk as it is // XXX allow --repair? myActivePlan->openTag(SUMO_TAG_WALK); (*myActivePlan) << attrs; myActivePlan->closeTag(); myActivePlanSize++; } else { routePedestrian(attrs, *myActivePlan); } break; } case SUMO_TAG_FLOW: myActiveRouteProbability = DEFAULT_VEH_PROB; parseFromViaTo("flow", attrs); break; case SUMO_TAG_TRIP: { myActiveRouteProbability = DEFAULT_VEH_PROB; parseFromViaTo("trip", attrs); closeVehicle(); } break; default: break; } // parse embedded vtype information if (myCurrentVType != 0 && element != SUMO_TAG_VTYPE) { SUMOVehicleParserHelper::parseVTypeEmbedded(*myCurrentVType, element, attrs); return; } }
void RORouteHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { SUMORouteHandler::myStartElement(element, attrs); switch (element) { case SUMO_TAG_PERSON: { SUMOVTypeParameter* type = myNet.getVehicleTypeSecure(myVehicleParameter->vtypeid); if (type == 0) { myErrorOutput->inform("The vehicle type '" + myVehicleParameter->vtypeid + "' for person '" + myVehicleParameter->id + "' is not known."); type = myNet.getVehicleTypeSecure(DEFAULT_PEDTYPE_ID); } myActivePerson = new ROPerson(*myVehicleParameter, type); break; } case SUMO_TAG_RIDE: { std::vector<ROPerson::PlanItem*>& plan = myActivePerson->getPlan(); const std::string pid = myVehicleParameter->id; bool ok = true; ROEdge* from = 0; if (attrs.hasAttribute(SUMO_ATTR_FROM)) { const std::string fromID = attrs.get<std::string>(SUMO_ATTR_FROM, pid.c_str(), ok); from = myNet.getEdge(fromID); if (from == 0) { throw ProcessError("The from edge '" + fromID + "' within a ride of person '" + pid + "' is not known."); } if (!plan.empty() && plan.back()->getDestination() != from) { throw ProcessError("Disconnected plan for person '" + myVehicleParameter->id + "' (" + fromID + "!=" + plan.back()->getDestination()->getID() + ")."); } } else if (plan.empty()) { throw ProcessError("The start edge for person '" + pid + "' is not known."); } ROEdge* to = 0; const SUMOVehicleParameter::Stop* stop = 0; const std::string toID = attrs.getOpt<std::string>(SUMO_ATTR_TO, pid.c_str(), ok, ""); const std::string busStopID = attrs.getOpt<std::string>(SUMO_ATTR_BUS_STOP, pid.c_str(), ok, ""); if (toID != "") { to = myNet.getEdge(toID); if (to == 0) { throw ProcessError("The to edge '" + toID + "' within a ride of person '" + pid + "' is not known."); } } else if (busStopID != "") { stop = myNet.getStoppingPlace(busStopID, SUMO_TAG_BUS_STOP); if (stop == nullptr) { throw ProcessError("Unknown bus stop '" + busStopID + "' within a ride of '" + myVehicleParameter->id + "'."); } to = myNet.getEdge(SUMOXMLDefinitions::getEdgeIDFromLane(stop->lane)); } else { throw ProcessError("The to edge '' within a ride of '" + myVehicleParameter->id + "' is not known."); } double arrivalPos = attrs.getOpt<double>(SUMO_ATTR_ARRIVALPOS, myVehicleParameter->id.c_str(), ok, stop == 0 ? -NUMERICAL_EPS : stop->endPos); const std::string desc = attrs.get<std::string>(SUMO_ATTR_LINES, pid.c_str(), ok); myActivePerson->addRide(from, to, desc, arrivalPos, busStopID); break; } case SUMO_TAG_CONTAINER: myActiveContainerPlan = new OutputDevice_String(false, 1); myActiveContainerPlanSize = 0; myActiveContainerPlan->openTag(SUMO_TAG_CONTAINER); (*myActiveContainerPlan) << attrs; break; case SUMO_TAG_TRANSPORT: { myActiveContainerPlan->openTag(SUMO_TAG_TRANSPORT); (*myActiveContainerPlan) << attrs; myActiveContainerPlan->closeTag(); myActiveContainerPlanSize++; break; } case SUMO_TAG_TRANSHIP: { if (attrs.hasAttribute(SUMO_ATTR_EDGES)) { // copy walk as it is // XXX allow --repair? myActiveContainerPlan->openTag(SUMO_TAG_TRANSHIP); (*myActiveContainerPlan) << attrs; myActiveContainerPlan->closeTag(); myActiveContainerPlanSize++; } else { //routePerson(attrs, *myActiveContainerPlan); } break; } case SUMO_TAG_FLOW: myActiveRouteProbability = DEFAULT_VEH_PROB; parseFromViaTo("flow", attrs); break; case SUMO_TAG_TRIP: { myActiveRouteProbability = DEFAULT_VEH_PROB; parseFromViaTo("trip", attrs); } break; default: break; } }