Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/handlers/AdditionalHandler.cpp
193828 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 AdditionalHandler.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jun 2021
17
///
18
// The XML-Handler for additionals loading
19
/****************************************************************************/
20
#include <config.h>
21
22
#include <utils/common/MsgHandler.h>
23
#include <utils/xml/SUMOSAXHandler.h>
24
#include <utils/shapes/Shape.h>
25
#include <utils/shapes/PointOfInterest.h>
26
#include <utils/options/OptionsCont.h>
27
#include <utils/vehicle/SUMOVehicleParserHelper.h>
28
#include <utils/xml/SUMOXMLDefinitions.h>
29
30
#include "AdditionalHandler.h"
31
32
33
// ===========================================================================
34
// method definitions
35
// ===========================================================================
36
37
AdditionalHandler::AdditionalHandler(FileBucket* fileBucket) :
38
CommonHandler(fileBucket) {
39
}
40
41
42
AdditionalHandler::~AdditionalHandler() {}
43
44
45
bool
46
AdditionalHandler::beginParseAttributes(SumoXMLTag tag, const SUMOSAXAttributes& attrs) {
47
// open SUMOBaseOBject
48
myCommonXMLStructure.openSUMOBaseOBject();
49
// check tag
50
try {
51
switch (tag) {
52
// Stopping Places
53
case SUMO_TAG_BUS_STOP:
54
parseBusStopAttributes(attrs);
55
break;
56
case SUMO_TAG_TRAIN_STOP:
57
parseTrainStopAttributes(attrs);
58
break;
59
case SUMO_TAG_ACCESS:
60
parseAccessAttributes(attrs);
61
break;
62
case SUMO_TAG_CONTAINER_STOP:
63
parseContainerStopAttributes(attrs);
64
break;
65
case SUMO_TAG_CHARGING_STATION:
66
parseChargingStationAttributes(attrs);
67
break;
68
case SUMO_TAG_PARKING_AREA:
69
parseParkingAreaAttributes(attrs);
70
break;
71
case SUMO_TAG_PARKING_SPACE:
72
parseParkingSpaceAttributes(attrs);
73
break;
74
// Detectors
75
case SUMO_TAG_E1DETECTOR:
76
case SUMO_TAG_INDUCTION_LOOP:
77
parseE1Attributes(attrs);
78
break;
79
case SUMO_TAG_E2DETECTOR:
80
case SUMO_TAG_LANE_AREA_DETECTOR:
81
parseE2Attributes(attrs);
82
break;
83
case SUMO_TAG_E3DETECTOR:
84
case SUMO_TAG_ENTRY_EXIT_DETECTOR:
85
parseE3Attributes(attrs);
86
break;
87
case SUMO_TAG_DET_ENTRY:
88
parseEntryAttributes(attrs);
89
break;
90
case SUMO_TAG_DET_EXIT:
91
parseExitAttributes(attrs);
92
break;
93
case SUMO_TAG_INSTANT_INDUCTION_LOOP:
94
parseE1InstantAttributes(attrs);
95
break;
96
// TAZs
97
case SUMO_TAG_TAZ:
98
parseTAZAttributes(attrs);
99
break;
100
case SUMO_TAG_TAZSOURCE:
101
parseTAZSourceAttributes(attrs);
102
break;
103
case SUMO_TAG_TAZSINK:
104
parseTAZSinkAttributes(attrs);
105
break;
106
// Variable Speed Sign
107
case SUMO_TAG_VSS:
108
parseVariableSpeedSignAttributes(attrs);
109
break;
110
case SUMO_TAG_STEP:
111
parseVariableSpeedSignStepAttributes(attrs);
112
break;
113
// Calibrator
114
case SUMO_TAG_CALIBRATOR:
115
case GNE_TAG_CALIBRATOR_LANE:
116
parseCalibratorAttributes(attrs);
117
break;
118
// flow (calibrator)
119
case SUMO_TAG_FLOW:
120
parseCalibratorFlowAttributes(attrs);
121
break;
122
// Rerouter
123
case SUMO_TAG_REROUTER:
124
parseRerouterAttributes(attrs);
125
break;
126
case SUMO_TAG_INTERVAL:
127
parseRerouterIntervalAttributes(attrs);
128
break;
129
case SUMO_TAG_CLOSING_LANE_REROUTE:
130
parseClosingLaneRerouteAttributes(attrs);
131
break;
132
case SUMO_TAG_CLOSING_REROUTE:
133
parseClosingRerouteAttributes(attrs);
134
break;
135
case SUMO_TAG_DEST_PROB_REROUTE:
136
parseDestProbRerouteAttributes(attrs);
137
break;
138
case SUMO_TAG_PARKING_AREA_REROUTE:
139
parseParkingAreaRerouteAttributes(attrs);
140
break;
141
case SUMO_TAG_ROUTE_PROB_REROUTE:
142
parseRouteProbRerouteAttributes(attrs);
143
break;
144
// Route probe
145
case SUMO_TAG_ROUTEPROBE:
146
parseRouteProbeAttributes(attrs);
147
break;
148
// Vaporizer (deprecated)
149
case SUMO_TAG_VAPORIZER:
150
parseVaporizerAttributes(attrs);
151
break;
152
// wires
153
case SUMO_TAG_TRACTION_SUBSTATION:
154
parseTractionSubstation(attrs);
155
break;
156
case SUMO_TAG_OVERHEAD_WIRE_CLAMP:
157
parseOverheadWireClamp(attrs);
158
break;
159
case SUMO_TAG_OVERHEAD_WIRE_SECTION:
160
parseOverheadWire(attrs);
161
break;
162
// Poly
163
case SUMO_TAG_POLY:
164
parsePolyAttributes(attrs);
165
break;
166
case SUMO_TAG_POI:
167
parsePOIAttributes(attrs);
168
break;
169
// JuPedSim
170
case GNE_TAG_JPS_WALKABLEAREA:
171
parseJpsWalkableAreaAttributes(attrs);
172
break;
173
case GNE_TAG_JPS_OBSTACLE:
174
parseJpsObstacleAttributes(attrs);
175
break;
176
// parameters
177
case SUMO_TAG_PARAM:
178
parseParameters(attrs);
179
break;
180
default:
181
// tag cannot be parsed in AdditionalHandler
182
myCommonXMLStructure.abortSUMOBaseOBject();
183
return false;
184
}
185
} catch (InvalidArgument& e) {
186
writeError(e.what());
187
}
188
return true;
189
}
190
191
192
void
193
AdditionalHandler::endParseAttributes() {
194
// get last inserted object
195
CommonXMLStructure::SumoBaseObject* obj = myCommonXMLStructure.getCurrentSumoBaseObject();
196
if (obj) {
197
// close SUMOBaseOBject
198
myCommonXMLStructure.closeSUMOBaseOBject();
199
// check tag
200
switch (obj->getTag()) {
201
// Stopping Places
202
case SUMO_TAG_BUS_STOP:
203
case SUMO_TAG_TRAIN_STOP:
204
case SUMO_TAG_CONTAINER_STOP:
205
case SUMO_TAG_CHARGING_STATION:
206
case SUMO_TAG_PARKING_AREA:
207
// detectors
208
case SUMO_TAG_E1DETECTOR:
209
case SUMO_TAG_INDUCTION_LOOP:
210
case SUMO_TAG_E2DETECTOR:
211
case SUMO_TAG_LANE_AREA_DETECTOR:
212
case SUMO_TAG_E3DETECTOR:
213
case SUMO_TAG_ENTRY_EXIT_DETECTOR:
214
case SUMO_TAG_INSTANT_INDUCTION_LOOP:
215
// TAZs
216
case SUMO_TAG_TAZ:
217
// Variable Speed Sign
218
case SUMO_TAG_VSS:
219
// Calibrator
220
case SUMO_TAG_CALIBRATOR:
221
case GNE_TAG_CALIBRATOR_LANE:
222
// Rerouter
223
case SUMO_TAG_REROUTER:
224
// Route probe
225
case SUMO_TAG_ROUTEPROBE:
226
// Vaporizer (deprecated)
227
case SUMO_TAG_VAPORIZER:
228
// wires
229
case SUMO_TAG_TRACTION_SUBSTATION:
230
case SUMO_TAG_OVERHEAD_WIRE_SECTION:
231
case SUMO_TAG_OVERHEAD_WIRE_CLAMP:
232
// Shapes
233
case SUMO_TAG_POLY:
234
case SUMO_TAG_POI:
235
// JuPedSim
236
case GNE_TAG_JPS_WALKABLEAREA:
237
case GNE_TAG_JPS_OBSTACLE:
238
// parse object and all their childrens
239
parseSumoBaseObject(obj);
240
// delete object (and all of their childrens)
241
delete obj;
242
break;
243
default:
244
break;
245
}
246
}
247
}
248
249
250
void
251
AdditionalHandler::parseSumoBaseObject(CommonXMLStructure::SumoBaseObject* obj) {
252
// check if loading was aborted
253
if (!myAbortLoading) {
254
// switch tag
255
switch (obj->getTag()) {
256
// Stopping Places
257
case SUMO_TAG_BUS_STOP:
258
if (buildBusStop(obj,
259
obj->getStringAttribute(SUMO_ATTR_ID),
260
obj->getStringAttribute(SUMO_ATTR_LANE),
261
obj->getDoubleAttribute(SUMO_ATTR_STARTPOS),
262
obj->getDoubleAttribute(SUMO_ATTR_ENDPOS),
263
obj->getStringAttribute(SUMO_ATTR_NAME),
264
obj->getStringListAttribute(SUMO_ATTR_LINES),
265
obj->getIntAttribute(SUMO_ATTR_PERSON_CAPACITY),
266
obj->getDoubleAttribute(SUMO_ATTR_PARKING_LENGTH),
267
obj->getColorAttribute(SUMO_ATTR_COLOR),
268
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
269
obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
270
obj->getParameters())) {
271
obj->markAsCreated();
272
}
273
break;
274
case SUMO_TAG_TRAIN_STOP:
275
if (buildTrainStop(obj,
276
obj->getStringAttribute(SUMO_ATTR_ID),
277
obj->getStringAttribute(SUMO_ATTR_LANE),
278
obj->getDoubleAttribute(SUMO_ATTR_STARTPOS),
279
obj->getDoubleAttribute(SUMO_ATTR_ENDPOS),
280
obj->getStringAttribute(SUMO_ATTR_NAME),
281
obj->getStringListAttribute(SUMO_ATTR_LINES),
282
obj->getIntAttribute(SUMO_ATTR_PERSON_CAPACITY),
283
obj->getDoubleAttribute(SUMO_ATTR_PARKING_LENGTH),
284
obj->getColorAttribute(SUMO_ATTR_COLOR),
285
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
286
obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
287
obj->getParameters())) {
288
obj->markAsCreated();
289
}
290
break;
291
case SUMO_TAG_ACCESS:
292
if (buildAccess(obj,
293
obj->getStringAttribute(SUMO_ATTR_LANE),
294
obj->getStringAttribute(SUMO_ATTR_POSITION),
295
obj->getDoubleAttribute(SUMO_ATTR_LENGTH),
296
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
297
obj->getParameters())) {
298
obj->markAsCreated();
299
}
300
break;
301
case SUMO_TAG_CONTAINER_STOP:
302
if (buildContainerStop(obj,
303
obj->getStringAttribute(SUMO_ATTR_ID),
304
obj->getStringAttribute(SUMO_ATTR_LANE),
305
obj->getDoubleAttribute(SUMO_ATTR_STARTPOS),
306
obj->getDoubleAttribute(SUMO_ATTR_ENDPOS),
307
obj->getStringAttribute(SUMO_ATTR_NAME),
308
obj->getStringListAttribute(SUMO_ATTR_LINES),
309
obj->getIntAttribute(SUMO_ATTR_CONTAINER_CAPACITY),
310
obj->getDoubleAttribute(SUMO_ATTR_PARKING_LENGTH),
311
obj->getColorAttribute(SUMO_ATTR_COLOR),
312
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
313
obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
314
obj->getParameters())) {
315
obj->markAsCreated();
316
}
317
break;
318
case SUMO_TAG_CHARGING_STATION:
319
if (buildChargingStation(obj,
320
obj->getStringAttribute(SUMO_ATTR_ID),
321
obj->getStringAttribute(SUMO_ATTR_LANE),
322
obj->getDoubleAttribute(SUMO_ATTR_STARTPOS),
323
obj->getDoubleAttribute(SUMO_ATTR_ENDPOS),
324
obj->getStringAttribute(SUMO_ATTR_NAME),
325
obj->getDoubleAttribute(SUMO_ATTR_CHARGINGPOWER),
326
obj->getDoubleAttribute(SUMO_ATTR_TOTALPOWER),
327
obj->getDoubleAttribute(SUMO_ATTR_EFFICIENCY),
328
obj->getBoolAttribute(SUMO_ATTR_CHARGEINTRANSIT),
329
obj->getTimeAttribute(SUMO_ATTR_CHARGEDELAY),
330
obj->getStringAttribute(SUMO_ATTR_CHARGETYPE),
331
obj->getTimeAttribute(SUMO_ATTR_WAITINGTIME),
332
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
333
obj->getStringAttribute(SUMO_ATTR_PARKING_AREA),
334
obj->getParameters())) {
335
obj->markAsCreated();
336
}
337
break;
338
case SUMO_TAG_PARKING_AREA:
339
if (buildParkingArea(obj,
340
obj->getStringAttribute(SUMO_ATTR_ID),
341
obj->getStringAttribute(SUMO_ATTR_LANE),
342
obj->getDoubleAttribute(SUMO_ATTR_STARTPOS),
343
obj->getDoubleAttribute(SUMO_ATTR_ENDPOS),
344
obj->getStringAttribute(SUMO_ATTR_DEPARTPOS),
345
obj->getStringAttribute(SUMO_ATTR_NAME),
346
obj->getStringListAttribute(SUMO_ATTR_ACCEPTED_BADGES),
347
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
348
obj->getIntAttribute(SUMO_ATTR_ROADSIDE_CAPACITY),
349
obj->getBoolAttribute(SUMO_ATTR_ONROAD),
350
obj->getDoubleAttribute(SUMO_ATTR_WIDTH),
351
obj->getDoubleAttribute(SUMO_ATTR_LENGTH),
352
obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
353
obj->getBoolAttribute(SUMO_ATTR_LEFTHAND),
354
obj->getParameters())) {
355
obj->markAsCreated();
356
}
357
break;
358
case SUMO_TAG_PARKING_SPACE:
359
if (buildParkingSpace(obj,
360
obj->getDoubleAttribute(SUMO_ATTR_X),
361
obj->getDoubleAttribute(SUMO_ATTR_Y),
362
obj->getDoubleAttribute(SUMO_ATTR_Z),
363
obj->getStringAttribute(SUMO_ATTR_NAME),
364
obj->getStringAttribute(SUMO_ATTR_WIDTH),
365
obj->getStringAttribute(SUMO_ATTR_LENGTH),
366
obj->getStringAttribute(SUMO_ATTR_ANGLE),
367
obj->getDoubleAttribute(SUMO_ATTR_SLOPE),
368
obj->getParameters())) {
369
obj->markAsCreated();
370
}
371
break;
372
// Detectors
373
case SUMO_TAG_E1DETECTOR:
374
case SUMO_TAG_INDUCTION_LOOP:
375
// build E1
376
if (buildE1Detector(obj,
377
obj->getStringAttribute(SUMO_ATTR_ID),
378
obj->getStringAttribute(SUMO_ATTR_LANE),
379
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
380
obj->getPeriodAttribute(),
381
obj->getStringAttribute(SUMO_ATTR_FILE),
382
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
383
obj->getStringListAttribute(SUMO_ATTR_NEXT_EDGES),
384
obj->getStringAttribute(SUMO_ATTR_DETECT_PERSONS),
385
obj->getStringAttribute(SUMO_ATTR_NAME),
386
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
387
obj->getParameters())) {
388
obj->markAsCreated();
389
}
390
break;
391
case SUMO_TAG_E2DETECTOR:
392
case SUMO_TAG_LANE_AREA_DETECTOR:
393
if (obj->hasStringAttribute(SUMO_ATTR_LANE)) {
394
if (buildSingleLaneDetectorE2(obj,
395
obj->getStringAttribute(SUMO_ATTR_ID),
396
obj->getStringAttribute(SUMO_ATTR_LANE),
397
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
398
obj->getDoubleAttribute(SUMO_ATTR_LENGTH),
399
obj->getPeriodAttribute(),
400
obj->getStringAttribute(SUMO_ATTR_TLID),
401
obj->getStringAttribute(SUMO_ATTR_FILE),
402
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
403
obj->getStringListAttribute(SUMO_ATTR_NEXT_EDGES),
404
obj->getStringAttribute(SUMO_ATTR_DETECT_PERSONS),
405
obj->getStringAttribute(SUMO_ATTR_NAME),
406
obj->getTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD),
407
obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD),
408
obj->getDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD),
409
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
410
obj->getBoolAttribute(SUMO_ATTR_SHOW_DETECTOR),
411
obj->getParameters())) {
412
obj->markAsCreated();
413
}
414
} else {
415
if (buildMultiLaneDetectorE2(obj,
416
obj->getStringAttribute(SUMO_ATTR_ID),
417
obj->getStringListAttribute(SUMO_ATTR_LANES),
418
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
419
obj->getDoubleAttribute(SUMO_ATTR_ENDPOS),
420
obj->getPeriodAttribute(),
421
obj->getStringAttribute(SUMO_ATTR_TLID),
422
obj->getStringAttribute(SUMO_ATTR_FILE),
423
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
424
obj->getStringListAttribute(SUMO_ATTR_NEXT_EDGES),
425
obj->getStringAttribute(SUMO_ATTR_DETECT_PERSONS),
426
obj->getStringAttribute(SUMO_ATTR_NAME),
427
obj->getTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD),
428
obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD),
429
obj->getDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD),
430
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
431
obj->getBoolAttribute(SUMO_ATTR_SHOW_DETECTOR),
432
obj->getParameters())) {
433
obj->markAsCreated();
434
}
435
}
436
break;
437
case SUMO_TAG_E3DETECTOR:
438
case SUMO_TAG_ENTRY_EXIT_DETECTOR:
439
if (buildDetectorE3(obj,
440
obj->getStringAttribute(SUMO_ATTR_ID),
441
obj->getPositionAttribute(SUMO_ATTR_POSITION),
442
obj->getPeriodAttribute(),
443
obj->getStringAttribute(SUMO_ATTR_FILE),
444
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
445
obj->getStringListAttribute(SUMO_ATTR_NEXT_EDGES),
446
obj->getStringAttribute(SUMO_ATTR_DETECT_PERSONS),
447
obj->getStringAttribute(SUMO_ATTR_NAME),
448
obj->getTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD),
449
obj->getDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD),
450
obj->getBoolAttribute(SUMO_ATTR_OPEN_ENTRY),
451
obj->getBoolAttribute(SUMO_ATTR_EXPECT_ARRIVAL),
452
obj->getParameters())) {
453
obj->markAsCreated();
454
}
455
break;
456
case SUMO_TAG_DET_ENTRY:
457
if (buildDetectorEntry(obj,
458
obj->getStringAttribute(SUMO_ATTR_LANE),
459
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
460
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
461
obj->getParameters())) {
462
obj->markAsCreated();
463
}
464
break;
465
case SUMO_TAG_DET_EXIT:
466
if (buildDetectorExit(obj,
467
obj->getStringAttribute(SUMO_ATTR_LANE),
468
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
469
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
470
obj->getParameters())) {
471
obj->markAsCreated();
472
}
473
break;
474
case SUMO_TAG_INSTANT_INDUCTION_LOOP:
475
if (buildDetectorE1Instant(obj,
476
obj->getStringAttribute(SUMO_ATTR_ID),
477
obj->getStringAttribute(SUMO_ATTR_LANE),
478
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
479
obj->getStringAttribute(SUMO_ATTR_FILE),
480
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
481
obj->getStringListAttribute(SUMO_ATTR_NEXT_EDGES),
482
obj->getStringAttribute(SUMO_ATTR_DETECT_PERSONS),
483
obj->getStringAttribute(SUMO_ATTR_NAME),
484
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
485
obj->getParameters())) {
486
obj->markAsCreated();
487
}
488
break;
489
// TAZs
490
case SUMO_TAG_TAZ:
491
if (buildTAZ(obj,
492
obj->getStringAttribute(SUMO_ATTR_ID),
493
obj->getPositionVectorAttribute(SUMO_ATTR_SHAPE),
494
obj->getPositionAttribute(SUMO_ATTR_CENTER),
495
obj->getBoolAttribute(SUMO_ATTR_FILL),
496
obj->getColorAttribute(SUMO_ATTR_COLOR),
497
obj->getStringListAttribute(SUMO_ATTR_EDGES),
498
obj->getStringAttribute(SUMO_ATTR_NAME),
499
obj->getParameters())) {
500
obj->markAsCreated();
501
}
502
break;
503
case SUMO_TAG_TAZSOURCE:
504
if (buildTAZSource(obj,
505
obj->getStringAttribute(SUMO_ATTR_ID),
506
obj->getDoubleAttribute(SUMO_ATTR_WEIGHT))) {
507
obj->markAsCreated();
508
}
509
break;
510
case SUMO_TAG_TAZSINK:
511
if (buildTAZSink(obj,
512
obj->getStringAttribute(SUMO_ATTR_ID),
513
obj->getDoubleAttribute(SUMO_ATTR_WEIGHT))) {
514
obj->markAsCreated();
515
}
516
break;
517
// Variable Speed Sign
518
case SUMO_TAG_VSS:
519
if (buildVariableSpeedSign(obj,
520
obj->getStringAttribute(SUMO_ATTR_ID),
521
obj->getPositionAttribute(SUMO_ATTR_POSITION),
522
obj->getStringListAttribute(SUMO_ATTR_LANES),
523
obj->getStringAttribute(SUMO_ATTR_NAME),
524
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
525
obj->getParameters())) {
526
obj->markAsCreated();
527
}
528
break;
529
case SUMO_TAG_STEP:
530
if (buildVariableSpeedSignStep(obj,
531
obj->getTimeAttribute(SUMO_ATTR_TIME),
532
obj->getDoubleAttribute(SUMO_ATTR_SPEED))) {
533
obj->markAsCreated();
534
}
535
break;
536
// Calibrator
537
case SUMO_TAG_CALIBRATOR:
538
if (buildEdgeCalibrator(obj,
539
obj->getStringAttribute(SUMO_ATTR_ID),
540
obj->getStringAttribute(SUMO_ATTR_EDGE),
541
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
542
obj->getStringAttribute(SUMO_ATTR_NAME),
543
obj->getStringAttribute(SUMO_ATTR_OUTPUT),
544
obj->getPeriodAttribute(),
545
obj->getStringAttribute(SUMO_ATTR_ROUTEPROBE),
546
obj->getDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD),
547
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
548
obj->getParameters())) {
549
obj->markAsCreated();
550
}
551
break;
552
case GNE_TAG_CALIBRATOR_LANE:
553
if (buildLaneCalibrator(obj,
554
obj->getStringAttribute(SUMO_ATTR_ID),
555
obj->getStringAttribute(SUMO_ATTR_LANE),
556
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
557
obj->getStringAttribute(SUMO_ATTR_NAME),
558
obj->getStringAttribute(SUMO_ATTR_OUTPUT),
559
obj->getPeriodAttribute(),
560
obj->getStringAttribute(SUMO_ATTR_ROUTEPROBE),
561
obj->getDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD),
562
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
563
obj->getParameters())) {
564
obj->markAsCreated();
565
}
566
break;
567
case SUMO_TAG_FLOW:
568
if (buildCalibratorFlow(obj,
569
obj->getVehicleParameter())) {
570
obj->markAsCreated();
571
}
572
break;
573
// Rerouter
574
case SUMO_TAG_REROUTER:
575
if (buildRerouter(obj,
576
obj->getStringAttribute(SUMO_ATTR_ID),
577
obj->getPositionAttribute(SUMO_ATTR_POSITION),
578
obj->getStringListAttribute(SUMO_ATTR_EDGES),
579
obj->getDoubleAttribute(SUMO_ATTR_PROB),
580
obj->getStringAttribute(SUMO_ATTR_NAME),
581
obj->getBoolAttribute(SUMO_ATTR_OFF),
582
obj->getBoolAttribute(SUMO_ATTR_OPTIONAL),
583
obj->getTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD),
584
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
585
obj->getParameters())) {
586
obj->markAsCreated();
587
}
588
break;
589
case SUMO_TAG_CLOSING_LANE_REROUTE:
590
if (buildClosingLaneReroute(obj,
591
obj->getStringAttribute(SUMO_ATTR_ID),
592
parseVehicleClasses(obj->getStringAttribute(SUMO_ATTR_ALLOW),
593
obj->getStringAttribute(SUMO_ATTR_DISALLOW)))) {
594
obj->markAsCreated();
595
}
596
break;
597
case SUMO_TAG_CLOSING_REROUTE:
598
if (buildClosingReroute(obj,
599
obj->getStringAttribute(SUMO_ATTR_ID),
600
parseVehicleClasses(obj->getStringAttribute(SUMO_ATTR_ALLOW),
601
obj->getStringAttribute(SUMO_ATTR_DISALLOW)))) {
602
obj->markAsCreated();
603
}
604
break;
605
case SUMO_TAG_DEST_PROB_REROUTE:
606
if (buildDestProbReroute(obj,
607
obj->getStringAttribute(SUMO_ATTR_ID),
608
obj->getDoubleAttribute(SUMO_ATTR_PROB))) {
609
obj->markAsCreated();
610
}
611
break;
612
case SUMO_TAG_PARKING_AREA_REROUTE:
613
if (buildParkingAreaReroute(obj,
614
obj->getStringAttribute(SUMO_ATTR_ID),
615
obj->getDoubleAttribute(SUMO_ATTR_PROB),
616
obj->getBoolAttribute(SUMO_ATTR_VISIBLE))) {
617
obj->markAsCreated();
618
}
619
break;
620
case SUMO_TAG_ROUTE_PROB_REROUTE:
621
if (buildRouteProbReroute(obj,
622
obj->getStringAttribute(SUMO_ATTR_ID),
623
obj->getDoubleAttribute(SUMO_ATTR_PROB))) {
624
obj->markAsCreated();
625
}
626
break;
627
case SUMO_TAG_INTERVAL:
628
// check if is aREROUTER interval
629
if (obj->getParentSumoBaseObject()->getTag() == SUMO_TAG_REROUTER) {
630
if (buildRerouterInterval(obj,
631
obj->getTimeAttribute(SUMO_ATTR_BEGIN),
632
obj->getTimeAttribute(SUMO_ATTR_END))) {
633
obj->markAsCreated();
634
}
635
}
636
break;
637
// Route probe
638
case SUMO_TAG_ROUTEPROBE:
639
if (buildRouteProbe(obj,
640
obj->getStringAttribute(SUMO_ATTR_ID),
641
obj->getStringAttribute(SUMO_ATTR_EDGE),
642
obj->getPeriodAttribute(),
643
obj->getStringAttribute(SUMO_ATTR_NAME),
644
obj->getStringAttribute(SUMO_ATTR_FILE),
645
obj->getTimeAttribute(SUMO_ATTR_BEGIN),
646
obj->getStringListAttribute(SUMO_ATTR_VTYPES),
647
obj->getParameters())) {
648
obj->markAsCreated();
649
}
650
break;
651
// Vaporizer (deprecated)
652
case SUMO_TAG_VAPORIZER:
653
if (buildVaporizer(obj,
654
obj->getStringAttribute(SUMO_ATTR_EDGE),
655
obj->getTimeAttribute(SUMO_ATTR_BEGIN),
656
obj->getTimeAttribute(SUMO_ATTR_END),
657
obj->getStringAttribute(SUMO_ATTR_NAME),
658
obj->getParameters())) {
659
obj->markAsCreated();
660
}
661
break;
662
// wire elements
663
case SUMO_TAG_TRACTION_SUBSTATION:
664
if (buildTractionSubstation(obj,
665
obj->getStringAttribute(SUMO_ATTR_ID),
666
obj->getPositionAttribute(SUMO_ATTR_POSITION),
667
obj->getDoubleAttribute(SUMO_ATTR_VOLTAGE),
668
obj->getDoubleAttribute(SUMO_ATTR_CURRENTLIMIT),
669
obj->getParameters())) {
670
obj->markAsCreated();
671
}
672
break;
673
case SUMO_TAG_OVERHEAD_WIRE_SECTION:
674
if (buildOverheadWire(obj,
675
obj->getStringAttribute(SUMO_ATTR_ID),
676
obj->getStringAttribute(SUMO_ATTR_SUBSTATIONID),
677
obj->getStringListAttribute(SUMO_ATTR_LANES),
678
obj->getDoubleAttribute(SUMO_ATTR_STARTPOS),
679
obj->getDoubleAttribute(SUMO_ATTR_ENDPOS),
680
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
681
obj->getStringListAttribute(SUMO_ATTR_OVERHEAD_WIRE_FORBIDDEN),
682
obj->getParameters())) {
683
obj->markAsCreated();
684
}
685
break;
686
case SUMO_TAG_OVERHEAD_WIRE_CLAMP:
687
if (buildOverheadWireClamp(obj,
688
obj->getStringAttribute(SUMO_ATTR_ID),
689
obj->getStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_START),
690
obj->getStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANESTART),
691
obj->getStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_END),
692
obj->getStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANEEND),
693
obj->getParameters())) {
694
obj->markAsCreated();
695
}
696
break;
697
// Polygon
698
case SUMO_TAG_POLY:
699
if (buildPolygon(obj,
700
obj->getStringAttribute(SUMO_ATTR_ID),
701
obj->getStringAttribute(SUMO_ATTR_TYPE),
702
obj->getColorAttribute(SUMO_ATTR_COLOR),
703
obj->getDoubleAttribute(SUMO_ATTR_LAYER),
704
obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
705
obj->getStringAttribute(SUMO_ATTR_IMGFILE),
706
obj->getPositionVectorAttribute(SUMO_ATTR_SHAPE),
707
obj->getBoolAttribute(SUMO_ATTR_GEO),
708
obj->getBoolAttribute(SUMO_ATTR_FILL),
709
obj->getDoubleAttribute(SUMO_ATTR_LINEWIDTH),
710
obj->getStringAttribute(SUMO_ATTR_NAME),
711
obj->getParameters())) {
712
obj->markAsCreated();
713
}
714
break;
715
// POI
716
case SUMO_TAG_POI:
717
// check if we want to create a POI, POILane or POIGEO
718
if (obj->hasDoubleAttribute(SUMO_ATTR_X)) {
719
// build POI over view
720
if (buildPOI(obj,
721
obj->getStringAttribute(SUMO_ATTR_ID),
722
obj->getStringAttribute(SUMO_ATTR_TYPE),
723
obj->getColorAttribute(SUMO_ATTR_COLOR),
724
obj->getDoubleAttribute(SUMO_ATTR_X),
725
obj->getDoubleAttribute(SUMO_ATTR_Y),
726
obj->getStringAttribute(SUMO_ATTR_ICON),
727
obj->getDoubleAttribute(SUMO_ATTR_LAYER),
728
obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
729
obj->getStringAttribute(SUMO_ATTR_IMGFILE),
730
obj->getDoubleAttribute(SUMO_ATTR_WIDTH),
731
obj->getDoubleAttribute(SUMO_ATTR_HEIGHT),
732
obj->getStringAttribute(SUMO_ATTR_NAME),
733
obj->getParameters())) {
734
obj->markAsCreated();
735
}
736
} else if (obj->hasStringAttribute(SUMO_ATTR_LANE)) {
737
// build POI over Lane
738
if (buildPOILane(obj,
739
obj->getStringAttribute(SUMO_ATTR_ID),
740
obj->getStringAttribute(SUMO_ATTR_TYPE),
741
obj->getColorAttribute(SUMO_ATTR_COLOR),
742
obj->getStringAttribute(SUMO_ATTR_LANE),
743
obj->getDoubleAttribute(SUMO_ATTR_POSITION),
744
obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
745
obj->getDoubleAttribute(SUMO_ATTR_POSITION_LAT),
746
obj->getStringAttribute(SUMO_ATTR_ICON),
747
obj->getDoubleAttribute(SUMO_ATTR_LAYER),
748
obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
749
obj->getStringAttribute(SUMO_ATTR_IMGFILE),
750
obj->getDoubleAttribute(SUMO_ATTR_WIDTH),
751
obj->getDoubleAttribute(SUMO_ATTR_HEIGHT),
752
obj->getStringAttribute(SUMO_ATTR_NAME),
753
obj->getParameters())) {
754
obj->markAsCreated();
755
}
756
} else {
757
// build POIGEO over view
758
if (buildPOIGeo(obj,
759
obj->getStringAttribute(SUMO_ATTR_ID),
760
obj->getStringAttribute(SUMO_ATTR_TYPE),
761
obj->getColorAttribute(SUMO_ATTR_COLOR),
762
obj->getDoubleAttribute(SUMO_ATTR_LON),
763
obj->getDoubleAttribute(SUMO_ATTR_LAT),
764
obj->getStringAttribute(SUMO_ATTR_ICON),
765
obj->getDoubleAttribute(SUMO_ATTR_LAYER),
766
obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
767
obj->getStringAttribute(SUMO_ATTR_IMGFILE),
768
obj->getDoubleAttribute(SUMO_ATTR_WIDTH),
769
obj->getDoubleAttribute(SUMO_ATTR_HEIGHT),
770
obj->getStringAttribute(SUMO_ATTR_NAME),
771
obj->getParameters())) {
772
obj->markAsCreated();
773
}
774
}
775
break;
776
// Jps WalkableArea
777
case GNE_TAG_JPS_WALKABLEAREA:
778
if (buildJpsWalkableArea(obj,
779
obj->getStringAttribute(SUMO_ATTR_ID),
780
obj->getPositionVectorAttribute(SUMO_ATTR_SHAPE),
781
obj->getBoolAttribute(SUMO_ATTR_GEO),
782
obj->getStringAttribute(SUMO_ATTR_NAME),
783
obj->getParameters())) {
784
obj->markAsCreated();
785
}
786
break;
787
// Jps Obstacle
788
case GNE_TAG_JPS_OBSTACLE:
789
if (buildJpsObstacle(obj,
790
obj->getStringAttribute(SUMO_ATTR_ID),
791
obj->getPositionVectorAttribute(SUMO_ATTR_SHAPE),
792
obj->getBoolAttribute(SUMO_ATTR_GEO),
793
obj->getStringAttribute(SUMO_ATTR_NAME),
794
obj->getParameters())) {
795
obj->markAsCreated();
796
}
797
break;
798
default:
799
break;
800
}
801
// now iterate over childrens
802
for (const auto& child : obj->getSumoBaseObjectChildren()) {
803
// call this function recursively
804
parseSumoBaseObject(child);
805
}
806
}
807
}
808
809
810
void
811
AdditionalHandler::parseBusStopAttributes(const SUMOSAXAttributes& attrs) {
812
// declare Ok Flag
813
bool parsedOk = true;
814
// needed attributes
815
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
816
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
817
// optional attributes
818
const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
819
const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
820
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
821
const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, id.c_str(), parsedOk, std::vector<std::string>());
822
const int personCapacity = attrs.getOpt<int>(SUMO_ATTR_PERSON_CAPACITY, id.c_str(), parsedOk, 6);
823
const double parkingLength = attrs.getOpt<double>(SUMO_ATTR_PARKING_LENGTH, id.c_str(), parsedOk, 0);
824
const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::INVISIBLE);
825
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
826
const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, 0);
827
// continue if flag is ok
828
if (parsedOk) {
829
// set tag
830
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_BUS_STOP);
831
// add all attributes
832
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
833
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
834
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
835
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
836
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
837
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
838
myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_PERSON_CAPACITY, personCapacity);
839
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength);
840
myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
841
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
842
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
843
} else {
844
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
845
}
846
}
847
848
849
void
850
AdditionalHandler::parseTrainStopAttributes(const SUMOSAXAttributes& attrs) {
851
// declare Ok Flag
852
bool parsedOk = true;
853
// needed attributes
854
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
855
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
856
// optional attributes
857
const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
858
const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
859
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
860
const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, id.c_str(), parsedOk, std::vector<std::string>());
861
const int personCapacity = attrs.getOpt<int>(SUMO_ATTR_PERSON_CAPACITY, id.c_str(), parsedOk, 6);
862
const double parkingLength = attrs.getOpt<double>(SUMO_ATTR_PARKING_LENGTH, id.c_str(), parsedOk, 0);
863
const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::INVISIBLE);
864
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
865
const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, 0);
866
// continue if flag is ok
867
if (parsedOk) {
868
// set tag
869
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRAIN_STOP);
870
// add all attributes
871
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
872
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
873
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
874
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
875
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
876
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
877
myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_PERSON_CAPACITY, personCapacity);
878
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength);
879
myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
880
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
881
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
882
} else {
883
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
884
}
885
}
886
887
888
void
889
AdditionalHandler::parseAccessAttributes(const SUMOSAXAttributes& attrs) {
890
// declare Ok Flag
891
bool parsedOk = true;
892
// needed attributes
893
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, "", parsedOk);
894
const std::string position = attrs.get<std::string>(SUMO_ATTR_POSITION, "", parsedOk);
895
// optional attributes
896
const double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, "", parsedOk, -1.00, false); /* in future updates, INVALID_DOUBLE */
897
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, "", parsedOk, false);
898
// check parent
899
checkParsedParent(SUMO_TAG_ACCESS, {SUMO_TAG_BUS_STOP, SUMO_TAG_TRAIN_STOP, SUMO_TAG_CONTAINER_STOP}, parsedOk);
900
// continue if flag is ok
901
if (parsedOk) {
902
// set tag
903
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ACCESS);
904
// add all attributes
905
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
906
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_POSITION, position);
907
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length);
908
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
909
} else {
910
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
911
}
912
}
913
914
915
void
916
AdditionalHandler::parseContainerStopAttributes(const SUMOSAXAttributes& attrs) {
917
// declare Ok Flag
918
bool parsedOk = true;
919
// needed attributes
920
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
921
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
922
// optional attributes
923
const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
924
const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
925
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
926
const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, id.c_str(), parsedOk, std::vector<std::string>());
927
const int containerCapacity = attrs.getOpt<int>(SUMO_ATTR_CONTAINER_CAPACITY, id.c_str(), parsedOk, 6);
928
const double parkingLength = attrs.getOpt<double>(SUMO_ATTR_PARKING_LENGTH, id.c_str(), parsedOk, 0);
929
const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::INVISIBLE);
930
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
931
const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, 0);
932
// continue if flag is ok
933
if (parsedOk) {
934
// set tag
935
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CONTAINER_STOP);
936
// add all attributes
937
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
938
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
939
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
940
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
941
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
942
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
943
myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_CONTAINER_CAPACITY, containerCapacity);
944
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength);
945
myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
946
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
947
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
948
} else {
949
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
950
}
951
}
952
953
954
void
955
AdditionalHandler::parseChargingStationAttributes(const SUMOSAXAttributes& attrs) {
956
// declare Ok Flag
957
bool parsedOk = true;
958
// needed attributes
959
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
960
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
961
// optional attributes
962
const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
963
const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
964
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
965
const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, id.c_str(), parsedOk, std::vector<std::string>());
966
const double chargingPower = attrs.getOpt<double>(SUMO_ATTR_CHARGINGPOWER, id.c_str(), parsedOk, 22000);
967
const double totalPower = attrs.getOpt<double>(SUMO_ATTR_TOTALPOWER, id.c_str(), parsedOk, 0);
968
const double efficiency = attrs.getOpt<double>(SUMO_ATTR_EFFICIENCY, id.c_str(), parsedOk, 0.95);
969
const bool chargeInTransit = attrs.getOpt<bool>(SUMO_ATTR_CHARGEINTRANSIT, id.c_str(), parsedOk, 0);
970
const SUMOTime chargeDelay = attrs.getOptSUMOTimeReporting(SUMO_ATTR_CHARGEDELAY, id.c_str(), parsedOk, 0);
971
const std::string chargeType = attrs.getOpt<std::string>(SUMO_ATTR_CHARGETYPE, id.c_str(), parsedOk, SUMOXMLDefinitions::ChargeTypes.getString(ChargeType::NORMAL));
972
const SUMOTime waitingTime = attrs.getOptSUMOTimeReporting(SUMO_ATTR_WAITINGTIME, id.c_str(), parsedOk, TIME2STEPS(900));
973
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
974
const std::string parkingAreaID = attrs.getOpt<std::string>(SUMO_ATTR_PARKING_AREA, id.c_str(), parsedOk, "");
975
// check charge type
976
if ((chargeType != "normal") && (chargeType != "battery-exchange") && (chargeType != "fuel")) {
977
writeError(TLF("Invalid charge type '%' defined in chargingStation '%'.", chargeType, id));
978
parsedOk = false;
979
}
980
// continue if flag is ok
981
if (parsedOk) {
982
// set tag
983
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CHARGING_STATION);
984
// add all attributes
985
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
986
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
987
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
988
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
989
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
990
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
991
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_CHARGINGPOWER, chargingPower);
992
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_TOTALPOWER, totalPower);
993
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_EFFICIENCY, efficiency);
994
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_CHARGEINTRANSIT, chargeInTransit);
995
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_CHARGEDELAY, chargeDelay);
996
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_CHARGETYPE, chargeType);
997
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_WAITINGTIME, waitingTime);
998
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
999
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_PARKING_AREA, parkingAreaID);
1000
} else {
1001
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1002
}
1003
}
1004
1005
1006
void
1007
AdditionalHandler::parseParkingAreaAttributes(const SUMOSAXAttributes& attrs) {
1008
// declare Ok Flag
1009
bool parsedOk = true;
1010
// needed attributes
1011
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1012
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
1013
// optional attributes
1014
const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
1015
const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
1016
const std::string departPos = attrs.getOpt<std::string>(SUMO_ATTR_DEPARTPOS, id.c_str(), parsedOk, "");
1017
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1018
const std::vector<std::string> badges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_ACCEPTED_BADGES, id.c_str(), parsedOk, std::vector<std::string>());
1019
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
1020
const int roadSideCapacity = attrs.getOpt<int>(SUMO_ATTR_ROADSIDE_CAPACITY, id.c_str(), parsedOk, 0);
1021
const bool onRoad = attrs.getOpt<bool>(SUMO_ATTR_ONROAD, id.c_str(), parsedOk, false);
1022
const double width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, id.c_str(), parsedOk, 0);
1023
const double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, id.c_str(), parsedOk, 0);
1024
const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, 0);
1025
const bool lefthand = attrs.getOpt<bool>(SUMO_ATTR_LEFTHAND, id.c_str(), parsedOk, false);
1026
// continue if flag is ok
1027
if (parsedOk) {
1028
// set tag
1029
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PARKING_AREA);
1030
// add all attributes
1031
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1032
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
1033
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
1034
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
1035
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DEPARTPOS, departPos);
1036
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1037
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_ACCEPTED_BADGES, badges);
1038
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
1039
myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_ROADSIDE_CAPACITY, roadSideCapacity);
1040
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_ONROAD, onRoad);
1041
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WIDTH, width);
1042
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length);
1043
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
1044
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_LEFTHAND, lefthand);
1045
} else {
1046
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1047
}
1048
}
1049
1050
1051
void
1052
AdditionalHandler::parseParkingSpaceAttributes(const SUMOSAXAttributes& attrs) {
1053
// declare Ok Flag
1054
bool parsedOk = true;
1055
// needed attributes
1056
const double x = attrs.get<double>(SUMO_ATTR_X, "", parsedOk);
1057
const double y = attrs.get<double>(SUMO_ATTR_Y, "", parsedOk);
1058
// optional attributes
1059
const double z = attrs.getOpt<double>(SUMO_ATTR_Z, "", parsedOk, 0);
1060
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, "", parsedOk, "");
1061
const std::string width = attrs.getOpt<std::string>(SUMO_ATTR_WIDTH, "", parsedOk, "");
1062
const std::string length = attrs.getOpt<std::string>(SUMO_ATTR_LENGTH, "", parsedOk, "");
1063
const std::string angle = attrs.getOpt<std::string>(SUMO_ATTR_ANGLE, "", parsedOk, "");
1064
const double slope = attrs.getOpt<double>(SUMO_ATTR_SLOPE, "", parsedOk, 0);
1065
// check parent
1066
checkParsedParent(SUMO_TAG_PARKING_SPACE, {SUMO_TAG_PARKING_AREA}, parsedOk);
1067
// continue if flag is ok
1068
if (parsedOk) {
1069
// set tag
1070
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PARKING_SPACE);
1071
// add all attributes
1072
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_X, x);
1073
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_Y, y);
1074
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_Z, z);
1075
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1076
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_WIDTH, width);
1077
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LENGTH, length);
1078
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ANGLE, angle);
1079
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SLOPE, slope);
1080
} else {
1081
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1082
}
1083
}
1084
1085
1086
void
1087
AdditionalHandler::parseE1Attributes(const SUMOSAXAttributes& attrs) {
1088
// declare Ok Flag
1089
bool parsedOk = true;
1090
// needed attributes
1091
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1092
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
1093
const double position = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk);
1094
const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, SUMOTime_MAX_PERIOD);
1095
const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
1096
// optional attributes
1097
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1098
const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
1099
const std::vector<std::string> nextEdges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_NEXT_EDGES, id.c_str(), parsedOk, std::vector<std::string>());
1100
const std::string detectPersons = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, "", parsedOk);
1101
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
1102
// continue if flag is ok
1103
if (parsedOk && checkDetectPersons(SUMO_TAG_E1DETECTOR, id, detectPersons)) {
1104
// set tag
1105
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_E1DETECTOR);
1106
// add all attributes
1107
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1108
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
1109
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
1110
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
1111
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
1112
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1113
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
1114
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges);
1115
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
1116
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
1117
} else {
1118
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1119
}
1120
}
1121
1122
1123
void
1124
AdditionalHandler::parseE2Attributes(const SUMOSAXAttributes& attrs) {
1125
// declare Ok Flag
1126
bool parsedOk = true;
1127
const int positionDef = attrs.hasAttribute(SUMO_ATTR_POSITION) ? 1 : 0;
1128
const int endPosDef = attrs.hasAttribute(SUMO_ATTR_ENDPOS) ? 1 : 0;
1129
const int lengthDef = attrs.hasAttribute(SUMO_ATTR_LENGTH) ? 1 : 0;
1130
// check attributes
1131
if (attrs.hasAttribute(SUMO_ATTR_LANE) && ((positionDef + endPosDef + lengthDef) > 2)) {
1132
writeError(TL("'pos', 'endPos' and 'length' cannot be defined together in a single lane area detector."));
1133
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1134
} else if (attrs.hasAttribute(SUMO_ATTR_LANE) && ((positionDef + endPosDef + lengthDef) < 2)) {
1135
writeError(TL("A single lane area detector requires two parameters of those 'pos', 'endPos' and 'length'."));
1136
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1137
} else {
1138
// needed attributes
1139
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1140
const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
1141
// special attributes
1142
const std::string laneId = attrs.getOpt<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk, "");
1143
const std::vector<std::string> laneIds = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LANES, id.c_str(), parsedOk, std::vector<std::string>());
1144
const double position = attrs.getOpt<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, 0);
1145
const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, 0);
1146
const double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, id.c_str(), parsedOk, 0);
1147
// optional attributes
1148
const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, SUMOTime_MAX_PERIOD);
1149
const std::string trafficLight = attrs.getOpt<std::string>(SUMO_ATTR_TLID, id.c_str(), parsedOk, "");
1150
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1151
const SUMOTime haltingTimeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), parsedOk, TIME2STEPS(1));
1152
const double haltingSpeedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 1.39);
1153
const double jamDistThreshold = attrs.getOpt<double>(SUMO_ATTR_JAM_DIST_THRESHOLD, id.c_str(), parsedOk, 10);
1154
const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
1155
const std::vector<std::string> nextEdges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_NEXT_EDGES, id.c_str(), parsedOk, std::vector<std::string>());
1156
const std::string detectPersons = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, "", parsedOk);
1157
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
1158
const bool show = attrs.getOpt<bool>(SUMO_ATTR_SHOW_DETECTOR, id.c_str(), parsedOk, true);
1159
// continue if flag is ok
1160
if (parsedOk && checkDetectPersons(SUMO_TAG_E2DETECTOR, id, detectPersons)) {
1161
// set tag
1162
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_E2DETECTOR);
1163
// add attributes depending of Lane/Lanes
1164
if (attrs.hasAttribute(SUMO_ATTR_LANE)) {
1165
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
1166
if (positionDef == 0) {
1167
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, endPos - length);
1168
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length);
1169
} else if (endPosDef == 0) {
1170
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
1171
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length);
1172
} else if (lengthDef == 0) {
1173
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
1174
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, endPos - position);
1175
}
1176
} else {
1177
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LANES, laneIds);
1178
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
1179
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
1180
}
1181
// add all attributes
1182
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1183
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
1184
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TLID, trafficLight);
1185
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
1186
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
1187
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges);
1188
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
1189
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1190
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD, haltingTimeThreshold);
1191
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, haltingSpeedThreshold);
1192
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD, jamDistThreshold);
1193
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
1194
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_SHOW_DETECTOR, show);
1195
} else {
1196
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1197
}
1198
}
1199
}
1200
1201
1202
void
1203
AdditionalHandler::parseE3Attributes(const SUMOSAXAttributes& attrs) {
1204
// declare Ok Flag
1205
bool parsedOk = true;
1206
// needed attributes
1207
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1208
const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
1209
const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, SUMOTime_MAX_PERIOD);
1210
// optional attributes
1211
const Position pos = attrs.getOpt<Position>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, Position());
1212
const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
1213
const std::vector<std::string> nextEdges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_NEXT_EDGES, id.c_str(), parsedOk, std::vector<std::string>());
1214
const std::string detectPersons = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, "", parsedOk);
1215
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1216
const SUMOTime haltingTimeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), parsedOk, TIME2STEPS(1));
1217
const double haltingSpeedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 1.39);
1218
const bool openEntry = attrs.getOpt<bool>(SUMO_ATTR_OPEN_ENTRY, id.c_str(), parsedOk, false);
1219
const bool expectedArrival = attrs.getOpt<bool>(SUMO_ATTR_EXPECT_ARRIVAL, id.c_str(), parsedOk, false);
1220
// continue if flag is ok
1221
if (parsedOk && checkDetectPersons(SUMO_TAG_E3DETECTOR, id, detectPersons)) {
1222
// set tag
1223
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_E3DETECTOR);
1224
// add all attributes
1225
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1226
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
1227
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
1228
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos);
1229
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
1230
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges);
1231
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
1232
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1233
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD, haltingTimeThreshold);
1234
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, haltingSpeedThreshold);
1235
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OPEN_ENTRY, openEntry);
1236
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_EXPECT_ARRIVAL, expectedArrival);
1237
} else {
1238
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1239
}
1240
}
1241
1242
1243
void
1244
AdditionalHandler::parseEntryAttributes(const SUMOSAXAttributes& attrs) {
1245
// declare Ok Flag
1246
bool parsedOk = true;
1247
// needed attributes
1248
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, "", parsedOk);
1249
const double position = attrs.get<double>(SUMO_ATTR_POSITION, "", parsedOk);
1250
// optional attributes
1251
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, "", parsedOk, false);
1252
// check parent
1253
checkParsedParent(SUMO_TAG_DET_ENTRY, {SUMO_TAG_E3DETECTOR}, parsedOk);
1254
// continue if flag is ok
1255
if (parsedOk) {
1256
// set tag
1257
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_DET_ENTRY);
1258
// add all attributes
1259
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
1260
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
1261
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
1262
} else {
1263
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1264
}
1265
}
1266
1267
1268
void
1269
AdditionalHandler::parseExitAttributes(const SUMOSAXAttributes& attrs) {
1270
// declare Ok Flag
1271
bool parsedOk = true;
1272
// needed attributes
1273
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, "", parsedOk);
1274
const double position = attrs.get<double>(SUMO_ATTR_POSITION, "", parsedOk);
1275
// optional attributes
1276
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, "", parsedOk, false);
1277
// check parent
1278
checkParsedParent(SUMO_TAG_DET_EXIT, {SUMO_TAG_E3DETECTOR}, parsedOk);
1279
// continue if flag is ok
1280
if (parsedOk) {
1281
// set tag
1282
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_DET_EXIT);
1283
// add all attributes
1284
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
1285
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
1286
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
1287
} else {
1288
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1289
}
1290
}
1291
1292
1293
void
1294
AdditionalHandler::parseE1InstantAttributes(const SUMOSAXAttributes& attrs) {
1295
// declare Ok Flag
1296
bool parsedOk = true;
1297
// needed attributes
1298
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1299
const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
1300
const double position = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk);
1301
const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
1302
// optional attributes
1303
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1304
const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
1305
const std::vector<std::string> nextEdges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_NEXT_EDGES, id.c_str(), parsedOk, std::vector<std::string>());
1306
const std::string detectPersons = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, "", parsedOk);
1307
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
1308
// continue if flag is ok
1309
if (parsedOk && checkDetectPersons(SUMO_TAG_INSTANT_INDUCTION_LOOP, id, detectPersons)) {
1310
// set tag
1311
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_INSTANT_INDUCTION_LOOP);
1312
// add all attributes
1313
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1314
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
1315
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
1316
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
1317
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
1318
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges);
1319
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
1320
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1321
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
1322
} else {
1323
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1324
}
1325
}
1326
1327
1328
void
1329
AdditionalHandler::parseTAZAttributes(const SUMOSAXAttributes& attrs) {
1330
// declare Ok Flag
1331
bool parsedOk = true;
1332
// needed attributes
1333
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1334
// optional attributes
1335
const PositionVector shape = attrs.getOpt<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), parsedOk, PositionVector());
1336
const Position center = attrs.getOpt<Position>(SUMO_ATTR_CENTER, id.c_str(), parsedOk, shape.size() > 0 ? shape.getCentroid() : Position::INVALID);
1337
const bool fill = attrs.getOpt<bool>(SUMO_ATTR_FILL, id.c_str(), parsedOk, false);
1338
const std::vector<std::string> edges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk, std::vector<std::string>());
1339
const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::RED);
1340
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1341
// continue if flag is ok
1342
if (parsedOk) {
1343
// set tag
1344
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TAZ);
1345
// add all attributes
1346
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1347
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shape);
1348
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_CENTER, center);
1349
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FILL, fill);
1350
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
1351
myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
1352
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1353
} else {
1354
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1355
}
1356
}
1357
1358
1359
void
1360
AdditionalHandler::parseTAZSourceAttributes(const SUMOSAXAttributes& attrs) {
1361
// declare Ok Flag
1362
bool parsedOk = true;
1363
// needed attributes
1364
const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1365
const double weight = attrs.get<double>(SUMO_ATTR_WEIGHT, edgeID.c_str(), parsedOk);
1366
// check parent
1367
checkParsedParent(SUMO_TAG_TAZSOURCE, {SUMO_TAG_TAZ}, parsedOk);
1368
// continue if flag is ok
1369
if (parsedOk) {
1370
// set tag
1371
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TAZSOURCE);
1372
// add all attributes
1373
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID);
1374
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WEIGHT, weight);
1375
} else {
1376
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1377
}
1378
}
1379
1380
1381
void
1382
AdditionalHandler::parseTAZSinkAttributes(const SUMOSAXAttributes& attrs) {
1383
// declare Ok Flag
1384
bool parsedOk = true;
1385
// needed attributes
1386
const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1387
const double weight = attrs.get<double>(SUMO_ATTR_WEIGHT, edgeID.c_str(), parsedOk);
1388
// check parent
1389
checkParsedParent(SUMO_TAG_TAZSINK, {SUMO_TAG_TAZ}, parsedOk);
1390
// continue if flag is ok
1391
if (parsedOk) {
1392
// set tag
1393
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TAZSINK);
1394
// add all attributes
1395
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID);
1396
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WEIGHT, weight);
1397
} else {
1398
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1399
}
1400
}
1401
1402
1403
void
1404
AdditionalHandler::parseVariableSpeedSignAttributes(const SUMOSAXAttributes& attrs) {
1405
// declare Ok Flag
1406
bool parsedOk = true;
1407
// needed attributes
1408
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1409
const std::vector<std::string> lanes = attrs.get<std::vector<std::string> >(SUMO_ATTR_LANES, id.c_str(), parsedOk);
1410
// optional attributes
1411
const Position pos = attrs.getOpt<Position>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, Position());
1412
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1413
const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
1414
// continue if flag is ok
1415
if (parsedOk) {
1416
// set tag
1417
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VSS);
1418
// add all attributes
1419
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1420
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LANES, lanes);
1421
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos);
1422
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1423
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
1424
} else {
1425
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1426
}
1427
}
1428
1429
1430
void
1431
AdditionalHandler::parseVariableSpeedSignStepAttributes(const SUMOSAXAttributes& attrs) {
1432
// declare Ok Flag
1433
bool parsedOk = true;
1434
// needed attributes
1435
const SUMOTime time = attrs.getSUMOTimeReporting(SUMO_ATTR_TIME, "", parsedOk);
1436
// optional attributes
1437
const double speed = attrs.getOpt<double>(SUMO_ATTR_SPEED, "", parsedOk, OptionsCont::getOptions().getFloat("default.speed"));
1438
// check parent
1439
checkParsedParent(SUMO_TAG_STEP, {SUMO_TAG_VSS}, parsedOk);
1440
// continue if flag is ok
1441
if (parsedOk) {
1442
// set tag
1443
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_STEP);
1444
// add all attributes
1445
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_TIME, time);
1446
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SPEED, speed);
1447
} else {
1448
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1449
}
1450
}
1451
1452
1453
void
1454
AdditionalHandler::parseCalibratorAttributes(const SUMOSAXAttributes& attrs) {
1455
// declare Ok Flag
1456
bool parsedOk = true;
1457
// check that frecuency and trafficLight aren't defined together
1458
if ((attrs.hasAttribute(SUMO_ATTR_EDGE) && attrs.hasAttribute(SUMO_ATTR_LANE)) ||
1459
(!attrs.hasAttribute(SUMO_ATTR_EDGE) && !attrs.hasAttribute(SUMO_ATTR_LANE))) {
1460
writeError(TL("Calibrators need either an edge or a lane"));
1461
parsedOk = false;
1462
}
1463
// needed attributes
1464
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1465
const double pos = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk);
1466
// special attributes
1467
const std::string edge = attrs.getOpt<std::string>(SUMO_ATTR_EDGE, id.c_str(), parsedOk, "");
1468
const std::string lane = attrs.getOpt<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk, "");
1469
// optional attributes
1470
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1471
const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, DELTA_T);
1472
const std::string routeProbe = attrs.getOpt<std::string>(SUMO_ATTR_ROUTEPROBE, id.c_str(), parsedOk, "");
1473
const double jamThreshold = attrs.getOpt<double>(SUMO_ATTR_JAM_DIST_THRESHOLD, id.c_str(), parsedOk, 0.5);
1474
const std::string output = attrs.getOpt<std::string>(SUMO_ATTR_OUTPUT, id.c_str(), parsedOk, "");
1475
const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
1476
// continue if flag is ok
1477
if (parsedOk) {
1478
// set tag depending of edge/lane
1479
if (attrs.hasAttribute(SUMO_ATTR_EDGE)) {
1480
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CALIBRATOR);
1481
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGE, edge);
1482
} else {
1483
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(GNE_TAG_CALIBRATOR_LANE);
1484
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, lane);
1485
}
1486
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1487
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, pos);
1488
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1489
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
1490
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ROUTEPROBE, routeProbe);
1491
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD, jamThreshold);
1492
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OUTPUT, output);
1493
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
1494
} else {
1495
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1496
}
1497
}
1498
1499
1500
void
1501
AdditionalHandler::parseCalibratorFlowAttributes(const SUMOSAXAttributes& attrs) {
1502
// declare Ok Flag
1503
bool parsedOk = true;
1504
// check parent
1505
if (checkCalibratorFlowParents()) {
1506
// check that frecuency and trafficLight aren't defined together
1507
if (!attrs.hasAttribute(SUMO_ATTR_TYPE) && !attrs.hasAttribute(SUMO_ATTR_VEHSPERHOUR) && !attrs.hasAttribute(SUMO_ATTR_SPEED)) {
1508
writeError(TL("CalibratorFlows need either the attribute vehsPerHour or speed or type (or any combination of these)"));
1509
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1510
} else {
1511
SUMOVehicleParameter* flowParameter = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_FLOW, attrs, false, true, true);
1512
if (flowParameter) {
1513
// set VPH and speed
1514
if (attrs.hasAttribute(SUMO_ATTR_VEHSPERHOUR)) {
1515
flowParameter->repetitionOffset = TIME2STEPS(3600. / attrs.get<double>(SUMO_ATTR_VEHSPERHOUR, "", parsedOk));
1516
flowParameter->parametersSet |= VEHPARS_VPH_SET;
1517
}
1518
if (attrs.hasAttribute(SUMO_ATTR_SPEED)) {
1519
flowParameter->calibratorSpeed = attrs.get<double>(SUMO_ATTR_SPEED, "", parsedOk);
1520
flowParameter->parametersSet |= VEHPARS_CALIBRATORSPEED_SET;
1521
}
1522
// set begin and end
1523
flowParameter->depart = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, "", parsedOk);
1524
flowParameter->repetitionEnd = attrs.getSUMOTimeReporting(SUMO_ATTR_END, "", parsedOk);
1525
if (parsedOk) {
1526
// set tag
1527
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW);
1528
// set vehicle parameters
1529
myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(flowParameter);
1530
// delete flow parameter (because in XMLStructure we have a copy)
1531
delete flowParameter;
1532
} else {
1533
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1534
}
1535
} else {
1536
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1537
}
1538
}
1539
} else {
1540
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1541
}
1542
}
1543
1544
1545
void
1546
AdditionalHandler::parseRerouterAttributes(const SUMOSAXAttributes& attrs) {
1547
// declare Ok Flag
1548
bool parsedOk = true;
1549
// needed attributes
1550
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1551
const std::vector<std::string> edges = attrs.get<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk);
1552
// optional attributes
1553
const Position pos = attrs.getOpt<Position>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, Position::INVALID);
1554
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1555
const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, id.c_str(), parsedOk, 1);
1556
SUMOTime timeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), parsedOk, 0);
1557
const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
1558
const bool off = attrs.getOpt<bool>(SUMO_ATTR_OFF, id.c_str(), parsedOk, false);
1559
const bool optional = attrs.getOpt<bool>(SUMO_ATTR_OPTIONAL, id.c_str(), parsedOk, false);
1560
// check attributes
1561
if (!checkNegative(SUMO_TAG_REROUTER, id, SUMO_ATTR_PROB, probability, true)) {
1562
parsedOk = false;
1563
}
1564
// continue if flag is ok
1565
if (parsedOk) {
1566
// set tag
1567
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_REROUTER);
1568
// add all attributes
1569
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1570
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
1571
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos);
1572
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1573
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
1574
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD, timeThreshold);
1575
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
1576
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OFF, off);
1577
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OPTIONAL, optional);
1578
} else {
1579
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1580
}
1581
}
1582
1583
1584
void
1585
AdditionalHandler::parseRerouterIntervalAttributes(const SUMOSAXAttributes& attrs) {
1586
// declare Ok Flag
1587
bool parsedOk = true;
1588
// needed attributes
1589
const SUMOTime begin = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, "", parsedOk);
1590
const SUMOTime end = attrs.getSUMOTimeReporting(SUMO_ATTR_END, "", parsedOk);
1591
// check parent
1592
checkParsedParent(SUMO_TAG_INTERVAL, {SUMO_TAG_REROUTER}, parsedOk);
1593
// continue if flag is ok
1594
if (parsedOk) {
1595
// set tag
1596
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_INTERVAL);
1597
// add all attributes
1598
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
1599
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
1600
} else {
1601
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1602
}
1603
}
1604
1605
1606
void
1607
AdditionalHandler::parseClosingLaneRerouteAttributes(const SUMOSAXAttributes& attrs) {
1608
// declare Ok Flag
1609
bool parsedOk = true;
1610
// needed attributes
1611
const std::string laneID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1612
// optional attributes
1613
const std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, "", parsedOk, "");
1614
const std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, "", parsedOk, !disallow.size() ? "authority" : "");
1615
// check parent
1616
checkParsedParent(SUMO_TAG_CLOSING_LANE_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
1617
// continue if flag is ok
1618
if (parsedOk) {
1619
// set tag
1620
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CLOSING_LANE_REROUTE);
1621
// add all attributes
1622
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, laneID);
1623
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ALLOW, allow);
1624
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DISALLOW, disallow);
1625
} else {
1626
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1627
}
1628
}
1629
1630
1631
void
1632
AdditionalHandler::parseClosingRerouteAttributes(const SUMOSAXAttributes& attrs) {
1633
// declare Ok Flag
1634
bool parsedOk = true;
1635
// needed attributes
1636
const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1637
// optional attributes
1638
const std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, "", parsedOk, "");
1639
const std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, "", parsedOk, "");
1640
// check parent
1641
checkParsedParent(SUMO_TAG_CLOSING_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
1642
// continue if flag is ok
1643
if (parsedOk) {
1644
// set tag
1645
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CLOSING_REROUTE);
1646
// add all attributes
1647
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID);
1648
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ALLOW, allow);
1649
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DISALLOW, disallow);
1650
} else {
1651
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1652
}
1653
}
1654
1655
1656
void
1657
AdditionalHandler::parseDestProbRerouteAttributes(const SUMOSAXAttributes& attrs) {
1658
// declare Ok Flag
1659
bool parsedOk = true;
1660
// needed attributes
1661
const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1662
const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, "", parsedOk, 1);
1663
// check attributes
1664
if (!checkNegative(SUMO_TAG_DEST_PROB_REROUTE, edgeID, SUMO_ATTR_PROB, probability, true)) {
1665
parsedOk = false;
1666
}
1667
// check parent
1668
checkParsedParent(SUMO_TAG_DEST_PROB_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
1669
// continue if flag is ok
1670
if (parsedOk) {
1671
// set tag
1672
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_DEST_PROB_REROUTE);
1673
// add all attributes
1674
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID);
1675
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
1676
} else {
1677
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1678
}
1679
}
1680
1681
1682
void
1683
AdditionalHandler::parseParkingAreaRerouteAttributes(const SUMOSAXAttributes& attrs) {
1684
// declare Ok Flag
1685
bool parsedOk = true;
1686
// needed attributes
1687
const std::string parkingAreaID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1688
const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, "", parsedOk, 1);
1689
// check attributes
1690
if (!checkNegative(SUMO_TAG_PARKING_AREA_REROUTE, parkingAreaID, SUMO_ATTR_PROB, probability, true)) {
1691
parsedOk = false;
1692
}
1693
// optional attributes
1694
const bool visible = attrs.getOpt<bool>(SUMO_ATTR_VISIBLE, "", parsedOk, false);
1695
// check parent
1696
checkParsedParent(SUMO_TAG_PARKING_AREA_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
1697
// continue if flag is ok
1698
if (parsedOk) {
1699
// set tag
1700
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PARKING_AREA_REROUTE);
1701
// add all attributes
1702
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, parkingAreaID);
1703
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
1704
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_VISIBLE, visible);
1705
} else {
1706
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1707
}
1708
}
1709
1710
1711
void
1712
AdditionalHandler::parseRouteProbRerouteAttributes(const SUMOSAXAttributes& attrs) {
1713
// declare Ok Flag
1714
bool parsedOk = true;
1715
// needed attributes
1716
const std::string routeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1717
const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, "", parsedOk, 1);
1718
// check attributes
1719
if (!checkNegative(SUMO_TAG_ROUTE_PROB_REROUTE, routeID, SUMO_ATTR_PROB, probability, true)) {
1720
parsedOk = false;
1721
}
1722
// check parent
1723
checkParsedParent(SUMO_TAG_ROUTE_PROB_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
1724
// continue if flag is ok
1725
if (parsedOk) {
1726
// set tag
1727
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE_PROB_REROUTE);
1728
// add all attributes
1729
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, routeID);
1730
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
1731
} else {
1732
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1733
}
1734
}
1735
1736
1737
void
1738
AdditionalHandler::parseRouteProbeAttributes(const SUMOSAXAttributes& attrs) {
1739
// declare Ok Flag
1740
bool parsedOk = true;
1741
// needed attributes
1742
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1743
const std::string edge = attrs.get<std::string>(SUMO_ATTR_EDGE, id.c_str(), parsedOk);
1744
const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
1745
const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, SUMOTime_MAX_PERIOD);
1746
const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), parsedOk, -1);
1747
// optional attributes
1748
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1749
const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
1750
// continue if flag is ok
1751
if (parsedOk) {
1752
// set tag
1753
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTEPROBE);
1754
// add all attributes
1755
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1756
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGE, edge);
1757
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
1758
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
1759
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1760
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
1761
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
1762
} else {
1763
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1764
}
1765
}
1766
1767
1768
void
1769
AdditionalHandler::parseVaporizerAttributes(const SUMOSAXAttributes& attrs) {
1770
// declare Ok Flag
1771
bool parsedOk = true;
1772
// needed attributes
1773
const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1774
SUMOTime begin = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, nullptr, parsedOk);
1775
SUMOTime end = attrs.getSUMOTimeReporting(SUMO_ATTR_END, nullptr, parsedOk);
1776
// optional attributes
1777
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, edgeID.c_str(), parsedOk, "");
1778
// continue if flag is ok
1779
if (parsedOk) {
1780
// set tag
1781
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VAPORIZER);
1782
// add all attributes
1783
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGE, edgeID);
1784
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
1785
myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
1786
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1787
} else {
1788
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1789
}
1790
}
1791
1792
1793
void
1794
AdditionalHandler::parseTractionSubstation(const SUMOSAXAttributes& attrs) {
1795
// declare Ok Flag
1796
bool parsedOk = true;
1797
// needed attributes
1798
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1799
// optional attributes
1800
const Position pos = attrs.getOpt<Position>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, Position::INVALID);
1801
const double voltage = attrs.getOpt<double>(SUMO_ATTR_VOLTAGE, id.c_str(), parsedOk, 600);
1802
const double currentLimit = attrs.getOpt<double>(SUMO_ATTR_CURRENTLIMIT, id.c_str(), parsedOk, 400);
1803
// continue if flag is ok
1804
if (parsedOk) {
1805
// set tag
1806
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRACTION_SUBSTATION);
1807
// add all attributes
1808
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1809
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos);
1810
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_VOLTAGE, voltage);
1811
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_CURRENTLIMIT, currentLimit);
1812
} else {
1813
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1814
}
1815
}
1816
1817
1818
void
1819
AdditionalHandler::parseOverheadWire(const SUMOSAXAttributes& attrs) {
1820
// declare Ok Flag
1821
bool parsedOk = true;
1822
// needed attributes
1823
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1824
const std::string substationID = attrs.get<std::string>(SUMO_ATTR_SUBSTATIONID, id.c_str(), parsedOk);
1825
const std::vector<std::string> laneIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_LANES, id.c_str(), parsedOk);
1826
// optional attributes
1827
const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, 0);
1828
const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
1829
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
1830
const std::vector<std::string> forbiddenInnerLanes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_OVERHEAD_WIRE_FORBIDDEN, "", parsedOk);
1831
// continue if flag is ok
1832
if (parsedOk) {
1833
// set tag
1834
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_OVERHEAD_WIRE_SECTION);
1835
// add all attributes
1836
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1837
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_SUBSTATIONID, substationID);
1838
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LANES, laneIDs);
1839
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
1840
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
1841
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
1842
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_OVERHEAD_WIRE_FORBIDDEN, forbiddenInnerLanes);
1843
} else {
1844
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1845
}
1846
}
1847
1848
1849
void
1850
AdditionalHandler::parseOverheadWireClamp(const SUMOSAXAttributes& attrs) {
1851
// declare Ok Flag
1852
bool parsedOk = true;
1853
// needed attributes
1854
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1855
const std::string substationId = attrs.get<std::string>(SUMO_ATTR_SUBSTATIONID, id.c_str(), parsedOk);
1856
const std::string wireClampStart = attrs.get<std::string>(SUMO_ATTR_OVERHEAD_WIRECLAMP_START, id.c_str(), parsedOk);
1857
const std::string wireClampLaneStart = attrs.get<std::string>(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANESTART, id.c_str(), parsedOk);
1858
const std::string wireClampEnd = attrs.get<std::string>(SUMO_ATTR_OVERHEAD_WIRECLAMP_END, id.c_str(), parsedOk);
1859
const std::string wireClampLaneEnd = attrs.get<std::string>(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANEEND, id.c_str(), parsedOk);
1860
// continue if flag is ok
1861
if (parsedOk) {
1862
// set tag
1863
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_OVERHEAD_WIRE_CLAMP);
1864
// add all attributes
1865
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1866
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_SUBSTATIONID, substationId);
1867
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_START, wireClampStart);
1868
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANESTART, wireClampLaneStart);
1869
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_END, wireClampEnd);
1870
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANEEND, wireClampLaneEnd);
1871
} else {
1872
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1873
}
1874
}
1875
1876
1877
void
1878
AdditionalHandler::parsePolyAttributes(const SUMOSAXAttributes& attrs) {
1879
// declare Ok Flag
1880
bool parsedOk = true;
1881
// needed attributes
1882
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1883
const PositionVector shapeStr = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), parsedOk);
1884
// optional attributes
1885
const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::RED);
1886
const bool geo = attrs.getOpt<bool>(SUMO_ATTR_GEO, id.c_str(), parsedOk, false);
1887
const bool fill = attrs.getOpt<bool>(SUMO_ATTR_FILL, id.c_str(), parsedOk, false);
1888
const double lineWidth = attrs.getOpt<double>(SUMO_ATTR_LINEWIDTH, id.c_str(), parsedOk, Shape::DEFAULT_LINEWIDTH);
1889
const double layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, id.c_str(), parsedOk, Shape::DEFAULT_LAYER);
1890
const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), parsedOk, Shape::DEFAULT_TYPE);
1891
const std::string imgFile = attrs.getOpt<std::string>(SUMO_ATTR_IMGFILE, id.c_str(), parsedOk, Shape::DEFAULT_IMG_FILE);
1892
const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, Shape::DEFAULT_ANGLE);
1893
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1894
// continue if flag is ok
1895
if (parsedOk) {
1896
// set tag
1897
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_POLY);
1898
// add all attributes
1899
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1900
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shapeStr);
1901
myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
1902
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_GEO, geo);
1903
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FILL, fill);
1904
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LINEWIDTH, lineWidth);
1905
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LAYER, layer);
1906
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TYPE, type);
1907
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_IMGFILE, imgFile);
1908
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
1909
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1910
} else {
1911
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1912
}
1913
}
1914
1915
1916
void
1917
AdditionalHandler::parsePOIAttributes(const SUMOSAXAttributes& attrs) {
1918
// declare Ok Flag
1919
bool parsedOk = true;
1920
// check that x and y are defined together
1921
if ((attrs.hasAttribute(SUMO_ATTR_X) && !attrs.hasAttribute(SUMO_ATTR_Y)) ||
1922
(!attrs.hasAttribute(SUMO_ATTR_X) && attrs.hasAttribute(SUMO_ATTR_Y))) {
1923
writeError(TL("X and Y must be be defined together in POIs"));
1924
parsedOk = false;
1925
}
1926
// check that lane and pos are defined together
1927
if ((attrs.hasAttribute(SUMO_ATTR_LANE) && !attrs.hasAttribute(SUMO_ATTR_POSITION)) ||
1928
(!attrs.hasAttribute(SUMO_ATTR_LANE) && attrs.hasAttribute(SUMO_ATTR_POSITION))) {
1929
writeError(TL("lane and position must be defined together in POIs"));
1930
parsedOk = false;
1931
}
1932
// check that lon and lat are defined together
1933
if ((attrs.hasAttribute(SUMO_ATTR_LON) && !attrs.hasAttribute(SUMO_ATTR_LAT)) ||
1934
(!attrs.hasAttribute(SUMO_ATTR_LON) && attrs.hasAttribute(SUMO_ATTR_LAT))) {
1935
writeError(TL("lon and lat must be be defined together in POIs"));
1936
parsedOk = false;
1937
}
1938
// needed attributes
1939
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
1940
// special attributes
1941
const double x = attrs.getOpt<double>(SUMO_ATTR_X, id.c_str(), parsedOk, 0);
1942
const double y = attrs.getOpt<double>(SUMO_ATTR_Y, id.c_str(), parsedOk, 0);
1943
const std::string lane = attrs.getOpt<std::string>(SUMO_ATTR_LANE, "", parsedOk, "");
1944
const double pos = attrs.getOpt<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, 0);
1945
const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
1946
const double posLat = attrs.getOpt<double>(SUMO_ATTR_POSITION_LAT, id.c_str(), parsedOk, 0);
1947
const double lon = attrs.getOpt<double>(SUMO_ATTR_LON, id.c_str(), parsedOk, 0);
1948
const double lat = attrs.getOpt<double>(SUMO_ATTR_LAT, id.c_str(), parsedOk, 0);
1949
// optional attributes
1950
const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::RED);
1951
const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, "", parsedOk, Shape::DEFAULT_TYPE);
1952
std::string icon = attrs.getOpt<std::string>(SUMO_ATTR_ICON, "", parsedOk, SUMOXMLDefinitions::POIIcons.getString(POIIcon::NONE));
1953
const double layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, id.c_str(), parsedOk, Shape::DEFAULT_LAYER_POI);
1954
const std::string imgFile = attrs.getOpt<std::string>(SUMO_ATTR_IMGFILE, "", parsedOk, Shape::DEFAULT_IMG_FILE);
1955
const double width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, id.c_str(), parsedOk, Shape::DEFAULT_IMG_WIDTH);
1956
const double height = attrs.getOpt<double>(SUMO_ATTR_HEIGHT, id.c_str(), parsedOk, Shape::DEFAULT_IMG_HEIGHT);
1957
const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, Shape::DEFAULT_ANGLE);
1958
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
1959
// check icon
1960
if (!SUMOXMLDefinitions::POIIcons.hasString(icon)) {
1961
WRITE_WARNING(TLF("Invalid icon % for POI '%', using default", icon, id));
1962
icon = "none";
1963
}
1964
// continue if flag is ok
1965
if (parsedOk) {
1966
// set tag
1967
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_POI);
1968
// add attributes depending of Lane/Lanes
1969
if (attrs.hasAttribute(SUMO_ATTR_X) && attrs.hasAttribute(SUMO_ATTR_Y)) {
1970
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_X, x);
1971
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_Y, y);
1972
} else if (attrs.hasAttribute(SUMO_ATTR_LANE) && attrs.hasAttribute(SUMO_ATTR_POSITION)) {
1973
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, lane);
1974
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, pos);
1975
myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
1976
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION_LAT, posLat);
1977
} else {
1978
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LON, lon);
1979
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LAT, lat);
1980
}
1981
// add rest attributes
1982
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
1983
myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
1984
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TYPE, type);
1985
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ICON, icon);
1986
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LAYER, layer);
1987
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_IMGFILE, imgFile);
1988
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WIDTH, width);
1989
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HEIGHT, height);
1990
myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
1991
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
1992
} else {
1993
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
1994
}
1995
}
1996
1997
1998
void
1999
AdditionalHandler::parseJpsWalkableAreaAttributes(const SUMOSAXAttributes& attrs) {
2000
// declare Ok Flag
2001
bool parsedOk = true;
2002
// needed attributes
2003
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
2004
const PositionVector shapeStr = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), parsedOk);
2005
// optional attributes
2006
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
2007
// continue if flag is ok
2008
if (parsedOk) {
2009
// set tag
2010
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(GNE_TAG_JPS_WALKABLEAREA);
2011
// add all attributes
2012
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
2013
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shapeStr);
2014
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
2015
} else {
2016
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
2017
}
2018
}
2019
2020
2021
void
2022
AdditionalHandler::parseJpsObstacleAttributes(const SUMOSAXAttributes& attrs) {
2023
// declare Ok Flag
2024
bool parsedOk = true;
2025
// needed attributes
2026
const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
2027
const PositionVector shapeStr = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), parsedOk);
2028
// optional attributes
2029
const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
2030
// continue if flag is ok
2031
if (parsedOk) {
2032
// set tag
2033
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(GNE_TAG_JPS_OBSTACLE);
2034
// add all attributes
2035
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
2036
myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shapeStr);
2037
myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
2038
} else {
2039
myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
2040
}
2041
}
2042
2043
2044
bool
2045
AdditionalHandler::checkCalibratorFlowParents() {
2046
const auto parentCalibrator = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject();
2047
if (parentCalibrator == nullptr) {
2048
return false;
2049
}
2050
const auto parentRootFile = parentCalibrator->getParentSumoBaseObject();
2051
if (parentRootFile != nullptr) {
2052
return false;
2053
}
2054
if ((parentCalibrator->getTag() == SUMO_TAG_CALIBRATOR) || (parentCalibrator->getTag() == GNE_TAG_CALIBRATOR_LANE)) {
2055
return true;
2056
} else {
2057
return writeError(TLF("Calibrator Flows have to be defined within a %.", toString(SUMO_TAG_CALIBRATOR)));
2058
}
2059
}
2060
2061
2062
bool
2063
AdditionalHandler::checkDetectPersons(const SumoXMLTag currentTag, const std::string& id, const std::string& detectPersons) {
2064
if (detectPersons.empty() || SUMOXMLDefinitions::PersonModeValues.hasString(detectPersons)) {
2065
return true;
2066
} else {
2067
writeError(TLF("Attribute '%' defined in % with id '%' doesn't have a valid value (given '%').", toString(SUMO_ATTR_DETECT_PERSONS), toString(currentTag), id, detectPersons));
2068
return false;
2069
}
2070
}
2071
2072
/****************************************************************************/
2073
2074