Eclipse SUMO - Simulation of Urban MObility
GUIContainer.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
19 // A MSContainer extended by some values for usage within the gui
20 /****************************************************************************/
21 #include <config.h>
22 
23 #include <cmath>
24 #include <vector>
25 #include <string>
28 #include <microsim/MSLane.h>
35 #include <utils/geom/GeomHelper.h>
41 #include <utils/gui/div/GLHelper.h>
45 #include <gui/GUIGlobals.h>
48 
49 #include "GUIContainer.h"
50 #include "GUINet.h"
51 #include "GUIEdge.h"
52 
53 //#define GUIContainer_DEBUG_DRAW_WALKING_AREA_SHAPE
54 
55 // ===========================================================================
56 // FOX callback mapping
57 // ===========================================================================
58 FXDEFMAP(GUIContainer::GUIContainerPopupMenu) GUIContainerPopupMenuMap[] = {
62 };
63 
64 // Object implementation
65 FXIMPLEMENT(GUIContainer::GUIContainerPopupMenu, GUIGLObjectPopupMenu, GUIContainerPopupMenuMap, ARRAYNUMBER(GUIContainerPopupMenuMap))
66 
67 #define WATER_WAY_OFFSET 6.0
68 
69 // ===========================================================================
70 // method definitions
71 // ===========================================================================
72 /* -------------------------------------------------------------------------
73  * GUIContainer::GUIContainerPopupMenu - methods
74  * ----------------------------------------------------------------------- */
77  : GUIGLObjectPopupMenu(app, parent, o) {
78 }
79 
80 
82 
83 
84 long
86  GUIContainer* p = dynamic_cast<GUIContainer*>(myObject);
87  if (p == nullptr) {
88  return 1;
89  }
90  GUIParameterTableWindow* ret = new GUIParameterTableWindow(*myApplication, *p);
91  // add items
92  for (int stage = 1; stage < p->getNumStages(); stage++) {
93  ret->mkItem(toString(stage).c_str(), false, p->getStageSummary(stage));
94  }
95  // close building (use an object that is not Parameterised as argument)
96  Parameterised dummy;
97  ret->closeBuilding(&dummy);
98  return 1;
99 }
100 
101 
102 long
104  assert(myObject->getType() == GLO_PERSON);
105  if (myParent->getTrackedID() != static_cast<GUIContainer*>(myObject)->getGlID()) {
106  myParent->startTrack(static_cast<GUIContainer*>(myObject)->getGlID());
107  }
108  return 1;
109 }
110 
111 long
113  assert(myObject->getType() == GLO_PERSON);
114  myParent->stopTrack();
115  return 1;
116 }
117 
118 
119 
120 
121 /* -------------------------------------------------------------------------
122  * GUIContainer - methods
123  * ----------------------------------------------------------------------- */
125  MSTransportable(pars, vtype, plan, false),
126  GUIGlObject(GLO_CONTAINER, pars->id, GUIIconSubSys::getIcon(GUIIcon::CONTAINER)) {
127 }
128 
129 
131 }
132 
133 
136  GUISUMOAbstractView& parent) {
137  GUIGLObjectPopupMenu* ret = new GUIContainerPopupMenu(app, parent, *this);
138  buildPopupHeader(ret, app);
142  new FXMenuSeparator(ret);
143  if (parent.getTrackedID() != getGlID()) {
144  GUIDesigns::buildFXMenuCommand(ret, "Start Tracking", nullptr, ret, MID_START_TRACK);
145  } else {
146  GUIDesigns::buildFXMenuCommand(ret, "Stop Tracking", nullptr, ret, MID_STOP_TRACK);
147  }
148  //
149 
153  new FXMenuSeparator(ret);
154  buildPositionCopyEntry(ret, app);
155  return ret;
156 }
157 
158 
162  GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);
163  // add items
164  ret->mkItem(TL("stage"), false, getCurrentStageDescription());
165  // there is always the "start" stage which we do not count here because it is not strictly part of the plan
166  ret->mkItem(TL("stage index"), false, toString(getCurrentStageIndex()) + " of " + toString(getNumStages() - 1));
167  ret->mkItem(TL("start edge [id]"), false, getFromEdge()->getID());
168  ret->mkItem(TL("dest edge [id]"), false, getDestination()->getID());
169  ret->mkItem(TL("arrivalPos [m]"), false, toString(getCurrentStage()->getArrivalPos()));
170  ret->mkItem(TL("edge [id]"), false, getEdge()->getID());
171  ret->mkItem(TL("position [m]"), true, new FunctionBinding<GUIContainer, double>(this, &GUIContainer::getEdgePos));
172  ret->mkItem(TL("speed [m/s]"), true, new FunctionBinding<GUIContainer, double>(this, &GUIContainer::getSpeed));
173  ret->mkItem(TL("speed factor"), false, getChosenSpeedFactor());
174  ret->mkItem(TL("angle [degree]"), true, new FunctionBinding<GUIContainer, double>(this, &GUIContainer::getAngle));
175  ret->mkItem(TL("waiting time [s]"), true, new FunctionBinding<GUIContainer, double>(this, &GUIContainer::getWaitingSeconds));
176  ret->mkItem(TL("desired depart [s]"), false, time2string(getParameter().depart));
177  // close building
178  ret->closeBuilding(&getParameter());
179  return ret;
180 }
181 
182 
185  GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this, "vType:" + myVType->getID());
186  ret->mkItem(TL("length"), false, myVType->getLength());
187  ret->mkItem(TL("width"), false, myVType->getWidth());
188  ret->mkItem(TL("height"), false, myVType->getHeight());
189  ret->mkItem(TL("minGap"), false, myVType->getMinGap());
190  ret->mkItem(TL("mass [kg]"), false, myVType->getMass());
191  ret->mkItem(TL("maximum speed [m/s]"), false, myVType->getMaxSpeed());
192  ret->closeBuilding(&(myVType->getParameter()));
193  return ret;
194 }
195 
196 
197 double
199  return s.containerSize.getExaggeration(s, this);
200 }
201 
202 
203 Boundary
205  Boundary b;
206  // ensure that the vehicle is drawn, otherwise myPositionInVehicle will not be updated
207  b.add(getPosition());
208  b.grow(20);
209  return b;
210 }
211 
212 
213 void
217  Position p1 = getPosition();
218  double angle = getAngle();
221  angle = myPositionInVehicle.angle;
222  }
223  glTranslated(p1.x(), p1.y(), getType());
224  glRotated(RAD2DEG(angle), 0, 0, 1);
225  // set container color
226  setColor(s);
227  // scale
228  const double upscale = getExaggeration(s);
229  glScaled(upscale, upscale, 1);
230  switch (s.containerQuality) {
231  case 0:
232  case 1:
233  case 2:
235  break;
236  case 3:
237  default:
239  break;
240  }
242 
243  drawName(p1, s.scale, s.containerName, s.angle);
245 }
246 
247 
248 void
252  /*
253  glTranslated(0, 0, getType() - .1); // don't draw on top of other cars
254  if (hasActiveAddVisualisation(parent, VO_SHOW_BEST_LANES)) {
255  drawBestLanes();
256  }
257  if (hasActiveAddVisualisation(parent, VO_SHOW_ROUTE)) {
258  drawRoute(s, 0, 0.25);
259  }
260  if (hasActiveAddVisualisation(parent, VO_SHOW_ALL_ROUTES)) {
261  if (getNumberReroutes() > 0) {
262  const int noReroutePlus1 = getNumberReroutes() + 1;
263  for (int i = noReroutePlus1 - 1; i >= 0; i--) {
264  double darken = double(0.4) / double(noReroutePlus1) * double(i);
265  drawRoute(s, i, darken);
266  }
267  } else {
268  drawRoute(s, 0, 0.25);
269  }
270  }
271  if (hasActiveAddVisualisation(parent, VO_SHOW_LFLINKITEMS)) {
272  for (DriveItemVector::const_iterator i = myLFLinkLanes.begin(); i != myLFLinkLanes.end(); ++i) {
273  if((*i).myLink==0) {
274  continue;
275  }
276  MSLink* link = (*i).myLink;
277  MSLane *via = link->getViaLane();
278  if (via == 0) {
279  via = link->getLane();
280  }
281  if (via != 0) {
282  Position p = via->getShape()[0];
283  if((*i).mySetRequest) {
284  glColor3f(0, 1, 0);
285  } else {
286  glColor3f(1, 0, 0);
287  }
288  glTranslated(p.x(), p.y(), -.1);
289  GLHelper::drawFilledCircle(1);
290  glTranslated(-p.x(), -p.y(), .1);
291  }
292  }
293  }
294  */
297 }
298 
299 
300 
301 
302 void
304  const GUIColorer& c = s.containerColorer;
305  if (!setFunctionalColor(c.getActive())) {
307  }
308 }
309 
310 
311 bool
312 GUIContainer::setFunctionalColor(int activeScheme) const {
313  switch (activeScheme) {
314  case 0: {
315  if (getParameter().wasSet(VEHPARS_COLOR_SET)) {
317  return true;
318  }
319  if (getVehicleType().wasSet(VTYPEPARS_COLOR_SET)) {
320  GLHelper::setColor(getVehicleType().getColor());
321  return true;
322  }
323  return false;
324  }
325  case 2: {
326  if (getParameter().wasSet(VEHPARS_COLOR_SET)) {
328  return true;
329  }
330  return false;
331  }
332  case 3: {
333  if (getVehicleType().wasSet(VTYPEPARS_COLOR_SET)) {
334  GLHelper::setColor(getVehicleType().getColor());
335  return true;
336  }
337  return false;
338  }
339  case 8: { // color by angle
340  double hue = GeomHelper::naviDegree(getAngle());
342  return true;
343  }
344  case 9: { // color randomly (by pointer)
345  const double hue = (double)((long long int)this % 360); // [0-360]
346  const double sat = (double)(((long long int)this / 360) % 67) / 100. + 0.33; // [0.33-1]
347  GLHelper::setColor(RGBColor::fromHSV(hue, sat, 1.));
348  return true;
349  }
350  default:
351  return false;
352  }
353 }
354 
355 
356 double
357 GUIContainer::getColorValue(const GUIVisualizationSettings& /* s */, int activeScheme) const {
358  switch (activeScheme) {
359  case 4:
360  return getSpeed();
361  case 5:
362  if (isWaiting4Vehicle()) {
363  return 5;
364  } else {
365  return (double)getCurrentStageType();
366  }
367  case 6:
368  return getWaitingSeconds();
369  case 7:
371  }
372  return 0;
373 }
374 
375 
376 double
378  FXMutexLock locker(myLock);
380 }
381 
382 int
384  FXMutexLock locker(myLock);
386 }
387 
388 
389 Position
391  FXMutexLock locker(myLock);
392  if (getCurrentStageType() == MSStageType::WAITING && getEdge()->getPermissions() == SVC_SHIP) {
393  MSLane* lane = getEdge()->getLanes().front(); //the most right lane of the water way
394  PositionVector laneShape = lane->getShape();
395  return laneShape.positionAtOffset2D(getEdgePos(), WATER_WAY_OFFSET);
396  }
398 }
399 
400 
401 double
403  FXMutexLock locker(myLock);
404  return MSTransportable::getAngle();
405 }
406 
407 
408 double
410  FXMutexLock locker(myLock);
412 }
413 
414 
415 double
417  FXMutexLock locker(myLock);
418  return MSTransportable::getSpeed();
419 }
420 
421 
422 void
424  // draw pedestrian shape
425  glScaled(getVehicleType().getLength(), getVehicleType().getWidth(), 1);
426  glBegin(GL_QUADS);
427  glVertex2d(0, 0.5);
428  glVertex2d(0, -0.5);
429  glVertex2d(-1, -0.5);
430  glVertex2d(-1, 0.5);
431  glEnd();
432  GLHelper::setColor(GLHelper::getColor().changedBrightness(-30));
433  glTranslated(0, 0, .045);
434  glBegin(GL_QUADS);
435  glVertex2d(-0.1, 0.4);
436  glVertex2d(-0.1, -0.4);
437  glVertex2d(-0.9, -0.4);
438  glVertex2d(-0.9, 0.4);
439  glEnd();
440 }
441 
442 
443 void
445  const std::string& file = getVehicleType().getImgFile();
446  if (file != "") {
447  // @todo invent an option for controlling whether images should be rotated or not
448  //if (getVehicleType().getGuiShape() == SVS_CONTAINER) {
449  // glRotated(RAD2DEG(getAngle() + M_PI / 2.), 0, 0, 1);
450  //}
451  int textureID = GUITexturesHelper::getTextureID(file);
452  if (textureID > 0) {
453  const double exaggeration = s.personSize.getExaggeration(s, this);
454  const double halfLength = getVehicleType().getLength() / 2.0 * exaggeration;
455  const double halfWidth = getVehicleType().getWidth() / 2.0 * exaggeration;
456  GUITexturesHelper::drawTexturedBox(textureID, -halfWidth, -halfLength, halfWidth, halfLength);
457  }
458  } else {
459  // fallback if no image is defined
461  }
462 }
463 
464 bool
467 }
468 
469 /****************************************************************************/
@ MID_SHOWPLAN
Show transportable plan.
Definition: GUIAppEnum.h:475
@ MID_START_TRACK
Start to track a vehicle.
Definition: GUIAppEnum.h:513
@ MID_STOP_TRACK
Stop to track a vehicle.
Definition: GUIAppEnum.h:515
FXDEFMAP(GUIContainer::GUIContainerPopupMenu) GUIContainerPopupMenuMap[]
#define WATER_WAY_OFFSET
@ GLO_CONTAINER
a container
@ GLO_PERSON
a person
GUISelectedStorage gSelected
A global holder of selected objects.
GUIIcon
An enumeration of icons used by the gui applications.
Definition: GUIIcons.h:33
#define RAD2DEG(x)
Definition: GeomHelper.h:36
#define TL(string)
Definition: MsgHandler.h:315
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition: SUMOTime.cpp:69
const long long int VTYPEPARS_COLOR_SET
@ SVC_SHIP
is an arbitrary ship
const int VEHPARS_COLOR_SET
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:39
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition: Boundary.cpp:78
Boundary & grow(double by)
extends the boundary by the given amount
Definition: Boundary.cpp:319
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition: GLHelper.cpp:654
static void pushName(unsigned int name)
push Name
Definition: GLHelper.cpp:139
static void popMatrix()
pop matrix
Definition: GLHelper.cpp:130
static RGBColor getColor()
gets the gl-color
Definition: GLHelper.cpp:660
static void popName()
pop Name
Definition: GLHelper.cpp:148
static void pushMatrix()
push matrix
Definition: GLHelper.cpp:117
long onCmdStartTrack(FXObject *, FXSelector, void *)
Called if the person shall be tracked.
long onCmdShowPlan(FXObject *, FXSelector, void *)
Called if the plan shall be shown.
long onCmdStopTrack(FXObject *, FXSelector, void *)
Called if the person shall not be tracked any longer.
GUIContainerPopupMenu(GUIMainWindow &app, GUISUMOAbstractView &parent, GUIGlObject &o)
Constructor.
bool setFunctionalColor(int activeScheme) const
sets the color according to the current scheme index and some vehicle function
void drawAction_drawAsPoly(const GUIVisualizationSettings &s) const
double getWaitingSeconds() const override
the time this container spent waiting in seconds
Position getPosition() const override
return the Network coordinate of the container
void drawGL(const GUIVisualizationSettings &s) const override
Draws the object.
bool isSelected() const override
whether this container is selected in the GUI
void drawAction_drawAsImage(const GUIVisualizationSettings &s) const
double getSpeed() const override
the current speed of the container
Boundary getCenteringBoundary() const override
Returns the boundary to which the view shall be centered in order to show the object.
GUIContainer(const SUMOVehicleParameter *pars, MSVehicleType *vtype, MSTransportable::MSTransportablePlan *plan)
Constructor.
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own popup-menu.
double getAngle() const override
return the current angle of the container
FXMutex myLock
The mutex used to avoid concurrent updates of the vehicle buffer.
Definition: GUIContainer.h:186
double getEdgePos() const override
return the offset from the start of the current edge
GUIBaseVehicle::Seat myPositionInVehicle
The position of a container while riding a vehicle.
Definition: GUIContainer.h:189
GUIParameterTableWindow * getTypeParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own type parameter window.
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own parameter window.
~GUIContainer()
destructor
int getDirection() const override
Return the movement directon on the edge.
virtual void drawGLAdditional(GUISUMOAbstractView *const parent, const GUIVisualizationSettings &s) const override
Draws additionally triggered visualisations.
void setColor(const GUIVisualizationSettings &s) const
sets the color according to the currente settings
double getColorValue(const GUIVisualizationSettings &s, int activeScheme) const override
gets the color value according to the current scheme index
double getExaggeration(const GUIVisualizationSettings &s) const override
return exaggeration associated with this GLObject
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
Definition: GUIDesigns.cpp:42
The popup menu of a globject.
void buildShowTypeParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the type parameter window.
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
GUIGlObjectType getType() const
Returns the type of the object as coded in GUIGlObjectType.
Definition: GUIGlObject.h:156
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
GUIGlID getGlID() const
Returns the numerical id of the object.
Definition: GUIGlObject.h:104
void drawName(const Position &pos, const double scale, const GUIVisualizationTextSettings &settings, const double angle=0, bool forceShow=false) const
draw name of item
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
A window containing a gl-object's parameter.
void mkItem(const char *name, bool dynamic, ValueSource< T > *src)
Adds a row which obtains its value from a ValueSource.
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
T getColor(const double value) const
virtual GUIGlID getTrackedID() const
get tracked id
bool isSelected(GUIGlObjectType type, GUIGlID id)
Returns the information whether the object with the given type and id is selected.
static void drawTexturedBox(int which, double size)
Draws a named texture as a box with the given size.
static int getTextureID(const std::string &filename, const bool mirrorX=false)
return texture id for the given filename (initialize on first use)
Stores the information about how to visualize structures.
GUIVisualizationSizeSettings containerSize
int containerQuality
The quality of container drawing.
GUIVisualizationSizeSettings personSize
double scale
information about a lane's width (temporary, used for a single view)
GUIVisualizationTextSettings containerName
GUIColorer containerColorer
The container colorer.
double angle
The current view rotation angle.
static double naviDegree(const double angle)
Definition: GeomHelper.cpp:191
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition: MSEdge.h:168
Representation of a lane in the micro simulation.
Definition: MSLane.h:84
virtual const PositionVector & getShape(bool) const
Definition: MSLane.h:294
virtual double getChosenSpeedFactor() const
the current speed factor of the transportable (where applicable)
virtual double getEdgePos() const
Return the position on the edge.
std::string getCurrentStageDescription() const
Returns the current stage description as a string.
virtual double getAngle() const
return the current angle of the transportable
bool isWaiting4Vehicle() const
Whether the transportable waits for a vehicle.
virtual double getSpeed() const
the current speed of the transportable
std::string getStageSummary(int stageIndex) const
return textual summary for the given stage
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
MSVehicleType * myVType
This transportable's type. (mainly used for drawing related information Note sure if it is really nec...
const MSVehicleType & getVehicleType() const
Returns the object's "vehicle" type.
virtual Position getPosition() const
Return the Network coordinate of the transportable.
double getArrivalPos() const
returns the final arrival pos
const MSEdge * getFromEdge() const
Returns the departure edge.
int getNumStages() const
Return the total number stages in this person's plan.
int getCurrentStageIndex() const
Return the index of the current stage.
MSStageType getCurrentStageType() const
the current stage type of the transportable
const MSEdge * getEdge() const
Returns the current edge.
MSStage * getCurrentStage() const
Return the current stage.
virtual double getWaitingSeconds() const
the time this transportable spent waiting in seconds
virtual int getDirection() const
Return the movement directon on the edge.
std::vector< MSStage * > MSTransportablePlan
the structure holding the plan of a transportable
const MSEdge * getDestination() const
Returns the current destination.
The car-following model and parameter.
Definition: MSVehicleType.h:63
double getWidth() const
Get the width which vehicles of this class shall have when being drawn.
double getMaxSpeed() const
Get vehicle's (technical) maximum speed [m/s].
double getMinGap() const
Get the free space in front of vehicles of this class.
double getHeight() const
Get the height which vehicles of this class shall have when being drawn.
const std::string & getID() const
Returns the name of the vehicle type.
Definition: MSVehicleType.h:91
double getLength() const
Get vehicle's length [m].
double getMass() const
Get this vehicle type's mass.
std::string getImgFile() const
Get this vehicle type's raster model file name.
const SUMOVTypeParameter & getParameter() const
const std::string & getID() const
Returns the id.
Definition: Named.h:74
An upper class for objects with additional parameters.
Definition: Parameterised.h:41
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
double x() const
Returns the x-position.
Definition: Position.h:55
double y() const
Returns the y-position.
Definition: Position.h:60
A list of positions.
Position positionAtOffset2D(double pos, double lateralOffset=0) const
Returns the position at the given length.
static RGBColor fromHSV(double h, double s, double v)
Converts the given hsv-triplet to rgb, inspired by http://alvyray.com/Papers/CG/hsv2rgb....
Definition: RGBColor.cpp:371
Structure representing possible vehicle parameter.
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values