SUMO - Simulation of Urban MObility
GUIParkingArea.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-2017 German Aerospace Center (DLR) and others.
4 /****************************************************************************/
5 //
6 // This program and the accompanying materials
7 // are made available under the terms of the Eclipse Public License v2.0
8 // which accompanies this distribution, and is available at
9 // http://www.eclipse.org/legal/epl-v20.html
10 //
11 /****************************************************************************/
18 // A area where vehicles can park next to the road (gui version)
19 /****************************************************************************/
20 
21 
22 // ===========================================================================
23 // included modules
24 // ===========================================================================
25 #ifdef _MSC_VER
26 #include <windows_config.h>
27 #else
28 #include <config.h>
29 #endif
30 
31 #include <string>
34 #include <utils/geom/Boundary.h>
35 #include <utils/gui/div/GLHelper.h>
36 #include <utils/common/ToString.h>
37 #include <microsim/MSNet.h>
38 #include <microsim/MSLane.h>
39 #include <microsim/MSEdge.h>
40 #include "GUINet.h"
41 #include "GUIEdge.h"
42 #include "GUIContainer.h"
43 #include "GUIParkingArea.h"
46 #include <gui/GUIGlobals.h>
51 #include <utils/geom/GeomHelper.h>
52 #include <guisim/GUIParkingArea.h>
53 #include <guisim/GUIVehicle.h>
56 
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 >= 1) {
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. - 0.1 * exaggeration;
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 * exaggeration);
160  glPopMatrix();
161  }
162  GLHelper::setColor(blue);
163  // draw the lines
164  for (size_t i = 0; i != myLines.size(); ++i) {
165  // push a new matrix for every line
166  glPushMatrix();
167  // traslate and rotate
168  glTranslated(mySignPos.x(), mySignPos.y(), 0);
169  glRotated(180, 1, 0, 0);
170  glRotated(mySignRot, 0, 0, 1);
171  // draw line
172  GLHelper::drawText(myLines[i].c_str(), Position(1.2, (double)i), .1, 1.f, RGBColor(76, 170, 50), 0, FONS_ALIGN_LEFT);
173  // pop matrix for every line
174  glPopMatrix();
175 
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, 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:65
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
a lane speed trigger,
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:183
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.
const double myEndPos
The end position this bus stop is located at.
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.
double y() const
Returns the y-position.
Definition: Position.h:67
double x() const
Returns the x-position.
Definition: Position.h:62
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
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:487
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:167
virtual const VehCont & getVehiclesSecure() const
Returns the vehicles container; locks it for microsimulation.
Definition: MSLane.h:392
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:350
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.
double getWidth() const
Returns the lane&#39;s width.
Definition: MSLane.h:513
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:47
Position getLineCenter() const
get line center
const MSLane & myLane
The lane this bus stop is located at.
GUIVisualizationSizeSettings addSize
std::vector< double > myShapeLengths
The lengths of the shape parts.
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition: GLHelper.cpp:449
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:45
A list of positions.
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.
int getCapacity() const
Returns the area capacity.
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
T MIN2(T a, T b)
Definition: StdDefs.h:67
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0) const
draw name of item
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
Boundary & grow(double by)
extends the boundary by the given amount
Definition: Boundary.cpp:301
bool lefthand() const
return whether the network was built for lefthand traffic
Definition: MSNet.h:597
int getOccupancy() const
Returns the area occupancy.
void move2side(double amount)
move position vector to side using certain ammount
const double myBegPos
The begin position this bus stop is located at.
double length() const
Returns the length.
#define M_PI
Definition: odrSpiral.cpp:40
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
The popup menu of a globject.
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
const std::set< const MSVehicle * > & getParkingVehicles() const
retrieve the parking vehicles (see GUIParkingArea)
Definition: MSLane.h:1016
GUIGlID getGlID() const
Returns the numerical id of the object.
double getExaggeration(const GUIVisualizationSettings &s, double factor=20) const
return the drawing size including exaggeration and constantSize values
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
Definition: Position.h:239
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
~GUIParkingArea()
Destructor.
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition: Boundary.cpp:85
std::map< unsigned int, LotSpaceDefinition > mySpaceOccupancies
A map from objects (vehicles) to the areas they acquire after entering the stop.
virtual void releaseVehicles() const
Allows to use the container for microsimulation again.
Definition: MSLane.h:419
std::vector< std::string > myLines
The list of lines that are assigned to this stop.
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:77
A window containing a gl-object&#39;s parameter.
Position mySignPos
The position of the sign.
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
double mySignRot
The rotation of the sign.
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:60