Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/handlers/RouteHandler.cpp
193678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2026 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
/****************************************************************************/
14
/// @file RouteHandler.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jun 2021
17
///
18
// The XML-Handler for route elements loading
19
/****************************************************************************/
20
#include <config.h>
21
22
#include <utils/common/FileBucket.h>
23
#include <utils/common/MsgHandler.h>
24
#include <utils/common/RGBColor.h>
25
#include <utils/common/SUMOVehicleClass.h>
26
#include <utils/options/OptionsCont.h>
27
#include <utils/shapes/Shape.h>
28
#include <utils/vehicle/SUMOVehicleParserHelper.h>
29
#include <utils/xml/NamespaceIDs.h>
30
#include <utils/xml/SUMOSAXHandler.h>
31
#include <utils/xml/XMLSubSys.h>
32
33
#include "RouteHandler.h"
34
35
36
// ===========================================================================
37
// method definitions
38
// ===========================================================================
39
40
RouteHandler::RouteHandler(FileBucket* fileBucket, const bool hardFail) :
41
CommonHandler(fileBucket),
42
myHardFail(hardFail),
43
myFlowBeginDefault(string2time(OptionsCont::getOptions().getString("begin"))),
44
myFlowEndDefault(string2time(OptionsCont::getOptions().getString("end"))) {
45
}
46
47
48
RouteHandler::~RouteHandler() {}
49
50
51
bool
52
RouteHandler::beginParseAttributes(SumoXMLTag tag, const SUMOSAXAttributes& attrs) {
53
// open SUMOBaseOBject
54
myCommonXMLStructure.openSUMOBaseOBject();
55
// check tag
56
try {
57
switch (tag) {
58
// vTypes
59
case SUMO_TAG_VTYPE:
60
// continue depeding if we're parsing a vType or a reference
61
if ((myCommonXMLStructure.getSumoBaseObjectRoot()->getTag() == SUMO_TAG_VTYPE_DISTRIBUTION) &&
62
attrs.hasAttribute(SUMO_ATTR_REFID)) {
63
parseVTypeRef(attrs);
64
} else {
65
parseVType(attrs);
66
}
67
break;
68
case SUMO_TAG_VTYPE_DISTRIBUTION:
69
parseVTypeDistribution(attrs);
70
break;
71
// routes
72
case SUMO_TAG_ROUTE: {
73
// continue depeding if we're parsing a basic route, an embedded route, or a distribution ref
74
const auto parentTag = myCommonXMLStructure.getSumoBaseObjectRoot()->getTag();
75
// this is temporal, until #16476
76
if (parentTag != SUMO_TAG_ERROR) {
77
if ((parentTag == SUMO_TAG_VEHICLE) || (parentTag == SUMO_TAG_FLOW)) {
78
parseRouteEmbedded(attrs);
79
} else if ((parentTag == SUMO_TAG_ROUTE_DISTRIBUTION) && attrs.hasAttribute(SUMO_ATTR_REFID)) {
80
parseRouteRef(attrs);
81
} else {
82
parseRoute(attrs);
83
}
84
}
85
break;
86
}
87
case SUMO_TAG_ROUTE_DISTRIBUTION:
88
parseRouteDistribution(attrs);
89
break;
90
// vehicles
91
case SUMO_TAG_TRIP:
92
parseTrip(attrs);
93
break;
94
case SUMO_TAG_VEHICLE:
95
parseVehicle(attrs);
96
break;
97
// flows
98
case SUMO_TAG_FLOW:
99
parseFlow(attrs);
100
break;
101
// stop
102
case SUMO_TAG_STOP:
103
parseStop(attrs);
104
break;
105
// persons
106
case SUMO_TAG_PERSON:
107
parsePerson(attrs);
108
break;
109
case SUMO_TAG_PERSONFLOW:
110
parsePersonFlow(attrs);
111
break;
112
// person plans
113
case SUMO_TAG_PERSONTRIP:
114
parsePersonTrip(attrs);
115
break;
116
case SUMO_TAG_RIDE:
117
parseRide(attrs);
118
break;
119
case SUMO_TAG_WALK:
120
parseWalk(attrs);
121
break;
122
// container
123
case SUMO_TAG_CONTAINER:
124
parseContainer(attrs);
125
break;
126
case SUMO_TAG_CONTAINERFLOW:
127
parseContainerFlow(attrs);
128
break;
129
// container plans
130
case SUMO_TAG_TRANSPORT:
131
parseTransport(attrs);
132
break;
133
case SUMO_TAG_TRANSHIP:
134
parseTranship(attrs);
135
break;
136
// parameters
137
case SUMO_TAG_PARAM:
138
parseParameters(attrs);
139
break;
140
// other
141
case SUMO_TAG_INTERVAL: {
142
parseInterval(attrs);
143
break;
144
}
145
default:
146
// get vehicle type Base object
147
const auto vTypeObject = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject();
148
// parse embedded car following model information
149
if (vTypeObject && (vTypeObject->getTag() == SUMO_TAG_VTYPE)) {
150
// nested CFM attributes
151
return parseNestedCFM(tag, attrs, vTypeObject);
152
} else {
153
// tag cannot be parsed in routeHandler
154
myCommonXMLStructure.abortSUMOBaseOBject();
155
return false;
156
}
157
}
158
} catch (InvalidArgument& e) {
159
WRITE_ERROR(e.what());
160
}
161
return true;
162
}
163
164
165
void
166
RouteHandler::endParseAttributes() {
167
// get last inserted object
168
CommonXMLStructure::SumoBaseObject* obj = myCommonXMLStructure.getCurrentSumoBaseObject();
169
// check tag
170
if (obj) {
171
// close SUMOBaseOBject
172
myCommonXMLStructure.closeSUMOBaseOBject();
173
switch (obj->getTag()) {
174
case SUMO_TAG_ROUTE:
175
// special case, because embedded and distribution routes are created within other elements
176
if (obj->getParentSumoBaseObject() == nullptr) {
177
// parse object and all their childrens
178
parseSumoBaseObject(obj);
179
// delete object (and all of their childrens)
180
delete obj;
181
}
182
break;
183
case SUMO_TAG_ROUTE_DISTRIBUTION:
184
// parse object and all their childrens
185
parseSumoBaseObject(obj);
186
// delete object (and all of their childrens)
187
delete obj;
188
break;
189
case SUMO_TAG_VTYPE_DISTRIBUTION:
190
// parse object and all their childrens
191
parseSumoBaseObject(obj);
192
// delete object (and all of their childrens)
193
delete obj;
194
break;
195
case SUMO_TAG_VTYPE:
196
// special case, because embedded and distribution routes are created within other elements
197
if (obj->getParentSumoBaseObject() == nullptr) {
198
// parse object and all their childrens
199
parseSumoBaseObject(obj);
200
// delete object (and all of their childrens)
201
delete obj;
202
}
203
break;
204
case SUMO_TAG_TRIP:
205
case SUMO_TAG_VEHICLE:
206
case SUMO_TAG_FLOW:
207
case SUMO_TAG_PERSON:
208
case SUMO_TAG_PERSONFLOW:
209
case SUMO_TAG_CONTAINER:
210
case SUMO_TAG_CONTAINERFLOW:
211
// parse object and all their childrens
212
parseSumoBaseObject(obj);
213
// delete object (and all of their childrens)
214
delete obj;
215
break;
216
default:
217
break;
218
}
219
}
220
}
221
222
223
void
224
RouteHandler::parseSumoBaseObject(CommonXMLStructure::SumoBaseObject* obj) {
225
// check if loading was aborted
226
if (!myAbortLoading) {
227
// switch tag
228
switch (obj->getTag()) {
229
// vTypes
230
case SUMO_TAG_VTYPE:
231
// check if parse vType or Ref
232
if (obj->hasStringAttribute(SUMO_ATTR_REFID)) {
233
if (buildVTypeRef(obj,
234
obj->getStringAttribute(SUMO_ATTR_REFID),
235
obj->getDoubleAttribute(SUMO_ATTR_PROB))) {
236
obj->markAsCreated();
237
}
238
} else {
239
if (buildVType(obj,
240
obj->getVehicleTypeParameter())) {
241
obj->markAsCreated();
242
}
243
}
244
break;
245
case SUMO_TAG_VTYPE_DISTRIBUTION:
246
if (buildVTypeDistribution(obj,
247
obj->getStringAttribute(SUMO_ATTR_ID),
248
obj->getIntAttribute(SUMO_ATTR_DETERMINISTIC))) {
249
obj->markAsCreated();
250
}
251
break;
252
// route
253
case SUMO_TAG_ROUTE:
254
// embedded routes are created in build<Vehicle/Flow>EmbeddedRoute
255
if (obj->hasStringAttribute(SUMO_ATTR_REFID)) {
256
if (buildRouteRef(obj,
257
obj->getStringAttribute(SUMO_ATTR_REFID),
258
obj->getDoubleAttribute(SUMO_ATTR_PROB))) {
259
obj->markAsCreated();
260
}
261
} else if (obj->hasStringAttribute(SUMO_ATTR_ID)) {
262
if (buildRoute(obj,
263
obj->getStringAttribute(SUMO_ATTR_ID),
264
obj->getVClass(),
265
obj->getStringListAttribute(SUMO_ATTR_EDGES),
266
obj->getColorAttribute(SUMO_ATTR_COLOR),
267
obj->getIntAttribute(SUMO_ATTR_REPEAT),
268
obj->getTimeAttribute(SUMO_ATTR_CYCLETIME),
269
obj->getDoubleAttribute(SUMO_ATTR_PROB),
270
obj->getParameters())) {
271
obj->markAsCreated();
272
}
273
}
274
break;
275
case SUMO_TAG_ROUTE_DISTRIBUTION:
276
if (buildRouteDistribution(obj,
277
obj->getStringAttribute(SUMO_ATTR_ID))) {
278
obj->markAsCreated();
279
}
280
break;
281
// vehicles
282
case SUMO_TAG_TRIP:
283
if (checkVehicleParents(obj)) {
284
if (isOverFromToEdges(obj)) {
285
// build trip with from-to edges
286
if (buildTrip(obj,
287
obj->getVehicleParameter(),
288
obj->hasStringAttribute(SUMO_ATTR_FROM) ? obj->getStringAttribute(SUMO_ATTR_FROM) : "",
289
obj->hasStringAttribute(SUMO_ATTR_TO) ? obj->getStringAttribute(SUMO_ATTR_TO) : "")) {
290
obj->markAsCreated();
291
}
292
} else if (isOverFromToJunctions(obj)) {
293
// build trip with from-to junctions
294
if (buildTripJunctions(obj,
295
obj->getVehicleParameter(),
296
obj->getStringAttribute(SUMO_ATTR_FROM_JUNCTION),
297
obj->getStringAttribute(SUMO_ATTR_TO_JUNCTION))) {
298
obj->markAsCreated();
299
}
300
} else if (isOverFromToTAZs(obj)) {
301
// build trip with from-to TAZs
302
if (buildTripTAZs(obj,
303
obj->getVehicleParameter(),
304
obj->getStringAttribute(SUMO_ATTR_FROM_TAZ),
305
obj->getStringAttribute(SUMO_ATTR_TO_TAZ))) {
306
obj->markAsCreated();
307
}
308
}
309
}
310
break;
311
case SUMO_TAG_VEHICLE:
312
if (checkVehicleParents(obj)) {
313
if (obj->hasStringAttribute(SUMO_ATTR_ROUTE)) {
314
// build vehicle over route
315
if (buildVehicleOverRoute(obj,
316
obj->getVehicleParameter())) {
317
obj->markAsCreated();
318
}
319
} else {
320
const auto embeddedRoute = getEmbeddedRoute(obj);
321
if (embeddedRoute) {
322
// build vehicle with embedded route
323
if (buildVehicleEmbeddedRoute(obj,
324
obj->getVehicleParameter(),
325
embeddedRoute->getStringListAttribute(SUMO_ATTR_EDGES),
326
embeddedRoute->getColorAttribute(SUMO_ATTR_COLOR),
327
embeddedRoute->getIntAttribute(SUMO_ATTR_REPEAT),
328
embeddedRoute->getTimeAttribute(SUMO_ATTR_CYCLETIME),
329
embeddedRoute->getParameters())) {
330
obj->markAsCreated();
331
}
332
}
333
}
334
}
335
break;
336
// flows
337
case SUMO_TAG_FLOW:
338
if (checkVehicleParents(obj)) {
339
if (obj->hasStringAttribute(SUMO_ATTR_ROUTE)) {
340
// build flow over route
341
if (buildFlowOverRoute(obj,
342
obj->getVehicleParameter())) {
343
obj->markAsCreated();
344
}
345
} else if (isOverFromToEdges(obj)) {
346
// build flow with from-to edges
347
if (buildFlow(obj,
348
obj->getVehicleParameter(),
349
obj->getStringAttribute(SUMO_ATTR_FROM),
350
obj->getStringAttribute(SUMO_ATTR_TO))) {
351
obj->markAsCreated();
352
}
353
} else if (isOverFromToJunctions(obj)) {
354
// build flow with from-to junctions
355
if (buildFlowJunctions(obj,
356
obj->getVehicleParameter(),
357
obj->getStringAttribute(SUMO_ATTR_FROM_JUNCTION),
358
obj->getStringAttribute(SUMO_ATTR_TO_JUNCTION))) {
359
obj->markAsCreated();
360
}
361
} else if (isOverFromToTAZs(obj)) {
362
// build flow with from-to TAZs
363
if (buildFlowTAZs(obj,
364
obj->getVehicleParameter(),
365
obj->getStringAttribute(SUMO_ATTR_FROM_TAZ),
366
obj->getStringAttribute(SUMO_ATTR_TO_TAZ))) {
367
obj->markAsCreated();
368
}
369
370
} else {
371
const auto embeddedRoute = getEmbeddedRoute(obj);
372
if (embeddedRoute) {
373
// build flow with embedded route
374
if (buildFlowEmbeddedRoute(obj,
375
obj->getVehicleParameter(),
376
embeddedRoute->getStringListAttribute(SUMO_ATTR_EDGES),
377
embeddedRoute->getColorAttribute(SUMO_ATTR_COLOR),
378
embeddedRoute->getIntAttribute(SUMO_ATTR_REPEAT),
379
embeddedRoute->getTimeAttribute(SUMO_ATTR_CYCLETIME),
380
embeddedRoute->getParameters())) {
381
obj->markAsCreated();
382
}
383
}
384
}
385
}
386
break;
387
// persons
388
case SUMO_TAG_PERSON:
389
if (buildPerson(obj,
390
obj->getVehicleParameter())) {
391
obj->markAsCreated();
392
}
393
break;
394
case SUMO_TAG_PERSONFLOW:
395
if (buildPersonFlow(obj,
396
obj->getVehicleParameter())) {
397
obj->markAsCreated();
398
}
399
break;
400
// person plans
401
case SUMO_TAG_PERSONTRIP:
402
if (checkPersonPlanParents(obj)) {
403
if (buildPersonTrip(obj,
404
obj->getPlanParameters(),
405
obj->getDoubleAttribute(SUMO_ATTR_ARRIVALPOS),
406
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
407
obj->getStringListAttribute(SUMO_ATTR_MODES),
408
obj->getStringListAttribute(SUMO_ATTR_LINES),
409
obj->getDoubleAttribute(SUMO_ATTR_WALKFACTOR),
410
obj->getStringAttribute(SUMO_ATTR_GROUP))) {
411
obj->markAsCreated();
412
}
413
}
414
break;
415
case SUMO_TAG_RIDE:
416
if (checkPersonPlanParents(obj)) {
417
if (buildRide(obj,
418
obj->getPlanParameters(),
419
obj->getDoubleAttribute(SUMO_ATTR_ARRIVALPOS),
420
obj->getStringListAttribute(SUMO_ATTR_LINES),
421
obj->getStringAttribute(SUMO_ATTR_GROUP))) {
422
obj->markAsCreated();
423
}
424
}
425
break;
426
case SUMO_TAG_WALK:
427
if (checkPersonPlanParents(obj)) {
428
if (buildWalk(obj,
429
obj->getPlanParameters(),
430
obj->getDoubleAttribute(SUMO_ATTR_ARRIVALPOS),
431
obj->getDoubleAttribute(SUMO_ATTR_SPEED),
432
obj->getTimeAttribute(SUMO_ATTR_DURATION))) {
433
obj->markAsCreated();
434
}
435
}
436
break;
437
// container
438
case SUMO_TAG_CONTAINER:
439
if (buildContainer(obj,
440
obj->getVehicleParameter())) {
441
obj->markAsCreated();
442
}
443
break;
444
case SUMO_TAG_CONTAINERFLOW:
445
if (buildContainerFlow(obj,
446
obj->getVehicleParameter())) {
447
obj->markAsCreated();
448
}
449
break;
450
// container plans
451
case SUMO_TAG_TRANSPORT:
452
if (checkContainerPlanParents(obj)) {
453
if (buildTransport(obj,
454
obj->getPlanParameters(),
455
obj->getDoubleAttribute(SUMO_ATTR_ARRIVALPOS),
456
obj->getStringListAttribute(SUMO_ATTR_LINES),
457
obj->getStringAttribute(SUMO_ATTR_GROUP))) {
458
obj->markAsCreated();
459
}
460
}
461
break;
462
case SUMO_TAG_TRANSHIP:
463
if (checkContainerPlanParents(obj)) {
464
if (buildTranship(obj,
465
obj->getPlanParameters(),
466
obj->getDoubleAttribute(SUMO_ATTR_ARRIVALPOS),
467
obj->getDoubleAttribute(SUMO_ATTR_DEPARTPOS),
468
obj->getDoubleAttribute(SUMO_ATTR_SPEED),
469
obj->getTimeAttribute(SUMO_ATTR_DURATION))) {
470
obj->markAsCreated();
471
}
472
}
473
break;
474
// stops
475
case SUMO_TAG_STOP:
476
if (checkStopParents(obj)) {
477
if (buildStop(obj,
478
obj->getPlanParameters(),
479
obj->getStopParameter())) {
480
obj->markAsCreated();
481
}
482
}
483
break;
484
default:
485
break;
486
}
487
// now iterate over childrens
488
for (const auto& child : obj->getSumoBaseObjectChildren()) {
489
// call this function recursively
490
parseSumoBaseObject(child);
491
}
492
}
493
}
494
495
496
void
497
RouteHandler::parseVType(const SUMOSAXAttributes& attrs) {
498
// parse vehicleType
499
SUMOVTypeParameter* vehicleTypeParameter = SUMOVehicleParserHelper::beginVTypeParsing(attrs, myHardFail, myFileBucket->getFilename());
500
if (vehicleTypeParameter) {
501
// set tag
502
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VTYPE);
503
// add all attributes
504
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleTypeParameter(vehicleTypeParameter);
505
// delete vehicleType parameter (because in XMLStructure we have a copy)
506
delete vehicleTypeParameter;
507
} else {
508
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
509
}
510
}
511
512
513
void
514
RouteHandler::parseVTypeRef(const SUMOSAXAttributes& attrs) {
515
// declare Ok Flag
516
bool parsedOk = true;
517
// special case for ID
518
const std::string refId = attrs.get<std::string>(SUMO_ATTR_REFID, "", parsedOk);
519
const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, refId.c_str(), parsedOk, INVALID_DOUBLE);
520
if (parsedOk) {
521
// set tag
522
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VTYPE);
523
// add all attributes
524
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_REFID, refId);
525
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
526
} else {
527
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
528
}
529
}
530
531
532
void
533
RouteHandler::parseVTypeDistribution(const SUMOSAXAttributes& attrs) {
534
// declare Ok Flag
535
bool parsedOk = true;
536
// needed attributes
537
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
538
// optional attributes
539
const int deterministic = attrs.getOpt<int>(SUMO_ATTR_DETERMINISTIC, id.c_str(), parsedOk, -1);
540
std::vector<std::string> vTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk);
541
std::vector<double> probabilities = attrs.getOpt<std::vector<double> >(SUMO_ATTR_PROBS, id.c_str(), parsedOk);
542
// adjust sizes and probabilities
543
adjustTypesAndProbabilities(vTypes, probabilities);
544
// continue if all was parsed ok
545
if (parsedOk) {
546
// set tag
547
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VTYPE_DISTRIBUTION);
548
// add all attributes
549
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
550
myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_DETERMINISTIC, deterministic);
551
// add references
552
for (int i = 0; i < (int)vTypes.size(); i++) {
553
// open SUMOBaseOBject
554
myCommonXMLStructure.openSUMOBaseOBject();
555
// set tag
556
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VTYPE);
557
// add all attributes
558
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_REFID, vTypes.at(i));
559
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probabilities.at(i));
560
// close SUMOBaseOBject
561
myCommonXMLStructure.closeSUMOBaseOBject();
562
}
563
} else {
564
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
565
}
566
}
567
568
569
void
570
RouteHandler::parseRoute(const SUMOSAXAttributes& attrs) {
571
// declare Ok Flag
572
bool parsedOk = true;
573
// needed attributes
574
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
575
const std::vector<std::string> edges = attrs.get<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk);
576
// optional attributes
577
SUMOVehicleClass vClass = SUMOVehicleParserHelper::parseVehicleClass(attrs, id);
578
const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::INVISIBLE);
579
const int repeat = attrs.getOpt<int>(SUMO_ATTR_REPEAT, id.c_str(), parsedOk, 0);
580
const SUMOTime cycleTime = attrs.getOptSUMOTimeReporting(SUMO_ATTR_CYCLETIME, id.c_str(), parsedOk, 0);
581
const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, id.c_str(), parsedOk, 1.0);
582
// check attributes
583
if (!checkNegative(SUMO_TAG_ROUTE, id, SUMO_ATTR_CYCLETIME, cycleTime, true)) {
584
parsedOk = false;
585
}
586
if (!checkNegative(SUMO_TAG_ROUTE, id, SUMO_ATTR_REPEAT, repeat, true)) {
587
parsedOk = false;
588
}
589
if (parsedOk) {
590
// set tag
591
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE);
592
// add all attributes
593
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
594
myCommonXMLStructure.getCurrentSumoBaseObject()->setVClass(vClass);
595
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
596
myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
597
myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_REPEAT, repeat);
598
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_CYCLETIME, cycleTime);
599
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
600
} else {
601
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
602
}
603
}
604
605
606
void
607
RouteHandler::parseRouteRef(const SUMOSAXAttributes& attrs) {
608
// declare Ok Flag
609
bool parsedOk = true;
610
// special case for ID
611
const std::string refId = attrs.get<std::string>(SUMO_ATTR_REFID, "", parsedOk);
612
const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, refId.c_str(), parsedOk, INVALID_DOUBLE);
613
if (parsedOk) {
614
// set tag
615
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE);
616
// add all attributes
617
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_REFID, refId);
618
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
619
} else {
620
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
621
}
622
}
623
624
625
void
626
RouteHandler::parseRouteEmbedded(const SUMOSAXAttributes& attrs) {
627
// first check if this is an embedded route
628
if (attrs.hasAttribute(SUMO_ATTR_ID)) {
629
writeError(TL("an embedded route cannot have their own ID"));
630
} else {
631
// declare Ok Flag
632
bool parsedOk = true;
633
// special case for ID
634
const std::string vehicleID = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject()->getVehicleParameter().id;
635
// needed attributes
636
const std::vector<std::string> edges = attrs.get<std::vector<std::string> >(SUMO_ATTR_EDGES, vehicleID.c_str(), parsedOk);
637
// optional attributes
638
SUMOVehicleClass vClass = SUMOVehicleParserHelper::parseVehicleClass(attrs, vehicleID);
639
const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, vehicleID.c_str(), parsedOk, RGBColor::INVISIBLE);
640
const int repeat = attrs.getOpt<int>(SUMO_ATTR_REPEAT, vehicleID.c_str(), parsedOk, 0);
641
const SUMOTime cycleTime = attrs.getOptSUMOTimeReporting(SUMO_ATTR_CYCLETIME, vehicleID.c_str(), parsedOk, 0);
642
// check attributes
643
if (!checkNegative(SUMO_TAG_ROUTE, vehicleID, SUMO_ATTR_CYCLETIME, cycleTime, true)) {
644
parsedOk = false;
645
}
646
if (!checkNegative(SUMO_TAG_ROUTE, vehicleID, SUMO_ATTR_REPEAT, repeat, true)) {
647
parsedOk = false;
648
}
649
if (parsedOk) {
650
// set tag
651
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE);
652
// add all attributes
653
myCommonXMLStructure.getCurrentSumoBaseObject()->setVClass(vClass);
654
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
655
myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
656
myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_REPEAT, repeat);
657
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_CYCLETIME, cycleTime);
658
} else {
659
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
660
}
661
}
662
}
663
664
665
void
666
RouteHandler::parseRouteDistribution(const SUMOSAXAttributes& attrs) {
667
// declare Ok Flag
668
bool parsedOk = true;
669
// needed attributes
670
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
671
// optional attributes
672
std::vector<std::string> routes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_ROUTES, id.c_str(), parsedOk);
673
std::vector<double> probabilities = attrs.getOpt<std::vector<double> >(SUMO_ATTR_PROBS, id.c_str(), parsedOk);
674
// adjust sizes and probabilities
675
adjustTypesAndProbabilities(routes, probabilities);
676
// continue if all was parsed ok
677
if (parsedOk) {
678
// set tag
679
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE_DISTRIBUTION);
680
// add all attributes
681
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
682
// add references
683
for (int i = 0; i < (int)routes.size(); i++) {
684
// open SUMOBaseOBject
685
myCommonXMLStructure.openSUMOBaseOBject();
686
// set tag
687
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE);
688
// add all attributes
689
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_REFID, routes.at(i));
690
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probabilities.at(i));
691
// close SUMOBaseOBject
692
myCommonXMLStructure.closeSUMOBaseOBject();
693
}
694
} else {
695
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
696
}
697
}
698
699
700
void
701
RouteHandler::parseTrip(const SUMOSAXAttributes& attrs) {
702
// declare Ok Flag
703
bool parsedOk = true;
704
// parse vehicle
705
SUMOVehicleParameter* tripParameter = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_TRIP, attrs, myHardFail);
706
if (tripParameter) {
707
// check from/to edge/junction
708
if ((attrs.hasAttribute(SUMO_ATTR_FROM) + attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION) + attrs.hasAttribute(SUMO_ATTR_FROM_TAZ)) > 1) {
709
writeError(TL("Attributes 'from', 'fromJunction' and 'fromTaz' cannot be defined together"));
710
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
711
} else if ((attrs.hasAttribute(SUMO_ATTR_TO) + attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION) + attrs.hasAttribute(SUMO_ATTR_TO_TAZ)) > 1) {
712
writeError(TL("Attributes 'to', 'toJunction' and 'toTaz' cannot be defined together"));
713
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
714
} else if (attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION) && attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION)) {
715
// from-to attributes
716
const std::string fromJunction = attrs.get<std::string>(SUMO_ATTR_FROM_JUNCTION, tripParameter->id.c_str(), parsedOk);
717
const std::string toJunction = attrs.get<std::string>(SUMO_ATTR_TO_JUNCTION, tripParameter->id.c_str(), parsedOk);
718
if (parsedOk) {
719
// set tag
720
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRIP);
721
// set vehicle parameters
722
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(tripParameter);
723
// add other attributes
724
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, fromJunction);
725
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO_JUNCTION, toJunction);
726
} else {
727
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
728
}
729
} else if (attrs.hasAttribute(SUMO_ATTR_FROM_TAZ) && attrs.hasAttribute(SUMO_ATTR_TO_TAZ)) {
730
// from-to attributes
731
const std::string fromJunction = attrs.get<std::string>(SUMO_ATTR_FROM_TAZ, tripParameter->id.c_str(), parsedOk);
732
const std::string toJunction = attrs.get<std::string>(SUMO_ATTR_TO_TAZ, tripParameter->id.c_str(), parsedOk);
733
if (parsedOk) {
734
// set tag
735
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRIP);
736
// set vehicle parameters
737
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(tripParameter);
738
// add other attributes
739
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM_TAZ, fromJunction);
740
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO_TAZ, toJunction);
741
} else {
742
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
743
}
744
} else {
745
// from-to attributes
746
const std::string from = attrs.getOpt<std::string>(SUMO_ATTR_FROM, tripParameter->id.c_str(), parsedOk, "");
747
const std::string to = attrs.getOpt<std::string>(SUMO_ATTR_TO, tripParameter->id.c_str(), parsedOk, "");
748
// optional attributes
749
const std::vector<std::string> via = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VIA, tripParameter->id.c_str(), parsedOk);
750
if (parsedOk) {
751
// set tag
752
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRIP);
753
// set vehicle parameters
754
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(tripParameter);
755
// add other attributes
756
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM, from);
757
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO, to);
758
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VIA, via);
759
} else {
760
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
761
}
762
}
763
// delete trip parameter (because in XMLStructure we have a copy)
764
delete tripParameter;
765
} else {
766
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
767
}
768
}
769
770
771
void
772
RouteHandler::parseVehicle(const SUMOSAXAttributes& attrs) {
773
// first parse vehicle
774
SUMOVehicleParameter* vehicleParameter = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_VEHICLE, attrs, myHardFail);
775
if (vehicleParameter) {
776
// set tag
777
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VEHICLE);
778
// set vehicle parameters
779
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(vehicleParameter);
780
// delete vehicle parameter (because in XMLStructure we have a copy)
781
delete vehicleParameter;
782
} else {
783
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
784
}
785
}
786
787
788
void
789
RouteHandler::parseFlow(const SUMOSAXAttributes& attrs) {
790
// declare Ok Flag
791
bool parsedOk = true;
792
// first parse flow
793
SUMOVehicleParameter* flowParameter = SUMOVehicleParserHelper::parseFlowAttributes(SUMO_TAG_FLOW, attrs, myHardFail, true, myFlowBeginDefault, myFlowEndDefault);
794
if (flowParameter) {
795
// set vehicle parameters
796
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(flowParameter);
797
// check from/to edge/junction
798
if ((attrs.hasAttribute(SUMO_ATTR_FROM) + attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION) + attrs.hasAttribute(SUMO_ATTR_FROM_TAZ)) > 1) {
799
writeError(TL("Attributes 'from', 'fromJunction' and 'fromTaz' cannot be defined together"));
800
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
801
} else if ((attrs.hasAttribute(SUMO_ATTR_TO) + attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION) + attrs.hasAttribute(SUMO_ATTR_TO_TAZ)) > 1) {
802
writeError(TL("Attributes 'to', 'toJunction' and 'toTaz' cannot be defined together"));
803
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
804
} else if (attrs.hasAttribute(SUMO_ATTR_FROM) && attrs.hasAttribute(SUMO_ATTR_TO)) {
805
// from-to attributes
806
const std::string from = attrs.get<std::string>(SUMO_ATTR_FROM, flowParameter->id.c_str(), parsedOk);
807
const std::string to = attrs.get<std::string>(SUMO_ATTR_TO, flowParameter->id.c_str(), parsedOk);
808
// optional attributes
809
const std::vector<std::string> via = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VIA, flowParameter->id.c_str(), parsedOk);
810
if (parsedOk) {
811
// set tag
812
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW);
813
// add other attributes
814
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM, from);
815
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO, to);
816
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VIA, via);
817
} else {
818
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
819
}
820
} else if (attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION) && attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION)) {
821
// from-to attributes
822
const std::string fromJunction = attrs.get<std::string>(SUMO_ATTR_FROM_JUNCTION, flowParameter->id.c_str(), parsedOk);
823
const std::string toJunction = attrs.get<std::string>(SUMO_ATTR_TO_JUNCTION, flowParameter->id.c_str(), parsedOk);
824
if (parsedOk) {
825
// set tag
826
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW);
827
// add other attributes
828
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, fromJunction);
829
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO_JUNCTION, toJunction);
830
} else {
831
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
832
}
833
} else if (attrs.hasAttribute(SUMO_ATTR_FROM_TAZ) && attrs.hasAttribute(SUMO_ATTR_TO_TAZ)) {
834
// from-to attributes
835
const std::string fromJunction = attrs.get<std::string>(SUMO_ATTR_FROM_TAZ, flowParameter->id.c_str(), parsedOk);
836
const std::string toJunction = attrs.get<std::string>(SUMO_ATTR_TO_TAZ, flowParameter->id.c_str(), parsedOk);
837
if (parsedOk) {
838
// set tag
839
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW);
840
// add other attributes
841
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FROM_TAZ, fromJunction);
842
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TO_TAZ, toJunction);
843
} else {
844
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
845
}
846
} else if (attrs.hasAttribute(SUMO_ATTR_ROUTE)) {
847
// from-to attributes
848
const std::string route = attrs.get<std::string>(SUMO_ATTR_ROUTE, flowParameter->id.c_str(), parsedOk);
849
if (parsedOk) {
850
// set tag
851
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW);
852
// add other attributes
853
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ROUTE, route);
854
} else {
855
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
856
}
857
} else {
858
// set tag
859
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW);
860
}
861
// delete flow parameter (because in XMLStructure we have a copy)
862
delete flowParameter;
863
} else {
864
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
865
}
866
}
867
868
869
void
870
RouteHandler::parseStop(const SUMOSAXAttributes& attrs) {
871
// declare Ok Flag
872
bool parsedOk = true;
873
// declare stop
874
SUMOVehicleParameter::Stop stop;
875
// plan parameters
876
const auto planParameters = CommonXMLStructure::PlanParameters(myCommonXMLStructure.getCurrentSumoBaseObject(), attrs, parsedOk);
877
// get parents
878
std::vector<SumoXMLTag> stopParents;
879
stopParents.insert(stopParents.end(), NamespaceIDs::routes.begin(), NamespaceIDs::routes.end());
880
stopParents.insert(stopParents.end(), NamespaceIDs::vehicles.begin(), NamespaceIDs::vehicles.end());
881
stopParents.insert(stopParents.end(), NamespaceIDs::persons.begin(), NamespaceIDs::persons.end());
882
stopParents.insert(stopParents.end(), NamespaceIDs::containers.begin(), NamespaceIDs::containers.end());
883
// check parents
884
checkParsedParent(SUMO_TAG_STOP, stopParents, parsedOk);
885
// parse stop
886
if (parsedOk && parseStopParameters(stop, attrs)) {
887
// set tag
888
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_STOP);
889
// add stop attributes
890
myCommonXMLStructure.getCurrentSumoBaseObject()->setPlanParameters(planParameters);
891
myCommonXMLStructure.getCurrentSumoBaseObject()->setStopParameter(stop);
892
} else {
893
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
894
}
895
}
896
897
898
void
899
RouteHandler::parsePerson(const SUMOSAXAttributes& attrs) {
900
// first parse vehicle
901
SUMOVehicleParameter* personParameter = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_PERSON, attrs, myHardFail);
902
if (personParameter) {
903
// set tag
904
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PERSON);
905
// set vehicle parameter
906
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(personParameter);
907
// delete person parameter (because in XMLStructure we have a copy)
908
delete personParameter;
909
} else {
910
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
911
}
912
}
913
914
915
void
916
RouteHandler::parsePersonFlow(const SUMOSAXAttributes& attrs) {
917
// first parse flow
918
SUMOVehicleParameter* personFlowParameter = SUMOVehicleParserHelper::parseFlowAttributes(SUMO_TAG_PERSONFLOW, attrs, myHardFail, true, myFlowBeginDefault, myFlowEndDefault);
919
if (personFlowParameter) {
920
// set tag
921
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PERSONFLOW);
922
// set vehicle parameter
923
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(personFlowParameter);
924
// delete person flow parameter (because in XMLStructure we have a copy)
925
delete personFlowParameter;
926
} else {
927
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
928
}
929
}
930
931
932
void
933
RouteHandler::parsePersonTrip(const SUMOSAXAttributes& attrs) {
934
// declare Ok Flag
935
bool parsedOk = true;
936
// plan parameters
937
const auto planParameters = CommonXMLStructure::PlanParameters(myCommonXMLStructure.getCurrentSumoBaseObject(), attrs, parsedOk);
938
// optional attributes
939
const std::vector<std::string> via = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VIA, "", parsedOk);
940
const std::vector<std::string> vTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, "", parsedOk);
941
const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, "", parsedOk);
942
std::vector<std::string> modes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_MODES, "", parsedOk);
943
const double departPos = attrs.getOpt<double>(SUMO_ATTR_DEPARTPOS, "", parsedOk, -1);
944
const double arrivalPos = attrs.getOpt<double>(SUMO_ATTR_ARRIVALPOS, "", parsedOk, -1);
945
const double walkFactor = attrs.getOpt<double>(SUMO_ATTR_WALKFACTOR, "", parsedOk, 0);
946
const std::string group = attrs.getOpt<std::string>(SUMO_ATTR_GROUP, "", parsedOk, "");
947
// check modes
948
SVCPermissions dummyModeSet;
949
std::string dummyError;
950
if (!SUMOVehicleParameter::parsePersonModes(toString(modes), toString(SUMO_TAG_PERSONTRIP), "", dummyModeSet, dummyError)) {
951
WRITE_WARNING(dummyError);
952
modes.clear();
953
}
954
// check parents
955
checkParsedParent(SUMO_TAG_PERSONTRIP, NamespaceIDs::persons, parsedOk);
956
if (parsedOk) {
957
// set tag
958
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PERSONTRIP);
959
// add all attributes
960
myCommonXMLStructure.getCurrentSumoBaseObject()->setPlanParameters(planParameters);
961
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vTypes);
962
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_MODES, modes);
963
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
964
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_DEPARTPOS, departPos);
965
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos);
966
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WALKFACTOR, walkFactor);
967
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_GROUP, group);
968
} else {
969
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
970
}
971
}
972
973
974
void
975
RouteHandler::parseWalk(const SUMOSAXAttributes& attrs) {
976
if (attrs.hasAttribute(SUMO_ATTR_SPEED) && attrs.hasAttribute(SUMO_ATTR_DURATION)) {
977
writeError(TL("Speed and duration attributes cannot be defined together in walks"));
978
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
979
} else {
980
// declare Ok Flag
981
bool parsedOk = true;
982
// plan parameters
983
const auto planParameters = CommonXMLStructure::PlanParameters(myCommonXMLStructure.getCurrentSumoBaseObject(), attrs, parsedOk);
984
// optional attributes
985
const double departPos = attrs.getOpt<double>(SUMO_ATTR_DEPARTPOS, "", parsedOk, -1);
986
const double arrivalPos = attrs.getOpt<double>(SUMO_ATTR_ARRIVALPOS, "", parsedOk, -1);
987
const double speed = attrs.getOpt<double>(SUMO_ATTR_SPEED, "", parsedOk, 1.39);
988
const SUMOTime duration = attrs.getOptSUMOTimeReporting(SUMO_ATTR_DURATION, "", parsedOk, 0);
989
// check parents
990
checkParsedParent(SUMO_TAG_WALK, NamespaceIDs::persons, parsedOk);
991
if (parsedOk) {
992
// set tag
993
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_WALK);
994
// add all attributes
995
myCommonXMLStructure.getCurrentSumoBaseObject()->setPlanParameters(planParameters);
996
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_DEPARTPOS, departPos);
997
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos);
998
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SPEED, speed);
999
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_DURATION, duration);
1000
} else {
1001
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1002
}
1003
}
1004
}
1005
1006
1007
void
1008
RouteHandler::parseRide(const SUMOSAXAttributes& attrs) {
1009
// declare Ok Flag
1010
bool parsedOk = true;
1011
// plan parameters
1012
const auto planParameters = CommonXMLStructure::PlanParameters(myCommonXMLStructure.getCurrentSumoBaseObject(), attrs, parsedOk);
1013
// optional attributes
1014
const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, "", parsedOk);
1015
const double arrivalPos = attrs.getOpt<double>(SUMO_ATTR_ARRIVALPOS, "", parsedOk, -1);
1016
const std::string group = attrs.getOpt<std::string>(SUMO_ATTR_GROUP, "", parsedOk, "");
1017
// check parents
1018
checkParsedParent(SUMO_TAG_RIDE, NamespaceIDs::persons, parsedOk);
1019
if (parsedOk) {
1020
// set tag
1021
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_RIDE);
1022
// add all attributes
1023
myCommonXMLStructure.getCurrentSumoBaseObject()->setPlanParameters(planParameters);
1024
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
1025
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos);
1026
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_GROUP, group);
1027
} else {
1028
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1029
}
1030
}
1031
1032
1033
void
1034
RouteHandler::parseContainer(const SUMOSAXAttributes& attrs) {
1035
// first parse container
1036
SUMOVehicleParameter* containerParameter = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_CONTAINER, attrs, myHardFail);
1037
if (containerParameter) {
1038
// set tag
1039
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CONTAINER);
1040
// set vehicle parameter
1041
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(containerParameter);
1042
// delete container parameter (because in XMLStructure we have a copy)
1043
delete containerParameter;
1044
} else {
1045
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1046
}
1047
}
1048
1049
1050
void
1051
RouteHandler::parseContainerFlow(const SUMOSAXAttributes& attrs) {
1052
// first parse flow
1053
SUMOVehicleParameter* containerFlowParameter = SUMOVehicleParserHelper::parseFlowAttributes(SUMO_TAG_CONTAINERFLOW, attrs, myHardFail, true, myFlowBeginDefault, myFlowEndDefault);
1054
if (containerFlowParameter) {
1055
// set tag
1056
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CONTAINERFLOW);
1057
// set vehicle parameter
1058
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(containerFlowParameter);
1059
// delete container flow parameter (because in XMLStructure we have a copy)
1060
delete containerFlowParameter;
1061
} else {
1062
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1063
}
1064
}
1065
1066
1067
void
1068
RouteHandler::parseTransport(const SUMOSAXAttributes& attrs) {
1069
// declare Ok Flag
1070
bool parsedOk = true;
1071
// plan parameters
1072
const auto planParameters = CommonXMLStructure::PlanParameters(myCommonXMLStructure.getCurrentSumoBaseObject(), attrs, parsedOk);
1073
// optional attributes
1074
const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, "", parsedOk);
1075
const double arrivalPos = attrs.getOpt<double>(SUMO_ATTR_ARRIVALPOS, "", parsedOk, -1);
1076
const std::string group = attrs.getOpt<std::string>(SUMO_ATTR_GROUP, "", parsedOk, "");
1077
// check parents
1078
checkParsedParent(SUMO_TAG_TRANSPORT, NamespaceIDs::containers, parsedOk);
1079
if (parsedOk) {
1080
// set tag
1081
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRANSPORT);
1082
// add all attributes
1083
myCommonXMLStructure.getCurrentSumoBaseObject()->setPlanParameters(planParameters);
1084
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
1085
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos);
1086
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_GROUP, group);
1087
} else {
1088
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1089
}
1090
}
1091
1092
1093
void
1094
RouteHandler::parseTranship(const SUMOSAXAttributes& attrs) {
1095
if (attrs.hasAttribute(SUMO_ATTR_SPEED) && attrs.hasAttribute(SUMO_ATTR_DURATION)) {
1096
writeError(TL("Speed and duration attributes cannot be defined together in tranships"));
1097
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1098
} else {
1099
// declare Ok Flag
1100
bool parsedOk = true;
1101
// plan parameters
1102
const auto planParameters = CommonXMLStructure::PlanParameters(myCommonXMLStructure.getCurrentSumoBaseObject(), attrs, parsedOk);
1103
// optional attributes
1104
const double arrivalPos = attrs.getOpt<double>(SUMO_ATTR_ARRIVALPOS, "", parsedOk, -1);
1105
const double departPos = attrs.getOpt<double>(SUMO_ATTR_DEPARTPOS, "", parsedOk, -1);
1106
const double speed = attrs.getOpt<double>(SUMO_ATTR_SPEED, "", parsedOk, 1.39);
1107
const SUMOTime duration = attrs.getOptSUMOTimeReporting(SUMO_ATTR_DURATION, "", parsedOk, 0);
1108
// check parents
1109
checkParsedParent(SUMO_TAG_TRANSHIP, NamespaceIDs::containers, parsedOk);
1110
if (parsedOk) {
1111
// set tag
1112
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRANSHIP);
1113
// add all attributes
1114
myCommonXMLStructure.getCurrentSumoBaseObject()->setPlanParameters(planParameters);
1115
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ARRIVALPOS, arrivalPos);
1116
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_DEPARTPOS, departPos);
1117
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SPEED, speed);
1118
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_DURATION, duration);
1119
} else {
1120
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1121
}
1122
}
1123
}
1124
1125
1126
void
1127
RouteHandler::parseInterval(const SUMOSAXAttributes& attrs) {
1128
// declare Ok Flag
1129
bool parsedOk = true;
1130
// just parse begin and end default
1131
myFlowBeginDefault = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, nullptr, parsedOk);
1132
myFlowEndDefault = attrs.getSUMOTimeReporting(SUMO_ATTR_END, nullptr, parsedOk);
1133
}
1134
1135
1136
bool
1137
RouteHandler::parseNestedCFM(const SumoXMLTag tag, const SUMOSAXAttributes& attrs, CommonXMLStructure::SumoBaseObject* vTypeObject) {
1138
// write warning info
1139
WRITE_WARNINGF(TL("Defining car-following parameters in a nested element is deprecated in vType '%', use attributes instead!"), vTypeObject->getStringAttribute(SUMO_ATTR_ID));
1140
// get vType to modify it
1141
auto vType = vTypeObject->getVehicleTypeParameter();
1142
// parse nested CFM attributes
1143
if (SUMOVehicleParserHelper::parseCFMParams(&vType, tag, attrs, true)) {
1144
vTypeObject->setVehicleTypeParameter(&vType);
1145
return true;
1146
} else if (myHardFail) {
1147
throw ProcessError(TL("Invalid parsing embedded VType"));
1148
} else {
1149
return writeError(TL("Invalid parsing embedded VType"));
1150
}
1151
}
1152
1153
1154
bool
1155
RouteHandler::parseStopParameters(SUMOVehicleParameter::Stop& stop, const SUMOSAXAttributes& attrs) {
1156
// check stop parameters
1157
if (attrs.hasAttribute(SUMO_ATTR_ARRIVAL)) {
1158
stop.parametersSet |= STOP_ARRIVAL_SET;
1159
}
1160
if (attrs.hasAttribute(SUMO_ATTR_DURATION)) {
1161
stop.parametersSet |= STOP_DURATION_SET;
1162
}
1163
if (attrs.hasAttribute(SUMO_ATTR_UNTIL)) {
1164
stop.parametersSet |= STOP_UNTIL_SET;
1165
}
1166
if (attrs.hasAttribute(SUMO_ATTR_STARTED)) {
1167
stop.parametersSet |= STOP_STARTED_SET;
1168
}
1169
if (attrs.hasAttribute(SUMO_ATTR_ENDED)) {
1170
stop.parametersSet |= STOP_ENDED_SET;
1171
}
1172
if (attrs.hasAttribute(SUMO_ATTR_EXTENSION)) {
1173
stop.parametersSet |= STOP_EXTENSION_SET;
1174
}
1175
if (attrs.hasAttribute(SUMO_ATTR_ENDPOS)) {
1176
stop.parametersSet |= STOP_END_SET;
1177
}
1178
if (attrs.hasAttribute(SUMO_ATTR_STARTPOS)) {
1179
stop.parametersSet |= STOP_START_SET;
1180
}
1181
if (attrs.hasAttribute(SUMO_ATTR_POSITION_LAT)) {
1182
stop.parametersSet |= STOP_POSLAT_SET;
1183
}
1184
if (attrs.hasAttribute(SUMO_ATTR_TRIGGERED)) {
1185
stop.parametersSet |= STOP_TRIGGER_SET;
1186
}
1187
// legacy attribute
1188
if (attrs.hasAttribute(SUMO_ATTR_CONTAINER_TRIGGERED)) {
1189
if (attrs.hasAttribute(SUMO_ATTR_SPEED)) {
1190
WRITE_WARNING(TLF("Attributes '%' and '%' cannot be loaded simultaneously. Ignoring '%'", toString(SUMO_ATTR_SPEED), toString(SUMO_ATTR_CONTAINER_TRIGGERED), toString(SUMO_ATTR_CONTAINER_TRIGGERED)));
1191
} else {
1192
stop.parametersSet |= STOP_TRIGGER_SET;
1193
}
1194
}
1195
if (attrs.hasAttribute(SUMO_ATTR_PARKING)) {
1196
stop.parametersSet |= STOP_PARKING_SET;
1197
}
1198
if (attrs.hasAttribute(SUMO_ATTR_EXPECTED)) {
1199
stop.parametersSet |= STOP_EXPECTED_SET;
1200
}
1201
if (attrs.hasAttribute(SUMO_ATTR_PERMITTED)) {
1202
stop.parametersSet |= STOP_PERMITTED_SET;
1203
}
1204
if (attrs.hasAttribute(SUMO_ATTR_EXPECTED_CONTAINERS)) {
1205
stop.parametersSet |= STOP_EXPECTED_CONTAINERS_SET;
1206
}
1207
if (attrs.hasAttribute(SUMO_ATTR_TRIP_ID)) {
1208
stop.parametersSet |= STOP_TRIP_ID_SET;
1209
}
1210
if (attrs.hasAttribute(SUMO_ATTR_SPLIT)) {
1211
stop.parametersSet |= STOP_SPLIT_SET;
1212
}
1213
if (attrs.hasAttribute(SUMO_ATTR_JOIN)) {
1214
stop.parametersSet |= STOP_JOIN_SET;
1215
}
1216
if (attrs.hasAttribute(SUMO_ATTR_LINE)) {
1217
stop.parametersSet |= STOP_LINE_SET;
1218
}
1219
if (attrs.hasAttribute(SUMO_ATTR_SPEED)) {
1220
stop.parametersSet |= STOP_SPEED_SET;
1221
}
1222
if (attrs.hasAttribute(SUMO_ATTR_ONDEMAND)) {
1223
stop.parametersSet |= STOP_ONDEMAND_SET;
1224
}
1225
if (attrs.hasAttribute(SUMO_ATTR_JUMP)) {
1226
stop.parametersSet |= STOP_JUMP_SET;
1227
}
1228
if (attrs.hasAttribute(SUMO_ATTR_JUMP_UNTIL)) {
1229
stop.parametersSet |= STOP_JUMP_UNTIL_SET;
1230
}
1231
// get parameters
1232
bool ok = true;
1233
// edge/lane
1234
stop.edge = attrs.getOpt<std::string>(SUMO_ATTR_EDGE, nullptr, ok, "");
1235
stop.lane = attrs.getOpt<std::string>(SUMO_ATTR_LANE, nullptr, ok, stop.busstop);
1236
// check errors
1237
if (!stop.edge.empty() && !stop.lane.empty()) {
1238
return writeError(TL("A stop must be defined either with an edge or with an lane, not both"));
1239
}
1240
// stopping places
1241
stop.busstop = attrs.getOpt<std::string>(SUMO_ATTR_BUS_STOP, nullptr, ok, "");
1242
if (stop.busstop.empty()) {
1243
stop.busstop = attrs.getOpt<std::string>(SUMO_ATTR_TRAIN_STOP, nullptr, ok, stop.busstop);
1244
}
1245
stop.chargingStation = attrs.getOpt<std::string>(SUMO_ATTR_CHARGING_STATION, nullptr, ok, "");
1246
stop.overheadWireSegment = attrs.getOpt<std::string>(SUMO_ATTR_OVERHEAD_WIRE_SEGMENT, nullptr, ok, "");
1247
stop.containerstop = attrs.getOpt<std::string>(SUMO_ATTR_CONTAINER_STOP, nullptr, ok, "");
1248
stop.parkingarea = attrs.getOpt<std::string>(SUMO_ATTR_PARKING_AREA, nullptr, ok, "");
1249
//check stopping places
1250
const int numStoppingPlaces = !stop.busstop.empty() + !stop.chargingStation.empty() + !stop.overheadWireSegment.empty() +
1251
!stop.containerstop.empty() + !stop.parkingarea.empty();
1252
if (numStoppingPlaces > 1) {
1253
return writeError(TL("A stop must be defined only in a StoppingPlace"));
1254
} else if ((numStoppingPlaces == 0) && stop.edge.empty() && stop.lane.empty()) {
1255
return writeError(TL("A stop must be defined in an edge, a lane, or in a StoppingPlace"));
1256
}
1257
// declare error suffix
1258
std::string errorSuffix;
1259
if (stop.busstop != "") {
1260
errorSuffix = " at '" + stop.busstop + "'" + errorSuffix;
1261
} else if (stop.chargingStation != "") {
1262
errorSuffix = " at '" + stop.chargingStation + "'" + errorSuffix;
1263
} else if (stop.overheadWireSegment != "") {
1264
errorSuffix = " at '" + stop.overheadWireSegment + "'" + errorSuffix;
1265
} else if (stop.containerstop != "") {
1266
errorSuffix = " at '" + stop.containerstop + "'" + errorSuffix;
1267
} else if (stop.parkingarea != "") {
1268
errorSuffix = " at '" + stop.parkingarea + "'" + errorSuffix;
1269
} else if (stop.edge != "") {
1270
errorSuffix = " at '" + stop.edge + "'" + errorSuffix;
1271
} else {
1272
errorSuffix = " on lane '" + stop.lane + "'" + errorSuffix;
1273
}
1274
// speed for counting as stopped
1275
stop.speed = attrs.getOpt<double>(SUMO_ATTR_SPEED, nullptr, ok, 0);
1276
if (stop.speed < 0) {
1277
return writeError("Speed cannot be negative for stop" + errorSuffix);
1278
}
1279
// get the standing duration
1280
bool expectTrigger = !attrs.hasAttribute(SUMO_ATTR_DURATION) && !attrs.hasAttribute(SUMO_ATTR_UNTIL) && !attrs.hasAttribute(SUMO_ATTR_SPEED);
1281
std::vector<std::string> triggers = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_TRIGGERED, nullptr, ok);
1282
// legacy
1283
if (attrs.getOpt<bool>(SUMO_ATTR_CONTAINER_TRIGGERED, nullptr, ok, false) && !attrs.hasAttribute(SUMO_ATTR_SPEED)) {
1284
triggers.push_back(toString(SUMO_TAG_CONTAINER));
1285
};
1286
SUMOVehicleParameter::parseStopTriggers(triggers, expectTrigger, stop);
1287
stop.startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, nullptr, ok, 0);
1288
stop.endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, nullptr, ok, 0);
1289
stop.friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, nullptr, ok, false);
1290
stop.arrival = attrs.getOptSUMOTimeReporting(SUMO_ATTR_ARRIVAL, nullptr, ok, -1);
1291
stop.duration = attrs.getOptSUMOTimeReporting(SUMO_ATTR_DURATION, nullptr, ok, -1);
1292
stop.until = attrs.getOptSUMOTimeReporting(SUMO_ATTR_UNTIL, nullptr, ok, -1);
1293
if (!expectTrigger && (!ok || (stop.duration < 0 && stop.until < 0 && stop.speed == 0))) {
1294
return writeError("Invalid duration or end time is given for a stop" + errorSuffix);
1295
}
1296
stop.extension = attrs.getOptSUMOTimeReporting(SUMO_ATTR_EXTENSION, nullptr, ok, -1);
1297
const bool defaultParking = (stop.triggered || stop.containerTriggered || stop.parkingarea != "");
1298
stop.parking = attrs.getOpt<ParkingType>(SUMO_ATTR_PARKING, nullptr, ok, defaultParking ? ParkingType::OFFROAD : ParkingType::ONROAD);
1299
if ((stop.parkingarea != "") && (stop.parking == ParkingType::ONROAD)) {
1300
WRITE_WARNING("Stop at parkingarea overrides attribute 'parking' for stop" + errorSuffix);
1301
stop.parking = ParkingType::OFFROAD;
1302
}
1303
if (!ok) {
1304
return writeError("Invalid bool for 'triggered', 'containerTriggered' or 'parking' for stop" + errorSuffix);
1305
}
1306
// expected persons
1307
const std::vector<std::string>& expected = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EXPECTED, nullptr, ok);
1308
stop.awaitedPersons.insert(expected.begin(), expected.end());
1309
if (stop.awaitedPersons.size() > 0 && (stop.parametersSet & STOP_TRIGGER_SET) == 0) {
1310
stop.triggered = true;
1311
if ((stop.parametersSet & STOP_PARKING_SET) == 0) {
1312
stop.parking = ParkingType::OFFROAD;
1313
}
1314
}
1315
// permitted transportables
1316
const std::vector<std::string>& permitted = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_PERMITTED, nullptr, ok);
1317
stop.permitted.insert(permitted.begin(), permitted.end());
1318
// expected containers
1319
const std::vector<std::string>& expectedContainers = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EXPECTED_CONTAINERS, nullptr, ok);
1320
stop.awaitedContainers.insert(expectedContainers.begin(), expectedContainers.end());
1321
if (stop.awaitedContainers.size() > 0 && (stop.parametersSet & STOP_CONTAINER_TRIGGER_SET) == 0) {
1322
stop.containerTriggered = true;
1323
if ((stop.parametersSet & STOP_PARKING_SET) == 0) {
1324
stop.parking = ParkingType::OFFROAD;
1325
}
1326
}
1327
// public transport trip id
1328
stop.tripId = attrs.getOpt<std::string>(SUMO_ATTR_TRIP_ID, nullptr, ok, "");
1329
stop.split = attrs.getOpt<std::string>(SUMO_ATTR_SPLIT, nullptr, ok, "");
1330
stop.join = attrs.getOpt<std::string>(SUMO_ATTR_JOIN, nullptr, ok, "");
1331
stop.line = attrs.getOpt<std::string>(SUMO_ATTR_LINE, nullptr, ok, "");
1332
// index
1333
const std::string idx = attrs.getOpt<std::string>(SUMO_ATTR_INDEX, nullptr, ok, "end");
1334
if (idx == "end") {
1335
stop.index = STOP_INDEX_END;
1336
} else if (idx == "fit") {
1337
stop.index = STOP_INDEX_FIT;
1338
} else {
1339
stop.index = attrs.get<int>(SUMO_ATTR_INDEX, nullptr, ok);
1340
if (!ok || stop.index < 0) {
1341
return writeError("Invalid 'index' for stop" + errorSuffix);
1342
}
1343
}
1344
stop.started = attrs.getOptSUMOTimeReporting(SUMO_ATTR_STARTED, nullptr, ok, -1);
1345
stop.ended = attrs.getOptSUMOTimeReporting(SUMO_ATTR_ENDED, nullptr, ok, -1);
1346
stop.posLat = attrs.getOpt<double>(SUMO_ATTR_POSITION_LAT, nullptr, ok, INVALID_DOUBLE);
1347
stop.actType = attrs.getOpt<std::string>(SUMO_ATTR_ACTTYPE, nullptr, ok, "");
1348
stop.onDemand = attrs.getOpt<bool>(SUMO_ATTR_ONDEMAND, nullptr, ok, false);
1349
stop.jump = attrs.getOptSUMOTimeReporting(SUMO_ATTR_JUMP, nullptr, ok, -1);
1350
stop.jumpUntil = attrs.getOptSUMOTimeReporting(SUMO_ATTR_JUMP_UNTIL, nullptr, ok, -1);
1351
return true;
1352
}
1353
1354
1355
bool
1356
RouteHandler::isOverFromToEdges(const CommonXMLStructure::SumoBaseObject* sumoBaseObject) const {
1357
return sumoBaseObject->hasStringAttribute(SUMO_ATTR_FROM) && sumoBaseObject->hasStringAttribute(SUMO_ATTR_TO);
1358
}
1359
1360
1361
bool
1362
RouteHandler::isOverFromToJunctions(const CommonXMLStructure::SumoBaseObject* sumoBaseObject) const {
1363
return sumoBaseObject->hasStringAttribute(SUMO_ATTR_FROM_JUNCTION) && sumoBaseObject->hasStringAttribute(SUMO_ATTR_TO_JUNCTION);
1364
}
1365
1366
1367
bool
1368
RouteHandler::isOverFromToTAZs(const CommonXMLStructure::SumoBaseObject* sumoBaseObject) const {
1369
return sumoBaseObject->hasStringAttribute(SUMO_ATTR_FROM_TAZ) && sumoBaseObject->hasStringAttribute(SUMO_ATTR_TO_TAZ);
1370
}
1371
1372
1373
void
1374
RouteHandler::adjustTypesAndProbabilities(std::vector<std::string>& vTypes, std::vector<double>& probabilities) {
1375
// add more probabilities
1376
for (size_t i = probabilities.size(); i < vTypes.size(); i++) {
1377
probabilities.push_back(INVALID_DOUBLE);
1378
}
1379
// reduce number of probabilities
1380
while (vTypes.size() < probabilities.size()) {
1381
probabilities.pop_back();
1382
}
1383
}
1384
1385
/****************************************************************************/
1386
1387