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-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
19 // }
20 /****************************************************************************/
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 #include <config.h>
27 
28 #include <string>
29 #include <utility>
30 #ifdef HAVE_OSG
31 #include <osg/Geometry>
32 #endif
33 #include <microsim/MSLane.h>
34 #include <microsim/MSEdge.h>
35 #include <microsim/MSJunction.h>
36 #include <utils/geom/Position.h>
37 #include <utils/geom/GeomHelper.h>
38 #include <microsim/MSNet.h>
43 #include <gui/GUIGlobals.h>
46 #include "GUIJunctionWrapper.h"
50 #include <utils/gui/div/GLHelper.h>
52 
53 //#define GUIJunctionWrapper_DEBUG_DRAW_NODE_SHAPE_VERTICES
54 
55 // ===========================================================================
56 // method definitions
57 // ===========================================================================
58 GUIJunctionWrapper::GUIJunctionWrapper(MSJunction& junction, const std::string& tllID):
59  GUIGlObject(GLO_JUNCTION, junction.getID()),
60  myJunction(junction),
61  myTLLID(tllID) {
62  if (myJunction.getShape().size() == 0) {
64  myBoundary = Boundary(pos.x() - 1., pos.y() - 1., pos.x() + 1., pos.y() + 1.);
65  } else {
67  }
70  myAmWaterway = myJunction.getIncoming().size() + myJunction.getOutgoing().size() > 0;
71  myAmRailway = myJunction.getIncoming().size() + myJunction.getOutgoing().size() > 0;
72  for (auto it = myJunction.getIncoming().begin(); it != myJunction.getIncoming().end() && (myAmWaterway || myAmRailway); ++it) {
73  if (!(*it)->isInternal()) {
74  if (!isWaterway((*it)->getPermissions())) {
75  myAmWaterway = false;
76  }
77  if (!isRailway((*it)->getPermissions())) {
78  myAmRailway = false;
79  }
80  }
81  }
82  for (auto it = myJunction.getOutgoing().begin(); it != myJunction.getOutgoing().end() && (myAmWaterway || myAmRailway); ++it) {
83  if (!(*it)->isInternal()) {
84  if (!isWaterway((*it)->getPermissions())) {
85  myAmWaterway = false;
86  }
87  if (!isRailway((*it)->getPermissions())) {
88  myAmRailway = false;
89  }
90  }
91  }
92 }
93 
94 
96 
97 
100  GUISUMOAbstractView& parent) {
101  GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, *this);
102  buildPopupHeader(ret, app);
107  buildPositionCopyEntry(ret, false);
108  return ret;
109 }
110 
111 
115  new GUIParameterTableWindow(app, *this, 12 + (int)myJunction.getParametersMap().size());
116  // add items
117  ret->mkItem("type", false, toString(myJunction.getType()));
118  // close building
119  ret->closeBuilding(&myJunction);
120  return ret;
121 }
122 
123 
124 Boundary
126  Boundary b = myBoundary;
127  b.grow(1);
128  return b;
129 }
130 
131 
132 void
134  if (!myIsInternal && s.drawJunctionShape) {
135  // check whether it is not too small
136  const double exaggeration = s.junctionSize.getExaggeration(s, this, 4);
137  if (s.scale * exaggeration >= s.junctionSize.minSize) {
138  glPushMatrix();
139  glPushName(getGlID());
140  const double colorValue = getColorValue(s, s.junctionColorer.getActive());
141  const RGBColor color = s.junctionColorer.getScheme().getColor(colorValue);
142  GLHelper::setColor(color);
143 
144  // recognize full transparency and simply don't draw
145  if (color.alpha() != 0) {
147  shape.closePolygon();
148  if (exaggeration > 1) {
149  shape.scaleRelative(exaggeration);
150  }
151  glTranslated(0, 0, getType());
152  if (s.scale * myMaxSize < 40.) {
153  GLHelper::drawFilledPoly(shape, true);
154  } else {
156  }
157 #ifdef GUIJunctionWrapper_DEBUG_DRAW_NODE_SHAPE_VERTICES
158  GLHelper::debugVertices(shape, 80 / s.scale);
159 #endif
160  // make small junctions more visible when coloring by type
162  glTranslated(myJunction.getPosition().x(), myJunction.getPosition().y(), getType() + 0.05);
163  GLHelper::drawFilledCircle(2 * exaggeration, 12);
164  }
165  }
166  glPopName();
167  glPopMatrix();
168  }
169  }
170  if (myIsInternal) {
172  } else {
174  if (s.tlsPhaseIndex.show && myTLLID != "") {
176  const int index = active->getCurrentPhaseIndex();
177  const std::string& name = active->getCurrentPhaseDef().getName();
179  if (name != "") {
180  const Position offset = Position(0, 0.8 * s.tlsPhaseIndex.scaledSize(s.scale)).rotateAround2D(DEG2RAD(-s.angle), Position(0, 0));
182  }
183  }
184  }
185 }
186 
187 
188 double
189 GUIJunctionWrapper::getColorValue(const GUIVisualizationSettings& /* s */, int activeScheme) const {
190  switch (activeScheme) {
191  case 0:
192  if (myAmWaterway) {
193  return 1;
194  } else if (myAmRailway && MSNet::getInstance()->hasInternalLinks()) {
195  return 2;
196  } else {
197  return 0;
198  }
199  case 1:
200  return gSelected.isSelected(getType(), getGlID()) ? 1 : 0;
201  case 2:
202  switch (myJunction.getType()) {
204  return 0;
206  return 1;
207  case NODETYPE_PRIORITY:
208  return 2;
210  return 3;
212  return 4;
214  return 5;
215  case NODETYPE_DISTRICT:
216  return 6;
217  case NODETYPE_NOJUNCTION:
218  return 7;
219  case NODETYPE_DEAD_END:
221  return 8;
222  case NODETYPE_UNKNOWN:
223  case NODETYPE_INTERNAL:
224  assert(false);
225  return 8;
227  return 9;
228  case NODETYPE_ZIPPER:
229  return 10;
231  return 11;
233  return 12;
234  }
235  case 3:
236  return myJunction.getPosition().z();
237  default:
238  assert(false);
239  return 0;
240  }
241 }
242 
243 #ifdef HAVE_OSG
244 void
245 GUIJunctionWrapper::updateColor(const GUIVisualizationSettings& s) {
246  const double colorValue = getColorValue(s, s.junctionColorer.getActive());
247  const RGBColor& col = s.junctionColorer.getScheme().getColor(colorValue);
248  osg::Vec4ubArray* colors = dynamic_cast<osg::Vec4ubArray*>(myGeom->getColorArray());
249  (*colors)[0].set(col.red(), col.green(), col.blue(), col.alpha());
250  myGeom->setColorArray(colors);
251 }
252 #endif
253 
254 
255 /****************************************************************************/
256 
GUIGlObject::getType
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
Definition: GUIGlObject.cpp:181
GLHelper::debugVertices
static void debugVertices(const PositionVector &shape, double size, double layer=256)
draw vertex numbers for the given shape (in a random color)
Definition: GLHelper.cpp:803
NODETYPE_PRIORITY
Definition: SUMOXMLDefinitions.h:1056
NODETYPE_TRAFFIC_LIGHT_RIGHT_ON_RED
Definition: SUMOXMLDefinitions.h:1053
GLHelper::drawTextSettings
static void drawTextSettings(const GUIVisualizationTextSettings &settings, const std::string &text, const Position &pos, const double scale, const double angle=0, const double layer=2048)
Definition: GLHelper.cpp:701
NODETYPE_ZIPPER
Definition: SUMOXMLDefinitions.h:1060
GUIParameterTableWindow
A window containing a gl-object's parameter.
Definition: GUIParameterTableWindow.h:63
GUISUMOAbstractView
Definition: GUISUMOAbstractView.h:73
MSTLLogicControl.h
NODETYPE_DEAD_END_DEPRECATED
Definition: SUMOXMLDefinitions.h:1065
MSNet.h
GUIVisualizationSettings::junctionSize
GUIVisualizationSizeSettings junctionSize
Definition: GUIVisualizationSettings.h:569
GUIVisualizationSettings::tlsPhaseIndex
GUIVisualizationTextSettings tlsPhaseIndex
Definition: GUIVisualizationSettings.h:560
GUIParameterTableWindow.h
MSJunction
The base class for an intersection.
Definition: MSJunction.h:61
GUIGlObject::drawName
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0) const
draw name of item
Definition: GUIGlObject.cpp:355
GUIVisualizationSettings::angle
double angle
The current view rotation angle.
Definition: GUIVisualizationSettings.h:403
Position::z
double z() const
Returns the z-position.
Definition: Position.h:67
GUIGlObject::buildSelectionPopupEntry
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
Definition: GUIGlObject.cpp:236
GUIGLObjectPopupMenu.h
GUIGlobalSelection.h
GUIJunctionWrapper::myIsInternal
bool myIsInternal
whether this wraps an instance of MSInternalJunction
Definition: GUIJunctionWrapper.h:156
PositionVector::scaleRelative
void scaleRelative(double factor)
enlarges/shrinks the polygon by a factor based at the centroid
Definition: PositionVector.cpp:448
NODETYPE_INTERNAL
Definition: SUMOXMLDefinitions.h:1063
MSTrafficLightLogic::getCurrentPhaseIndex
virtual int getCurrentPhaseIndex() const =0
Returns the current index within the program.
NODETYPE_UNKNOWN
Definition: SUMOXMLDefinitions.h:1050
Boundary::getHeight
double getHeight() const
Returns the height of the boundary (y-axis)
Definition: Boundary.cpp:161
GUIJunctionWrapper::GUIJunctionWrapper
GUIJunctionWrapper(MSJunction &junction, const std::string &tllID)
Constructor.
Definition: GUIJunctionWrapper.cpp:58
MSEdge.h
GLHelper.h
GUIJunctionWrapper.h
MSInternalJunction.h
PositionVector
A list of positions.
Definition: PositionVector.h:46
GUIGLObjectPopupMenu
The popup menu of a globject.
Definition: GUIGLObjectPopupMenu.h:48
GLHelper::drawFilledPoly
static void drawFilledPoly(const PositionVector &v, bool close)
Draws a filled polygon described by the list of points.
Definition: GLHelper.cpp:82
GLHelper::setColor
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition: GLHelper.cpp:616
PositionVector::getBoxBoundary
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
Definition: PositionVector.cpp:382
GUIParameterTableWindow::closeBuilding
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
Definition: GUIParameterTableWindow.cpp:220
MSJunction::getIncoming
const ConstMSEdgeVector & getIncoming() const
Definition: MSJunction.h:102
MSTLLogicControl::getActive
MSTrafficLightLogic * getActive(const std::string &id) const
Returns the active program of a named tls.
Definition: MSTLLogicControl.cpp:658
GUIVisualizationTextSettings::scaledSize
double scaledSize(double scale, double constFactor=0.1) const
get scale size
Definition: GUIVisualizationSettings.cpp:195
MSJunction::getOutgoing
const ConstMSEdgeVector & getOutgoing() const
Definition: MSJunction.h:108
GUIVisualizationSettings::junctionName
GUIVisualizationTextSettings junctionName
Definition: GUIVisualizationSettings.h:560
GUIAppEnum.h
GUIVisualizationSettings::junctionColorer
GUIColorer junctionColorer
The junction colorer.
Definition: GUIVisualizationSettings.h:557
MAX2
T MAX2(T a, T b)
Definition: StdDefs.h:80
MSTrafficLightLogic.h
GUISUMOAbstractView.h
GLHelper::drawFilledCircle
static void drawFilledCircle(double width, int steps=8)
Draws a filled circle around (0,0)
Definition: GLHelper.cpp:348
RGBColor
Definition: RGBColor.h:40
NODETYPE_ALLWAY_STOP
Definition: SUMOXMLDefinitions.h:1059
NODETYPE_RAIL_SIGNAL
Definition: SUMOXMLDefinitions.h:1054
Parameterised::getParametersMap
const std::map< std::string, std::string > & getParametersMap() const
Returns the inner key/value map.
Definition: Parameterised.cpp:105
NODETYPE_PRIORITY_STOP
Definition: SUMOXMLDefinitions.h:1057
NODETYPE_TRAFFIC_LIGHT_NOJUNCTION
Definition: SUMOXMLDefinitions.h:1052
GUIGlObject::buildNameCopyPopupEntry
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
Definition: GUIGlObject.cpp:226
MSJunction.h
GUIJunctionWrapper::getPopUpMenu
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
Definition: GUIJunctionWrapper.cpp:99
GUIJunctionWrapper::myAmWaterway
bool myAmWaterway
whether this junction has only waterways as incoming and outgoing edges
Definition: GUIJunctionWrapper.h:159
GUIPropertySchemeStorage::getScheme
T & getScheme()
Definition: GUIPropertySchemeStorage.h:80
GUIParameterTableWindow::mkItem
void mkItem(const char *name, bool dynamic, ValueSource< T > *src)
Adds a row which obtains its value from a ValueSource.
Definition: GUIParameterTableWindow.h:109
GUIGlobals.h
isWaterway
bool isWaterway(SVCPermissions permissions)
Returns whether an edge with the given permission is a waterway edge.
Definition: SUMOVehicleClass.cpp:370
PositionVector::closePolygon
void closePolygon()
ensures that the last position equals the first
Definition: PositionVector.cpp:1214
GUIGlObject::getGlID
GUIGlID getGlID() const
Returns the numerical id of the object.
Definition: GUIGlObject.cpp:150
Boundary
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:42
Boundary::getWidth
double getWidth() const
Returns the width of the boudary (x-axis)
Definition: Boundary.cpp:155
GUIVisualizationSettings::scale
double scale
information about a lane's width (temporary, used for a single view)
Definition: GUIVisualizationSettings.h:623
GUIApplicationWindow.h
GUIJunctionWrapper::getColorValue
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const
Definition: GUIJunctionWrapper.cpp:189
isRailway
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
Definition: SUMOVehicleClass.cpp:364
Position
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:39
Position::x
double x() const
Returns the x-position.
Definition: Position.h:57
GLHelper::drawFilledPolyTesselated
static void drawFilledPolyTesselated(const PositionVector &v, bool close)
Draws a filled polygon described by the list of points.
Definition: GLHelper.cpp:101
MSJunction::getType
SumoXMLNodeType getType() const
return the type of this Junction
Definition: MSJunction.h:127
MSTrafficLightLogic
The parent class for traffic light logics.
Definition: MSTrafficLightLogic.h:56
GUIJunctionWrapper::getParameterWindow
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
Definition: GUIJunctionWrapper.cpp:113
GUIVisualizationTextSettings::show
bool show
flag show
Definition: GUIVisualizationSettings.h:69
GUIGlObject
Definition: GUIGlObject.h:66
GUIVisualizationSettings::internalJunctionName
GUIVisualizationTextSettings internalJunctionName
Definition: GUIVisualizationSettings.h:560
NODETYPE_RAIL_CROSSING
Definition: SUMOXMLDefinitions.h:1055
MSJunction::getPosition
const Position & getPosition() const
Definition: MSJunction.cpp:69
NODETYPE_RIGHT_BEFORE_LEFT
Definition: SUMOXMLDefinitions.h:1058
GUIVisualizationSizeSettings::minSize
double minSize
The minimum size to draw this object.
Definition: GUIVisualizationSettings.h:104
NODETYPE_DEAD_END
Definition: SUMOXMLDefinitions.h:1064
NODETYPE_DISTRICT
Definition: SUMOXMLDefinitions.h:1061
DEG2RAD
#define DEG2RAD(x)
Definition: GeomHelper.h:38
GUIGlObject::buildPopupHeader
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
Definition: GUIGlObject.cpp:208
GUIJunctionWrapper::myJunction
MSJunction & myJunction
A reference to the represented junction.
Definition: GUIJunctionWrapper.h:147
GUIJunctionWrapper::myTLLID
const std::string myTLLID
the associated traffic light or ""
Definition: GUIJunctionWrapper.h:164
GLIncludes.h
Position.h
MSNet::getTLSControl
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition: MSNet.h:410
toString
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:48
MSNet::getInstance
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:168
GUIMainWindow
Definition: GUIMainWindow.h:47
Position::y
double y() const
Returns the y-position.
Definition: Position.h:62
GUIJunctionWrapper::~GUIJunctionWrapper
virtual ~GUIJunctionWrapper()
Destructor.
Definition: GUIJunctionWrapper.cpp:95
GUIGlObject::buildShowParamsPopupEntry
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
Definition: GUIGlObject.cpp:249
gSelected
GUISelectedStorage gSelected
A global holder of selected objects.
Definition: GUIGlobalSelection.cpp:34
GUIGlObject::buildCenterPopupEntry
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
Definition: GUIGlObject.cpp:217
GUIGlObject::buildPositionCopyEntry
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to copy the cursor position if geo projection is used,...
Definition: GUIGlObject.cpp:267
MSJunction::getShape
const PositionVector & getShape() const
Returns this junction's shape.
Definition: MSJunction.h:90
config.h
GeomHelper.h
GLO_JUNCTION
a junction
Definition: GUIGlObjectTypes.h:51
Boundary::grow
Boundary & grow(double by)
extends the boundary by the given amount
Definition: Boundary.cpp:301
GUIJunctionWrapper::myMaxSize
double myMaxSize
The maximum size (in either x-, or y-dimension) for determining whether to draw or not.
Definition: GUIJunctionWrapper.h:150
GUIVisualizationSettings::drawJunctionShape
bool drawJunctionShape
whether the shape of the junction should be drawn
Definition: GUIVisualizationSettings.h:565
MSLane.h
GUIVisualizationSettings
Stores the information about how to visualize structures.
Definition: GUIVisualizationSettings.h:346
GUIJunctionWrapper::myBoundary
Boundary myBoundary
The represented junction's boundary.
Definition: GUIJunctionWrapper.h:153
GUIPropertyScheme::getColor
const T getColor(const double value) const
Definition: GUIPropertyScheme.h:111
GUIJunctionWrapper::getCenteringBoundary
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
Definition: GUIJunctionWrapper.cpp:125
GUIPropertySchemeStorage::getActive
int getActive() const
Definition: GUIPropertySchemeStorage.h:76
GUIVisualizationSizeSettings::getExaggeration
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values
Definition: GUIVisualizationSettings.cpp:212
MSTrafficLightLogic::getCurrentPhaseDef
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
GUIJunctionWrapper::drawGL
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
Definition: GUIJunctionWrapper.cpp:133
GUIJunctionWrapper::myAmRailway
bool myAmRailway
whether this junction has only railways as incoming and outgoing edges
Definition: GUIJunctionWrapper.h:161
NODETYPE_NOJUNCTION
Definition: SUMOXMLDefinitions.h:1062
GUISelectedStorage::isSelected
bool isSelected(GUIGlObjectType type, GUIGlID id)
Returns the information whether the object with the given type and id is selected.
Definition: GUISelectedStorage.cpp:95
NODETYPE_TRAFFIC_LIGHT
Definition: SUMOXMLDefinitions.h:1051
MSPhaseDefinition::getName
const std::string & getName() const
Definition: MSPhaseDefinition.h:216