void NLTriggerBuilder::buildVaporizer(const SUMOSAXAttributes& attrs) { bool ok = true; // get the id, throw if not given or empty... std::string id = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); if (!ok) { return; } MSEdge* e = MSEdge::dictionary(id); if (e == 0) { WRITE_ERROR("Unknown edge ('" + id + "') referenced in a vaporizer."); return; } SUMOTime begin = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, 0, ok); SUMOTime end = attrs.getSUMOTimeReporting(SUMO_ATTR_END, 0, ok); if (!ok) { return; } if (begin < 0) { WRITE_ERROR("A vaporization begin time is negative (edge id='" + id + "')."); return; } if (begin >= end) { WRITE_ERROR("A vaporization ends before it starts (edge id='" + id + "')."); return; } if (end >= string2time(OptionsCont::getOptions().getString("begin"))) { Command* cb = new WrappingCommand< MSEdge >(e, &MSEdge::incVaporization); MSNet::getInstance()->getBeginOfTimestepEvents().addEvent(cb, begin, MSEventControl::ADAPT_AFTER_EXECUTION); Command* ce = new WrappingCommand< MSEdge >(e, &MSEdge::decVaporization); MSNet::getInstance()->getBeginOfTimestepEvents().addEvent(ce, end, MSEventControl::ADAPT_AFTER_EXECUTION); } }
void SUMORouteHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { switch (element) { case SUMO_TAG_VEHICLE: delete myVehicleParameter; myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs); break; case SUMO_TAG_PERSON: delete myVehicleParameter; myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs, false, false, true); break; case SUMO_TAG_CONTAINER: delete myVehicleParameter; myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs); break; case SUMO_TAG_FLOW: delete myVehicleParameter; myVehicleParameter = SUMOVehicleParserHelper::parseFlowAttributes(attrs, myBeginDefault, myEndDefault); break; case SUMO_TAG_VTYPE: myCurrentVType = SUMOVehicleParserHelper::beginVTypeParsing(attrs, getFileName()); break; case SUMO_TAG_VTYPE_DISTRIBUTION: openVehicleTypeDistribution(attrs); break; case SUMO_TAG_ROUTE: openRoute(attrs); break; case SUMO_TAG_ROUTE_DISTRIBUTION: openRouteDistribution(attrs); break; case SUMO_TAG_STOP: addStop(attrs); break; case SUMO_TAG_TRIP: { myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs, true); if (myVehicleParameter->id == "") { //@todo warn about deprecation of missing trip ids myVehicleParameter->id = myIdSupplier.getNext(); } myVehicleParameter->setParameter |= VEHPARS_FORCE_REROUTE; myActiveRouteID = "!" + myVehicleParameter->id; break; } case SUMO_TAG_INTERVAL: { bool ok; myBeginDefault = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, 0, ok); myEndDefault = attrs.getSUMOTimeReporting(SUMO_ATTR_END, 0, ok); break; } case SUMO_TAG_PARAM: addParam(attrs); break; default: break; } }
void NLHandler::addE1Detector(const SUMOSAXAttributes& attrs) { bool ok = true; // get the id, report an error if not given or empty... std::string id = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); if (!ok) { return; } const SUMOTime frequency = attrs.getSUMOTimeReporting(SUMO_ATTR_FREQUENCY, id.c_str(), ok); const SUMOReal position = attrs.get<SUMOReal>(SUMO_ATTR_POSITION, id.c_str(), ok); const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), ok, false); const bool splitByType = attrs.getOpt<bool>(SUMO_ATTR_SPLIT_VTYPE, id.c_str(), ok, false); const std::string lane = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), ok); const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok); if (!ok) { return; } try { myDetectorBuilder.buildInductLoop(id, lane, position, frequency, FileHelpers::checkForRelativity(file, getFileName()), friendlyPos, splitByType); } catch (InvalidArgument& e) { WRITE_ERROR(e.what()); } catch (IOError& e) { WRITE_ERROR(e.what()); } }
void MSLaneSpeedTrigger::myStartElement(int element, const SUMOSAXAttributes& attrs) { // check whether the correct tag is read if (element != SUMO_TAG_STEP) { return; } // extract the values bool ok = true; SUMOTime next = attrs.getSUMOTimeReporting(SUMO_ATTR_TIME, getID().c_str(), ok); SUMOReal speed = attrs.getOpt<SUMOReal>(SUMO_ATTR_SPEED, getID().c_str(), ok, -1); // check the values if (next < 0) { WRITE_ERROR("Wrong time in vss '" + getID() + "'."); return; } if (speed < 0) { speed = myDefaultSpeed; } // set the values for the next step if they are valid if (myLoadedSpeeds.size() != 0 && myLoadedSpeeds.back().first == next) { WRITE_WARNING("Time " + time2string(next) + " was set twice for vss '" + getID() + "'; replacing first entry."); myLoadedSpeeds.back().second = speed; } else { myLoadedSpeeds.push_back(std::make_pair(next, speed)); } }
void ROJTRTurnDefLoader::myStartElement(int element, const SUMOSAXAttributes& attrs) { bool ok = true; switch (element) { case SUMO_TAG_INTERVAL: myIntervalBegin = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, 0, ok); myIntervalEnd = attrs.getSUMOTimeReporting(SUMO_ATTR_END, 0, ok); break; case SUMO_TAG_FROMEDGE: beginFromEdge(attrs); break; case SUMO_TAG_TOEDGE: addToEdge(attrs); break; case SUMO_TAG_SINK: if (attrs.hasAttribute(SUMO_ATTR_EDGES)) { std::string edges = attrs.get<std::string>(SUMO_ATTR_EDGES, 0, ok); StringTokenizer st(edges, StringTokenizer::WHITECHARS); while (st.hasNext()) { std::string id = st.next(); ROEdge* edge = myNet.getEdge(id); if (edge == 0) { throw ProcessError("The edge '" + id + "' declared as a sink is not known."); } edge->setType(ROEdge::ET_SINK); } } break; case SUMO_TAG_SOURCE: if (attrs.hasAttribute(SUMO_ATTR_EDGES)) { std::string edges = attrs.get<std::string>(SUMO_ATTR_EDGES, 0, ok); StringTokenizer st(edges, StringTokenizer::WHITECHARS); while (st.hasNext()) { std::string id = st.next(); ROEdge* edge = myNet.getEdge(id); if (edge == 0) { throw ProcessError("The edge '" + id + "' declared as a source is not known."); } edge->setType(ROEdge::ET_SOURCE); } } break; default: break; } }
void TrajectoriesHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { bool ok = true; switch (element) { case SUMO_TAG_TRAJECTORIES: myStepSize = attrs.getFloat("timeStepSize") / 1000.; break; case SUMO_TAG_TIMESTEP: myCurrentTime = attrs.getSUMOTimeReporting(SUMO_ATTR_TIME, 0, ok); break; case SUMO_TAG_VEHICLE: if (attrs.hasAttribute(SUMO_ATTR_SPEED)) { SUMOReal v = attrs.getFloat(SUMO_ATTR_SPEED); SUMOReal a = INVALID_VALUE; SUMOReal s = INVALID_VALUE; writeEmissions(std::cout, attrs.getString(SUMO_ATTR_ID), myDefaultClass, STEPS2TIME(myCurrentTime), v, a, s); } else { const std::string acId = attrs.getString(SUMO_ATTR_ACTORCONFIG); const std::string id = attrs.getString(SUMO_ATTR_ID); if (myEmissionClassByType.count(acId) == 0) { WRITE_WARNING("Unknown actor configuration '" + acId + "' for vehicle '" + id + "'!"); } else { myEmissionClassByVehicle[id] = myEmissionClassByType.count(acId) > 0 ? myEmissionClassByType[acId] : myDefaultClass; } } break; case SUMO_TAG_ACTORCONFIG: { const std::string id = attrs.getString(SUMO_ATTR_ID); const std::string vClass = attrs.getString(SUMO_ATTR_VEHICLECLASS); const std::string fuel = attrs.getString(SUMO_ATTR_FUEL); const std::string eClass = attrs.getString(SUMO_ATTR_EMISSIONCLASS); const SUMOReal weight = attrs.getOpt<SUMOReal>(SUMO_ATTR_WEIGHT, id.c_str(), ok, 0.) * 10.; myEmissionClassByType[id] = PollutantsInterface::getClass(myDefaultClass, vClass, fuel, eClass, weight); break; } case SUMO_TAG_MOTIONSTATE: { const std::string id = attrs.getString(SUMO_ATTR_VEHICLE); if (myEmissionClassByVehicle.count(id) == 0) { WRITE_WARNING("Motion state for unknown vehicle '" + id + "'!"); myEmissionClassByVehicle[id] = myDefaultClass; } const SUMOEmissionClass c = myEmissionClassByVehicle[id]; SUMOReal v = attrs.getFloat(SUMO_ATTR_SPEED) / 100.; SUMOReal a = attrs.hasAttribute(SUMO_ATTR_ACCELERATION) ? attrs.get<SUMOReal>(SUMO_ATTR_ACCELERATION, id.c_str(), ok) / 1000. : INVALID_VALUE; SUMOReal s = attrs.hasAttribute(SUMO_ATTR_SLOPE) ? RAD2DEG(asin(attrs.get<SUMOReal>(SUMO_ATTR_SLOPE, id.c_str(), ok) / 10000.)) : INVALID_VALUE; const SUMOTime time = attrs.getOpt<int>(SUMO_ATTR_TIME, id.c_str(), ok, INVALID_VALUE); if (myXMLOut != 0) { writeXMLEmissions(id, c, time, v, a, s); } if (myStdOut != 0) { writeEmissions(*myStdOut, id, c, STEPS2TIME(time), v, a, s); } break; } default: break; } }
void NLHandler::addE2Detector(const SUMOSAXAttributes& attrs) { // check whether this is a detector connected to a tls an optionally to a link bool ok = true; const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); const std::string lsaid = attrs.getOpt<std::string>(SUMO_ATTR_TLID, id.c_str(), ok, "<invalid>"); const std::string toLane = attrs.getOpt<std::string>(SUMO_ATTR_TO, id.c_str(), ok, "<invalid>"); const SUMOTime haltingTimeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), ok, TIME2STEPS(1)); const SUMOReal haltingSpeedThreshold = attrs.getOpt<SUMOReal>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), ok, 5.0f / 3.6f); const SUMOReal jamDistThreshold = attrs.getOpt<SUMOReal>(SUMO_ATTR_JAM_DIST_THRESHOLD, id.c_str(), ok, 10.0f); const SUMOReal position = attrs.get<SUMOReal>(SUMO_ATTR_POSITION, id.c_str(), ok); const SUMOReal length = attrs.get<SUMOReal>(SUMO_ATTR_LENGTH, id.c_str(), ok); const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), ok, false); const bool cont = attrs.getOpt<bool>(SUMO_ATTR_CONT, id.c_str(), ok, false); const std::string lane = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), ok); const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok); if (!ok) { return; } try { if (lsaid != "<invalid>") { if (toLane == "<invalid>") { myDetectorBuilder.buildE2Detector(id, lane, position, length, cont, myJunctionControlBuilder.getTLLogic(lsaid), FileHelpers::checkForRelativity(file, getFileName()), haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold, friendlyPos); } else { myDetectorBuilder.buildE2Detector(id, lane, position, length, cont, myJunctionControlBuilder.getTLLogic(lsaid), toLane, FileHelpers::checkForRelativity(file, getFileName()), haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold, friendlyPos); } } else { bool ok = true; SUMOTime frequency = attrs.getSUMOTimeReporting(SUMO_ATTR_FREQUENCY, id.c_str(), ok); if (!ok) { return; } myDetectorBuilder.buildE2Detector(id, lane, position, length, cont, frequency, FileHelpers::checkForRelativity(file, getFileName()), haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold, friendlyPos); } } catch (InvalidArgument& e) { WRITE_ERROR(e.what()); } catch (IOError& e) { WRITE_ERROR(e.what()); } }
void NLHandler::addWAUTSwitch(const SUMOSAXAttributes& attrs) { bool ok = true; SUMOTime t = attrs.getSUMOTimeReporting(SUMO_ATTR_TIME, myCurrentWAUTID.c_str(), ok); std::string to = attrs.get<std::string>(SUMO_ATTR_TO, myCurrentWAUTID.c_str(), ok); if (!ok) { myCurrentIsBroken = true; } if (!myCurrentIsBroken) { try { myJunctionControlBuilder.getTLLogicControlToUse().addWAUTSwitch(myCurrentWAUTID, t, to); } catch (InvalidArgument& e) { WRITE_ERROR(e.what()); myCurrentIsBroken = true; } } }
void NLHandler::addVTypeProbeDetector(const SUMOSAXAttributes& attrs) { bool ok = true; std::string id = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); SUMOTime frequency = attrs.getSUMOTimeReporting(SUMO_ATTR_FREQUENCY, id.c_str(), ok); std::string type = attrs.getStringSecure(SUMO_ATTR_TYPE, ""); std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok); if (!ok) { return; } try { myDetectorBuilder.buildVTypeProbe(id, type, frequency, FileHelpers::checkForRelativity(file, getFileName())); } catch (InvalidArgument& e) { WRITE_ERROR(e.what()); } catch (IOError& e) { WRITE_ERROR(e.what()); } }
void NLHandler::addRouteProbeDetector(const SUMOSAXAttributes& attrs) { bool ok = true; std::string id = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); SUMOTime frequency = attrs.getSUMOTimeReporting(SUMO_ATTR_FREQUENCY, id.c_str(), ok); SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), ok, -1); std::string edge = attrs.get<std::string>(SUMO_ATTR_EDGE, id.c_str(), ok); std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok); if (!ok) { return; } try { myDetectorBuilder.buildRouteProbe(id, edge, frequency, begin, FileHelpers::checkForRelativity(file, getFileName())); } catch (InvalidArgument& e) { WRITE_ERROR(e.what()); } catch (IOError& e) { WRITE_ERROR(e.what()); } }
void NLHandler::beginE3Detector(const SUMOSAXAttributes& attrs) { bool ok = true; std::string id = attrs.get<std::string>(SUMO_ATTR_ID, 0, ok); const SUMOTime frequency = attrs.getSUMOTimeReporting(SUMO_ATTR_FREQUENCY, id.c_str(), ok); const SUMOTime haltingTimeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), ok, TIME2STEPS(1)); const SUMOReal haltingSpeedThreshold = attrs.getOpt<SUMOReal>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), ok, 5.0f / 3.6f); const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok); if (!ok) { return; } try { myDetectorBuilder.beginE3Detector(id, FileHelpers::checkForRelativity(file, getFileName()), frequency, haltingSpeedThreshold, haltingTimeThreshold); } catch (InvalidArgument& e) { WRITE_ERROR(e.what()); } catch (IOError& e) { WRITE_ERROR(e.what()); } }
void NLHandler::addPhase(const SUMOSAXAttributes& attrs) { // try to get the phase definition bool ok = true; std::string state = attrs.get<std::string>(SUMO_ATTR_STATE, 0, ok); if (!ok) { return; } // try to get the phase duration SUMOTime duration = attrs.getSUMOTimeReporting(SUMO_ATTR_DURATION, myJunctionControlBuilder.getActiveKey().c_str(), ok); if (duration == 0) { WRITE_ERROR("Duration of tls-logic '" + myJunctionControlBuilder.getActiveKey() + "/" + myJunctionControlBuilder.getActiveSubKey() + "' is zero."); return; } // if the traffic light is an actuated traffic light, try to get // the minimum and maximum durations SUMOTime minDuration = attrs.getOptSUMOTimeReporting( SUMO_ATTR_MINDURATION, myJunctionControlBuilder.getActiveKey().c_str(), ok, duration); SUMOTime maxDuration = attrs.getOptSUMOTimeReporting( SUMO_ATTR_MAXDURATION, myJunctionControlBuilder.getActiveKey().c_str(), ok, duration); myJunctionControlBuilder.addPhase(duration, state, minDuration, maxDuration); }
void MSLaneSpeedTrigger::myStartElement(SumoXMLTag element, const SUMOSAXAttributes &attrs) throw(ProcessError) { // check whether the correct tag is read if (element!=SUMO_TAG_STEP) { return; } // extract the values bool ok = true; SUMOTime next = attrs.getSUMOTimeReporting(SUMO_ATTR_TIME, "vss/step", getID().c_str(), ok); SUMOReal speed = attrs.getOptSUMORealReporting(SUMO_ATTR_SPEED, "vss/step", getID().c_str(), ok, -1); // check the values if (next<0) { MsgHandler::getErrorInstance()->inform("Wrong time in MSLaneSpeedTrigger in file '" + getFileName() + "'."); return; } if (speed<0) { MsgHandler::getErrorInstance()->inform("Wrong speed in MSLaneSpeedTrigger in file '" + getFileName() + "'."); return; } // set the values for the next step as they are valid myLoadedSpeeds.push_back(std::make_pair(next, speed)); }
void SUMORouteHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { switch (element) { case SUMO_TAG_VEHICLE: delete myVehicleParameter; myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs); break; case SUMO_TAG_PERSON: delete myVehicleParameter; myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs, false, false, true); break; case SUMO_TAG_CONTAINER: delete myVehicleParameter; myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs); break; case SUMO_TAG_FLOW: delete myVehicleParameter; myVehicleParameter = SUMOVehicleParserHelper::parseFlowAttributes(attrs, myBeginDefault, myEndDefault); break; case SUMO_TAG_VTYPE: // XXX: Where is this deleted? Delegated to subclasses?! MSRouteHandler takes care of this, in case of RORouteHandler this is not obvious. Consider introduction of a shared_ptr myCurrentVType = SUMOVehicleParserHelper::beginVTypeParsing(attrs, getFileName()); break; case SUMO_TAG_VTYPE_DISTRIBUTION: openVehicleTypeDistribution(attrs); break; case SUMO_TAG_ROUTE: openRoute(attrs); break; case SUMO_TAG_ROUTE_DISTRIBUTION: openRouteDistribution(attrs); break; case SUMO_TAG_STOP: addStop(attrs); break; case SUMO_TAG_TRIP: { myVehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs, true); if (myVehicleParameter->id == "") { WRITE_WARNING("Omitting trip ids is deprecated!"); myVehicleParameter->id = myIdSupplier.getNext(); } myVehicleParameter->parametersSet |= VEHPARS_FORCE_REROUTE; myActiveRouteID = "!" + myVehicleParameter->id; break; } case SUMO_TAG_PERSONTRIP: case SUMO_TAG_WALK: if (attrs.hasAttribute(SUMO_ATTR_EDGES) || attrs.hasAttribute(SUMO_ATTR_ROUTE)) { addWalk(attrs); } else { addPersonTrip(attrs); } break; case SUMO_TAG_INTERVAL: { bool ok; myBeginDefault = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, 0, ok); myEndDefault = attrs.getSUMOTimeReporting(SUMO_ATTR_END, 0, ok); break; } case SUMO_TAG_PARAM: addParam(attrs); break; default: // parse embedded car following model information if (myCurrentVType != 0) { WRITE_WARNING("Defining car following parameters in a nested element is deprecated in vType '" + myCurrentVType->id + "', use attributes instead!"); SUMOVehicleParserHelper::parseVTypeEmbedded(*myCurrentVType, (SumoXMLTag)element, attrs); } break; } }
void MSCalibrator::MSCalibrator_FileTriggeredChild::myStartElement(SumoXMLTag element, const SUMOSAXAttributes &attrs) throw(ProcessError) { if (element==SUMO_TAG_ROUTEDISTELEM) { bool ok = true; SUMOReal freq = attrs.getSUMORealReporting(SUMO_ATTR_PROB, "calibrator/routedistelem", myParent.getID().c_str(), ok); std::string routeStr = attrs.getStringReporting(SUMO_ATTR_ID, "calibrator/routedistelem", myParent.getID().c_str(), ok); if (ok) { const MSRoute* route = MSRoute::dictionary(routeStr); if (route == 0) { throw ProcessError("MSTriggeredSource " + myParent.getID() + ": Route '" + routeStr + "' does not exist."); } if (freq<0) { throw ProcessError("MSTriggeredSource " + myParent.getID() + ": Attribute \"probability\" is negative (must not)."); } // Attributes ok, add to routeDist myRouteDist.add(freq, route); } return; } // vehicle-type distributions if (element==SUMO_TAG_VTYPEDISTELEM) { // get the id, report an error if not given or empty... std::string id; if (!attrs.setIDFromAttributes("vtypedistelem", id)) { return; } bool ok = true; SUMOReal prob = attrs.getSUMORealReporting(SUMO_ATTR_PROB, "vtypedistelem", id.c_str(), ok); if (ok) { if (prob<=0) { MsgHandler::getErrorInstance()->inform("False probability while parsing calibrator '" + myParent.getID() + "' (" + toString(prob) + ")."); return; } MSVehicleType *vtype = MSNet::getInstance()->getVehicleControl().getVType(id); if (vtype==0) { MsgHandler::getErrorInstance()->inform("Unknown vtype-object '" + id + "'."); return; } myVTypeDist.add(prob, vtype); } } if (element==SUMO_TAG_FLOW) { bool ok = true; SUMOReal no = attrs.getSUMORealReporting(SUMO_ATTR_NO, "flow", myParent.getID().c_str(), ok); if (no<0) { MsgHandler::getErrorInstance()->inform("Negative flow in calibrator '" + myParent.getID() + "'."); return; } SUMOTime end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, "flow", myParent.getID().c_str(), ok, -1); if (!ok) { return; } myFlow = (SUMOReal) no; if (end==-1||end>=MSNet::getInstance()->getCurrentTimeStep()) { if (myFlow>0) { buildAndScheduleFlowVehicle(); MSNet::getInstance()->getEmissionEvents().addEvent( new WrappingCommand<MSCalibrator::MSCalibrator_FileTriggeredChild>(this, &MSCalibrator::MSCalibrator_FileTriggeredChild::execute), (SUMOTime)(1. / (myFlow / 3600.))+MSNet::getInstance()->getCurrentTimeStep(), MSEventControl::ADAPT_AFTER_EXECUTION); myHaveInitialisedFlow = true; } } } // check whethe the correct tag is read if (element==SUMO_TAG_EMIT) { bool ok = true; SUMOTime depart = attrs.getSUMOTimeReporting(SUMO_ATTR_TIME, "emit", 0, ok); SUMOReal departSpeed = attrs.getOptSUMORealReporting(SUMO_ATTR_SPEED, "emit", myParent.getID().c_str(), ok, -1); if (!ok) { return; } if (depart<myBeginTime) { // do not process the vehicle if the emission time is before the simulation begin return; } SUMOVehicleParameter* pars = new SUMOVehicleParameter(); pars->repetitionNumber = -1; pars->repetitionOffset = -1; pars->depart = depart; pars->departSpeed = departSpeed; // check and assign id pars->id = attrs.getStringSecure(SUMO_ATTR_ID, ""); if (myVehicleControl.getVehicle(pars->id)!=0) { WRITE_WARNING("MSTriggeredSource " + myParent.getID()+ ": Vehicle " + pars->id + " already exists.\n Generating a default id."); pars->id = ""; } if (pars->id=="") { pars->id = myParent.getID() + "_" + toString(pars->depart) + "_" + toString(myRunningID++); if (myVehicleControl.getVehicle(pars->id)!=0) { WRITE_WARNING("MSTriggeredSource " + myParent.getID()+ ": Vehicle " + pars->id + " already exists.\n Continuing with next element."); return; } } // check and assign vehicle type pars->vtypeid = attrs.getStringReporting(SUMO_ATTR_TYPE, "calibrator/routedistelem", myParent.getID().c_str(), ok, ""); MSVehicleType* aVehType = MSNet::getInstance()->getVehicleControl().getVType(pars->vtypeid); if (aVehType == 0) { if (myVTypeDist.getOverallProb()!=0) { aVehType = myVTypeDist.get(); } if (aVehType==0) { aVehType = MSNet::getInstance()->getVehicleControl().getVType(); if (aVehType==0) { WRITE_WARNING("MSTriggeredSource " + myParent.getID()+ ": no valid vehicle type exists.\n Continuing with next element."); return; } } } // check and assign vehicle type pars->routeid = attrs.getStringReporting(SUMO_ATTR_ROUTE, "calibrator/routedistelem", myParent.getID().c_str(), ok, ""); const MSRoute *aEmitRoute = MSRoute::dictionary(pars->routeid); if (aEmitRoute==0) { if (myRouteDist.getOverallProb()!=0) { aEmitRoute = myRouteDist.get(); } if (aEmitRoute==0) { WRITE_WARNING("MSTriggeredSource " + myParent.getID()+ ": no valid route exsists."); WRITE_WARNING("Continuing with next element."); return; } } // build vehicle MSVehicle *veh = MSNet::getInstance()->getVehicleControl().buildVehicle(pars, aEmitRoute, aVehType); myParent.schedule(this, veh, pars->departSpeed); myHaveNext = true; myOffset = SUMOTime(pars->depart); } // check whethe the correct tag is read if (element==SUMO_TAG_RESET) { myVTypeDist.clear(); myRouteDist.clear(); } #if 0 #ifdef TM_CALIB if (element==SUMO_TAG_CALIB) { WRITE_WARNING("FOUND calib Tag!!!"); /* MSNet::getInstance()->getEmissionEvents().addEvent( new WrappingCommand<MSCalibrator::MSCalibrator_FileTriggeredChild>(this, &MSCalibrator::MSCalibrator_FileTriggeredChild::execute2), //MSNet::getInstance()->getCurrentTimeStep() + 5, 10, MSEventControl::ADAPT_AFTER_EXECUTION); */ } #endif //TM_CALIB #endif //0 }
void MSCalibrator::myStartElement(int element, const SUMOSAXAttributes& attrs) { if (element == SUMO_TAG_FLOW) { AspiredState state; SUMOTime lastEnd = -1; if (myIntervals.size() > 0) { lastEnd = myIntervals.back().end; if (lastEnd == -1) { lastEnd = myIntervals.back().begin; } } try { bool ok = true; state.q = attrs.getOpt<double>(SUMO_ATTR_VEHSPERHOUR, nullptr, ok, -1.); state.v = attrs.getOpt<double>(SUMO_ATTR_SPEED, nullptr, ok, -1.); state.begin = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, myID.c_str(), ok); if (state.begin < lastEnd) { WRITE_ERROR("Overlapping or unsorted intervals in calibrator '" + myID + "'."); } state.end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, myID.c_str(), ok, -1); state.vehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(attrs, true, true); LeftoverVehicleParameters.push_back(state.vehicleParameter); // vehicles should be inserted with max speed unless stated otherwise if (state.vehicleParameter->departSpeedProcedure == DEPART_SPEED_DEFAULT) { state.vehicleParameter->departSpeedProcedure = DEPART_SPEED_MAX; } // vehicles should be inserted on any lane unless stated otherwise if (state.vehicleParameter->departLaneProcedure == DEPART_LANE_DEFAULT) { if (myLane == nullptr) { state.vehicleParameter->departLaneProcedure = DEPART_LANE_ALLOWED_FREE; } else { state.vehicleParameter->departLaneProcedure = DEPART_LANE_GIVEN; state.vehicleParameter->departLane = myLane->getIndex(); } } else if (myLane != nullptr && ( state.vehicleParameter->departLaneProcedure != DEPART_LANE_GIVEN || state.vehicleParameter->departLane != myLane->getIndex())) { WRITE_WARNING("Insertion lane may differ from calibrator lane for calibrator '" + getID() + "'."); } if (state.vehicleParameter->vtypeid != DEFAULT_VTYPE_ID && MSNet::getInstance()->getVehicleControl().getVType(state.vehicleParameter->vtypeid) == nullptr) { WRITE_ERROR("Unknown vehicle type '" + state.vehicleParameter->vtypeid + "' in calibrator '" + myID + "'."); } } catch (EmptyData&) { WRITE_ERROR("Mandatory attribute missing in definition of calibrator '" + myID + "'."); } catch (NumberFormatException&) { WRITE_ERROR("Non-numeric value for numeric attribute in definition of calibrator '" + myID + "'."); } if (state.q < 0 && state.v < 0) { WRITE_ERROR("Either 'vehsPerHour' or 'speed' has to be given in flow definition of calibrator '" + myID + "'."); } if (myIntervals.size() > 0 && myIntervals.back().end == -1) { myIntervals.back().end = state.begin; } myIntervals.push_back(state); myCurrentStateInterval = myIntervals.begin(); } else { MSRouteHandler::myStartElement(element, attrs); } }
void GUISettingsHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { bool ok = true; switch (element) { case SUMO_TAG_BREAKPOINTS_FILE: { std::string file = attrs.get<std::string>(SUMO_ATTR_VALUE, nullptr, ok); myBreakpoints = loadBreakpoints(file); } break; case SUMO_TAG_BREAKPOINT: myBreakpoints.push_back(attrs.getSUMOTimeReporting(SUMO_ATTR_VALUE, nullptr, ok)); break; case SUMO_TAG_VIEWSETTINGS: myViewType = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, nullptr, ok, "default"); std::transform(myViewType.begin(), myViewType.end(), myViewType.begin(), tolower); break; case SUMO_TAG_DELAY: myDelay = attrs.getOpt<double>(SUMO_ATTR_VALUE, nullptr, ok, myDelay); break; case SUMO_TAG_VIEWPORT: { const double x = attrs.getOpt<double>(SUMO_ATTR_X, nullptr, ok, myLookFrom.x()); const double y = attrs.getOpt<double>(SUMO_ATTR_Y, nullptr, ok, myLookFrom.y()); const double z = attrs.getOpt<double>(SUMO_ATTR_ZOOM, nullptr, ok, myLookFrom.z()); myLookFrom.set(x, y, z); const double cx = attrs.getOpt<double>(SUMO_ATTR_CENTER_X, nullptr, ok, myLookAt.x()); const double cy = attrs.getOpt<double>(SUMO_ATTR_CENTER_Y, nullptr, ok, myLookAt.y()); const double cz = attrs.getOpt<double>(SUMO_ATTR_CENTER_Z, nullptr, ok, myLookAt.z()); myLookAt.set(cx, cy, cz); myRotation = attrs.getOpt<double>(SUMO_ATTR_ANGLE, nullptr, ok, myRotation); break; } case SUMO_TAG_SNAPSHOT: { bool ok = true; std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, nullptr, ok); if (file != "" && !FileHelpers::isAbsolute(file)) { file = FileHelpers::getConfigurationRelative(getFileName(), file); } mySnapshots[attrs.getOptSUMOTimeReporting(SUMO_ATTR_TIME, file.c_str(), ok, 0)].push_back(file); } break; case SUMO_TAG_VIEWSETTINGS_SCHEME: { bool ok = true; mySettings.name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, nullptr, ok, mySettings.name); if (gSchemeStorage.contains(mySettings.name)) { mySettings = gSchemeStorage.get(mySettings.name); } } break; case SUMO_TAG_VIEWSETTINGS_OPENGL: mySettings.dither = StringUtils::toBool(attrs.getStringSecure("dither", toString(mySettings.dither))); mySettings.fps = StringUtils::toBool(attrs.getStringSecure("fps", toString(mySettings.fps))); mySettings.drawBoundaries = StringUtils::toBool(attrs.getStringSecure("drawBoundaries", toString(mySettings.drawBoundaries))); mySettings.forceDrawForSelecting = StringUtils::toBool(attrs.getStringSecure("forceDrawForSelecting", toString(mySettings.forceDrawForSelecting))); break; case SUMO_TAG_VIEWSETTINGS_BACKGROUND: { bool ok = true; mySettings.backgroundColor = RGBColor::parseColorReporting(attrs.getStringSecure("backgroundColor", toString(mySettings.backgroundColor)), "background", nullptr, true, ok); mySettings.showGrid = StringUtils::toBool(attrs.getStringSecure("showGrid", toString(mySettings.showGrid))); mySettings.gridXSize = StringUtils::toDouble(attrs.getStringSecure("gridXSize", toString(mySettings.gridXSize))); mySettings.gridYSize = StringUtils::toDouble(attrs.getStringSecure("gridYSize", toString(mySettings.gridYSize))); } break; case SUMO_TAG_VIEWSETTINGS_EDGES: { int laneEdgeMode = StringUtils::toInt(attrs.getStringSecure("laneEdgeMode", "0")); int laneEdgeScaleMode = StringUtils::toInt(attrs.getStringSecure("scaleMode", "0")); mySettings.laneShowBorders = StringUtils::toBool(attrs.getStringSecure("laneShowBorders", toString(mySettings.laneShowBorders))); mySettings.showBikeMarkings = StringUtils::toBool(attrs.getStringSecure("showBikeMarkings", toString(mySettings.showBikeMarkings))); mySettings.showLinkDecals = StringUtils::toBool(attrs.getStringSecure("showLinkDecals", toString(mySettings.showLinkDecals))); mySettings.showLinkRules = StringUtils::toBool(attrs.getStringSecure("showLinkRules", toString(mySettings.showLinkRules))); mySettings.showRails = StringUtils::toBool(attrs.getStringSecure("showRails", toString(mySettings.showRails))); mySettings.edgeName = parseTextSettings("edgeName", attrs, mySettings.edgeName); mySettings.internalEdgeName = parseTextSettings("internalEdgeName", attrs, mySettings.internalEdgeName); mySettings.cwaEdgeName = parseTextSettings("cwaEdgeName", attrs, mySettings.cwaEdgeName); mySettings.streetName = parseTextSettings("streetName", attrs, mySettings.streetName); mySettings.edgeValue = parseTextSettings("edgeValue", attrs, mySettings.edgeValue); mySettings.hideConnectors = StringUtils::toBool(attrs.getStringSecure("hideConnectors", toString(mySettings.hideConnectors))); mySettings.laneWidthExaggeration = StringUtils::toDouble(attrs.getStringSecure("widthExaggeration", toString(mySettings.laneWidthExaggeration))); mySettings.laneMinSize = StringUtils::toDouble(attrs.getStringSecure("minSize", toString(mySettings.laneWidthExaggeration))); mySettings.showLaneDirection = StringUtils::toBool(attrs.getStringSecure("showDirection", toString(mySettings.showLaneDirection))); mySettings.showSublanes = StringUtils::toBool(attrs.getStringSecure("showSublanes", toString(mySettings.showSublanes))); mySettings.spreadSuperposed = StringUtils::toBool(attrs.getStringSecure("spreadSuperposed", toString(mySettings.spreadSuperposed))); mySettings.edgeParam = attrs.getStringSecure("edgeParam", mySettings.edgeParam); mySettings.laneParam = attrs.getStringSecure("laneParam", mySettings.laneParam); mySettings.edgeData = attrs.getStringSecure("edgeData", mySettings.edgeData); myCurrentColorer = element; mySettings.edgeColorer.setActive(laneEdgeMode); mySettings.edgeScaler.setActive(laneEdgeScaleMode); mySettings.laneColorer.setActive(laneEdgeMode); mySettings.laneScaler.setActive(laneEdgeScaleMode); } break; case SUMO_TAG_COLORSCHEME: myCurrentScheme = nullptr; myCurrentScaleScheme = nullptr; if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_EDGES) { myCurrentScheme = mySettings.laneColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); if (myCurrentScheme == nullptr) { myCurrentScheme = mySettings.edgeColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); } } if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_VEHICLES) { myCurrentScheme = mySettings.vehicleColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); } if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_PERSONS) { myCurrentScheme = mySettings.personColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); } if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_JUNCTIONS) { myCurrentScheme = mySettings.junctionColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); } if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_POIS) { myCurrentScheme = mySettings.poiColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); } if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_POLYS) { myCurrentScheme = mySettings.polyColorer.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); } if (myCurrentScheme && !myCurrentScheme->isFixed()) { bool ok = true; myCurrentScheme->setInterpolated(attrs.getOpt<bool>(SUMO_ATTR_INTERPOLATED, nullptr, ok, false)); myCurrentScheme->clear(); } break; case SUMO_TAG_SCALINGSCHEME: myCurrentScheme = nullptr; myCurrentScaleScheme = nullptr; if (myCurrentColorer == SUMO_TAG_VIEWSETTINGS_EDGES) { myCurrentScaleScheme = mySettings.laneScaler.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); if (myCurrentScaleScheme == nullptr) { myCurrentScaleScheme = mySettings.edgeScaler.getSchemeByName(attrs.getStringSecure(SUMO_ATTR_NAME, "")); } } if (myCurrentScaleScheme && !myCurrentScaleScheme->isFixed()) { bool ok = true; myCurrentScaleScheme->setInterpolated(attrs.getOpt<bool>(SUMO_ATTR_INTERPOLATED, nullptr, ok, false)); myCurrentScaleScheme->clear(); } break; case SUMO_TAG_ENTRY: if (myCurrentScheme != nullptr) { bool ok = true; RGBColor color = attrs.get<RGBColor>(SUMO_ATTR_COLOR, nullptr, ok); if (myCurrentScheme->isFixed()) { myCurrentScheme->setColor(attrs.getStringSecure(SUMO_ATTR_NAME, ""), color); } else { myCurrentScheme->addColor(color, attrs.getOpt<double>(SUMO_ATTR_THRESHOLD, nullptr, ok, 0)); } } else if (myCurrentScaleScheme != nullptr) { bool ok = true; double scale = attrs.get<double>(SUMO_ATTR_COLOR, nullptr, ok); if (myCurrentScaleScheme->isFixed()) { myCurrentScaleScheme->setColor(attrs.getStringSecure(SUMO_ATTR_NAME, ""), scale); } else { myCurrentScaleScheme->addColor(scale, attrs.getOpt<double>(SUMO_ATTR_THRESHOLD, nullptr, ok, 0)); } } break; case SUMO_TAG_VIEWSETTINGS_VEHICLES: mySettings.vehicleColorer.setActive(StringUtils::toInt(attrs.getStringSecure("vehicleMode", "0"))); mySettings.vehicleQuality = StringUtils::toInt(attrs.getStringSecure("vehicleQuality", toString(mySettings.vehicleQuality))); mySettings.showBlinker = StringUtils::toBool(attrs.getStringSecure("showBlinker", toString(mySettings.showBlinker))); mySettings.drawMinGap = StringUtils::toBool(attrs.getStringSecure("drawMinGap", toString(mySettings.drawMinGap))); mySettings.vehicleSize = parseSizeSettings("vehicle", attrs, mySettings.vehicleSize); mySettings.vehicleName = parseTextSettings("vehicleName", attrs, mySettings.vehicleName); mySettings.vehicleValue = parseTextSettings("vehicleValue", attrs, mySettings.vehicleValue); myCurrentColorer = element; break; case SUMO_TAG_VIEWSETTINGS_PERSONS: mySettings.personColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0"))); mySettings.personQuality = StringUtils::toInt(attrs.getStringSecure("personQuality", toString(mySettings.personQuality))); mySettings.personSize = parseSizeSettings("person", attrs, mySettings.personSize); mySettings.personName = parseTextSettings("personName", attrs, mySettings.personName); mySettings.personValue = parseTextSettings("personValue", attrs, mySettings.personValue); myCurrentColorer = element; break; case SUMO_TAG_VIEWSETTINGS_CONTAINERS: mySettings.containerColorer.setActive(StringUtils::toInt(attrs.getStringSecure("containerMode", "0"))); mySettings.containerQuality = StringUtils::toInt(attrs.getStringSecure("containerQuality", toString(mySettings.containerQuality))); mySettings.containerSize = parseSizeSettings("container", attrs, mySettings.containerSize); mySettings.containerName = parseTextSettings("containerName", attrs, mySettings.containerName); myCurrentColorer = element; break; case SUMO_TAG_VIEWSETTINGS_JUNCTIONS: mySettings.junctionColorer.setActive(StringUtils::toInt(attrs.getStringSecure("junctionMode", "0"))); mySettings.drawLinkTLIndex = parseTextSettings("drawLinkTLIndex", attrs, mySettings.drawLinkTLIndex); mySettings.drawLinkJunctionIndex = parseTextSettings("drawLinkJunctionIndex", attrs, mySettings.drawLinkJunctionIndex); mySettings.junctionName = parseTextSettings("junctionName", attrs, mySettings.junctionName); mySettings.internalJunctionName = parseTextSettings("internalJunctionName", attrs, mySettings.internalJunctionName); mySettings.tlsPhaseIndex = parseTextSettings("tlsPhaseIndex", attrs, mySettings.tlsPhaseIndex); mySettings.showLane2Lane = StringUtils::toBool(attrs.getStringSecure("showLane2Lane", toString(mySettings.showLane2Lane))); mySettings.drawJunctionShape = StringUtils::toBool(attrs.getStringSecure("drawShape", toString(mySettings.drawJunctionShape))); mySettings.drawCrossingsAndWalkingareas = StringUtils::toBool(attrs.getStringSecure( "drawCrossingsAndWalkingareas", toString(mySettings.drawCrossingsAndWalkingareas))); mySettings.junctionSize = parseSizeSettings("junction", attrs, mySettings.junctionSize); myCurrentColorer = element; break; case SUMO_TAG_VIEWSETTINGS_ADDITIONALS: mySettings.addMode = StringUtils::toInt(attrs.getStringSecure("addMode", toString(mySettings.addMode))); mySettings.addSize = parseSizeSettings("add", attrs, mySettings.addSize); mySettings.addName = parseTextSettings("addName", attrs, mySettings.addName); mySettings.addFullName = parseTextSettings("addFullName", attrs, mySettings.addFullName); break; case SUMO_TAG_VIEWSETTINGS_POIS: mySettings.poiSize = parseSizeSettings("poi", attrs, mySettings.poiSize); mySettings.poiName = parseTextSettings("poiName", attrs, mySettings.poiName); mySettings.poiType = parseTextSettings("poiType", attrs, mySettings.poiType); mySettings.poiColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0"))); myCurrentColorer = element; break; case SUMO_TAG_VIEWSETTINGS_POLYS: mySettings.polySize = parseSizeSettings("poly", attrs, mySettings.polySize); mySettings.polyName = parseTextSettings("polyName", attrs, mySettings.polyName); mySettings.polyType = parseTextSettings("polyType", attrs, mySettings.polyType); mySettings.polyColorer.setActive(StringUtils::toInt(attrs.getStringSecure("personMode", "0"))); myCurrentColorer = element; break; case SUMO_TAG_VIEWSETTINGS_LEGEND: mySettings.showSizeLegend = StringUtils::toBool(attrs.getStringSecure("showSizeLegend", toString(mySettings.showSizeLegend))); break; case SUMO_TAG_VIEWSETTINGS_DECAL: { GUISUMOAbstractView::Decal d; d.filename = attrs.getStringSecure("filename", d.filename); if (d.filename != "" && !FileHelpers::isAbsolute(d.filename)) { d.filename = FileHelpers::getConfigurationRelative(getFileName(), d.filename); } d.centerX = attrs.getOpt<double>(SUMO_ATTR_CENTER_X, nullptr, ok, d.centerX); d.centerY = attrs.getOpt<double>(SUMO_ATTR_CENTER_Y, nullptr, ok, d.centerY); d.centerZ = attrs.getOpt<double>(SUMO_ATTR_CENTER_Z, nullptr, ok, d.centerZ); d.width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, nullptr, ok, d.width); d.height = attrs.getOpt<double>(SUMO_ATTR_HEIGHT, nullptr, ok, d.height); d.altitude = StringUtils::toDouble(attrs.getStringSecure("altitude", toString(d.height))); d.rot = StringUtils::toDouble(attrs.getStringSecure("rotation", toString(d.rot))); d.tilt = StringUtils::toDouble(attrs.getStringSecure("tilt", toString(d.tilt))); d.roll = StringUtils::toDouble(attrs.getStringSecure("roll", toString(d.roll))); d.layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, nullptr, ok, d.layer); d.screenRelative = StringUtils::toBool(attrs.getStringSecure("screenRelative", toString(d.screenRelative))); d.initialised = false; myDecals.push_back(d); } break; case SUMO_TAG_VIEWSETTINGS_LIGHT: { GUISUMOAbstractView::Decal d; d.filename = "light" + attrs.getOpt<std::string>(SUMO_ATTR_INDEX, nullptr, ok, "0"); d.centerX = attrs.getOpt<double>(SUMO_ATTR_CENTER_X, nullptr, ok, d.centerX); d.centerY = attrs.getOpt<double>(SUMO_ATTR_CENTER_Y, nullptr, ok, d.centerY); d.centerZ = attrs.getOpt<double>(SUMO_ATTR_CENTER_Z, nullptr, ok, d.centerZ); d.width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, nullptr, ok, d.width); d.height = attrs.getOpt<double>(SUMO_ATTR_HEIGHT, nullptr, ok, d.height); d.altitude = StringUtils::toDouble(attrs.getStringSecure("altitude", toString(d.height))); d.rot = StringUtils::toDouble(attrs.getStringSecure("rotation", toString(d.rot))); d.tilt = StringUtils::toDouble(attrs.getStringSecure("tilt", toString(d.tilt))); d.roll = StringUtils::toDouble(attrs.getStringSecure("roll", toString(d.roll))); d.layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, nullptr, ok, d.layer); d.initialised = false; myDecals.push_back(d); } break; case SUMO_TAG_VIEWSETTINGS_EVENT: { const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok); const std::string cmd = attrs.get<std::string>(SUMO_ATTR_COMMAND, nullptr, ok); const double prob = attrs.get<double>(SUMO_ATTR_PROB, id.c_str(), ok); myEventDistributions[id].add(cmd, prob); } break; case SUMO_TAG_VIEWSETTINGS_EVENT_JAM_TIME: myJamSoundTime = attrs.get<double>(SUMO_ATTR_VALUE, nullptr, ok); break; default: break; } }