Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netimport/vissim/NIImporter_Vissim.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file 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
NIImporter_Vissim::loadNetwork(const OptionsCont& oc, NBNetBuilder& nb) {
193
if (!oc.isSet("vissim-file")) {
194
return;
195
}
196
NIImporter_Vissim(nb).load(oc);
197
}
198
199
200
// ---------------------------------------------------------------------------
201
// definitions of NIVissimXMLHandler_Streckendefinition-methods
202
// ---------------------------------------------------------------------------
203
NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::NIVissimXMLHandler_Streckendefinition(
204
//std::map<int, VissimXMLEdge>& toFill)
205
nodeMap& elemData)
206
: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
207
vissimAttrs, VISSIM_ATTR_NOTHING,
208
"vissim - file"),
209
myElemData(elemData),
210
myHierarchyLevel(0),
211
isConnector(false) {
212
myElemData.clear();
213
}
214
215
NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::~NIVissimXMLHandler_Streckendefinition() { }
216
217
void
218
NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
219
myHierarchyLevel++;
220
221
// finding an actual LINK
222
if (element == VISSIM_TAG_LINK) {
223
//parse all links
224
bool ok = true;
225
int id = attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok);
226
myLastNodeID = id;
227
228
// !!! assuming empty myElemData
229
myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));
230
// error ignored if name is empty
231
myElemData["name"].push_back(attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false));
232
myElemData["type"].push_back(attrs.get<std::string>(VISSIM_ATTR_LINKBEHAVETYPE, nullptr, ok));
233
myElemData["zuschlag1"].push_back(attrs.get<std::string>(VISSIM_ATTR_ZUSCHLAG1, nullptr, ok));
234
myElemData["zuschlag2"].push_back(attrs.get<std::string>(VISSIM_ATTR_ZUSCHLAG2, nullptr, ok));
235
}
236
237
if (element == VISSIM_TAG_LANE) {
238
bool ok = true;
239
// appends empty element if no width found
240
// error ignored if name is empty
241
myElemData["width"].push_back(attrs.get<std::string>(VISSIM_ATTR_WIDTH, nullptr, ok, false));
242
}
243
244
if (element == VISSIM_TAG_FROM) {
245
if (isConnector != true) {
246
isConnector = true;
247
}
248
bool ok = true;
249
std::vector<std::string> from(StringTokenizer(attrs.get<std::string>(
250
VISSIM_ATTR_LANE, nullptr, ok), " ").getVector());
251
myElemData["from_pos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));
252
myElemData["from_id"].push_back(from[0]);
253
myElemData["from_lane"].push_back(from[1]);
254
}
255
256
if (element == VISSIM_TAG_TO) {
257
bool ok = true;
258
std::vector<std::string> to(StringTokenizer(attrs.get<std::string>(
259
VISSIM_ATTR_LANE, nullptr, ok), " ").getVector());
260
myElemData["to_pos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));
261
myElemData["to_id"].push_back(to[0]);
262
myElemData["to_lane"].push_back(to[1]);
263
}
264
265
if (element == VISSIM_TAG_POINT3D || element == VISSIM_TAG_LINKPOLYPOINT) {
266
bool ok = true;
267
// create a <sep> separated string of coordinate data
268
std::string sep(" ");
269
270
std::string posS(attrs.get<std::string>(VISSIM_ATTR_X, nullptr, ok));
271
posS += sep;
272
posS.append(attrs.get<std::string>(VISSIM_ATTR_Y, nullptr, ok));
273
// allow for no Z
274
std::string z(attrs.get<std::string>(VISSIM_ATTR_ZOFFSET, nullptr, ok, false));
275
if (z.length() > 0) {
276
posS += sep;
277
posS.append(z);
278
}
279
myElemData["pos"].push_back(posS);
280
}
281
282
283
}
284
285
void
286
NIImporter_Vissim::NIVissimXMLHandler_Streckendefinition::myEndElement(int element) {
287
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
int id(StringUtils::toInt(myElemData["id"].front()));
293
294
PositionVector geom;
295
// convert all position coordinate strings to PositionVectors
296
while (!myElemData["pos"].empty()) {
297
std::vector<std::string> sPos_v(StringTokenizer(
298
myElemData["pos"].front(), " ").getVector());
299
myElemData["pos"].pop_front();
300
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
geom.push_back_noDoublePos(Position(pos_v[0], pos_v[1], pos_v[2]));
306
}
307
// FIXME: a length = 0 PosVec seems fatal -> segfault
308
double length(geom.length());
309
310
if (!isConnector) {
311
// Add Edge
312
std::vector<double> laneWidths;
313
for (std::string& w : myElemData["width"]) {
314
laneWidths.push_back(StringUtils::toDouble(w));
315
}
316
NIVissimEdge* edge = new NIVissimEdge(id,
317
myElemData["name"].front(),
318
myElemData["type"].front(),
319
laneWidths,
320
StringUtils::toDouble(myElemData["zuschlag1"].front()),
321
StringUtils::toDouble(myElemData["zuschlag2"].front()),
322
length, geom, clv);
323
NIVissimEdge::dictionary(id, edge);
324
} else {
325
int numLanes = (int)myElemData["width"].size();
326
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
laneVec[0] = StringUtils::toInt(myElemData["from_lane"].front()) - 1;
332
// then count up, building lane number vector
333
for (std::vector<int>::iterator each = ++laneVec.begin(); each != laneVec.end(); ++each) {
334
*each = *(each - 1) + 1;
335
}
336
337
NIVissimExtendedEdgePoint from_def(
338
StringUtils::toInt(myElemData["from_id"].front()),
339
laneVec,
340
StringUtils::toDouble(myElemData["from_pos"].front()),
341
assignedVehicles);
342
343
//NOTE: there should be only 1 lane number in XML
344
// subtraction of 1 as in readExtEdgePointDef()
345
laneVec[0] = StringUtils::toInt(myElemData["to_lane"].front()) - 1;
346
// then count up, building lane number vector
347
for (std::vector<int>::iterator each = ++laneVec.begin(); each != laneVec.end(); ++each) {
348
*each = *(each - 1) + 1;
349
}
350
351
NIVissimExtendedEdgePoint to_def(
352
StringUtils::toInt(myElemData["to_id"].front()),
353
laneVec,
354
StringUtils::toDouble(myElemData["to_pos"].front()),
355
assignedVehicles);
356
357
NIVissimConnection* connector = new
358
NIVissimConnection(id,
359
myElemData["name"].front(),
360
from_def, to_def,
361
geom, assignedVehicles, clv);
362
363
NIVissimConnection::dictionary(id, connector);
364
}
365
// clear the element data
366
myElemData.clear();
367
isConnector = false;
368
//std::cout << "elemData len (clear):" << myElemData.size() << std::endl;
369
//std::cout.flush();
370
371
}
372
--myHierarchyLevel;
373
}
374
375
376
// ---------------------------------------------------------------------------
377
// definitions of NIVissimXMLHandler_Zuflussdefinition-methods
378
// ---------------------------------------------------------------------------
379
NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::NIVissimXMLHandler_Zuflussdefinition()
380
: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
381
vissimAttrs, VISSIM_ATTR_NOTHING,
382
"vissim - file") {
383
}
384
385
NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::~NIVissimXMLHandler_Zuflussdefinition() { }
386
387
void
388
NIImporter_Vissim::NIVissimXMLHandler_Zuflussdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
389
// finding an actual flow
390
if (element == VISSIM_TAG_VEHICLE_INPUT) {
391
//parse all flows
392
bool ok = true;
393
std::string id = attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok);
394
std::string edgeid = attrs.get<std::string>(VISSIM_ATTR_LINK, nullptr, ok);
395
std::string name = attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false);
396
397
NIVissimSource::dictionary(id,
398
name,
399
edgeid);
400
}
401
}
402
403
// ---------------------------------------------------------------------------
404
// definitions of NIVissimXMLHandler_Parkplatzdefinition-methods
405
// ---------------------------------------------------------------------------
406
NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::NIVissimXMLHandler_Parkplatzdefinition()
407
: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
408
vissimAttrs, VISSIM_ATTR_NOTHING,
409
"vissim - file") {
410
}
411
412
NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::~NIVissimXMLHandler_Parkplatzdefinition() { }
413
414
void
415
NIImporter_Vissim::NIVissimXMLHandler_Parkplatzdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
416
// finding an actual parkinglot
417
if (element == VISSIM_TAG_PARKINGLOT) {
418
//parse all parkinglots
419
bool ok = true;
420
int id = attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok);
421
int edgeid = attrs.get<int>(VISSIM_ATTR_INTLINK, nullptr, ok);
422
std::string name = attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false);
423
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
districts.push_back(attrs.get<int>(VISSIM_ATTR_DISTRICT, nullptr, ok));
431
percentages.push_back(attrs.get<double>(VISSIM_ATTR_PERCENTAGE, nullptr, ok));
432
433
NIVissimDistrictConnection::dictionary(id,
434
name,
435
districts,
436
percentages,
437
edgeid,
438
position,
439
assignedVehicles);
440
}
441
}
442
443
444
// ---------------------------------------------------------------------------
445
// definitions of NIVissimXMLHandler_Fahrzeugklassendefinition-methods
446
// ---------------------------------------------------------------------------
447
NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::NIVissimXMLHandler_Fahrzeugklassendefinition(nodeMap& elemData)
448
: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
449
vissimAttrs, VISSIM_ATTR_NOTHING,
450
"vissim - file"),
451
myElemData(elemData),
452
myHierarchyLevel(0) {
453
myElemData.clear();
454
}
455
456
NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::~NIVissimXMLHandler_Fahrzeugklassendefinition() { }
457
458
void
459
NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
460
myHierarchyLevel++;
461
462
if (element == VISSIM_TAG_VEHICLE_CLASS) {
463
bool ok = true;
464
myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));
465
myElemData["name"].push_back(attrs.get<std::string>(VISSIM_ATTR_NAME, nullptr, ok, false));
466
std::string colorStr(attrs.get<std::string>(VISSIM_ATTR_COLOR, nullptr, ok));
467
for (int pos = (int)colorStr.size() - 2; pos > 0; pos -= 2) {
468
colorStr.insert(pos, " ");
469
}
470
myElemData["color"].push_back(colorStr);
471
}
472
if (element == VISSIM_TAG_INTOBJECTREF) {
473
bool ok = true;
474
myElemData["types"].push_back(attrs.get<std::string>(VISSIM_ATTR_KEY, nullptr, ok));
475
476
477
}
478
}
479
480
void
481
NIImporter_Vissim::NIVissimXMLHandler_Fahrzeugklassendefinition::myEndElement(int element) {
482
if (element == VISSIM_TAG_VEHICLE_CLASS && myHierarchyLevel == 3) {
483
RGBColor color;
484
std::istringstream iss(myElemData["color"].front());
485
std::vector<std::string> sCol_v(StringTokenizer(
486
myElemData["color"].front(), " ").getVector());
487
std::vector<int> myColorVector(sCol_v.size());
488
std::transform(sCol_v.begin(), sCol_v.end(), myColorVector.begin(), StringUtils::hexToInt);
489
490
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
while (!myElemData["types"].empty()) {
496
types.push_back(StringUtils::toInt(myElemData["types"].front()));
497
myElemData["types"].pop_front();
498
}
499
500
NIVissimVehTypeClass::dictionary(StringUtils::toInt(myElemData["id"].front()),
501
myElemData["name"].front(),
502
color,
503
types);
504
myElemData.clear();
505
}
506
--myHierarchyLevel;
507
}
508
509
// ---------------------------------------------------------------------------
510
// definitions of NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition-methods
511
// ---------------------------------------------------------------------------
512
NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition(nodeMap& elemData)
513
: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
514
vissimAttrs, VISSIM_ATTR_NOTHING,
515
"vissim - file"),
516
myElemData(elemData),
517
myHierarchyLevel(0) {
518
myElemData.clear();
519
}
520
521
NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::~NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition() { }
522
523
void
524
NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
525
myHierarchyLevel++;
526
if (element == VISSIM_TAG_SPEED_DIST) {
527
bool ok = true;
528
myElemData["id"].push_back(attrs.get<std::string>(VISSIM_ATTR_NO, nullptr, ok));
529
}
530
531
if (element == VISSIM_TAG_DATAPOINT) {
532
bool ok = true;
533
std::string sep(" ");
534
std::string posS(attrs.get<std::string>(VISSIM_ATTR_X, nullptr, ok));
535
posS += sep;
536
posS.append(attrs.get<std::string>(VISSIM_ATTR_FX, nullptr, ok));
537
myElemData["points"].push_back(posS);
538
539
}
540
541
}
542
543
void
544
NIImporter_Vissim::NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition::myEndElement(int element) {
545
if (element == VISSIM_TAG_SPEED_DIST && myHierarchyLevel == 3) {
546
Distribution_Points* points = new Distribution_Points(myElemData["id"].front());
547
while (!myElemData["points"].empty()) {
548
std::vector<std::string> sPos_v(StringTokenizer(
549
myElemData["points"].front(), " ").getVector());
550
myElemData["points"].pop_front();
551
points->add(StringUtils::toDouble(sPos_v[0]), StringUtils::toDouble(sPos_v[1]));
552
}
553
DistributionCont::dictionary("speed", myElemData["id"].front(), points);
554
myElemData.clear();
555
}
556
--myHierarchyLevel;
557
}
558
559
// ---------------------------------------------------------------------------
560
// definitions of NIVissimXMLHandler_VWunschentscheidungsdefinition-methods
561
// ---------------------------------------------------------------------------
562
NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::NIVissimXMLHandler_VWunschentscheidungsdefinition(nodeMap& elemData)
563
: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
564
vissimAttrs, VISSIM_ATTR_NOTHING,
565
"vissim - file"),
566
myElemData(elemData),
567
myHierarchyLevel(0) {
568
myElemData.clear();
569
}
570
571
NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::~NIVissimXMLHandler_VWunschentscheidungsdefinition() { }
572
573
void
574
NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
575
myHierarchyLevel++;
576
if (element == VISSIM_TAG_SPEED_DECISION) {
577
bool ok = true;
578
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
}
583
584
void
585
NIImporter_Vissim::NIVissimXMLHandler_VWunschentscheidungsdefinition::myEndElement(int /* element */) {
586
--myHierarchyLevel;
587
}
588
589
590
// ---------------------------------------------------------------------------
591
// definitions of NIVissimXMLHandler_Routenentscheidungsdefinition-methods
592
// ---------------------------------------------------------------------------
593
NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::NIVissimXMLHandler_Routenentscheidungsdefinition(nodeMap& elemData)
594
: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
595
vissimAttrs, VISSIM_ATTR_NOTHING,
596
"vissim - file"),
597
myElemData(elemData),
598
myHierarchyLevel(0) {
599
myElemData.clear();
600
}
601
602
NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::~NIVissimXMLHandler_Routenentscheidungsdefinition() { }
603
604
void
605
NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::myStartElement(int element, const SUMOSAXAttributes& attrs) {
606
myHierarchyLevel++;
607
if (element == VISSIM_TAG_DECISION_STATIC) {
608
bool ok = true;
609
myElemData["startLink"].push_back(attrs.get<std::string>(VISSIM_ATTR_LINK, nullptr, ok));
610
myElemData["startPos"].push_back(attrs.get<std::string>(VISSIM_ATTR_POS, nullptr, ok));
611
}
612
if (element == VISSIM_TAG_ROUTE_STATIC) {
613
bool ok = true;
614
myElemData["destLink"].push_back(attrs.get<std::string>(VISSIM_ATTR_DESTLINK, nullptr, ok));
615
myElemData["destPos"].push_back(attrs.get<std::string>(VISSIM_ATTR_DESTPOS, nullptr, ok));
616
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
}
623
624
void
625
NIImporter_Vissim::NIVissimXMLHandler_Routenentscheidungsdefinition::myEndElement(int /* element */) {
626
--myHierarchyLevel;
627
}
628
629
// ---------------------------------------------------------------------------
630
// definitions of NIVissimXMLHandler_ConflictArea-methods
631
// ---------------------------------------------------------------------------
632
NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::NIVissimXMLHandler_ConflictArea()
633
: GenericSAXHandler(vissimTags, VISSIM_TAG_NOTHING,
634
vissimAttrs, VISSIM_ATTR_NOTHING,
635
"vissim - file") {}
636
637
NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::~NIVissimXMLHandler_ConflictArea() { }
638
639
void
640
NIImporter_Vissim::NIVissimXMLHandler_ConflictArea::myStartElement(int element, const SUMOSAXAttributes& attrs) {
641
// finding an actual flow
642
if (element == VISSIM_TAG_CA) {
643
//parse all flows
644
bool ok = true;
645
std::string status = attrs.get<std::string>(VISSIM_ATTR_STATUS, nullptr, ok);
646
//get only the conflict areas which were set in VISSIM
647
if (status != "PASSIVE") {
648
NIVissimConflictArea::dictionary(attrs.get<int>(VISSIM_ATTR_NO, nullptr, ok),
649
attrs.get<std::string>(VISSIM_ATTR_LINK1, nullptr, ok),
650
attrs.get<std::string>(VISSIM_ATTR_LINK2, nullptr, ok),
651
status);
652
}
653
654
}
655
}
656
657
658
/* -------------------------------------------------------------------------
659
* NIImporter_Vissim::VissimSingleTypeParser-methods
660
* ----------------------------------------------------------------------- */
661
NIImporter_Vissim::VissimSingleTypeParser::VissimSingleTypeParser(NIImporter_Vissim& parent)
662
: myVissimParent(parent) {}
663
664
665
NIImporter_Vissim::VissimSingleTypeParser::~VissimSingleTypeParser() {}
666
667
668
std::string
669
NIImporter_Vissim::VissimSingleTypeParser::myRead(std::istream& from) {
670
std::string tmp;
671
from >> tmp;
672
return StringUtils::to_lower_case(tmp);
673
}
674
675
676
677
std::string
678
NIImporter_Vissim::VissimSingleTypeParser::readEndSecure(std::istream& from,
679
const std::string& excl) {
680
std::string myExcl = StringUtils::to_lower_case(excl);
681
std::string tmp = myRead(from);
682
if (tmp == "") {
683
return "DATAEND";
684
}
685
if (tmp != myExcl
686
&&
687
(tmp.substr(0, 2) == "--" || !myVissimParent.admitContinue(tmp))
688
) {
689
return "DATAEND";
690
}
691
return StringUtils::to_lower_case(tmp);
692
}
693
694
695
std::string
696
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
for (i = excl.begin(); i != excl.end(); i++) {
701
std::string mes = StringUtils::to_lower_case(*i);
702
myExcl.push_back(mes);
703
}
704
std::string tmp = myRead(from);
705
if (tmp == "") {
706
return "DATAEND";
707
}
708
709
bool equals = false;
710
for (i = myExcl.begin(); i != myExcl.end() && !equals; i++) {
711
if ((*i) == tmp) {
712
equals = true;
713
}
714
}
715
if (!equals
716
&&
717
(tmp.substr(0, 2) == "--" || !myVissimParent.admitContinue(tmp))
718
) {
719
return "DATAEND";
720
}
721
return StringUtils::to_lower_case(tmp);
722
}
723
724
725
std::string
726
NIImporter_Vissim::VissimSingleTypeParser::overrideOptionalLabel(std::istream& from,
727
const std::string& tag) {
728
std::string tmp;
729
if (tag == "") {
730
tmp = myRead(from);
731
} else {
732
tmp = tag;
733
}
734
if (tmp == "beschriftung") {
735
tmp = myRead(from);
736
if (tmp == "keine") {
737
from >> tmp;
738
}
739
tmp = myRead(from);
740
tmp = myRead(from);
741
}
742
return tmp;
743
}
744
745
746
Position
747
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
return Position(x, y);
752
}
753
754
755
std::vector<int>
756
NIImporter_Vissim::VissimSingleTypeParser::parseAssignedVehicleTypes(
757
std::istream& from, const std::string& next) {
758
std::string tmp = readEndSecure(from);
759
std::vector<int> ret;
760
if (tmp == "alle") {
761
ret.push_back(-1);
762
return ret;
763
}
764
while (tmp != "DATAEND" && tmp != next) {
765
ret.push_back(StringUtils::toInt(tmp));
766
tmp = readEndSecure(from);
767
}
768
return ret;
769
}
770
771
772
NIVissimExtendedEdgePoint
773
NIImporter_Vissim::VissimSingleTypeParser::readExtEdgePointDef(
774
std::istream& from) {
775
std::string tag;
776
from >> tag; // "Strecke"
777
int edgeid;
778
from >> edgeid; // type-checking is missing!
779
from >> tag; // "Spuren"
780
std::vector<int> lanes;
781
while (tag != "bei") {
782
tag = readEndSecure(from);
783
if (tag != "bei") {
784
int lane = StringUtils::toInt(tag);
785
lanes.push_back(lane - 1);
786
}
787
}
788
double position;
789
from >> position;
790
std::vector<int> dummy;
791
return NIVissimExtendedEdgePoint(edgeid, lanes, position, dummy);
792
}
793
794
795
std::string
796
NIImporter_Vissim::VissimSingleTypeParser::readName(std::istream& from) {
797
std::string name;
798
from >> name;
799
if (name[0] == '"') {
800
while (name[name.length() - 1] != '"') {
801
std::string tmp;
802
from >> tmp;
803
name = name + " " + tmp;
804
}
805
name = name.substr(1, name.length() - 2);
806
}
807
return StringUtils::convertUmlaute(name);
808
}
809
810
811
void
812
NIImporter_Vissim::VissimSingleTypeParser::readUntil(std::istream& from,
813
const std::string& name) {
814
std::string tag;
815
while (tag != name) {
816
tag = myRead(from);
817
}
818
}
819
820
bool
821
NIImporter_Vissim::VissimSingleTypeParser::skipOverreading(std::istream& from,
822
const std::string& name) {
823
std::string tag;
824
while (tag != name) {
825
tag = myRead(from);
826
}
827
while (tag != "DATAEND") {
828
tag = readEndSecure(from);
829
}
830
return true;
831
}
832
833
834
835
/* -------------------------------------------------------------------------
836
* NIImporter_Vissim-methods
837
* ----------------------------------------------------------------------- */
838
NIImporter_Vissim::NIImporter_Vissim(NBNetBuilder& nb) : myNetBuilder(nb) {
839
insertKnownElements();
840
buildParsers();
841
myColorMap["blau"] = RGBColor(77, 77, 255, 255);
842
myColorMap["gelb"] = RGBColor::YELLOW;
843
myColorMap["grau"] = RGBColor::GREY;
844
myColorMap["lila"] = RGBColor::MAGENTA;
845
myColorMap["gruen"] = RGBColor::GREEN;
846
myColorMap["rot"] = RGBColor::RED;
847
myColorMap["schwarz"] = RGBColor::BLACK;
848
myColorMap["tuerkis"] = RGBColor::CYAN;
849
myColorMap["weiss"] = RGBColor::WHITE;
850
myColorMap["keine"] = RGBColor::WHITE;
851
}
852
853
854
855
856
NIImporter_Vissim::~NIImporter_Vissim() {
857
NIVissimAbstractEdge::clearDict();
858
NIVissimClosures::clearDict();
859
NIVissimDistrictConnection::clearDict();
860
NIVissimDisturbance::clearDict();
861
NIVissimNodeCluster::clearDict();
862
NIVissimNodeDef::clearDict();
863
NIVissimSource::clearDict();
864
NIVissimTL::clearDict();
865
NIVissimTL::NIVissimTLSignal::clearDict();
866
NIVissimTL::NIVissimTLSignalGroup::clearDict();
867
NIVissimTrafficDescription::clearDict();
868
NIVissimVehTypeClass::clearDict();
869
NIVissimVehicleType::clearDict();
870
NIVissimConnectionCluster::clearDict();
871
NIVissimEdge::clearDict();
872
NIVissimAbstractEdge::clearDict();
873
NIVissimConnection::clearDict();
874
NIVissimConflictArea::clearDict();
875
for (ToParserMap::iterator i = myParsers.begin(); i != myParsers.end(); i++) {
876
delete (*i).second;
877
}
878
}
879
880
881
void
882
NIImporter_Vissim::load(const OptionsCont& options) {
883
const std::string file = options.getString("vissim-file");
884
// try to open the file
885
std::ifstream strm(file.c_str());
886
if (!strm.good()) {
887
WRITE_ERRORF(TL("Could not open vissim-file '%'."), file);
888
return;
889
}
890
std::string token;
891
strm >> token;
892
if (StringUtils::endsWith(file, ".inpx") || StringUtils::endsWith(token, "<?xml") || StringUtils::endsWith(token, "<network")) {
893
// Create NIVissimXMLHandlers
894
NIVissimXMLHandler_Streckendefinition XMLHandler_Streckendefinition(elementData);
895
NIVissimXMLHandler_Zuflussdefinition XMLHandler_Zuflussdefinition;
896
//NIVissimXMLHandler_Parkplatzdefinition XMLHandler_Parkplatzdefinition;
897
NIVissimXMLHandler_Fahrzeugklassendefinition XMLHandler_Fahrzeugklassendefinition(elementData);
898
NIVissimXMLHandler_Geschwindigkeitsverteilungsdefinition XMLHandler_Geschwindigkeitsverteilung(elementData);
899
NIVissimXMLHandler_ConflictArea XMLHandler_ConflictAreas;
900
901
// Strecken + Verbinder
902
XMLHandler_Streckendefinition.setFileName(file);
903
PROGRESS_BEGIN_MESSAGE("Parsing strecken+verbinder from vissim-file '" + file + "'");
904
if (!XMLSubSys::runParser(XMLHandler_Streckendefinition, file)) {
905
return;
906
}
907
PROGRESS_DONE_MESSAGE();
908
909
// Zuflüsse
910
XMLHandler_Zuflussdefinition.setFileName(file);
911
PROGRESS_BEGIN_MESSAGE("Parsing zuflüsse from vissim-file '" + file + "'");
912
if (!XMLSubSys::runParser(XMLHandler_Zuflussdefinition, file)) {
913
return;
914
}
915
PROGRESS_DONE_MESSAGE();
916
917
//Geschwindigkeitsverteilungen
918
XMLHandler_Geschwindigkeitsverteilung.setFileName(file);
919
PROGRESS_BEGIN_MESSAGE("Parsing parkplätze from vissim-file '" + file + "'");
920
if (!XMLSubSys::runParser(XMLHandler_Geschwindigkeitsverteilung, file)) {
921
return;
922
}
923
PROGRESS_DONE_MESSAGE();
924
925
926
//Fahrzeugklassen
927
XMLHandler_Fahrzeugklassendefinition.setFileName(file);
928
PROGRESS_BEGIN_MESSAGE("Parsing parkplätze from vissim-file '" + file + "'");
929
if (!XMLSubSys::runParser(XMLHandler_Fahrzeugklassendefinition, file)) {
930
return;
931
}
932
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
XMLHandler_ConflictAreas.setFileName(file);
945
PROGRESS_BEGIN_MESSAGE("Parsing conflict areas from vissim-file '" + file + "'");
946
if (!XMLSubSys::runParser(XMLHandler_ConflictAreas, file)) {
947
return;
948
}
949
PROGRESS_DONE_MESSAGE();
950
} else {
951
strm.seekg(strm.beg);
952
if (!readContents(strm)) {
953
return;
954
}
955
}
956
postLoadBuild(options.getFloat("vissim.join-distance"));
957
}
958
959
960
bool
961
NIImporter_Vissim::admitContinue(const std::string& tag) {
962
ToElemIDMap::const_iterator i = myKnownElements.find(tag);
963
if (i == myKnownElements.end()) {
964
return true;
965
}
966
myLastSecure = tag;
967
return false;
968
}
969
970
971
bool
972
NIImporter_Vissim::readContents(std::istream& strm) {
973
// read contents
974
bool ok = true;
975
while (strm.good() && ok) {
976
std::string tag;
977
if (myLastSecure != "") {
978
tag = myLastSecure;
979
} else {
980
strm >> tag;
981
}
982
myLastSecure = "";
983
bool parsed = false;
984
while (!parsed && strm.good() && ok) {
985
ToElemIDMap::iterator i = myKnownElements.find(StringUtils::to_lower_case(tag));
986
if (i != myKnownElements.end()) {
987
ToParserMap::iterator j = myParsers.find((*i).second);
988
if (j != myParsers.end()) {
989
VissimSingleTypeParser* parser = (*j).second;
990
ok = parser->parse(strm);
991
parsed = true;
992
}
993
}
994
if (!parsed) {
995
std::string line;
996
std::streamoff pos;
997
do {
998
pos = strm.tellg();
999
getline(strm, line);
1000
} while (strm.good() && (line == "" || line[0] == ' ' || line[0] == '-'));
1001
if (!strm.good()) {
1002
return true;
1003
}
1004
strm.seekg(pos);
1005
strm >> tag;
1006
}
1007
}
1008
}
1009
return ok;
1010
}
1011
1012
1013
void
1014
NIImporter_Vissim::postLoadBuild(double offset) {
1015
// close the loading process
1016
NIVissimBoundedClusterObject::closeLoading();
1017
NIVissimConnection::dict_assignToEdges();
1018
NIVissimDisturbance::dict_SetDisturbances();
1019
// build district->connections map
1020
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
NIVissimEdge::buildConnectionClusters();
1035
// check whether further nodes (connection clusters by now) must be added
1036
NIVissimDistrictConnection::dict_CheckEdgeEnds();
1037
1038
// join clusters when overlapping (different streets are possible)
1039
NIVissimEdge::dict_checkEdges2Join();
1040
NIVissimConnectionCluster::joinBySameEdges(offset);
1041
// NIVissimConnectionCluster::joinByDisturbances(offset);
1042
1043
// NIVissimConnectionCluster::addTLs(offset);
1044
1045
// build nodes from clusters
1046
NIVissimNodeCluster::setCurrentVirtID(NIVissimNodeDef::getMaxID());
1047
NIVissimConnectionCluster::buildNodeClusters();
1048
1049
// NIVissimNodeCluster::dict_recheckEdgeChanges();
1050
NIVissimNodeCluster::buildNBNodes(myNetBuilder.getNodeCont());
1051
NIVissimDistrictConnection::dict_BuildDistrictNodes(
1052
myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont());
1053
NIVissimEdge::dict_propagateSpeeds();
1054
NIVissimEdge::dict_buildNBEdges(myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont(), myNetBuilder.getEdgeCont(), offset);
1055
if (OptionsCont::getOptions().getBool("vissim.report-unset-speeds")) {
1056
NIVissimEdge::reportUnsetSpeeds();
1057
}
1058
NIVissimDistrictConnection::dict_BuildDistricts(myNetBuilder.getDistrictCont(), myNetBuilder.getEdgeCont(), myNetBuilder.getNodeCont());
1059
NIVissimConnection::dict_buildNBEdgeConnections(myNetBuilder.getEdgeCont());
1060
NIVissimNodeCluster::dict_addDisturbances(myNetBuilder.getDistrictCont(), myNetBuilder.getNodeCont(), myNetBuilder.getEdgeCont());
1061
NIVissimConflictArea::setPriorityRegulation(myNetBuilder.getEdgeCont());
1062
NIVissimTL::dict_SetSignals(myNetBuilder.getTLLogicCont(), myNetBuilder.getEdgeCont());
1063
}
1064
1065
1066
void
1067
NIImporter_Vissim::insertKnownElements() {
1068
myKnownElements["kennung"] = VE_Kennungszeile;
1069
myKnownElements["zufallszahl"] = VE_Startzufallszahl;
1070
myKnownElements["simulationsdauer"] = VE_Simdauer;
1071
myKnownElements["startuhrzeit"] = VE_Startuhrzeit;
1072
myKnownElements["simulationsrate"] = VE_SimRate;
1073
myKnownElements["zeitschritt"] = VE_Zeitschrittfaktor;
1074
myKnownElements["linksverkehr"] = VE_Linksverkehr;
1075
myKnownElements["dynuml"] = VE_DynUml;
1076
myKnownElements["stau"] = VE_Stauparameterdefinition;
1077
myKnownElements["gelbverhalten"] = VE_Gelbverhaltendefinition;
1078
myKnownElements["strecke"] = VE_Streckendefinition;
1079
myKnownElements["verbindung"] = VE_Verbindungsdefinition;
1080
myKnownElements["richtungsentscheidung"] = VE_Richtungsentscheidungsdefinition;
1081
myKnownElements["routenentscheidung"] = VE_Routenentscheidungsdefinition;
1082
myKnownElements["vwunschentscheidung"] = VE_VWunschentscheidungsdefinition;
1083
myKnownElements["langsamfahrbereich"] = VE_Langsamfahrbereichdefinition;
1084
myKnownElements["zufluss"] = VE_Zuflussdefinition;
1085
myKnownElements["fahrzeugtyp"] = VE_Fahrzeugtypdefinition;
1086
myKnownElements["fahrzeugklasse"] = VE_Fahrzeugklassendefinition;
1087
myKnownElements["zusammensetzung"] = VE_Verkehrszusammensetzungsdefinition;
1088
myKnownElements["vwunsch"] = VE_Geschwindigkeitsverteilungsdefinition;
1089
myKnownElements["laengen"] = VE_Laengenverteilungsdefinition;
1090
myKnownElements["zeiten"] = VE_Zeitenverteilungsdefinition;
1091
myKnownElements["baujahre"] = VE_Baujahrverteilungsdefinition;
1092
myKnownElements["leistungen"] = VE_Laufleistungsverteilungsdefinition;
1093
myKnownElements["massen"] = VE_Massenverteilungsdefinition;
1094
myKnownElements["leistungen"] = VE_Leistungsverteilungsdefinition;
1095
myKnownElements["maxbeschleunigung"] = VE_Maxbeschleunigungskurvedefinition;
1096
myKnownElements["wunschbeschleunigung"] = VE_Wunschbeschleunigungskurvedefinition;
1097
myKnownElements["maxverzoegerung"] = VE_Maxverzoegerungskurvedefinition;
1098
myKnownElements["wunschverzoegerung"] = VE_Wunschverzoegerungskurvedefinition;
1099
myKnownElements["querverkehrsstoerung"] = VE_Querverkehrsstoerungsdefinition;
1100
myKnownElements["lsa"] = VE_Lichtsignalanlagendefinition;
1101
myKnownElements["signalgruppe"] = VE_Signalgruppendefinition;
1102
myKnownElements["signalgeber"] = VE_Signalgeberdefinition;
1103
myKnownElements["lsakopplung"] = VE_LSAKopplungdefinition;
1104
myKnownElements["detektor"] = VE_Detektorendefinition;
1105
myKnownElements["haltestelle"] = VE_Haltestellendefinition;
1106
myKnownElements["linie"] = VE_Liniendefinition;
1107
myKnownElements["stopschild"] = VE_Stopschilddefinition;
1108
myKnownElements["messung"] = VE_Messungsdefinition;
1109
myKnownElements["reisezeit"] = VE_Reisezeitmessungsdefinition;
1110
myKnownElements["verlustzeit"] = VE_Verlustzeitmessungsdefinition;
1111
myKnownElements["querschnittsmessung"] = VE_Querschnittsmessungsdefinition;
1112
myKnownElements["stauzaehler"] = VE_Stauzaehlerdefinition;
1113
myKnownElements["auswertung"] = VE_Auswertungsdefinition;
1114
myKnownElements["fenster"] = VE_Fensterdefinition;
1115
myKnownElements["motiv"] = VE_Gefahrenwarnsystemdefinition;
1116
myKnownElements["parkplatz"] = VE_Parkplatzdefinition;
1117
myKnownElements["knoten"] = VE_Knotendefinition;
1118
myKnownElements["teapac"] = VE_TEAPACdefinition;
1119
myKnownElements["netzobjekt"] = VE_Netzobjektdefinition;
1120
myKnownElements["richtungspfeil"] = VE_Richtungspfeildefinition;
1121
myKnownElements["raute"] = VE_Rautedefinition;
1122
myKnownElements["fahrverhalten"] = VE_Fahrverhaltendefinition;
1123
myKnownElements["fahrtverlaufdateien"] = VE_Fahrtverlaufdateien;
1124
myKnownElements["emission"] = VE_Emission;
1125
myKnownElements["einheit"] = VE_Einheitendefinition;
1126
myKnownElements["streckentyp"] = VE_Streckentypdefinition;
1127
myKnownElements["kantensperrung"] = VE_Kantensperrung;
1128
myKnownElements["kante"] = VE_Kantensperrung;
1129
1130
1131
myKnownElements["advance"] = VE_DUMMY;
1132
myKnownElements["temperatur"] = VE_DUMMY;
1133
1134
}
1135
1136
1137
1138
void
1139
NIImporter_Vissim::buildParsers() {
1140
myParsers[VE_Simdauer] =
1141
new NIVissimSingleTypeParser_Simdauer(*this);
1142
myParsers[VE_Startuhrzeit] =
1143
new NIVissimSingleTypeParser_Startuhrzeit(*this);
1144
myParsers[VE_DynUml] =
1145
new NIVissimSingleTypeParser_DynUml(*this);
1146
myParsers[VE_Streckendefinition] =
1147
new NIVissimSingleTypeParser_Streckendefinition(*this);
1148
myParsers[VE_Verbindungsdefinition] =
1149
new NIVissimSingleTypeParser_Verbindungsdefinition(*this);
1150
myParsers[VE_Richtungsentscheidungsdefinition] =
1151
new NIVissimSingleTypeParser_Richtungsentscheidungsdefinition(*this);
1152
myParsers[VE_Routenentscheidungsdefinition] =
1153
new NIVissimSingleTypeParser_Routenentscheidungsdefinition(*this);
1154
myParsers[VE_VWunschentscheidungsdefinition] =
1155
new NIVissimSingleTypeParser_VWunschentscheidungsdefinition(*this);
1156
myParsers[VE_Langsamfahrbereichdefinition] =
1157
new NIVissimSingleTypeParser_Langsamfahrbereichdefinition(*this);
1158
myParsers[VE_Zuflussdefinition] =
1159
new NIVissimSingleTypeParser_Zuflussdefinition(*this);
1160
myParsers[VE_Fahrzeugtypdefinition] =
1161
new NIVissimSingleTypeParser_Fahrzeugtypdefinition(*this, myColorMap);
1162
myParsers[VE_Fahrzeugklassendefinition] =
1163
new NIVissimSingleTypeParser_Fahrzeugklassendefinition(*this, myColorMap);
1164
myParsers[VE_Geschwindigkeitsverteilungsdefinition] =
1165
new NIVissimSingleTypeParser_Geschwindigkeitsverteilungsdefinition(*this);
1166
myParsers[VE_Laengenverteilungsdefinition] =
1167
new NIVissimSingleTypeParser_Laengenverteilungsdefinition(*this);
1168
myParsers[VE_Zeitenverteilungsdefinition] =
1169
new NIVissimSingleTypeParser_Zeitenverteilungsdefinition(*this);
1170
myParsers[VE_Querverkehrsstoerungsdefinition] =
1171
new NIVissimSingleTypeParser_Querverkehrsstoerungsdefinition(*this);
1172
myParsers[VE_Lichtsignalanlagendefinition] =
1173
new NIVissimSingleTypeParser_Lichtsignalanlagendefinition(*this);
1174
myParsers[VE_Signalgruppendefinition] =
1175
new NIVissimSingleTypeParser_Signalgruppendefinition(*this);
1176
myParsers[VE_Stopschilddefinition] =
1177
new NIVissimSingleTypeParser_Stopschilddefinition(*this);
1178
myParsers[VE_Knotendefinition] =
1179
new NIVissimSingleTypeParser_Knotendefinition(*this);
1180
myParsers[VE_Signalgeberdefinition] =
1181
new NIVissimSingleTypeParser_Signalgeberdefinition(*this);
1182
myParsers[VE_Detektorendefinition] =
1183
new NIVissimSingleTypeParser_Detektordefinition(*this);
1184
myParsers[VE_Haltestellendefinition] =
1185
new NIVissimSingleTypeParser_Haltestellendefinition(*this);
1186
myParsers[VE_Liniendefinition] =
1187
new NIVissimSingleTypeParser_Liniendefinition(*this);
1188
myParsers[VE_Reisezeitmessungsdefinition] =
1189
new NIVissimSingleTypeParser_Reisezeitmessungsdefinition(*this);
1190
myParsers[VE_Querschnittsmessungsdefinition] =
1191
new NIVissimSingleTypeParser_Querschnittsmessungsdefinition(*this);
1192
myParsers[VE_Messungsdefinition] =
1193
new NIVissimSingleTypeParser_Messungsdefinition(*this);
1194
myParsers[VE_Verlustzeitmessungsdefinition] =
1195
new NIVissimSingleTypeParser_Verlustzeitmessungsdefinition(*this);
1196
myParsers[VE_Stauzaehlerdefinition] =
1197
new NIVissimSingleTypeParser_Stauzaehlerdefinition(*this);
1198
myParsers[VE_Rautedefinition] =
1199
new NIVissimSingleTypeParser_Rautedefinition(*this);
1200
myParsers[VE_Richtungspfeildefinition] =
1201
new NIVissimSingleTypeParser_Richtungspfeildefinition(*this);
1202
myParsers[VE_Parkplatzdefinition] =
1203
new NIVissimSingleTypeParser_Parkplatzdefinition(*this);
1204
myParsers[VE_Fahrverhaltendefinition] =
1205
new NIVissimSingleTypeParser_Fahrverhaltendefinition(*this);
1206
myParsers[VE_Streckentypdefinition] =
1207
new NIVissimSingleTypeParser_Streckentypdefinition(*this);
1208
myParsers[VE_Kennungszeile] =
1209
new NIVissimSingleTypeParser_Kennungszeile(*this);
1210
myParsers[VE_Fensterdefinition] =
1211
new NIVissimSingleTypeParser_Fensterdefinition(*this);
1212
myParsers[VE_Auswertungsdefinition] =
1213
new NIVissimSingleTypeParser_Auswertungsdefinition(*this);
1214
myParsers[VE_Verkehrszusammensetzungsdefinition] =
1215
new NIVissimSingleTypeParser_Zusammensetzungsdefinition(*this);
1216
myParsers[VE_Kantensperrung] =
1217
new NIVissimSingleTypeParser_Kantensperrung(*this);
1218
1219
myParsers[VE_Startzufallszahl] =
1220
new NIVissimSingleTypeParser_Startzufallszahl(*this);
1221
myParsers[VE_SimRate] =
1222
new NIVissimSingleTypeParser_SimRate(*this);
1223
myParsers[VE_Zeitschrittfaktor] =
1224
new NIVissimSingleTypeParser_Zeitschrittfaktor(*this);
1225
myParsers[VE_Linksverkehr] =
1226
new NIVissimSingleTypeParser_Linksverkehr(*this);
1227
myParsers[VE_Stauparameterdefinition] =
1228
new NIVissimSingleTypeParser_Stauparameterdefinition(*this);
1229
myParsers[VE_Gelbverhaltendefinition] =
1230
new NIVissimSingleTypeParser_Gelbverhaltendefinition(*this);
1231
myParsers[VE_LSAKopplungdefinition] =
1232
new NIVissimSingleTypeParser_LSAKopplungsdefinition(*this);
1233
myParsers[VE_Gefahrenwarnsystemdefinition] =
1234
new NIVissimSingleTypeParser_Gefahrwarnungsdefinition(*this);
1235
myParsers[VE_TEAPACdefinition] =
1236
new NIVissimSingleTypeParser_TEAPACDefinition(*this);
1237
myParsers[VE_Netzobjektdefinition] =
1238
new NIVissimSingleTypeParser_Netzobjektdefinition(*this);
1239
myParsers[VE_Fahrtverlaufdateien] =
1240
new NIVissimSingleTypeParser_Fahrtverlaufdateien(*this);
1241
myParsers[VE_Emission] =
1242
new NIVissimSingleTypeParser_Emission(*this);
1243
myParsers[VE_Einheitendefinition] =
1244
new NIVissimSingleTypeParser_Einheitendefinition(*this);
1245
myParsers[VE_Baujahrverteilungsdefinition] =
1246
new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);
1247
myParsers[VE_Laufleistungsverteilungsdefinition] =
1248
new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);
1249
myParsers[VE_Massenverteilungsdefinition] =
1250
new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);
1251
myParsers[VE_Leistungsverteilungsdefinition] =
1252
new NIVissimSingleTypeParser__XVerteilungsdefinition(*this);
1253
myParsers[VE_Maxbeschleunigungskurvedefinition] =
1254
new NIVissimSingleTypeParser__XKurvedefinition(*this);
1255
myParsers[VE_Wunschbeschleunigungskurvedefinition] =
1256
new NIVissimSingleTypeParser__XKurvedefinition(*this);
1257
myParsers[VE_Maxverzoegerungskurvedefinition] =
1258
new NIVissimSingleTypeParser__XKurvedefinition(*this);
1259
myParsers[VE_Wunschverzoegerungskurvedefinition] =
1260
new NIVissimSingleTypeParser__XKurvedefinition(*this);
1261
1262
}
1263
1264
1265
/****************************************************************************/
1266
1267