LCOV - code coverage report
Current view: top level - src/utils/handlers - AdditionalHandler.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 0.0 % 1081 0
Test Date: 2025-12-06 15:35:27 Functions: 0.0 % 44 0

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    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(const std::string& filename) :
      38            0 :     CommonHandler(filename) {
      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            0 :                                  obj->getParameters())) {
     712            0 :                     obj->markAsCreated();
     713              :                 }
     714              :                 break;
     715              :             // POI
     716            0 :             case SUMO_TAG_POI:
     717              :                 // check if we want to create a POI, POILane or POIGEO
     718            0 :                 if (obj->hasDoubleAttribute(SUMO_ATTR_X)) {
     719              :                     // build POI over view
     720            0 :                     if (buildPOI(obj,
     721              :                                  obj->getStringAttribute(SUMO_ATTR_ID),
     722              :                                  obj->getStringAttribute(SUMO_ATTR_TYPE),
     723              :                                  obj->getColorAttribute(SUMO_ATTR_COLOR),
     724              :                                  obj->getDoubleAttribute(SUMO_ATTR_X),
     725              :                                  obj->getDoubleAttribute(SUMO_ATTR_Y),
     726              :                                  obj->getStringAttribute(SUMO_ATTR_ICON),
     727              :                                  obj->getDoubleAttribute(SUMO_ATTR_LAYER),
     728              :                                  obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
     729              :                                  obj->getStringAttribute(SUMO_ATTR_IMGFILE),
     730              :                                  obj->getDoubleAttribute(SUMO_ATTR_WIDTH),
     731              :                                  obj->getDoubleAttribute(SUMO_ATTR_HEIGHT),
     732              :                                  obj->getStringAttribute(SUMO_ATTR_NAME),
     733            0 :                                  obj->getParameters())) {
     734            0 :                         obj->markAsCreated();
     735              :                     }
     736            0 :                 } else if (obj->hasStringAttribute(SUMO_ATTR_LANE)) {
     737              :                     // build POI over Lane
     738            0 :                     if (buildPOILane(obj,
     739              :                                      obj->getStringAttribute(SUMO_ATTR_ID),
     740              :                                      obj->getStringAttribute(SUMO_ATTR_TYPE),
     741              :                                      obj->getColorAttribute(SUMO_ATTR_COLOR),
     742              :                                      obj->getStringAttribute(SUMO_ATTR_LANE),
     743              :                                      obj->getDoubleAttribute(SUMO_ATTR_POSITION),
     744            0 :                                      obj->getBoolAttribute(SUMO_ATTR_FRIENDLY_POS),
     745              :                                      obj->getDoubleAttribute(SUMO_ATTR_POSITION_LAT),
     746              :                                      obj->getStringAttribute(SUMO_ATTR_ICON),
     747              :                                      obj->getDoubleAttribute(SUMO_ATTR_LAYER),
     748              :                                      obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
     749              :                                      obj->getStringAttribute(SUMO_ATTR_IMGFILE),
     750              :                                      obj->getDoubleAttribute(SUMO_ATTR_WIDTH),
     751              :                                      obj->getDoubleAttribute(SUMO_ATTR_HEIGHT),
     752              :                                      obj->getStringAttribute(SUMO_ATTR_NAME),
     753            0 :                                      obj->getParameters())) {
     754            0 :                         obj->markAsCreated();
     755              :                     }
     756              :                 } else {
     757              :                     // build POIGEO over view
     758            0 :                     if (buildPOIGeo(obj,
     759              :                                     obj->getStringAttribute(SUMO_ATTR_ID),
     760              :                                     obj->getStringAttribute(SUMO_ATTR_TYPE),
     761              :                                     obj->getColorAttribute(SUMO_ATTR_COLOR),
     762              :                                     obj->getDoubleAttribute(SUMO_ATTR_LON),
     763              :                                     obj->getDoubleAttribute(SUMO_ATTR_LAT),
     764              :                                     obj->getStringAttribute(SUMO_ATTR_ICON),
     765              :                                     obj->getDoubleAttribute(SUMO_ATTR_LAYER),
     766              :                                     obj->getDoubleAttribute(SUMO_ATTR_ANGLE),
     767              :                                     obj->getStringAttribute(SUMO_ATTR_IMGFILE),
     768              :                                     obj->getDoubleAttribute(SUMO_ATTR_WIDTH),
     769              :                                     obj->getDoubleAttribute(SUMO_ATTR_HEIGHT),
     770              :                                     obj->getStringAttribute(SUMO_ATTR_NAME),
     771            0 :                                     obj->getParameters())) {
     772            0 :                         obj->markAsCreated();
     773              :                     }
     774              :                 }
     775              :                 break;
     776              :             // Jps WalkableArea
     777            0 :             case GNE_TAG_JPS_WALKABLEAREA:
     778            0 :                 if (buildJpsWalkableArea(obj,
     779              :                                          obj->getStringAttribute(SUMO_ATTR_ID),
     780              :                                          obj->getPositionVectorAttribute(SUMO_ATTR_SHAPE),
     781            0 :                                          obj->getBoolAttribute(SUMO_ATTR_GEO),
     782              :                                          obj->getStringAttribute(SUMO_ATTR_NAME),
     783            0 :                                          obj->getParameters())) {
     784            0 :                     obj->markAsCreated();
     785              :                 }
     786              :                 break;
     787              :             // Jps Obstacle
     788            0 :             case GNE_TAG_JPS_OBSTACLE:
     789            0 :                 if (buildJpsObstacle(obj,
     790              :                                      obj->getStringAttribute(SUMO_ATTR_ID),
     791              :                                      obj->getPositionVectorAttribute(SUMO_ATTR_SHAPE),
     792            0 :                                      obj->getBoolAttribute(SUMO_ATTR_GEO),
     793              :                                      obj->getStringAttribute(SUMO_ATTR_NAME),
     794            0 :                                      obj->getParameters())) {
     795            0 :                     obj->markAsCreated();
     796              :                 }
     797              :                 break;
     798              :             default:
     799              :                 break;
     800              :         }
     801              :         // now iterate over childrens
     802            0 :         for (const auto& child : obj->getSumoBaseObjectChildren()) {
     803              :             // call this function recursively
     804            0 :             parseSumoBaseObject(child);
     805              :         }
     806              :     }
     807            0 : }
     808              : 
     809              : 
     810              : void
     811            0 : AdditionalHandler::parseBusStopAttributes(const SUMOSAXAttributes& attrs) {
     812              :     // declare Ok Flag
     813            0 :     bool parsedOk = true;
     814              :     // needed attributes
     815            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
     816            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
     817              :     // optional attributes
     818            0 :     const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
     819            0 :     const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
     820            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
     821            0 :     const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, id.c_str(), parsedOk, std::vector<std::string>());
     822            0 :     const int personCapacity = attrs.getOpt<int>(SUMO_ATTR_PERSON_CAPACITY, id.c_str(), parsedOk, 6);
     823            0 :     const double parkingLength = attrs.getOpt<double>(SUMO_ATTR_PARKING_LENGTH, id.c_str(), parsedOk, 0);
     824            0 :     const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::INVISIBLE);
     825            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
     826            0 :     const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, 0);
     827              :     // continue if flag is ok
     828            0 :     if (parsedOk) {
     829              :         // set tag
     830            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_BUS_STOP);
     831              :         // add all attributes
     832            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
     833            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
     834            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
     835            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
     836            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
     837            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
     838            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_PERSON_CAPACITY, personCapacity);
     839            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength);
     840            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
     841            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
     842            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
     843              :     } else {
     844            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
     845              :     }
     846            0 : }
     847              : 
     848              : 
     849              : void
     850            0 : AdditionalHandler::parseTrainStopAttributes(const SUMOSAXAttributes& attrs) {
     851              :     // declare Ok Flag
     852            0 :     bool parsedOk = true;
     853              :     // needed attributes
     854            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
     855            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
     856              :     // optional attributes
     857            0 :     const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
     858            0 :     const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
     859            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
     860            0 :     const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, id.c_str(), parsedOk, std::vector<std::string>());
     861            0 :     const int personCapacity = attrs.getOpt<int>(SUMO_ATTR_PERSON_CAPACITY, id.c_str(), parsedOk, 6);
     862            0 :     const double parkingLength = attrs.getOpt<double>(SUMO_ATTR_PARKING_LENGTH, id.c_str(), parsedOk, 0);
     863            0 :     const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::INVISIBLE);
     864            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
     865            0 :     const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, 0);
     866              :     // continue if flag is ok
     867            0 :     if (parsedOk) {
     868              :         // set tag
     869            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRAIN_STOP);
     870              :         // add all attributes
     871            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
     872            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
     873            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
     874            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
     875            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
     876            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
     877            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_PERSON_CAPACITY, personCapacity);
     878            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength);
     879            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
     880            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
     881            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
     882              :     } else {
     883            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
     884              :     }
     885            0 : }
     886              : 
     887              : 
     888              : void
     889            0 : AdditionalHandler::parseAccessAttributes(const SUMOSAXAttributes& attrs) {
     890              :     // declare Ok Flag
     891            0 :     bool parsedOk = true;
     892              :     // needed attributes
     893            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, "", parsedOk);
     894            0 :     const std::string position = attrs.get<std::string>(SUMO_ATTR_POSITION, "", parsedOk);
     895              :     // optional attributes
     896            0 :     const double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, "", parsedOk, -1.00, false); /* in future updates, INVALID_DOUBLE */
     897            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, "", parsedOk, false);
     898              :     // check parent
     899            0 :     checkParsedParent(SUMO_TAG_ACCESS, {SUMO_TAG_BUS_STOP, SUMO_TAG_TRAIN_STOP, SUMO_TAG_CONTAINER_STOP}, parsedOk);
     900              :     // continue if flag is ok
     901            0 :     if (parsedOk) {
     902              :         // set tag
     903            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ACCESS);
     904              :         // add all attributes
     905            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
     906            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_POSITION, position);
     907            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length);
     908            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
     909              :     } else {
     910            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
     911              :     }
     912            0 : }
     913              : 
     914              : 
     915              : void
     916            0 : AdditionalHandler::parseContainerStopAttributes(const SUMOSAXAttributes& attrs) {
     917              :     // declare Ok Flag
     918            0 :     bool parsedOk = true;
     919              :     // needed attributes
     920            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
     921            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
     922              :     // optional attributes
     923            0 :     const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
     924            0 :     const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
     925            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
     926            0 :     const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, id.c_str(), parsedOk, std::vector<std::string>());
     927            0 :     const int containerCapacity = attrs.getOpt<int>(SUMO_ATTR_CONTAINER_CAPACITY, id.c_str(), parsedOk, 6);
     928            0 :     const double parkingLength = attrs.getOpt<double>(SUMO_ATTR_PARKING_LENGTH, id.c_str(), parsedOk, 0);
     929            0 :     const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::INVISIBLE);
     930            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
     931            0 :     const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, 0);
     932              :     // continue if flag is ok
     933            0 :     if (parsedOk) {
     934              :         // set tag
     935            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CONTAINER_STOP);
     936              :         // add all attributes
     937            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
     938            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
     939            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
     940            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
     941            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
     942            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
     943            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_CONTAINER_CAPACITY, containerCapacity);
     944            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PARKING_LENGTH, parkingLength);
     945            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
     946            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
     947            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
     948              :     } else {
     949            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
     950              :     }
     951            0 : }
     952              : 
     953              : 
     954              : void
     955            0 : AdditionalHandler::parseChargingStationAttributes(const SUMOSAXAttributes& attrs) {
     956              :     // declare Ok Flag
     957            0 :     bool parsedOk = true;
     958              :     // needed attributes
     959            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
     960            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
     961              :     // optional attributes
     962            0 :     const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
     963            0 :     const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
     964            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
     965            0 :     const std::vector<std::string> lines = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LINES, id.c_str(), parsedOk, std::vector<std::string>());
     966            0 :     const double chargingPower = attrs.getOpt<double>(SUMO_ATTR_CHARGINGPOWER, id.c_str(), parsedOk, 22000);
     967            0 :     const double totalPower = attrs.getOpt<double>(SUMO_ATTR_TOTALPOWER, id.c_str(), parsedOk, 0);
     968            0 :     const double efficiency = attrs.getOpt<double>(SUMO_ATTR_EFFICIENCY, id.c_str(), parsedOk, 0.95);
     969            0 :     const bool chargeInTransit = attrs.getOpt<bool>(SUMO_ATTR_CHARGEINTRANSIT, id.c_str(), parsedOk, 0);
     970            0 :     const SUMOTime chargeDelay = attrs.getOptSUMOTimeReporting(SUMO_ATTR_CHARGEDELAY, id.c_str(), parsedOk, 0);
     971            0 :     const std::string chargeType = attrs.getOpt<std::string>(SUMO_ATTR_CHARGETYPE, id.c_str(), parsedOk, SUMOXMLDefinitions::ChargeTypes.getString(ChargeType::NORMAL));
     972            0 :     const SUMOTime waitingTime = attrs.getOptSUMOTimeReporting(SUMO_ATTR_WAITINGTIME, id.c_str(), parsedOk, TIME2STEPS(900));
     973            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
     974            0 :     const std::string parkingAreaID = attrs.getOpt<std::string>(SUMO_ATTR_PARKING_AREA, id.c_str(), parsedOk, "");
     975              :     // check charge type
     976            0 :     if ((chargeType != "normal") && (chargeType != "battery-exchange") && (chargeType != "fuel")) {
     977            0 :         writeError(TLF("Invalid charge type '%' defined in chargingStation '%'.", chargeType, id));
     978            0 :         parsedOk = false;
     979              :     }
     980              :     // continue if flag is ok
     981            0 :     if (parsedOk) {
     982              :         // set tag
     983            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CHARGING_STATION);
     984              :         // add all attributes
     985            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
     986            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
     987            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
     988            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
     989            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
     990            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LINES, lines);
     991            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_CHARGINGPOWER, chargingPower);
     992            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_TOTALPOWER, totalPower);
     993            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_EFFICIENCY, efficiency);
     994            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_CHARGEINTRANSIT, chargeInTransit);
     995            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_CHARGEDELAY, chargeDelay);
     996            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_CHARGETYPE, chargeType);
     997            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_WAITINGTIME, waitingTime);
     998            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
     999            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_PARKING_AREA, parkingAreaID);
    1000              :     } else {
    1001            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1002              :     }
    1003            0 : }
    1004              : 
    1005              : 
    1006              : void
    1007            0 : AdditionalHandler::parseParkingAreaAttributes(const SUMOSAXAttributes& attrs) {
    1008              :     // declare Ok Flag
    1009            0 :     bool parsedOk = true;
    1010              :     // needed attributes
    1011            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1012            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
    1013              :     // optional attributes
    1014            0 :     const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
    1015            0 :     const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
    1016            0 :     const std::string departPos = attrs.getOpt<std::string>(SUMO_ATTR_DEPARTPOS, id.c_str(), parsedOk, "");
    1017            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1018            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>());
    1019            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
    1020            0 :     const int roadSideCapacity = attrs.getOpt<int>(SUMO_ATTR_ROADSIDE_CAPACITY, id.c_str(), parsedOk, 0);
    1021            0 :     const bool onRoad = attrs.getOpt<bool>(SUMO_ATTR_ONROAD, id.c_str(), parsedOk, false);
    1022            0 :     const double width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, id.c_str(), parsedOk, 0);
    1023            0 :     const double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, id.c_str(), parsedOk, 0);
    1024            0 :     const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, 0);
    1025            0 :     const bool lefthand = attrs.getOpt<bool>(SUMO_ATTR_LEFTHAND, id.c_str(), parsedOk, false);
    1026              :     // continue if flag is ok
    1027            0 :     if (parsedOk) {
    1028              :         // set tag
    1029            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PARKING_AREA);
    1030              :         // add all attributes
    1031            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1032            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
    1033            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
    1034            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
    1035            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DEPARTPOS, departPos);
    1036            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1037            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_ACCEPTED_BADGES, badges);
    1038            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
    1039            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addIntAttribute(SUMO_ATTR_ROADSIDE_CAPACITY, roadSideCapacity);
    1040            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_ONROAD, onRoad);
    1041            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WIDTH, width);
    1042            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length);
    1043            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
    1044            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_LEFTHAND, lefthand);
    1045              :     } else {
    1046            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1047              :     }
    1048            0 : }
    1049              : 
    1050              : 
    1051              : void
    1052            0 : AdditionalHandler::parseParkingSpaceAttributes(const SUMOSAXAttributes& attrs) {
    1053              :     // declare Ok Flag
    1054            0 :     bool parsedOk = true;
    1055              :     // needed attributes
    1056            0 :     const double x = attrs.get<double>(SUMO_ATTR_X, "", parsedOk);
    1057            0 :     const double y = attrs.get<double>(SUMO_ATTR_Y, "", parsedOk);
    1058              :     // optional attributes
    1059            0 :     const double z = attrs.getOpt<double>(SUMO_ATTR_Z, "", parsedOk, 0);
    1060            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, "", parsedOk, "");
    1061            0 :     const std::string width = attrs.getOpt<std::string>(SUMO_ATTR_WIDTH, "", parsedOk, "");
    1062            0 :     const std::string length = attrs.getOpt<std::string>(SUMO_ATTR_LENGTH, "", parsedOk, "");
    1063            0 :     const std::string angle = attrs.getOpt<std::string>(SUMO_ATTR_ANGLE, "", parsedOk, "");
    1064            0 :     const double slope = attrs.getOpt<double>(SUMO_ATTR_SLOPE, "", parsedOk, 0);
    1065              :     // check parent
    1066            0 :     checkParsedParent(SUMO_TAG_PARKING_SPACE, {SUMO_TAG_PARKING_AREA}, parsedOk);
    1067              :     // continue if flag is ok
    1068            0 :     if (parsedOk) {
    1069              :         // set tag
    1070            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PARKING_SPACE);
    1071              :         // add all attributes
    1072            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_X, x);
    1073            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_Y, y);
    1074            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_Z, z);
    1075            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1076            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_WIDTH, width);
    1077            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LENGTH, length);
    1078            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ANGLE, angle);
    1079            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SLOPE, slope);
    1080              :     } else {
    1081            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1082              :     }
    1083            0 : }
    1084              : 
    1085              : 
    1086              : void
    1087            0 : AdditionalHandler::parseE1Attributes(const SUMOSAXAttributes& attrs) {
    1088              :     // declare Ok Flag
    1089            0 :     bool parsedOk = true;
    1090              :     // needed attributes
    1091            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1092            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
    1093            0 :     const double position = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk);
    1094            0 :     const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, SUMOTime_MAX_PERIOD);
    1095            0 :     const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
    1096              :     // optional attributes
    1097            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1098            0 :     const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
    1099            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>());
    1100            0 :     const std::string detectPersons = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, "", parsedOk);
    1101            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
    1102              :     // continue if flag is ok
    1103            0 :     if (parsedOk && checkDetectPersons(SUMO_TAG_E1DETECTOR, id, detectPersons)) {
    1104              :         // set tag
    1105            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_E1DETECTOR);
    1106              :         // add all attributes
    1107            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1108            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
    1109            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
    1110            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
    1111            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
    1112            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1113            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
    1114            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges);
    1115            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
    1116            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
    1117              :     } else {
    1118            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1119              :     }
    1120            0 : }
    1121              : 
    1122              : 
    1123              : void
    1124            0 : AdditionalHandler::parseE2Attributes(const SUMOSAXAttributes& attrs) {
    1125              :     // declare Ok Flag
    1126            0 :     bool parsedOk = true;
    1127            0 :     const int positionDef = attrs.hasAttribute(SUMO_ATTR_POSITION) ? 1 : 0;
    1128            0 :     const int endPosDef = attrs.hasAttribute(SUMO_ATTR_ENDPOS) ? 1 : 0;
    1129            0 :     const int lengthDef = attrs.hasAttribute(SUMO_ATTR_LENGTH) ? 1 : 0;
    1130              :     // check attributes
    1131            0 :     if (attrs.hasAttribute(SUMO_ATTR_LANE) && ((positionDef + endPosDef + lengthDef) > 2)) {
    1132            0 :         writeError(TL("'pos', 'endPos' and 'length' cannot be defined together in a single lane area detector."));
    1133            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1134            0 :     } else if (attrs.hasAttribute(SUMO_ATTR_LANE) && ((positionDef + endPosDef + lengthDef) < 2)) {
    1135            0 :         writeError(TL("A single lane area detector requires two parameters of those 'pos', 'endPos' and 'length'."));
    1136            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1137              :     } else {
    1138              :         // needed attributes
    1139            0 :         const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1140            0 :         const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
    1141              :         // special attributes
    1142            0 :         const std::string laneId = attrs.getOpt<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk, "");
    1143            0 :         const std::vector<std::string> laneIds = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_LANES, id.c_str(), parsedOk, std::vector<std::string>());
    1144            0 :         const double position = attrs.getOpt<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, 0);
    1145            0 :         const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, 0);
    1146            0 :         const double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, id.c_str(), parsedOk, 0);
    1147              :         // optional attributes
    1148            0 :         const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, SUMOTime_MAX_PERIOD);
    1149            0 :         const std::string trafficLight = attrs.getOpt<std::string>(SUMO_ATTR_TLID, id.c_str(), parsedOk, "");
    1150            0 :         const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1151            0 :         const SUMOTime haltingTimeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), parsedOk, TIME2STEPS(1));
    1152            0 :         const double haltingSpeedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 1.39);
    1153            0 :         const double jamDistThreshold = attrs.getOpt<double>(SUMO_ATTR_JAM_DIST_THRESHOLD, id.c_str(), parsedOk, 10);
    1154            0 :         const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
    1155            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>());
    1156            0 :         const std::string detectPersons = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, "", parsedOk);
    1157            0 :         const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
    1158            0 :         const bool show = attrs.getOpt<bool>(SUMO_ATTR_SHOW_DETECTOR, id.c_str(), parsedOk, true);
    1159              :         // continue if flag is ok
    1160            0 :         if (parsedOk && checkDetectPersons(SUMO_TAG_E2DETECTOR, id, detectPersons)) {
    1161              :             // set tag
    1162            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_E2DETECTOR);
    1163              :             // add attributes depending of Lane/Lanes
    1164            0 :             if (attrs.hasAttribute(SUMO_ATTR_LANE)) {
    1165            0 :                 myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
    1166            0 :                 if (positionDef == 0) {
    1167            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, endPos - length);
    1168            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length);
    1169            0 :                 } else if (endPosDef == 0) {
    1170            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
    1171            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, length);
    1172            0 :                 } else if (lengthDef == 0) {
    1173            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
    1174            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LENGTH, endPos - position);
    1175              :                 }
    1176              :             } else {
    1177            0 :                 myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LANES, laneIds);
    1178            0 :                 myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
    1179            0 :                 myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
    1180              :             }
    1181              :             // add all attributes
    1182            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1183            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
    1184            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TLID, trafficLight);
    1185            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
    1186            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
    1187            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges);
    1188            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
    1189            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1190            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD, haltingTimeThreshold);
    1191            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, haltingSpeedThreshold);
    1192            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD, jamDistThreshold);
    1193            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
    1194            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_SHOW_DETECTOR, show);
    1195              :         } else {
    1196            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1197              :         }
    1198            0 :     }
    1199            0 : }
    1200              : 
    1201              : 
    1202              : void
    1203            0 : AdditionalHandler::parseE3Attributes(const SUMOSAXAttributes& attrs) {
    1204              :     // declare Ok Flag
    1205            0 :     bool parsedOk = true;
    1206              :     // needed attributes
    1207            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1208            0 :     const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
    1209            0 :     const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, SUMOTime_MAX_PERIOD);
    1210              :     // optional attributes
    1211            0 :     const Position pos = attrs.getOpt<Position>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, Position());
    1212            0 :     const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
    1213            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>());
    1214            0 :     const std::string detectPersons = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, "", parsedOk);
    1215            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1216            0 :     const SUMOTime haltingTimeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), parsedOk, TIME2STEPS(1));
    1217            0 :     const double haltingSpeedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), parsedOk, 1.39);
    1218            0 :     const bool openEntry = attrs.getOpt<bool>(SUMO_ATTR_OPEN_ENTRY, id.c_str(), parsedOk, false);
    1219            0 :     const bool expectedArrival = attrs.getOpt<bool>(SUMO_ATTR_EXPECT_ARRIVAL, id.c_str(), parsedOk, false);
    1220              :     // continue if flag is ok
    1221            0 :     if (parsedOk && checkDetectPersons(SUMO_TAG_E3DETECTOR, id, detectPersons)) {
    1222              :         // set tag
    1223            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_E3DETECTOR);
    1224              :         // add all attributes
    1225            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1226            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
    1227            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
    1228            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos);
    1229            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
    1230            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges);
    1231            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
    1232            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1233            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD, haltingTimeThreshold);
    1234            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HALTING_SPEED_THRESHOLD, haltingSpeedThreshold);
    1235            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OPEN_ENTRY, openEntry);
    1236            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_EXPECT_ARRIVAL, expectedArrival);
    1237              :     } else {
    1238            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1239              :     }
    1240            0 : }
    1241              : 
    1242              : 
    1243              : void
    1244            0 : AdditionalHandler::parseEntryAttributes(const SUMOSAXAttributes& attrs) {
    1245              :     // declare Ok Flag
    1246            0 :     bool parsedOk = true;
    1247              :     // needed attributes
    1248            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, "", parsedOk);
    1249            0 :     const double position = attrs.get<double>(SUMO_ATTR_POSITION, "", parsedOk);
    1250              :     // optional attributes
    1251            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, "", parsedOk, false);
    1252              :     // check parent
    1253            0 :     checkParsedParent(SUMO_TAG_DET_ENTRY, {SUMO_TAG_E3DETECTOR}, parsedOk);
    1254              :     // continue if flag is ok
    1255            0 :     if (parsedOk) {
    1256              :         // set tag
    1257            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_DET_ENTRY);
    1258              :         // add all attributes
    1259            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
    1260            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
    1261            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
    1262              :     } else {
    1263            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1264              :     }
    1265            0 : }
    1266              : 
    1267              : 
    1268              : void
    1269            0 : AdditionalHandler::parseExitAttributes(const SUMOSAXAttributes& attrs) {
    1270              :     // declare Ok Flag
    1271            0 :     bool parsedOk = true;
    1272              :     // needed attributes
    1273            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, "", parsedOk);
    1274            0 :     const double position = attrs.get<double>(SUMO_ATTR_POSITION, "", parsedOk);
    1275              :     // optional attributes
    1276            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, "", parsedOk, false);
    1277              :     // check parent
    1278            0 :     checkParsedParent(SUMO_TAG_DET_EXIT, {SUMO_TAG_E3DETECTOR}, parsedOk);
    1279              :     // continue if flag is ok
    1280            0 :     if (parsedOk) {
    1281              :         // set tag
    1282            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_DET_EXIT);
    1283              :         // add all attributes
    1284            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
    1285            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
    1286            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
    1287              :     } else {
    1288            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1289              :     }
    1290            0 : }
    1291              : 
    1292              : 
    1293              : void
    1294            0 : AdditionalHandler::parseE1InstantAttributes(const SUMOSAXAttributes& attrs) {
    1295              :     // declare Ok Flag
    1296            0 :     bool parsedOk = true;
    1297              :     // needed attributes
    1298            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1299            0 :     const std::string laneId = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk);
    1300            0 :     const double position = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk);
    1301            0 :     const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
    1302              :     // optional attributes
    1303            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1304            0 :     const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
    1305            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>());
    1306            0 :     const std::string detectPersons = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, "", parsedOk);
    1307            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
    1308              :     // continue if flag is ok
    1309            0 :     if (parsedOk && checkDetectPersons(SUMO_TAG_INSTANT_INDUCTION_LOOP, id, detectPersons)) {
    1310              :         // set tag
    1311            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_INSTANT_INDUCTION_LOOP);
    1312              :         // add all attributes
    1313            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1314            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, laneId);
    1315            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, position);
    1316            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
    1317            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
    1318            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_NEXT_EDGES, nextEdges);
    1319            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DETECT_PERSONS, detectPersons);
    1320            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1321            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
    1322              :     } else {
    1323            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1324              :     }
    1325            0 : }
    1326              : 
    1327              : 
    1328              : void
    1329            0 : AdditionalHandler::parseTAZAttributes(const SUMOSAXAttributes& attrs) {
    1330              :     // declare Ok Flag
    1331            0 :     bool parsedOk = true;
    1332              :     // needed attributes
    1333            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1334              :     // optional attributes
    1335            0 :     const PositionVector shape = attrs.getOpt<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), parsedOk, PositionVector());
    1336            0 :     const Position center = attrs.getOpt<Position>(SUMO_ATTR_CENTER, id.c_str(), parsedOk, shape.size() > 0 ? shape.getCentroid() : Position::INVALID);
    1337            0 :     const bool fill = attrs.getOpt<bool>(SUMO_ATTR_FILL, id.c_str(), parsedOk, false);
    1338            0 :     const std::vector<std::string> edges = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk, std::vector<std::string>());
    1339            0 :     const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::RED);
    1340            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1341              :     // continue if flag is ok
    1342            0 :     if (parsedOk) {
    1343              :         // set tag
    1344            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TAZ);
    1345              :         // add all attributes
    1346            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1347            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shape);
    1348            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_CENTER, center);
    1349            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FILL, fill);
    1350            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
    1351            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
    1352            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1353              :     } else {
    1354            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1355              :     }
    1356            0 : }
    1357              : 
    1358              : 
    1359              : void
    1360            0 : AdditionalHandler::parseTAZSourceAttributes(const SUMOSAXAttributes& attrs) {
    1361              :     // declare Ok Flag
    1362            0 :     bool parsedOk = true;
    1363              :     // needed attributes
    1364            0 :     const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1365            0 :     const double weight = attrs.get<double>(SUMO_ATTR_WEIGHT, edgeID.c_str(), parsedOk);
    1366              :     // check parent
    1367            0 :     checkParsedParent(SUMO_TAG_TAZSOURCE, {SUMO_TAG_TAZ}, parsedOk);
    1368              :     // continue if flag is ok
    1369            0 :     if (parsedOk) {
    1370              :         // set tag
    1371            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TAZSOURCE);
    1372              :         // add all attributes
    1373            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID);
    1374            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WEIGHT, weight);
    1375              :     } else {
    1376            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1377              :     }
    1378            0 : }
    1379              : 
    1380              : 
    1381              : void
    1382            0 : AdditionalHandler::parseTAZSinkAttributes(const SUMOSAXAttributes& attrs) {
    1383              :     // declare Ok Flag
    1384            0 :     bool parsedOk = true;
    1385              :     // needed attributes
    1386            0 :     const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1387            0 :     const double weight = attrs.get<double>(SUMO_ATTR_WEIGHT, edgeID.c_str(), parsedOk);
    1388              :     // check parent
    1389            0 :     checkParsedParent(SUMO_TAG_TAZSINK, {SUMO_TAG_TAZ}, parsedOk);
    1390              :     // continue if flag is ok
    1391            0 :     if (parsedOk) {
    1392              :         // set tag
    1393            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TAZSINK);
    1394              :         // add all attributes
    1395            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID);
    1396            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WEIGHT, weight);
    1397              :     } else {
    1398            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1399              :     }
    1400            0 : }
    1401              : 
    1402              : 
    1403              : void
    1404            0 : AdditionalHandler::parseVariableSpeedSignAttributes(const SUMOSAXAttributes& attrs) {
    1405              :     // declare Ok Flag
    1406            0 :     bool parsedOk = true;
    1407              :     // needed attributes
    1408            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1409            0 :     const std::vector<std::string> lanes = attrs.get<std::vector<std::string> >(SUMO_ATTR_LANES, id.c_str(), parsedOk);
    1410              :     // optional attributes
    1411            0 :     const Position pos = attrs.getOpt<Position>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, Position());
    1412            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1413            0 :     const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
    1414              :     // continue if flag is ok
    1415            0 :     if (parsedOk) {
    1416              :         // set tag
    1417            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VSS);
    1418              :         // add all attributes
    1419            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1420            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LANES, lanes);
    1421            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos);
    1422            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1423            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
    1424              :     } else {
    1425            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1426              :     }
    1427            0 : }
    1428              : 
    1429              : 
    1430              : void
    1431            0 : AdditionalHandler::parseVariableSpeedSignStepAttributes(const SUMOSAXAttributes& attrs) {
    1432              :     // declare Ok Flag
    1433            0 :     bool parsedOk = true;
    1434              :     // needed attributes
    1435            0 :     const SUMOTime time = attrs.getSUMOTimeReporting(SUMO_ATTR_TIME, "", parsedOk);
    1436              :     // optional attributes
    1437            0 :     const double speed = attrs.getOpt<double>(SUMO_ATTR_SPEED, "", parsedOk, OptionsCont::getOptions().getFloat("default.speed"));
    1438              :     // check parent
    1439            0 :     checkParsedParent(SUMO_TAG_STEP, {SUMO_TAG_VSS}, parsedOk);
    1440              :     // continue if flag is ok
    1441            0 :     if (parsedOk) {
    1442              :         // set tag
    1443            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_STEP);
    1444              :         // add all attributes
    1445            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_TIME, time);
    1446            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_SPEED, speed);
    1447              :     } else {
    1448            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1449              :     }
    1450            0 : }
    1451              : 
    1452              : 
    1453              : void
    1454            0 : AdditionalHandler::parseCalibratorAttributes(const SUMOSAXAttributes& attrs) {
    1455              :     // declare Ok Flag
    1456            0 :     bool parsedOk = true;
    1457              :     // check that frecuency and trafficLight aren't defined together
    1458            0 :     if ((attrs.hasAttribute(SUMO_ATTR_EDGE) && attrs.hasAttribute(SUMO_ATTR_LANE)) ||
    1459            0 :             (!attrs.hasAttribute(SUMO_ATTR_EDGE) && !attrs.hasAttribute(SUMO_ATTR_LANE))) {
    1460            0 :         writeError(TL("Calibrators need either an edge or a lane"));
    1461            0 :         parsedOk = false;
    1462              :     }
    1463              :     // needed attributes
    1464            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1465            0 :     const double pos = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk);
    1466              :     // special attributes
    1467            0 :     const std::string edge = attrs.getOpt<std::string>(SUMO_ATTR_EDGE, id.c_str(), parsedOk, "");
    1468            0 :     const std::string lane = attrs.getOpt<std::string>(SUMO_ATTR_LANE, id.c_str(), parsedOk, "");
    1469              :     // optional attributes
    1470            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1471            0 :     const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, DELTA_T);
    1472            0 :     const std::string routeProbe = attrs.getOpt<std::string>(SUMO_ATTR_ROUTEPROBE, id.c_str(), parsedOk, "");
    1473            0 :     const double jamThreshold = attrs.getOpt<double>(SUMO_ATTR_JAM_DIST_THRESHOLD, id.c_str(), parsedOk, 0.5);
    1474            0 :     const std::string output = attrs.getOpt<std::string>(SUMO_ATTR_OUTPUT, id.c_str(), parsedOk, "");
    1475            0 :     const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
    1476              :     // continue if flag is ok
    1477            0 :     if (parsedOk) {
    1478              :         // set tag depending of edge/lane
    1479            0 :         if (attrs.hasAttribute(SUMO_ATTR_EDGE)) {
    1480            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CALIBRATOR);
    1481            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGE, edge);
    1482              :         } else {
    1483            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(GNE_TAG_CALIBRATOR_LANE);
    1484            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, lane);
    1485              :         }
    1486            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1487            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, pos);
    1488            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1489            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
    1490            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ROUTEPROBE, routeProbe);
    1491            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_JAM_DIST_THRESHOLD, jamThreshold);
    1492            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OUTPUT, output);
    1493            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
    1494              :     } else {
    1495            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1496              :     }
    1497            0 : }
    1498              : 
    1499              : 
    1500              : void
    1501            0 : AdditionalHandler::parseCalibratorFlowAttributes(const SUMOSAXAttributes& attrs) {
    1502              :     // declare Ok Flag
    1503            0 :     bool parsedOk = true;
    1504              :     // check parent
    1505            0 :     if (checkCalibratorFlowParents()) {
    1506              :         // check that frecuency and trafficLight aren't defined together
    1507            0 :         if (!attrs.hasAttribute(SUMO_ATTR_TYPE) && !attrs.hasAttribute(SUMO_ATTR_VEHSPERHOUR) && !attrs.hasAttribute(SUMO_ATTR_SPEED)) {
    1508            0 :             writeError(TL("CalibratorFlows need either the attribute vehsPerHour or speed or type (or any combination of these)"));
    1509            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1510              :         } else {
    1511            0 :             SUMOVehicleParameter* flowParameter = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_FLOW, attrs, false, true, true);
    1512            0 :             if (flowParameter) {
    1513              :                 // set VPH and speed
    1514            0 :                 if (attrs.hasAttribute(SUMO_ATTR_VEHSPERHOUR)) {
    1515            0 :                     flowParameter->repetitionOffset = TIME2STEPS(3600. / attrs.get<double>(SUMO_ATTR_VEHSPERHOUR, "", parsedOk));
    1516            0 :                     flowParameter->parametersSet |= VEHPARS_VPH_SET;
    1517              :                 }
    1518            0 :                 if (attrs.hasAttribute(SUMO_ATTR_SPEED)) {
    1519            0 :                     flowParameter->calibratorSpeed = attrs.get<double>(SUMO_ATTR_SPEED, "", parsedOk);
    1520            0 :                     flowParameter->parametersSet |= VEHPARS_CALIBRATORSPEED_SET;
    1521              :                 }
    1522              :                 // set begin and end
    1523            0 :                 flowParameter->depart = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, "", parsedOk);
    1524            0 :                 flowParameter->repetitionEnd = attrs.getSUMOTimeReporting(SUMO_ATTR_END, "", parsedOk);
    1525            0 :                 if (parsedOk) {
    1526              :                     // set tag
    1527            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_FLOW);
    1528              :                     // set vehicle parameters
    1529            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->setVehicleParameter(flowParameter);
    1530              :                     // delete flow parameter (because in XMLStructure we have a copy)
    1531            0 :                     delete flowParameter;
    1532              :                 } else {
    1533            0 :                     myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1534              :                 }
    1535              :             } else {
    1536            0 :                 myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1537              :             }
    1538              :         }
    1539              :     } else {
    1540            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1541              :     }
    1542            0 : }
    1543              : 
    1544              : 
    1545              : void
    1546            0 : AdditionalHandler::parseRerouterAttributes(const SUMOSAXAttributes& attrs) {
    1547              :     // declare Ok Flag
    1548            0 :     bool parsedOk = true;
    1549              :     // needed attributes
    1550            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1551            0 :     const std::vector<std::string> edges = attrs.get<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), parsedOk);
    1552              :     // optional attributes
    1553            0 :     const Position pos = attrs.getOpt<Position>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, Position::INVALID);
    1554            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1555            0 :     const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, id.c_str(), parsedOk, 1);
    1556            0 :     SUMOTime timeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), parsedOk, 0);
    1557            0 :     const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
    1558            0 :     const bool off = attrs.getOpt<bool>(SUMO_ATTR_OFF, id.c_str(), parsedOk, false);
    1559            0 :     const bool optional = attrs.getOpt<bool>(SUMO_ATTR_OPTIONAL, id.c_str(), parsedOk, false);
    1560              :     // check attributes
    1561            0 :     if (!checkNegative(SUMO_TAG_REROUTER, id, SUMO_ATTR_PROB, probability, true)) {
    1562            0 :         parsedOk = false;
    1563              :     }
    1564              :     // continue if flag is ok
    1565            0 :     if (parsedOk) {
    1566              :         // set tag
    1567            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_REROUTER);
    1568              :         // add all attributes
    1569            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1570            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_EDGES, edges);
    1571            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos);
    1572            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1573            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
    1574            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_HALTING_TIME_THRESHOLD, timeThreshold);
    1575            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
    1576            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OFF, off);
    1577            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_OPTIONAL, optional);
    1578              :     } else {
    1579            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1580              :     }
    1581            0 : }
    1582              : 
    1583              : 
    1584              : void
    1585            0 : AdditionalHandler::parseRerouterIntervalAttributes(const SUMOSAXAttributes& attrs) {
    1586              :     // declare Ok Flag
    1587            0 :     bool parsedOk = true;
    1588              :     // needed attributes
    1589            0 :     const SUMOTime begin = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, "", parsedOk);
    1590            0 :     const SUMOTime end = attrs.getSUMOTimeReporting(SUMO_ATTR_END, "", parsedOk);
    1591              :     // check parent
    1592            0 :     checkParsedParent(SUMO_TAG_INTERVAL, {SUMO_TAG_REROUTER}, parsedOk);
    1593              :     // continue if flag is ok
    1594            0 :     if (parsedOk) {
    1595              :         // set tag
    1596            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_INTERVAL);
    1597              :         // add all attributes
    1598            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
    1599            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
    1600              :     } else {
    1601            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1602              :     }
    1603            0 : }
    1604              : 
    1605              : 
    1606              : void
    1607            0 : AdditionalHandler::parseClosingLaneRerouteAttributes(const SUMOSAXAttributes& attrs) {
    1608              :     // declare Ok Flag
    1609            0 :     bool parsedOk = true;
    1610              :     // needed attributes
    1611            0 :     const std::string laneID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1612              :     // optional attributes
    1613            0 :     const std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, "", parsedOk, "");
    1614            0 :     const std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, "", parsedOk, !disallow.size() ? "authority" : "");
    1615              :     // check parent
    1616            0 :     checkParsedParent(SUMO_TAG_CLOSING_LANE_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
    1617              :     // continue if flag is ok
    1618            0 :     if (parsedOk) {
    1619              :         // set tag
    1620            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CLOSING_LANE_REROUTE);
    1621              :         // add all attributes
    1622            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, laneID);
    1623            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ALLOW, allow);
    1624            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DISALLOW, disallow);
    1625              :     } else {
    1626            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1627              :     }
    1628            0 : }
    1629              : 
    1630              : 
    1631              : void
    1632            0 : AdditionalHandler::parseClosingRerouteAttributes(const SUMOSAXAttributes& attrs) {
    1633              :     // declare Ok Flag
    1634            0 :     bool parsedOk = true;
    1635              :     // needed attributes
    1636            0 :     const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1637              :     // optional attributes
    1638            0 :     const std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, "", parsedOk, "");
    1639            0 :     const std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, "", parsedOk, "");
    1640              :     // check parent
    1641            0 :     checkParsedParent(SUMO_TAG_CLOSING_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
    1642              :     // continue if flag is ok
    1643            0 :     if (parsedOk) {
    1644              :         // set tag
    1645            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_CLOSING_REROUTE);
    1646              :         // add all attributes
    1647            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID);
    1648            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ALLOW, allow);
    1649            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_DISALLOW, disallow);
    1650              :     } else {
    1651            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1652              :     }
    1653            0 : }
    1654              : 
    1655              : 
    1656              : void
    1657            0 : AdditionalHandler::parseDestProbRerouteAttributes(const SUMOSAXAttributes& attrs) {
    1658              :     // declare Ok Flag
    1659            0 :     bool parsedOk = true;
    1660              :     // needed attributes
    1661            0 :     const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1662            0 :     const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, "", parsedOk, 1);
    1663              :     // check attributes
    1664            0 :     if (!checkNegative(SUMO_TAG_DEST_PROB_REROUTE, edgeID, SUMO_ATTR_PROB, probability, true)) {
    1665            0 :         parsedOk = false;
    1666              :     }
    1667              :     // check parent
    1668            0 :     checkParsedParent(SUMO_TAG_DEST_PROB_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
    1669              :     // continue if flag is ok
    1670            0 :     if (parsedOk) {
    1671              :         // set tag
    1672            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_DEST_PROB_REROUTE);
    1673              :         // add all attributes
    1674            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, edgeID);
    1675            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
    1676              :     } else {
    1677            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1678              :     }
    1679            0 : }
    1680              : 
    1681              : 
    1682              : void
    1683            0 : AdditionalHandler::parseParkingAreaRerouteAttributes(const SUMOSAXAttributes& attrs) {
    1684              :     // declare Ok Flag
    1685            0 :     bool parsedOk = true;
    1686              :     // needed attributes
    1687            0 :     const std::string parkingAreaID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1688            0 :     const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, "", parsedOk, 1);
    1689              :     // check attributes
    1690            0 :     if (!checkNegative(SUMO_TAG_PARKING_AREA_REROUTE, parkingAreaID, SUMO_ATTR_PROB, probability, true)) {
    1691            0 :         parsedOk = false;
    1692              :     }
    1693              :     // optional attributes
    1694            0 :     const bool visible = attrs.getOpt<bool>(SUMO_ATTR_VISIBLE, "", parsedOk, false);
    1695              :     // check parent
    1696            0 :     checkParsedParent(SUMO_TAG_PARKING_AREA_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
    1697              :     // continue if flag is ok
    1698            0 :     if (parsedOk) {
    1699              :         // set tag
    1700            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_PARKING_AREA_REROUTE);
    1701              :         // add all attributes
    1702            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, parkingAreaID);
    1703            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
    1704            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_VISIBLE, visible);
    1705              :     } else {
    1706            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1707              :     }
    1708            0 : }
    1709              : 
    1710              : 
    1711              : void
    1712            0 : AdditionalHandler::parseRouteProbRerouteAttributes(const SUMOSAXAttributes& attrs) {
    1713              :     // declare Ok Flag
    1714            0 :     bool parsedOk = true;
    1715              :     // needed attributes
    1716            0 :     const std::string routeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1717            0 :     const double probability = attrs.getOpt<double>(SUMO_ATTR_PROB, "", parsedOk, 1);
    1718              :     // check attributes
    1719            0 :     if (!checkNegative(SUMO_TAG_ROUTE_PROB_REROUTE, routeID, SUMO_ATTR_PROB, probability, true)) {
    1720            0 :         parsedOk = false;
    1721              :     }
    1722              :     // check parent
    1723            0 :     checkParsedParent(SUMO_TAG_ROUTE_PROB_REROUTE, {SUMO_TAG_INTERVAL}, parsedOk);
    1724              :     // continue if flag is ok
    1725            0 :     if (parsedOk) {
    1726              :         // set tag
    1727            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTE_PROB_REROUTE);
    1728              :         // add all attributes
    1729            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, routeID);
    1730            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_PROB, probability);
    1731              :     } else {
    1732            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1733              :     }
    1734            0 : }
    1735              : 
    1736              : 
    1737              : void
    1738            0 : AdditionalHandler::parseRouteProbeAttributes(const SUMOSAXAttributes& attrs) {
    1739              :     // declare Ok Flag
    1740            0 :     bool parsedOk = true;
    1741              :     // needed attributes
    1742            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1743            0 :     const std::string edge = attrs.get<std::string>(SUMO_ATTR_EDGE, id.c_str(), parsedOk);
    1744            0 :     const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), parsedOk);
    1745            0 :     const SUMOTime period = attrs.getOptPeriod(id.c_str(), parsedOk, SUMOTime_MAX_PERIOD);
    1746            0 :     const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), parsedOk, -1);
    1747              :     // optional attributes
    1748            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1749            0 :     const std::vector<std::string> vehicleTypes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_VTYPES, id.c_str(), parsedOk, std::vector<std::string>());
    1750              :     // continue if flag is ok
    1751            0 :     if (parsedOk) {
    1752              :         // set tag
    1753            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ROUTEPROBE);
    1754              :         // add all attributes
    1755            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1756            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGE, edge);
    1757            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_FILE, file);
    1758            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_PERIOD, period);
    1759            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1760            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
    1761            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_VTYPES, vehicleTypes);
    1762              :     } else {
    1763            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1764              :     }
    1765            0 : }
    1766              : 
    1767              : 
    1768              : void
    1769            0 : AdditionalHandler::parseVaporizerAttributes(const SUMOSAXAttributes& attrs) {
    1770              :     // declare Ok Flag
    1771            0 :     bool parsedOk = true;
    1772              :     // needed attributes
    1773            0 :     const std::string edgeID = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1774            0 :     SUMOTime begin = attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, nullptr, parsedOk);
    1775            0 :     SUMOTime end = attrs.getSUMOTimeReporting(SUMO_ATTR_END, nullptr, parsedOk);
    1776              :     // optional attributes
    1777            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, edgeID.c_str(), parsedOk, "");
    1778              :     // continue if flag is ok
    1779            0 :     if (parsedOk) {
    1780              :         // set tag
    1781            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_VAPORIZER);
    1782              :         // add all attributes
    1783            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_EDGE, edgeID);
    1784            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_BEGIN, begin);
    1785            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addTimeAttribute(SUMO_ATTR_END, end);
    1786            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1787              :     } else {
    1788            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1789              :     }
    1790            0 : }
    1791              : 
    1792              : 
    1793              : void
    1794            0 : AdditionalHandler::parseTractionSubstation(const SUMOSAXAttributes& attrs) {
    1795              :     // declare Ok Flag
    1796            0 :     bool parsedOk = true;
    1797              :     // needed attributes
    1798            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1799              :     // optional attributes
    1800            0 :     const Position pos = attrs.getOpt<Position>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, Position::INVALID);
    1801            0 :     const double voltage = attrs.getOpt<double>(SUMO_ATTR_VOLTAGE, id.c_str(), parsedOk, 600);
    1802            0 :     const double currentLimit = attrs.getOpt<double>(SUMO_ATTR_CURRENTLIMIT, id.c_str(), parsedOk, 400);
    1803              :     // continue if flag is ok
    1804            0 :     if (parsedOk) {
    1805              :         // set tag
    1806            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_TRACTION_SUBSTATION);
    1807              :         // add all attributes
    1808            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1809            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionAttribute(SUMO_ATTR_POSITION, pos);
    1810            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_VOLTAGE, voltage);
    1811            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_CURRENTLIMIT, currentLimit);
    1812              :     } else {
    1813            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1814              :     }
    1815            0 : }
    1816              : 
    1817              : 
    1818              : void
    1819            0 : AdditionalHandler::parseOverheadWire(const SUMOSAXAttributes& attrs) {
    1820              :     // declare Ok Flag
    1821            0 :     bool parsedOk = true;
    1822              :     // needed attributes
    1823            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1824            0 :     const std::string substationID = attrs.get<std::string>(SUMO_ATTR_SUBSTATIONID, id.c_str(), parsedOk);
    1825            0 :     const std::vector<std::string> laneIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_LANES, id.c_str(), parsedOk);
    1826              :     // optional attributes
    1827            0 :     const double startPos = attrs.getOpt<double>(SUMO_ATTR_STARTPOS, id.c_str(), parsedOk, 0);
    1828            0 :     const double endPos = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), parsedOk, INVALID_DOUBLE);
    1829            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
    1830            0 :     const std::vector<std::string> forbiddenInnerLanes = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_OVERHEAD_WIRE_FORBIDDEN, "", parsedOk);
    1831              :     // continue if flag is ok
    1832            0 :     if (parsedOk) {
    1833              :         // set tag
    1834            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_OVERHEAD_WIRE_SECTION);
    1835              :         // add all attributes
    1836            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1837            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_SUBSTATIONID, substationID);
    1838            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_LANES, laneIDs);
    1839            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_STARTPOS, startPos);
    1840            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ENDPOS, endPos);
    1841            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
    1842            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringListAttribute(SUMO_ATTR_OVERHEAD_WIRE_FORBIDDEN, forbiddenInnerLanes);
    1843              :     } else {
    1844            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1845              :     }
    1846            0 : }
    1847              : 
    1848              : 
    1849              : void
    1850            0 : AdditionalHandler::parseOverheadWireClamp(const SUMOSAXAttributes& attrs) {
    1851              :     // declare Ok Flag
    1852            0 :     bool parsedOk = true;
    1853              :     // needed attributes
    1854            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1855            0 :     const std::string substationId = attrs.get<std::string>(SUMO_ATTR_SUBSTATIONID, id.c_str(), parsedOk);
    1856            0 :     const std::string wireClampStart = attrs.get<std::string>(SUMO_ATTR_OVERHEAD_WIRECLAMP_START, id.c_str(), parsedOk);
    1857            0 :     const std::string wireClampLaneStart = attrs.get<std::string>(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANESTART, id.c_str(), parsedOk);
    1858            0 :     const std::string wireClampEnd = attrs.get<std::string>(SUMO_ATTR_OVERHEAD_WIRECLAMP_END, id.c_str(), parsedOk);
    1859            0 :     const std::string wireClampLaneEnd = attrs.get<std::string>(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANEEND, id.c_str(), parsedOk);
    1860              :     // continue if flag is ok
    1861            0 :     if (parsedOk) {
    1862              :         // set tag
    1863            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_OVERHEAD_WIRE_CLAMP);
    1864              :         // add all attributes
    1865            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1866            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_SUBSTATIONID, substationId);
    1867            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_START, wireClampStart);
    1868            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANESTART, wireClampLaneStart);
    1869            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_END, wireClampEnd);
    1870            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_OVERHEAD_WIRECLAMP_LANEEND, wireClampLaneEnd);
    1871              :     } else {
    1872            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1873              :     }
    1874            0 : }
    1875              : 
    1876              : 
    1877              : void
    1878            0 : AdditionalHandler::parsePolyAttributes(const SUMOSAXAttributes& attrs) {
    1879              :     // declare Ok Flag
    1880            0 :     bool parsedOk = true;
    1881              :     // needed attributes
    1882            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1883            0 :     const PositionVector shapeStr = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), parsedOk);
    1884              :     // optional attributes
    1885            0 :     const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::RED);
    1886            0 :     const bool geo = attrs.getOpt<bool>(SUMO_ATTR_GEO, id.c_str(), parsedOk, false);
    1887            0 :     const bool fill = attrs.getOpt<bool>(SUMO_ATTR_FILL, id.c_str(), parsedOk, false);
    1888            0 :     const double lineWidth = attrs.getOpt<double>(SUMO_ATTR_LINEWIDTH, id.c_str(), parsedOk, Shape::DEFAULT_LINEWIDTH);
    1889            0 :     const double layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, id.c_str(), parsedOk, Shape::DEFAULT_LAYER);
    1890            0 :     const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), parsedOk, Shape::DEFAULT_TYPE);
    1891            0 :     const std::string imgFile = attrs.getOpt<std::string>(SUMO_ATTR_IMGFILE, id.c_str(), parsedOk, Shape::DEFAULT_IMG_FILE);
    1892            0 :     const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, Shape::DEFAULT_ANGLE);
    1893            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1894              :     // continue if flag is ok
    1895            0 :     if (parsedOk) {
    1896              :         // set tag
    1897            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_POLY);
    1898              :         // add all attributes
    1899            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1900            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shapeStr);
    1901            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
    1902            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_GEO, geo);
    1903            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FILL, fill);
    1904            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LINEWIDTH, lineWidth);
    1905            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LAYER, layer);
    1906            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TYPE, type);
    1907            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_IMGFILE, imgFile);
    1908            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
    1909            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1910              :     } else {
    1911            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1912              :     }
    1913            0 : }
    1914              : 
    1915              : 
    1916              : void
    1917            0 : AdditionalHandler::parsePOIAttributes(const SUMOSAXAttributes& attrs) {
    1918              :     // declare Ok Flag
    1919            0 :     bool parsedOk = true;
    1920              :     // check that x and y are defined together
    1921            0 :     if ((attrs.hasAttribute(SUMO_ATTR_X) && !attrs.hasAttribute(SUMO_ATTR_Y)) ||
    1922            0 :             (!attrs.hasAttribute(SUMO_ATTR_X) && attrs.hasAttribute(SUMO_ATTR_Y))) {
    1923            0 :         writeError(TL("X and Y must be be defined together in POIs"));
    1924            0 :         parsedOk = false;
    1925              :     }
    1926              :     // check that lane and pos are defined together
    1927            0 :     if ((attrs.hasAttribute(SUMO_ATTR_LANE) && !attrs.hasAttribute(SUMO_ATTR_POSITION)) ||
    1928            0 :             (!attrs.hasAttribute(SUMO_ATTR_LANE) && attrs.hasAttribute(SUMO_ATTR_POSITION))) {
    1929            0 :         writeError(TL("lane and position must be defined together in POIs"));
    1930            0 :         parsedOk = false;
    1931              :     }
    1932              :     // check that lon and lat are defined together
    1933            0 :     if ((attrs.hasAttribute(SUMO_ATTR_LON) && !attrs.hasAttribute(SUMO_ATTR_LAT)) ||
    1934            0 :             (!attrs.hasAttribute(SUMO_ATTR_LON) && attrs.hasAttribute(SUMO_ATTR_LAT))) {
    1935            0 :         writeError(TL("lon and lat must be be defined together in POIs"));
    1936            0 :         parsedOk = false;
    1937              :     }
    1938              :     // needed attributes
    1939            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    1940              :     // special attributes
    1941            0 :     const double x = attrs.getOpt<double>(SUMO_ATTR_X, id.c_str(), parsedOk, 0);
    1942            0 :     const double y = attrs.getOpt<double>(SUMO_ATTR_Y, id.c_str(), parsedOk, 0);
    1943            0 :     const std::string lane = attrs.getOpt<std::string>(SUMO_ATTR_LANE, "", parsedOk, "");
    1944            0 :     const double pos = attrs.getOpt<double>(SUMO_ATTR_POSITION, id.c_str(), parsedOk, 0);
    1945            0 :     const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), parsedOk, false);
    1946            0 :     const double posLat = attrs.getOpt<double>(SUMO_ATTR_POSITION_LAT, id.c_str(), parsedOk, 0);
    1947            0 :     const double lon = attrs.getOpt<double>(SUMO_ATTR_LON, id.c_str(), parsedOk, 0);
    1948            0 :     const double lat = attrs.getOpt<double>(SUMO_ATTR_LAT, id.c_str(), parsedOk, 0);
    1949              :     // optional attributes
    1950            0 :     const RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, id.c_str(), parsedOk, RGBColor::RED);
    1951            0 :     const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, "", parsedOk, Shape::DEFAULT_TYPE);
    1952            0 :     std::string icon = attrs.getOpt<std::string>(SUMO_ATTR_ICON, "", parsedOk, SUMOXMLDefinitions::POIIcons.getString(POIIcon::NONE));
    1953            0 :     const double layer = attrs.getOpt<double>(SUMO_ATTR_LAYER, id.c_str(), parsedOk, Shape::DEFAULT_LAYER_POI);
    1954            0 :     const std::string imgFile = attrs.getOpt<std::string>(SUMO_ATTR_IMGFILE, "", parsedOk, Shape::DEFAULT_IMG_FILE);
    1955            0 :     const double width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, id.c_str(), parsedOk, Shape::DEFAULT_IMG_WIDTH);
    1956            0 :     const double height = attrs.getOpt<double>(SUMO_ATTR_HEIGHT, id.c_str(), parsedOk, Shape::DEFAULT_IMG_HEIGHT);
    1957            0 :     const double angle = attrs.getOpt<double>(SUMO_ATTR_ANGLE, id.c_str(), parsedOk, Shape::DEFAULT_ANGLE);
    1958            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    1959              :     // check icon
    1960            0 :     if (!SUMOXMLDefinitions::POIIcons.hasString(icon)) {
    1961            0 :         WRITE_WARNING(TLF("Invalid icon % for POI '%', using default", icon, id));
    1962              :         icon = "none";
    1963              :     }
    1964              :     // continue if flag is ok
    1965            0 :     if (parsedOk) {
    1966              :         // set tag
    1967            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_POI);
    1968              :         // add attributes depending of Lane/Lanes
    1969            0 :         if (attrs.hasAttribute(SUMO_ATTR_X) && attrs.hasAttribute(SUMO_ATTR_Y)) {
    1970            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_X, x);
    1971            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_Y, y);
    1972            0 :         } else if (attrs.hasAttribute(SUMO_ATTR_LANE) && attrs.hasAttribute(SUMO_ATTR_POSITION)) {
    1973            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_LANE, lane);
    1974            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION, pos);
    1975            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addBoolAttribute(SUMO_ATTR_FRIENDLY_POS, friendlyPos);
    1976            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_POSITION_LAT, posLat);
    1977              :         } else {
    1978            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LON, lon);
    1979            0 :             myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LAT, lat);
    1980              :         }
    1981              :         // add rest attributes
    1982            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    1983            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addColorAttribute(SUMO_ATTR_COLOR, color);
    1984            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_TYPE, type);
    1985            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ICON, icon);
    1986            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_LAYER, layer);
    1987            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_IMGFILE, imgFile);
    1988            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_WIDTH, width);
    1989            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_HEIGHT, height);
    1990            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addDoubleAttribute(SUMO_ATTR_ANGLE, angle);
    1991            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    1992              :     } else {
    1993            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    1994              :     }
    1995            0 : }
    1996              : 
    1997              : 
    1998              : void
    1999            0 : AdditionalHandler::parseJpsWalkableAreaAttributes(const SUMOSAXAttributes& attrs) {
    2000              :     // declare Ok Flag
    2001            0 :     bool parsedOk = true;
    2002              :     // needed attributes
    2003            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    2004            0 :     const PositionVector shapeStr = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), parsedOk);
    2005              :     // optional attributes
    2006            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    2007              :     // continue if flag is ok
    2008            0 :     if (parsedOk) {
    2009              :         // set tag
    2010            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(GNE_TAG_JPS_WALKABLEAREA);
    2011              :         // add all attributes
    2012            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    2013            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shapeStr);
    2014            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    2015              :     } else {
    2016            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    2017              :     }
    2018            0 : }
    2019              : 
    2020              : 
    2021              : void
    2022            0 : AdditionalHandler::parseJpsObstacleAttributes(const SUMOSAXAttributes& attrs) {
    2023              :     // declare Ok Flag
    2024            0 :     bool parsedOk = true;
    2025              :     // needed attributes
    2026            0 :     const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, "", parsedOk);
    2027            0 :     const PositionVector shapeStr = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), parsedOk);
    2028              :     // optional attributes
    2029            0 :     const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), parsedOk, "");
    2030              :     // continue if flag is ok
    2031            0 :     if (parsedOk) {
    2032              :         // set tag
    2033            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(GNE_TAG_JPS_OBSTACLE);
    2034              :         // add all attributes
    2035            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_ID, id);
    2036            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addPositionVectorAttribute(SUMO_ATTR_SHAPE, shapeStr);
    2037            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->addStringAttribute(SUMO_ATTR_NAME, name);
    2038              :     } else {
    2039            0 :         myCommonXMLStructure.getCurrentSumoBaseObject()->setTag(SUMO_TAG_ERROR);
    2040              :     }
    2041            0 : }
    2042              : 
    2043              : 
    2044              : bool
    2045            0 : AdditionalHandler::checkCalibratorFlowParents() {
    2046            0 :     const auto parentCalibrator = myCommonXMLStructure.getCurrentSumoBaseObject()->getParentSumoBaseObject();
    2047            0 :     if (parentCalibrator == nullptr) {
    2048              :         return false;
    2049              :     }
    2050            0 :     const auto parentRootFile = parentCalibrator->getParentSumoBaseObject();
    2051            0 :     if (parentRootFile != nullptr) {
    2052              :         return false;
    2053              :     }
    2054            0 :     if ((parentCalibrator->getTag() == SUMO_TAG_CALIBRATOR) || (parentCalibrator->getTag() == GNE_TAG_CALIBRATOR_LANE)) {
    2055            0 :         return true;
    2056              :     } else {
    2057            0 :         return writeError(TLF("Calibrator Flows have to be defined within a %.", toString(SUMO_TAG_CALIBRATOR)));
    2058              :     }
    2059              : }
    2060              : 
    2061              : 
    2062              : bool
    2063            0 : AdditionalHandler::checkDetectPersons(const SumoXMLTag currentTag, const std::string& id, const std::string& detectPersons) {
    2064            0 :     if (detectPersons.empty() || SUMOXMLDefinitions::PersonModeValues.hasString(detectPersons)) {
    2065            0 :         return true;
    2066              :     } else {
    2067            0 :         writeError(TLF("Attribute '%' defined in % with id '%' doesn't have a valid value (given '%').", toString(SUMO_ATTR_DETECT_PERSONS), toString(currentTag), id, detectPersons));
    2068            0 :         return false;
    2069              :     }
    2070              : }
    2071              : 
    2072              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1