Eclipse SUMO - Simulation of Urban MObility
GUIBusStop.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 /****************************************************************************/
16 // A lane area vehicles can halt at (gui-version)
17 /****************************************************************************/
18 
19 
20 // ===========================================================================
21 // included modules
22 // ===========================================================================
23 #include <config.h>
24 
25 #include <string>
28 #include <utils/geom/Boundary.h>
29 #include <utils/gui/div/GLHelper.h>
30 #include <utils/common/ToString.h>
31 #include <microsim/MSNet.h>
32 #include <microsim/MSLane.h>
33 #include <microsim/MSEdge.h>
34 #include "GUINet.h"
35 #include "GUIEdge.h"
36 #include "GUIPerson.h"
37 #include "GUIBusStop.h"
40 #include <gui/GUIGlobals.h>
46 #include <utils/geom/GeomHelper.h>
47 #include <guisim/GUIBusStop.h>
49 
50 
51 
52 // ===========================================================================
53 // method definitions
54 // ===========================================================================
55 GUIBusStop::GUIBusStop(const std::string& id, const std::vector<std::string>& lines, MSLane& lane,
56  double frompos, double topos, const std::string name, int personCapacity) :
57  MSStoppingPlace(id, lines, lane, frompos, topos, name, personCapacity),
59  myPersonExaggeration(1) {
60  const double offsetSign = MSNet::getInstance()->lefthand() ? -1 : 1;
61  myWidth = MAX2(1.0, ceil(personCapacity / getPersonsAbreast()) * SUMO_const_waitingPersonDepth);
62  myFGShape = lane.getShape();
63  myFGShape.move2side((lane.getWidth() + myWidth) * 0.45 * offsetSign);
65  lane.interpolateLanePosToGeometryPos(frompos),
67  myFGShapeRotations.reserve(myFGShape.size() - 1);
68  myFGShapeLengths.reserve(myFGShape.size() - 1);
69  int e = (int) myFGShape.size() - 1;
70  for (int i = 0; i < e; ++i) {
71  const Position& f = myFGShape[i];
72  const Position& s = myFGShape[i + 1];
73  myFGShapeLengths.push_back(f.distanceTo(s));
74  myFGShapeRotations.push_back((double) atan2((s.x() - f.x()), (f.y() - s.y())) * (double) 180.0 / (double) M_PI);
75  }
77  tmp.move2side(myWidth / 2 * offsetSign);
78  myFGSignPos = tmp.getLineCenter();
79  myFGSignRot = 0;
80  if (tmp.length() != 0) {
82  myFGSignRot -= 90;
83  }
84 }
85 
86 
88 
89 
90 bool
91 GUIBusStop::addAccess(MSLane* lane, const double pos, const double length) {
92  bool added = MSStoppingPlace::addAccess(lane, pos, length);
93  if (added) {
94  myAccessCoords.push_back(lane->geometryPositionAtOffset(pos));
95  }
96  return added;
97 }
98 
99 
102  GUISUMOAbstractView& parent) {
103  GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, *this);
104  buildPopupHeader(ret, app);
109  buildPositionCopyEntry(ret, false);
110  return ret;
111 }
112 
113 
118  new GUIParameterTableWindow(app, *this, 7);
119  // add items
120  ret->mkItem("name", false, getMyName());
121  ret->mkItem("begin position [m]", false, myBegPos);
122  ret->mkItem("end position [m]", false, myEndPos);
123  ret->mkItem("person capacity [#]", false, myTransportableCapacity);
124  ret->mkItem("person number [#]", true, new FunctionBinding<GUIBusStop, int>(this, &MSStoppingPlace::getTransportableNumber));
125  ret->mkItem("stopped vehicles[#]", true, new FunctionBinding<GUIBusStop, int>(this, &MSStoppingPlace::getStoppedVehicleNumber));
126  ret->mkItem("last free pos[m]", true, new FunctionBinding<GUIBusStop, double>(this, &MSStoppingPlace::getLastFreePos));
127  // close building
128  ret->closeBuilding();
129  return ret;
130 }
131 
132 
133 void
135  glPushName(getGlID());
136  glPushMatrix();
137  // draw the area
138  glTranslated(0, 0, getType());
140  const double exaggeration = s.addSize.getExaggeration(s, this);
141  const double offset = myWidth * 0.5 * MAX2(0.0, exaggeration - 1);
142  GLHelper::drawBoxLines(myFGShape, myFGShapeRotations, myFGShapeLengths, myWidth * 0.5 * exaggeration, 0, offset);
143  // draw details unless zoomed out to far
144  if (s.drawDetail(s.detailSettings.stoppingPlaceDetails, exaggeration)) {
145  glPushMatrix();
146  // draw the lines
147  const double rotSign = MSNet::getInstance()->lefthand() ? 1 : -1;
148  // Iterate over every line
149  for (int i = 0; i < (int)myLines.size(); ++i) {
150  // push a new matrix for every line
151  glPushMatrix();
152  // traslate and rotate
153  glTranslated(myFGSignPos.x(), myFGSignPos.y(), 0);
154  glRotated(rotSign * myFGSignRot, 0, 0, 1);
155  // draw line
156  GLHelper::drawText(myLines[i].c_str(), Position(1.2, (double)i), .1, 1.f, s.colorSettings.busStop, 0, FONS_ALIGN_LEFT);
157  // pop matrix for every line
158  glPopMatrix();
159  }
160  for (std::vector<Position>::const_iterator i = myAccessCoords.begin(); i != myAccessCoords.end(); ++i) {
162  }
163  // draw the sign
164  glTranslated(myFGSignPos.x(), myFGSignPos.y(), 0);
165  int noPoints = 9;
166  if (s.scale * exaggeration > 25) {
167  noPoints = MIN2((int)(9.0 + (s.scale * exaggeration) / 10.0), 36);
168  }
169  glScaled(exaggeration, exaggeration, 1);
170  GLHelper::drawFilledCircle((double) 1.1, noPoints);
171  glTranslated(0, 0, .1);
173  GLHelper::drawFilledCircle((double) 0.9, noPoints);
174  if (s.drawDetail(s.detailSettings.stoppingPlaceText, exaggeration)) {
176  }
177  glPopMatrix();
178  }
179  if (s.addFullName.show && getMyName() != "") {
181  }
182  if (exaggeration > 1) {
184  }
185  glPopMatrix();
186  glPopName();
188 }
189 
190 
191 Boundary
195  for (const Position& p : myAccessCoords) {
196  b.add(p);
197  }
198  return b;
199 }
200 
201 const std::string
203  return myName;
204 }
205 
206 Position
209  if (myPersonExaggeration > 1) {
211  myLane.getWidth() / 2);
212  result = ref + (result - ref) * myPersonExaggeration;
213  }
214  return result;
215 }
216 
217 /****************************************************************************/
GUIGlObject::getType
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
Definition: GUIGlObject.cpp:180
GUIBusStop::~GUIBusStop
~GUIBusStop()
Destructor.
Definition: GUIBusStop.cpp:87
Boundary.h
GUIBusStop::getOptionalName
const std::string getOptionalName() const
Returns the street name.
Definition: GUIBusStop.cpp:202
GLO_MAX
empty max
Definition: GUIGlObjectTypes.h:165
ToString.h
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
MSStoppingPlace
A lane area vehicles can halt at.
Definition: MSStoppingPlace.h:59
GUIVisualizationColorSettings::busStop
static const RGBColor busStop
color for busStops
Definition: GUIVisualizationSettings.h:174
MIN2
T MIN2(T a, T b)
Definition: StdDefs.h:73
GUIParameterTableWindow
A window containing a gl-object's parameter.
Definition: GUIParameterTableWindow.h:62
MSStoppingPlace::myLines
std::vector< std::string > myLines
The list of lines that are assigned to this stop.
Definition: MSStoppingPlace.h:216
GUISUMOAbstractView
Definition: GUISUMOAbstractView.h:72
MSNet.h
GUIBusStop::myWidth
double myWidth
The visual width of the stoppling place.
Definition: GUIBusStop.h:151
GUIVisualizationDetailSettings::stoppingPlaceDetails
static const double stoppingPlaceDetails
details for stopping places
Definition: GUIVisualizationSettings.h:298
MSLane
Representation of a lane in the micro simulation.
Definition: MSLane.h:82
GUIVisualizationSettings::getTextAngle
double getTextAngle(double objectAngle) const
return an angle that is suitable for reading text aligned with the given angle (degrees)
Definition: GUIVisualizationSettings.cpp:1647
GUIParameterTableWindow.h
GUIBusStop::getWaitPosition
Position getWaitPosition(MSTransportable *person) const
Returns the next free waiting place for pedestrians / containers.
Definition: GUIBusStop.cpp:207
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
GUIGlObject::buildSelectionPopupEntry
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
Definition: GUIGlObject.cpp:235
GLHelper::drawBoxLines
static void drawBoxLines(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double width, int cornerDetail=0, double offset=0)
Draws thick lines.
Definition: GLHelper.cpp:182
GUIBusStop::drawGL
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
Definition: GUIBusStop.cpp:134
GUIPerson.h
PositionVector::getSubpart
PositionVector getSubpart(double beginOffset, double endOffset) const
get subpart of a position vector
Definition: PositionVector.cpp:706
MsgHandler.h
GUIGLObjectPopupMenu.h
GUIGlobalSelection.h
FONS_ALIGN_LEFT
Definition: fontstash.h:42
MSStoppingPlace::addAccess
virtual bool addAccess(MSLane *lane, const double pos, const double length)
adds an access point to this stop
Definition: MSStoppingPlace.cpp:271
SUMO_const_waitingPersonDepth
const double SUMO_const_waitingPersonDepth
Definition: StdDefs.h:57
SUMO_const_laneWidth
const double SUMO_const_laneWidth
Definition: StdDefs.h:49
RAD2DEG
#define RAD2DEG(x)
Definition: GeomHelper.h:38
PositionVector::length
double length() const
Returns the length.
Definition: PositionVector.cpp:484
MSEdge.h
GLHelper.h
GUIGlObject_AbstractAdd
Definition: GUIGlObject_AbstractAdd.h:39
MSTransportable
Definition: MSTransportable.h:58
GUINet.h
PositionVector
A list of positions.
Definition: PositionVector.h:45
GUIGLObjectPopupMenu
The popup menu of a globject.
Definition: GUIGLObjectPopupMenu.h:47
GUIBusStop::getParameterWindow
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
Definition: GUIBusStop.cpp:115
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
GUIAppEnum.h
MSStoppingPlace::myBegPos
const double myBegPos
The begin position this bus stop is located at.
Definition: MSStoppingPlace.h:225
MAX2
T MAX2(T a, T b)
Definition: StdDefs.h:79
GLHelper::drawFilledCircle
static void drawFilledCircle(double width, int steps=8)
Draws a filled circle around (0,0)
Definition: GLHelper.cpp:348
GLHelper::drawText
static void drawText(const std::string &text, const Position &pos, const double layer, const double size, const RGBColor &col=RGBColor::BLACK, const double angle=0, int align=0, double width=-1)
Definition: GLHelper.cpp:673
GUIVisualizationSettings::addName
GUIVisualizationTextSettings addName
Definition: GUIVisualizationSettings.h:591
GUIVisualizationSettings::detailSettings
GUIVisualizationDetailSettings detailSettings
detail settings
Definition: GUIVisualizationSettings.h:683
MSStoppingPlace::myName
const std::string myName
The name of the stopping place.
Definition: MSStoppingPlace.h:234
GUIBusStop::addAccess
bool addAccess(MSLane *lane, const double pos, const double length)
adds an access point to this stop
Definition: GUIBusStop.cpp:91
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
GUIBusStop::myAccessCoords
PositionVector myAccessCoords
The coordinates of access points.
Definition: GUIBusStop.h:154
MSNet::lefthand
bool lefthand() const
return whether the network was built for lefthand traffic
Definition: MSNet.h:663
MSStoppingPlace::myEndPos
const double myEndPos
The end position this bus stop is located at.
Definition: MSStoppingPlace.h:228
Position::distanceTo
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
Definition: Position.h:233
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
PositionVector::positionAtOffset
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
Definition: PositionVector.cpp:248
PositionVector::rotationDegreeAtOffset
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
Definition: PositionVector.cpp:319
GUIGlObject::getGlID
GUIGlID getGlID() const
Returns the numerical id of the object.
Definition: GUIGlObject.cpp:149
MSStoppingPlace::getStoppedVehicleNumber
int getStoppedVehicleNumber() const
Returns the number of stopped vehicles waiting on this stop.
Definition: MSStoppingPlace.h:168
Boundary
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:41
MSLane::interpolateLanePosToGeometryPos
double interpolateLanePosToGeometryPos(double lanePos) const
Definition: MSLane.h:498
GUIVisualizationSettings::scale
double scale
information about a lane's width (temporary, used for a single view)
Definition: GUIVisualizationSettings.h:632
GUIApplicationWindow.h
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
Boundary::add
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition: Boundary.cpp:78
GUIVisualizationSettings::addFullName
GUIVisualizationTextSettings addFullName
Definition: GUIVisualizationSettings.h:593
GUIVisualizationSettings::personSize
GUIVisualizationSizeSettings personSize
Definition: GUIVisualizationSettings.h:538
GUIBusStop::myFGSignRot
double myFGSignRot
The rotation of the sign.
Definition: GUIBusStop.h:148
GUIVisualizationTextSettings::show
bool show
flag show
Definition: GUIVisualizationSettings.h:68
GLO_BUS_STOP
a busStop
Definition: GUIGlObjectTypes.h:61
GUIBusStop::myPersonExaggeration
double myPersonExaggeration
The current person exaggeration.
Definition: GUIBusStop.h:157
GUIGlObject::buildPopupHeader
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
Definition: GUIGlObject.cpp:207
MSStoppingPlace::getMyName
const std::string & getMyName() const
Definition: MSStoppingPlace.cpp:265
GUIVisualizationSettings::colorSettings
GUIVisualizationColorSettings colorSettings
color settings
Definition: GUIVisualizationSettings.h:677
Position::angleTo2D
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position
Definition: Position.h:253
MSStoppingPlace::myTransportableCapacity
const int myTransportableCapacity
The number of transportables that can wait here.
Definition: MSStoppingPlace.h:237
Position::distanceTo2D
double distanceTo2D(const Position &p2) const
returns the euclidean distance in the x-y-plane
Definition: Position.h:243
GLIncludes.h
MSLane::getShape
const PositionVector & getShape() const
Returns this lane's shape.
Definition: MSLane.h:477
FunctionBinding.h
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
M_PI
#define M_PI
Definition: odrSpiral.cpp:40
GLHelper::drawBoxLine
static void drawBoxLine(const Position &beg, double rot, double visLength, double width, double offset=0)
Draws a thick line.
Definition: GLHelper.cpp:136
GUIVisualizationColorSettings::busStop_sign
static const RGBColor busStop_sign
color for busStops signs
Definition: GUIVisualizationSettings.h:177
GUIEdge.h
GUIGlObject::buildShowParamsPopupEntry
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
Definition: GUIGlObject.cpp:248
GUIBusStop::GUIBusStop
GUIBusStop(const std::string &id, const std::vector< std::string > &lines, MSLane &lane, double frompos, double topos, const std::string name, int personCapacity)
Constructor.
Definition: GUIBusStop.cpp:55
GUIBusStop::myFGShape
PositionVector myFGShape
The shape.
Definition: GUIBusStop.h:142
GUIVisualizationDetailSettings::stoppingPlaceText
static const double stoppingPlaceText
details for stopping place texts
Definition: GUIVisualizationSettings.h:301
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
MSStoppingPlace::getLastFreePos
double getLastFreePos() const
Definition: MSStoppingPlace.h:172
GUIBusStop::getPopUpMenu
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
Definition: GUIBusStop.cpp:101
MSLane::getWidth
double getWidth() const
Returns the lane's width.
Definition: MSLane.h:556
MSStoppingPlace::getTransportableNumber
int getTransportableNumber() const
Returns the number of transportables waiting on this stop.
Definition: MSStoppingPlace.h:158
config.h
GUIVisualizationSettings::addSize
GUIVisualizationSizeSettings addSize
Definition: GUIVisualizationSettings.h:589
GeomHelper.h
MSStoppingPlace::getWaitPosition
virtual Position getWaitPosition(MSTransportable *person) const
Returns the next free waiting place for pedestrians / containers.
Definition: MSStoppingPlace.cpp:143
Boundary::grow
Boundary & grow(double by)
extends the boundary by the given amount
Definition: Boundary.cpp:300
MSLane::geometryPositionAtOffset
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition: MSLane.h:504
GUIVisualizationSettings::drawDetail
bool drawDetail(const double detail, const double exaggeration) const
check if details can be drawn for the given GUIVisualizationDetailSettings and current scale and exxa...
Definition: GUIVisualizationSettings.cpp:1669
GUIBusStop::myFGSignPos
Position myFGSignPos
The position of the sign.
Definition: GUIBusStop.h:145
GUIBusStop::myFGShapeRotations
std::vector< double > myFGShapeRotations
The rotations of the shape parts.
Definition: GUIBusStop.h:136
MSStoppingPlace::getPersonsAbreast
int getPersonsAbreast() const
Definition: MSStoppingPlace.cpp:138
MSLane.h
GUIVisualizationSettings
Stores the information about how to visualize structures.
Definition: GUIVisualizationSettings.h:345
FunctionBinding
Definition: FunctionBinding.h:40
PositionVector::getLineCenter
Position getLineCenter() const
get line center
Definition: PositionVector.cpp:474
GUIBusStop.h
GUIBusStop::myFGShapeLengths
std::vector< double > myFGShapeLengths
The lengths of the shape parts.
Definition: GUIBusStop.h:139
PositionVector.h
MSStoppingPlace::myLane
const MSLane & myLane
The lane this bus stop is located at.
Definition: MSStoppingPlace.h:222
GUIBusStop::getCenteringBoundary
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
Definition: GUIBusStop.cpp:192
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
PositionVector::move2side
void move2side(double amount, double maxExtension=100)
move position vector to side using certain ammount
Definition: PositionVector.cpp:1103
fontstash.h