Eclipse SUMO - Simulation of Urban MObility
GNEEdge.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3// Copyright (C) 2001-2022 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/****************************************************************************/
18// A road/street connecting two junctions (netedit-version, adapted from GUIEdge)
19// Basically a container for an NBEdge with drawing and editing capabilities
20/****************************************************************************/
21#pragma once
22#include <config.h>
23
24#include <netbuild/NBEdge.h>
28
29#include "GNENetworkElement.h"
30
31
32// ===========================================================================
33// class declarations
34// ===========================================================================
35class GNENet;
36class GNEJunction;
37class GNELane;
38class GNEConnection;
39class GNERouteProbe;
40class GNECrossing;
41class GNEEdgeType;
42class GNEEdgeTemplate;
43
44// ===========================================================================
45// class definitions
46// ===========================================================================
54
56 friend class GNEChange_Lane;
58
59public:
61 typedef std::vector<GNELane*> LaneVector;
62
64 typedef std::vector<GNEConnection*> ConnectionVector;
65
71 GNEEdge(GNENet* net, NBEdge* nbe, bool wasSplit = false, bool loaded = false);
72
74 ~GNEEdge();
75
77 inline GNEJunction* getFromJunction() const {
78 return getParentJunctions().front();
79 }
80
82 inline GNEJunction* getToJunction() const {
83 return getParentJunctions().back();
84 }
85
87 bool isNetworkElementValid() const;
88
90 std::string getNetworkElementProblem() const;
91
95 void updateGeometry();
96
100
105
107 void removeGeometryPoint(const Position clickedPosition, GNEUndoList* undoList);
109
113 bool hasCustomEndPoints() const;
114
116 bool clickedOverShapeStart(const Position& pos) const;
117
119 bool clickedOverShapeEnd(const Position& pos) const;
120
122 bool clickedOverGeometryPoint(const Position& pos) const;
124
126 void updateJunctionPosition(GNEJunction* junction, const Position& origPos);
127
130
138
140 double getExaggeration(const GUIVisualizationSettings& s) const;
141
143 void updateCenteringBoundary(const bool updateGrid);
144
146 const std::string getOptionalName() const;
147
152 void drawGL(const GUIVisualizationSettings& s) const;
153
155 void deleteGLObject();
156
158 void updateGLObject();
159
161
163 NBEdge* getNBEdge() const;
164
166 std::vector<GNEEdge*> getOppositeEdges() const;
167
169 void editEndpoint(Position pos, GNEUndoList* undoList);
170
172 void resetEndpoint(const Position& pos, GNEUndoList* undoList);
173
175 void resetBothEndpoint(GNEUndoList* undoList);
176
179 /* @brief method for getting the Attribute of an XML key
180 * @param[in] key The attribute key
181 * @return string with the value associated to key
182 */
183 std::string getAttribute(SumoXMLAttr key) const;
184 std::string getAttributeForSelection(SumoXMLAttr key) const;
185
186 /* @brief method for setting the attribute and letting the object perform additional changes
187 * @param[in] key The attribute key
188 * @param[in] value The new value
189 * @param[in] undoList The undoList on which to register changes
190 */
191 void setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList);
192
193 /* @brief method for setting the attribute and letting the object perform additional changes
194 * @param[in] key The attribute key
195 * @param[in] value The new value
196 * @param[in] undoList The undoList on which to register changes
197 */
198 bool isValid(SumoXMLAttr key, const std::string& value);
199
200 /* @brief method for check if the value for certain attribute is set
201 * @param[in] key The attribute key
202 */
203 bool isAttributeEnabled(SumoXMLAttr key) const;
204
205 /* @brief method for check if the value for certain attribute is computed (for example, due a network recomputing)
206 * @param[in] key The attribute key
207 */
208 bool isAttributeComputed(SumoXMLAttr key) const;
209
211
214
216 void setResponsible(bool newVal);
217
222 void setGeometry(PositionVector geom, bool inner);
223
225 const Position getFrontUpShapePosition() const;
226
229
231 const Position getBackUpShapePosition() const;
232
235
237 void remakeGNEConnections(bool junctionsReady = false);
238
240 void copyTemplate(const GNEEdgeTemplate* edgeTemplate, GNEUndoList* undoList);
241
243 void copyEdgeType(const GNEEdgeType* edgeType, GNEUndoList* undoList);
244
246 std::set<GUIGlID> getLaneGlIDs() const;
247
249 const std::vector<GNELane*>& getLanes() const;
250
252 const std::vector<GNEConnection*>& getGNEConnections() const;
253
255 GNEConnection* retrieveGNEConnection(int fromLane, NBEdge* to, int toLane, bool createIfNoExist = true);
256
258 bool wasSplit();
259
260 /* @brief compute a splitting position which keeps the resulting edges
261 * straight unless the user clicked near a geometry point */
262 Position getSplitPos(const Position& clickPos);
263
265 void setMicrosimID(const std::string& newID);
266
268 bool hasRestrictedLane(SUMOVehicleClass vclass) const;
269
270 // @brief the radius in which to register clicks for geometry nodes
271 static const double SNAP_RADIUS;
272
273 // @brief the radius in which to register clicks for geometry nodes (Squared)
274 static const double SNAP_RADIUS_SQUARED;
275
277 void clearGNEConnections();
278
280 int getRouteProbeRelativePosition(GNERouteProbe* routeProbe) const;
281
283 std::vector<GNECrossing*> getGNECrossings();
284
286 void smooth(GNEUndoList* undoList);
287
289 void straightenElevation(GNEUndoList* undoList);
290
292 void smoothElevation(GNEUndoList* undoList);
293
295 PositionVector smoothShape(const PositionVector& shape, bool forElevation);
296
299
302
303 // @brief update vehicle spread geometries
305
306 // @brief update vehicle geometries
308
310 void drawEdgeGeometryPoints(const GUIVisualizationSettings& s, const GNELane* lane) const;
311
314 const bool drawFrontExtreme, const bool drawBackExtreme, const double exaggeration = 1);
315
317 bool isConvexAngle() const;
318
320 bool hasPredecessors() const;
321
323 bool hasSuccessors() const;
324
326 GNEEdge* getReverseEdge() const;
327
328protected:
331
334
337
340
343
346
349
350private:
352 class StackPosition : public std::pair<double, double> {
353
354 public:
356 StackPosition(const double departPos, const double length);
357
359 double beginPosition() const;
360
362 double endPosition() const;
363 };
364
366 class StackDemandElements : public std::pair<StackPosition, std::vector<GNEDemandElement*> > {
367
368 public:
370 StackDemandElements(const StackPosition stackedPosition, GNEDemandElement* demandElement);
371
373 void addDemandElements(GNEDemandElement* demandElement);
374
376 const StackPosition& getStackPosition() const;
377
379 const std::vector<GNEDemandElement*>& getDemandElements() const;
380 };
381
384
386 void setAttribute(SumoXMLAttr key, const std::string& value);
387
389 void setMoveShape(const GNEMoveResult& moveResult);
390
392 void commitMoveShape(const GNEMoveResult& moveResult, GNEUndoList* undoList);
393
400 void setNumLanes(int numLanes, GNEUndoList* undoList);
401
403 void updateFirstParentJunction(const std::string& value);
404
406 void updateSecondParentJunction(const std::string& value);
407
409 void addLane(GNELane* lane, const NBEdge::Lane& laneAttrs, bool recomputeConnections);
410
412 void removeLane(GNELane* lane, bool recomputeConnections);
413
415 void addConnection(NBEdge::Connection nbCon, bool selectAfterCreation = false);
416
419
421 void removeEdgeFromCrossings(GNEJunction* junction, GNEUndoList* undoList);
422
424 void setShapeStartPos(const Position& pos);
425
427 void setShapeEndPos(const Position& pos);
428
430 const std::map<const GNELane*, std::vector<GNEDemandElement*> > getVehiclesOverEdgeMap() const;
431
433 void drawEdgeName(const GUIVisualizationSettings& s) const;
434
436 void drawLaneStopOffset(const GUIVisualizationSettings& s) const;
437
439 void drawTAZElements(const GUIVisualizationSettings& s) const;
440
442 bool areStackPositionOverlapped(const GNEEdge::StackPosition& vehicleA, const GNEEdge::StackPosition& vehicleB) const;
443
445 GNEMoveOperation* processMoveFromJunctionSelected(const PositionVector originalShape, const Position mousePosition, const double snapRadius);
446
448 GNEMoveOperation* processMoveToJunctionSelected(const PositionVector originalShape, const Position mousePosition, const double snapRadius);
449
452
454 GNEMoveOperation* processNoneJunctionSelected(const double snapRadius);
455
457 GNEEdge(const GNEEdge& s) = delete;
458
460 GNEEdge& operator=(const GNEEdge& s) = delete;
461};
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
This object is responsible for drawing a shape and for supplying a a popup menu. Messages are routete...
Definition: GNECrossing.h:42
An Element which don't belong to GNENet but has influence in the simulation.
Stack demand elements.
Definition: GNEEdge.h:366
const StackPosition & getStackPosition() const
get stack position
Definition: GNEEdge.cpp:1599
const std::vector< GNEDemandElement * > & getDemandElements() const
get demand elements
Definition: GNEEdge.cpp:1605
void addDemandElements(GNEDemandElement *demandElement)
add demand elment to current StackDemandElements
Definition: GNEEdge.cpp:1593
StackDemandElements(const StackPosition stackedPosition, GNEDemandElement *demandElement)
constructor
Definition: GNEEdge.cpp:1585
Stack position (used to stack demand elements over edges)
Definition: GNEEdge.h:352
double beginPosition() const
get begin position
Definition: GNEEdge.cpp:1574
StackPosition(const double departPos, const double length)
constructor
Definition: GNEEdge.cpp:1568
double endPosition() const
get end position
Definition: GNEEdge.cpp:1580
A road/street connecting two junctions (netedit-version)
Definition: GNEEdge.h:53
const Position getFrontDownShapePosition() const
get front down shape position
Definition: GNEEdge.cpp:616
void updateCenteringBoundary(const bool updateGrid)
update centering boundary (implies change in RTREE)
Definition: GNEEdge.cpp:348
void drawEdgeName(const GUIVisualizationSettings &s) const
draw edge name
Definition: GNEEdge.cpp:2299
bool isConvexAngle() const
check if edge makes a convex angle [0 - 180) degrees
Definition: GNEEdge.cpp:1518
void setNumLanes(int numLanes, GNEUndoList *undoList)
changes the number of lanes. When reducing the number of lanes, higher-numbered lanes are removed fir...
Definition: GNEEdge.cpp:1832
std::string getNetworkElementProblem() const
return a string with the current network element problem
Definition: GNEEdge.cpp:134
void commitMoveShape(const GNEMoveResult &moveResult, GNEUndoList *undoList)
commit move shape
Definition: GNEEdge.cpp:1805
bool hasPredecessors() const
check if this edge has predecessors (note: only for vehicles, this function ignore walking areas!...
Definition: GNEEdge.cpp:1533
void setMoveShape(const GNEMoveResult &moveResult)
set move shape
Definition: GNEEdge.cpp:1783
~GNEEdge()
Destructor.
Definition: GNEEdge.cpp:90
GNEEdge & operator=(const GNEEdge &s)=delete
invalidated assignment operator
void smooth(GNEUndoList *undoList)
make geometry smooth
Definition: GNEEdge.cpp:2193
void updateGeometry()
update pre-computed geometry information
Definition: GNEEdge.cpp:142
GNEMoveOperation * getMoveOperation()
get move operation
Definition: GNEEdge.cpp:192
std::string getAttributeForSelection(SumoXMLAttr key) const
method for getting the attribute in the context of object selection
Definition: GNEEdge.cpp:947
void setResponsible(bool newVal)
set responsibility for deleting internal structures
Definition: GNEEdge.cpp:1223
static void drawDottedContourEdge(const GUIVisualizationSettings &s, const GUIDottedGeometry::DottedContourType type, const GNEEdge *edge, const bool drawFrontExtreme, const bool drawBackExtreme, const double exaggeration=1)
draw dotted contour for the given dottedGeometries
Definition: GNEEdge.cpp:1464
void copyEdgeType(const GNEEdgeType *edgeType, GNEUndoList *undoList)
copy edge attributes from edgeType
Definition: GNEEdge.cpp:784
NBEdge * getNBEdge() const
returns the internal NBEdge
Definition: GNEEdge.cpp:481
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
Definition: GNEEdge.cpp:389
const std::map< const GNELane *, std::vector< GNEDemandElement * > > getVehiclesOverEdgeMap() const
get vehicles a that start over this edge
Definition: GNEEdge.cpp:2257
std::set< GUIGlID > getLaneGlIDs() const
returns GLIDs of all lanes
Definition: GNEEdge.cpp:829
GNEEdge * getReverseEdge() const
get reverse edge (if exist)
Definition: GNEEdge.cpp:1555
const Position getFrontUpShapePosition() const
get front up shape position
Definition: GNEEdge.cpp:608
std::vector< GNEConnection * > ConnectionVector
Definition of the connection's vector.
Definition: GNEEdge.h:64
void setGeometry(PositionVector geom, bool inner)
update edge geometry and inform the lanes
Definition: GNEEdge.cpp:573
void smoothElevation(GNEUndoList *undoList)
smooth elevation with regard to adjoining edges
Definition: GNEEdge.cpp:2205
void drawLaneStopOffset(const GUIVisualizationSettings &s) const
draw edgeStopOffset
Definition: GNEEdge.cpp:2365
bool clickedOverGeometryPoint(const Position &pos) const
return true if user clicked over a Geometry Point
Definition: GNEEdge.cpp:309
bool clickedOverShapeEnd(const Position &pos) const
return true if user clicked over ShapeEnd
Definition: GNEEdge.cpp:299
void updateVehicleStackLabels()
Definition: GNEEdge.cpp:1290
bool isValid(SumoXMLAttr key, const std::string &value)
Definition: GNEEdge.cpp:1088
void remakeGNEConnections(bool junctionsReady=false)
remake connections
Definition: GNEEdge.cpp:639
GNEMoveOperation * processMoveBothJunctionSelected()
process moving edge when both junctions are selected
Definition: GNEEdge.cpp:2574
void removeGeometryPoint(const Position clickedPosition, GNEUndoList *undoList)
remove geometry point in the clicked position
Definition: GNEEdge.cpp:218
const std::vector< GNELane * > & getLanes() const
returns a reference to the lane vector
Definition: GNEEdge.cpp:839
LaneVector myLanes
vector with the lanes of this edge
Definition: GNEEdge.h:333
static const double SNAP_RADIUS
Definition: GNEEdge.h:271
GNELane * getLaneByAllowedVClass(const SUMOVehicleClass vClass) const
return the first lane that allow a vehicle of type vClass (or the first lane, if none was found)
Definition: GNEEdge.cpp:1229
bool hasCustomEndPoints() const
Definition: GNEEdge.cpp:277
void removeConnection(NBEdge::Connection nbCon)
removes a connection
Definition: GNEEdge.cpp:2023
bool hasSuccessors() const
check if this edge has successors (note: only for vehicles, this function ignore walking areas!...
Definition: GNEEdge.cpp:1549
bool isAttributeComputed(SumoXMLAttr key) const
Definition: GNEEdge.cpp:1200
bool myWasSplit
whether this edge was created from a split
Definition: GNEEdge.h:345
void removeLane(GNELane *lane, bool recomputeConnections)
@briefdecrease the number of lanes by one. argument is only used to increase robustness (assertions)
Definition: GNEEdge.cpp:1946
double getExaggeration(const GUIVisualizationSettings &s) const
return exaggeration associated with this GLObject
Definition: GNEEdge.cpp:342
bool hasRestrictedLane(SUMOVehicleClass vclass) const
check if edge has a restricted lane
Definition: GNEEdge.cpp:2088
static const double SNAP_RADIUS_SQUARED
Definition: GNEEdge.h:274
void updateSecondParentJunction(const std::string &value)
update last parent junction
Definition: GNEEdge.cpp:1884
Position myPositionBeforeMoving
position used for move Lanes
Definition: GNEEdge.h:339
std::vector< GNELane * > LaneVector
Definition of the lane's vector.
Definition: GNEEdge.h:61
std::vector< GNEEdge * > getOppositeEdges() const
get opposite edges
Definition: GNEEdge.cpp:404
PositionVector smoothShape(const PositionVector &shape, bool forElevation)
return smoothed shape
Definition: GNEEdge.cpp:2120
GNEJunction * getFromJunction() const
get from Junction (only used to increase readability)
Definition: GNEEdge.h:77
bool wasSplit()
whether this edge was created from a split
Definition: GNEEdge.cpp:851
NBEdge * myNBEdge
the underlying NBEdge
Definition: GNEEdge.h:330
void copyTemplate(const GNEEdgeTemplate *edgeTemplate, GNEUndoList *undoList)
copy edge attributes from edgetemplate
Definition: GNEEdge.cpp:749
void removeEdgeFromCrossings(GNEJunction *junction, GNEUndoList *undoList)
remove crossing of junction
Definition: GNEEdge.cpp:2099
Position getPositionInView() const
Returns position of hierarchical element in view.
Definition: GNEEdge.cpp:186
void addLane(GNELane *lane, const NBEdge::Lane &laneAttrs, bool recomputeConnections)
increase number of lanes by one use the given attributes and restore the GNELane
Definition: GNEEdge.cpp:1893
GNEConnection * retrieveGNEConnection(int fromLane, NBEdge *to, int toLane, bool createIfNoExist=true)
get GNEConnection if exist, and if not create it if create is enabled
Definition: GNEEdge.cpp:2056
ConnectionVector myGNEConnections
vector with the connections of this edge
Definition: GNEEdge.h:336
void editEndpoint(Position pos, GNEUndoList *undoList)
makes pos the new geometry endpoint at the appropriate end, or remove current existent endpoint
Definition: GNEEdge.cpp:501
void resetBothEndpoint(GNEUndoList *undoList)
restores both endpoint to the junction position at the appropriate end
Definition: GNEEdge.cpp:563
Position getSplitPos(const Position &clickPos)
Definition: GNEEdge.cpp:487
const std::vector< GNEConnection * > & getGNEConnections() const
returns a reference to the GNEConnection vector
Definition: GNEEdge.cpp:845
std::string getAttribute(SumoXMLAttr key) const
Definition: GNEEdge.cpp:857
int getRouteProbeRelativePosition(GNERouteProbe *routeProbe) const
obtain relative positions of RouteProbes
Definition: GNEEdge.cpp:714
std::string myConnectionStatus
modification status of the connections
Definition: GNEEdge.h:348
void deleteGLObject()
delete element
Definition: GNEEdge.cpp:466
const std::string getOptionalName() const
Returns the street name.
Definition: GNEEdge.cpp:383
void clearGNEConnections()
clear current connections
Definition: GNEEdge.cpp:687
bool myUpdateGeometry
flag to enable/disable update geometry of lanes (used mainly by setNumLanes)
Definition: GNEEdge.h:383
const Position getBackDownShapePosition() const
get back down shape position
Definition: GNEEdge.cpp:632
GNEEdge(const GNEEdge &s)=delete
invalidated copy constructor
bool areStackPositionOverlapped(const GNEEdge::StackPosition &vehicleA, const GNEEdge::StackPosition &vehicleB) const
check if given stacked positions are overlapped
Definition: GNEEdge.cpp:2470
void updateFirstParentJunction(const std::string &value)
update front parent junction
Definition: GNEEdge.cpp:1875
void straightenElevation(GNEUndoList *undoList)
interpolate z values linear between junctions
Definition: GNEEdge.cpp:2110
bool clickedOverShapeStart(const Position &pos) const
return true if user clicked over ShapeStart
Definition: GNEEdge.cpp:289
bool isNetworkElementValid() const
check if current network element is valid to be written into XML
Definition: GNEEdge.cpp:124
void setShapeStartPos(const Position &pos)
change Shape StartPos
Definition: GNEEdge.cpp:2235
GNEJunction * getToJunction() const
get from Junction (only used to increase readability)
Definition: GNEEdge.h:82
void setAttribute(SumoXMLAttr key, const std::string &value, GNEUndoList *undoList)
Definition: GNEEdge.cpp:957
void setMicrosimID(const std::string &newID)
override to also set lane ids
Definition: GNEEdge.cpp:2079
const Position getBackUpShapePosition() const
get back up shape position
Definition: GNEEdge.cpp:624
void resetEndpoint(const Position &pos, GNEUndoList *undoList)
restores the endpoint to the junction position at the appropriate end
Definition: GNEEdge.cpp:549
bool isAttributeEnabled(SumoXMLAttr key) const
Definition: GNEEdge.cpp:1189
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
Definition: GNEEdge.cpp:410
void addConnection(NBEdge::Connection nbCon, bool selectAfterCreation=false)
adds a connection
Definition: GNEEdge.cpp:1999
GNEMoveOperation * processMoveFromJunctionSelected(const PositionVector originalShape, const Position mousePosition, const double snapRadius)
process moving edge when only from junction is selected
Definition: GNEEdge.cpp:2486
void drawEdgeGeometryPoints(const GUIVisualizationSettings &s, const GNELane *lane) const
draw edge geometry points (note: This function is called by GNELane::drawGL(...)
Definition: GNEEdge.cpp:1348
GNEMoveOperation * processNoneJunctionSelected(const double snapRadius)
process moving edge when none junction are selected
Definition: GNEEdge.cpp:2586
const Parameterised::Map & getACParametersMap() const
get parameters map
Definition: GNEEdge.cpp:1217
void drawTAZElements(const GUIVisualizationSettings &s) const
draw TAZElements
Definition: GNEEdge.cpp:2385
std::vector< GNECrossing * > getGNECrossings()
get GNECrossings vinculated with this Edge
Definition: GNEEdge.cpp:732
GNELane * getLaneByDisallowedVClass(const SUMOVehicleClass vClass) const
return the first lane that disallow a vehicle of type vClass (or the first lane, if none was found)
Definition: GNEEdge.cpp:1244
void updateVehicleSpreadGeometries()
Definition: GNEEdge.cpp:1259
GNEMoveOperation * processMoveToJunctionSelected(const PositionVector originalShape, const Position mousePosition, const double snapRadius)
process moving edge when only to junction is selected
Definition: GNEEdge.cpp:2530
void updateGLObject()
update GLObject (geometry, ID, etc.)
Definition: GNEEdge.cpp:475
void updateJunctionPosition(GNEJunction *junction, const Position &origPos)
update edge geometry after junction move
Definition: GNEEdge.cpp:328
bool myAmResponsible
whether we are responsible for deleting myNBNode
Definition: GNEEdge.h:342
GNEEdge(GNENet *net, NBEdge *nbe, bool wasSplit=false, bool loaded=false)
Constructor.
Definition: GNEEdge.cpp:62
void setShapeEndPos(const Position &pos)
change Shape EndPos
Definition: GNEEdge.cpp:2246
const std::vector< GNEJunction * > & getParentJunctions() const
get parent junctions
This lane is powered by an underlying GNEEdge and basically knows how to draw itself.
Definition: GNELane.h:46
move operation
move result
A NBNetBuilder extended by visualisation and editing capabilities.
Definition: GNENet.h:42
Representation of a RouteProbe in netedit.
Definition: GNERouteProbe.h:32
The popup menu of a globject.
Stores the information about how to visualize structures.
The representation of a single edge during network building.
Definition: NBEdge.h:92
std::map< std::string, std::string > Map
parameters map
Definition: Parameterised.h:45
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
A list of positions.
A structure which describes a connection between edges or lanes.
Definition: NBEdge.h:201
An (internal) definition of a single lane of an edge.
Definition: NBEdge.h:143