SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SUMORouteHandler.cpp
Go to the documentation of this file.
1 /****************************************************************************/
10 // Parser for routes during their loading
11 /****************************************************************************/
12 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
13 // Copyright (C) 2001-2014 DLR (http://www.dlr.de/) and contributors
14 /****************************************************************************/
15 //
16 // This file is part of SUMO.
17 // SUMO is free software: you can redistribute it and/or modify
18 // it under the terms of the GNU General Public License as published by
19 // the Free Software Foundation, either version 3 of the License, or
20 // (at your option) any later version.
21 //
22 /****************************************************************************/
23 
24 
25 // ===========================================================================
26 // included modules
27 // ===========================================================================
28 #ifdef _MSC_VER
29 #include <windows_config.h>
30 #else
31 #include <config.h>
32 #endif
33 
34 #include <string>
35 #include <map>
36 #include <vector>
40 #include <utils/common/ToString.h>
44 #include "SUMORouteHandler.h"
45 
46 #ifdef CHECK_MEMORY_LEAKS
47 #include <foreign/nvwa/debug_new.h>
48 #endif // CHECK_MEMORY_LEAKS
49 
50 
51 // ===========================================================================
52 // method definitions
53 // ===========================================================================
54 SUMORouteHandler::SUMORouteHandler(const std::string& file) :
55  SUMOSAXHandler(file),
56  myVehicleParameter(0),
57  myLastDepart(-1),
58  myActiveRouteColor(0),
59  myCurrentVType(0),
60  myBeginDefault(string2time(OptionsCont::getOptions().getString("begin"))),
61  myEndDefault(string2time(OptionsCont::getOptions().getString("end"))),
62  myFirstDepart(-1) {
63 }
64 
65 
67 }
68 
69 
72  return myLastDepart;
73 }
74 
75 
76 bool
80  WRITE_WARNING("Route file should be sorted by departure time, ignoring '" + myVehicleParameter->id + "'!");
81  return false;
82  }
83  }
84  return true;
85 }
86 
87 
88 void
92  if (myFirstDepart == -1) {
94  }
95  }
96  // else: we don't know when this vehicle will depart. keep the previous known depart time
97 }
98 
99 
100 void
102  const SUMOSAXAttributes& attrs) {
103  switch (element) {
104  case SUMO_TAG_VEHICLE:
105  delete myVehicleParameter;
107  break;
108  case SUMO_TAG_PERSON:
109  delete myVehicleParameter;
111  break;
112  case SUMO_TAG_FLOW:
113  delete myVehicleParameter;
115  break;
116  case SUMO_TAG_VTYPE:
118  break;
121  break;
122  case SUMO_TAG_ROUTE:
123  openRoute(attrs);
124  break;
126  openRouteDistribution(attrs);
127  break;
128  case SUMO_TAG_STOP:
129  addStop(attrs);
130  break;
131  case SUMO_TAG_TRIP: {
133  if (myVehicleParameter->id == "") {
134  //@todo warn about deprecation of missing trip ids
136  }
139  break;
140  }
141  case SUMO_TAG_INTERVAL: {
142  bool ok;
145  break;
146  }
147  case SUMO_TAG_PARAM:
148  addParam(attrs);
149  break;
150  default:
151  break;
152  }
153 }
154 
155 
156 void
158  switch (element) {
159  case SUMO_TAG_ROUTE:
160  closeRoute();
161  break;
162  case SUMO_TAG_PERSON:
163  closePerson();
164  delete myVehicleParameter;
165  myVehicleParameter = 0;
166  break;
167  case SUMO_TAG_VEHICLE:
169  myVehicleParameter->repetitionNumber++; // for backwards compatibility
170  // it is a flow, thus no break here
171  } else {
172  closeVehicle();
173  delete myVehicleParameter;
174  myVehicleParameter = 0;
175  break;
176  }
177  case SUMO_TAG_FLOW:
178  closeFlow();
179  break;
182  break;
185  break;
186  case SUMO_TAG_VTYPE:
188  break;
189  case SUMO_TAG_INTERVAL:
190  myBeginDefault = string2time(OptionsCont::getOptions().getString("begin"));
191  myEndDefault = string2time(OptionsCont::getOptions().getString("end"));
192  break;
193  case SUMO_TAG_TRIP:
194  delete myVehicleParameter;
195  myVehicleParameter = 0;
196  default:
197  break;
198  }
199 }
200 
201 
202 bool
203 SUMORouteHandler::checkStopPos(SUMOReal& startPos, SUMOReal& endPos, const SUMOReal laneLength,
204  const SUMOReal minLength, const bool friendlyPos) {
205  if (minLength > laneLength) {
206  return false;
207  }
208  if (startPos < 0) {
209  startPos += laneLength;
210  }
211  if (endPos < 0) {
212  endPos += laneLength;
213  }
214  if (endPos < minLength || endPos > laneLength) {
215  if (!friendlyPos) {
216  return false;
217  }
218  if (endPos < minLength) {
219  endPos = minLength;
220  }
221  if (endPos > laneLength) {
222  endPos = laneLength;
223  }
224  }
225  if (startPos < 0 || startPos > endPos - minLength) {
226  if (!friendlyPos) {
227  return false;
228  }
229  if (startPos < 0) {
230  startPos = 0;
231  }
232  if (startPos > endPos - minLength) {
233  startPos = endPos - minLength;
234  }
235  }
236  return true;
237 }
238 
239 
240 void
242  bool ok = true;
243  std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, 0, ok);
244  std::string val = attrs.get<std::string>(SUMO_ATTR_VALUE, 0, ok);
245  if (myVehicleParameter != 0) {
246  myVehicleParameter->addParameter(key, val);
247  } else if (myCurrentVType != 0) {
248  myCurrentVType->addParameter(key, val);
249  }
250 }
251 
252 
253 bool
254 SUMORouteHandler::parseStop(SUMOVehicleParameter::Stop& stop, const SUMOSAXAttributes& attrs, std::string errorSuffix, MsgHandler* const errorOutput) {
255  stop.setParameter = 0;
256  if (attrs.hasAttribute(SUMO_ATTR_ENDPOS)) {
257  stop.setParameter |= STOP_END_SET;
258  }
259  if (attrs.hasAttribute(SUMO_ATTR_STARTPOS)) {
261  }
262  if (attrs.hasAttribute(SUMO_ATTR_TRIGGERED)) {
264  }
265  if (attrs.hasAttribute(SUMO_ATTR_PARKING)) {
267  }
268  if (attrs.hasAttribute(SUMO_ATTR_EXPECTED)) {
270  }
271  bool ok = true;
272  stop.busstop = attrs.getOpt<std::string>(SUMO_ATTR_BUS_STOP, 0, ok, "");
273  if (stop.busstop != "") {
274  errorSuffix = " at '" + stop.busstop + "'" + errorSuffix;
275  } else {
276  errorSuffix = " on lane '" + stop.busstop + "'" + errorSuffix;
277  }
278  // get the standing duration
280  stop.triggered = attrs.getOpt<bool>(SUMO_ATTR_TRIGGERED, 0, ok, true);
281  stop.duration = -1;
282  stop.until = -1;
283  } else {
284  stop.duration = attrs.getOptSUMOTimeReporting(SUMO_ATTR_DURATION, 0, ok, -1);
285  stop.until = attrs.getOptSUMOTimeReporting(SUMO_ATTR_UNTIL, 0, ok, -1);
286  if (!ok || (stop.duration < 0 && stop.until < 0)) {
287  errorOutput->inform("Invalid duration or end time is given for a stop" + errorSuffix);
288  return false;
289  }
290  stop.triggered = attrs.getOpt<bool>(SUMO_ATTR_TRIGGERED, 0, ok, false);
291  }
292  stop.parking = attrs.getOpt<bool>(SUMO_ATTR_PARKING, 0, ok, stop.triggered);
293  if (!ok) {
294  errorOutput->inform("Invalid bool for 'triggered' or 'parking' for stop" + errorSuffix);
295  return false;
296  }
297 
298  // expected persons
299  std::string expectedStr = attrs.getOpt<std::string>(SUMO_ATTR_EXPECTED, 0, ok, "");
300  std::set<std::string> personIDs;
301  SUMOSAXAttributes::parseStringSet(expectedStr, personIDs);
302  stop.awaitedPersons = personIDs;
303 
304  const std::string idx = attrs.getOpt<std::string>(SUMO_ATTR_INDEX, 0, ok, "end");
305  if (idx == "end") {
306  stop.index = STOP_INDEX_END;
307  } else if (idx == "fit") {
308  stop.index = STOP_INDEX_FIT;
309  } else {
310  stop.index = attrs.get<int>(SUMO_ATTR_INDEX, 0, ok);
311  if (!ok || stop.index < 0) {
312  errorOutput->inform("Invalid 'index' for stop" + errorSuffix);
313  return false;
314  }
315  }
316  return true;
317 }
318 
319 /****************************************************************************/
virtual void openVehicleTypeDistribution(const SUMOSAXAttributes &attrs)=0
static SUMOVehicleParameter * parseVehicleAttributes(const SUMOSAXAttributes &attrs, bool optionalID=false, bool skipDepart=false)
Parses a vehicle&#39;s attributes.
virtual void myEndElement(int element)
Called when a closing tag occurs.
const int VEHPARS_FORCE_REROUTE
static void parseStringSet(const std::string &def, std::set< std::string > &into)
Splits the given string, stores it in a set.
The time is given.
int repetitionNumber
The number of times the vehicle shall be repeatedly inserted.
bool parking
whether the vehicle is removed from the net while stopping
SUMOTime myFirstDepart
the first read departure time
SUMOTime duration
The stopping duration.
SUMOVehicleParameter * myVehicleParameter
Parameter of the current vehicle, trip, person, or flow.
SUMOTime myEndDefault
The default value for flow ends.
virtual void addStop(const SUMOSAXAttributes &attrs)=0
Processing of a stop.
static bool checkStopPos(SUMOReal &startPos, SUMOReal &endPos, const SUMOReal laneLength, const SUMOReal minLength, const bool friendlyPos)
check start and end position of a stop
SUMOVTypeParameter * myCurrentVType
The currently parsed vehicle type.
SUMOTime until
The time at which the vehicle may continue its journey.
virtual void openRouteDistribution(const SUMOSAXAttributes &attrs)=0
const int STOP_INDEX_FIT
void registerLastDepart()
save last depart (only to be used if vehicle is not discarded)
std::set< std::string > awaitedPersons
IDs of persons the vehicle has to wait for until departing.
std::string myActiveRouteID
The id of the current route.
SAX-handler base for SUMO-files.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list...
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:200
IDSupplier myIdSupplier
generates numerical ids
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:67
SUMOTime getOptSUMOTimeReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
std::string busstop
(Optional) bus stop if one is assigned to the stop
const int STOP_START_SET
SUMOTime myBeginDefault
The default value for flow begins.
const std::string & getFileName() const
returns the current file name
std::string getNext()
Returns the next id.
Definition: IDSupplier.cpp:63
virtual void closeVehicle()=0
Ends the processing of a vehicle.
Encapsulated SAX-Attributes.
static SUMOVehicleParameter * parseFlowAttributes(const SUMOSAXAttributes &attrs, const SUMOTime beginDefault, const SUMOTime endDefault)
Parses a flow&#39;s attributes.
void addParam(const SUMOSAXAttributes &attrs)
assign arbitrary vehicle parameters
bool triggered
whether an arriving person lets the vehicle continue
virtual ~SUMORouteHandler()
standard destructor
const int STOP_INDEX_END
SUMOTime depart
The vehicle&#39;s departure time.
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
SUMOTime string2time(const std::string &r)
Definition: SUMOTime.cpp:48
const int STOP_EXPECTED_SET
SUMORouteHandler(const std::string &file)
standard constructor
SUMOTime getSUMOTimeReporting(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
virtual void closeRoute(const bool mayBeDisconnected=false)=0
const int STOP_END_SET
void addParameter(const std::string &key, const std::string &value)
Adds a parameter.
const int STOP_PARKING_SET
const int STOP_TRIGGER_SET
static void closeVTypeParsing(SUMOVTypeParameter &vtype)
Closes parsing of the vehicle type.
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
virtual void closeVehicleTypeDistribution()=0
SUMOTime myLastDepart
The insertion time of the vehicle read last.
int setParameter
Information for the router which parameter were set.
Definition of vehicle stop (position and duration)
bool parseStop(SUMOVehicleParameter::Stop &stop, const SUMOSAXAttributes &attrs, std::string errorSuffix, MsgHandler *const errorOutput)
parses attributes common to all stops
void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:89
A storage for options typed value containers)
Definition: OptionsCont.h:108
int index
at which position in the stops list
virtual void closeRouteDistribution()=0
int setParameter
Information for the output which parameter were set.
int SUMOTime
Definition: SUMOTime.h:43
virtual void closeFlow()=0
Ends the processing of a flow.
virtual void closePerson()=0
Ends the processing of a person.
#define SUMOReal
Definition: config.h:218
SUMOTime getLastDepart() const
Returns the last loaded depart time.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue, bool report=true) const
Tries to read given attribute assuming it is an int.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
static SUMOVTypeParameter * beginVTypeParsing(const SUMOSAXAttributes &attrs, const std::string &file)
Starts to parse a vehicle type.
bool checkLastDepart()
Checks whether the route file is sorted by departure time if needed.
std::string id
The vehicle&#39;s id.
virtual void openRoute(const SUMOSAXAttributes &attrs)=0