Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUICalibrator.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-2025 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/****************************************************************************/
20// Changes flow and speed on a set of lanes (gui version)
21/****************************************************************************/
22#include <config.h>
23
24#include <string>
27#include <utils/geom/Boundary.h>
31#include <microsim/MSNet.h>
32#include <microsim/MSLane.h>
33#include <microsim/MSEdge.h>
34#include <guisim/GUINet.h>
35#include <guisim/GUIEdge.h>
38#include <gui/GUIGlobals.h>
48
49#include "GUICalibrator.h"
50
51// ===========================================================================
52// FOX callback mapping
53// ===========================================================================
54
58
67
68// Object implementation
69FXIMPLEMENT(GUICalibrator::GUICalibratorPopupMenu, GUIGLObjectPopupMenu, GUICalibratorPopupMenuMap, ARRAYNUMBER(GUICalibratorPopupMenuMap))
70FXIMPLEMENT(GUICalibrator::GUIManip_Calibrator, GUIManipulator, GUIManip_CalibratorMap, ARRAYNUMBER(GUIManip_CalibratorMap))
71
72// ===========================================================================
73// method definitions
74// ===========================================================================
75
76/* -------------------------------------------------------------------------
77 * GUICalibrator::GUIManip_Calibrator - methods
78 * ----------------------------------------------------------------------- */
79GUICalibrator::GUIManip_Calibrator::GUIManip_Calibrator(GUIMainWindow& app, const std::string& name, GUICalibrator& o, int /*xpos*/, int /*ypos*/) :
80 GUIManipulator(app, name, 0, 0),
81 myParent(&app),
82 myChosenValue(0),
83 myChosenTarget(myChosenValue, nullptr, MID_OPTION),
84 //mySpeed(o.getDefaultSpeed()),
85 mySpeed(0),
86 mySpeedTarget(mySpeed),
87 myObject(&o) {
88 myChosenTarget.setTarget(this);
89 FXVerticalFrame* f1 =
90 new FXVerticalFrame(this, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0);
91
92 FXGroupBox* gp = new FXGroupBox(f1, "Change Speed", GROUPBOX_TITLE_LEFT | FRAME_RIDGE,
93 0, 0, 0, 0, 4, 4, 1, 1, 2, 0);
94 {
95 // default
96 FXHorizontalFrame* gf1 = new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
97 new FXRadioButton(gf1, "Default", &myChosenTarget, FXDataTarget::ID_OPTION + 0, ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP,
98 0, 0, 0, 0, 2, 2, 0, 0);
99 }
100 {
101 // loaded
102 FXHorizontalFrame* gf0 = new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
103 new FXRadioButton(gf0, "Loaded", &myChosenTarget, FXDataTarget::ID_OPTION + 1, ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP,
104 0, 0, 0, 0, 2, 2, 0, 0);
105 }
106 {
107 // predefined
108 FXHorizontalFrame* gf2 = new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
109 new FXRadioButton(gf2, "Predefined: ", &myChosenTarget, FXDataTarget::ID_OPTION + 2, ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP | LAYOUT_CENTER_Y,
110 0, 0, 0, 0, 2, 2, 0, 0);
111 myPredefinedValues = new MFXComboBoxIcon(gf2, nullptr, false, GUIDesignComboBoxVisibleItems, this, MID_PRE_DEF,
112 ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP | LAYOUT_CENTER_Y | COMBOBOX_STATIC);
113 myPredefinedValues->appendIconItem("20 km/h");
114 myPredefinedValues->appendIconItem("40 km/h");
115 myPredefinedValues->appendIconItem("60 km/h");
116 myPredefinedValues->appendIconItem("80 km/h");
117 myPredefinedValues->appendIconItem("100 km/h");
118 myPredefinedValues->appendIconItem("120 km/h");
119 myPredefinedValues->appendIconItem("140 km/h");
120 myPredefinedValues->appendIconItem("160 km/h");
121 myPredefinedValues->appendIconItem("180 km/h");
122 myPredefinedValues->appendIconItem("200 km/h");
123 }
124 {
125 // free
126 FXHorizontalFrame* gf12 = new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
127 new FXRadioButton(gf12, "Free Entry: ", &myChosenTarget, FXDataTarget::ID_OPTION + 3,
128 ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP | LAYOUT_CENTER_Y,
129 0, 0, 0, 0, 2, 2, 0, 0);
130 myUserDefinedSpeed = new FXRealSpinner(gf12, 10, this, MID_USER_DEF, LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK);
131 //myUserDefinedSpeed->setFormatString("%.0f km/h");
132 //myUserDefinedSpeed->setIncrements(1, 10, 10);
133 myUserDefinedSpeed->setIncrement(10);
134 myUserDefinedSpeed->setRange(0, 300);
135 myUserDefinedSpeed->setValue(0);
136 //static_cast<GUICalibrator*>(myObject)->getDefaultSpeed() * 3.6);
137 }
138 GUIDesigns::buildFXButton(f1, "Close", "", "", nullptr, this, MID_CLOSE,
139 BUTTON_INITIAL | BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 30, 30, 4, 4);
140 //static_cast<GUICalibrator*>(myObject)->setOverriding(true);
141}
142
143
145
146
147long
149 destroy();
150 return 1;
151}
152
153
154long
156 //mySpeed = (double)(myUserDefinedSpeed->getValue() / 3.6);
157 //static_cast<GUICalibrator*>(myObject)->setOverridingValue(mySpeed);
158 //myParent->updateChildren();
159 return 1;
160}
161
162
163long
164GUICalibrator::GUIManip_Calibrator::onUpdUserDef(FXObject* sender, FXSelector, void* ptr) {
165 sender->handle(this,
166 myChosenValue != 3 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
167 ptr);
168 myParent->updateChildren();
169 return 1;
170}
171
172
173long
175 //mySpeed = (double)(double)((myPredefinedValues->getCurrentItem() * 20 + 20) / 3.6);
176 //static_cast<GUICalibrator*>(myObject)->setOverridingValue(mySpeed);
177 //myParent->updateChildren();
178 return 1;
179}
180
181
182long
183GUICalibrator::GUIManip_Calibrator::onUpdPreDef(FXObject* sender, FXSelector, void* ptr) {
184 sender->handle(this,
185 myChosenValue != 2 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
186 ptr);
187 myParent->updateChildren();
188 return 1;
189}
190
191
192long
194 //static_cast<GUICalibrator*>(myObject)->setOverriding(true);
195 //switch (myChosenValue) {
196 // case 0:
197 // mySpeed = (double) static_cast<GUICalibrator*>(myObject)->getDefaultSpeed();
198 // break;
199 // case 1:
200 // mySpeed = (double) static_cast<GUICalibrator*>(myObject)->getLoadedSpeed();
201 // break;
202 // case 2:
203 // mySpeed = (double)((myPredefinedValues->getCurrentItem() * 20 + 20) / 3.6);
204 // break;
205 // case 3:
206 // mySpeed = (double)(myUserDefinedSpeed->getValue() / 3.6);
207 // break;
208 // default:
209 // // hmmm, should not happen
210 // break;
211 //}
212 //static_cast<GUICalibrator*>(myObject)->setOverridingValue(mySpeed);
213 //myParent->updateChildren();
214 //if (myChosenValue == 1) {
215 // // !!! lock in between
216 // static_cast<GUICalibrator*>(myObject)->setOverriding(false);
217 //}
218 return 1;
219}
220
221
222
223/* -------------------------------------------------------------------------
224 * GUICalibrator::GUICalibratorPopupMenu - methods
225 * ----------------------------------------------------------------------- */
226
230
231
233
234
235long
237 FXSelector,
238 void*) {
239 static_cast<GUICalibrator*>(myObject)->openManipulator(
240 *myApplication, *myParent);
241 return 1;
242}
243
244
245/* -------------------------------------------------------------------------
246 * GUICalibrator - methods
247 * ----------------------------------------------------------------------- */
250 myCalibrator(calibrator),
251 myShowAsKMH(true) {
252 if (calibrator->getEdge() != nullptr) {
253 const std::vector<MSLane*>& destLanes = calibrator->getEdge()->getLanes();
254 const MSLane* lane = calibrator->getLane();
255 const double pos = calibrator->myPos;
256 for (std::vector<MSLane*>::const_iterator i = destLanes.begin(); i != destLanes.end(); ++i) {
257 if (lane == nullptr || (*i) == lane) {
258 const PositionVector& v = (*i)->getShape();
259 myFGPositions.push_back(v.positionAtOffset(pos));
261 myFGRotations.push_back(-v.rotationDegreeAtOffset(pos));
262 }
263 }
264 }
265 if (calibrator->myNode != nullptr) {
266 myBoundary.add(calibrator->myNode->getPosition());
267 }
268}
269
270
272
273
276 GUIGLObjectPopupMenu* ret = new GUICalibratorPopupMenu(app, parent, this);
277 buildPopupHeader(ret, app);
279 //buildShowManipulatorPopupEntry(ret);
283 buildPositionCopyEntry(ret, app);
284 return ret;
285}
286
287
291 auto myCurrentStateInterval = myCalibrator->myCurrentStateInterval;
292 if (myCalibrator->isActive()) {
293 ret = new GUIParameterTableWindow(app, *this);
294 // add items
295 ret->mkItem(TL("interval start"), false, STEPS2TIME(myCurrentStateInterval->begin));
296 ret->mkItem(TL("interval end"), false, STEPS2TIME(myCurrentStateInterval->end));
297 ret->mkItem(TL("aspired flow [veh/h]"), false, myCurrentStateInterval->q);
298 ret->mkItem(TL("aspired speed"), false, myCurrentStateInterval->v);
301 ret->mkItem(TL("default speed"), false, myCalibrator->myDefaultSpeed);
304 ret->mkItem(TL("inserted vehicles"), true, new FunctionBinding<MSCalibrator, int>(myCalibrator, &MSCalibrator::inserted));
305 ret->mkItem(TL("removed vehicles"), true, new FunctionBinding<MSCalibrator, int>(myCalibrator, &MSCalibrator::removed));
307 } else {
308 ret = new GUIParameterTableWindow(app, *this);
309 const std::string nextStart =
310 (myCurrentStateInterval != myCalibrator->myIntervals.end() ?
311 time2string(myCurrentStateInterval->begin) :
312 "simulation end");
313 ret->mkItem(TL("inactive until"), false, nextStart);
314 }
315 // close building
316 ret->closeBuilding();
317 return ret;
318}
319
320
321void
323 const double exaggeration = getExaggeration(s);
325 std::string flow = "-";
326 std::string speed = "-";
327 if (myCalibrator->isActive()) {
328 auto myCurrentStateInterval = myCalibrator->myCurrentStateInterval;
329 if (myCurrentStateInterval->v >= 0) {
330 speed = toString(myCurrentStateInterval->v) + "m/s";
331 }
332 if (myCurrentStateInterval->q >= 0) {
333 flow = toString((int)myCurrentStateInterval->q) + "v/h";
334 }
335 }
336 for (int i = 0; i < (int)myFGPositions.size(); ++i) {
337 const Position& pos = myFGPositions[i];
338 double rot = myFGRotations[i];
340 glTranslated(pos.x(), pos.y(), getType());
341 glRotated(rot, 0, 0, 1);
342 glTranslated(0, 0, getType());
343 glScaled(exaggeration, exaggeration, 1);
344 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
345
346 glBegin(GL_TRIANGLES);
347 glColor3d(1, .8f, 0);
348 // base
349 glVertex2d(0 - 1.4, 0);
350 glVertex2d(0 - 1.4, 6);
351 glVertex2d(0 + 1.4, 6);
352 glVertex2d(0 + 1.4, 0);
353 glVertex2d(0 - 1.4, 0);
354 glVertex2d(0 + 1.4, 6);
355 glEnd();
356
357 // draw text
358 if (s.scale * exaggeration >= 1.) {
359 glTranslated(0, 0, .1);
360 GLHelper::drawText("C", Position(0, 2), 0.1, 3, RGBColor::BLACK, 180);
361 GLHelper::drawText(flow, Position(0, 4), 0.1, 0.7, RGBColor::BLACK, 180);
362 GLHelper::drawText(speed, Position(0, 5), 0.1, 0.7, RGBColor::BLACK, 180);
363 }
365 }
368}
369
370
371double
375
376
380 b.grow(20);
381 return b;
382}
383
384
389 new GUIManip_Calibrator(app, getFullName(), *this, 0, 0);
390 gui->create();
391 gui->show();
392 return gui;
393}
394
395
396/****************************************************************************/
@ MID_MANIP
Open the object's manipulator.
Definition GUIAppEnum.h:491
FXDEFMAP(GUICalibrator::GUICalibratorPopupMenu) GUICalibratorPopupMenuMap[]
#define GUIDesignComboBoxVisibleItems
Definition GUIDesigns.h:64
@ GLO_CALIBRATOR
a calibrator
GUIIcon
An enumeration of icons used by the gui applications.
Definition GUIIcons.h:33
#define TL(string)
Definition MsgHandler.h:304
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define STEPS2TIME(x)
Definition SUMOTime.h:55
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:75
Boundary & grow(double by)
extends the boundary by the given amount
Definition Boundary.cpp:340
static void pushName(unsigned int name)
push Name
Definition GLHelper.cpp:140
static void popMatrix()
pop matrix
Definition GLHelper.cpp:131
static void popName()
pop Name
Definition GLHelper.cpp:149
static void pushMatrix()
push matrix
Definition GLHelper.cpp:118
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, const int align=0, double width=-1)
Definition GLHelper.cpp:742
long onCmdOpenManip(FXObject *, FXSelector, void *)
Called if the object's manipulator shall be shown.
long onCmdClose(FXObject *, FXSelector, void *)
long onCmdChangeOption(FXObject *, FXSelector, void *)
long onCmdUserDef(FXObject *, FXSelector, void *)
long onCmdPreDef(FXObject *, FXSelector, void *)
virtual ~GUIManip_Calibrator()
Destructor.
long onUpdUserDef(FXObject *, FXSelector, void *)
long onUpdPreDef(FXObject *, FXSelector, void *)
Changes the speed allowed on a set of lanes (gui version)
bool myShowAsKMH
The information whether the speed shall be shown in m/s or km/h.
MSCalibrator * myCalibrator
the calibrator being wrapped
double getExaggeration(const GUIVisualizationSettings &s) const
return exaggeration associated with this GLObject
RotCont myFGRotations
The rotations in full-geometry mode.
PosCont myFGPositions
The positions in full-geometry mode.
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
GUIManipulator * openManipulator(GUIMainWindow &app, GUISUMOAbstractView &parent)
Boundary myBoundary
The boundary of this rerouter.
GUICalibrator(MSCalibrator *calibrator)
Constructor.
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
The popup menu of a globject.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app, bool addSeparator=true) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
const std::string & getFullName() const
Definition GUIGlObject.h:95
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.
virtual Position getCenter() const
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
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.
Stores the information about how to visualize structures.
GUIVisualizationTextSettings addName
GUIVisualizationSizeSettings addSize
double scale
information about a lane's width (temporary, used for a single view)
Calibrates the flow on a segment to a specified one.
double currentSpeed() const
measured speed in the current interval
bool isActive() const
virtual int passed() const
const MSLane * getLane() const
std::vector< AspiredState >::const_iterator myCurrentStateInterval
Iterator pointing to the current interval.
int clearedInJam() const
double currentFlow() const
flow in the current interval in veh/h
std::vector< AspiredState > myIntervals
List of adaptation intervals.
const double myPos
the position on the edge where this calibrator lies
int totalWished() const
number of vehicles expected to pass this interval
const MSEdge * getEdge() const
double myDefaultSpeed
The default (maximum) speed on the segment.
int removed() const
int inserted() const
MSJunction *const myNode
the junction on which this calibrator lies (nullptr if is edge or lane specific)
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
const Position & getPosition(bool secondaryShape=false) const
Representation of a lane in the micro simulation.
Definition MSLane.h:84
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:52
double y() const
Returns the y-position.
Definition Position.h:57
A list of positions.
double rotationDegreeAtOffset(double pos) const
Returns the rotation at the given length.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
static const RGBColor BLACK
Definition RGBColor.h:196
Definition json.hpp:4471
double getExaggeration(const GUIVisualizationSettings &s, const GUIGlObject *o, double factor=20) const
return the drawing size including exaggeration and constantSize values