Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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>
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// ===========================================================================
63
64// Object implementation
65FXIMPLEMENT(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 * ----------------------------------------------------------------------- */
79
80
82
83
84long
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
102long
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
111long
113 assert(myObject->getType() == GLO_PERSON);
114 myParent->stopTrack();
115 return 1;
116}
117
118
119
120
121/* -------------------------------------------------------------------------
122 * GUIContainer - methods
123 * ----------------------------------------------------------------------- */
128
129
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
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
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());
193 return ret;
194}
195
196
197double
201
202
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
213void
217 Position p1 = getPosition();
218 double angle = getAngle();
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
248void
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
302void
309
310
311bool
312GUIContainer::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)) {
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)) {
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]
348 return true;
349 }
350 default:
351 return false;
352 }
353}
354
355
356double
357GUIContainer::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
376double
378 FXMutexLock locker(myLock);
380}
381
382int
384 FXMutexLock locker(myLock);
386}
387
388
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();
396 }
398}
399
400
401double
403 FXMutexLock locker(myLock);
405}
406
407
408double
410 FXMutexLock locker(myLock);
412}
413
414
415double
417 FXMutexLock locker(myLock);
419}
420
421
422void
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
443void
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
464bool
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 long long 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:343
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition GLHelper.cpp:649
static void pushName(unsigned int name)
push Name
Definition GLHelper.cpp:140
static void popMatrix()
pop matrix
Definition GLHelper.cpp:131
static RGBColor getColor()
gets the gl-color
Definition GLHelper.cpp:655
static void popName()
pop Name
Definition GLHelper.cpp:149
static void pushMatrix()
push matrix
Definition GLHelper.cpp:118
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.
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.
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
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.
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.
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)
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
const MSEdge * getFromEdge() const
Returns the departure edge.
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.
const MSEdge * getDestination() const
Returns the current destination.
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
MSStage * getCurrentStage() const
Return the current stage.
MSVehicleType * myVType
This transportable's type. (mainly used for drawing related information Note sure if it is really nec...
virtual Position getPosition() const
Return the Network coordinate of the transportable.
double getArrivalPos() const
returns the final arrival pos
const MSVehicleType & getVehicleType() const
Returns the object's "vehicle" type.
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
virtual double getWaitingSeconds() const
the time this transportable spent waiting in seconds
const MSEdge * getEdge() const
Returns the current edge.
virtual int getDirection() const
Return the movement directon on the edge.
std::vector< MSStage * > MSTransportablePlan
the structure holding the plan of a transportable
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
The car-following model and parameter.
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].
const std::string & getID() const
Returns the name of the vehicle type.
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.
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.
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