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