Path: blob/main/src/netimport/vissim/NIImporter_Vissim.cpp
169678 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file NIImporter_Vissim.cpp14/// @author Daniel Krajzewicz15/// @author Jakob Erdmann16/// @author Michael Behrisch17/// @author Lukas Grohmann (AIT)18/// @author Gerald Richter (AIT)19/// @date Sept 200220///21// -------------------22/****************************************************************************/23#include <config.h>242526#include <string>27#include <fstream>28#include <utils/common/StringUtils.h>29#include <utils/common/StringUtils.h>30#include <utils/common/MsgHandler.h>31#include <utils/options/OptionsCont.h>32#include <netbuild/NBNetBuilder.h>33#include "NIImporter_Vissim.h"34#include "typeloader/NIVissimSingleTypeParser_Simdauer.h"35#include "typeloader/NIVissimSingleTypeParser_Startuhrzeit.h"36#include "typeloader/NIVissimSingleTypeParser_DynUml.h"37#include "typeloader/NIVissimSingleTypeParser_Streckendefinition.h"38#include "typeloader/NIVissimSingleTypeParser_Verbindungsdefinition.h"39#include "typeloader/NIVissimSingleTypeParser_Richtungsentscheidungsdefinition.h"40#include "typeloader/NIVissimSingleTypeParser_Routenentscheidungsdefinition.h"41#include "typeloader/NIVissimSingleTypeParser_VWunschentscheidungsdefinition.h"42#include "typeloader/NIVissimSingleTypeParser_Langsamfahrbereichdefinition.h"43#include "typeloader/NIVissimSingleTypeParser_Zuflussdefinition.h"44#include "typeloader/NIVissimSingleTypeParser_Fahrzeugtypdefinition.h"45#include "typeloader/NIVissimSingleTypeParser_Fahrzeugklassendefinition.h"46#include "typeloader/NIVissimSingleTypeParser_Verkehrszusammensetzungsdefinition.h"47#include "typeloader/NIVissimSingleTypeParser_Geschwindigkeitsverteilungsdefinition.h"48#include "typeloader/NIVissimSingleTypeParser_Laengenverteilungsdefinition.h"49#include "typeloader/NIVissimSingleTypeParser_Zeitenverteilungsdefinition.h"50#include "typeloader/NIVissimSingleTypeParser_Querverkehrsstoerungsdefinition.h"51#include "typeloader/NIVissimSingleTypeParser_Lichtsignalanlagendefinition.h"52#include "typeloader/NIVissimSingleTypeParser_Signalgruppendefinition.h"53#include "typeloader/NIVissimSingleTypeParser_Stopschilddefinition.h"54#include "typeloader/NIVissimSingleTypeParser_Knotendefinition.h"55#include "typeloader/NIVissimSingleTypeParser_Signalgeberdefinition.h"56#include "typeloader/NIVissimSingleTypeParser_Detektordefinition.h"57#include "typeloader/NIVissimSingleTypeParser_Liniendefinition.h"58#include "typeloader/NIVissimSingleTypeParser_Haltestellendefinition.h"59#include "typeloader/NIVissimSingleTypeParser_Reisezeitmessungsdefinition.h"60#include "typeloader/NIVissimSingleTypeParser_Querschnittsmessungsdefinition.h"61#include "typeloader/NIVissimSingleTypeParser_Messungsdefinition.h"62#include "typeloader/NIVissimSingleTypeParser_Verlustzeitmessungsdefinition.h"63#include "typeloader/NIVissimSingleTypeParser_Stauzaehlerdefinition.h"64#include "typeloader/NIVissimSingleTypeParser_Richtungspfeildefinition.h"65#include "typeloader/NIVissimSingleTypeParser_Parkplatzdefinition.h"66#include "typeloader/NIVissimSingleTypeParser_Fahrverhaltendefinition.h"67#include "typeloader/NIVissimSingleTypeParser_Streckentypdefinition.h"68#include "typeloader/NIVissimSingleTypeParser_Kennungszeile.h"69#include "typeloader/NIVissimSingleTypeParser_Fensterdefinition.h"70#include "typeloader/NIVissimSingleTypeParser_Auswertungsdefinition.h"71#include "typeloader/NIVissimSingleTypeParser_Zusammensetzungsdefinition.h"72#include "typeloader/NIVissimSingleTypeParser_Startzufallszahl.h"73#include "typeloader/NIVissimSingleTypeParser_SimRate.h"74#include "typeloader/NIVissimSingleTypeParser_Zeitschrittfaktor.h"75#include "typeloader/NIVissimSingleTypeParser_Linksverkehr.h"76#include "typeloader/NIVissimSingleTypeParser_Stauparameterdefinition.h"77#include "typeloader/NIVissimSingleTypeParser_Gelbverhaltendefinition.h"78#include "typeloader/NIVissimSingleTypeParser_LSAKopplungsdefinition.h"79#include "typeloader/NIVissimSingleTypeParser_Gefahrwarnungsdefinition.h"80#include "typeloader/NIVissimSingleTypeParser_TEAPACDefinition.h"81#include "typeloader/NIVissimSingleTypeParser_Netzobjektdefinition.h"82#include "typeloader/NIVissimSingleTypeParser_Fahrtverlaufdateien.h"83#include "typeloader/NIVissimSingleTypeParser_Emission.h"84#include "typeloader/NIVissimSingleTypeParser_Einheitendefinition.h"85#include "typeloader/NIVissimSingleTypeParser__XVerteilungsdefinition.h"86#include "typeloader/NIVissimSingleTypeParser__XKurvedefinition.h"87#include "typeloader/NIVissimSingleTypeParser_Kantensperrung.h"88#include "typeloader/NIVissimSingleTypeParser_Rautedefinition.h"899091#include "tempstructs/NIVissimTL.h"92#include "tempstructs/NIVissimClosures.h"93#include "tempstructs/NIVissimSource.h"94#include "tempstructs/NIVissimTrafficDescription.h"95#include "tempstructs/NIVissimVehTypeClass.h"96#include "tempstructs/NIVissimConnection.h"97#include "tempstructs/NIVissimDisturbance.h"98#include "tempstructs/NIVissimConnectionCluster.h"99#include "tempstructs/NIVissimNodeDef.h"100#include "tempstructs/NIVissimEdge.h"101#include "tempstructs/NIVissimConflictArea.h"102#include "tempstructs/NIVissimDistrictConnection.h"103#include "tempstructs/NIVissimVehicleType.h"104105#include <utils/xml/SUMOSAXHandler.h>106#include <utils/xml/XMLSubSys.h>107#include <utils/common/FileHelpers.h>108#include <utils/common/StringTokenizer.h>109#include <utils/distribution/Distribution_Points.h>110#include <utils/distribution/DistributionCont.h>111112#include <netbuild/NBEdgeCont.h> // !!! only for debugging purposes113114115// ===========================================================================116// static variables117// ===========================================================================118SequentialStringBijection::Entry NIImporter_Vissim::vissimTags[] = {119{ "network", NIImporter_Vissim::VISSIM_TAG_NETWORK },120{ "lanes", NIImporter_Vissim::VISSIM_TAG_LANES },121{ "lane", NIImporter_Vissim::VISSIM_TAG_LANE },122{ "link", NIImporter_Vissim::VISSIM_TAG_LINK },123{ "links", NIImporter_Vissim::VISSIM_TAG_LINKS },124{ "points3D", NIImporter_Vissim::VISSIM_TAG_POINTS3D },125{ "point3D", NIImporter_Vissim::VISSIM_TAG_POINT3D },126{ "linkPolyPoint", NIImporter_Vissim::VISSIM_TAG_LINKPOLYPOINT },127{ "linkPolyPts", NIImporter_Vissim::VISSIM_TAG_LINKPOLYPTS },128{ "fromLinkEndPt", NIImporter_Vissim::VISSIM_TAG_FROM },129{ "toLinkEndPt", NIImporter_Vissim::VISSIM_TAG_TO },130{ "vehicleInput", NIImporter_Vissim::VISSIM_TAG_VEHICLE_INPUT },131{ "parkingLot", NIImporter_Vissim::VISSIM_TAG_PARKINGLOT },132{ "vehicleClass", NIImporter_Vissim::VISSIM_TAG_VEHICLE_CLASS },133{ "intObjectRef", NIImporter_Vissim::VISSIM_TAG_INTOBJECTREF },134{ "desSpeedDecision", NIImporter_Vissim::VISSIM_TAG_SPEED_DECISION },135{136"desSpeedDistribution",137NIImporter_Vissim::VISSIM_TAG_SPEED_DIST138},139{140"speedDistributionDataPoint",141NIImporter_Vissim::VISSIM_TAG_DATAPOINT142},143{144"vehicleRoutingDecisionStatic",145NIImporter_Vissim::VISSIM_TAG_DECISION_STATIC146},147{148"vehicleRouteStatic",149NIImporter_Vissim::VISSIM_TAG_ROUTE_STATIC150},151{ "conflictArea", NIImporter_Vissim::VISSIM_TAG_CA },152{ "", NIImporter_Vissim::VISSIM_TAG_NOTHING }153};154155156SequentialStringBijection::Entry NIImporter_Vissim::vissimAttrs[] = {157{ "no", NIImporter_Vissim::VISSIM_ATTR_NO }, //id158{ "name", NIImporter_Vissim::VISSIM_ATTR_NAME },159{ "x", NIImporter_Vissim::VISSIM_ATTR_X },160{ "y", NIImporter_Vissim::VISSIM_ATTR_Y },161{ "zOffset", NIImporter_Vissim::VISSIM_ATTR_ZOFFSET },162{ "surch1", NIImporter_Vissim::VISSIM_ATTR_ZUSCHLAG1 },163{ "surch2", NIImporter_Vissim::VISSIM_ATTR_ZUSCHLAG2 },164{ "width", NIImporter_Vissim::VISSIM_ATTR_WIDTH },165{ "linkBehavType", NIImporter_Vissim::VISSIM_ATTR_LINKBEHAVETYPE},166{ "lane", NIImporter_Vissim::VISSIM_ATTR_LANE },167{ "pos", NIImporter_Vissim::VISSIM_ATTR_POS },168{ "link", NIImporter_Vissim::VISSIM_ATTR_LINK },169{ "intLink", NIImporter_Vissim::VISSIM_ATTR_INTLINK }, //edgeID170{ "relFlow", NIImporter_Vissim::VISSIM_ATTR_PERCENTAGE },171{ "zone", NIImporter_Vissim::VISSIM_ATTR_DISTRICT },172{ "color", NIImporter_Vissim::VISSIM_ATTR_COLOR },173{ "key", NIImporter_Vissim::VISSIM_ATTR_KEY },174{ "fx", NIImporter_Vissim::VISSIM_ATTR_FX },175{ "destLink", NIImporter_Vissim::VISSIM_ATTR_DESTLINK },176{ "destPos", NIImporter_Vissim::VISSIM_ATTR_DESTPOS },177{ "link1", NIImporter_Vissim::VISSIM_ATTR_LINK1 },178{ "link2", NIImporter_Vissim::VISSIM_ATTR_LINK2 },179{ "status", NIImporter_Vissim::VISSIM_ATTR_STATUS },180{ "", NIImporter_Vissim::VISSIM_ATTR_NOTHING }181};182183184// ===========================================================================185// method definitions186// ===========================================================================187// ---------------------------------------------------------------------------188// static methods (interface in this case)189// ---------------------------------------------------------------------------190void191NIImporter_Vissim::loadNetwork(const OptionsCont& oc, NBNetBuilder& nb) {192if (!oc.isSet("vissim-file")) {193return;194}195NIImporter_Vissim(nb).load(oc);196}197198199// ---------------------------------------------------------------------------200// definitions of NIVissimXMLHandler_Streckendefinition-methods201// ---------------------------------------------------------------------------202NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::NIVissimXMLHandler_Streckendefinition(203//std::map<int, VissimXMLEdge>& toFill)204nodeMap& elemData)205: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,206vissimAttrs, VISSIM_ATTR_NOTHING,207"vissim - file"),208myElemData(elemData),209myHierarchyLevel(0),210isConnector(false) {211myElemData.clear();212}213214NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::~NIVissimXMLHandler_Streckendefinition() { }215216void217NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {218myHierarchyLevel++;219220// finding an actual LINK221if (element == VISSIM_TAG_LINK) {222//parse all links223bool ok = true;224int id = attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok);225myLastNodeID = id;226227// !!! assuming empty myElemData228myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));229// error ignored if name is empty230myElemData["name"].push_back(attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false));231myElemData["type"].push_back(attrs.get<std::string>(VISSIM_ATTR_LINKBEHAVETYPE, nullptr, ok));232myElemData["zuschlag1"].push_back(attrs.get<std::string>(VISSIM_ATTR_ZUSCHLAG1, nullptr, ok));233myElemData["zuschlag2"].push_back(attrs.get<std::string>(VISSIM_ATTR_ZUSCHLAG2, nullptr, ok));234}235236if (element == VISSIM_TAG_LANE) {237bool ok = true;238// appends empty element if no width found239// error ignored if name is empty240myElemData["width"].push_back(attrs.get<std::string>(VISSIM_ATTR_WIDTH, nullptr, ok, false));241}242243if (element == VISSIM_TAG_FROM) {244if (isConnector != true) {245isConnector = true;246}247bool ok = true;248std::vector<std::string> from(StringTokenizer(attrs.get<std::string>(249VISSIM_ATTR_LANE, nullptr, ok), " ").getVector());250myElemData["from_pos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));251myElemData["from_id"].push_back(from[0]);252myElemData["from_lane"].push_back(from[1]);253}254255if (element == VISSIM_TAG_TO) {256bool ok = true;257std::vector<std::string> to(StringTokenizer(attrs.get<std::string>(258VISSIM_ATTR_LANE, nullptr, ok), " ").getVector());259myElemData["to_pos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));260myElemData["to_id"].push_back(to[0]);261myElemData["to_lane"].push_back(to[1]);262}263264if (element == VISSIM_TAG_POINT3D || element == VISSIM_TAG_LINKPOLYPOINT) {265bool ok = true;266// create a <sep> separated string of coordinate data267std::string sep(" ");268269std::string posS(attrs.get<std::string>(VISSIM_ATTR_X, nullptr, ok));270posS += sep;271posS.append(attrs.get<std::string>(VISSIM_ATTR_Y, nullptr, ok));272// allow for no Z273std::string z(attrs.get<std::string>(VISSIM_ATTR_ZOFFSET, nullptr, ok, false));274if (z.length() > 0) {275posS += sep;276posS.append(z);277}278myElemData["pos"].push_back(posS);279}280281282}283284void285NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::myEndElement(int element) {286if (element == VISSIM_TAG_LINK && myHierarchyLevel == 3) {287//std::cout << "elemData len:" << myElemData.size() << std::endl;288289NIVissimClosedLanesVector clv; //FIXME -> clv einlesen290std::vector<int> assignedVehicles; //FIXME -> assignedVehicles einlesen291int id(StringUtils::toInt(myElemData["id"].front()));292293PositionVector geom;294// convert all position coordinate strings to PositionVectors295while (!myElemData["pos"].empty()) {296std::vector<std::string> sPos_v(StringTokenizer(297myElemData["pos"].front(), " ").getVector());298myElemData["pos"].pop_front();299std::vector<double> pos_v(3);300301// doing a transform with explicit hint on function signature302std::transform(sPos_v.begin(), sPos_v.end(), pos_v.begin(),303StringUtils::toDouble);304geom.push_back_noDoublePos(Position(pos_v[0], pos_v[1], pos_v[2]));305}306// FIXME: a length = 0 PosVec seems fatal -> segfault307double length(geom.length());308309if (!isConnector) {310// Add Edge311std::vector<double> laneWidths;312for (std::string& w : myElemData["width"]) {313laneWidths.push_back(StringUtils::toDouble(w));314}315NIVissimEdge* edge = new NIVissimEdge(id,316myElemData["name"].front(),317myElemData["type"].front(),318laneWidths,319StringUtils::toDouble(myElemData["zuschlag1"].front()),320StringUtils::toDouble(myElemData["zuschlag2"].front()),321length, geom, clv);322NIVissimEdge::dictionary(id, edge);323} else {324int numLanes = (int)myElemData["width"].size();325std::vector<int> laneVec(numLanes);326// Add Connector327328//NOTE: there should be only 1 lane number in XML329// subtraction of 1 as in readExtEdgePointDef()330laneVec[0] = StringUtils::toInt(myElemData["from_lane"].front()) - 1;331// then count up, building lane number vector332for (std::vector<int>::iterator each = ++laneVec.begin(); each != laneVec.end(); ++each) {333*each = *(each - 1) + 1;334}335336NIVissimExtendedEdgePoint from_def(337StringUtils::toInt(myElemData["from_id"].front()),338laneVec,339StringUtils::toDouble(myElemData["from_pos"].front()),340assignedVehicles);341342//NOTE: there should be only 1 lane number in XML343// subtraction of 1 as in readExtEdgePointDef()344laneVec[0] = StringUtils::toInt(myElemData["to_lane"].front()) - 1;345// then count up, building lane number vector346for (std::vector<int>::iterator each = ++laneVec.begin(); each != laneVec.end(); ++each) {347*each = *(each - 1) + 1;348}349350NIVissimExtendedEdgePoint to_def(351StringUtils::toInt(myElemData["to_id"].front()),352laneVec,353StringUtils::toDouble(myElemData["to_pos"].front()),354assignedVehicles);355356NIVissimConnection* connector = new357NIVissimConnection(id,358myElemData["name"].front(),359from_def, to_def,360geom, assignedVehicles, clv);361362NIVissimConnection::dictionary(id, connector);363}364// clear the element data365myElemData.clear();366isConnector = false;367//std::cout << "elemData len (clear):" << myElemData.size() << std::endl;368//std::cout.flush();369370}371--myHierarchyLevel;372}373374375// ---------------------------------------------------------------------------376// definitions of NIVissimXMLHandler_Zuflussdefinition-methods377// ---------------------------------------------------------------------------378NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::NIVissimXMLHandler_Zuflussdefinition()379: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,380vissimAttrs, VISSIM_ATTR_NOTHING,381"vissim - file") {382}383384NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::~NIVissimXMLHandler_Zuflussdefinition() { }385386void387NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {388// finding an actual flow389if (element == VISSIM_TAG_VEHICLE_INPUT) {390//parse all flows391bool ok = true;392std::string id = attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok);393std::string edgeid = attrs.get<std::string>(VISSIM_ATTR_LINK, nullptr, ok);394std::string name = attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false);395396NIVissimSource::dictionary(id,397name,398edgeid);399}400}401402// ---------------------------------------------------------------------------403// definitions of NIVissimXMLHandler_Parkplatzdefinition-methods404// ---------------------------------------------------------------------------405NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::NIVissimXMLHandler_Parkplatzdefinition()406: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,407vissimAttrs, VISSIM_ATTR_NOTHING,408"vissim - file") {409}410411NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::~NIVissimXMLHandler_Parkplatzdefinition() { }412413void414NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {415// finding an actual parkinglot416if (element == VISSIM_TAG_PARKINGLOT) {417//parse all parkinglots418bool ok = true;419int id = attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok);420int edgeid = attrs.get<int>(VISSIM_ATTR_INTLINK, nullptr, ok);421std::string name = attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false);422double position = attrs.get<double>(VISSIM_ATTR_POS, nullptr, ok);423std::vector<std::pair<int, int> > assignedVehicles; // (vclass, vwunsch)424//FIXME: vWunsch + Fahzeugklassen einlesen425// There can be s426std::vector<int> districts;427//FIXME: Parkplatzdefinition für mehrere Zonen implementieren428std::vector<double> percentages;429districts.push_back(attrs.get<int>(VISSIM_ATTR_DISTRICT, nullptr, ok));430percentages.push_back(attrs.get<double>(VISSIM_ATTR_PERCENTAGE, nullptr, ok));431432NIVissimDistrictConnection::dictionary(id,433name,434districts,435percentages,436edgeid,437position,438assignedVehicles);439}440}441442443// ---------------------------------------------------------------------------444// definitions of NIVissimXMLHandler_Fahrzeugklassendefinition-methods445// ---------------------------------------------------------------------------446NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::NIVissimXMLHandler_Fahrzeugklassendefinition(nodeMap& elemData)447: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,448vissimAttrs, VISSIM_ATTR_NOTHING,449"vissim - file"),450myElemData(elemData),451myHierarchyLevel(0) {452myElemData.clear();453}454455NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::~NIVissimXMLHandler_Fahrzeugklassendefinition() { }456457void458NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {459myHierarchyLevel++;460461if (element == VISSIM_TAG_VEHICLE_CLASS) {462bool ok = true;463myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));464myElemData["name"].push_back(attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false));465std::string colorStr(attrs.get<std::string>(VISSIM_ATTR_COLOR, nullptr, ok));466for (int pos = (int)colorStr.size() - 2; pos > 0; pos -= 2) {467colorStr.insert(pos, " ");468}469myElemData["color"].push_back(colorStr);470}471if (element == VISSIM_TAG_INTOBJECTREF) {472bool ok = true;473myElemData["types"].push_back(attrs.get<std::string>(VISSIM_ATTR_KEY, nullptr, ok));474475476}477}478479void480NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::myEndElement(int element) {481if (element == VISSIM_TAG_VEHICLE_CLASS && myHierarchyLevel == 3) {482RGBColor color;483std::istringstream iss(myElemData["color"].front());484std::vector<std::string> sCol_v(StringTokenizer(485myElemData["color"].front(), " ").getVector());486std::vector<int> myColorVector(sCol_v.size());487std::transform(sCol_v.begin(), sCol_v.end(), myColorVector.begin(), StringUtils::hexToInt);488489color = RGBColor((unsigned char)myColorVector[0],490(unsigned char)myColorVector[1],491(unsigned char)myColorVector[2],492(unsigned char)myColorVector[3]);493std::vector<int> types;494while (!myElemData["types"].empty()) {495types.push_back(StringUtils::toInt(myElemData["types"].front()));496myElemData["types"].pop_front();497}498499NIVissimVehTypeClass::dictionary(StringUtils::toInt(myElemData["id"].front()),500myElemData["name"].front(),501color,502types);503myElemData.clear();504}505--myHierarchyLevel;506}507508// ---------------------------------------------------------------------------509// definitions of NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition-methods510// ---------------------------------------------------------------------------511NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition(nodeMap& elemData)512: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,513vissimAttrs, VISSIM_ATTR_NOTHING,514"vissim - file"),515myElemData(elemData),516myHierarchyLevel(0) {517myElemData.clear();518}519520NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::~NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition() { }521522void523NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {524myHierarchyLevel++;525if (element == VISSIM_TAG_SPEED_DIST) {526bool ok = true;527myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));528}529530if (element == VISSIM_TAG_DATAPOINT) {531bool ok = true;532std::string sep(" ");533std::string posS(attrs.get<std::string>(VISSIM_ATTR_X, nullptr, ok));534posS += sep;535posS.append(attrs.get<std::string>(VISSIM_ATTR_FX, nullptr, ok));536myElemData["points"].push_back(posS);537538}539540}541542void543NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::myEndElement(int element) {544if (element == VISSIM_TAG_SPEED_DIST && myHierarchyLevel == 3) {545Distribution_Points* points = new Distribution_Points(myElemData["id"].front());546while (!myElemData["points"].empty()) {547std::vector<std::string> sPos_v(StringTokenizer(548myElemData["points"].front(), " ").getVector());549myElemData["points"].pop_front();550points->add(StringUtils::toDouble(sPos_v[0]), StringUtils::toDouble(sPos_v[1]));551}552DistributionCont::dictionary("speed", myElemData["id"].front(), points);553myElemData.clear();554}555--myHierarchyLevel;556}557558// ---------------------------------------------------------------------------559// definitions of NIVissimXMLHandler_VWunschentscheidungsdefinition-methods560// ---------------------------------------------------------------------------561NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::NIVissimXMLHandler_VWunschentscheidungsdefinition(nodeMap& elemData)562: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,563vissimAttrs, VISSIM_ATTR_NOTHING,564"vissim - file"),565myElemData(elemData),566myHierarchyLevel(0) {567myElemData.clear();568}569570NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::~NIVissimXMLHandler_VWunschentscheidungsdefinition() { }571572void573NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {574myHierarchyLevel++;575if (element == VISSIM_TAG_SPEED_DECISION) {576bool ok = true;577myElemData["name"].push_back(attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false));578//FIXME: 2 vWunsch in the xml file, but only 1 of them is set???579}580581}582583void584NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::myEndElement(int /* element */) {585--myHierarchyLevel;586}587588589// ---------------------------------------------------------------------------590// definitions of NIVissimXMLHandler_Routenentscheidungsdefinition-methods591// ---------------------------------------------------------------------------592NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::NIVissimXMLHandler_Routenentscheidungsdefinition(nodeMap& elemData)593: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,594vissimAttrs, VISSIM_ATTR_NOTHING,595"vissim - file"),596myElemData(elemData),597myHierarchyLevel(0) {598myElemData.clear();599}600601NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::~NIVissimXMLHandler_Routenentscheidungsdefinition() { }602603void604NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {605myHierarchyLevel++;606if (element == VISSIM_TAG_DECISION_STATIC) {607bool ok = true;608myElemData["startLink"].push_back(attrs.get<std::string>(VISSIM_ATTR_LINK, nullptr, ok));609myElemData["startPos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));610}611if (element == VISSIM_TAG_ROUTE_STATIC) {612bool ok = true;613myElemData["destLink"].push_back(attrs.get<std::string>(VISSIM_ATTR_DESTLINK, nullptr, ok));614myElemData["destPos"].push_back(attrs.get<std::string>(VISSIM_ATTR_DESTPOS, nullptr, ok));615myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));616}617if (element == VISSIM_TAG_INTOBJECTREF) {618// bool ok = true;619}620621}622623void624NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::myEndElement(int /* element */) {625--myHierarchyLevel;626}627628// ---------------------------------------------------------------------------629// definitions of NIVissimXMLHandler_ConflictArea-methods630// ---------------------------------------------------------------------------631NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::NIVissimXMLHandler_ConflictArea()632: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,633vissimAttrs, VISSIM_ATTR_NOTHING,634"vissim - file") {}635636NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::~NIVissimXMLHandler_ConflictArea() { }637638void639NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::myStartElement(int element, const SUMOSAXAttributes& attrs) {640// finding an actual flow641if (element == VISSIM_TAG_CA) {642//parse all flows643bool ok = true;644std::string status = attrs.get<std::string>(VISSIM_ATTR_STATUS, nullptr, ok);645//get only the conflict areas which were set in VISSIM646if (status != "PASSIVE") {647NIVissimConflictArea::dictionary(attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok),648attrs.get<std::string>(VISSIM_ATTR_LINK1, nullptr, ok),649attrs.get<std::string>(VISSIM_ATTR_LINK2, nullptr, ok),650status);651}652653}654}655656657/* -------------------------------------------------------------------------658* NIImporter_Vissim::VissimSingleTypeParser-methods659* ----------------------------------------------------------------------- */660NIImporter_Vissim::VissimSingleTypeParser::VissimSingleTypeParser(NIImporter_Vissim& parent)661: myVissimParent(parent) {}662663664NIImporter_Vissim::VissimSingleTypeParser::~VissimSingleTypeParser() {}665666667std::string668NIImporter_Vissim::VissimSingleTypeParser::myRead(std::istream& from) {669std::string tmp;670from >> tmp;671return StringUtils::to_lower_case(tmp);672}673674675676std::string677NIImporter_Vissim::VissimSingleTypeParser::readEndSecure(std::istream& from,678const std::string& excl) {679std::string myExcl = StringUtils::to_lower_case(excl);680std::string tmp = myRead(from);681if (tmp == "") {682return "DATAEND";683}684if (tmp != myExcl685&&686(tmp.substr(0, 2) == "--" || !myVissimParent.admitContinue(tmp))687) {688return "DATAEND";689}690return StringUtils::to_lower_case(tmp);691}692693694std::string695NIImporter_Vissim::VissimSingleTypeParser::readEndSecure(std::istream& from,696const std::vector<std::string>& excl) {697std::vector<std::string> myExcl;698std::vector<std::string>::const_iterator i;699for (i = excl.begin(); i != excl.end(); i++) {700std::string mes = StringUtils::to_lower_case(*i);701myExcl.push_back(mes);702}703std::string tmp = myRead(from);704if (tmp == "") {705return "DATAEND";706}707708bool equals = false;709for (i = myExcl.begin(); i != myExcl.end() && !equals; i++) {710if ((*i) == tmp) {711equals = true;712}713}714if (!equals715&&716(tmp.substr(0, 2) == "--" || !myVissimParent.admitContinue(tmp))717) {718return "DATAEND";719}720return StringUtils::to_lower_case(tmp);721}722723724std::string725NIImporter_Vissim::VissimSingleTypeParser::overrideOptionalLabel(std::istream& from,726const std::string& tag) {727std::string tmp;728if (tag == "") {729tmp = myRead(from);730} else {731tmp = tag;732}733if (tmp == "beschriftung") {734tmp = myRead(from);735if (tmp == "keine") {736from >> tmp;737}738tmp = myRead(from);739tmp = myRead(from);740}741return tmp;742}743744745Position746NIImporter_Vissim::VissimSingleTypeParser::getPosition(std::istream& from) {747double x, y;748from >> x; // type-checking is missing!749from >> y; // type-checking is missing!750return Position(x, y);751}752753754std::vector<int>755NIImporter_Vissim::VissimSingleTypeParser::parseAssignedVehicleTypes(756std::istream& from, const std::string& next) {757std::string tmp = readEndSecure(from);758std::vector<int> ret;759if (tmp == "alle") {760ret.push_back(-1);761return ret;762}763while (tmp != "DATAEND" && tmp != next) {764ret.push_back(StringUtils::toInt(tmp));765tmp = readEndSecure(from);766}767return ret;768}769770771NIVissimExtendedEdgePoint772NIImporter_Vissim::VissimSingleTypeParser::readExtEdgePointDef(773std::istream& from) {774std::string tag;775from >> tag; // "Strecke"776int edgeid;777from >> edgeid; // type-checking is missing!778from >> tag; // "Spuren"779std::vector<int> lanes;780while (tag != "bei") {781tag = readEndSecure(from);782if (tag != "bei") {783int lane = StringUtils::toInt(tag);784lanes.push_back(lane - 1);785}786}787double position;788from >> position;789std::vector<int> dummy;790return NIVissimExtendedEdgePoint(edgeid, lanes, position, dummy);791}792793794std::string795NIImporter_Vissim::VissimSingleTypeParser::readName(std::istream& from) {796std::string name;797from >> name;798if (name[0] == '"') {799while (name[name.length() - 1] != '"') {800std::string tmp;801from >> tmp;802name = name + " " + tmp;803}804name = name.substr(1, name.length() - 2);805}806return StringUtils::convertUmlaute(name);807}808809810void811NIImporter_Vissim::VissimSingleTypeParser::readUntil(std::istream& from,812const std::string& name) {813std::string tag;814while (tag != name) {815tag = myRead(from);816}817}818819bool820NIImporter_Vissim::VissimSingleTypeParser::skipOverreading(std::istream& from,821const std::string& name) {822std::string tag;823while (tag != name) {824tag = myRead(from);825}826while (tag != "DATAEND") {827tag = readEndSecure(from);828}829return true;830}831832833834/* -------------------------------------------------------------------------835* NIImporter_Vissim-methods836* ----------------------------------------------------------------------- */837NIImporter_Vissim::NIImporter_Vissim(NBNetBuilder& nb) : myNetBuilder(nb) {838insertKnownElements();839buildParsers();840myColorMap["blau"] = RGBColor(77, 77, 255, 255);841myColorMap["gelb"] = RGBColor::YELLOW;842myColorMap["grau"] = RGBColor::GREY;843myColorMap["lila"] = RGBColor::MAGENTA;844myColorMap["gruen"] = RGBColor::GREEN;845myColorMap["rot"] = RGBColor::RED;846myColorMap["schwarz"] = RGBColor::BLACK;847myColorMap["tuerkis"] = RGBColor::CYAN;848myColorMap["weiss"] = RGBColor::WHITE;849myColorMap["keine"] = RGBColor::WHITE;850}851852853854855NIImporter_Vissim::~NIImporter_Vissim() {856NIVissimAbstractEdge::clearDict();857NIVissimClosures::clearDict();858NIVissimDistrictConnection::clearDict();859NIVissimDisturbance::clearDict();860NIVissimNodeCluster::clearDict();861NIVissimNodeDef::clearDict();862NIVissimSource::clearDict();863NIVissimTL::clearDict();864NIVissimTL::NIVissimTLSignal::clearDict();865NIVissimTL::NIVissimTLSignalGroup::clearDict();866NIVissimTrafficDescription::clearDict();867NIVissimVehTypeClass::clearDict();868NIVissimVehicleType::clearDict();869NIVissimConnectionCluster::clearDict();870NIVissimEdge::clearDict();871NIVissimAbstractEdge::clearDict();872NIVissimConnection::clearDict();873NIVissimConflictArea::clearDict();874for (ToParserMap::iterator i = myParsers.begin(); i != myParsers.end(); i++) {875delete (*i).second;876}877}878879880void881NIImporter_Vissim::load(const OptionsCont& options) {882const std::string file = options.getString("vissim-file");883// try to open the file884std::ifstream strm(file.c_str());885if (!strm.good()) {886WRITE_ERRORF(TL("Could not open vissim-file '%'."), file);887return;888}889std::string token;890strm >> token;891if (StringUtils::endsWith(file, ".inpx") || StringUtils::endsWith(token, "<?xml") || StringUtils::endsWith(token, "<network")) {892// Create NIVissimXMLHandlers893NIVissimXMLHandler_Streckendefinition XMLHandler_Streckendefinition(elementData);894NIVissimXMLHandler_Zuflussdefinition XMLHandler_Zuflussdefinition;895//NIVissimXMLHandler_Parkplatzdefinition XMLHandler_Parkplatzdefinition;896NIVissimXMLHandler_Fahrzeugklassendefinition XMLHandler_Fahrzeugklassendefinition(elementData);897NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition XMLHandler_Geschwindigkeitsverteilung(elementData);898NIVissimXMLHandler_ConflictArea XMLHandler_ConflictAreas;899900// Strecken + Verbinder901XMLHandler_Streckendefinition.setFileName(file);902PROGRESS_BEGIN_MESSAGE("Parsing strecken+verbinder from vissim-file '" + file + "'");903if (!XMLSubSys::runParser(XMLHandler_Streckendefinition, file)) {904return;905}906PROGRESS_DONE_MESSAGE();907908// Zuflüsse909XMLHandler_Zuflussdefinition.setFileName(file);910PROGRESS_BEGIN_MESSAGE("Parsing zuflüsse from vissim-file '" + file + "'");911if (!XMLSubSys::runParser(XMLHandler_Zuflussdefinition, file)) {912return;913}914PROGRESS_DONE_MESSAGE();915916//Geschwindigkeitsverteilungen917XMLHandler_Geschwindigkeitsverteilung.setFileName(file);918PROGRESS_BEGIN_MESSAGE("Parsing parkplätze from vissim-file '" + file + "'");919if (!XMLSubSys::runParser(XMLHandler_Geschwindigkeitsverteilung, file)) {920return;921}922PROGRESS_DONE_MESSAGE();923924925//Fahrzeugklassen926XMLHandler_Fahrzeugklassendefinition.setFileName(file);927PROGRESS_BEGIN_MESSAGE("Parsing parkplätze from vissim-file '" + file + "'");928if (!XMLSubSys::runParser(XMLHandler_Fahrzeugklassendefinition, file)) {929return;930}931PROGRESS_DONE_MESSAGE();932933//Parkplätze934/*XMLHandler_Parkplatzdefinition.setFileName(file);935PROGRESS_BEGIN_MESSAGE("Parsing parkplätze from vissim-file '" + file + "'");936if (!XMLSubSys::runParser(XMLHandler_Parkplatzdefinition, file)) {937return;938}939PROGRESS_DONE_MESSAGE();*/940941942//Konfliktflächen943XMLHandler_ConflictAreas.setFileName(file);944PROGRESS_BEGIN_MESSAGE("Parsing conflict areas from vissim-file '" + file + "'");945if (!XMLSubSys::runParser(XMLHandler_ConflictAreas, file)) {946return;947}948PROGRESS_DONE_MESSAGE();949} else {950strm.seekg(strm.beg);951if (!readContents(strm)) {952return;953}954}955postLoadBuild(options.getFloat("vissim.join-distance"));956}957958959bool960NIImporter_Vissim::admitContinue(const std::string& tag) {961ToElemIDMap::const_iterator i = myKnownElements.find(tag);962if (i == myKnownElements.end()) {963return true;964}965myLastSecure = tag;966return false;967}968969970bool971NIImporter_Vissim::readContents(std::istream& strm) {972// read contents973bool ok = true;974while (strm.good() && ok) {975std::string tag;976if (myLastSecure != "") {977tag = myLastSecure;978} else {979strm >> tag;980}981myLastSecure = "";982bool parsed = false;983while (!parsed && strm.good() && ok) {984ToElemIDMap::iterator i = myKnownElements.find(StringUtils::to_lower_case(tag));985if (i != myKnownElements.end()) {986ToParserMap::iterator j = myParsers.find((*i).second);987if (j != myParsers.end()) {988VissimSingleTypeParser* parser = (*j).second;989ok = parser->parse(strm);990parsed = true;991}992}993if (!parsed) {994std::string line;995std::streamoff pos;996do {997pos = strm.tellg();998getline(strm, line);999} while (strm.good() && (line == "" || line[0] == ' ' || line[0] == '-'));1000if (!strm.good()) {1001return true;1002}1003strm.seekg(pos);1004strm >> tag;1005}1006}1007}1008return ok;1009}101010111012void1013NIImporter_Vissim::postLoadBuild(double offset) {1014// close the loading process1015NIVissimBoundedClusterObject::closeLoading();1016NIVissimConnection::dict_assignToEdges();1017NIVissimDisturbance::dict_SetDisturbances();1018// build district->connections map1019NIVissimDistrictConnection::dict_BuildDistrictConnections();1020// build clusters around nodes1021// NIVissimNodeDef::buildNodeClusters();1022// build node clusters around traffic lights1023// NIVissimTL::buildNodeClusters();10241025// when connections or disturbances are left, build nodes around them10261027// try to assign connection clusters to nodes1028// only left connections will be processed in1029// buildConnectionClusters & join1030//30.4. brauchen wir noch! NIVissimNodeDef::dict_assignConnectionsToNodes();10311032// build clusters of connections with the same direction and a similar position along the streets1033NIVissimEdge::buildConnectionClusters();1034// check whether further nodes (connection clusters by now) must be added1035NIVissimDistrictConnection::dict_CheckEdgeEnds();10361037// join clusters when overlapping (different streets are possible)1038NIVissimEdge::dict_checkEdges2Join();1039NIVissimConnectionCluster::joinBySameEdges(offset);1040// NIVissimConnectionCluster::joinByDisturbances(offset);10411042// NIVissimConnectionCluster::addTLs(offset);10431044// build nodes from clusters1045NIVissimNodeCluster::setCurrentVirtID(NIVissimNodeDef::getMaxID());1046NIVissimConnectionCluster::buildNodeClusters();10471048// NIVissimNodeCluster::dict_recheckEdgeChanges();1049NIVissimNodeCluster::buildNBNodes(myNetBuilder.getNodeCont());1050NIVissimDistrictConnection::dict_BuildDistrictNodes(1051myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont());1052NIVissimEdge::dict_propagateSpeeds();1053NIVissimEdge::dict_buildNBEdges(myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont(), myNetBuilder.getEdgeCont(), offset);1054if (OptionsCont::getOptions().getBool("vissim.report-unset-speeds")) {1055NIVissimEdge::reportUnsetSpeeds();1056}1057NIVissimDistrictConnection::dict_BuildDistricts(myNetBuilder.getDistrictCont(), myNetBuilder.getEdgeCont(), myNetBuilder.getNodeCont());1058NIVissimConnection::dict_buildNBEdgeConnections(myNetBuilder.getEdgeCont());1059NIVissimNodeCluster::dict_addDisturbances(myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont(), myNetBuilder.getEdgeCont());1060NIVissimConflictArea::setPriorityRegulation(myNetBuilder.getEdgeCont());1061NIVissimTL::dict_SetSignals(myNetBuilder.getTLLogicCont(), myNetBuilder.getEdgeCont());1062}106310641065void1066NIImporter_Vissim::insertKnownElements() {1067myKnownElements["kennung"] = VE_Kennungszeile;1068myKnownElements["zufallszahl"] = VE_Startzufallszahl;1069myKnownElements["simulationsdauer"] = VE_Simdauer;1070myKnownElements["startuhrzeit"] = VE_Startuhrzeit;1071myKnownElements["simulationsrate"] = VE_SimRate;1072myKnownElements["zeitschritt"] = VE_Zeitschrittfaktor;1073myKnownElements["linksverkehr"] = VE_Linksverkehr;1074myKnownElements["dynuml"] = VE_DynUml;1075myKnownElements["stau"] = VE_Stauparameterdefinition;1076myKnownElements["gelbverhalten"] = VE_Gelbverhaltendefinition;1077myKnownElements["strecke"] = VE_Streckendefinition;1078myKnownElements["verbindung"] = VE_Verbindungsdefinition;1079myKnownElements["richtungsentscheidung"] = VE_Richtungsentscheidungsdefinition;1080myKnownElements["routenentscheidung"] = VE_Routenentscheidungsdefinition;1081myKnownElements["vwunschentscheidung"] = VE_VWunschentscheidungsdefinition;1082myKnownElements["langsamfahrbereich"] = VE_Langsamfahrbereichdefinition;1083myKnownElements["zufluss"] = VE_Zuflussdefinition;1084myKnownElements["fahrzeugtyp"] = VE_Fahrzeugtypdefinition;1085myKnownElements["fahrzeugklasse"] = VE_Fahrzeugklassendefinition;1086myKnownElements["zusammensetzung"] = VE_Verkehrszusammensetzungsdefinition;1087myKnownElements["vwunsch"] = VE_Geschwindigkeitsverteilungsdefinition;1088myKnownElements["laengen"] = VE_Laengenverteilungsdefinition;1089myKnownElements["zeiten"] = VE_Zeitenverteilungsdefinition;1090myKnownElements["baujahre"] = VE_Baujahrverteilungsdefinition;1091myKnownElements["leistungen"] = VE_Laufleistungsverteilungsdefinition;1092myKnownElements["massen"] = VE_Massenverteilungsdefinition;1093myKnownElements["leistungen"] = VE_Leistungsverteilungsdefinition;1094myKnownElements["maxbeschleunigung"] = VE_Maxbeschleunigungskurvedefinition;1095myKnownElements["wunschbeschleunigung"] = VE_Wunschbeschleunigungskurvedefinition;1096myKnownElements["maxverzoegerung"] = VE_Maxverzoegerungskurvedefinition;1097myKnownElements["wunschverzoegerung"] = VE_Wunschverzoegerungskurvedefinition;1098myKnownElements["querverkehrsstoerung"] = VE_Querverkehrsstoerungsdefinition;1099myKnownElements["lsa"] = VE_Lichtsignalanlagendefinition;1100myKnownElements["signalgruppe"] = VE_Signalgruppendefinition;1101myKnownElements["signalgeber"] = VE_Signalgeberdefinition;1102myKnownElements["lsakopplung"] = VE_LSAKopplungdefinition;1103myKnownElements["detektor"] = VE_Detektorendefinition;1104myKnownElements["haltestelle"] = VE_Haltestellendefinition;1105myKnownElements["linie"] = VE_Liniendefinition;1106myKnownElements["stopschild"] = VE_Stopschilddefinition;1107myKnownElements["messung"] = VE_Messungsdefinition;1108myKnownElements["reisezeit"] = VE_Reisezeitmessungsdefinition;1109myKnownElements["verlustzeit"] = VE_Verlustzeitmessungsdefinition;1110myKnownElements["querschnittsmessung"] = VE_Querschnittsmessungsdefinition;1111myKnownElements["stauzaehler"] = VE_Stauzaehlerdefinition;1112myKnownElements["auswertung"] = VE_Auswertungsdefinition;1113myKnownElements["fenster"] = VE_Fensterdefinition;1114myKnownElements["motiv"] = VE_Gefahrenwarnsystemdefinition;1115myKnownElements["parkplatz"] = VE_Parkplatzdefinition;1116myKnownElements["knoten"] = VE_Knotendefinition;1117myKnownElements["teapac"] = VE_TEAPACdefinition;1118myKnownElements["netzobjekt"] = VE_Netzobjektdefinition;1119myKnownElements["richtungspfeil"] = VE_Richtungspfeildefinition;1120myKnownElements["raute"] = VE_Rautedefinition;1121myKnownElements["fahrverhalten"] = VE_Fahrverhaltendefinition;1122myKnownElements["fahrtverlaufdateien"] = VE_Fahrtverlaufdateien;1123myKnownElements["emission"] = VE_Emission;1124myKnownElements["einheit"] = VE_Einheitendefinition;1125myKnownElements["streckentyp"] = VE_Streckentypdefinition;1126myKnownElements["kantensperrung"] = VE_Kantensperrung;1127myKnownElements["kante"] = VE_Kantensperrung;112811291130myKnownElements["advance"] = VE_DUMMY;1131myKnownElements["temperatur"] = VE_DUMMY;11321133}1134113511361137void1138NIImporter_Vissim::buildParsers() {1139myParsers[VE_Simdauer] =1140new NIVissimSingleTypeParser_Simdauer(*this);1141myParsers[VE_Startuhrzeit] =1142new NIVissimSingleTypeParser_Startuhrzeit(*this);1143myParsers[VE_DynUml] =1144new NIVissimSingleTypeParser_DynUml(*this);1145myParsers[VE_Streckendefinition] =1146new NIVissimSingleTypeParser_Streckendefinition(*this);1147myParsers[VE_Verbindungsdefinition] =1148new NIVissimSingleTypeParser_Verbindungsdefinition(*this);1149myParsers[VE_Richtungsentscheidungsdefinition] =1150new NIVissimSingleTypeParser_Richtungsentscheidungsdefinition(*this);1151myParsers[VE_Routenentscheidungsdefinition] =1152new NIVissimSingleTypeParser_Routenentscheidungsdefinition(*this);1153myParsers[VE_VWunschentscheidungsdefinition] =1154new NIVissimSingleTypeParser_VWunschentscheidungsdefinition(*this);1155myParsers[VE_Langsamfahrbereichdefinition] =1156new NIVissimSingleTypeParser_Langsamfahrbereichdefinition(*this);1157myParsers[VE_Zuflussdefinition] =1158new NIVissimSingleTypeParser_Zuflussdefinition(*this);1159myParsers[VE_Fahrzeugtypdefinition] =1160new NIVissimSingleTypeParser_Fahrzeugtypdefinition(*this, myColorMap);1161myParsers[VE_Fahrzeugklassendefinition] =1162new NIVissimSingleTypeParser_Fahrzeugklassendefinition(*this, myColorMap);1163myParsers[VE_Geschwindigkeitsverteilungsdefinition] =1164new NIVissimSingleTypeParser_Geschwindigkeitsverteilungsdefinition(*this);1165myParsers[VE_Laengenverteilungsdefinition] =1166new NIVissimSingleTypeParser_Laengenverteilungsdefinition(*this);1167myParsers[VE_Zeitenverteilungsdefinition] =1168new NIVissimSingleTypeParser_Zeitenverteilungsdefinition(*this);1169myParsers[VE_Querverkehrsstoerungsdefinition] =1170new NIVissimSingleTypeParser_Querverkehrsstoerungsdefinition(*this);1171myParsers[VE_Lichtsignalanlagendefinition] =1172new NIVissimSingleTypeParser_Lichtsignalanlagendefinition(*this);1173myParsers[VE_Signalgruppendefinition] =1174new NIVissimSingleTypeParser_Signalgruppendefinition(*this);1175myParsers[VE_Stopschilddefinition] =1176new NIVissimSingleTypeParser_Stopschilddefinition(*this);1177myParsers[VE_Knotendefinition] =1178new NIVissimSingleTypeParser_Knotendefinition(*this);1179myParsers[VE_Signalgeberdefinition] =1180new NIVissimSingleTypeParser_Signalgeberdefinition(*this);1181myParsers[VE_Detektorendefinition] =1182new NIVissimSingleTypeParser_Detektordefinition(*this);1183myParsers[VE_Haltestellendefinition] =1184new NIVissimSingleTypeParser_Haltestellendefinition(*this);1185myParsers[VE_Liniendefinition] =1186new NIVissimSingleTypeParser_Liniendefinition(*this);1187myParsers[VE_Reisezeitmessungsdefinition] =1188new NIVissimSingleTypeParser_Reisezeitmessungsdefinition(*this);1189myParsers[VE_Querschnittsmessungsdefinition] =1190new NIVissimSingleTypeParser_Querschnittsmessungsdefinition(*this);1191myParsers[VE_Messungsdefinition] =1192new NIVissimSingleTypeParser_Messungsdefinition(*this);1193myParsers[VE_Verlustzeitmessungsdefinition] =1194new NIVissimSingleTypeParser_Verlustzeitmessungsdefinition(*this);1195myParsers[VE_Stauzaehlerdefinition] =1196new NIVissimSingleTypeParser_Stauzaehlerdefinition(*this);1197myParsers[VE_Rautedefinition] =1198new NIVissimSingleTypeParser_Rautedefinition(*this);1199myParsers[VE_Richtungspfeildefinition] =1200new NIVissimSingleTypeParser_Richtungspfeildefinition(*this);1201myParsers[VE_Parkplatzdefinition] =1202new NIVissimSingleTypeParser_Parkplatzdefinition(*this);1203myParsers[VE_Fahrverhaltendefinition] =1204new NIVissimSingleTypeParser_Fahrverhaltendefinition(*this);1205myParsers[VE_Streckentypdefinition] =1206new NIVissimSingleTypeParser_Streckentypdefinition(*this);1207myParsers[VE_Kennungszeile] =1208new NIVissimSingleTypeParser_Kennungszeile(*this);1209myParsers[VE_Fensterdefinition] =1210new NIVissimSingleTypeParser_Fensterdefinition(*this);1211myParsers[VE_Auswertungsdefinition] =1212new NIVissimSingleTypeParser_Auswertungsdefinition(*this);1213myParsers[VE_Verkehrszusammensetzungsdefinition] =1214new NIVissimSingleTypeParser_Zusammensetzungsdefinition(*this);1215myParsers[VE_Kantensperrung] =1216new NIVissimSingleTypeParser_Kantensperrung(*this);12171218myParsers[VE_Startzufallszahl] =1219new NIVissimSingleTypeParser_Startzufallszahl(*this);1220myParsers[VE_SimRate] =1221new NIVissimSingleTypeParser_SimRate(*this);1222myParsers[VE_Zeitschrittfaktor] =1223new NIVissimSingleTypeParser_Zeitschrittfaktor(*this);1224myParsers[VE_Linksverkehr] =1225new NIVissimSingleTypeParser_Linksverkehr(*this);1226myParsers[VE_Stauparameterdefinition] =1227new NIVissimSingleTypeParser_Stauparameterdefinition(*this);1228myParsers[VE_Gelbverhaltendefinition] =1229new NIVissimSingleTypeParser_Gelbverhaltendefinition(*this);1230myParsers[VE_LSAKopplungdefinition] =1231new NIVissimSingleTypeParser_LSAKopplungsdefinition(*this);1232myParsers[VE_Gefahrenwarnsystemdefinition] =1233new NIVissimSingleTypeParser_Gefahrwarnungsdefinition(*this);1234myParsers[VE_TEAPACdefinition] =1235new NIVissimSingleTypeParser_TEAPACDefinition(*this);1236myParsers[VE_Netzobjektdefinition] =1237new NIVissimSingleTypeParser_Netzobjektdefinition(*this);1238myParsers[VE_Fahrtverlaufdateien] =1239new NIVissimSingleTypeParser_Fahrtverlaufdateien(*this);1240myParsers[VE_Emission] =1241new NIVissimSingleTypeParser_Emission(*this);1242myParsers[VE_Einheitendefinition] =1243new NIVissimSingleTypeParser_Einheitendefinition(*this);1244myParsers[VE_Baujahrverteilungsdefinition] =1245new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);1246myParsers[VE_Laufleistungsverteilungsdefinition] =1247new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);1248myParsers[VE_Massenverteilungsdefinition] =1249new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);1250myParsers[VE_Leistungsverteilungsdefinition] =1251new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);1252myParsers[VE_Maxbeschleunigungskurvedefinition] =1253new NIVissimSingleTypeParser__XKurvedefinition(*this);1254myParsers[VE_Wunschbeschleunigungskurvedefinition] =1255new NIVissimSingleTypeParser__XKurvedefinition(*this);1256myParsers[VE_Maxverzoegerungskurvedefinition] =1257new NIVissimSingleTypeParser__XKurvedefinition(*this);1258myParsers[VE_Wunschverzoegerungskurvedefinition] =1259new NIVissimSingleTypeParser__XKurvedefinition(*this);12601261}126212631264/****************************************************************************/126512661267