Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netload/NLHandler.h
169666 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 NLHandler.h
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Clemens Honomichl
18
/// @author Michael Behrisch
19
/// @date Sept 2002
20
///
21
// The XML-Handler for network loading
22
/****************************************************************************/
23
#pragma once
24
#include <config.h>
25
26
#include <utils/geom/Boundary.h>
27
#include <utils/shapes/ShapeHandler.h>
28
#include <microsim/MSRouteHandler.h>
29
#include "NLDiscreteEventBuilder.h"
30
31
32
// ===========================================================================
33
// class declarations
34
// ===========================================================================
35
class NLContainer;
36
class NLDetectorBuilder;
37
class NLEdgeControlBuilder;
38
class NLJunctionControlBuilder;
39
class NLTriggerBuilder;
40
class MSTrafficLightLogic;
41
class MSRailSignal;
42
43
44
// ===========================================================================
45
// class definitions
46
// ===========================================================================
47
48
49
/**
50
* @class NLShapeHandler
51
* @brief The XML-Handler for shapes loading network loading
52
*
53
* This subclasses ShapeHandler with MSLane specific function
54
*/
55
class NLShapeHandler : public ShapeHandler {
56
public:
57
NLShapeHandler(const std::string& file, ShapeContainer& sc) :
58
ShapeHandler(file, sc) {}
59
60
/// @brief Destructor
61
virtual ~NLShapeHandler() {}
62
63
Position getLanePos(const std::string& poiID, const std::string& laneID, double lanePos, bool friendlyPos, double lanePosLat);
64
65
virtual bool addLanePosParams() {
66
return true;
67
}
68
};
69
70
71
/**
72
* @class NLHandler
73
* @brief The XML-Handler for network loading
74
*
75
* The SAX2-handler responsible for parsing networks and routes to load.
76
* This is an extension of the MSRouteHandler as routes and vehicles may also
77
* be loaded from network descriptions.
78
*/
79
class NLHandler : public MSRouteHandler {
80
public:
81
/// @brief Definition of a lane vector
82
typedef std::vector<MSLane*> LaneVector;
83
84
public:
85
/** @brief Constructor
86
*
87
* @param[in] file Name of the parsed file
88
* @param[in, out] net The network to fill
89
* @param[in] detBuilder The detector builder to use
90
* @param[in] triggerBuilder The trigger builder to use
91
* @param[in] edgeBuilder The builder of edges to use
92
* @param[in] junctionBuilder The builder of junctions to use
93
*/
94
NLHandler(const std::string& file, MSNet& net,
95
NLDetectorBuilder& detBuilder, NLTriggerBuilder& triggerBuilder,
96
NLEdgeControlBuilder& edgeBuilder,
97
NLJunctionControlBuilder& junctionBuilder);
98
99
100
/// @brief Destructor
101
virtual ~NLHandler();
102
103
bool haveSeenInternalEdge() const {
104
return myHaveSeenInternalEdge;
105
}
106
107
bool hasJunctionHigherSpeeds() const {
108
return myHaveJunctionHigherSpeeds;
109
}
110
111
bool haveSeenDefaultLength() const {
112
return myHaveSeenDefaultLength;
113
}
114
115
bool haveSeenNeighs() const {
116
return myHaveSeenNeighs;
117
}
118
119
bool haveSeenAdditionalSpeedRestrictions() const {
120
return myHaveSeenAdditionalSpeedRestrictions;
121
}
122
123
bool haveSeenMesoEdgeType() const {
124
return myHaveSeenMesoEdgeType;
125
}
126
127
bool haveSeenTLSParams() const {
128
return myHaveSeenTLSParams;
129
}
130
131
MMVersion networkVersion() const {
132
return myNetworkVersion;
133
}
134
135
static Parameterised* addPredecessorConstraint(int element, const SUMOSAXAttributes& attrs, MSRailSignal* rs);
136
137
protected:
138
/// @name inherited from GenericSAXHandler
139
//@{
140
141
/** @brief Called on the opening of a tag;
142
*
143
* @param[in] element ID of the currently opened element
144
* @param[in] attrs Attributes within the currently opened element
145
* @exception ProcessError If something fails
146
* @see GenericSAXHandler::myStartElement
147
* @todo Refactor/describe
148
*/
149
virtual void myStartElement(int element,
150
const SUMOSAXAttributes& attrs);
151
152
153
/** @brief Called when a closing tag occurs
154
*
155
* @param[in] element ID of the currently opened element
156
* @exception ProcessError If something fails
157
* @see GenericSAXHandler::myEndElement
158
* @todo Refactor/describe
159
*/
160
virtual void myEndElement(int element);
161
//@}
162
163
164
protected:
165
void addParam(const SUMOSAXAttributes& attrs);
166
167
/** @brief Builds an e1 detector using the given specification
168
* @param[in] attrs The attributes that define the detector
169
*/
170
virtual void addE1Detector(const SUMOSAXAttributes& attrs);
171
172
/** @brief Builds an e1 detector using the given specification
173
* @param[in] attrs The attributes that define the detector
174
*/
175
virtual void addInstantE1Detector(const SUMOSAXAttributes& attrs);
176
177
/** @brief Builds an e2 detector using the given specification
178
* @param[in] attrs The attributes that define the detector
179
*/
180
virtual void addE2Detector(const SUMOSAXAttributes& attrs);
181
182
/** @brief Starts building of an e3 detector using the given specification
183
* @param[in] attrs The attributes that define the detector
184
*/
185
void beginE3Detector(const SUMOSAXAttributes& attrs);
186
187
/** @brief Adds an entry to the currently processed e3 detector
188
* @param[in] attrs The attributes that define the entry
189
*/
190
void addE3Entry(const SUMOSAXAttributes& attrs);
191
192
/** @brief Adds an exit to the currently processed e3 detector
193
* @param[in] attrs The attributes that define the exit
194
*/
195
void addE3Exit(const SUMOSAXAttributes& attrs);
196
197
/// Builds of an e3 detector using collected values
198
virtual void endE3Detector();
199
200
/** @brief Builds a vtype-detector using the given specification
201
* @param[in] attrs The attributes that define the detector
202
*/
203
virtual void addVTypeProbeDetector(const SUMOSAXAttributes& attrs);
204
205
/** @brief Builds a routeProbe-detector using the given specification
206
* @param[in] attrs The attributes that define the detector
207
*/
208
virtual void addRouteProbeDetector(const SUMOSAXAttributes& attrs);
209
210
/** @brief Builds edge or lane base mean data collector using the given specification
211
* @param[in] attrs The attributes that define the detector
212
* @param[in] objecttype The type (lane/edge) of the parsed mean data definition
213
*/
214
virtual void addEdgeLaneMeanData(const SUMOSAXAttributes& attrs, int objecttype);
215
216
/** @brief Loads edge type specific meso parameters
217
* @param[in] attrs The attributes that hold the parameters
218
*/
219
virtual void addMesoEdgeType(const SUMOSAXAttributes& attrs);
220
221
/** @brief Loads deadlock information for preparing additional rail signal checks
222
* @param[in] attrs The attributes that hold the parameters
223
*/
224
virtual void addDeadlock(const SUMOSAXAttributes& attrs);
225
226
/// Closes the process of building an edge
227
virtual void closeEdge();
228
229
private:
230
/// begins the processing of an edge
231
void beginEdgeParsing(const SUMOSAXAttributes& attrs);
232
233
/// adds a lane to the previously opened edge
234
void addLane(const SUMOSAXAttributes& attrs);
235
236
/// adds a request item to the current junction logic
237
void addRequest(const SUMOSAXAttributes& attrs);
238
239
/// begins the reading of a junction row logic
240
void initJunctionLogic(const SUMOSAXAttributes& attrs);
241
242
/// begins the reading of a traffic lights logic
243
void initTrafficLightLogic(const SUMOSAXAttributes& attrs);
244
245
/// adds a phase to the traffic lights logic currently build
246
void addPhase(const SUMOSAXAttributes& attrs);
247
248
/// adds a switching condition to the traffic lights logic currently build
249
void addCondition(const SUMOSAXAttributes& attrs);
250
251
/// adds a switching condition assignment to the traffic lights logic currently build
252
void addAssignment(const SUMOSAXAttributes& attrs);
253
254
/// adds a switching condition function to the traffic lights logic currently build
255
void addFunction(const SUMOSAXAttributes& attrs);
256
257
/// adds a switching condition function to the traffic lights logic currently build
258
void closeFunction();
259
260
/// opens a junction for processing
261
virtual void openJunction(const SUMOSAXAttributes& attrs);
262
263
void parseLanes(const std::string& junctionID, const std::string& def, std::vector<MSLane*>& into, bool& ok);
264
265
/// adds a connection
266
void addConnection(const SUMOSAXAttributes& attrs);
267
268
void addConflict(const SUMOSAXAttributes& attrs);
269
270
virtual void openWAUT(const SUMOSAXAttributes& attrs);
271
void addWAUTSwitch(const SUMOSAXAttributes& attrs);
272
void addWAUTJunction(const SUMOSAXAttributes& attrs);
273
274
/// Parses network location description
275
void setLocation(const SUMOSAXAttributes& attrs);
276
277
/** @begin Parses a district and creates a pseudo edge for it
278
*
279
* Called on the occurrence of a "district" element, this method
280
* retrieves the id of the district and creates a district type
281
* edge with this id.
282
*
283
* @param[in] attrs The attributes (of the "district"-element) to parse
284
* @exception ProcessError If an edge given in district@edges is not known
285
*/
286
void addDistrict(const SUMOSAXAttributes& attrs);
287
288
289
/** @begin Parses a district edge and connects it to the district
290
*
291
* Called on the occurrence of a "dsource" or "dsink" element, this method
292
* retrieves the id of the approachable edge. If this edge is known
293
* and valid, the approaching edge is informed about it.
294
*
295
* @param[in] attrs The attributes to parse
296
* @param[in] isSource whether a "dsource or a "dsink" was given
297
* @todo No exception?
298
*/
299
void addDistrictEdge(const SUMOSAXAttributes& attrs, bool isSource);
300
301
/** @begin Parses a roundabout and sets flags for the edges
302
* @param[in] attrs The attributes to parse
303
*/
304
void addRoundabout(const SUMOSAXAttributes& attrs);
305
306
307
void closeWAUT();
308
309
/// @brief Parses the given character into an enumeration typed link direction
310
LinkDirection parseLinkDir(const std::string& dir);
311
312
/// @brief Parses the given character into an enumeration typed link state
313
LinkState parseLinkState(const std::string& state);
314
315
protected:
316
/// @brief The net to fill (preinitialised)
317
MSNet& myNet;
318
319
/// @brief A builder for object actions
320
NLDiscreteEventBuilder myActionBuilder;
321
322
/// @brief Information whether the currently parsed edge is internal and not wished, here
323
bool myCurrentIsInternalToSkip;
324
325
326
/// @brief The detector builder to use
327
NLDetectorBuilder& myDetectorBuilder;
328
329
/// @brief The trigger builder to use
330
NLTriggerBuilder& myTriggerBuilder;
331
332
/// @brief The edge builder to use
333
NLEdgeControlBuilder& myEdgeControlBuilder;
334
335
/// @brief The junction builder to use
336
NLJunctionControlBuilder& myJunctionControlBuilder;
337
338
/// The id of the current district
339
std::string myCurrentDistrictID;
340
341
/// internal information whether a tls-logic is currently read
342
bool myAmParsingTLLogicOrJunction;
343
344
/// The id of the currently processed WAUT
345
std::string myCurrentWAUTID;
346
347
/// The id of the currently processed edge type
348
std::string myCurrentTypeID;
349
350
/// The network offset
351
Position myNetworkOffset;
352
353
/// The network's boundaries
354
Boundary myOrigBoundary, myConvBoundary;
355
356
bool myCurrentIsBroken;
357
358
bool myHaveWarnedAboutInvalidTLType;
359
360
Parameterised myLastEdgeParameters;
361
std::vector<Parameterised*> myLastParameterised;
362
363
/// @brief whether the loaded network contains internal lanes
364
bool myHaveSeenInternalEdge;
365
366
/// @brief Whether the network was built with higher speed on junctions
367
bool myHaveJunctionHigherSpeeds;
368
369
/// @brief whether the loaded network contains edges with default lengths
370
bool myHaveSeenDefaultLength;
371
372
/// @brief whether the loaded network contains explicit neighbor lanes
373
bool myHaveSeenNeighs;
374
375
/// @brief whether additional files contained type-specific speed limits
376
bool myHaveSeenAdditionalSpeedRestrictions;
377
378
/// @brief whether edge type specific meso parameters were loaded
379
bool myHaveSeenMesoEdgeType;
380
/// @brief whether tls params were loaded
381
bool myHaveSeenTLSParams;
382
383
/// @brief the loaded network version
384
MMVersion myNetworkVersion;
385
386
/// @brief whether the location element was already loadee
387
bool myNetIsLoaded;
388
389
/// @brief rail signal for which constraints are being loaded
390
MSRailSignal* myConstrainedSignal;
391
392
/// @brief the link element for the connection currently being parsed
393
MSLink* myCurrentLink = nullptr;
394
395
/// @brief temporary data for building the junction graph after network parsing is finished
396
typedef std::map<std::string, std::pair<std::string, std::string> > JunctionGraph;
397
JunctionGraph myJunctionGraph;
398
399
int myPreviousEdgeIdx = 0;
400
401
private:
402
/** invalid copy constructor */
403
NLHandler(const NLHandler& s);
404
405
/** invalid assignment operator */
406
NLHandler& operator=(const NLHandler& s);
407
408
};
409
410