SUMO - Simulation of Urban MObility
GUIParkingArea.cpp
Go to the documentation of this file.
1 /****************************************************************************/
8 // A area where vehicles can park next to the road (gui version)
9 /****************************************************************************/
10 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
11 // Copyright (C) 2001-2017 DLR (http://www.dlr.de/) and contributors
12 /****************************************************************************/
13 //
14 // This file is part of SUMO.
15 // SUMO is free software: you can redistribute it and/or modify
16 // it under the terms of the GNU General Public License as published by
17 // the Free Software Foundation, either version 3 of the License, or
18 // (at your option) any later version.
19 //
20 /****************************************************************************/
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 #ifdef _MSC_VER
27 #include <windows_config.h>
28 #else
29 #include <config.h>
30 #endif
31 
32 #include <string>
35 #include <utils/geom/Boundary.h>
36 #include <utils/gui/div/GLHelper.h>
37 #include <utils/common/ToString.h>
38 #include <microsim/MSNet.h>
39 #include <microsim/MSLane.h>
40 #include <microsim/MSEdge.h>
41 #include "GUINet.h"
42 #include "GUIEdge.h"
43 #include "GUIContainer.h"
44 #include "GUIParkingArea.h"
47 #include <gui/GUIGlobals.h>
53 #include <utils/geom/GeomHelper.h>
54 #include <guisim/GUIParkingArea.h>
55 #include <guisim/GUIVehicle.h>
57 
58 
59 // ===========================================================================
60 // method definitions
61 // ===========================================================================
62 GUIParkingArea::GUIParkingArea(const std::string& id, const std::vector<std::string>& lines, MSLane& lane,
63  double frompos, double topos, unsigned int capacity,
64  double width, double length, double angle) :
65  MSParkingArea(id, lines, lane, frompos, topos, capacity, width, length, angle),
66  GUIGlObject_AbstractAdd("parkingArea", GLO_TRIGGER, id) {
67  const double offsetSign = MSNet::getInstance()->lefthand() ? -1 : 1;
68  myShapeRotations.reserve(myShape.size() - 1);
69  myShapeLengths.reserve(myShape.size() - 1);
70  int e = (int) myShape.size() - 1;
71  for (int i = 0; i < e; ++i) {
72  const Position& f = myShape[i];
73  const Position& s = myShape[i + 1];
74  myShapeLengths.push_back(f.distanceTo(s));
75  myShapeRotations.push_back((double) atan2((s.x() - f.x()), (f.y() - s.y())) * (double) 180.0 / (double) M_PI);
76  }
77  PositionVector tmp = myShape;
78  tmp.move2side((lane.getWidth() + myWidth) * offsetSign);
79  mySignPos = tmp.getLineCenter();
80  mySignRot = 0;
81  if (tmp.length() != 0) {
83  mySignRot -= 90;
84  }
85 }
86 
88 
89 
92  GUISUMOAbstractView& parent) {
93  GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, *this);
94  buildPopupHeader(ret, app);
99  buildPositionCopyEntry(ret, false);
100  return ret;
101 }
102 
103 
108  new GUIParameterTableWindow(app, *this, 4);
109  // add items
110  ret->mkItem("begin position [m]", false, myBegPos);
111  ret->mkItem("end position [m]", false, myEndPos);
112  ret->mkItem("occupancy [#]", true, getOccupancy());
113  ret->mkItem("capacity [#]", false, getCapacity());
114  // close building
115  ret->closeBuilding();
116  return ret;
117 }
118 
119 
120 void
122  glPushName(getGlID());
123  glPushMatrix();
124  RGBColor grey(177, 184, 186, 171);
125  RGBColor blue(83, 89, 172, 255);
126  RGBColor red(255, 0, 0, 255);
127  RGBColor green(0, 255, 0, 255);
128  // draw the area
129  glTranslated(0, 0, getType());
130  GLHelper::setColor(blue);
132  // draw details unless zoomed out to far
133  const double exaggeration = s.addSize.getExaggeration(s);
134  if (s.scale * exaggeration >= 10) {
135  // draw the lots
136  glTranslated(0, 0, .1);
137  std::map<unsigned int, LotSpaceDefinition >::const_iterator i;
138  for (i = mySpaceOccupancies.begin(); i != mySpaceOccupancies.end(); i++) {
139  glPushMatrix();
140  glTranslated((*i).second.myPosition.x(), (*i).second.myPosition.y(), (*i).second.myPosition.z());
141  glRotated((*i).second.myRotation, 0, 0, 1);
142  Position pos = (*i).second.myPosition;
143  PositionVector geom;
144  double w = (*i).second.myWidth / 2.;
145  double h = (*i).second.myLength;
146  geom.push_back(Position(- w, + 0, 0.));
147  geom.push_back(Position(+ w, + 0, 0.));
148  geom.push_back(Position(+ w, + h, 0.));
149  geom.push_back(Position(- w, + h, 0.));
150  geom.push_back(Position(- w, + 0, 0.));
151  /*
152  geom.push_back(Position(pos.x(), pos.y(), pos.z()));
153  geom.push_back(Position(pos.x() + (*l).second.myWidth, pos.y(), pos.z()));
154  geom.push_back(Position(pos.x() + (*l).second.myWidth, pos.y() - (*l).second.myLength, pos.z()));
155  geom.push_back(Position(pos.x(), pos.y() - (*l).second.myLength, pos.z()));
156  geom.push_back(Position(pos.x(), pos.y(), pos.z()));
157  */
158  GLHelper::setColor((*i).second.vehicle == 0 ? green : red);
159  GLHelper::drawBoxLines(geom, 0.1);
160  glPopMatrix();
161  }
162  GLHelper::setColor(blue);
163  // draw the lines
164  for (size_t i = 0; i != myLines.size(); ++i) {
165  glPushMatrix();
166  glTranslated(mySignPos.x(), mySignPos.y(), 0);
167  glRotated(180, 1, 0, 0);
168  glRotated(mySignRot, 0, 0, 1);
169  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
170  pfSetPosition(0, 0);
171  pfSetScale(1.f);
172  glScaled(exaggeration, exaggeration, 1);
173  glTranslated(1.2, -(double)i, 0);
174  pfDrawString(myLines[i].c_str());
175  glPopMatrix();
176  }
177  // draw the sign
178  glTranslated(mySignPos.x(), mySignPos.y(), 0);
179  int noPoints = 9;
180  if (s.scale * exaggeration > 25) {
181  noPoints = MIN2((int)(9.0 + (s.scale * exaggeration) / 10.0), 36);
182  }
183  glScaled(exaggeration, exaggeration, 1);
184  GLHelper::drawFilledCircle((double) 1.1, noPoints);
185  glTranslated(0, 0, .1);
186  GLHelper::setColor(grey);
187  GLHelper::drawFilledCircle((double) 0.9, noPoints);
188  if (s.scale * exaggeration >= 4.5) {
189  GLHelper::drawText("P", Position(), .1, 1.6 * exaggeration, blue, mySignRot);
190  }
191  }
192  glPopMatrix();
193  glPopName();
194  drawName(getCenteringBoundary().getCenter(), s.scale, s.addName);
195  for (std::vector<MSTransportable*>::const_iterator i = myWaitingTransportables.begin(); i != myWaitingTransportables.end(); ++i) {
196  glTranslated(0, 1, 0); // make multiple containers viewable
197  static_cast<GUIContainer*>(*i)->drawGL(s);
198  }
199  // draw parking vehicles (their lane might not be within drawing range. if it is, they are drawn twice)
201  for (std::set<const MSVehicle*>::const_iterator v = myLane.getParkingVehicles().begin(); v != myLane.getParkingVehicles().end(); ++v) {
202  static_cast<const GUIVehicle* const>(*v)->drawGL(s);
203  }
205 
206 }
207 
208 
209 Boundary
212  for (std::map<unsigned int, LotSpaceDefinition >::const_iterator i = mySpaceOccupancies.begin(); i != mySpaceOccupancies.end(); i++) {
213  b.add((*i).second.myPosition);
214  }
215  b.grow(20);
216  return b;
217 }
218 
219 
220 
221 /****************************************************************************/
222 
A lane area vehicles can halt at.
Definition: MSParkingArea.h:66
int getCapacity() const
Returns the area capacity.
int getOccupancy() const
Returns the area occupancy.
int pfDrawString(const char *c)
Definition: polyfonts.c:1074
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0) const
draw name of item
bool lefthand() const
return whether the network was built for lefthand traffic
Definition: MSNet.h:688
a lane speed trigger,
double getWidth() const
Returns the lane&#39;s width.
Definition: MSLane.h:500
double scale
information about a lane&#39;s width (temporary, used for a single view)
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
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:172
GUIVisualizationTextSettings addName
std::vector< MSTransportable * > myWaitingTransportables
Persons waiting at this stop.
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
Definition: MSLane.h:406
void pfSetScale(double s)
Definition: polyfonts.c:465
const double myEndPos
The end position this bus stop is located at.
double x() const
Returns the x-position.
Definition: Position.h:63
Stores the information about how to visualize structures.
GUIParkingArea(const std::string &id, const std::vector< std::string > &lines, MSLane &lane, double frompos, double topos, unsigned int capacity, double width, double length, double angle)
Constructor.
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:169
void pfSetPosition(double x, double y)
Definition: polyfonts.c:480
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
static void drawFilledCircle(double width, int steps=8)
Draws a filled circle around (0,0)
Definition: GLHelper.cpp:339
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to copy the cursor position if geo projection is used, also builds an entry for copying the geo-position.
GUIGlID getGlID() const
Returns the numerical id of the object.
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:48
const std::set< const MSVehicle * > & getParkingVehicles() const
retrieve the parking vehicles (see GUIParkingArea)
Definition: MSLane.h:988
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
Definition: MSLane.h:379
const MSLane & myLane
The lane this bus stop is located at.
GUIVisualizationSizeSettings addSize
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
std::vector< double > myShapeLengths
The lengths of the shape parts.
double getExaggeration(const GUIVisualizationSettings &s, double factor=20) const
return the drawing size including exaggeration and constantSize values
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition: GLHelper.cpp:438
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:46
A list of positions.
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
std::vector< double > myShapeRotations
The rotations of the shape parts.
PositionVector myShape
The roadside shape of this parkingArea.
double y() const
Returns the y-position.
Definition: Position.h:68
double length() const
Returns the length.
T MIN2(T a, T b)
Definition: StdDefs.h:68
Boundary & grow(double by)
extends the boundary by the given amount
Definition: Boundary.cpp:302
void move2side(double amount)
move position vector to side using certain ammount
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
Definition: Position.h:240
const double myBegPos
The begin position this bus stop is located at.
#define M_PI
Definition: odrSpiral.cpp:40
The popup menu of a globject.
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
Position getLineCenter() const
get line center
~GUIParkingArea()
Destructor.
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)
draw Text with given parameters
Definition: GLHelper.cpp:455
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition: Boundary.cpp:86
std::map< unsigned int, LotSpaceDefinition > mySpaceOccupancies
A map from objects (vehicles) to the areas they acquire after entering the stop.
std::vector< std::string > myLines
The list of lines that are assigned to this stop.
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
void mkItem(const char *name, bool dynamic, ValueSource< unsigned > *src)
Adds a row which obtains its value from an unsigned-ValueSource.
double myWidth
The default width of each parking space.
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
Representation of a lane in the micro simulation.
Definition: MSLane.h:79
A window containing a gl-object&#39;s parameter.
Position mySignPos
The position of the sign.
double mySignRot
The rotation of the sign.
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
A MSVehicle extended by some values for usage within the gui.
Definition: GUIVehicle.h:61