Eclipse SUMO - Simulation of Urban MObility
GUIJunctionWrapper.cpp
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/****************************************************************************/
22// }
23/****************************************************************************/
24#include <config.h>
25
26#include <string>
27#include <utility>
28#include <microsim/MSLane.h>
29#include <microsim/MSEdge.h>
30#include <microsim/MSJunction.h>
31#include <utils/geom/Position.h>
33#include <microsim/MSNet.h>
38#include <gui/GUIGlobals.h>
41#include "GUIJunctionWrapper.h"
47
49
50// ===========================================================================
51// method definitions
52// ===========================================================================
53GUIJunctionWrapper::GUIJunctionWrapper(MSJunction& junction, const std::string& tllID):
54 GUIGlObject(GLO_JUNCTION, junction.getID(), GUIIconSubSys::getIcon(GUIIcon::JUNCTION)),
55 myJunction(junction),
56 myTesselation(junction.getID(), "", RGBColor::MAGENTA, junction.getShape(), false, true, 0),
57 myExaggeration(1),
58 myTLLID(tllID) {
59 if (myJunction.getShape().size() == 0) {
61 myBoundary = Boundary(pos.x() - 1., pos.y() - 1., pos.x() + 1., pos.y() + 1.);
62 } else {
64 }
69 for (auto it = myJunction.getIncoming().begin(); it != myJunction.getIncoming().end() && (myAmWaterway || myAmRailway); ++it) {
70 if (!(*it)->isInternal()) {
71 if (!isWaterway((*it)->getPermissions())) {
72 myAmWaterway = false;
73 }
74 if (!isRailway((*it)->getPermissions())) {
75 myAmRailway = false;
76 }
77 }
78 }
79 for (auto it = myJunction.getOutgoing().begin(); it != myJunction.getOutgoing().end() && (myAmWaterway || myAmRailway); ++it) {
80 if (!(*it)->isInternal()) {
81 if (!isWaterway((*it)->getPermissions())) {
82 myAmWaterway = false;
83 }
84 if (!isRailway((*it)->getPermissions())) {
85 myAmRailway = false;
86 }
87 }
88 }
90}
91
92
94
95
98 GUISUMOAbstractView& parent) {
99 GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, *this);
100 buildPopupHeader(ret, app);
105 buildPositionCopyEntry(ret, app);
106 return ret;
107}
108
109
113 // add items
114 ret->mkItem("type", false, toString(myJunction.getType()));
115 ret->mkItem("name", false, myJunction.getName());
116 // close building
118 return ret;
119}
120
121
122double
124 return s.junctionSize.getExaggeration(s, this, 4);
125}
126
127
131 b.grow(1);
132 return b;
133}
134
135const std::string
137 return myJunction.getName();
138}
139
140void
143 // check whether it is not too small
144 const double exaggeration = getExaggeration(s);
145 if (s.scale * exaggeration >= s.junctionSize.minSize) {
148 const double colorValue = getColorValue(s, s.junctionColorer.getActive());
149 const RGBColor color = s.junctionColorer.getScheme().getColor(colorValue);
150 GLHelper::setColor(color);
151
152 // recognize full transparency and simply don't draw
153 if (color.alpha() != 0) {
154 if ((exaggeration > 1 || myExaggeration > 1) && exaggeration != myExaggeration) {
155 myExaggeration = exaggeration;
160 }
161 glTranslated(0, 0, getType());
162 if (s.scale * myMaxSize < 40.) {
164 } else {
166 }
167 // make small junctions more visible when coloring by type
169 glTranslated(myJunction.getPosition().x(), myJunction.getPosition().y(), getType() + 0.05);
170 GLHelper::drawFilledCircle(2 * exaggeration, 12);
171 }
172 }
175 if (s.geometryIndices.show(this)) {
177 }
178 }
179 }
180 if (myIsInternal) {
182 } else {
184 if (s.junctionName.show(this) && myJunction.getName() != "") {
186 }
187 if ((s.tlsPhaseIndex.show(this) || s.tlsPhaseName.show(this)) && myTLLID != "") {
189 if (s.tlsPhaseIndex.show(this)) {
190 const int index = active->getCurrentPhaseIndex();
192 }
193 if (s.tlsPhaseName.show(this)) {
194 const std::string& name = active->getCurrentPhaseDef().getName();
195 if (name != "") {
196 const Position offset = (s.tlsPhaseIndex.show(this) ?
198 : Position(0, 0));
200 }
201 }
202 }
203 }
204}
205
206
207double
208GUIJunctionWrapper::getColorValue(const GUIVisualizationSettings& /* s */, int activeScheme) const {
209 switch (activeScheme) {
210 case 0:
211 if (myAmWaterway) {
212 return 1;
213 } else if (myAmRailway && MSNet::getInstance()->hasInternalLinks()) {
214 return 2;
215 } else {
216 return 0;
217 }
218 case 1:
219 return gSelected.isSelected(getType(), getGlID()) ? 1 : 0;
220 case 2:
221 switch (myJunction.getType()) {
223 return 0;
225 return 1;
227 return 2;
229 return 3;
231 return 4;
233 return 5;
235 return 6;
237 return 7;
240 return 8;
243 assert(false);
244 return 8;
246 return 9;
248 return 10;
250 return 11;
252 return 12;
254 return 13;
255 default:
256 assert(false);
257 return 0;
258 }
259 case 3:
260 return myJunction.getPosition().z();
261 default:
262 assert(false);
263 return 0;
264 }
265}
266
267#ifdef HAVE_OSG
268void
269GUIJunctionWrapper::updateColor(const GUIVisualizationSettings& s) {
270 const double colorValue = getColorValue(s, s.junctionColorer.getActive());
271 const RGBColor& col = s.junctionColorer.getScheme().getColor(colorValue);
272 osg::Vec4ubArray* colors = dynamic_cast<osg::Vec4ubArray*>(myGeom->getColorArray());
273 (*colors)[0].set(col.red(), col.green(), col.blue(), col.alpha());
274 myGeom->setColorArray(colors);
275}
276#endif
277
278
279/****************************************************************************/
@ GLO_JUNCTION
a junction
GUISelectedStorage gSelected
A global holder of selected objects.
GUIIcon
An enumeration of icons used by the gui applications.
Definition: GUIIcons.h:33
#define DEG2RAD(x)
Definition: GeomHelper.h:35
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
bool isWaterway(SVCPermissions permissions)
Returns whether an edge with the given permission is a waterway edge.
T MAX2(T a, T b)
Definition: StdDefs.h:77
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:39
Boundary & grow(double by)
extends the boundary by the given amount
Definition: Boundary.cpp:300
double getHeight() const
Returns the height of the boundary (y-axis)
Definition: Boundary.cpp:160
double getWidth() const
Returns the width of the boudary (x-axis)
Definition: Boundary.cpp:154
static void drawFilledPoly(const PositionVector &v, bool close)
Draws a filled polygon described by the list of points.
Definition: GLHelper.cpp:203
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition: GLHelper.cpp:583
static void drawFilledCircle(double width, int steps=8)
Draws a filled circle around (0,0)
Definition: GLHelper.cpp:498
static void pushName(unsigned int name)
push Name
Definition: GLHelper.cpp:139
static void popMatrix()
pop matrix
Definition: GLHelper.cpp:130
static void debugVertices(const PositionVector &shape, const GUIVisualizationTextSettings &settings, double scale, double layer=1024)
draw vertex numbers for the given shape (in a random color)
Definition: GLHelper.cpp:880
static void popName()
pop Name
Definition: GLHelper.cpp:148
static void pushMatrix()
push matrix
Definition: GLHelper.cpp:117
static void drawTextSettings(const GUIVisualizationTextSettings &settings, const std::string &text, const Position &pos, const double scale, const double angle=0, const double layer=2048, const int align=0)
Definition: GLHelper.cpp:716
The popup menu of a globject.
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
Definition: GUIGlObject.h:154
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
GUIGlID getGlID() const
Returns the numerical id of the object.
Definition: GUIGlObject.h:102
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0, bool forceShow=false) const
draw name of item
double myMaxSize
The maximum size (in either x-, or y-dimension) for determining whether to draw or not.
TesselatedPolygon myTesselation
An object that stores the shape and its tesselation.
Boundary myBoundary
The represented junction's boundary.
const std::string myTLLID
the associated traffic light or ""
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const
const std::string getOptionalName() const
Returns the value for generic parameter 'name' or ''.
bool myAmRailway
whether this junction has only railways as incoming and outgoing edges
bool myIsInternal
whether this wraps an instance of MSInternalJunction
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
bool myAmWaterway
whether this junction has only waterways as incoming and outgoing edges
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
double getExaggeration(const GUIVisualizationSettings &s) const
return exaggeration associated with this GLObject
GUIJunctionWrapper(MSJunction &junction, const std::string &tllID)
Constructor.
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
MSJunction & myJunction
A reference to the represented junction.
virtual ~GUIJunctionWrapper()
Destructor.
A window containing a gl-object's parameter.
void mkItem(const char *name, bool dynamic, ValueSource< T > *src)
Adds a row which obtains its value from a ValueSource.
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
const T getColor(const double value) const
bool isSelected(GUIGlObjectType type, GUIGlID id)
Returns the information whether the object with the given type and id is selected.
Stores the information about how to visualize structures.
GUIVisualizationTextSettings tlsPhaseIndex
GUIVisualizationTextSettings junctionName
GUIVisualizationSizeSettings junctionSize
GUIVisualizationTextSettings internalJunctionName
bool drawJunctionShape
whether the shape of the junction should be drawn
GUIVisualizationTextSettings geometryIndices
GUIVisualizationTextSettings junctionID
double scale
information about a lane's width (temporary, used for a single view)
GUIVisualizationTextSettings tlsPhaseName
GUIColorer junctionColorer
The junction colorer.
double angle
The current view rotation angle.
The base class for an intersection.
Definition: MSJunction.h:58
SumoXMLNodeType getType() const
return the type of this Junction
Definition: MSJunction.h:130
const Position & getPosition() const
Definition: MSJunction.cpp:68
const ConstMSEdgeVector & getOutgoing() const
Definition: MSJunction.h:111
const std::string & getName() const
return the junction name
Definition: MSJunction.h:93
const PositionVector & getShape() const
Returns this junction's shape.
Definition: MSJunction.h:88
const ConstMSEdgeVector & getIncoming() const
Definition: MSJunction.h:105
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:183
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition: MSNet.h:452
const std::string & getName() const
MSTrafficLightLogic * getActive(const std::string &id) const
Returns the active program of a named tls.
The parent class for traffic light logics.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
virtual int getCurrentPhaseIndex() const =0
Returns the current index within the program.
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
double x() const
Returns the x-position.
Definition: Position.h:55
Position rotateAround2D(double rad, const Position &origin)
rotate this position by rad around origin and return the result
Definition: Position.cpp:41
double z() const
Returns the z-position.
Definition: Position.h:65
double y() const
Returns the y-position.
Definition: Position.h:60
void closePolygon()
ensures that the last position equals the first
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
void scaleRelative(double factor)
enlarges/shrinks the polygon by a factor based at the centroid
unsigned char red() const
Returns the red-amount of the color.
Definition: RGBColor.cpp:74
unsigned char alpha() const
Returns the alpha-amount of the color.
Definition: RGBColor.cpp:92
unsigned char green() const
Returns the green-amount of the color.
Definition: RGBColor.cpp:80
unsigned char blue() const
Returns the blue-amount of the color.
Definition: RGBColor.cpp:86
const PositionVector & getShape() const
Returns whether the shape of the polygon.
Definition: SUMOPolygon.cpp:52
virtual void setShape(const PositionVector &shape)
Sets the shape of the polygon.
Definition: SUMOPolygon.cpp:82
std::vector< GLPrimitive > myTesselation
id of the display list for the cached tesselation
Definition: GUIPolygon.h:74
PositionVector & getShapeRef()
Definition: GUIPolygon.h:76
void drawTesselation(const PositionVector &shape) const
Definition: GUIPolygon.cpp:118
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values
double minSize
The minimum size to draw this object.
bool show(const GUIGlObject *o) const
whether to show the text
double scaledSize(double scale, double constFactor=0.1) const
get scale size