SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GUICalibrator.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // Changes flow and speed on a set of lanes (gui version)
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
12 // Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
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/Line.h>
35 #include <utils/geom/Boundary.h>
36 #include <utils/gui/div/GLHelper.h>
37 #include <utils/common/ToString.h>
38 #include <utils/common/Command.h>
39 #include <microsim/MSNet.h>
40 #include <microsim/MSLane.h>
41 #include <microsim/MSEdge.h>
42 #include <guisim/GUINet.h>
43 #include <guisim/GUIEdge.h>
44 #include "GUICalibrator.h"
47 #include <gui/GUIGlobals.h>
54 #include <guisim/GUICalibrator.h>
56 
57 #ifdef CHECK_MEMORY_LEAKS
58 #include <foreign/nvwa/debug_new.h>
59 #endif // CHECK_MEMORY_LEAKS
60 
61 
62 // ===========================================================================
63 // FOX callback mapping
64 // ===========================================================================
65 /* -------------------------------------------------------------------------
66  * GUICalibrator::GUICalibratorPopupMenu - mapping
67  * ----------------------------------------------------------------------- */
71 
72 };
73 
74 // Object implementation
76 
77 
78 /* -------------------------------------------------------------------------
79  * GUICalibrator::GUIManip_Calibrator - mapping
80  * ----------------------------------------------------------------------- */
81 FXDEFMAP(GUICalibrator::GUIManip_Calibrator) GUIManip_CalibratorMap[] = {
88 };
89 
90 FXIMPLEMENT(GUICalibrator::GUIManip_Calibrator, GUIManipulator, GUIManip_CalibratorMap, ARRAYNUMBER(GUIManip_CalibratorMap))
91 
92 
93 // ===========================================================================
94 // method definitions
95 // ===========================================================================
96 /* -------------------------------------------------------------------------
97  * GUICalibrator::GUIManip_Calibrator - methods
98  * ----------------------------------------------------------------------- */
100  GUIMainWindow& app,
101  const std::string& name, GUICalibrator& o,
102  int /*xpos*/, int /*ypos*/) :
103  GUIManipulator(app, name, 0, 0),
104  myParent(&app),
105  myChosenValue(0),
106  myChosenTarget(myChosenValue, NULL, MID_OPTION),
107  //mySpeed(o.getDefaultSpeed()),
108  mySpeed(0),
109  mySpeedTarget(mySpeed),
110  myObject(&o) {
111  myChosenTarget.setTarget(this);
112  FXVerticalFrame* f1 =
113  new FXVerticalFrame(this, LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0);
114 
115  FXGroupBox* gp = new FXGroupBox(f1, "Change Speed",
116  GROUPBOX_TITLE_LEFT | FRAME_RIDGE,
117  0, 0, 0, 0, 4, 4, 1, 1, 2, 0);
118  {
119  // default
120  FXHorizontalFrame* gf1 =
121  new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
122  new FXRadioButton(gf1, "Default", &myChosenTarget, FXDataTarget::ID_OPTION + 0,
123  ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP,
124  0, 0, 0, 0, 2, 2, 0, 0);
125  }
126  {
127  // loaded
128  FXHorizontalFrame* gf0 =
129  new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
130  new FXRadioButton(gf0, "Loaded", &myChosenTarget, FXDataTarget::ID_OPTION + 1,
131  ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP,
132  0, 0, 0, 0, 2, 2, 0, 0);
133  }
134  {
135  // predefined
136  FXHorizontalFrame* gf2 =
137  new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
138  new FXRadioButton(gf2, "Predefined: ", &myChosenTarget, FXDataTarget::ID_OPTION + 2,
139  ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP | LAYOUT_CENTER_Y,
140  0, 0, 0, 0, 2, 2, 0, 0);
141  myPredefinedValues =
142  new FXComboBox(gf2, 10, this, MID_PRE_DEF,
143  ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP | LAYOUT_CENTER_Y | COMBOBOX_STATIC);
144  myPredefinedValues->appendItem("20 km/h");
145  myPredefinedValues->appendItem("40 km/h");
146  myPredefinedValues->appendItem("60 km/h");
147  myPredefinedValues->appendItem("80 km/h");
148  myPredefinedValues->appendItem("100 km/h");
149  myPredefinedValues->appendItem("120 km/h");
150  myPredefinedValues->appendItem("140 km/h");
151  myPredefinedValues->appendItem("160 km/h");
152  myPredefinedValues->appendItem("180 km/h");
153  myPredefinedValues->appendItem("200 km/h");
154  myPredefinedValues->setNumVisible(5);
155  }
156  {
157  // free
158  FXHorizontalFrame* gf12 =
159  new FXHorizontalFrame(gp, LAYOUT_TOP | LAYOUT_LEFT, 0, 0, 0, 0, 10, 10, 5, 5);
160  new FXRadioButton(gf12, "Free Entry: ", &myChosenTarget, FXDataTarget::ID_OPTION + 3,
161  ICON_BEFORE_TEXT | LAYOUT_SIDE_TOP | LAYOUT_CENTER_Y,
162  0, 0, 0, 0, 2, 2, 0, 0);
163  myUserDefinedSpeed =
164  new FXRealSpinDial(gf12, 10, this, MID_USER_DEF,
165  LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK);
166  myUserDefinedSpeed->setFormatString("%.0f km/h");
167  myUserDefinedSpeed->setIncrements(1, 10, 10);
168  myUserDefinedSpeed->setRange(0, 300);
169  myUserDefinedSpeed->setValue(0);
170  //static_cast<GUICalibrator*>(myObject)->getDefaultSpeed() * 3.6);
171  }
172  new FXButton(f1, "Close", NULL, this, MID_CLOSE,
173  BUTTON_INITIAL | BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT | LAYOUT_CENTER_X, 0, 0, 0, 0, 30, 30, 4, 4);
174  //static_cast<GUICalibrator*>(myObject)->setOverriding(true);
175 }
176 
177 
179 
180 
181 long
183  destroy();
184  return 1;
185 }
186 
187 
188 long
190  //mySpeed = (SUMOReal)(myUserDefinedSpeed->getValue() / 3.6);
191  //static_cast<GUICalibrator*>(myObject)->setOverridingValue(mySpeed);
192  //myParent->updateChildren();
193  return 1;
194 }
195 
196 
197 long
199  sender->handle(this,
200  myChosenValue != 3 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
201  ptr);
202  myParent->updateChildren();
203  return 1;
204 }
205 
206 
207 long
209  //mySpeed = (SUMOReal)(SUMOReal)((myPredefinedValues->getCurrentItem() * 20 + 20) / 3.6);
210  //static_cast<GUICalibrator*>(myObject)->setOverridingValue(mySpeed);
211  //myParent->updateChildren();
212  return 1;
213 }
214 
215 
216 long
218  sender->handle(this,
219  myChosenValue != 2 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
220  ptr);
221  myParent->updateChildren();
222  return 1;
223 }
224 
225 
226 long
228  //static_cast<GUICalibrator*>(myObject)->setOverriding(true);
229  //switch (myChosenValue) {
230  // case 0:
231  // mySpeed = (SUMOReal) static_cast<GUICalibrator*>(myObject)->getDefaultSpeed();
232  // break;
233  // case 1:
234  // mySpeed = (SUMOReal) static_cast<GUICalibrator*>(myObject)->getLoadedSpeed();
235  // break;
236  // case 2:
237  // mySpeed = (SUMOReal)((myPredefinedValues->getCurrentItem() * 20 + 20) / 3.6);
238  // break;
239  // case 3:
240  // mySpeed = (SUMOReal)(myUserDefinedSpeed->getValue() / 3.6);
241  // break;
242  // default:
243  // // hmmm, should not happen
244  // break;
245  //}
246  //static_cast<GUICalibrator*>(myObject)->setOverridingValue(mySpeed);
247  //myParent->updateChildren();
248  //if (myChosenValue == 1) {
249  // // !!! lock in between
250  // static_cast<GUICalibrator*>(myObject)->setOverriding(false);
251  //}
252  return 1;
253 }
254 
255 
256 
257 /* -------------------------------------------------------------------------
258  * GUICalibrator::GUICalibratorPopupMenu - methods
259  * ----------------------------------------------------------------------- */
261  GUIMainWindow& app, GUISUMOAbstractView& parent,
262  GUIGlObject& o)
263  : GUIGLObjectPopupMenu(app, parent, o) {}
264 
265 
267 
268 
269 long
271  FXSelector,
272  void*) {
273  static_cast<GUICalibrator*>(myObject)->openManipulator(
274  *myApplication, *myParent);
275  return 1;
276 }
277 
278 
279 /* -------------------------------------------------------------------------
280  * GUICalibrator - methods
281  * ----------------------------------------------------------------------- */
282 GUICalibrator::GUICalibrator(const std::string& id,
283  MSEdge* edge, SUMOReal pos,
284  const std::string& aXMLFilename,
285  const std::string& outputFilename,
286  const SUMOTime freq) :
287  MSCalibrator(id, edge, pos, aXMLFilename, outputFilename, freq),
288  GUIGlObject_AbstractAdd("calibrator", GLO_TRIGGER, id),
289  myShowAsKMH(true) {
290  const std::vector<MSLane*>& destLanes = edge->getLanes();
291  myFGPositions.reserve(destLanes.size());
292  myFGRotations.reserve(destLanes.size());
293  for (std::vector<MSLane*>::const_iterator i = destLanes.begin(); i != destLanes.end(); ++i) {
294  const PositionVector& v = (*i)->getShape();
295  myFGPositions.push_back(v.positionAtOffset(pos));
297  myFGRotations.push_back(-v.rotationDegreeAtOffset(pos));
298  }
299 }
300 
301 
303 
304 
307  GUISUMOAbstractView& parent) {
308  GUIGLObjectPopupMenu* ret = new GUICalibratorPopupMenu(app, parent, *this);
309  buildPopupHeader(ret, app);
311  //buildShowManipulatorPopupEntry(ret);
315  buildPositionCopyEntry(ret, false);
316  return ret;
317 }
318 
319 
324  if (isActive()) {
325  ret = new GUIParameterTableWindow(app, *this, 10);
326  // add items
327  ret->mkItem("interval start", false, STEPS2TIME(myCurrentStateInterval->begin));
328  ret->mkItem("interval end", false, STEPS2TIME(myCurrentStateInterval->end));
329  ret->mkItem("aspired flow [veh/h]", false, myCurrentStateInterval->q);
330  ret->mkItem("aspired speed", false, myCurrentStateInterval->v);
331  ret->mkItem("default speed", false, myDefaultSpeed);
332  ret->mkItem("required vehicles", true, new FunctionBinding<GUICalibrator, int>(this, &GUICalibrator::totalWished));
333  ret->mkItem("passed vehicles", true, new FunctionBinding<GUICalibrator, int>(this, &GUICalibrator::passed));
334  ret->mkItem("inserted vehicles", true, new FunctionBinding<GUICalibrator, int>(this, &GUICalibrator::inserted));
335  ret->mkItem("removed vehicles", true, new FunctionBinding<GUICalibrator, int>(this, &GUICalibrator::removed));
336  ret->mkItem("cleared in jam", true, new FunctionBinding<GUICalibrator, int>(this, &GUICalibrator::clearedInJam));
337  } else {
338  ret = new GUIParameterTableWindow(app, *this, 1);
339  const std::string nextStart =
342  "simulation end");
343  ret->mkItem("inactive until", false, nextStart);
344  }
345  // close building
346  ret->closeBuilding();
347  return ret;
348 }
349 
350 
351 void
353  glPushName(getGlID());
354  std::string flow = "-";
355  std::string speed = "-";
356  if (isActive()) {
357  if (myCurrentStateInterval->v >= 0) {
358  speed = toString(myCurrentStateInterval->v) + "m/s";
359  }
360  if (myCurrentStateInterval->q >= 0) {
361  flow = toString((int)myCurrentStateInterval->q) + "v/h";
362  }
363  }
364  for (size_t i = 0; i < myFGPositions.size(); ++i) {
365  const Position& pos = myFGPositions[i];
366  SUMOReal rot = myFGRotations[i];
367  glPushMatrix();
368  glTranslated(pos.x(), pos.y(), getType());
369  glRotated(rot, 0, 0, 1);
370  glTranslated(0, 0, getType());
371  glScaled(s.addExaggeration, s.addExaggeration, 1);
372  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
373 
374  glBegin(GL_TRIANGLES);
375  glColor3d(1, .8f, 0);
376  // base
377  glVertex2d(0 - 1.4, 0);
378  glVertex2d(0 - 1.4, 6);
379  glVertex2d(0 + 1.4, 6);
380  glVertex2d(0 + 1.4, 0);
381  glVertex2d(0 - 1.4, 0);
382  glVertex2d(0 + 1.4, 6);
383  glEnd();
384 
385  // draw text
386  if (s.scale * s.addExaggeration >= 1.) {
387  glTranslated(0, 0, .1);
388  glColor3d(0, 0, 0);
389  pfSetPosition(0, 0);
390  pfSetScale(3.f);
391  SUMOReal w = pfdkGetStringWidth("C");
392  glRotated(180, 0, 1, 0);
393  glTranslated(-w / 2., 2, 0);
394  pfDrawString("C");
395  glTranslated(w / 2., -2, 0);
396 
397 
398  pfSetPosition(0, 0);
399  pfSetScale(.7f);
400  w = pfdkGetStringWidth(flow.c_str());
401  glTranslated(-w / 2., 4, 0);
402  pfDrawString(flow.c_str());
403  glTranslated(w / 2., -4, 0);
404 
405  pfSetPosition(0, 0);
406  pfSetScale(.7f);
407  w = pfdkGetStringWidth(speed.c_str());
408  glTranslated(-w / 2., 5, 0);
409  pfDrawString(speed.c_str());
410  glTranslated(-w / 2., -5, 0);
411  }
412  glPopMatrix();
413  }
414  drawName(getCenteringBoundary().getCenter(), s.scale, s.addName);
415  glPopName();
416 }
417 
418 
419 Boundary
421  Boundary b(myBoundary);
422  b.grow(20);
423  return b;
424 }
425 
426 
430  GUIManip_Calibrator* gui =
431  new GUIManip_Calibrator(app, getFullName(), *this, 0, 0);
432  gui->create();
433  gui->show();
434  return gui;
435 }
436 
437 
438 
439 /****************************************************************************/
440