LCOV - code coverage report
Current view: top level - src/utils/handlers - AdditionalHandler.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 0.0 % 1055 0
Test Date: 2024-10-24 15:46:30 Functions: 0.0 % 47 0

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

Generated by: LCOV version 2.0-1