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 /****************************************************************************/
18 // }
19 /****************************************************************************/
20 
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #include <config.h>
26 
27 #include <string>
28 #include <utility>
29 #ifdef HAVE_OSG
30 #include <osg/Geometry>
31 #endif
32 #include <microsim/MSLane.h>
33 #include <microsim/MSEdge.h>
34 #include <microsim/MSJunction.h>
35 #include <utils/geom/Position.h>
36 #include <utils/geom/GeomHelper.h>
37 #include <microsim/MSNet.h>
42 #include <gui/GUIGlobals.h>
45 #include "GUIJunctionWrapper.h"
49 #include <utils/gui/div/GLHelper.h>
51 
52 //#define GUIJunctionWrapper_DEBUG_DRAW_NODE_SHAPE_VERTICES
53 
54 // ===========================================================================
55 // method definitions
56 // ===========================================================================
57 GUIJunctionWrapper::GUIJunctionWrapper(MSJunction& junction, const std::string& tllID):
58  GUIGlObject(GLO_JUNCTION, junction.getID()),
59  myJunction(junction),
60  myTLLID(tllID) {
61  if (myJunction.getShape().size() == 0) {
63  myBoundary = Boundary(pos.x() - 1., pos.y() - 1., pos.x() + 1., pos.y() + 1.);
64  } else {
66  }
69  myAmWaterway = myJunction.getIncoming().size() + myJunction.getOutgoing().size() > 0;
70  myAmRailway = myJunction.getIncoming().size() + myJunction.getOutgoing().size() > 0;
71  for (auto it = myJunction.getIncoming().begin(); it != myJunction.getIncoming().end() && (myAmWaterway || myAmRailway); ++it) {
72  if (!(*it)->isInternal()) {
73  if (!isWaterway((*it)->getPermissions())) {
74  myAmWaterway = false;
75  }
76  if (!isRailway((*it)->getPermissions())) {
77  myAmRailway = false;
78  }
79  }
80  }
81  for (auto it = myJunction.getOutgoing().begin(); it != myJunction.getOutgoing().end() && (myAmWaterway || myAmRailway); ++it) {
82  if (!(*it)->isInternal()) {
83  if (!isWaterway((*it)->getPermissions())) {
84  myAmWaterway = false;
85  }
86  if (!isRailway((*it)->getPermissions())) {
87  myAmRailway = false;
88  }
89  }
90  }
91 }
92 
93 
95 
96 
99  GUISUMOAbstractView& parent) {
100  GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, *this);
101  buildPopupHeader(ret, app);
106  buildPositionCopyEntry(ret, false);
107  return ret;
108 }
109 
110 
114  new GUIParameterTableWindow(app, *this, 12 + (int)myJunction.getParametersMap().size());
115  // add items
116  ret->mkItem("type", false, toString(myJunction.getType()));
117  // close building
118  ret->closeBuilding(&myJunction);
119  return ret;
120 }
121 
122 
123 Boundary
125  Boundary b = myBoundary;
126  b.grow(1);
127  return b;
128 }
129 
130 const std::string
132  return myJunction.getParameter("name", "");
133 }
134 
135 void
137  if (!myIsInternal && s.drawJunctionShape) {
138  // check whether it is not too small
139  const double exaggeration = s.junctionSize.getExaggeration(s, this, 4);
140  if (s.scale * exaggeration >= s.junctionSize.minSize) {
141  glPushMatrix();
142  glPushName(getGlID());
143  const double colorValue = getColorValue(s, s.junctionColorer.getActive());
144  const RGBColor color = s.junctionColorer.getScheme().getColor(colorValue);
145  GLHelper::setColor(color);
146 
147  // recognize full transparency and simply don't draw
148  if (color.alpha() != 0) {
150  shape.closePolygon();
151  if (exaggeration > 1) {
152  shape.scaleRelative(exaggeration);
153  }
154  glTranslated(0, 0, getType());
155  if (s.scale * myMaxSize < 40.) {
156  GLHelper::drawFilledPoly(shape, true);
157  } else {
159  }
160 #ifdef GUIJunctionWrapper_DEBUG_DRAW_NODE_SHAPE_VERTICES
161  GLHelper::debugVertices(shape, 80 / s.scale);
162 #endif
163  // make small junctions more visible when coloring by type
165  glTranslated(myJunction.getPosition().x(), myJunction.getPosition().y(), getType() + 0.05);
166  GLHelper::drawFilledCircle(2 * exaggeration, 12);
167  }
168  }
169  glPopName();
170  glPopMatrix();
171  }
172  }
173  if (myIsInternal) {
175  } else {
177  if (s.tlsPhaseIndex.show && myTLLID != "") {
179  const int index = active->getCurrentPhaseIndex();
180  const std::string& name = active->getCurrentPhaseDef().getName();
182  if (name != "") {
183  const Position offset = Position(0, 0.8 * s.tlsPhaseIndex.scaledSize(s.scale)).rotateAround2D(DEG2RAD(-s.angle), Position(0, 0));
185  }
186  }
187  }
188 }
189 
190 
191 double
192 GUIJunctionWrapper::getColorValue(const GUIVisualizationSettings& /* s */, int activeScheme) const {
193  switch (activeScheme) {
194  case 0:
195  if (myAmWaterway) {
196  return 1;
197  } else if (myAmRailway && MSNet::getInstance()->hasInternalLinks()) {
198  return 2;
199  } else {
200  return 0;
201  }
202  case 1:
203  return gSelected.isSelected(getType(), getGlID()) ? 1 : 0;
204  case 2:
205  switch (myJunction.getType()) {
207  return 0;
209  return 1;
210  case NODETYPE_PRIORITY:
211  return 2;
213  return 3;
215  return 4;
217  return 5;
218  case NODETYPE_DISTRICT:
219  return 6;
220  case NODETYPE_NOJUNCTION:
221  return 7;
222  case NODETYPE_DEAD_END:
224  return 8;
225  case NODETYPE_UNKNOWN:
226  case NODETYPE_INTERNAL:
227  assert(false);
228  return 8;
230  return 9;
231  case NODETYPE_ZIPPER:
232  return 10;
234  return 11;
236  return 12;
237  }
238  case 3:
239  return myJunction.getPosition().z();
240  default:
241  assert(false);
242  return 0;
243  }
244 }
245 
246 #ifdef HAVE_OSG
247 void
248 GUIJunctionWrapper::updateColor(const GUIVisualizationSettings& s) {
249  const double colorValue = getColorValue(s, s.junctionColorer.getActive());
250  const RGBColor& col = s.junctionColorer.getScheme().getColor(colorValue);
251  osg::Vec4ubArray* colors = dynamic_cast<osg::Vec4ubArray*>(myGeom->getColorArray());
252  (*colors)[0].set(col.red(), col.green(), col.blue(), col.alpha());
253  myGeom->setColorArray(colors);
254 }
255 #endif
256 
257 
258 /****************************************************************************/
259 
GUIGlObject::getType
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
Definition: GUIGlObject.cpp:180
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:808
NODETYPE_PRIORITY
Definition: SUMOXMLDefinitions.h:1061
NODETYPE_TRAFFIC_LIGHT_RIGHT_ON_RED
Definition: SUMOXMLDefinitions.h:1058
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:706
NODETYPE_ZIPPER
Definition: SUMOXMLDefinitions.h:1065
GUIParameterTableWindow
A window containing a gl-object's parameter.
Definition: GUIParameterTableWindow.h:62
GUISUMOAbstractView
Definition: GUISUMOAbstractView.h:72
MSTLLogicControl.h
NODETYPE_DEAD_END_DEPRECATED
Definition: SUMOXMLDefinitions.h:1070
MSNet.h
GUIVisualizationSettings::junctionSize
GUIVisualizationSizeSettings junctionSize
Definition: GUIVisualizationSettings.h:578
GUIVisualizationSettings::tlsPhaseIndex
GUIVisualizationTextSettings tlsPhaseIndex
Definition: GUIVisualizationSettings.h:569
GUIParameterTableWindow.h
MSJunction
The base class for an intersection.
Definition: MSJunction.h:60
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:354
GUIVisualizationSettings::angle
double angle
The current view rotation angle.
Definition: GUIVisualizationSettings.h:405
Position::z
double z() const
Returns the z-position.
Definition: Position.h:66
GUIGlObject::buildSelectionPopupEntry
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
Definition: GUIGlObject.cpp:235
GUIGLObjectPopupMenu.h
GUIGlobalSelection.h
GUIJunctionWrapper::myIsInternal
bool myIsInternal
whether this wraps an instance of MSInternalJunction
Definition: GUIJunctionWrapper.h:157
PositionVector::scaleRelative
void scaleRelative(double factor)
enlarges/shrinks the polygon by a factor based at the centroid
Definition: PositionVector.cpp:456
NODETYPE_INTERNAL
Definition: SUMOXMLDefinitions.h:1068
MSTrafficLightLogic::getCurrentPhaseIndex
virtual int getCurrentPhaseIndex() const =0
Returns the current index within the program.
NODETYPE_UNKNOWN
Definition: SUMOXMLDefinitions.h:1055
Boundary::getHeight
double getHeight() const
Returns the height of the boundary (y-axis)
Definition: Boundary.cpp:160
GUIJunctionWrapper::GUIJunctionWrapper
GUIJunctionWrapper(MSJunction &junction, const std::string &tllID)
Constructor.
Definition: GUIJunctionWrapper.cpp:57
MSEdge.h
GLHelper.h
GUIJunctionWrapper.h
MSInternalJunction.h
PositionVector
A list of positions.
Definition: PositionVector.h:45
GUIGLObjectPopupMenu
The popup menu of a globject.
Definition: GUIGLObjectPopupMenu.h:47
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:621
PositionVector::getBoxBoundary
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
Definition: PositionVector.cpp:390
GUIParameterTableWindow::closeBuilding
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
Definition: GUIParameterTableWindow.cpp:219
MSJunction::getIncoming
const ConstMSEdgeVector & getIncoming() const
Definition: MSJunction.h:101
MSTLLogicControl::getActive
MSTrafficLightLogic * getActive(const std::string &id) const
Returns the active program of a named tls.
Definition: MSTLLogicControl.cpp:663
GUIVisualizationTextSettings::scaledSize
double scaledSize(double scale, double constFactor=0.1) const
get scale size
Definition: GUIVisualizationSettings.cpp:195
Parameterised::getParameter
const std::string getParameter(const std::string &key, const std::string &defaultValue="") const
Returns the value for a given key.
Definition: Parameterised.cpp:72
MSJunction::getOutgoing
const ConstMSEdgeVector & getOutgoing() const
Definition: MSJunction.h:107
GUIVisualizationSettings::junctionName
GUIVisualizationTextSettings junctionName
Definition: GUIVisualizationSettings.h:569
GUIAppEnum.h
GUIVisualizationSettings::junctionColorer
GUIColorer junctionColorer
The junction colorer.
Definition: GUIVisualizationSettings.h:566
MAX2
T MAX2(T a, T b)
Definition: StdDefs.h:79
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:39
NODETYPE_ALLWAY_STOP
Definition: SUMOXMLDefinitions.h:1064
NODETYPE_RAIL_SIGNAL
Definition: SUMOXMLDefinitions.h:1059
Parameterised::getParametersMap
const std::map< std::string, std::string > & getParametersMap() const
Returns the inner key/value map.
Definition: Parameterised.cpp:106
NODETYPE_PRIORITY_STOP
Definition: SUMOXMLDefinitions.h:1062
NODETYPE_TRAFFIC_LIGHT_NOJUNCTION
Definition: SUMOXMLDefinitions.h:1057
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:225
MSJunction.h
GUIJunctionWrapper::getPopUpMenu
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
Definition: GUIJunctionWrapper.cpp:98
GUIJunctionWrapper::myAmWaterway
bool myAmWaterway
whether this junction has only waterways as incoming and outgoing edges
Definition: GUIJunctionWrapper.h:160
GUIPropertySchemeStorage::getScheme
T & getScheme()
Definition: GUIPropertySchemeStorage.h:79
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:108
GUIGlobals.h
isWaterway
bool isWaterway(SVCPermissions permissions)
Returns whether an edge with the given permission is a waterway edge.
Definition: SUMOVehicleClass.cpp:369
PositionVector::closePolygon
void closePolygon()
ensures that the last position equals the first
Definition: PositionVector.cpp:1231
GUIGlObject::getGlID
GUIGlID getGlID() const
Returns the numerical id of the object.
Definition: GUIGlObject.cpp:149
Boundary
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:41
Boundary::getWidth
double getWidth() const
Returns the width of the boudary (x-axis)
Definition: Boundary.cpp:154
GUIVisualizationSettings::scale
double scale
information about a lane's width (temporary, used for a single view)
Definition: GUIVisualizationSettings.h:632
GUIApplicationWindow.h
GUIJunctionWrapper::getColorValue
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const
Definition: GUIJunctionWrapper.cpp:192
isRailway
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
Definition: SUMOVehicleClass.cpp:363
Position
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:38
Position::x
double x() const
Returns the x-position.
Definition: Position.h:56
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:126
MSTrafficLightLogic
The parent class for traffic light logics.
Definition: MSTrafficLightLogic.h:55
GUIJunctionWrapper::getParameterWindow
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
Definition: GUIJunctionWrapper.cpp:112
GUIVisualizationTextSettings::show
bool show
flag show
Definition: GUIVisualizationSettings.h:68
GUIGlObject
Definition: GUIGlObject.h:65
GUIVisualizationSettings::internalJunctionName
GUIVisualizationTextSettings internalJunctionName
Definition: GUIVisualizationSettings.h:569
NODETYPE_RAIL_CROSSING
Definition: SUMOXMLDefinitions.h:1060
MSJunction::getPosition
const Position & getPosition() const
Definition: MSJunction.cpp:68
NODETYPE_RIGHT_BEFORE_LEFT
Definition: SUMOXMLDefinitions.h:1063
GUIVisualizationSizeSettings::minSize
double minSize
The minimum size to draw this object.
Definition: GUIVisualizationSettings.h:103
NODETYPE_DEAD_END
Definition: SUMOXMLDefinitions.h:1069
NODETYPE_DISTRICT
Definition: SUMOXMLDefinitions.h:1066
DEG2RAD
#define DEG2RAD(x)
Definition: GeomHelper.h:37
GUIGlObject::buildPopupHeader
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
Definition: GUIGlObject.cpp:207
GUIJunctionWrapper::myJunction
MSJunction & myJunction
A reference to the represented junction.
Definition: GUIJunctionWrapper.h:148
GUIJunctionWrapper::myTLLID
const std::string myTLLID
the associated traffic light or ""
Definition: GUIJunctionWrapper.h:165
GLIncludes.h
Position.h
MSNet::getTLSControl
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition: MSNet.h:409
toString
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:47
MSNet::getInstance
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:167
GUIMainWindow
Definition: GUIMainWindow.h:46
Position::y
double y() const
Returns the y-position.
Definition: Position.h:61
GUIJunctionWrapper::~GUIJunctionWrapper
virtual ~GUIJunctionWrapper()
Destructor.
Definition: GUIJunctionWrapper.cpp:94
GUIGlObject::buildShowParamsPopupEntry
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
Definition: GUIGlObject.cpp:248
gSelected
GUISelectedStorage gSelected
A global holder of selected objects.
Definition: GUIGlobalSelection.cpp:33
GUIGlObject::buildCenterPopupEntry
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
Definition: GUIGlObject.cpp:216
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:266
MSJunction::getShape
const PositionVector & getShape() const
Returns this junction's shape.
Definition: MSJunction.h:89
config.h
GeomHelper.h
GLO_JUNCTION
a junction
Definition: GUIGlObjectTypes.h:50
Boundary::grow
Boundary & grow(double by)
extends the boundary by the given amount
Definition: Boundary.cpp:300
GUIJunctionWrapper::myMaxSize
double myMaxSize
The maximum size (in either x-, or y-dimension) for determining whether to draw or not.
Definition: GUIJunctionWrapper.h:151
GUIVisualizationSettings::drawJunctionShape
bool drawJunctionShape
whether the shape of the junction should be drawn
Definition: GUIVisualizationSettings.h:574
MSLane.h
GUIVisualizationSettings
Stores the information about how to visualize structures.
Definition: GUIVisualizationSettings.h:345
GUIJunctionWrapper::getOptionalName
const std::string getOptionalName() const
Returns the value for generic parameter 'name' or ''.
Definition: GUIJunctionWrapper.cpp:131
GUIJunctionWrapper::myBoundary
Boundary myBoundary
The represented junction's boundary.
Definition: GUIJunctionWrapper.h:154
GUIPropertyScheme::getColor
const T getColor(const double value) const
Definition: GUIPropertyScheme.h:110
GUIJunctionWrapper::getCenteringBoundary
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
Definition: GUIJunctionWrapper.cpp:124
GUIPropertySchemeStorage::getActive
int getActive() const
Definition: GUIPropertySchemeStorage.h:75
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:136
GUIJunctionWrapper::myAmRailway
bool myAmRailway
whether this junction has only railways as incoming and outgoing edges
Definition: GUIJunctionWrapper.h:162
NODETYPE_NOJUNCTION
Definition: SUMOXMLDefinitions.h:1067
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:94
NODETYPE_TRAFFIC_LIGHT
Definition: SUMOXMLDefinitions.h:1056
MSPhaseDefinition::getName
const std::string & getName() const
Definition: MSPhaseDefinition.h:215