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