Eclipse SUMO - Simulation of Urban MObility
SUMORouteHandler.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
21 // Parser for routes during their loading
22 /****************************************************************************/
23 #include <config.h>
24 
29 #include <utils/xml/XMLSubSys.h>
30 
31 #include "SUMORouteHandler.h"
32 
33 
34 // ===========================================================================
35 // method definitions
36 // ===========================================================================
37 
38 SUMORouteHandler::SUMORouteHandler(const std::string& file, const std::string& expectedRoot, const bool hardFail) :
39  SUMOSAXHandler(file, expectedRoot),
40  myHardFail(hardFail),
41  myVehicleParameter(nullptr),
42  myLastDepart(-1),
43  myActiveRouteColor(nullptr),
44  myCurrentCosts(0.),
45  myCurrentVType(nullptr),
46  myBeginDefault(string2time(OptionsCont::getOptions().getString("begin"))),
47  myEndDefault(string2time(OptionsCont::getOptions().getString("end"))),
48  myFirstDepart(-1),
49  myInsertStopEdgesAt(-1),
50  myAllowInternalRoutes(false) {
51 }
52 
53 
55  delete myVehicleParameter;
56  delete myCurrentVType;
57 }
58 
59 
60 bool
64  WRITE_WARNINGF(TL("Route file should be sorted by departure time, ignoring '%'!"), myVehicleParameter->id);
65  return false;
66  }
67  }
68  return true;
69 }
70 
71 
72 void
74  // register only non public transport to parse all public transport lines in advance
77  if (myFirstDepart == -1) {
79  }
80  }
81  // else: we don't know when this vehicle will depart. keep the previous known depart time
82 }
83 
84 
85 void
87  myElementStack.push_back(element);
88  switch (element) {
89  case SUMO_TAG_VEHICLE:
90  case SUMO_TAG_PERSON:
91  case SUMO_TAG_CONTAINER:
92  // if myVehicleParameter is nullptr this will do nothing
93  delete myVehicleParameter;
94  // we set to nullptr to have a consistent state if the parsing fails
95  myVehicleParameter = nullptr;
98  if (element != SUMO_TAG_VEHICLE) {
99  addTransportable(attrs, element == SUMO_TAG_PERSON);
100  }
101  break;
102  case SUMO_TAG_FLOW:
103  // delete if myVehicleParameter isn't null
104  if (myVehicleParameter) {
105  delete myVehicleParameter;
106  myVehicleParameter = nullptr;
107  }
108  // parse vehicle parameters
109  // might be called to parse vehicles from additional file in the
110  // context of quickReload. In this case, rerouter flows must be ignored
111  if (myElementStack.size() == 1 || myElementStack[myElementStack.size() - 2] != SUMO_TAG_CALIBRATOR) {
113  }
114  // check if myVehicleParameter was successfully created
115  if (myVehicleParameter) {
116  // check tag
117  if (myVehicleParameter->routeid.empty()) {
118  // open a route flow (It could be a flow with embedded route)
119  openFlow(attrs);
120  } else {
121  // open a route flow
122  openRouteFlow(attrs);
123  }
124  myParamStack.push_back(myVehicleParameter);
125  }
126  break;
127  case SUMO_TAG_PERSONFLOW:
129  // delete if myVehicleParameter isn't null
130  if (myVehicleParameter) {
131  delete myVehicleParameter;
132  myVehicleParameter = nullptr;
133  }
134  // create a new flow
136  myParamStack.push_back(myVehicleParameter);
137  break;
138  case SUMO_TAG_VTYPE:
139  // delete if myCurrentVType isn't null
140  if (myCurrentVType != nullptr) {
141  delete myCurrentVType;
142  myCurrentVType = nullptr;
143  }
144  // create a new vType
146  myParamStack.push_back(myCurrentVType);
147  break;
150  break;
151  case SUMO_TAG_ROUTE:
152  openRoute(attrs);
153  break;
155  openRouteDistribution(attrs);
156  break;
157  case SUMO_TAG_STOP:
158  myParamStack.push_back(addStop(attrs));
159  break;
160  case SUMO_TAG_TRIP: {
161  // delete if myVehicleParameter isn't null
162  if (myVehicleParameter) {
163  delete myVehicleParameter;
164  myVehicleParameter = nullptr;
165  }
166  // parse vehicle parameters
168  // check if myVehicleParameter was successfully created
169  if (myVehicleParameter) {
172  // open trip
173  openTrip(attrs);
174  myParamStack.push_back(myVehicleParameter);
175  }
176  break;
177  }
178  case SUMO_TAG_PERSONTRIP:
179  addPersonTrip(attrs);
180  break;
181  case SUMO_TAG_WALK:
182  addWalk(attrs);
183  break;
184  case SUMO_TAG_INTERVAL: {
185  bool ok;
187  myEndDefault = attrs.getSUMOTimeReporting(SUMO_ATTR_END, nullptr, ok);
188  break;
189  }
190  case SUMO_TAG_RIDE:
191  addRide(attrs);
192  break;
193  case SUMO_TAG_TRANSPORT:
194  addTransport(attrs);
195  break;
196  case SUMO_TAG_TRANSHIP:
197  addTranship(attrs);
198  break;
199  case SUMO_TAG_PARAM:
200  addParam(attrs);
201  break;
202  default:
203  // parse embedded car following model information
204  if (myCurrentVType != nullptr) {
205  WRITE_WARNINGF(TL("Defining car-following parameters in a nested element is deprecated in vType '%', use attributes instead!"), myCurrentVType->id);
207  if (myHardFail) {
208  throw ProcessError(TL("Invalid parsing embedded VType"));
209  } else {
210  WRITE_ERROR(TL("Invalid parsing embedded VType"));
211  }
212  }
213  }
214  break;
215  }
216 }
217 
218 
219 void
221  switch (element) {
222  case SUMO_TAG_STOP:
223  myParamStack.pop_back();
224  break;
225  case SUMO_TAG_ROUTE:
226  closeRoute();
227  break;
228  case SUMO_TAG_VTYPE:
229  closeVType();
230  delete myCurrentVType;
231  myCurrentVType = nullptr;
232  myParamStack.pop_back();
233  break;
234  case SUMO_TAG_PERSON:
235  closePerson();
236  delete myVehicleParameter;
237  myVehicleParameter = nullptr;
238  myParamStack.pop_back();
239  break;
240  case SUMO_TAG_PERSONFLOW:
241  closePersonFlow();
242  delete myVehicleParameter;
243  myVehicleParameter = nullptr;
244  myParamStack.pop_back();
245  break;
246  case SUMO_TAG_CONTAINER:
247  closeContainer();
248  delete myVehicleParameter;
249  myVehicleParameter = nullptr;
250  myParamStack.pop_back();
251  break;
254  delete myVehicleParameter;
255  myVehicleParameter = nullptr;
256  myParamStack.pop_back();
257  break;
258  case SUMO_TAG_VEHICLE:
259  if (myVehicleParameter == nullptr) {
260  break;
261  }
263  myVehicleParameter->repetitionNumber++; // for backwards compatibility
264  // it is a flow, thus no break here
265  FALLTHROUGH;
266  } else {
267  closeVehicle();
268  delete myVehicleParameter;
269  myVehicleParameter = nullptr;
270  myParamStack.pop_back();
271  break;
272  }
273  case SUMO_TAG_FLOW:
274  if (myVehicleParameter) {
275  closeFlow();
276  delete myVehicleParameter;
277  myParamStack.pop_back();
278  }
279  myVehicleParameter = nullptr;
280  myInsertStopEdgesAt = -1;
281  break;
282  case SUMO_TAG_TRIP:
283  closeTrip();
284  delete myVehicleParameter;
285  myVehicleParameter = nullptr;
286  myParamStack.pop_back();
287  myInsertStopEdgesAt = -1;
288  break;
291  break;
294  break;
295  case SUMO_TAG_PERSONTRIP:
296  case SUMO_TAG_RIDE:
297  case SUMO_TAG_TRANSPORT:
298  case SUMO_TAG_TRANSHIP:
299  case SUMO_TAG_WALK:
300  if (myParamStack.size() == 2) {
301  myParamStack.pop_back();
302  }
303  break;
304  case SUMO_TAG_INTERVAL:
305  myBeginDefault = string2time(OptionsCont::getOptions().getString("begin"));
306  myEndDefault = string2time(OptionsCont::getOptions().getString("end"));
307  break;
308  default:
309  break;
310  }
311  myElementStack.pop_back();
312 }
313 
314 
316 SUMORouteHandler::checkStopPos(double& startPos, double& endPos, const double laneLength, const double minLength, const bool friendlyPos) {
317  if (minLength > laneLength) {
319  }
320  if (startPos < 0) {
321  startPos += laneLength;
322  }
323  if (endPos < 0) {
324  endPos += laneLength;
325  }
326  if ((endPos < minLength) || (endPos > laneLength)) {
327  if (!friendlyPos) {
328  return STOPPOS_INVALID_ENDPOS;
329  }
330  if (endPos < minLength) {
331  endPos = minLength;
332  }
333  if (endPos > laneLength) {
334  endPos = laneLength;
335  }
336  }
337  if ((startPos < 0) || (startPos > (endPos - minLength))) {
338  if (!friendlyPos) {
340  }
341  if (startPos < 0) {
342  startPos = 0;
343  }
344  if (startPos > (endPos - minLength)) {
345  startPos = endPos - minLength;
346  }
347  }
348  return STOPPOS_VALID;
349 }
350 
351 
352 bool
353 SUMORouteHandler::isStopPosValid(const double startPos, const double endPos, const double laneLength, const double minLength, const bool friendlyPos) {
354  // declare dummy start and end positions
355  double dummyStartPos = startPos;
356  double dummyEndPos = endPos;
357  // return checkStopPos
358  return (checkStopPos(dummyStartPos, dummyEndPos, laneLength, minLength, friendlyPos) == STOPPOS_VALID);
359 }
360 
361 
362 SUMOTime
364  return myFirstDepart;
365 }
366 
367 
368 SUMOTime
370  return myLastDepart;
371 }
372 
373 
374 void
376  bool ok = true;
377  const std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, nullptr, ok);
378  // only continue if key isn't empty
379  if (ok && (key.size() > 0)) {
380  // circumventing empty string test
381  const std::string val = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : "";
382  // add parameter in current created element
383  if (!myParamStack.empty()) {
384  myParamStack.back()->setParameter(key, val);
385  }
386  }
387 }
388 
389 
390 bool
391 SUMORouteHandler::parseStop(SUMOVehicleParameter::Stop& stop, const SUMOSAXAttributes& attrs, std::string errorSuffix, MsgHandler* const errorOutput) {
392  stop.parametersSet = 0;
393  if (attrs.hasAttribute(SUMO_ATTR_ARRIVAL)) {
395  }
396  if (attrs.hasAttribute(SUMO_ATTR_DURATION)) {
398  }
399  if (attrs.hasAttribute(SUMO_ATTR_UNTIL)) {
401  }
402  if (attrs.hasAttribute(SUMO_ATTR_STARTED)) {
404  }
405  if (attrs.hasAttribute(SUMO_ATTR_ENDED)) {
407  }
408  if (attrs.hasAttribute(SUMO_ATTR_EXTENSION)) {
410  }
411  if (attrs.hasAttribute(SUMO_ATTR_ENDPOS)) {
412  stop.parametersSet |= STOP_END_SET;
413  }
414  if (attrs.hasAttribute(SUMO_ATTR_STARTPOS)) {
416  }
419  }
420  if (attrs.hasAttribute(SUMO_ATTR_TRIGGERED)) {
422  }
423  // legacy attribute
426  }
427  if (attrs.hasAttribute(SUMO_ATTR_PARKING)) {
429  }
430  if (attrs.hasAttribute(SUMO_ATTR_EXPECTED)) {
432  }
433  if (attrs.hasAttribute(SUMO_ATTR_PERMITTED)) {
435  }
438  }
439  if (attrs.hasAttribute(SUMO_ATTR_TRIP_ID)) {
441  }
442  if (attrs.hasAttribute(SUMO_ATTR_SPLIT)) {
444  }
445  if (attrs.hasAttribute(SUMO_ATTR_JOIN)) {
447  }
448  if (attrs.hasAttribute(SUMO_ATTR_LINE)) {
450  }
451  if (attrs.hasAttribute(SUMO_ATTR_SPEED)) {
453  }
454  if (attrs.hasAttribute(SUMO_ATTR_ONDEMAND)) {
456  }
457  if (attrs.hasAttribute(SUMO_ATTR_JUMP)) {
459  }
460  bool ok = true;
461  stop.busstop = attrs.getOpt<std::string>(SUMO_ATTR_BUS_STOP, nullptr, ok, "");
462  stop.busstop = attrs.getOpt<std::string>(SUMO_ATTR_TRAIN_STOP, nullptr, ok, stop.busstop);
463  stop.chargingStation = attrs.getOpt<std::string>(SUMO_ATTR_CHARGING_STATION, nullptr, ok, "");
464  stop.overheadWireSegment = attrs.getOpt<std::string>(SUMO_ATTR_OVERHEAD_WIRE_SEGMENT, nullptr, ok, "");
465  stop.containerstop = attrs.getOpt<std::string>(SUMO_ATTR_CONTAINER_STOP, nullptr, ok, "");
466  stop.parkingarea = attrs.getOpt<std::string>(SUMO_ATTR_PARKING_AREA, nullptr, ok, "");
467  if (stop.busstop != "") {
468  errorSuffix = " at '" + stop.busstop + "'" + errorSuffix;
469  } else if (stop.chargingStation != "") {
470  errorSuffix = " at '" + stop.chargingStation + "'" + errorSuffix;
471  } else if (stop.overheadWireSegment != "") {
472  errorSuffix = " at '" + stop.overheadWireSegment + "'" + errorSuffix;
473  } else if (stop.containerstop != "") {
474  errorSuffix = " at '" + stop.containerstop + "'" + errorSuffix;
475  } else if (stop.parkingarea != "") {
476  errorSuffix = " at '" + stop.parkingarea + "'" + errorSuffix;
477  } else if (attrs.hasAttribute(SUMO_ATTR_LANE)) {
478  errorSuffix = " on lane '" + attrs.get<std::string>(SUMO_ATTR_LANE, nullptr, ok) + "'" + errorSuffix;
479  } else if (attrs.hasAttribute(SUMO_ATTR_EDGE)) {
480  errorSuffix = " on edge '" + attrs.get<std::string>(SUMO_ATTR_EDGE, nullptr, ok) + "'" + errorSuffix;
481  } else {
482  errorSuffix = " at undefined location" + errorSuffix;
483  }
484  // speed for counting as stopped
485  stop.speed = attrs.getOpt<double>(SUMO_ATTR_SPEED, nullptr, ok, 0);
486  if (stop.speed < 0) {
487  errorOutput->inform(TLF("Speed cannot be negative for stop%.", errorSuffix));
488  return false;
489  }
490 
491  // get the standing duration
492  bool expectTrigger = !attrs.hasAttribute(SUMO_ATTR_DURATION) && !attrs.hasAttribute(SUMO_ATTR_UNTIL) && !attrs.hasAttribute(SUMO_ATTR_SPEED);
493  std::vector<std::string> triggers = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_TRIGGERED, nullptr, ok);
494  // legacy
495  if (attrs.getOpt<bool>(SUMO_ATTR_CONTAINER_TRIGGERED, nullptr, ok, false)) {
496  triggers.push_back(toString(SUMO_TAG_CONTAINER));
497  }
498  SUMOVehicleParameter::parseStopTriggers(triggers, expectTrigger, stop);
499  stop.arrival = attrs.getOptSUMOTimeReporting(SUMO_ATTR_ARRIVAL, nullptr, ok, -1);
500  stop.duration = attrs.getOptSUMOTimeReporting(SUMO_ATTR_DURATION, nullptr, ok, -1);
501  stop.until = attrs.getOptSUMOTimeReporting(SUMO_ATTR_UNTIL, nullptr, ok, -1);
502  if (!expectTrigger && (!ok || (stop.duration < 0 && stop.until < 0 && stop.speed == 0))) {
503  errorOutput->inform(TLF("Invalid duration or end time is given for a stop%.", errorSuffix));
504  return false;
505  }
506  if (triggers.size() > 0 && stop.speed > 0) {
507  errorOutput->inform(TLF("Triggers and waypoints cannot be combined%.", errorSuffix));
508  return false;
509  }
510  stop.extension = attrs.getOptSUMOTimeReporting(SUMO_ATTR_EXTENSION, nullptr, ok, -1);
511  const bool defaultParking = (stop.triggered || stop.containerTriggered || stop.parkingarea != "");
512  stop.parking = attrs.getOpt<ParkingType>(SUMO_ATTR_PARKING, nullptr, ok, defaultParking ? ParkingType::OFFROAD : ParkingType::ONROAD);
513  if ((stop.parkingarea != "") && (stop.parking == ParkingType::ONROAD)) {
514  WRITE_WARNINGF(TL("Stop at parkingArea overrides attribute 'parking' for stop%."), errorSuffix);
516  }
517 
518  // expected persons
519  const std::vector<std::string>& expected = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EXPECTED, nullptr, ok);
520  stop.awaitedPersons.insert(expected.begin(), expected.end());
521  if (stop.awaitedPersons.size() > 0) {
522  stop.triggered = true;
523  if ((stop.parametersSet & STOP_PARKING_SET) == 0) {
525  }
526  }
527 
528  // permitted transportables
529  const std::vector<std::string>& permitted = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_PERMITTED, nullptr, ok);
530  stop.permitted.insert(permitted.begin(), permitted.end());
531 
532  // expected containers
533  const std::vector<std::string>& expectedContainers = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EXPECTED_CONTAINERS, nullptr, ok);
534  stop.awaitedContainers.insert(expectedContainers.begin(), expectedContainers.end());
535  if (stop.awaitedContainers.size() > 0) {
536  stop.containerTriggered = true;
537  if ((stop.parametersSet & STOP_PARKING_SET) == 0) {
539  }
540  }
541  // public transport trip id
542  stop.tripId = attrs.getOpt<std::string>(SUMO_ATTR_TRIP_ID, nullptr, ok, "");
543  stop.split = attrs.getOpt<std::string>(SUMO_ATTR_SPLIT, nullptr, ok, "");
544  stop.join = attrs.getOpt<std::string>(SUMO_ATTR_JOIN, nullptr, ok, "");
545  stop.line = attrs.getOpt<std::string>(SUMO_ATTR_LINE, nullptr, ok, "");
546 
547  const std::string idx = attrs.getOpt<std::string>(SUMO_ATTR_INDEX, nullptr, ok, "end");
548  if (idx == "end") {
549  stop.index = STOP_INDEX_END;
550  } else if (idx == "fit") {
551  stop.index = STOP_INDEX_FIT;
552  } else {
553  stop.index = attrs.get<int>(SUMO_ATTR_INDEX, nullptr, ok);
554  if (!ok || stop.index < 0) {
555  errorOutput->inform(TLF("Invalid 'index' for stop%.", errorSuffix));
556  return false;
557  }
558  }
559  stop.started = attrs.getOptSUMOTimeReporting(SUMO_ATTR_STARTED, nullptr, ok, -1);
560  stop.ended = attrs.getOptSUMOTimeReporting(SUMO_ATTR_ENDED, nullptr, ok, -1);
561  stop.posLat = attrs.getOpt<double>(SUMO_ATTR_POSITION_LAT, nullptr, ok, INVALID_DOUBLE);
562  stop.actType = attrs.getOpt<std::string>(SUMO_ATTR_ACTTYPE, nullptr, ok, "");
563  stop.onDemand = attrs.getOpt<bool>(SUMO_ATTR_ONDEMAND, nullptr, ok, false);
564  stop.jump = attrs.getOptSUMOTimeReporting(SUMO_ATTR_JUMP, nullptr, ok, -1);
565  stop.collision = attrs.getOpt<bool>(SUMO_ATTR_COLLISION, nullptr, ok, false);
566  return true;
567 }
568 
569 
570 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
#define WRITE_WARNINGF(...)
Definition: MsgHandler.h:296
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:304
#define TL(string)
Definition: MsgHandler.h:315
#define TLF(string,...)
Definition: MsgHandler.h:317
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition: SUMOTime.cpp:46
const int STOP_ARRIVAL_SET
const int STOP_DURATION_SET
const int STOP_INDEX_END
const int STOP_POSLAT_SET
const int STOP_EXPECTED_SET
const int STOP_SPEED_SET
const int STOP_UNTIL_SET
const int STOP_LINE_SET
const int STOP_PARKING_SET
const int STOP_TRIP_ID_SET
const int STOP_PERMITTED_SET
const int STOP_SPLIT_SET
const int STOP_START_SET
const int STOP_JOIN_SET
const int STOP_EXTENSION_SET
const int VEHPARS_FORCE_REROUTE
const int STOP_INDEX_FIT
const int STOP_ENDED_SET
const int STOP_TRIGGER_SET
const int STOP_JUMP_SET
const int STOP_ONDEMAND_SET
const int STOP_END_SET
const int STOP_STARTED_SET
const int STOP_EXPECTED_CONTAINERS_SET
@ GIVEN
The time is given.
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
@ SUMO_TAG_WALK
@ SUMO_TAG_TRANSHIP
@ SUMO_TAG_CONTAINERFLOW
@ SUMO_TAG_STOP
stop for vehicles
@ SUMO_TAG_VEHICLE
description of a vehicle
@ SUMO_TAG_ROUTE_DISTRIBUTION
distribution of a route
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_TRANSPORT
@ SUMO_TAG_CONTAINER
@ SUMO_TAG_ROUTE
begin/end of the description of a route
@ SUMO_TAG_RIDE
@ SUMO_TAG_VTYPE_DISTRIBUTION
distribution of a vehicle type
@ SUMO_TAG_PARAM
parameter associated to a certain key
@ SUMO_TAG_PERSON
@ SUMO_TAG_PERSONTRIP
@ SUMO_TAG_CALIBRATOR
A calibrator placed over edge.
@ SUMO_TAG_PERSONFLOW
@ SUMO_TAG_TRIP
a single trip definition (used by router)
ParkingType
Numbers representing special SUMO-XML-attribute values Information on whether a car is parking on the...
@ SUMO_ATTR_CONTAINER_TRIGGERED
@ SUMO_ATTR_STARTPOS
@ SUMO_ATTR_PARKING
@ SUMO_ATTR_EXTENSION
@ SUMO_ATTR_LANE
@ SUMO_ATTR_COLLISION
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_STARTED
@ SUMO_ATTR_VALUE
@ SUMO_ATTR_CONTAINER_STOP
@ SUMO_ATTR_PARKING_AREA
@ SUMO_ATTR_EDGE
@ SUMO_ATTR_BUS_STOP
@ SUMO_ATTR_TRAIN_STOP
@ SUMO_ATTR_ENDPOS
@ SUMO_ATTR_SPLIT
@ SUMO_ATTR_ACTTYPE
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_POSITION_LAT
@ SUMO_ATTR_EXPECTED
@ SUMO_ATTR_LINE
@ SUMO_ATTR_CHARGING_STATION
@ SUMO_ATTR_OVERHEAD_WIRE_SEGMENT
@ SUMO_ATTR_ENDED
@ SUMO_ATTR_ONDEMAND
@ SUMO_ATTR_INDEX
@ SUMO_ATTR_ARRIVAL
@ SUMO_ATTR_TRIP_ID
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_PERMITTED
@ SUMO_ATTR_JOIN
@ SUMO_ATTR_JUMP
@ SUMO_ATTR_EXPECTED_CONTAINERS
@ SUMO_ATTR_UNTIL
@ SUMO_ATTR_TRIGGERED
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_KEY
#define FALLTHROUGH
Definition: StdDefs.h:35
const double INVALID_DOUBLE
invalid double
Definition: StdDefs.h:64
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
const std::string & getFileName() const
returns the current file name
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:154
A storage for options typed value containers)
Definition: OptionsCont.h:89
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:60
bool parseStop(SUMOVehicleParameter::Stop &stop, const SUMOSAXAttributes &attrs, std::string errorSuffix, MsgHandler *const errorOutput)
parses attributes common to all stops
virtual void openTrip(const SUMOSAXAttributes &attrs)=0
opens a trip for reading
StopPos
enum for stops
void registerLastDepart()
save last depart (only to be used if vehicle is not discarded)
virtual void openFlow(const SUMOSAXAttributes &attrs)=0
opens a flow for reading
virtual void closeContainer()=0
Ends the processing of a container.
SUMOTime myFirstDepart
the first read departure time
virtual void addWalk(const SUMOSAXAttributes &attrs)=0
add a fully specified walk
static bool isStopPosValid(const double startPos, const double endPos, const double laneLength, const double minLength, const bool friendlyPos)
check if start and end position of a stop is valid
SUMOTime myBeginDefault
The default value for flow begins.
SUMORouteHandler(const std::string &file, const std::string &expectedRoot, const bool hardFail)
standard constructor
virtual void openRouteDistribution(const SUMOSAXAttributes &attrs)=0
opens a route distribution for reading
virtual Parameterised * addStop(const SUMOSAXAttributes &attrs)=0
Processing of a stop.
bool myAllowInternalRoutes
whether references to internal routes are allowed in this context
std::string myActiveRouteID
The id of the current route.
virtual void openRoute(const SUMOSAXAttributes &attrs)=0
opens a route for reading
virtual void openVehicleTypeDistribution(const SUMOSAXAttributes &attrs)=0
opens a type distribution for reading
virtual ~SUMORouteHandler()
standard destructor
virtual void closeVehicle()=0
Ends the processing of a vehicle.
virtual void closeFlow()=0
Ends the processing of a flow.
virtual void closePersonFlow()=0
Ends the processing of a person flow.
std::vector< Parameterised * > myParamStack
The stack of currently parsed parameterised objects.
SUMOVehicleParameter * myVehicleParameter
Parameter of the current vehicle, trip, person, container or flow.
virtual void addRide(const SUMOSAXAttributes &attrs)=0
Processing of a ride.
virtual void addTranship(const SUMOSAXAttributes &attrs)=0
Processing of a tranship.
SUMOTime getLastDepart() const
Returns the last loaded depart time.
const bool myHardFail
flag to enable or disable hard fails
std::vector< int > myElementStack
hierarchy of elements being parsed
SUMOVTypeParameter * myCurrentVType
The currently parsed vehicle type.
virtual void addTransport(const SUMOSAXAttributes &attrs)=0
Processing of a transport.
virtual void closeRoute(const bool mayBeDisconnected=false)=0
virtual void closePerson()=0
Ends the processing of a person.
SUMOTime myLastDepart
The insertion time of the vehicle read last.
SUMOTime myEndDefault
The default value for flow ends.
virtual void closeVehicleTypeDistribution()=0
closes (ends) the building of a distribution
static StopPos checkStopPos(double &startPos, double &endPos, const double laneLength, const double minLength, const bool friendlyPos)
check start and end position of a stop
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
void addParam(const SUMOSAXAttributes &attrs)
assign arbitrary vehicle parameters
virtual void closeContainerFlow()=0
Ends the processing of a container flow.
virtual void closeTrip()=0
Ends the processing of a trip.
SUMOTime getFirstDepart() const
returns the first departure time that was ever read
virtual void openRouteFlow(const SUMOSAXAttributes &attrs)=0
opens a route flow for reading
int myInsertStopEdgesAt
where stop edges can be inserted into the current route (-1 means no insertion)
virtual void addTransportable(const SUMOSAXAttributes &attrs, const bool isPerson)
Processing of a person or container.
virtual void addPersonTrip(const SUMOSAXAttributes &attrs)=0
add a routing request for a walking or intermodal person
virtual void myEndElement(int element)
Called when a closing tag occurs.
virtual void closeVType()=0
Ends the processing of a vehicle type.
virtual void closeRouteDistribution()=0
closes (ends) the building of a distribution
virtual bool checkLastDepart()
Checks whether the route file is sorted by departure time if needed.
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
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.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
SUMOTime getSUMOTimeReporting(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
SAX-handler base for SUMO-files.
std::string id
The vehicle type's id.
Definition of vehicle stop (position and duration)
SUMOTime started
the time at which this stop was reached
ParkingType parking
whether the vehicle is removed from the net while stopping
SUMOTime extension
The maximum time extension for boarding / loading.
double speed
the speed at which this stop counts as reached (waypoint mode)
std::string parkingarea
(Optional) parking area if one is assigned to the stop
std::string split
the id of the vehicle (train portion) that splits of upon reaching this stop
std::string line
the new line id of the trip within a cyclical public transport route
double posLat
the lateral offset when stopping
bool onDemand
whether the stop may be skipped
std::string chargingStation
(Optional) charging station if one is assigned to the stop
std::string overheadWireSegment
(Optional) overhead line segment if one is assigned to the stop
std::set< std::string > permitted
IDs of persons or containers that may board/load at this stop.
int parametersSet
Information for the output which parameter were set.
int index
at which position in the stops list
SUMOTime jump
transfer time if there shall be a jump from this stop to the next route edge
std::string join
the id of the vehicle (train portion) to which this vehicle shall be joined
SUMOTime until
The time at which the vehicle may continue its journey.
std::string actType
act Type (only used by Persons) (used by netedit)
bool triggered
whether an arriving person lets the vehicle continue
SUMOTime ended
the time at which this stop was ended
std::set< std::string > awaitedPersons
IDs of persons the vehicle has to wait for until departing.
std::set< std::string > awaitedContainers
IDs of containers the vehicle has to wait for until departing.
std::string busstop
(Optional) bus stop if one is assigned to the stop
std::string tripId
id of the trip within a cyclical public transport route
std::string containerstop
(Optional) container stop if one is assigned to the stop
bool containerTriggered
whether an arriving container lets the vehicle continue
bool collision
Whether this stop was triggered by a collision.
SUMOTime arrival
The (expected) time at which the vehicle reaches the stop.
SUMOTime duration
The stopping duration.
int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
std::string routeid
The vehicle's route id.
std::string id
The vehicle's id.
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
std::string line
The vehicle's line (mainly for public transport)
static void parseStopTriggers(const std::vector< std::string > &triggers, bool expectTrigger, Stop &stop)
parses stop trigger values
static SUMOVTypeParameter * beginVTypeParsing(const SUMOSAXAttributes &attrs, const bool hardFail, const std::string &file)
Starts to parse a vehicle type.
static bool parseCFMParams(SUMOVTypeParameter *into, const SumoXMLTag element, const SUMOSAXAttributes &attrs, const bool nestedCFM)
Parses Car Following Mode params.
static SUMOVehicleParameter * parseVehicleAttributes(int element, const SUMOSAXAttributes &attrs, const bool hardFail, const bool optionalID=false, const bool skipDepart=false, const bool allowInternalRoutes=false)
Parses a vehicle's attributes.
static SUMOVehicleParameter * parseFlowAttributes(SumoXMLTag tag, const SUMOSAXAttributes &attrs, const bool hardFail, const bool needID, const SUMOTime beginDefault, const SUMOTime endDefault, const bool allowInternalRoutes=false)
Parses a flow's attributes.