Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netimport/NIXMLEdgesHandler.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 NIXMLEdgesHandler.h
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @author Leonhard Luecken
19
/// @date Tue, 20 Nov 2001
20
///
21
// Importer for network edges stored in XML
22
/****************************************************************************/
23
#pragma once
24
#include <config.h>
25
26
#include <utils/common/SUMOVehicleClass.h>
27
#include <utils/geom/PositionVector.h>
28
#include <utils/xml/SUMOSAXHandler.h>
29
#include <netbuild/NBEdge.h>
30
#include <netbuild/NBEdgeCont.h>
31
32
33
// ===========================================================================
34
// class declarations
35
// ===========================================================================
36
class OptionsCont;
37
class NBNode;
38
class NBEdge;
39
class NBNodeCont;
40
class NBTypeCont;
41
class NBDistrictCont;
42
class NBTrafficLightLogicCont;
43
44
// ===========================================================================
45
// class definitions
46
// ===========================================================================
47
/**
48
* @class NIXMLEdgesHandler
49
* @brief Importer for network edges stored in XML
50
*
51
* This SAX-handler parses edge information and stores it in the given
52
* container.
53
* @todo revalidate node retrieval
54
* @todo One day, one should rethink the order of parsing. Now, the handler
55
* is able to load edges, using information from the types, first, and extending
56
* them by given information. In addition, if the read edge is already known,
57
* its values are also used. Then, defining vehicles allowed per lane, and
58
* additional edge split definitions add some further complexity. This all
59
* works somehow for most of our use cases, but it's definitely not as consistent
60
* that everything what seems to be possible would also work appropriately.
61
*/
62
class NIXMLEdgesHandler : public SUMOSAXHandler {
63
public:
64
/** @brief Constructor
65
* @param[in] nc The nodes container (for retrieval of referenced nodes)
66
* @param[in] ec The edges container (for insertion of build edges)
67
* @param[in] tc The types container (for retrieval of type defaults)
68
* @param[in] dc The districts container (needed if an edge must be split)
69
* @param[in] options The options to use while building edges
70
*/
71
NIXMLEdgesHandler(NBNodeCont& nc, NBEdgeCont& ec,
72
NBTypeCont& tc, NBDistrictCont& dc,
73
NBTrafficLightLogicCont& tlc,
74
OptionsCont& options);
75
76
77
/// @brief Destructor
78
~NIXMLEdgesHandler();
79
80
protected:
81
/// @name inherited from GenericSAXHandler
82
//@{
83
84
/** @brief Called on the opening of a tag;
85
*
86
* @param[in] element ID of the currently opened element
87
* @param[in] attrs Attributes within the currently opened element
88
* @exception ProcessError If something fails
89
* @see GenericSAXHandler::myStartElement
90
*/
91
void myStartElement(int element,
92
const SUMOSAXAttributes& attrs);
93
94
95
/** @brief Called when a closing tag occurs
96
*
97
* @param[in] element ID of the currently opened element
98
* @exception ProcessError If something fails
99
* @see GenericSAXHandler::myEndElement
100
*/
101
void myEndElement(int element);
102
//@}
103
104
105
private:
106
/** @brief Tries to parse the shape definition
107
*
108
* Returns the edge's geometry (may be empty if no one was defined).
109
* Writes an error message if an error occurred.
110
* @param[in] attrs The attributes to read the shape from
111
* @return The edge's shape
112
*/
113
PositionVector tryGetShape(const SUMOSAXAttributes& attrs);
114
115
116
/** @brief Tries to parse the spread type
117
*/
118
LaneSpreadFunction tryGetLaneSpread(const SUMOSAXAttributes& attrs);
119
120
121
/** @brief Sets from/to node information of the currently parsed edge
122
*
123
* If the nodes could be retrieved/built, they are set in myFromNode/myToNode,
124
* respectively, and true is returned. If not, false is returned.
125
* @param[in] attrs The SAX-attributes to parse the nodes from
126
* @return Whether valid nodes exist
127
*/
128
bool setNodes(const SUMOSAXAttributes& attrs);
129
130
131
private:
132
/// @brief A reference to the program's options
133
OptionsCont& myOptions;
134
135
136
/// @name Currently parsed edge's values
137
/// @{
138
139
/// @brief The current edge's id
140
std::string myCurrentID;
141
142
/// @brief The current edge's maximum speed
143
double myCurrentSpeed;
144
145
/// @brief The current edge's friction
146
double myCurrentFriction;
147
148
/// @brief The current edge's priority
149
int myCurrentPriority;
150
151
/// @brief The current edge's number of lanes
152
int myCurrentLaneNo;
153
154
/// @brief The current edge's lane width
155
double myCurrentWidth;
156
157
/// @brief The current edge's offset till the destination node
158
double myCurrentEndOffset;
159
160
/// @brief The current edge's street name
161
std::string myCurrentStreetName;
162
163
/// @brief The current edge's type
164
std::string myCurrentType;
165
166
/// @brief The nodes the edge starts and ends at
167
NBNode* myFromNode, *myToNode;
168
169
/// @brief The current edge's length
170
double myLength;
171
172
/// @brief The shape of the edge
173
PositionVector myShape;
174
175
/// @brief Information about how to spread the lanes
176
LaneSpreadFunction myLanesSpread;
177
178
/// @brief Information about lane permissions
179
SVCPermissions myPermissions;
180
181
/// @brief Whether the edge shape shall be kept at reinitilization
182
bool myReinitKeepEdgeShape;
183
184
/// @brief The width of the sidewalk that shall be added to the current edge
185
double mySidewalkWidth;
186
187
/// @brief The width of the bike lane that shall be added to the current edge
188
double myBikeLaneWidth;
189
190
/// @}
191
192
193
/// @brief Whether this edge definition is an update of a previously inserted edge
194
bool myIsUpdate;
195
196
197
/// @name Used instance containers (access to nodes, edges, types, etc.)
198
/// @{
199
200
/// @brief The nodes container (for retrieval of referenced nodes)
201
NBNodeCont& myNodeCont;
202
203
/// @brief The edges container (for insertion of build edges)
204
NBEdgeCont& myEdgeCont;
205
206
/// @brief The types container (for retrieval of type defaults)
207
NBTypeCont& myTypeCont;
208
209
/// @brief The districts container (needed if an edge must be split)
210
NBDistrictCont& myDistrictCont;
211
212
/** @brief The traffic lights container to add built tls to (when
213
* invalidating tls because of splits) */
214
NBTrafficLightLogicCont& myTLLogicCont;
215
/// @}
216
217
218
/// @brief The currently processed edge
219
NBEdge* myCurrentEdge;
220
221
/// @brief The currently processed lane index
222
int myCurrentLaneIndex;
223
224
/// @brief The list of this edge's splits
225
std::vector<NBEdgeCont::Split> mySplits;
226
227
/** @class split_by_pos_finder
228
* @brief Finds a split at the given position
229
*/
230
class split_by_pos_finder {
231
public:
232
/// @brief Constructor
233
explicit split_by_pos_finder(double pos)
234
: myPosition(pos) { }
235
236
/// @brief Comparing operator
237
bool operator()(const NBEdgeCont::Split& e) {
238
return e.pos == myPosition;
239
}
240
241
private:
242
/// @brief The position to search for
243
double myPosition;
244
245
};
246
247
248
/// @brief Information whether at least one edge's attributes were overwritten
249
bool myHaveReportedAboutOverwriting;
250
251
/// @brief Information whether at least one edge's type was changed
252
bool myHaveReportedAboutTypeOverride;
253
254
bool myHaveWarnedAboutDeprecatedLaneId;
255
256
/// @brief Whether the edge shape shall be kept generally
257
const bool myKeepEdgeShape;
258
259
/// @brief element to receive parameters
260
std::vector<Parameterised*> myLastParameterised;
261
262
/// @brief The coordinate transformation which was used compute the node coordinates
263
GeoConvHelper* myLocation = nullptr;
264
265
private:
266
267
/** @brief Parses an edge and stores the values in "myCurrentEdge"
268
* @param[in] attrs The attributes to get the edge's values from
269
*/
270
void addEdge(const SUMOSAXAttributes& attrs);
271
272
/** @brief parses delete tag and deletes the specified edge or lane
273
* @param[in] attrs The attributes to get the edge id and the optional lane index from
274
*/
275
void deleteEdge(const SUMOSAXAttributes& attrs);
276
277
/** @brief Parses a lane and modifies myCurrentEdge according to the given
278
* attribures
279
* @param[in] attrs The attributes to get the lanes's values from
280
*/
281
void addLane(const SUMOSAXAttributes& attrs);
282
283
/** @brief Parses a split and stores it in mySplits. Splits are executed Upon reading the end
284
* tag of an edge
285
* @param[in] attrs The attributes to get the splits's values from
286
*/
287
void addSplit(const SUMOSAXAttributes& attrs);
288
289
/** @brief Parses a roundabout and stores it in myEdgeCont.
290
* @param[in] attrs The attributes to get the roundabouts values from
291
*/
292
void addRoundabout(const SUMOSAXAttributes& attrs);
293
294
295
private:
296
/** @brief invalid copy constructor */
297
NIXMLEdgesHandler(const NIXMLEdgesHandler& s);
298
299
/** @brief invalid assignment operator */
300
NIXMLEdgesHandler& operator=(const NIXMLEdgesHandler& s);
301
302
};
303
304