LCOV - code coverage report
Current view: top level - src/netimport/vissim - NIImporter_Vissim.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 90.5 % 622 563
Test Date: 2024-12-21 15:45:41 Functions: 66.1 % 59 39

            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    NIImporter_Vissim.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Jakob Erdmann
      17              : /// @author  Michael Behrisch
      18              : /// @author  Lukas Grohmann (AIT)
      19              : /// @author  Gerald Richter (AIT)
      20              : /// @date    Sept 2002
      21              : ///
      22              : // -------------------
      23              : /****************************************************************************/
      24              : #include <config.h>
      25              : 
      26              : 
      27              : #include <string>
      28              : #include <fstream>
      29              : #include <utils/common/StringUtils.h>
      30              : #include <utils/common/StringUtils.h>
      31              : #include <utils/common/MsgHandler.h>
      32              : #include <utils/options/OptionsCont.h>
      33              : #include <netbuild/NBNetBuilder.h>
      34              : #include "NIImporter_Vissim.h"
      35              : #include "typeloader/NIVissimSingleTypeParser_Simdauer.h"
      36              : #include "typeloader/NIVissimSingleTypeParser_Startuhrzeit.h"
      37              : #include "typeloader/NIVissimSingleTypeParser_DynUml.h"
      38              : #include "typeloader/NIVissimSingleTypeParser_Streckendefinition.h"
      39              : #include "typeloader/NIVissimSingleTypeParser_Verbindungsdefinition.h"
      40              : #include "typeloader/NIVissimSingleTypeParser_Richtungsentscheidungsdefinition.h"
      41              : #include "typeloader/NIVissimSingleTypeParser_Routenentscheidungsdefinition.h"
      42              : #include "typeloader/NIVissimSingleTypeParser_VWunschentscheidungsdefinition.h"
      43              : #include "typeloader/NIVissimSingleTypeParser_Langsamfahrbereichdefinition.h"
      44              : #include "typeloader/NIVissimSingleTypeParser_Zuflussdefinition.h"
      45              : #include "typeloader/NIVissimSingleTypeParser_Fahrzeugtypdefinition.h"
      46              : #include "typeloader/NIVissimSingleTypeParser_Fahrzeugklassendefinition.h"
      47              : #include "typeloader/NIVissimSingleTypeParser_Verkehrszusammensetzungsdefinition.h"
      48              : #include "typeloader/NIVissimSingleTypeParser_Geschwindigkeitsverteilungsdefinition.h"
      49              : #include "typeloader/NIVissimSingleTypeParser_Laengenverteilungsdefinition.h"
      50              : #include "typeloader/NIVissimSingleTypeParser_Zeitenverteilungsdefinition.h"
      51              : #include "typeloader/NIVissimSingleTypeParser_Querverkehrsstoerungsdefinition.h"
      52              : #include "typeloader/NIVissimSingleTypeParser_Lichtsignalanlagendefinition.h"
      53              : #include "typeloader/NIVissimSingleTypeParser_Signalgruppendefinition.h"
      54              : #include "typeloader/NIVissimSingleTypeParser_Stopschilddefinition.h"
      55              : #include "typeloader/NIVissimSingleTypeParser_Knotendefinition.h"
      56              : #include "typeloader/NIVissimSingleTypeParser_Signalgeberdefinition.h"
      57              : #include "typeloader/NIVissimSingleTypeParser_Detektordefinition.h"
      58              : #include "typeloader/NIVissimSingleTypeParser_Liniendefinition.h"
      59              : #include "typeloader/NIVissimSingleTypeParser_Haltestellendefinition.h"
      60              : #include "typeloader/NIVissimSingleTypeParser_Reisezeitmessungsdefinition.h"
      61              : #include "typeloader/NIVissimSingleTypeParser_Querschnittsmessungsdefinition.h"
      62              : #include "typeloader/NIVissimSingleTypeParser_Messungsdefinition.h"
      63              : #include "typeloader/NIVissimSingleTypeParser_Verlustzeitmessungsdefinition.h"
      64              : #include "typeloader/NIVissimSingleTypeParser_Stauzaehlerdefinition.h"
      65              : #include "typeloader/NIVissimSingleTypeParser_Richtungspfeildefinition.h"
      66              : #include "typeloader/NIVissimSingleTypeParser_Parkplatzdefinition.h"
      67              : #include "typeloader/NIVissimSingleTypeParser_Fahrverhaltendefinition.h"
      68              : #include "typeloader/NIVissimSingleTypeParser_Streckentypdefinition.h"
      69              : #include "typeloader/NIVissimSingleTypeParser_Kennungszeile.h"
      70              : #include "typeloader/NIVissimSingleTypeParser_Fensterdefinition.h"
      71              : #include "typeloader/NIVissimSingleTypeParser_Auswertungsdefinition.h"
      72              : #include "typeloader/NIVissimSingleTypeParser_Zusammensetzungsdefinition.h"
      73              : #include "typeloader/NIVissimSingleTypeParser_Startzufallszahl.h"
      74              : #include "typeloader/NIVissimSingleTypeParser_SimRate.h"
      75              : #include "typeloader/NIVissimSingleTypeParser_Zeitschrittfaktor.h"
      76              : #include "typeloader/NIVissimSingleTypeParser_Linksverkehr.h"
      77              : #include "typeloader/NIVissimSingleTypeParser_Stauparameterdefinition.h"
      78              : #include "typeloader/NIVissimSingleTypeParser_Gelbverhaltendefinition.h"
      79              : #include "typeloader/NIVissimSingleTypeParser_LSAKopplungsdefinition.h"
      80              : #include "typeloader/NIVissimSingleTypeParser_Gefahrwarnungsdefinition.h"
      81              : #include "typeloader/NIVissimSingleTypeParser_TEAPACDefinition.h"
      82              : #include "typeloader/NIVissimSingleTypeParser_Netzobjektdefinition.h"
      83              : #include "typeloader/NIVissimSingleTypeParser_Fahrtverlaufdateien.h"
      84              : #include "typeloader/NIVissimSingleTypeParser_Emission.h"
      85              : #include "typeloader/NIVissimSingleTypeParser_Einheitendefinition.h"
      86              : #include "typeloader/NIVissimSingleTypeParser__XVerteilungsdefinition.h"
      87              : #include "typeloader/NIVissimSingleTypeParser__XKurvedefinition.h"
      88              : #include "typeloader/NIVissimSingleTypeParser_Kantensperrung.h"
      89              : #include "typeloader/NIVissimSingleTypeParser_Rautedefinition.h"
      90              : 
      91              : 
      92              : #include "tempstructs/NIVissimTL.h"
      93              : #include "tempstructs/NIVissimClosures.h"
      94              : #include "tempstructs/NIVissimSource.h"
      95              : #include "tempstructs/NIVissimTrafficDescription.h"
      96              : #include "tempstructs/NIVissimVehTypeClass.h"
      97              : #include "tempstructs/NIVissimConnection.h"
      98              : #include "tempstructs/NIVissimDisturbance.h"
      99              : #include "tempstructs/NIVissimConnectionCluster.h"
     100              : #include "tempstructs/NIVissimNodeDef.h"
     101              : #include "tempstructs/NIVissimEdge.h"
     102              : #include "tempstructs/NIVissimConflictArea.h"
     103              : #include "tempstructs/NIVissimDistrictConnection.h"
     104              : #include "tempstructs/NIVissimVehicleType.h"
     105              : 
     106              : #include <utils/xml/SUMOSAXHandler.h>
     107              : #include <utils/xml/XMLSubSys.h>
     108              : #include <utils/common/FileHelpers.h>
     109              : #include <utils/common/StringTokenizer.h>
     110              : #include <utils/distribution/Distribution_Points.h>
     111              : #include <utils/distribution/DistributionCont.h>
     112              : 
     113              : #include <netbuild/NBEdgeCont.h> // !!! only for debugging purposes
     114              : 
     115              : 
     116              : // ===========================================================================
     117              : // static variables
     118              : // ===========================================================================
     119              : SequentialStringBijection::Entry NIImporter_Vissim::vissimTags[] = {
     120              :     { "network",          NIImporter_Vissim::VISSIM_TAG_NETWORK },
     121              :     { "lanes",            NIImporter_Vissim::VISSIM_TAG_LANES },
     122              :     { "lane",             NIImporter_Vissim::VISSIM_TAG_LANE },
     123              :     { "link",             NIImporter_Vissim::VISSIM_TAG_LINK },
     124              :     { "links",            NIImporter_Vissim::VISSIM_TAG_LINKS },
     125              :     { "points3D",         NIImporter_Vissim::VISSIM_TAG_POINTS3D },
     126              :     { "point3D",          NIImporter_Vissim::VISSIM_TAG_POINT3D },
     127              :     { "linkPolyPoint",    NIImporter_Vissim::VISSIM_TAG_LINKPOLYPOINT },
     128              :     { "linkPolyPts",      NIImporter_Vissim::VISSIM_TAG_LINKPOLYPTS },
     129              :     { "fromLinkEndPt",    NIImporter_Vissim::VISSIM_TAG_FROM },
     130              :     { "toLinkEndPt",      NIImporter_Vissim::VISSIM_TAG_TO },
     131              :     { "vehicleInput",     NIImporter_Vissim::VISSIM_TAG_VEHICLE_INPUT },
     132              :     { "parkingLot",       NIImporter_Vissim::VISSIM_TAG_PARKINGLOT },
     133              :     { "vehicleClass",     NIImporter_Vissim::VISSIM_TAG_VEHICLE_CLASS },
     134              :     { "intObjectRef",     NIImporter_Vissim::VISSIM_TAG_INTOBJECTREF },
     135              :     { "desSpeedDecision", NIImporter_Vissim::VISSIM_TAG_SPEED_DECISION },
     136              :     {
     137              :         "desSpeedDistribution",
     138              :         NIImporter_Vissim::VISSIM_TAG_SPEED_DIST
     139              :     },
     140              :     {
     141              :         "speedDistributionDataPoint",
     142              :         NIImporter_Vissim::VISSIM_TAG_DATAPOINT
     143              :     },
     144              :     {
     145              :         "vehicleRoutingDecisionStatic",
     146              :         NIImporter_Vissim::VISSIM_TAG_DECISION_STATIC
     147              :     },
     148              :     {
     149              :         "vehicleRouteStatic",
     150              :         NIImporter_Vissim::VISSIM_TAG_ROUTE_STATIC
     151              :     },
     152              :     { "conflictArea",     NIImporter_Vissim::VISSIM_TAG_CA },
     153              :     { "",                 NIImporter_Vissim::VISSIM_TAG_NOTHING }
     154              : };
     155              : 
     156              : 
     157              : SequentialStringBijection::Entry NIImporter_Vissim::vissimAttrs[] = {
     158              :     { "no",             NIImporter_Vissim::VISSIM_ATTR_NO }, //id
     159              :     { "name",           NIImporter_Vissim::VISSIM_ATTR_NAME },
     160              :     { "x",              NIImporter_Vissim::VISSIM_ATTR_X },
     161              :     { "y",              NIImporter_Vissim::VISSIM_ATTR_Y },
     162              :     { "zOffset",        NIImporter_Vissim::VISSIM_ATTR_ZOFFSET },
     163              :     { "surch1",         NIImporter_Vissim::VISSIM_ATTR_ZUSCHLAG1 },
     164              :     { "surch2",         NIImporter_Vissim::VISSIM_ATTR_ZUSCHLAG2 },
     165              :     { "width",          NIImporter_Vissim::VISSIM_ATTR_WIDTH },
     166              :     { "linkBehavType",  NIImporter_Vissim::VISSIM_ATTR_LINKBEHAVETYPE},
     167              :     { "lane",           NIImporter_Vissim::VISSIM_ATTR_LANE },
     168              :     { "pos",            NIImporter_Vissim::VISSIM_ATTR_POS },
     169              :     { "link",           NIImporter_Vissim::VISSIM_ATTR_LINK },
     170              :     { "intLink",        NIImporter_Vissim::VISSIM_ATTR_INTLINK }, //edgeID
     171              :     { "relFlow",        NIImporter_Vissim::VISSIM_ATTR_PERCENTAGE },
     172              :     { "zone",           NIImporter_Vissim::VISSIM_ATTR_DISTRICT },
     173              :     { "color",          NIImporter_Vissim::VISSIM_ATTR_COLOR },
     174              :     { "key",            NIImporter_Vissim::VISSIM_ATTR_KEY },
     175              :     { "fx",             NIImporter_Vissim::VISSIM_ATTR_FX },
     176              :     { "destLink",       NIImporter_Vissim::VISSIM_ATTR_DESTLINK },
     177              :     { "destPos",        NIImporter_Vissim::VISSIM_ATTR_DESTPOS },
     178              :     { "link1",          NIImporter_Vissim::VISSIM_ATTR_LINK1 },
     179              :     { "link2",          NIImporter_Vissim::VISSIM_ATTR_LINK2 },
     180              :     { "status",         NIImporter_Vissim::VISSIM_ATTR_STATUS },
     181              :     { "",               NIImporter_Vissim::VISSIM_ATTR_NOTHING }
     182              : };
     183              : 
     184              : 
     185              : // ===========================================================================
     186              : // method definitions
     187              : // ===========================================================================
     188              : // ---------------------------------------------------------------------------
     189              : // static methods (interface in this case)
     190              : // ---------------------------------------------------------------------------
     191              : void
     192         1892 : NIImporter_Vissim::loadNetwork(const OptionsCont& oc, NBNetBuilder& nb) {
     193         3784 :     if (!oc.isSet("vissim-file")) {
     194              :         return;
     195              :     }
     196            9 :     NIImporter_Vissim(nb).load(oc);
     197              : }
     198              : 
     199              : 
     200              : // ---------------------------------------------------------------------------
     201              : // definitions of NIVissimXMLHandler_Streckendefinition-methods
     202              : // ---------------------------------------------------------------------------
     203            2 : NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::NIVissimXMLHandler_Streckendefinition(
     204              :     //std::map<int, VissimXMLEdge>& toFill)
     205            2 :     nodeMap& elemData)
     206              :     : GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
     207              :                         vissimAttrs, VISSIM_ATTR_NOTHING,
     208              :                         "vissim - file"),
     209            2 :       myElemData(elemData),
     210            2 :       myHierarchyLevel(0),
     211            4 :       isConnector(false) {
     212              :     myElemData.clear();
     213            2 : }
     214              : 
     215            2 : NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::~NIVissimXMLHandler_Streckendefinition() { }
     216              : 
     217              : void
     218         3966 : NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
     219         3966 :     myHierarchyLevel++;
     220              : 
     221              :     // finding an actual LINK
     222         3966 :     if (element == VISSIM_TAG_LINK) {
     223              :         //parse all links
     224           32 :         bool ok = true;
     225           32 :         int id = attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok);
     226           32 :         myLastNodeID = id;
     227              : 
     228              :         // !!! assuming empty myElemData
     229           64 :         myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));
     230              :         // error ignored if name is empty
     231           64 :         myElemData["name"].push_back(attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false));
     232           64 :         myElemData["type"].push_back(attrs.get<std::string>(VISSIM_ATTR_LINKBEHAVETYPE, nullptr, ok));
     233           64 :         myElemData["zuschlag1"].push_back(attrs.get<std::string>(VISSIM_ATTR_ZUSCHLAG1, nullptr, ok));
     234           64 :         myElemData["zuschlag2"].push_back(attrs.get<std::string>(VISSIM_ATTR_ZUSCHLAG2, nullptr, ok));
     235              :     }
     236              : 
     237         3966 :     if (element == VISSIM_TAG_LANE) {
     238           40 :         bool ok = true;
     239              :         // appends empty element if no width found
     240              :         // error ignored if name is empty
     241           80 :         myElemData["width"].push_back(attrs.get<std::string>(VISSIM_ATTR_WIDTH, nullptr, ok, false));
     242              :     }
     243              : 
     244         3966 :     if (element == VISSIM_TAG_FROM) {
     245           14 :         if (isConnector != true) {
     246           14 :             isConnector = true;
     247              :         }
     248           14 :         bool ok = true;
     249           42 :         std::vector<std::string> from(StringTokenizer(attrs.get<std::string>(
     250           14 :                                           VISSIM_ATTR_LANE, nullptr, ok), " ").getVector());
     251           28 :         myElemData["from_pos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));
     252           14 :         myElemData["from_id"].push_back(from[0]);
     253           14 :         myElemData["from_lane"].push_back(from[1]);
     254           14 :     }
     255              : 
     256         3966 :     if (element == VISSIM_TAG_TO) {
     257           14 :         bool ok = true;
     258           42 :         std::vector<std::string> to(StringTokenizer(attrs.get<std::string>(
     259           14 :                                         VISSIM_ATTR_LANE, nullptr, ok), " ").getVector());
     260           28 :         myElemData["to_pos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));
     261           14 :         myElemData["to_id"].push_back(to[0]);
     262           14 :         myElemData["to_lane"].push_back(to[1]);
     263           14 :     }
     264              : 
     265         3966 :     if (element == VISSIM_TAG_POINT3D || element == VISSIM_TAG_LINKPOLYPOINT) {
     266          162 :         bool ok = true;
     267              :         // create a <sep> separated string of coordinate data
     268          162 :         std::string sep(" ");
     269              : 
     270          162 :         std::string posS(attrs.get<std::string>(VISSIM_ATTR_X, nullptr, ok));
     271              :         posS += sep;
     272          162 :         posS.append(attrs.get<std::string>(VISSIM_ATTR_Y, nullptr, ok));
     273              :         // allow for no Z
     274          162 :         std::string z(attrs.get<std::string>(VISSIM_ATTR_ZOFFSET, nullptr, ok, false));
     275          162 :         if (z.length() > 0) {
     276              :             posS += sep;
     277              :             posS.append(z);
     278              :         }
     279          324 :         myElemData["pos"].push_back(posS);
     280              :     }
     281              : 
     282              : 
     283         3966 : }
     284              : 
     285              : void
     286         3966 : NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::myEndElement(int element) {
     287         3966 :     if (element == VISSIM_TAG_LINK && myHierarchyLevel == 3) {
     288              :         //std::cout << "elemData len:" << myElemData.size() << std::endl;
     289              : 
     290              :         NIVissimClosedLanesVector clv;          //FIXME -> clv einlesen
     291              :         std::vector<int> assignedVehicles;      //FIXME -> assignedVehicles einlesen
     292           32 :         int id(StringUtils::toInt(myElemData["id"].front()));
     293              : 
     294           32 :         PositionVector geom;
     295              :         // convert all position coordinate strings to PositionVectors
     296          388 :         while (!myElemData["pos"].empty()) {
     297          486 :             std::vector<std::string> sPos_v(StringTokenizer(
     298          486 :                                                 myElemData["pos"].front(), " ").getVector());
     299          162 :             myElemData["pos"].pop_front();
     300          162 :             std::vector<double> pos_v(3);
     301              : 
     302              :             // doing a transform with explicit hint on function signature
     303              :             std::transform(sPos_v.begin(), sPos_v.end(), pos_v.begin(),
     304              :                            StringUtils::toDouble);
     305          162 :             geom.push_back_noDoublePos(Position(pos_v[0], pos_v[1], pos_v[2]));
     306          162 :         }
     307              :         // FIXME: a length = 0 PosVec seems fatal -> segfault
     308           32 :         double length(geom.length());
     309              : 
     310           32 :         if (!isConnector) {
     311              :             // Add Edge
     312              :             std::vector<double> laneWidths;
     313           61 :             for (std::string& w : myElemData["width"]) {
     314           25 :                 laneWidths.push_back(StringUtils::toDouble(w));
     315              :             }
     316              :             NIVissimEdge* edge = new NIVissimEdge(id,
     317           36 :                                                   myElemData["name"].front(),
     318           18 :                                                   myElemData["type"].front(),
     319              :                                                   laneWidths,
     320           36 :                                                   StringUtils::toDouble(myElemData["zuschlag1"].front()),
     321           18 :                                                   StringUtils::toDouble(myElemData["zuschlag2"].front()),
     322           90 :                                                   length, geom, clv);
     323           18 :             NIVissimEdge::dictionary(id, edge);
     324           18 :         } else {
     325           14 :             int numLanes = (int)myElemData["width"].size();
     326           14 :             std::vector<int> laneVec(numLanes);
     327              :             // Add Connector
     328              : 
     329              :             //NOTE: there should be only 1 lane number in XML
     330              :             // subtraction of 1 as in readExtEdgePointDef()
     331           14 :             laneVec[0] = StringUtils::toInt(myElemData["from_lane"].front()) - 1;
     332              :             // then count up, building lane number vector
     333           15 :             for (std::vector<int>::iterator each = ++laneVec.begin(); each != laneVec.end(); ++each) {
     334            1 :                 *each = *(each - 1) + 1;
     335              :             }
     336              : 
     337              :             NIVissimExtendedEdgePoint from_def(
     338           28 :                 StringUtils::toInt(myElemData["from_id"].front()),
     339              :                 laneVec,
     340           14 :                 StringUtils::toDouble(myElemData["from_pos"].front()),
     341           28 :                 assignedVehicles);
     342              : 
     343              :             //NOTE: there should be only 1 lane number in XML
     344              :             // subtraction of 1 as in readExtEdgePointDef()
     345           14 :             laneVec[0] = StringUtils::toInt(myElemData["to_lane"].front()) - 1;
     346              :             // then count up, building lane number vector
     347           15 :             for (std::vector<int>::iterator each = ++laneVec.begin(); each != laneVec.end(); ++each) {
     348            1 :                 *each = *(each - 1) + 1;
     349              :             }
     350              : 
     351              :             NIVissimExtendedEdgePoint to_def(
     352           28 :                 StringUtils::toInt(myElemData["to_id"].front()),
     353              :                 laneVec,
     354           14 :                 StringUtils::toDouble(myElemData["to_pos"].front()),
     355           28 :                 assignedVehicles);
     356              : 
     357              :             NIVissimConnection* connector = new
     358              :             NIVissimConnection(id,
     359           14 :                                myElemData["name"].front(),
     360              :                                from_def, to_def,
     361           28 :                                geom, assignedVehicles, clv);
     362              : 
     363           14 :             NIVissimConnection::dictionary(id, connector);
     364           14 :         }
     365              :         // clear the element data
     366           32 :         myElemData.clear();
     367           32 :         isConnector = false;
     368              :         //std::cout << "elemData len (clear):" << myElemData.size() << std::endl;
     369              :         //std::cout.flush();
     370              : 
     371           32 :     }
     372         3966 :     --myHierarchyLevel;
     373         3966 : }
     374              : 
     375              : 
     376              : // ---------------------------------------------------------------------------
     377              : // definitions of NIVissimXMLHandler_Zuflussdefinition-methods
     378              : // ---------------------------------------------------------------------------
     379            2 : NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::NIVissimXMLHandler_Zuflussdefinition()
     380              :     : GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
     381              :                         vissimAttrs, VISSIM_ATTR_NOTHING,
     382            4 :                         "vissim - file") {
     383            2 : }
     384              : 
     385            2 : NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::~NIVissimXMLHandler_Zuflussdefinition() { }
     386              : 
     387              : void
     388         3966 : NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
     389              :     // finding an actual flow
     390         3966 :     if (element == VISSIM_TAG_VEHICLE_INPUT) {
     391              :         //parse all flows
     392           12 :         bool ok = true;
     393           12 :         std::string id = attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok);
     394           12 :         std::string edgeid = attrs.get<std::string>(VISSIM_ATTR_LINK, nullptr, ok);
     395           12 :         std::string name = attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false);
     396              : 
     397           12 :         NIVissimSource::dictionary(id,
     398              :                                    name,
     399              :                                    edgeid);
     400              :     }
     401         3966 : }
     402              : 
     403              : // ---------------------------------------------------------------------------
     404              : // definitions of NIVissimXMLHandler_Parkplatzdefinition-methods
     405              : // ---------------------------------------------------------------------------
     406            0 : NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::NIVissimXMLHandler_Parkplatzdefinition()
     407              :     : GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
     408              :                         vissimAttrs, VISSIM_ATTR_NOTHING,
     409            0 :                         "vissim - file") {
     410            0 : }
     411              : 
     412            0 : NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::~NIVissimXMLHandler_Parkplatzdefinition() { }
     413              : 
     414              : void
     415            0 : NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
     416              :     // finding an actual parkinglot
     417            0 :     if (element == VISSIM_TAG_PARKINGLOT) {
     418              :         //parse all parkinglots
     419            0 :         bool ok = true;
     420            0 :         int id = attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok);
     421            0 :         int edgeid = attrs.get<int>(VISSIM_ATTR_INTLINK, nullptr, ok);
     422            0 :         std::string name = attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false);
     423            0 :         double position = attrs.get<double>(VISSIM_ATTR_POS, nullptr, ok);
     424              :         std::vector<std::pair<int, int> > assignedVehicles; // (vclass, vwunsch)
     425              :         //FIXME: vWunsch + Fahzeugklassen einlesen
     426              :         // There can be s
     427              :         std::vector<int> districts;
     428              :         //FIXME: Parkplatzdefinition für mehrere Zonen implementieren
     429              :         std::vector<double> percentages;
     430            0 :         districts.push_back(attrs.get<int>(VISSIM_ATTR_DISTRICT, nullptr, ok));
     431            0 :         percentages.push_back(attrs.get<double>(VISSIM_ATTR_PERCENTAGE, nullptr, ok));
     432              : 
     433            0 :         NIVissimDistrictConnection::dictionary(id,
     434              :                                                name,
     435              :                                                districts,
     436              :                                                percentages,
     437              :                                                edgeid,
     438              :                                                position,
     439              :                                                assignedVehicles);
     440            0 :     }
     441            0 : }
     442              : 
     443              : 
     444              : // ---------------------------------------------------------------------------
     445              : // definitions of NIVissimXMLHandler_Fahrzeugklassendefinition-methods
     446              : // ---------------------------------------------------------------------------
     447            2 : NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::NIVissimXMLHandler_Fahrzeugklassendefinition(nodeMap& elemData)
     448              :     : GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
     449              :                         vissimAttrs, VISSIM_ATTR_NOTHING,
     450              :                         "vissim - file"),
     451            2 :       myElemData(elemData),
     452            4 :       myHierarchyLevel(0) {
     453              :     myElemData.clear();
     454            2 : }
     455              : 
     456            2 : NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::~NIVissimXMLHandler_Fahrzeugklassendefinition() { }
     457              : 
     458              : void
     459         3966 : NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
     460         3966 :     myHierarchyLevel++;
     461              : 
     462         3966 :     if (element == VISSIM_TAG_VEHICLE_CLASS) {
     463           21 :         bool ok = true;
     464           42 :         myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));
     465           42 :         myElemData["name"].push_back(attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false));
     466           21 :         std::string colorStr(attrs.get<std::string>(VISSIM_ATTR_COLOR, nullptr, ok));
     467           84 :         for (int pos = (int)colorStr.size() - 2; pos > 0; pos -= 2) {
     468           63 :             colorStr.insert(pos, " ");
     469              :         }
     470           42 :         myElemData["color"].push_back(colorStr);
     471              :     }
     472         3966 :     if (element == VISSIM_TAG_INTOBJECTREF) {
     473           61 :         bool ok = true;
     474          122 :         myElemData["types"].push_back(attrs.get<std::string>(VISSIM_ATTR_KEY, nullptr, ok));
     475              : 
     476              : 
     477              :     }
     478         3966 : }
     479              : 
     480              : void
     481         3966 : NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::myEndElement(int element) {
     482         3966 :     if (element == VISSIM_TAG_VEHICLE_CLASS && myHierarchyLevel == 3) {
     483           21 :         RGBColor color;
     484           21 :         std::istringstream iss(myElemData["color"].front());
     485           84 :         std::vector<std::string> sCol_v(StringTokenizer(
     486           63 :                                             myElemData["color"].front(), " ").getVector());
     487           21 :         std::vector<int> myColorVector(sCol_v.size());
     488              :         std::transform(sCol_v.begin(), sCol_v.end(), myColorVector.begin(), StringUtils::hexToInt);
     489              : 
     490           21 :         color = RGBColor((unsigned char)myColorVector[0],
     491              :                          (unsigned char)myColorVector[1],
     492              :                          (unsigned char)myColorVector[2],
     493              :                          (unsigned char)myColorVector[3]);
     494              :         std::vector<int> types;
     495           88 :         while (!myElemData["types"].empty()) {
     496           23 :             types.push_back(StringUtils::toInt(myElemData["types"].front()));
     497           46 :             myElemData["types"].pop_front();
     498              :         }
     499              : 
     500           42 :         NIVissimVehTypeClass::dictionary(StringUtils::toInt(myElemData["id"].front()),
     501           21 :                                          myElemData["name"].front(),
     502              :                                          color,
     503              :                                          types);
     504           21 :         myElemData.clear();
     505           21 :     }
     506         3966 :     --myHierarchyLevel;
     507         3966 : }
     508              : 
     509              : // ---------------------------------------------------------------------------
     510              : // definitions of NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition-methods
     511              : // ---------------------------------------------------------------------------
     512            2 : NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition(nodeMap& elemData)
     513              :     : GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
     514              :                         vissimAttrs, VISSIM_ATTR_NOTHING,
     515              :                         "vissim - file"),
     516            2 :       myElemData(elemData),
     517            4 :       myHierarchyLevel(0) {
     518              :     myElemData.clear();
     519            2 : }
     520              : 
     521            2 : NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::~NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition() { }
     522              : 
     523              : void
     524         3966 : NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
     525         3966 :     myHierarchyLevel++;
     526         3966 :     if (element == VISSIM_TAG_SPEED_DIST) {
     527           86 :         bool ok = true;
     528          172 :         myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));
     529              :     }
     530              : 
     531         3966 :     if (element == VISSIM_TAG_DATAPOINT) {
     532          462 :         bool ok = true;
     533          462 :         std::string sep(" ");
     534          462 :         std::string posS(attrs.get<std::string>(VISSIM_ATTR_X, nullptr, ok));
     535              :         posS += sep;
     536          462 :         posS.append(attrs.get<std::string>(VISSIM_ATTR_FX, nullptr, ok));
     537          924 :         myElemData["points"].push_back(posS);
     538              : 
     539              :     }
     540              : 
     541         3966 : }
     542              : 
     543              : void
     544         3966 : NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::myEndElement(int element) {
     545         3966 :     if (element == VISSIM_TAG_SPEED_DIST && myHierarchyLevel == 3) {
     546           86 :         Distribution_Points* points = new Distribution_Points(myElemData["id"].front());
     547         1096 :         while (!myElemData["points"].empty()) {
     548         1386 :             std::vector<std::string> sPos_v(StringTokenizer(
     549         1386 :                                                 myElemData["points"].front(), " ").getVector());
     550          462 :             myElemData["points"].pop_front();
     551          462 :             points->add(StringUtils::toDouble(sPos_v[0]), StringUtils::toDouble(sPos_v[1]));
     552          462 :         }
     553          172 :         DistributionCont::dictionary("speed", myElemData["id"].front(), points);
     554           86 :         myElemData.clear();
     555              :     }
     556         3966 :     --myHierarchyLevel;
     557         3966 : }
     558              : 
     559              : // ---------------------------------------------------------------------------
     560              : // definitions of NIVissimXMLHandler_VWunschentscheidungsdefinition-methods
     561              : // ---------------------------------------------------------------------------
     562            0 : NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::NIVissimXMLHandler_VWunschentscheidungsdefinition(nodeMap& elemData)
     563              :     : GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
     564              :                         vissimAttrs, VISSIM_ATTR_NOTHING,
     565              :                         "vissim - file"),
     566            0 :       myElemData(elemData),
     567            0 :       myHierarchyLevel(0) {
     568              :     myElemData.clear();
     569            0 : }
     570              : 
     571            0 : NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::~NIVissimXMLHandler_VWunschentscheidungsdefinition() { }
     572              : 
     573              : void
     574            0 : NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
     575            0 :     myHierarchyLevel++;
     576            0 :     if (element == VISSIM_TAG_SPEED_DECISION) {
     577            0 :         bool ok = true;
     578            0 :         myElemData["name"].push_back(attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false));
     579              :         //FIXME: 2 vWunsch in the xml file, but only 1 of them is set???
     580              :     }
     581              : 
     582            0 : }
     583              : 
     584              : void
     585            0 : NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::myEndElement(int /* element */) {
     586            0 :     --myHierarchyLevel;
     587            0 : }
     588              : 
     589              : 
     590              : // ---------------------------------------------------------------------------
     591              : // definitions of NIVissimXMLHandler_Routenentscheidungsdefinition-methods
     592              : // ---------------------------------------------------------------------------
     593            0 : NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::NIVissimXMLHandler_Routenentscheidungsdefinition(nodeMap& elemData)
     594              :     : GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
     595              :                         vissimAttrs, VISSIM_ATTR_NOTHING,
     596              :                         "vissim - file"),
     597            0 :       myElemData(elemData),
     598            0 :       myHierarchyLevel(0) {
     599              :     myElemData.clear();
     600            0 : }
     601              : 
     602            0 : NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::~NIVissimXMLHandler_Routenentscheidungsdefinition() { }
     603              : 
     604              : void
     605            0 : NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
     606            0 :     myHierarchyLevel++;
     607            0 :     if (element == VISSIM_TAG_DECISION_STATIC) {
     608            0 :         bool ok = true;
     609            0 :         myElemData["startLink"].push_back(attrs.get<std::string>(VISSIM_ATTR_LINK, nullptr, ok));
     610            0 :         myElemData["startPos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));
     611              :     }
     612            0 :     if (element == VISSIM_TAG_ROUTE_STATIC) {
     613            0 :         bool ok = true;
     614            0 :         myElemData["destLink"].push_back(attrs.get<std::string>(VISSIM_ATTR_DESTLINK, nullptr, ok));
     615            0 :         myElemData["destPos"].push_back(attrs.get<std::string>(VISSIM_ATTR_DESTPOS, nullptr, ok));
     616            0 :         myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));
     617              :     }
     618              :     if (element == VISSIM_TAG_INTOBJECTREF) {
     619              :         // bool ok = true;
     620              :     }
     621              : 
     622            0 : }
     623              : 
     624              : void
     625            0 : NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::myEndElement(int /* element */) {
     626            0 :     --myHierarchyLevel;
     627            0 : }
     628              : 
     629              : // ---------------------------------------------------------------------------
     630              : // definitions of NIVissimXMLHandler_ConflictArea-methods
     631              : // ---------------------------------------------------------------------------
     632            2 : NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::NIVissimXMLHandler_ConflictArea()
     633              :     : GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
     634              :                         vissimAttrs, VISSIM_ATTR_NOTHING,
     635            4 :                         "vissim - file") {}
     636              : 
     637            2 : NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::~NIVissimXMLHandler_ConflictArea() { }
     638              : 
     639              : void
     640         3966 : NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::myStartElement(int element, const SUMOSAXAttributes& attrs) {
     641              :     // finding an actual flow
     642         3966 :     if (element == VISSIM_TAG_CA) {
     643              :         //parse all flows
     644           80 :         bool ok = true;
     645           80 :         std::string status = attrs.get<std::string>(VISSIM_ATTR_STATUS, nullptr, ok);
     646              :         //get only the conflict areas which were set in VISSIM
     647           80 :         if (status != "PASSIVE") {
     648           50 :             NIVissimConflictArea::dictionary(attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok),
     649          100 :                                              attrs.get<std::string>(VISSIM_ATTR_LINK1, nullptr, ok),
     650          100 :                                              attrs.get<std::string>(VISSIM_ATTR_LINK2, nullptr, ok),
     651              :                                              status);
     652              :         }
     653              : 
     654              :     }
     655         3966 : }
     656              : 
     657              : 
     658              : /* -------------------------------------------------------------------------
     659              :  * NIImporter_Vissim::VissimSingleTypeParser-methods
     660              :  * ----------------------------------------------------------------------- */
     661          540 : NIImporter_Vissim::VissimSingleTypeParser::VissimSingleTypeParser(NIImporter_Vissim& parent)
     662          540 :     : myVissimParent(parent) {}
     663              : 
     664              : 
     665          540 : NIImporter_Vissim::VissimSingleTypeParser::~VissimSingleTypeParser() {}
     666              : 
     667              : 
     668              : std::string
     669        92344 : NIImporter_Vissim::VissimSingleTypeParser::myRead(std::istream& from) {
     670              :     std::string tmp;
     671        92344 :     from >> tmp;
     672       184688 :     return StringUtils::to_lower_case(tmp);
     673              : }
     674              : 
     675              : 
     676              : 
     677              : std::string
     678        28727 : NIImporter_Vissim::VissimSingleTypeParser::readEndSecure(std::istream& from,
     679              :         const std::string& excl) {
     680        28727 :     std::string myExcl = StringUtils::to_lower_case(excl);
     681        28727 :     std::string tmp = myRead(from);
     682        28727 :     if (tmp == "") {
     683            0 :         return "DATAEND";
     684              :     }
     685        28727 :     if (tmp != myExcl
     686        28727 :             &&
     687        56478 :             (tmp.substr(0, 2) == "--" || !myVissimParent.admitContinue(tmp))
     688              :        ) {
     689         3037 :         return "DATAEND";
     690              :     }
     691        25690 :     return StringUtils::to_lower_case(tmp);
     692              : }
     693              : 
     694              : 
     695              : std::string
     696          113 : NIImporter_Vissim::VissimSingleTypeParser::readEndSecure(std::istream& from,
     697              :         const std::vector<std::string>& excl) {
     698              :     std::vector<std::string> myExcl;
     699              :     std::vector<std::string>::const_iterator i;
     700          339 :     for (i = excl.begin(); i != excl.end(); i++) {
     701          226 :         std::string mes = StringUtils::to_lower_case(*i);
     702          226 :         myExcl.push_back(mes);
     703              :     }
     704          113 :     std::string tmp = myRead(from);
     705          113 :     if (tmp == "") {
     706            0 :         return "DATAEND";
     707              :     }
     708              : 
     709              :     bool equals = false;
     710          339 :     for (i = myExcl.begin(); i != myExcl.end() && !equals; i++) {
     711          226 :         if ((*i) == tmp) {
     712              :             equals = true;
     713              :         }
     714              :     }
     715          113 :     if (!equals
     716          113 :             &&
     717          214 :             (tmp.substr(0, 2) == "--" || !myVissimParent.admitContinue(tmp))
     718              :        ) {
     719            6 :         return "DATAEND";
     720              :     }
     721          107 :     return StringUtils::to_lower_case(tmp);
     722          113 : }
     723              : 
     724              : 
     725              : std::string
     726         4324 : NIImporter_Vissim::VissimSingleTypeParser::overrideOptionalLabel(std::istream& from,
     727              :         const std::string& tag) {
     728              :     std::string tmp;
     729         4324 :     if (tag == "") {
     730         8338 :         tmp = myRead(from);
     731              :     } else {
     732              :         tmp = tag;
     733              :     }
     734         4324 :     if (tmp == "beschriftung") {
     735         1726 :         tmp = myRead(from);
     736         1726 :         if (tmp == "keine") {
     737            0 :             from >> tmp;
     738              :         }
     739         1726 :         tmp = myRead(from);
     740         3452 :         tmp = myRead(from);
     741              :     }
     742         4324 :     return tmp;
     743              : }
     744              : 
     745              : 
     746              : Position
     747         2939 : NIImporter_Vissim::VissimSingleTypeParser::getPosition(std::istream& from) {
     748              :     double x, y;
     749              :     from >> x; // type-checking is missing!
     750              :     from >> y; // type-checking is missing!
     751         2939 :     return Position(x, y);
     752              : }
     753              : 
     754              : 
     755              : std::vector<int>
     756          155 : NIImporter_Vissim::VissimSingleTypeParser::parseAssignedVehicleTypes(
     757              :     std::istream& from, const std::string& next) {
     758          310 :     std::string tmp = readEndSecure(from);
     759              :     std::vector<int> ret;
     760          155 :     if (tmp == "alle") {
     761          155 :         ret.push_back(-1);
     762          155 :         return ret;
     763              :     }
     764            0 :     while (tmp != "DATAEND" && tmp != next) {
     765            0 :         ret.push_back(StringUtils::toInt(tmp));
     766            0 :         tmp = readEndSecure(from);
     767              :     }
     768              :     return ret;
     769            0 : }
     770              : 
     771              : 
     772              : NIVissimExtendedEdgePoint
     773         1826 : NIImporter_Vissim::VissimSingleTypeParser::readExtEdgePointDef(
     774              :     std::istream& from) {
     775              :     std::string tag;
     776         1826 :     from >> tag; // "Strecke"
     777              :     int edgeid;
     778         1826 :     from >> edgeid; // type-checking is missing!
     779         1826 :     from >> tag; // "Spuren"
     780              :     std::vector<int> lanes;
     781         5942 :     while (tag != "bei") {
     782         8232 :         tag = readEndSecure(from);
     783         4116 :         if (tag != "bei") {
     784         2290 :             int lane = StringUtils::toInt(tag);
     785         2290 :             lanes.push_back(lane - 1);
     786              :         }
     787              :     }
     788              :     double position;
     789              :     from >> position;
     790              :     std::vector<int> dummy;
     791         3652 :     return NIVissimExtendedEdgePoint(edgeid, lanes, position, dummy);
     792         1826 : }
     793              : 
     794              : 
     795              : std::string
     796         2684 : NIImporter_Vissim::VissimSingleTypeParser::readName(std::istream& from) {
     797              :     std::string name;
     798         2684 :     from >> name;
     799         2684 :     if (name[0] == '"') {
     800         4201 :         while (name[name.length() - 1] != '"') {
     801              :             std::string tmp;
     802         1517 :             from >> tmp;
     803         4551 :             name = name + " " + tmp;
     804              :         }
     805         5368 :         name = name.substr(1, name.length() - 2);
     806              :     }
     807         5368 :     return StringUtils::convertUmlaute(name);
     808              : }
     809              : 
     810              : 
     811              : void
     812          241 : NIImporter_Vissim::VissimSingleTypeParser::readUntil(std::istream& from,
     813              :         const std::string& name) {
     814              :     std::string tag;
     815         5212 :     while (tag != name) {
     816         9942 :         tag = myRead(from);
     817              :     }
     818          241 : }
     819              : 
     820              : bool
     821          108 : NIImporter_Vissim::VissimSingleTypeParser::skipOverreading(std::istream& from,
     822              :         const std::string& name) {
     823              :     std::string tag;
     824          432 :     while (tag != name) {
     825          648 :         tag = myRead(from);
     826              :     }
     827          756 :     while (tag != "DATAEND") {
     828         1296 :         tag = readEndSecure(from);
     829              :     }
     830          108 :     return true;
     831              : }
     832              : 
     833              : 
     834              : 
     835              : /* -------------------------------------------------------------------------
     836              :  * NIImporter_Vissim-methods
     837              :  * ----------------------------------------------------------------------- */
     838            9 : NIImporter_Vissim::NIImporter_Vissim(NBNetBuilder& nb) : myNetBuilder(nb) {
     839            9 :     insertKnownElements();
     840            9 :     buildParsers();
     841            9 :     myColorMap["blau"] = RGBColor(77, 77, 255, 255);
     842            9 :     myColorMap["gelb"] = RGBColor::YELLOW;
     843            9 :     myColorMap["grau"] = RGBColor::GREY;
     844            9 :     myColorMap["lila"] = RGBColor::MAGENTA;
     845            9 :     myColorMap["gruen"] = RGBColor::GREEN;
     846            9 :     myColorMap["rot"] = RGBColor::RED;
     847            9 :     myColorMap["schwarz"] = RGBColor::BLACK;
     848            9 :     myColorMap["tuerkis"] = RGBColor::CYAN;
     849            9 :     myColorMap["weiss"] = RGBColor::WHITE;
     850            9 :     myColorMap["keine"] = RGBColor::WHITE;
     851            9 : }
     852              : 
     853              : 
     854              : 
     855              : 
     856            9 : NIImporter_Vissim::~NIImporter_Vissim() {
     857            9 :     NIVissimAbstractEdge::clearDict();
     858            9 :     NIVissimClosures::clearDict();
     859            9 :     NIVissimDistrictConnection::clearDict();
     860            9 :     NIVissimDisturbance::clearDict();
     861            9 :     NIVissimNodeCluster::clearDict();
     862            9 :     NIVissimNodeDef::clearDict();
     863            9 :     NIVissimSource::clearDict();
     864            9 :     NIVissimTL::clearDict();
     865            9 :     NIVissimTL::NIVissimTLSignal::clearDict();
     866            9 :     NIVissimTL::NIVissimTLSignalGroup::clearDict();
     867            9 :     NIVissimTrafficDescription::clearDict();
     868            9 :     NIVissimVehTypeClass::clearDict();
     869            9 :     NIVissimVehicleType::clearDict();
     870            9 :     NIVissimConnectionCluster::clearDict();
     871            9 :     NIVissimEdge::clearDict();
     872            9 :     NIVissimAbstractEdge::clearDict();
     873            9 :     NIVissimConnection::clearDict();
     874            9 :     NIVissimConflictArea::clearDict();
     875          549 :     for (ToParserMap::iterator i = myParsers.begin(); i != myParsers.end(); i++) {
     876          540 :         delete (*i).second;
     877              :     }
     878            9 : }
     879              : 
     880              : 
     881              : void
     882            9 : NIImporter_Vissim::load(const OptionsCont& options) {
     883           18 :     const std::string file = options.getString("vissim-file");
     884              :     // try to open the file
     885            9 :     std::ifstream strm(file.c_str());
     886            9 :     if (!strm.good()) {
     887            0 :         WRITE_ERRORF(TL("Could not open vissim-file '%'."), file);
     888            0 :         return;
     889              :     }
     890              :     std::string token;
     891            9 :     strm >> token;
     892           23 :     if (StringUtils::endsWith(file, ".inpx") || StringUtils::endsWith(token, "<?xml") || StringUtils::endsWith(token, "<network")) {
     893              :         // Create NIVissimXMLHandlers
     894            2 :         NIVissimXMLHandler_Streckendefinition XMLHandler_Streckendefinition(elementData);
     895            2 :         NIVissimXMLHandler_Zuflussdefinition XMLHandler_Zuflussdefinition;
     896              :         //NIVissimXMLHandler_Parkplatzdefinition XMLHandler_Parkplatzdefinition;
     897            2 :         NIVissimXMLHandler_Fahrzeugklassendefinition XMLHandler_Fahrzeugklassendefinition(elementData);
     898            2 :         NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition XMLHandler_Geschwindigkeitsverteilung(elementData);
     899            2 :         NIVissimXMLHandler_ConflictArea XMLHandler_ConflictAreas;
     900              : 
     901              :         // Strecken + Verbinder
     902            2 :         XMLHandler_Streckendefinition.setFileName(file);
     903            6 :         PROGRESS_BEGIN_MESSAGE("Parsing strecken+verbinder from vissim-file '" + file + "'");
     904            2 :         if (!XMLSubSys::runParser(XMLHandler_Streckendefinition, file)) {
     905              :             return;
     906              :         }
     907            2 :         PROGRESS_DONE_MESSAGE();
     908              : 
     909              :         // Zuflüsse
     910            2 :         XMLHandler_Zuflussdefinition.setFileName(file);
     911            6 :         PROGRESS_BEGIN_MESSAGE("Parsing zuflüsse from vissim-file '" + file + "'");
     912            2 :         if (!XMLSubSys::runParser(XMLHandler_Zuflussdefinition, file)) {
     913              :             return;
     914              :         }
     915            2 :         PROGRESS_DONE_MESSAGE();
     916              : 
     917              :         //Geschwindigkeitsverteilungen
     918            2 :         XMLHandler_Geschwindigkeitsverteilung.setFileName(file);
     919            6 :         PROGRESS_BEGIN_MESSAGE("Parsing parkplätze from vissim-file '" + file + "'");
     920            2 :         if (!XMLSubSys::runParser(XMLHandler_Geschwindigkeitsverteilung, file)) {
     921              :             return;
     922              :         }
     923            2 :         PROGRESS_DONE_MESSAGE();
     924              : 
     925              : 
     926              :         //Fahrzeugklassen
     927            2 :         XMLHandler_Fahrzeugklassendefinition.setFileName(file);
     928            6 :         PROGRESS_BEGIN_MESSAGE("Parsing parkplätze from vissim-file '" + file + "'");
     929            2 :         if (!XMLSubSys::runParser(XMLHandler_Fahrzeugklassendefinition, file)) {
     930              :             return;
     931              :         }
     932            2 :         PROGRESS_DONE_MESSAGE();
     933              : 
     934              :         //Parkplätze
     935              :         /*XMLHandler_Parkplatzdefinition.setFileName(file);
     936              :         PROGRESS_BEGIN_MESSAGE("Parsing parkplätze from vissim-file '" + file + "'");
     937              :         if (!XMLSubSys::runParser(XMLHandler_Parkplatzdefinition, file)) {
     938              :         return;
     939              :         }
     940              :         PROGRESS_DONE_MESSAGE();*/
     941              : 
     942              : 
     943              :         //Konfliktflächen
     944            2 :         XMLHandler_ConflictAreas.setFileName(file);
     945            6 :         PROGRESS_BEGIN_MESSAGE("Parsing conflict areas from vissim-file '" + file + "'");
     946            2 :         if (!XMLSubSys::runParser(XMLHandler_ConflictAreas, file)) {
     947              :             return;
     948              :         }
     949            2 :         PROGRESS_DONE_MESSAGE();
     950            2 :     } else {
     951            7 :         strm.seekg(strm.beg);
     952            7 :         if (!readContents(strm)) {
     953              :             return;
     954              :         }
     955              :     }
     956           18 :     postLoadBuild(options.getFloat("vissim.join-distance"));
     957            9 : }
     958              : 
     959              : 
     960              : bool
     961        27785 : NIImporter_Vissim::admitContinue(const std::string& tag) {
     962              :     ToElemIDMap::const_iterator i = myKnownElements.find(tag);
     963        27785 :     if (i == myKnownElements.end()) {
     964              :         return true;
     965              :     }
     966         2976 :     myLastSecure = tag;
     967              :     return false;
     968              : }
     969              : 
     970              : 
     971              : bool
     972            7 : NIImporter_Vissim::readContents(std::istream& strm) {
     973              :     // read contents
     974              :     bool ok = true;
     975         4288 :     while (strm.good() && ok) {
     976              :         std::string tag;
     977         4281 :         if (myLastSecure != "") {
     978              :             tag = myLastSecure;
     979              :         } else {
     980         1305 :             strm >> tag;
     981              :         }
     982              :         myLastSecure = "";
     983              :         bool parsed = false;
     984         9844 :         while (!parsed && strm.good() && ok) {
     985        11126 :             ToElemIDMap::iterator i = myKnownElements.find(StringUtils::to_lower_case(tag));
     986         5563 :             if (i != myKnownElements.end()) {
     987              :                 ToParserMap::iterator j = myParsers.find((*i).second);
     988         4279 :                 if (j != myParsers.end()) {
     989         4274 :                     VissimSingleTypeParser* parser = (*j).second;
     990         4274 :                     ok = parser->parse(strm);
     991              :                     parsed = true;
     992              :                 }
     993              :             }
     994         5563 :             if (!parsed) {
     995              :                 std::string line;
     996              :                 std::streamoff pos;
     997              :                 do {
     998         3659 :                     pos = strm.tellg();
     999         3659 :                     getline(strm, line);
    1000         6029 :                 } while (strm.good() && (line == "" || line[0] == ' ' || line[0] == '-'));
    1001         1289 :                 if (!strm.good()) {
    1002              :                     return true;
    1003              :                 }
    1004         1289 :                 strm.seekg(pos);
    1005         1289 :                 strm >> tag;
    1006              :             }
    1007              :         }
    1008              :     }
    1009              :     return ok;
    1010              : }
    1011              : 
    1012              : 
    1013              : void
    1014            9 : NIImporter_Vissim::postLoadBuild(double offset) {
    1015              :     // close the loading process
    1016            9 :     NIVissimBoundedClusterObject::closeLoading();
    1017            9 :     NIVissimConnection::dict_assignToEdges();
    1018            9 :     NIVissimDisturbance::dict_SetDisturbances();
    1019              :     // build district->connections map
    1020            9 :     NIVissimDistrictConnection::dict_BuildDistrictConnections();
    1021              :     // build clusters around nodes
    1022              : //    NIVissimNodeDef::buildNodeClusters();
    1023              :     // build node clusters around traffic lights
    1024              : //    NIVissimTL::buildNodeClusters();
    1025              : 
    1026              :     // when connections or disturbances are left, build nodes around them
    1027              : 
    1028              :     // try to assign connection clusters to nodes
    1029              :     //  only left connections will be processed in
    1030              :     //   buildConnectionClusters & join
    1031              : //30.4. brauchen wir noch!    NIVissimNodeDef::dict_assignConnectionsToNodes();
    1032              : 
    1033              :     // build clusters of connections with the same direction and a similar position along the streets
    1034            9 :     NIVissimEdge::buildConnectionClusters();
    1035              :     // check whether further nodes (connection clusters by now) must be added
    1036            9 :     NIVissimDistrictConnection::dict_CheckEdgeEnds();
    1037              : 
    1038              :     // join clusters when overlapping (different streets are possible)
    1039            9 :     NIVissimEdge::dict_checkEdges2Join();
    1040            9 :     NIVissimConnectionCluster::joinBySameEdges(offset);
    1041              : //    NIVissimConnectionCluster::joinByDisturbances(offset);
    1042              : 
    1043              : //    NIVissimConnectionCluster::addTLs(offset);
    1044              : 
    1045              :     // build nodes from clusters
    1046            9 :     NIVissimNodeCluster::setCurrentVirtID(NIVissimNodeDef::getMaxID());
    1047            9 :     NIVissimConnectionCluster::buildNodeClusters();
    1048              : 
    1049              : //    NIVissimNodeCluster::dict_recheckEdgeChanges();
    1050            9 :     NIVissimNodeCluster::buildNBNodes(myNetBuilder.getNodeCont());
    1051            9 :     NIVissimDistrictConnection::dict_BuildDistrictNodes(
    1052            9 :         myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont());
    1053            9 :     NIVissimEdge::dict_propagateSpeeds();
    1054            9 :     NIVissimEdge::dict_buildNBEdges(myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont(), myNetBuilder.getEdgeCont(), offset);
    1055           18 :     if (OptionsCont::getOptions().getBool("vissim.report-unset-speeds")) {
    1056            1 :         NIVissimEdge::reportUnsetSpeeds();
    1057              :     }
    1058            9 :     NIVissimDistrictConnection::dict_BuildDistricts(myNetBuilder.getDistrictCont(), myNetBuilder.getEdgeCont(), myNetBuilder.getNodeCont());
    1059            9 :     NIVissimConnection::dict_buildNBEdgeConnections(myNetBuilder.getEdgeCont());
    1060            9 :     NIVissimNodeCluster::dict_addDisturbances(myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont(), myNetBuilder.getEdgeCont());
    1061            9 :     NIVissimConflictArea::setPriorityRegulation(myNetBuilder.getEdgeCont());
    1062            9 :     NIVissimTL::dict_SetSignals(myNetBuilder.getTLLogicCont(), myNetBuilder.getEdgeCont());
    1063            9 : }
    1064              : 
    1065              : 
    1066              : void
    1067            9 : NIImporter_Vissim::insertKnownElements() {
    1068            9 :     myKnownElements["kennung"] = VE_Kennungszeile;
    1069            9 :     myKnownElements["zufallszahl"] = VE_Startzufallszahl;
    1070            9 :     myKnownElements["simulationsdauer"] = VE_Simdauer;
    1071            9 :     myKnownElements["startuhrzeit"] = VE_Startuhrzeit;
    1072            9 :     myKnownElements["simulationsrate"] = VE_SimRate;
    1073            9 :     myKnownElements["zeitschritt"] = VE_Zeitschrittfaktor;
    1074            9 :     myKnownElements["linksverkehr"] = VE_Linksverkehr;
    1075            9 :     myKnownElements["dynuml"] = VE_DynUml;
    1076            9 :     myKnownElements["stau"] = VE_Stauparameterdefinition;
    1077            9 :     myKnownElements["gelbverhalten"] = VE_Gelbverhaltendefinition;
    1078            9 :     myKnownElements["strecke"] = VE_Streckendefinition;
    1079            9 :     myKnownElements["verbindung"] = VE_Verbindungsdefinition;
    1080            9 :     myKnownElements["richtungsentscheidung"] = VE_Richtungsentscheidungsdefinition;
    1081            9 :     myKnownElements["routenentscheidung"] = VE_Routenentscheidungsdefinition;
    1082            9 :     myKnownElements["vwunschentscheidung"] = VE_VWunschentscheidungsdefinition;
    1083            9 :     myKnownElements["langsamfahrbereich"] = VE_Langsamfahrbereichdefinition;
    1084            9 :     myKnownElements["zufluss"] = VE_Zuflussdefinition;
    1085            9 :     myKnownElements["fahrzeugtyp"] = VE_Fahrzeugtypdefinition;
    1086            9 :     myKnownElements["fahrzeugklasse"] = VE_Fahrzeugklassendefinition;
    1087            9 :     myKnownElements["zusammensetzung"] = VE_Verkehrszusammensetzungsdefinition;
    1088            9 :     myKnownElements["vwunsch"] = VE_Geschwindigkeitsverteilungsdefinition;
    1089            9 :     myKnownElements["laengen"] = VE_Laengenverteilungsdefinition;
    1090            9 :     myKnownElements["zeiten"] = VE_Zeitenverteilungsdefinition;
    1091            9 :     myKnownElements["baujahre"] = VE_Baujahrverteilungsdefinition;
    1092            9 :     myKnownElements["leistungen"] = VE_Laufleistungsverteilungsdefinition;
    1093            9 :     myKnownElements["massen"] = VE_Massenverteilungsdefinition;
    1094            9 :     myKnownElements["leistungen"] = VE_Leistungsverteilungsdefinition;
    1095            9 :     myKnownElements["maxbeschleunigung"] = VE_Maxbeschleunigungskurvedefinition;
    1096            9 :     myKnownElements["wunschbeschleunigung"] = VE_Wunschbeschleunigungskurvedefinition;
    1097            9 :     myKnownElements["maxverzoegerung"] = VE_Maxverzoegerungskurvedefinition;
    1098            9 :     myKnownElements["wunschverzoegerung"] = VE_Wunschverzoegerungskurvedefinition;
    1099            9 :     myKnownElements["querverkehrsstoerung"] = VE_Querverkehrsstoerungsdefinition;
    1100            9 :     myKnownElements["lsa"] = VE_Lichtsignalanlagendefinition;
    1101            9 :     myKnownElements["signalgruppe"] = VE_Signalgruppendefinition;
    1102            9 :     myKnownElements["signalgeber"] = VE_Signalgeberdefinition;
    1103            9 :     myKnownElements["lsakopplung"] = VE_LSAKopplungdefinition;
    1104            9 :     myKnownElements["detektor"] = VE_Detektorendefinition;
    1105            9 :     myKnownElements["haltestelle"] = VE_Haltestellendefinition;
    1106            9 :     myKnownElements["linie"] = VE_Liniendefinition;
    1107            9 :     myKnownElements["stopschild"] = VE_Stopschilddefinition;
    1108            9 :     myKnownElements["messung"] = VE_Messungsdefinition;
    1109            9 :     myKnownElements["reisezeit"] = VE_Reisezeitmessungsdefinition;
    1110            9 :     myKnownElements["verlustzeit"] = VE_Verlustzeitmessungsdefinition;
    1111            9 :     myKnownElements["querschnittsmessung"] = VE_Querschnittsmessungsdefinition;
    1112            9 :     myKnownElements["stauzaehler"] = VE_Stauzaehlerdefinition;
    1113            9 :     myKnownElements["auswertung"] = VE_Auswertungsdefinition;
    1114            9 :     myKnownElements["fenster"] = VE_Fensterdefinition;
    1115            9 :     myKnownElements["motiv"] = VE_Gefahrenwarnsystemdefinition;
    1116            9 :     myKnownElements["parkplatz"] = VE_Parkplatzdefinition;
    1117            9 :     myKnownElements["knoten"] = VE_Knotendefinition;
    1118            9 :     myKnownElements["teapac"] = VE_TEAPACdefinition;
    1119            9 :     myKnownElements["netzobjekt"] = VE_Netzobjektdefinition;
    1120            9 :     myKnownElements["richtungspfeil"] = VE_Richtungspfeildefinition;
    1121            9 :     myKnownElements["raute"] = VE_Rautedefinition;
    1122            9 :     myKnownElements["fahrverhalten"] = VE_Fahrverhaltendefinition;
    1123            9 :     myKnownElements["fahrtverlaufdateien"] = VE_Fahrtverlaufdateien;
    1124            9 :     myKnownElements["emission"] = VE_Emission;
    1125            9 :     myKnownElements["einheit"] = VE_Einheitendefinition;
    1126            9 :     myKnownElements["streckentyp"] = VE_Streckentypdefinition;
    1127            9 :     myKnownElements["kantensperrung"] = VE_Kantensperrung;
    1128            9 :     myKnownElements["kante"] = VE_Kantensperrung;
    1129              : 
    1130              : 
    1131            9 :     myKnownElements["advance"] = VE_DUMMY;
    1132            9 :     myKnownElements["temperatur"] = VE_DUMMY;
    1133              : 
    1134            9 : }
    1135              : 
    1136              : 
    1137              : 
    1138              : void
    1139            9 : NIImporter_Vissim::buildParsers() {
    1140            9 :     myParsers[VE_Simdauer] =
    1141            9 :         new NIVissimSingleTypeParser_Simdauer(*this);
    1142            9 :     myParsers[VE_Startuhrzeit] =
    1143            9 :         new NIVissimSingleTypeParser_Startuhrzeit(*this);
    1144            9 :     myParsers[VE_DynUml] =
    1145            9 :         new NIVissimSingleTypeParser_DynUml(*this);
    1146            9 :     myParsers[VE_Streckendefinition] =
    1147            9 :         new NIVissimSingleTypeParser_Streckendefinition(*this);
    1148            9 :     myParsers[VE_Verbindungsdefinition] =
    1149            9 :         new NIVissimSingleTypeParser_Verbindungsdefinition(*this);
    1150            9 :     myParsers[VE_Richtungsentscheidungsdefinition] =
    1151            9 :         new NIVissimSingleTypeParser_Richtungsentscheidungsdefinition(*this);
    1152            9 :     myParsers[VE_Routenentscheidungsdefinition] =
    1153            9 :         new NIVissimSingleTypeParser_Routenentscheidungsdefinition(*this);
    1154            9 :     myParsers[VE_VWunschentscheidungsdefinition] =
    1155            9 :         new NIVissimSingleTypeParser_VWunschentscheidungsdefinition(*this);
    1156            9 :     myParsers[VE_Langsamfahrbereichdefinition] =
    1157            9 :         new NIVissimSingleTypeParser_Langsamfahrbereichdefinition(*this);
    1158            9 :     myParsers[VE_Zuflussdefinition] =
    1159            9 :         new NIVissimSingleTypeParser_Zuflussdefinition(*this);
    1160            9 :     myParsers[VE_Fahrzeugtypdefinition] =
    1161            9 :         new NIVissimSingleTypeParser_Fahrzeugtypdefinition(*this, myColorMap);
    1162            9 :     myParsers[VE_Fahrzeugklassendefinition] =
    1163            9 :         new NIVissimSingleTypeParser_Fahrzeugklassendefinition(*this, myColorMap);
    1164            9 :     myParsers[VE_Geschwindigkeitsverteilungsdefinition] =
    1165            9 :         new NIVissimSingleTypeParser_Geschwindigkeitsverteilungsdefinition(*this);
    1166            9 :     myParsers[VE_Laengenverteilungsdefinition] =
    1167            9 :         new NIVissimSingleTypeParser_Laengenverteilungsdefinition(*this);
    1168            9 :     myParsers[VE_Zeitenverteilungsdefinition] =
    1169            9 :         new NIVissimSingleTypeParser_Zeitenverteilungsdefinition(*this);
    1170            9 :     myParsers[VE_Querverkehrsstoerungsdefinition] =
    1171            9 :         new NIVissimSingleTypeParser_Querverkehrsstoerungsdefinition(*this);
    1172            9 :     myParsers[VE_Lichtsignalanlagendefinition] =
    1173            9 :         new NIVissimSingleTypeParser_Lichtsignalanlagendefinition(*this);
    1174            9 :     myParsers[VE_Signalgruppendefinition] =
    1175            9 :         new NIVissimSingleTypeParser_Signalgruppendefinition(*this);
    1176            9 :     myParsers[VE_Stopschilddefinition] =
    1177            9 :         new NIVissimSingleTypeParser_Stopschilddefinition(*this);
    1178            9 :     myParsers[VE_Knotendefinition] =
    1179            9 :         new NIVissimSingleTypeParser_Knotendefinition(*this);
    1180            9 :     myParsers[VE_Signalgeberdefinition] =
    1181            9 :         new NIVissimSingleTypeParser_Signalgeberdefinition(*this);
    1182            9 :     myParsers[VE_Detektorendefinition] =
    1183            9 :         new NIVissimSingleTypeParser_Detektordefinition(*this);
    1184            9 :     myParsers[VE_Haltestellendefinition] =
    1185            9 :         new NIVissimSingleTypeParser_Haltestellendefinition(*this);
    1186            9 :     myParsers[VE_Liniendefinition] =
    1187            9 :         new NIVissimSingleTypeParser_Liniendefinition(*this);
    1188            9 :     myParsers[VE_Reisezeitmessungsdefinition] =
    1189            9 :         new NIVissimSingleTypeParser_Reisezeitmessungsdefinition(*this);
    1190            9 :     myParsers[VE_Querschnittsmessungsdefinition] =
    1191            9 :         new NIVissimSingleTypeParser_Querschnittsmessungsdefinition(*this);
    1192            9 :     myParsers[VE_Messungsdefinition] =
    1193            9 :         new NIVissimSingleTypeParser_Messungsdefinition(*this);
    1194            9 :     myParsers[VE_Verlustzeitmessungsdefinition] =
    1195            9 :         new NIVissimSingleTypeParser_Verlustzeitmessungsdefinition(*this);
    1196            9 :     myParsers[VE_Stauzaehlerdefinition] =
    1197            9 :         new NIVissimSingleTypeParser_Stauzaehlerdefinition(*this);
    1198            9 :     myParsers[VE_Rautedefinition] =
    1199            9 :         new NIVissimSingleTypeParser_Rautedefinition(*this);
    1200            9 :     myParsers[VE_Richtungspfeildefinition] =
    1201            9 :         new NIVissimSingleTypeParser_Richtungspfeildefinition(*this);
    1202            9 :     myParsers[VE_Parkplatzdefinition] =
    1203            9 :         new NIVissimSingleTypeParser_Parkplatzdefinition(*this);
    1204            9 :     myParsers[VE_Fahrverhaltendefinition] =
    1205            9 :         new NIVissimSingleTypeParser_Fahrverhaltendefinition(*this);
    1206            9 :     myParsers[VE_Streckentypdefinition] =
    1207            9 :         new NIVissimSingleTypeParser_Streckentypdefinition(*this);
    1208            9 :     myParsers[VE_Kennungszeile] =
    1209            9 :         new NIVissimSingleTypeParser_Kennungszeile(*this);
    1210            9 :     myParsers[VE_Fensterdefinition] =
    1211            9 :         new NIVissimSingleTypeParser_Fensterdefinition(*this);
    1212            9 :     myParsers[VE_Auswertungsdefinition] =
    1213            9 :         new NIVissimSingleTypeParser_Auswertungsdefinition(*this);
    1214            9 :     myParsers[VE_Verkehrszusammensetzungsdefinition] =
    1215            9 :         new NIVissimSingleTypeParser_Zusammensetzungsdefinition(*this);
    1216            9 :     myParsers[VE_Kantensperrung] =
    1217            9 :         new NIVissimSingleTypeParser_Kantensperrung(*this);
    1218              : 
    1219            9 :     myParsers[VE_Startzufallszahl] =
    1220            9 :         new NIVissimSingleTypeParser_Startzufallszahl(*this);
    1221            9 :     myParsers[VE_SimRate] =
    1222            9 :         new NIVissimSingleTypeParser_SimRate(*this);
    1223            9 :     myParsers[VE_Zeitschrittfaktor] =
    1224            9 :         new NIVissimSingleTypeParser_Zeitschrittfaktor(*this);
    1225            9 :     myParsers[VE_Linksverkehr] =
    1226            9 :         new NIVissimSingleTypeParser_Linksverkehr(*this);
    1227            9 :     myParsers[VE_Stauparameterdefinition] =
    1228            9 :         new NIVissimSingleTypeParser_Stauparameterdefinition(*this);
    1229            9 :     myParsers[VE_Gelbverhaltendefinition] =
    1230            9 :         new NIVissimSingleTypeParser_Gelbverhaltendefinition(*this);
    1231            9 :     myParsers[VE_LSAKopplungdefinition] =
    1232            9 :         new NIVissimSingleTypeParser_LSAKopplungsdefinition(*this);
    1233            9 :     myParsers[VE_Gefahrenwarnsystemdefinition] =
    1234            9 :         new NIVissimSingleTypeParser_Gefahrwarnungsdefinition(*this);
    1235            9 :     myParsers[VE_TEAPACdefinition] =
    1236            9 :         new NIVissimSingleTypeParser_TEAPACDefinition(*this);
    1237            9 :     myParsers[VE_Netzobjektdefinition] =
    1238            9 :         new NIVissimSingleTypeParser_Netzobjektdefinition(*this);
    1239            9 :     myParsers[VE_Fahrtverlaufdateien] =
    1240            9 :         new NIVissimSingleTypeParser_Fahrtverlaufdateien(*this);
    1241            9 :     myParsers[VE_Emission] =
    1242            9 :         new NIVissimSingleTypeParser_Emission(*this);
    1243            9 :     myParsers[VE_Einheitendefinition] =
    1244            9 :         new NIVissimSingleTypeParser_Einheitendefinition(*this);
    1245            9 :     myParsers[VE_Baujahrverteilungsdefinition] =
    1246            9 :         new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);
    1247            9 :     myParsers[VE_Laufleistungsverteilungsdefinition] =
    1248            9 :         new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);
    1249            9 :     myParsers[VE_Massenverteilungsdefinition] =
    1250            9 :         new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);
    1251            9 :     myParsers[VE_Leistungsverteilungsdefinition] =
    1252            9 :         new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);
    1253            9 :     myParsers[VE_Maxbeschleunigungskurvedefinition] =
    1254            9 :         new NIVissimSingleTypeParser__XKurvedefinition(*this);
    1255            9 :     myParsers[VE_Wunschbeschleunigungskurvedefinition] =
    1256            9 :         new NIVissimSingleTypeParser__XKurvedefinition(*this);
    1257            9 :     myParsers[VE_Maxverzoegerungskurvedefinition] =
    1258            9 :         new NIVissimSingleTypeParser__XKurvedefinition(*this);
    1259            9 :     myParsers[VE_Wunschverzoegerungskurvedefinition] =
    1260            9 :         new NIVissimSingleTypeParser__XKurvedefinition(*this);
    1261              : 
    1262            9 : }
    1263              : 
    1264              : 
    1265              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1