Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUIApplicationWindow.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-2026 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/****************************************************************************/
22// The main window of the SUMO-gui.
23/****************************************************************************/
24#include <config.h>
25
26#ifdef HAVE_VERSION_H
27#include <version.h>
28#endif
29
30#include <fxkeys.h>
31
32#include <guisim/GUILane.h>
33#include <guisim/GUINet.h>
41#include <netload/NLHandler.h>
70#include <utils/xml/XMLSubSys.h>
71
75#include "GUIGlobals.h"
76#include "GUILoadThread.h"
77#include "GUIRunThread.h"
83
84
85#define MIN_DRAW_DELAY 20
86//#define HAVE_DANGEROUS_SOUNDS
87
88#define STAT_VEHS 0
89#define STAT_DELAYED 1
90#define STAT_TELEPORTS 2
91#define STAT_PERSONS 3
92#define STAT_CONTAINERS 4
93
94// ===========================================================================
95// FOX-declarations
96// ===========================================================================
97FXDEFMAP(GUIApplicationWindow) GUIApplicationWindowMap[] = {
98 // close
102 FXMAPFUNC(SEL_CLOSE, MID_WINDOW, GUIApplicationWindow::onCmdQuit),
103 // toolbar
120 // gaming
130 // OSG
131#ifdef HAVE_OSG
132 FXMAPFUNC(SEL_COMMAND, MID_NEW_OSGVIEW, GUIApplicationWindow::onCmdNewOSG),
134
135#endif
138 // Time
145 FXMAPFUNC(SEL_COMMAND, MID_DELAY_INC, GUIApplicationWindow::onCmdDelayInc),
146 FXMAPFUNC(SEL_COMMAND, MID_DELAY_DEC, GUIApplicationWindow::onCmdDelayDec),
147 FXMAPFUNC(SEL_COMMAND, MID_SIMSAVE, GUIApplicationWindow::onCmdSaveState),
148 FXMAPFUNC(SEL_COMMAND, MID_SIMLOAD, GUIApplicationWindow::onCmdLoadState),
155 // Stats
159 // these functions do not assign shortcut keys to commands, but rather affect the button enable status upon other events (e.g. simulation loaded)
160 // since those events are invoked through pseudo key events (?), the same key shortcuts as in cmd must be supplied as well
190 FXMAPFUNC(SEL_COMMAND, MID_HOTKEYS, GUIApplicationWindow::onCmdHotkeys),
191 FXMAPFUNC(SEL_COMMAND, MID_TUTORIAL, GUIApplicationWindow::onCmdTutorial),
193 FXMAPFUNC(SEL_COMMAND, MID_FEEDBACK, GUIApplicationWindow::onCmdFeedback),
195 // forward requests to the active view
214 // languages
235 // coordinate inputs
242 // keys
243 FXMAPFUNC(SEL_KEYPRESS, 0, GUIApplicationWindow::onKeyPress),
244 FXMAPFUNC(SEL_KEYRELEASE, 0, GUIApplicationWindow::onKeyRelease),
245 // clipboard
246 FXMAPFUNC(SEL_CLIPBOARD_REQUEST, 0, GUIApplicationWindow::onClipboardRequest),
247 // events
252};
253
254// Object implementation
255FXIMPLEMENT(GUIApplicationWindow, FXMainWindow, GUIApplicationWindowMap, ARRAYNUMBER(GUIApplicationWindowMap))
256
257// ===========================================================================
258// static members
259// ===========================================================================
261
262
263// ===========================================================================
264// member method definitions
265// ===========================================================================
266#ifdef _MSC_VER
267#pragma warning(push)
268#pragma warning(disable: 4355) // mask warning about "this" in initializers
269#endif
271 GUIMainWindow(a),
272 myFileMenuRecentNetworks(new FXMenuPane(this)),
273 myFileMenuRecentConfigs(new FXMenuPane(this)),
274 myRecentNetworks(a, "networks"),
275 myRecentConfigs(a, "configs"),
276 myLastStepEventMillis(SysUtils::getCurrentMillis() - MIN_DRAW_DELAY) {
277 // init icons
279 // init Textures
281 // init cursors
283 // disable tooltips
284 a->setTooltipTime(1000000000);
285 a->setTooltipPause(1000000000);
286}
287#ifdef _MSC_VER
288#pragma warning(pop)
289#endif
290
291
296
297
298void
300 // don't do this twice
301 if (hadDependentBuild) {
302 return;
303 }
304 hadDependentBuild = true;
305 setTarget(this);
306 setSelector(MID_WINDOW);
307 // build menu bar
308 myMenuBarDrag = new FXToolBarShell(this, GUIDesignToolBar);
310 new FXToolBarGrip(myMenuBar, myMenuBar, FXMenuBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
312 // build the thread - io
317 // build the status bar
318 myStatusbar = new FXStatusBar(this, GUIDesignStatusBar);
319 {
320 // build TraCi info
322 auto button = GUIDesigns::buildFXButton(myTraCiFrame, "TraCI", "", "", nullptr, this, MID_TRACI_STATUS, GUIDesignButtonStatusBarFixed);
323 button->setBackColor(FXRGBA(253, 255, 206, 255));
324 if (TraCIServer::getInstance() == nullptr) {
325 myTraCiFrame->hide();
326 }
327 // build geo coordiantes
329 myGeoCoordinate = new FXTextField(myGeoFrame, 26, this, MID_GEO_COORDINATE, FRAME_NONE | LAYOUT_CENTER_Y | TEXTFIELD_ENTER_ONLY, 0, 0, 0, GUIDesignHeight, 2, 2, 1, 1);
330 myGeoCoordinate->setHelpText(TL("Original coordinate (before coordinate transformation in netconvert). Enter 'lat, lon' or 'lat:... lon:...' to center view"));
331 myGeoCoordinate->setTipText(TL("Enter 'lat, lon' to center view"));
332 myGeoCoordinate->setBackColor(myGeoFrame->getBackColor());
333 myGeoCoordinate->setText(TL("N/A"));
334 myGeoCoordinate->disable();
335 myGeoCoordinate->setEditable(false);
336 // build cartesian coordinates
338 myCartesianCoordinate = new FXTextField(myCartesianFrame, 22, this, MID_CARTESIAN_COORDINATE, FRAME_NONE | LAYOUT_CENTER_Y | TEXTFIELD_ENTER_ONLY, 0, 0, 0, GUIDesignHeight, 2, 2, 1, 1);
339 myCartesianCoordinate->setHelpText(TL("Network coordinate. Enter 'x, y' to center view"));
340 myCartesianCoordinate->setTipText(TL("Enter 'x, y' to center view"));
341 myCartesianCoordinate->setBackColor(myCartesianFrame->getBackColor());
342 myCartesianCoordinate->setText(TL("N/A"));
343 // build buttons
344 std::vector<std::string> help({
345 TL("number of running vehicles"),
346 TL("number of insertion backlogged vehicles"),
347 TL("percentage of teleports per departed vehicles"),
348 TL("number of active persons"),
349 TL("number of active containers")});
350
353 myStatButtons.back()->hide();
355 myStatButtons.back()->hide();
357 myStatButtons.back()->hide();
359 myStatButtons.back()->hide();
360 }
361 // make the window a mdi-window
362 myMainSplitter = new FXSplitter(this, GUIDesignSplitter | SPLITTER_VERTICAL | SPLITTER_REVERSED);
364 myMDIMenu = new FXMDIMenu(this, myMDIClient);
365 new FXMDIWindowButton(myMenuBar, myMDIMenu, myMDIClient, FXMDIClient::ID_MDI_MENUWINDOW, GUIDesignMDIButtonLeft);
366 new FXMDIDeleteButton(myMenuBar, myMDIClient, FXMDIClient::ID_MDI_MENUCLOSE, GUIDesignMDIButtonRight);
367 new FXMDIRestoreButton(myMenuBar, myMDIClient, FXMDIClient::ID_MDI_MENURESTORE, GUIDesignMDIButtonRight);
368 new FXMDIMinimizeButton(myMenuBar, myMDIClient, FXMDIClient::ID_MDI_MENUMINIMIZE, GUIDesignMDIButtonRight);
369 // build the message window
371 // fill menu and tool bar
372 fillMenuBar();
373 myToolBar6->hide();
374 myToolBar7->hide();
375 myToolBar9->hide();
376 myToolBar10->hide();
377 // build additional threads
378 myLoadThread = new GUILoadThread(getApp(), this, myEvents, myLoadThreadEvent, isLibsumo);
380 // set the status bar
381 setStatusBarText(TL("Ready."));
382 // set the caption
383 setTitle(MFXUtils::getTitleText("SUMO " VERSION_STRING));
384 // start the simulation-thread (it will loop until the application ends deciding by itself whether to perform a step or not)
385 myRunThread->start();
388}
389
390
391void
394 gCurrentFolder = getApp()->reg().readStringEntry("SETTINGS", "basedir", "");
395 FXMainWindow::create();
396 myMenuBarDrag->create();
397 myToolBarDrag1->create();
398 myToolBarDrag2->create();
399 myToolBarDrag3->create();
400 myToolBarDrag4->create();
401 myToolBarDrag5->create();
402 myToolBarDrag6->create();
403 myToolBarDrag7->create();
404 myFileMenu->create();
405 mySelectByPermissions->create();
406 myEditMenu->create();
407 mySettingsMenu->create();
408 myLocatorMenu->create();
409 myControlMenu->create();
410 myWindowMenu->create();
411 myLanguageMenu->create();
412 myHelpMenu->create();
413 FXint textWidth = getApp()->getNormalFont()->getTextWidth("8", 1) * 24;
414 myCartesianFrame->setWidth(textWidth);
415 myGeoFrame->setWidth(textWidth);
416 if (myTestFrame) {
417 myTestFrame->setWidth(textWidth);
418 }
419
420 show(PLACEMENT_DEFAULT);
421 if (!OptionsCont::getOptions().isSet("window-size")) {
422 if (getApp()->reg().readIntEntry("SETTINGS", "maximized", 0) == 1) {
423 maximize();
424 }
425 }
426 myShowTimeAsHMS = (getApp()->reg().readIntEntry("gui", "timeasHMS", 0) == 1);
427 myAlternateSimDelay = getApp()->reg().readIntEntry("gui", "alternateSimDelay", 100);
428 const std::string& onlineMaps = getApp()->reg().readStringEntry("gui", "onlineMaps", "");
429 for (const std::string& entry : StringTokenizer(onlineMaps, "\n").getVector()) {
430 const std::vector<std::string> split = StringTokenizer(entry, "\t").getVector();
431 if (split.size() == 2) {
432 myOnlineMaps[split[0]] = split[1];
433 }
434 }
435 if (myOnlineMaps.empty()) {
436 myOnlineMaps["GeoHack"] = "https://geohack.toolforge.org/geohack.php?params=%lat;%lon_scale:1000";
437 myOnlineMaps["Google Maps"] = "https://www.google.com/maps/search/?api=1&query=%lat,%lon&zoom=19";
438 myOnlineMaps["OSM"] = "https://www.openstreetmap.org/?mlat=%lat&mlon=%lon&zoom=18&layers=M";
439 }
441}
442
443
446 myRunThread->join();
448 // close icons
451 // delete visual
452 delete myGLVisual;
453 // delete some non-parented windows
454 delete myToolBarDrag1;
455 delete mySimDelayTarget;
456 // delete rest of elements
459 delete myRunThread;
460 delete myFileMenu;
461 delete myEditMenu;
463 delete mySettingsMenu;
464 delete myLocatorMenu;
465 delete myControlMenu;
466 delete myLanguageMenu;
467 delete myWindowMenu;
468 delete myHelpMenu;
469 delete myLoadThread;
470
471 while (!myEvents.empty()) {
472 // get the next event
473 GUIEvent* e = myEvents.top();
474 myEvents.pop();
475 delete e;
476 }
477 for (auto item : myHotkeyPress) {
478 delete item.second;
479 }
480 for (auto item : myHotkeyRelease) {
481 delete item.second;
482 }
483}
484
485
486void
488 FXMainWindow::detach();
489 myMenuBarDrag->detach();
490 myToolBarDrag1->detach();
491}
492
493
494void
495GUIApplicationWindow::addToWindowsMenu(FXMenuPane* /*menuPane*/) {
496 // unused, implement in children
497}
498
499
500void
502 // build file menu
503 myFileMenu = new FXMenuPane(this);
506 TL("New Window"), "Ctrl+Shift+N", TL("Open a new sumo-gui window."),
507 nullptr, this, MID_HOTKEY_CTRL_SHIFT_N_NEWWINDOW);
508 new FXMenuSeparator(myFileMenu);
510 TL("&Open Simulation..."), "Ctrl+O", TL("Open a simulation (Configuration file)."),
513 TL("Open &Network..."), "Ctrl+N", TL("Open a network."),
516 TL("Open Shapes "), "Ctrl+P", TL("Load POIs and Polygons for visualization."),
519 TL("Open EdgeData "), "Ctrl+U", TL("Load edge related data for visualization."),
522 TL("&Reload"), "Ctrl+R", TL("Reloads the simulation / the network."),
525 TL("Quick-Reload"), "Ctrl+0", TL("Reloads the simulation (but not network)."),
527 new FXMenuSeparator(myFileMenu);
529 TL("Save Configuration"), "Ctrl+Shift+S", TL("Save current options as a configuration file."),
532 TL("Close"), "Ctrl+W", TL("Close the simulation."),
534 new FXMenuSeparator(myFileMenu);
535 // build recent files
538 new FXMenuSeparator(myFileMenu);
540 TL("&Quit"), "Ctrl+Q", TL("Quit the Application."),
541 nullptr, this, MID_HOTKEY_CTRL_Q_CLOSE);
542 // build edit menu
543 mySelectByPermissions = new FXMenuPane(this);
544 std::vector<std::string> vehicleClasses = SumoVehicleClassStrings.getStrings();
545 for (const auto& vehicleClass : vehicleClasses) {
547 }
548 myEditMenu = new FXMenuPane(this);
551 TL("Edit Selected..."), "Ctrl+E", TL("Opens a dialog for editing the list of selected items."),
553 mySelectLanesMenuCascade = new FXMenuCascade(myEditMenu, TL("Select lanes which allow..."), GUIIconSubSys::getIcon(GUIIcon::FLAG), mySelectByPermissions);
554 mySelectLanesMenuCascade->setHelpText(TL("Opens a menu for selecting a vehicle class by which to selected lanes."));
555 new FXMenuSeparator(myEditMenu);
557 TL("Set Breakpoint"), "B", TL("Sets a breakpoint at the current simulation step"),
560 TL("Set Breakpoint with offset"), "Alt+B", TL("Sets a breakpoint at the current simulation step + offset configured in application settings"),
563 TL("Edit Breakpoints"), "Ctrl+B", TL("Opens a dialog for editing breakpoints."),
566 TL("Edit Visualisation"), "F9", TL("Opens a dialog for editing visualization settings."),
569 TL("Edit Viewport"), "Ctrl+I", TL("Opens a dialog for editing viewing area, zoom and rotation."),
571 new FXMenuSeparator(myEditMenu);
572 // add open in sumo options
573 myLoadAdditionalsInNetedit = GUIDesigns::buildFXMenuCheckbox(myEditMenu, TL("Load additionals in netedit"), TL("Load additionals in netedit."), this, MID_TOOLBAREDIT_LOADADDITIONALS);
574 myLoadAdditionalsInNetedit->setCheck(TRUE);
575 myLoadDemandInNetedit = GUIDesigns::buildFXMenuCheckbox(myEditMenu, TL("Load demand in netedit"), TL("Load demand in netedit."), this, MID_TOOLBAREDIT_LOADDEMAND);
576 myLoadDemandInNetedit->setCheck(FALSE);
578 TL("Open in netedit"), "Ctrl+T", TL("Opens current simulation in NETEDIT."),
581 TL("Open network in netedit"), "Ctrl+Shift+T", TL("Opens current network in NETEDIT."),
583 // build settings menu
584 mySettingsMenu = new FXMenuPane(this);
587 TL("Application Settings"), "Ctrl+H", TL("Open a Dialog for Application Settings editing."),
589 myGamingModeCheckbox = new FXMenuCheck(mySettingsMenu,
590 TL("Gaming Mode\tCtrl+G\tToggle gaming mode on/off."),
593 TL("Full Screen Mode"), "Ctrl+F", TL("Toggle full screen mode on/off."),
595 // build Locate menu
596 myLocatorMenu = new FXMenuPane(this);
599 TL("&Junctions"), "Shift+J", TL("Open a dialog for locating a Junction."),
602 TL("&Edges"), "Shift+E", TL("Open a dialog for locating an Edge."),
605 TL("&Vehicles"), "Shift+V", TL("Open a dialog for locating a Vehicle."),
608 TL("&Persons"), "Shift+P", TL("Open a dialog for locating a Person."),
611 TL("&Container"), "Shift+C", TL("Open a dialog for locating a Container."),
614 TL("&TLS"), "Shift+T", TL("Open a dialog for locating a Traffic Light."),
617 TL("&Additional"), "Shift+A", TL("Open a dialog for locating an Additional Structure."),
620 TL("P&oI"), "Shift+O", TL("Open a dialog for locating a Point of Interest."),
623 TL("Po&lygon"), "Shift+L", TL("Open a dialog for locating a Polygon."),
625 new FXMenuSeparator(myLocatorMenu);
626 GUIDesigns::buildFXMenuCheckbox(myLocatorMenu, TL("Show Internal Structures"), TL("Show internal junctions and streets in locator dialog."), this, MID_LISTINTERNAL);
627 FXMenuCheck* listParking = GUIDesigns::buildFXMenuCheckbox(myLocatorMenu, TL("Show Parking Vehicles"), TL("Show parking vehicles in locator dialog."), this, MID_LISTPARKING);
628 listParking->setCheck(myListParking);
629 GUIDesigns::buildFXMenuCheckbox(myLocatorMenu, TL("Show vehicles outside the road network"), TL("Show vehicles that are teleporting or driving remote-controlled outside the road network in locator dialog."), this, MID_LISTTELEPORTING);
630 // build control menu
631 // the shortcut designator is not only at text in the submenu but also defines the real shortcut key assigned with it!
632 // secondary shortcuts (ctrl+A, ctrl+S, ctrl+D) are defined in GUIShortcutsSubSys::buildSUMOAccelerators
633 myControlMenu = new FXMenuPane(this);
634 GUIDesigns::buildFXMenuTitle(myMenuBar, TL("Simulation"), nullptr, myControlMenu);
636 TL("Run"), "A,space", TL("Start/ Resume the simulation."),
639 TLC("Simulation", "Stop"), "S,space", TL("Halt the simulation."),
642 TL("Step"), "D", TL("Perform one simulation step."),
645 TL("Delay+"), "PgUp", TL("Increase simulation step delay."), nullptr, this, MID_DELAY_INC);
647 TL("Delay-"), "PgDn", TL("Decrease simulation step delay."), nullptr, this, MID_DELAY_DEC);
649 TL("Save"), "", TL("Save the current simulation state to a file."),
652 TL("Load"), "", TL("Load simulation state for the current network from file."),
654 // build windows menu
655 myWindowMenu = new FXMenuPane(this);
657 GUIDesigns::buildFXMenuCommandShortcut(myWindowMenu, TL("Open new view"), "", TL("Open a new microscopic view."), GUIIconSubSys::getIcon(GUIIcon::MICROVIEW), this, MID_NEW_MICROVIEW);
658#ifdef HAVE_OSG
660#endif
662 TL("Tile &Horizontally"), "", TL("Tile the views horizontally."),
663 GUIIconSubSys::getIcon(GUIIcon::WINDOWS_TILE_HORI), myMDIClient, FXMDIClient::ID_MDI_TILEHORIZONTAL);
665 TL("Tile &Vertically"), "", TL("Tile the views vertically."),
666 GUIIconSubSys::getIcon(GUIIcon::WINDOWS_TILE_VERT), myMDIClient, FXMDIClient::ID_MDI_TILEVERTICAL);
668 TL("Cascade"), "", TL("Cascade the views."),
670 myMDIClient, FXMDIClient::ID_MDI_CASCADE);
672 TL("&Close"), "", TL("Close the selected view."),
673 nullptr, myMDIClient, FXMDIClient::ID_MDI_CLOSE);
674 FXMenuSeparator* sep2 = new FXMenuSeparator(myWindowMenu);
675 sep2->setTarget(myMDIClient);
676 sep2->setSelector(FXMDIClient::ID_MDI_ANY);
677 // for whatever reason, sonar complains in the next line that sep2 may leak, but fox does the cleanup
678 GUIDesigns::buildFXMenuCommand(myWindowMenu, "", nullptr, myMDIClient, FXMDIClient::ID_MDI_1); // NOSONAR
679 GUIDesigns::buildFXMenuCommand(myWindowMenu, "", nullptr, myMDIClient, FXMDIClient::ID_MDI_2);
680 GUIDesigns::buildFXMenuCommand(myWindowMenu, "", nullptr, myMDIClient, FXMDIClient::ID_MDI_3);
681 GUIDesigns::buildFXMenuCommand(myWindowMenu, "", nullptr, myMDIClient, FXMDIClient::ID_MDI_4);
682 GUIDesigns::buildFXMenuCommand(myWindowMenu, TL("&Others..."), nullptr, myMDIClient, FXMDIClient::ID_MDI_OVER_5);
683
684 new FXMenuSeparator(myWindowMenu);
685 GUIDesigns::buildFXMenuCheckbox(myWindowMenu, TL("Show Status Line"), TL("Toggle the Status Bar on/off."), myStatusbar, FXWindow::ID_TOGGLESHOWN);
686 GUIDesigns::buildFXMenuCheckbox(myWindowMenu, TL("Show Message Window"), TL("Toggle the Message Window on/off."), myMessageWindow, FXWindow::ID_TOGGLESHOWN);
687 GUIDesigns::buildFXMenuCheckbox(myWindowMenu, TL("Show Simulation Time"), TL("Toggle the Simulation Time on/off."), myToolBar3, FXWindow::ID_TOGGLESHOWN);
688 GUIDesigns::buildFXMenuCheckbox(myWindowMenu, TL("Show Simulation Delay"), TL("Toggle the Simulation Delay Entry on/off."), myToolBar4, FXWindow::ID_TOGGLESHOWN);
690
691 new FXMenuSeparator(myWindowMenu);
693 TL("Clear Message Window"), "", TL("Clear the message window."),
695 // build windows menu
697 // build help menu
698 myHelpMenu = new FXMenuPane(this);
700 TL("&Help"),
701 nullptr, myHelpMenu);
702 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Online Documentation"), "F1", TL("Open Online documentation."),
703 nullptr, this, MID_HOTKEY_F1_ONLINEDOCUMENTATION);
704 new FXMenuSeparator(myHelpMenu);
705 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Changelog"), "", TL("Open Changelog."),
706 nullptr, this, MID_CHANGELOG);
707 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Hotkeys"), "", TL("Open Hotkeys."),
708 nullptr, this, MID_HOTKEYS);
709 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Tutorial"), "", TL("Open Tutorial."),
710 nullptr, this, MID_TUTORIAL);
711 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Feedback"), "", TL("Open feedback dialog."),
712 nullptr, this, MID_FEEDBACK);
713 new FXMenuSeparator(myHelpMenu);
714 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&About"), "F12", TL("About sumo-gui."),
716 // build SUMO Accelerators (hotkeys)
717 GUIShortcutsSubSys::buildAccelerators(getAccelTable(), this, true);
718}
719
720
721void
723 // file and simulation tool bar
724 {
725 myToolBarDrag1 = new FXToolBarShell(this, GUIDesignToolBar);
727 new FXToolBarGrip(myToolBar1, myToolBar1, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
728 // build file tools
729 new MFXButtonTooltip(myToolBar1, myStaticTooltipMenu, TL("\tOpen simulation\tOpen a simulation (Configuration file)."),
731 new MFXButtonTooltip(myToolBar1, myStaticTooltipMenu, TL("\tOpen network\tOpen a network."),
733 new MFXButtonTooltip(myToolBar1, myStaticTooltipMenu, TL("\tReload\tReloads the simulation / the network."),
735 }
736 // simulation toolbar
737 {
738 myToolBarDrag2 = new FXToolBarShell(this, GUIDesignToolBar);
740 new FXToolBarGrip(myToolBar2, myToolBar2, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
741 // build simulation tools
742 new MFXButtonTooltip(myToolBar2, myStaticTooltipMenu, TL("\tRun\tStart/Resume the loaded simulation."),
744 new MFXButtonTooltip(myToolBar2, myStaticTooltipMenu, TL("\tStop\tHalt the running simulation."),
746 new MFXButtonTooltip(myToolBar2, myStaticTooltipMenu, TL("\tStep\tPerform a single simulation step."),
748 }
749 // Simulation Step Display
750 {
751 myToolBarDrag3 = new FXToolBarShell(this, GUIDesignToolBar);
753 new FXToolBarGrip(myToolBar3, myToolBar3, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
754 new MFXButtonTooltip(myToolBar3, myStaticTooltipMenu, TL("Time:\tToggle between time formats\tToggle between seconds and hour:minute:seconds display."), nullptr, this, MID_TIME_TOGGLE, GUIDesignButtonToolbarText);
755
756 myLCDLabel = new MFXLCDLabel(myToolBar3, myStaticTooltipMenu, 16, nullptr, 0, JUSTIFY_RIGHT);
761 myLCDLabel->setText("----------------");
762 }
763 // Simulation Delay
764 {
765 myToolBarDrag4 = new FXToolBarShell(this, GUIDesignToolBar);
767 new FXToolBarGrip(myToolBar4, myToolBar4, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
768 new MFXButtonTooltip(myToolBar4, myStaticTooltipMenu, TL("Delay (ms):\tDelay per simulated second\tDelay per simulated second. Click to toggle between the last two delay values."), nullptr, this, MID_DELAY_TOGGLE, GUIDesignButtonToolbarText);
769 // create spinner for delay
770 mySimDelay = 0;
771 mySimDelayTarget = new FXDataTarget(mySimDelay);
773 // create slider
774 mySimDelaySlider = new FXSlider(myToolBar4, mySimDelayTarget, FXDataTarget::ID_VALUE, GUIDesignSlider);
775 mySimDelaySlider->setRange(0, 1000);
776 mySimDelaySlider->setHeadSize(10);
777 mySimDelaySlider->setIncrement(50);
778 mySimDelaySlider->setTickDelta(100);
779 mySimDelaySlider->setValue((int)mySimDelay);
780 //mySimDelayTarget->setNumberFormat(0);
781 //mySimDelayTarget->setIncrements(1, 10, 10);
782 mySimDelaySpinner->setIncrement(10);
783 mySimDelaySpinner->setRange(0, 10000);
784 mySimDelaySpinner->setValue(mySimDelay);
785 }
786 // Scale traffic (flows and incrementally loaded vehicles)
787 {
788 myToolBarDrag8 = new FXToolBarShell(this, GUIDesignToolBar);
790 new FXToolBarGrip(myToolBar8, myToolBar8, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
791 myScaleTrafficTooltip = new MFXLabelTooltip(myToolBar8, myStaticTooltipMenu, TL("Scale Traffic:"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
792 myScaleTrafficTooltip->setHelpText(TL("Scale traffic volume from running flows and from vehicles that are loaded incrementally from route files."));
794 myDemandScaleSpinner->setIncrement(0.5);
795 myDemandScaleSpinner->setRange(0, 1000);
796 myDemandScaleSpinner->setValue(1);
797 }
798 // Views
799 {
800 myToolBarDrag5 = new FXToolBarShell(this, GUIDesignToolBar);
802 new FXToolBarGrip(myToolBar5, myToolBar5, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
803 // build view tools
804 new MFXButtonTooltip(myToolBar5, myStaticTooltipMenu, (std::string("\t") + TL("Open new view") + std::string("\t") + TL("Open a new microscopic view.")).c_str(),
806#ifdef HAVE_OSG
807 new MFXButtonTooltip(myToolBar5, myStaticTooltipMenu, (std::string("\t") + TL("Open new 3D view") + std::string("\t") + TL("Open a new 3D view.")).c_str(),
809#endif
810 // add toggle button for tooltips in view on/off (by default unchecked)
812 myStaticTooltipMenu, (std::string("\t") + TL("Toggle View Tooltips") + std::string("\t") + TL("Toggles whether tooltips in the view shall be shown.")).c_str(),
814 myShowToolTipsView->setChecked(getApp()->reg().readIntEntry("gui", "viewToolTips", 0) == 1);
816 // add toggle button for tooltips in menu on/off (by default checked)
818 myStaticTooltipMenu, (std::string("\t") + TL("Toggle Menu Tooltips") + std::string("\t") + TL("Toggles whether tooltips in the menu shall be shown.")).c_str(),
820 myShowToolTipsMenu->setChecked(getApp()->reg().readIntEntry("gui", "menuToolTips", 0) != 1);
822 }
824 {
825 // total waitingTime
826 myToolBarDrag6 = new FXToolBarShell(this, GUIDesignToolBar);
828 new FXToolBarGrip(myToolBar6, myToolBar6, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
829 GUIDesigns::buildFXLabel(myToolBar6, TL("Waiting Time:"), "", TL("Time spent waiting accumulated for all vehicles"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
830 myWaitingTimeLabel = new MFXLCDLabel(myToolBar6, myStaticTooltipMenu, 13, nullptr, 0, JUSTIFY_RIGHT);
835 myWaitingTimeLabel->setText("-------------");
836 // idealistic time loss
837 myToolBarDrag7 = new FXToolBarShell(this, GUIDesignToolBar);
839 new FXToolBarGrip(myToolBar7, myToolBar7, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
840 GUIDesigns::buildFXLabel(myToolBar7, TL("Time Loss:"), "", TL("Time lost due to being unable to drive with maximum speed for all vehicles"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
841 myTimeLossLabel = new MFXLCDLabel(myToolBar7, myStaticTooltipMenu, 13, nullptr, 0, JUSTIFY_RIGHT);
846 myTimeLossLabel->setText("-------------");
847 // total driving distance
848 myToolBarDrag9 = new FXToolBarShell(this, GUIDesignToolBar);
850 new FXToolBarGrip(myToolBar9, myToolBar9, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
851 GUIDesigns::buildFXLabel(myToolBar9, TL("Distance (km):"), "", TL("Total distance driven by DRT vehicles"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
852 myTotalDistanceLabel = new MFXLCDLabel(myToolBar9, myStaticTooltipMenu, 13, nullptr, 0, JUSTIFY_RIGHT);
857 myTotalDistanceLabel->setText("-------------");
858 // emergency vehicle counts
859 myToolBarDrag10 = new FXToolBarShell(this, GUIDesignToolBar);
861 new FXToolBarGrip(myToolBar10, myToolBar10, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
862 GUIDesigns::buildFXLabel(myToolBar10, TL("Emergency Vehicle waiting time:"), "", TL("Time spent waiting accumulated for emergency vehicles"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
863 myEmergencyVehicleLabel = new MFXLCDLabel(myToolBar10, myStaticTooltipMenu, 13, nullptr, 0, JUSTIFY_RIGHT);
868 myEmergencyVehicleLabel->setText("-------------");
869 }
870}
871
872
873void
874GUIApplicationWindow::buildRecentNetworks(FXMenuPane* fileMenu, FXMenuPane* fileMenuRecentNetworks) {
875 // for whatever reason, sonar complains in the next line that sep1 may leak, but fox does the cleanup
876 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_1);
877 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_2);
878 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_3);
879 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_4);
880 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_5);
881 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_6);
882 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_7);
883 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_8);
884 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_9);
885 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_10);
886 new FXMenuSeparator(fileMenuRecentNetworks); // NOSONAR, Fox does the cleanup
887 GUIDesigns::buildFXMenuCommand(fileMenuRecentNetworks, TL("Cl&ear Recent Networks"), nullptr, &myRecentNetworks, FXRecentFiles::ID_CLEAR);
888 GUIDesigns::buildFXMenuCommand(fileMenuRecentNetworks, TL("No Recent Networks"), nullptr, &myRecentNetworks, MFXRecentNetworks::ID_NOFILES);
889 // set target
890 myRecentNetworks.setTarget(this);
891 myRecentNetworks.setSelector(MID_RECENTFILE);
892 new FXMenuCascade(fileMenu, TL("Recent Networks"), nullptr, fileMenuRecentNetworks);
893}
894
895
896void
897GUIApplicationWindow::buildRecentConfigs(FXMenuPane* fileMenu, FXMenuPane* fileMenuRecentConfigs) {
898 // for whatever reason, sonar complains in the next line that sep1 may leak, but fox does the cleanup
899 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_1);
900 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_2);
901 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_3);
902 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_4);
903 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_5);
904 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_6);
905 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_7);
906 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_8);
907 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_9);
908 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_10);
909 new FXMenuSeparator(fileMenuRecentConfigs); // NOSONAR, Fox does the cleanup
910 GUIDesigns::buildFXMenuCommand(fileMenuRecentConfigs, TL("Cl&ear Recent Configs"), nullptr, &myRecentConfigs, FXRecentFiles::ID_CLEAR);
911 GUIDesigns::buildFXMenuCommand(fileMenuRecentConfigs, TL("No Recent Configs"), nullptr, &myRecentConfigs, MFXRecentNetworks::ID_NOFILES);
912 // set target
913 myRecentConfigs.setTarget(this);
914 myRecentConfigs.setSelector(MID_RECENTFILE);
915 new FXMenuCascade(fileMenu, TL("Recent Configs"), nullptr, fileMenuRecentConfigs);
916}
917
918
919long
920GUIApplicationWindow::onCmdQuit(FXObject*, FXSelector, void*) {
922 getApp()->reg().writeStringEntry("SETTINGS", "basedir", gCurrentFolder.text());
923 getApp()->reg().writeIntEntry("SETTINGS", "maximized", isMaximized() ? 1 : 0);
924 getApp()->reg().writeIntEntry("gui", "timeasHMS", myShowTimeAsHMS ? 1 : 0);
925 getApp()->reg().writeIntEntry("gui", "alternateSimDelay", (int)myAlternateSimDelay);
927 getApp()->exit(0);
928 return 1;
929}
930
931
932long
933GUIApplicationWindow::onCmdEditChosen(FXObject* menu, FXSelector, void*) {
934 FXMenuCommand* mc = dynamic_cast<FXMenuCommand*>(menu);
935 if (mc->getText() == StringUtils::replace(TL("Edit Selected..."), "&", "").c_str()) {
937 chooser->create();
938 chooser->show();
939 } else {
941 const SUMOVehicleClass svc = SumoVehicleClassStrings.get(mc->getText().text());
942 for (MSEdgeVector::const_iterator i = MSEdge::getAllEdges().begin(); i != MSEdge::getAllEdges().end(); ++i) {
943 const std::vector<MSLane*>& lanes = (*i)->getLanes();
944 for (std::vector<MSLane*>::const_iterator it = lanes.begin(); it != lanes.end(); ++it) {
945 GUILane* lane = dynamic_cast<GUILane*>(*it);
946 assert(lane != 0);
947 if ((lane->getPermissions() & svc) != 0) {
948 gSelected.select(lane->getGlID());
949 }
950 }
951 }
952 if (myMDIClient->numChildren() > 0) {
953 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
954 if (w != nullptr) {
955 // color by selection
957 }
958 }
959 }
961 }
962 return 1;
963}
964
965
966long
967GUIApplicationWindow::onCmdEditBreakpoints(FXObject*, FXSelector, void*) {
968 if (myBreakpointDialog == nullptr) {
970 } else {
971 myBreakpointDialog->restore();
972 myBreakpointDialog->setFocus();
973 myBreakpointDialog->raise();
974 }
975 return 1;
976}
977
978
979long
980GUIApplicationWindow::onCmdEditViewport(FXObject*, FXSelector, void*) {
981 if (!myGLWindows.empty()) {
982 myGLWindows[0]->getView()->showViewportEditor();
983 }
984 return 1;
985}
986
987
988long
989GUIApplicationWindow::onCmdEditViewScheme(FXObject*, FXSelector, void*) {
990 if (!myGLWindows.empty()) {
991 myGLWindows[0]->getView()->showViewschemeEditor();
992 }
993 return 1;
994}
995
996
997long
998GUIApplicationWindow::onCmdHelp(FXObject*, FXSelector, void*) {
999 MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/sumo-gui.html");
1000 return 1;
1001}
1002
1003
1004long
1005GUIApplicationWindow::onCmdChangelog(FXObject*, FXSelector, void*) {
1006 // update in every version
1007 MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/ChangeLog.html");
1008 return 1;
1009}
1010
1011
1012long
1013GUIApplicationWindow::onCmdHotkeys(FXObject*, FXSelector, void*) {
1014 MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/sumo-gui.html#keyboard_shortcuts");
1015 return 1;
1016}
1017
1018
1019long
1020GUIApplicationWindow::onCmdTutorial(FXObject*, FXSelector, void*) {
1021 MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/Tutorials/index.html");
1022 return 1;
1023}
1024
1025
1026long
1027GUIApplicationWindow::onCmdOpenInNetedit(FXObject* sender, FXSelector, void* ptr) {
1028 if (myGLWindows.empty()) {
1029 return 1;
1030 }
1031 bool onlyNet;
1032 if (sender == myOpenNetInNetedit) {
1033 onlyNet = true;
1034 } else if (sender == myOpenInNetedit) {
1035 onlyNet = false;
1036 } else {
1037 // we have to check (menu-item) sender first because ptr is only valid when
1038 // triggered via hotkey
1039 FXEvent* e = (FXEvent*) ptr;
1040 onlyNet = (e->state & SHIFTMASK) != 0;
1041 }
1042 FXRegistry reg("SUMO netedit", "netedit");
1043 reg.read();
1044 const GUISUMOAbstractView* const v = myGLWindows[0]->getView();
1045 reg.writeRealEntry("viewport", "x", v->getChanger().getXPos());
1046 reg.writeRealEntry("viewport", "y", v->getChanger().getYPos());
1047 reg.writeRealEntry("viewport", "z", v->getChanger().getZPos());
1048 reg.write();
1049 std::string netedit = "netedit";
1050 const char* sumoPath = getenv("SUMO_HOME");
1051 if (sumoPath != nullptr) {
1052 std::string newPath = std::string(sumoPath) + "/bin/netedit";
1053 if (FileHelpers::isReadable(newPath) || FileHelpers::isReadable(newPath + ".exe")) {
1054 netedit = "\"" + newPath + "\"";
1055 }
1056 }
1057 // declare command for calling netedit using the viewport saved in registry
1058 std::string cmd = netedit + " --registry-viewport";
1059 // continue depending if we're loading only a network or the entire sumo config
1060 if (myLoadAdditionalsInNetedit->shown() && !onlyNet) {
1061 cmd += " --sumocfg-file \"" + OptionsCont::getOptions().getString("configuration-file") + "\"";
1062 // check if ignore additional or demand elements
1063 if (myLoadAdditionalsInNetedit->getCheck() == FALSE) {
1064 cmd += " --ignore.additionalelements";
1065 }
1066 if (myLoadDemandInNetedit->getCheck() == FALSE) {
1067 cmd += " --ignore.routeelements";
1068 }
1069 } else {
1070 cmd += " -s \"" + OptionsCont::getOptions().getString("net-file") + "\"";
1071 }
1072 // start in background
1073#ifndef WIN32
1074 cmd = cmd + " &";
1075#else
1076 // see "help start" for the parameters
1077 cmd = "start /B \"\" " + cmd;
1078#endif
1079 WRITE_MESSAGEF(TL("Running %."), cmd);
1080 // yay! fun with dangerous commands... Never use this over the internet
1082 return 1;
1083}
1084
1085
1086long
1087GUIApplicationWindow::onCmdNewWindow(FXObject*, FXSelector, void*) {
1088 FXRegistry reg("SUMO sumo-gui", "sumo-gui");
1089 std::string sumo_gui = "sumo-gui";
1090 const char* sumoPath = getenv("SUMO_HOME");
1091 if (sumoPath != nullptr) {
1092 std::string newPath = std::string(sumoPath) + "/bin/sumo_gui";
1093 if (FileHelpers::isReadable(newPath) || FileHelpers::isReadable(newPath + ".exe")) {
1094 sumo_gui = "\"" + newPath + "\"";
1095 }
1096 }
1097 std::string cmd = sumo_gui;
1098 // start in background
1099#ifndef WIN32
1100 cmd = cmd + " &";
1101#else
1102 // see "help start" for the parameters
1103 cmd = "start /B \"\" " + cmd;
1104#endif
1105 WRITE_MESSAGEF(TL("Running %."), cmd);
1106 // yay! fun with dangerous commands... Never use this over the internet
1108 return 1;
1109}
1110
1111
1112long
1114 // get the new file name
1115 FXFileDialog opendialog(this, TL("Open Simulation Configuration"));
1117 opendialog.setSelectMode(SELECTFILE_EXISTING);
1118 opendialog.setPatternList(SUMOXMLDefinitions::SumoConfigFileExtensions.getMultilineString().c_str());
1119 if (gCurrentFolder.length() != 0) {
1120 opendialog.setDirectory(gCurrentFolder);
1121 }
1122 if (opendialog.execute()) {
1123 gCurrentFolder = opendialog.getDirectory();
1124 std::string file = opendialog.getFilename().text();
1125 loadConfigOrNet(file);
1126 myRecentConfigs.appendFile(file.c_str());
1127 }
1128 return 1;
1129}
1130
1131
1132long
1133GUIApplicationWindow::onCmdOpenNetwork(FXObject*, FXSelector, void*) {
1134 // get the new file name
1135 FXFileDialog opendialog(this, TL("Open Network"));
1136 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
1137 opendialog.setSelectMode(SELECTFILE_EXISTING);
1138 opendialog.setPatternList(SUMOXMLDefinitions::NetFileExtensions.getMultilineString().c_str());
1139 if (gCurrentFolder.length() != 0) {
1140 opendialog.setDirectory(gCurrentFolder);
1141 }
1142 if (opendialog.execute()) {
1143 gCurrentFolder = opendialog.getDirectory();
1144 std::string file = opendialog.getFilename().text();
1145 loadConfigOrNet(file);
1146 myRecentNetworks.appendFile(file.c_str());
1147 }
1148 return 1;
1149}
1150
1151
1152long
1153GUIApplicationWindow::onCmdOpenShapes(FXObject*, FXSelector, void*) {
1154 // get the shape file name
1155 FXFileDialog opendialog(this, TL("Open Shapes"));
1156 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_SHAPES));
1157 opendialog.setSelectMode(SELECTFILE_EXISTING);
1158 opendialog.setPatternList(SUMOXMLDefinitions::ShapesFileExtensions.getMultilineString().c_str());
1159 if (gCurrentFolder.length() != 0) {
1160 opendialog.setDirectory(gCurrentFolder);
1161 }
1162 if (opendialog.execute()) {
1163 gCurrentFolder = opendialog.getDirectory();
1164 std::string file = opendialog.getFilename().text();
1165
1166 dynamic_cast<GUIShapeContainer&>(myRunThread->getNet().getShapeContainer()).allowReplacement();
1168 if (!XMLSubSys::runParser(handler, file, false)) {
1169 WRITE_MESSAGEF(TL("Loading of % failed."), file);
1170 }
1171 update();
1172 if (myMDIClient->numChildren() > 0) {
1173 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1174 if (w != nullptr) {
1175 w->getView()->update();
1176 }
1177 }
1178 }
1179 return 1;
1180}
1181
1182
1183long
1184GUIApplicationWindow::onCmdOpenEdgeData(FXObject*, FXSelector, void*) {
1185 // get the shape file name
1186 FXFileDialog opendialog(this, TL("Open EdgeData"));
1187 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
1188 opendialog.setSelectMode(SELECTFILE_EXISTING);
1189 opendialog.setPatternList(SUMOXMLDefinitions::EdgeDataFileExtensions.getMultilineString().c_str());
1190 if (gCurrentFolder.length() != 0) {
1191 opendialog.setDirectory(gCurrentFolder);
1192 }
1193 if (opendialog.execute()) {
1194 gCurrentFolder = opendialog.getDirectory();
1195 std::string file = opendialog.getFilename().text();
1196 if (!GUINet::getGUIInstance()->loadEdgeData(file)) {
1197 WRITE_MESSAGEF(TL("Loading of % failed."), file);
1198 }
1199 update();
1200 if (myMDIClient->numChildren() > 0) {
1201 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1202 if (w != nullptr) {
1203 w->getView()->update();
1204 }
1205 }
1206 }
1207 return 1;
1208}
1209
1210
1211long
1212GUIApplicationWindow::onCmdReload(FXObject* sender, FXSelector sel, void*) {
1213 if (!myAmLoading && (sender == nullptr || (myRunThread->networkAvailable() && myLoadThread->getFileName() != "" && TraCIServer::getInstance() == nullptr))) {
1215 getApp()->beginWaitCursor();
1216 myAmLoading = true;
1217 myIsReload = sender != nullptr || sel == 1;
1219 myLoadThread->start();
1220 if (sender == nullptr) {
1221 setStatusBarText(sel == 1 ? TL("Auto-Reloading.") : TL("TraCI-Loading."));
1222 } else {
1223 setStatusBarText(TL("Reloading."));
1224 }
1225 update();
1226 }
1227 return 1;
1228}
1229
1230
1231long
1232GUIApplicationWindow::onCmdQuickReload(FXObject*, FXSelector, void*) {
1233 if (!myAmLoading) {
1234 setStatusBarText(TL("Quick-Reloading."));
1236 }
1237 return 1;
1238}
1239
1240
1241long
1242GUIApplicationWindow::onCmdOpenRecent(FXObject* /* sender */, FXSelector, void* ptr) {
1243 if (myAmLoading) {
1244 myStatusbar->getStatusLine()->setText(TL("Already loading!"));
1245 return 1;
1246 }
1247 std::string file((const char*)ptr);
1248 loadConfigOrNet(file);
1249 return 1;
1250}
1251
1252
1253long
1254GUIApplicationWindow::onCmdSaveConfig(FXObject*, FXSelector, void*) {
1255 // get the new file name
1256 FXFileDialog opendialog(this, TL("Save SUMO Configuration"));
1257 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SAVE));
1258 opendialog.setSelectMode(SELECTFILE_ANY);
1259 opendialog.setPatternList(SUMOXMLDefinitions::SumoConfigFileExtensions.getMultilineString().c_str());
1260 if (gCurrentFolder.length() != 0) {
1261 opendialog.setDirectory(gCurrentFolder);
1262 }
1263 if (!opendialog.execute() || !MFXUtils::userPermitsOverwritingWhenFileExists(this, opendialog.getFilename())) {
1264 return 1;
1265 }
1266 const std::string file = MFXUtils::assureExtension(opendialog).text();
1267 std::ofstream out(XMLSubSys::transcodeToLocal(file));
1268 if (out.good()) {
1269 OptionsCont::getOptions().writeConfiguration(out, true, false, false, file, true);
1270 setStatusBarText(TLF("Configuration saved to %.", file));
1271 } else {
1272 setStatusBarText(TLF("Could not save configuration to %.", file));
1273 }
1274 out.close();
1275 return 1;
1276}
1277
1278
1279long
1280GUIApplicationWindow::onCmdClose(FXObject*, FXSelector, void*) {
1282 return 1;
1283}
1284
1285
1286long
1287GUIApplicationWindow::onUpdOpen(FXObject* sender, FXSelector, void* ptr) {
1288 sender->handle(this,
1289 myAmLoading ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1290 ptr);
1291 return 1;
1292}
1293
1294
1295long
1296GUIApplicationWindow::onUpdReload(FXObject* sender, FXSelector, void* ptr) {
1297 sender->handle(this,
1299 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1300 ptr);
1301 return 1;
1302}
1303
1304
1305long
1306GUIApplicationWindow::onUpdOpenRecent(FXObject* sender, FXSelector, void* ptr) {
1307 sender->handle(this,
1308 myAmLoading ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1309 ptr);
1310 return 1;
1311}
1312
1313
1314long
1315GUIApplicationWindow::onUpdAddView(FXObject* sender, FXSelector, void* ptr) {
1316 sender->handle(this,
1318 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1319 ptr);
1320 return 1;
1321}
1322
1323
1324long
1325GUIApplicationWindow::onCmdStart(FXObject*, FXSelector, void*) {
1326 // check whether a net was loaded successfully
1327 if (!myRunThread->networkAvailable()) {
1328 myStatusbar->getStatusLine()->setText(TL("No simulation loaded!"));
1329 return 1;
1330 }
1331 // check whether it was started before and paused;
1332 if (!myWasStarted) {
1333 myRunThread->begin();
1334 myWasStarted = true;
1335 }
1337 getApp()->forceRefresh(); // only calling myToolBar2->forceRefresh somehow looses keyboard focus
1338 return 1;
1339}
1340
1341
1342long
1343GUIApplicationWindow::onCmdStop(FXObject*, FXSelector, void*) {
1344 myRunThread->stop();
1345 getApp()->forceRefresh(); // only calling myToolBar2->forceRefresh somehow looses keyboard focus
1346 return 1;
1347}
1348
1349
1350long
1351GUIApplicationWindow::onCmdStep(FXObject*, FXSelector, void*) {
1352 // check whether a net was loaded successfully
1353 if (!myRunThread->networkAvailable()) {
1354 myStatusbar->getStatusLine()->setText(TL("No simulation loaded!"));
1355 return 1;
1356 }
1357 // check whether it was started before and paused;
1358 if (!myWasStarted) {
1359 myRunThread->begin();
1360 myWasStarted = true;
1361 }
1363 return 1;
1364}
1365
1366
1367long
1368GUIApplicationWindow::onCmdSaveState(FXObject*, FXSelector, void*) {
1369 // get the new file name
1370 FXFileDialog opendialog(this, TL("Save Simulation State"));
1371 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SAVE));
1372 opendialog.setSelectMode(SELECTFILE_ANY);
1373 opendialog.setPatternList(SUMOXMLDefinitions::StateFileExtensions.getMultilineString().c_str());
1374 if (gCurrentFolder.length() != 0) {
1375 opendialog.setDirectory(gCurrentFolder);
1376 }
1377 if (!opendialog.execute() || !MFXUtils::userPermitsOverwritingWhenFileExists(this, opendialog.getFilename())) {
1378 return 1;
1379 }
1380 const std::string file = MFXUtils::assureExtension(opendialog).text();
1381 MSStateHandler::saveState(file, MSNet::getInstance()->getCurrentTimeStep(), false);
1382 setStatusBarText(TLF("Simulation state saved to '%'.", file));
1383 return 1;
1384}
1385
1386
1387long
1388GUIApplicationWindow::onCmdLoadState(FXObject*, FXSelector, void*) {
1389 // get the new file name
1390 FXFileDialog opendialog(this, TL("Load Simulation State"));
1391 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN));
1392 opendialog.setSelectMode(SELECTFILE_ANY);
1393 opendialog.setPatternList(SUMOXMLDefinitions::StateFileExtensions.getMultilineString().c_str());
1394 if (gCurrentFolder.length() != 0) {
1395 opendialog.setDirectory(gCurrentFolder);
1396 }
1397 if (opendialog.execute() && FXStat::exists(opendialog.getFilename())) {
1398 gCurrentFolder = opendialog.getDirectory();
1399 const std::string file = opendialog.getFilename().text();
1400 try {
1401 MSNet::getInstance()->loadState(file, true);
1402 setStatusBarText(TLF("State loaded from '%'.", file));
1403 } catch (ProcessError& e) {
1404 setStatusBarText(TLF("Failed to load state from '%' (%).", file, e.what()));
1405 }
1406 }
1407 return 1;
1408}
1409
1410
1411long
1412GUIApplicationWindow::onCmdTimeToggle(FXObject*, FXSelector, void*) {
1413 // toggle show time as HMS
1418 }
1419 return 1;
1420}
1421
1422
1423long
1424GUIApplicationWindow::onCmdDelayInc(FXObject*, FXSelector, void*) {
1425 if (mySimDelay < 10) {
1426 mySimDelay = 10;
1427 } else if (mySimDelay >= 20 && mySimDelay < 50) {
1428 mySimDelay = 50;
1429 } else if (mySimDelay >= 200 && mySimDelay < 500) {
1430 mySimDelay = 500;
1431 } else {
1432 mySimDelay *= 2;
1433 }
1434 if (mySimDelay > 1000) {
1435 // setting high delay by pressing the key too often is hard to recover from
1436 mySimDelay = 1000;
1437 }
1438 mySimDelaySlider->setValue((int)mySimDelay);
1439 mySimDelaySpinner->setValue(mySimDelay);
1440 return 1;
1441}
1442
1443
1444long
1445GUIApplicationWindow::onCmdDelayDec(FXObject*, FXSelector, void*) {
1446 if (mySimDelay <= 10) {
1447 mySimDelay = 0;
1448 } else if (mySimDelay > 20 && mySimDelay <= 50) {
1449 mySimDelay = 20;
1450 } else if (mySimDelay > 200 && mySimDelay <= 500) {
1451 mySimDelay = 200;
1452 } else {
1453 mySimDelay /= 2;
1454 }
1455 mySimDelaySlider->setValue((int)mySimDelay);
1456 mySimDelaySpinner->setValue(mySimDelay);
1457 return 1;
1458}
1459
1460
1461long
1462GUIApplicationWindow::onCmdDelayToggle(FXObject*, FXSelector, void*) {
1463 const double tmp = myAlternateSimDelay;
1465 mySimDelay = tmp;
1466 return 1;
1467}
1468
1469
1470long
1471GUIApplicationWindow::onCmdDemandScale(FXObject*, FXSelector, void*) {
1474 }
1475 return 1;
1476}
1477
1478
1479long
1480GUIApplicationWindow::onCmdClearMsgWindow(FXObject*, FXSelector, void*) {
1482 return 1;
1483}
1484
1485
1486long
1487GUIApplicationWindow::onCmdBreakpoint(FXObject*, FXSelector, void*) {
1488 // see updateTimeLCD for the DELTA_T
1491 }
1492 return 1;
1493}
1494
1495
1496long
1497GUIApplicationWindow::onCmdBreakpointEarly(FXObject*, FXSelector, void*) {
1498 // see updateTimeLCD for the DELTA_T
1501 }
1502 return 1;
1503}
1504
1505
1506long
1507GUIApplicationWindow::onUpdStart(FXObject* sender, FXSelector, void* ptr) {
1508 sender->handle(this,
1510 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1511 ptr);
1513 // bind start simulation with space key
1515 }
1516 return 1;
1517}
1518
1519
1520long
1521GUIApplicationWindow::onUpdStop(FXObject* sender, FXSelector, void* ptr) {
1522 sender->handle(this,
1524 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1525 ptr);
1527 // bind stop simulation with space key
1529 }
1530 return 1;
1531}
1532
1533
1534long
1535GUIApplicationWindow::onUpdStep(FXObject* sender, FXSelector, void* ptr) {
1536 sender->handle(this,
1538 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1539 ptr);
1540 return 1;
1541}
1542
1543
1544long
1545GUIApplicationWindow::onUpdNeedsNetwork(FXObject* sender, FXSelector, void* ptr) {
1546 // check if there is a loaded network and gui isn't loading
1548 sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), ptr);
1549 // enable certain elements manually
1550 mySelectLanesMenuCascade->enable();
1551 myScaleTrafficTooltip->setTipText(TL("Scale number of vehicles in simulation"));
1552 } else {
1553 sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
1554 // disable certain elements manually
1555 mySelectLanesMenuCascade->disable();
1556 myScaleTrafficTooltip->setTipText("");
1557 }
1558 return 1;
1559}
1560
1561
1562long
1563GUIApplicationWindow::onUpdNeedsSumoConfig(FXObject* sender, FXSelector, void* ptr) {
1564 // check if there is a loaded network and gui isn't loading
1565 if (myRunThread->networkAvailable() && !myAmLoading && OptionsCont::getOptions().isSet("configuration-file")) {
1566 sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), ptr);
1567 sender->handle(this, FXSEL(SEL_COMMAND, ID_SHOW), ptr);
1568 myOpenInNetedit->setText(TL("Open sumo config in netedit"));
1569 } else {
1570 sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
1571 sender->handle(this, FXSEL(SEL_COMMAND, ID_HIDE), ptr);
1572 myOpenInNetedit->setText(TL("Open network in netedit"));
1573 }
1574 return 1;
1575}
1576
1577
1578long
1579GUIApplicationWindow::onUpdTraCIStatus(FXObject* /*sender*/, FXSelector, void* /*ptr*/) {
1581 myTraCiFrame->show();
1582 } else {
1583 myTraCiFrame->hide();
1584 }
1585 return 1;
1586}
1587
1588
1589long
1590GUIApplicationWindow::onCmdLocate(FXObject*, FXSelector sel, void*) {
1591 if (myMDIClient->numChildren() > 0) {
1592 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1593 if (w != nullptr) {
1594 w->onCmdLocate(nullptr, sel, nullptr);
1595 }
1596 }
1597 return 1;
1598}
1599
1600
1601long
1602GUIApplicationWindow::onCmdShowStats(FXObject*, FXSelector, void*) {
1603 if (myMDIClient->numChildren() > 0) {
1604 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1606 }
1607 return 1;
1608}
1609
1610
1611long
1612GUIApplicationWindow::onCmdAppSettings(FXObject*, FXSelector, void*) {
1614 d->create();
1615 d->show(PLACEMENT_OWNER);
1616 return 1;
1617}
1618
1619
1620long
1621GUIApplicationWindow::onCmdGaming(FXObject*, FXSelector, void*) {
1622 if (myGLWindows.empty()) {
1623 return 1;
1624 }
1626 myGLWindows[0]->getView()->editVisualisationSettings()->gaming = myAmGaming;
1627 if (myAmGaming) {
1628 myGamingModeCheckbox->setCheck(TRUE);
1629 myMenuBar->hide();
1630 myStatusbar->hide();
1631 myToolBar1->hide();
1632 myToolBar2->hide();
1633 myToolBar4->hide();
1634 myToolBar5->hide();
1635 myToolBar6->show();
1636 myToolBar8->hide();
1637 myToolBar10->show();
1638 if (myTLSGame) {
1639 myToolBar7->show();
1640 } else {
1641 myToolBar9->show();
1642 }
1643 myMessageWindow->hide();
1649 } else {
1650 myGamingModeCheckbox->setCheck(FALSE);
1651 myMenuBar->show();
1652 myStatusbar->show();
1653 myToolBar1->show();
1654 myToolBar2->show();
1655 myToolBar4->show();
1656 myToolBar5->show();
1657 myToolBar6->hide();
1658 myToolBar7->hide();
1659 myToolBar8->show();
1660 myToolBar9->hide();
1661 myToolBar10->hide();
1662 myMessageWindow->show();
1664 }
1665 if (myMDIClient->numChildren() > 0) {
1666 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1667 if (w != nullptr) {
1669 }
1670 }
1671 update();
1672 return 1;
1673}
1674
1675
1676long
1678 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1679 if (w != nullptr) {
1680 // show or hide grid depending of myNetworkViewOptions.menuCheckToggleGrid
1683 } else {
1685 }
1686 w->getView()->update();
1687 }
1688 return 1;
1689}
1690
1691
1692long
1694 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1695 if (w != nullptr) {
1696 // toggle secondary shape visualization
1698 w->getView()->update();
1699 }
1700 return 1;
1701}
1702
1703
1704long
1705GUIApplicationWindow::onCmdFullScreen(FXObject*, FXSelector, void*) {
1706 if (myGLWindows.empty()) {
1707 return 1;
1708 }
1710 if (myAmFullScreen) {
1711 getApp()->reg().writeIntEntry("SETTINGS", "x", getX());
1712 getApp()->reg().writeIntEntry("SETTINGS", "y", getY());
1713 getApp()->reg().writeIntEntry("SETTINGS", "width", getWidth());
1714 getApp()->reg().writeIntEntry("SETTINGS", "height", getHeight());
1715 maximize();
1716 setDecorations(DECOR_NONE);
1717 place(PLACEMENT_MAXIMIZED);
1718 myMenuBar->hide();
1719 myStatusbar->hide();
1720 myToolBar1->hide();
1721 myToolBar2->hide();
1722 myToolBar3->hide();
1723 myToolBar4->hide();
1724 myToolBar5->hide();
1725 myToolBar6->hide();
1726 myToolBar7->hide();
1727 myToolBar8->hide();
1728 myMessageWindow->hide();
1729 if (myMDIClient->numChildren() > 0) {
1730 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1731 if (w != nullptr) {
1732 w->setToolBarVisibility(false);
1733 }
1734 }
1735 update();
1736 } else {
1737 place(PLACEMENT_VISIBLE);
1738 setDecorations(DECOR_ALL);
1739 restore();
1740 myToolBar3->show();
1742 onCmdGaming(nullptr, 0, nullptr);
1743 setWidth(getApp()->reg().readIntEntry("SETTINGS", "width", 600));
1744 setHeight(getApp()->reg().readIntEntry("SETTINGS", "height", 400));
1745 setX(getApp()->reg().readIntEntry("SETTINGS", "x", 150));
1746 setY(getApp()->reg().readIntEntry("SETTINGS", "y", 150));
1747 }
1748 return 1;
1749}
1750
1751
1752long
1753GUIApplicationWindow::onCmdListInternal(FXObject*, FXSelector, void*) {
1755 return 1;
1756}
1757
1758
1759long
1760GUIApplicationWindow::onCmdListParking(FXObject*, FXSelector, void*) {
1762 return 1;
1763}
1764
1765long
1766GUIApplicationWindow::onCmdListTeleporting(FXObject*, FXSelector, void*) {
1768 return 1;
1769}
1770
1771
1772long
1773GUIApplicationWindow::onCmdNewView(FXObject*, FXSelector, void*) {
1775 return 1;
1776}
1777
1778
1779#ifdef HAVE_OSG
1780long
1781GUIApplicationWindow::onCmdNewOSG(FXObject*, FXSelector, void*) {
1783 return 1;
1784}
1785#endif
1786
1787
1788long
1789GUIApplicationWindow::onCmdShowToolTipsView(FXObject*, FXSelector, void*) {
1790 // invert check
1792 // update parent
1794 // save in registry
1795 getApp()->reg().writeIntEntry("gui", "viewToolTips", myShowToolTipsView->amChecked() ? 1 : 0);
1796 return 1;
1797}
1798
1799
1800long
1801GUIApplicationWindow::onCmdShowToolTipsMenu(FXObject*, FXSelector, void*) {
1802 // invert check
1804 // update parent
1806 // save in registry
1807 getApp()->reg().writeIntEntry("gui", "menuToolTips", myShowToolTipsMenu->amChecked() ? 0 : 1);
1808 return 1;
1809}
1810
1811
1812long
1813GUIApplicationWindow::onCmdFeedback(FXObject*, FXSelector, void*) {
1814 // create and open feedback dialog
1815 GUIDialog_Feedback* feedback = new GUIDialog_Feedback(this);
1816 feedback->create();
1817 feedback->show(PLACEMENT_OWNER);
1818 return 1;
1819}
1820
1821
1822long
1823GUIApplicationWindow::onCmdAbout(FXObject*, FXSelector, void*) {
1824 GUIDialog_AboutSUMO* about = new GUIDialog_AboutSUMO(this);
1825 about->create();
1826 about->show(PLACEMENT_OWNER);
1827 return 1;
1828}
1829
1830
1831long
1832GUIApplicationWindow::onCmdHallOfFame(FXObject*, FXSelector, void*) {
1834 hall->create();
1835 hall->show(PLACEMENT_OWNER);
1836 return 1;
1837}
1838
1839
1840long GUIApplicationWindow::onClipboardRequest(FXObject* /* sender */, FXSelector /* sel */, void* ptr) {
1841 FXEvent* event = (FXEvent*)ptr;
1842 FXString string = GUIUserIO::clipped.c_str();
1843 setDNDData(FROM_CLIPBOARD, event->target, string);
1844 return 1;
1845}
1846
1847
1848long
1849GUIApplicationWindow::onLoadThreadEvent(FXObject*, FXSelector, void*) {
1850 eventOccurred();
1851 return 1;
1852}
1853
1854
1855long
1856GUIApplicationWindow::onRunThreadEvent(FXObject*, FXSelector, void*) {
1857 eventOccurred();
1858 return 1;
1859}
1860
1861
1862void
1864 while (!myEvents.empty()) {
1865 // get the next event
1866 GUIEvent* e = myEvents.top();
1867 myEvents.pop();
1868 // process
1869 switch (e->getOwnType()) {
1872 setFocus();
1873 break;
1875 if (myRunThread->networkAvailable()) { // avoid race-condition related crash if reload was pressed
1877 }
1878 break;
1886 break;
1888 GUIEvent_AddView* ave = dynamic_cast<GUIEvent_AddView*>(e);
1890 if (ave->getSchemeName() != "") {
1891 MFXComboBoxIcon* sCombo = v->getColoringSchemesCombo();
1892 int index = sCombo->findItem(ave->getSchemeName().c_str());
1893 if (index >= 0) {
1894 sCombo->setCurrentItem(index);
1895 }
1896 v->setColorScheme(ave->getSchemeName());
1897 }
1898 break;
1899 }
1901 GUIEvent_CloseView* ave = dynamic_cast<GUIEvent_CloseView*>(e);
1902 removeViewByID(ave->getCaption());
1903 break;
1904 }
1907 break;
1908 default:
1909 break;
1910 }
1911 delete e;
1912 }
1913 myToolBar2->forceRefresh();
1914 myToolBar3->forceRefresh();
1915}
1916
1917
1918void
1920 myAmLoading = false;
1922 // check whether the loading was successful
1923 if (ec->myNet == nullptr) {
1924 // report failure
1925 setStatusBarText(TLF("Loading of '%' failed!", ec->myFile));
1928 getApp()->exit(1);
1929 }
1930 } else {
1931 // initialise simulation thread
1932 if (!myRunThread->init(ec->myNet, ec->myBegin, ec->myEnd)) {
1935 getApp()->exit(1);
1936 }
1937 } else {
1938 // report success
1939 setStatusBarText(TLF("'%' loaded.", ec->myFile));
1941 myWasStarted = false;
1943 // initialise views
1944 myViewNumber = 0;
1946 // check/record settings file modification time
1947 long long mTime = myGuiSettingsFileMTime;
1948 if (ec->mySettingsFiles.size() > 0) {
1949 for (std::string fname : ec->mySettingsFiles) {
1950 mTime = MAX2(mTime, SysUtils::getModifiedTime(fname));
1951 }
1952 }
1953 // always reload if settings were modified or to restore multiple views
1954 if (!myIsReload) {
1956 }
1957 if (ec->mySettingsFiles.size() > 0 && (!myIsReload || myGuiSettingsFileMTime < mTime || ec->mySettingsFiles.size() > 1)) {
1958 // open a view for each file and apply settings
1959 for (std::string fname : ec->mySettingsFiles) {
1960 GUISettingsHandler settings(getApp(), fname);
1961 GUISUMOViewParent::ViewType vt = defaultType;
1962 if (settings.getViewType() == "osg" || settings.getViewType() == "3d") {
1964 }
1965 if (settings.getViewType() == "opengl" || settings.getViewType() == "2d") {
1967 }
1968 GUISUMOAbstractView* view = openNewView(vt);
1969 if (view == nullptr) {
1970 break;
1971 }
1972 if (settings.getSettingName() != "") {
1973 view->setColorScheme(settings.getSettingName());
1974 MFXComboBoxIcon* sCombo = view->getColoringSchemesCombo();
1975 int index = sCombo->findItem(settings.getSettingName().c_str());
1976 if (index >= 0) {
1977 sCombo->setCurrentItem(index);
1978 }
1979 }
1980 view->addDecals(settings.getDecals());
1981 settings.applyViewport(view);
1982 settings.setSnapshots(view);
1983 if (settings.getDelay() > 0.) {
1984 mySimDelay = settings.getDelay();
1985 }
1986 if (settings.getBreakpoints().size() > 0) {
1988 myRunThread->getBreakpoints().assign(settings.getBreakpoints().begin(), settings.getBreakpoints().end());
1989 myRunThread->getBreakpointLock().unlock();
1990 }
1991 myJamSounds = settings.getEventDistribution("jam");
1992 myCollisionSounds = settings.getEventDistribution("collision");
1993 if (settings.getJamSoundTime() > 0) {
1994 myJamSoundTime = settings.getJamSoundTime();
1995 }
1996 for (const std::string& tlsID : settings.getTrackers()) {
1997 if (MSNet::getInstance()->getTLSControl().knows(tlsID)) {
2000 if (tllW) {
2001 tllW->begin2TrackPhases(this);
2002 }
2003 } else {
2004 WRITE_WARNINGF("Tracker for unknown tlLogic '%' in settings file '%'", tlsID, fname);
2005 }
2006 }
2007 }
2008 } else {
2009 openNewView(defaultType);
2010 }
2011 myGuiSettingsFileMTime = mTime;
2012 if (!OptionsCont::getOptions().isDefault("delay")) {
2013 setDelay(OptionsCont::getOptions().getFloat("delay"));
2014 mySimDelaySlider->setValue((int)mySimDelay);
2015 mySimDelaySpinner->setValue(mySimDelay);
2016 }
2017 if (!OptionsCont::getOptions().isDefault("breakpoints") && !myIsReload) {
2018 std::vector<SUMOTime> breakpoints;
2019 for (const std::string& val : OptionsCont::getOptions().getStringVector("breakpoints")) {
2020 SUMOTime t = string2time(val);
2021 // round down to nearest reachable time step
2022 t -= t % DELTA_T;
2023 breakpoints.push_back(t);
2024 }
2025 std::sort(breakpoints.begin(), breakpoints.end());
2027 myRunThread->getBreakpoints().assign(breakpoints.begin(), breakpoints.end());
2028 myRunThread->getBreakpointLock().unlock();
2029 }
2030 if (!OptionsCont::getOptions().isDefault("selection-file")) {
2031 delete myDynamicSelection;
2032 myDynamicSelection = new std::stringstream();
2033 std::string msg = gSelected.load(OptionsCont::getOptions().getString("selection-file"), GLO_MAX, myDynamicSelection);
2034 if (msg != "") {
2035 WRITE_ERRORF("Errors while loading selection: %", msg.c_str());
2036 }
2037 if (!myDynamicSelection->str().empty()) {
2038 std::string dummy;
2039 int numNotFound = 0;
2040 while (myDynamicSelection->good()) {
2041 (*myDynamicSelection) >> dummy;
2042 numNotFound++;
2043 }
2044 myDynamicSelection->clear(); // first clear error state before seek works
2045 myDynamicSelection->seekg(0);
2046 // @note for some reason the last line is read twice
2047 WRITE_MESSAGEF("% dynamic objects not present while loading selection", numNotFound - 1);
2048 }
2049 }
2050 myTLSGame = OptionsCont::getOptions().getString("game.mode") == "tls";
2051 if (OptionsCont::getOptions().getBool("game")) {
2052 if (myTLSGame) {
2053 setTitle(TL("SUMO Interactive Traffic Light"));
2054 } else {
2055 setTitle(TL("SUMO Interactive Demand-Responsive-Transport"));
2056 }
2057 onCmdGaming(nullptr, 0, nullptr);
2058 } else {
2059 // set simulation name on the caption
2060 setTitle(MFXUtils::getTitleText("SUMO " VERSION_STRING, ec->myFile.c_str()));
2061 }
2062 if (ec->myViewportFromRegistry) {
2063 Position off;
2064 off.set(getApp()->reg().readRealEntry("viewport", "x"),
2065 getApp()->reg().readRealEntry("viewport", "y"),
2066 getApp()->reg().readRealEntry("viewport", "z"));
2067 Position p(off.x(), off.y(), 0);
2068 GUISUMOAbstractView* view = myGLWindows[0]->getView();
2069 view->setViewportFromToRot(off, p, 0);
2070 }
2071 // set simulation step begin information
2072 myLCDLabel->setText("----------------");
2073 for (std::vector<FXButton*>::const_iterator it = myStatButtons.begin(); it != myStatButtons.end(); ++it) {
2074 (*it)->setText("-");
2075 }
2076 // initialize scale from options unless already set in the UI
2077 if (myDemandScaleSpinner->getValue() == 1 || !OptionsCont::getOptions().isDefault("scale")) {
2079 }
2081 }
2082 }
2083 getApp()->endWaitCursor();
2084 // start if wished
2086 onCmdStart(nullptr, 0, nullptr);
2087 }
2088 update();
2089}
2090
2091
2092void
2094#ifdef WIN32
2095 long t = SysUtils::getCurrentMillis();
2096 // only skip if the simulation is running
2097 if (t - myLastStepEventMillis < MIN_DRAW_DELAY && myRunThread->simulationIsStopable()) {
2098 // do not try to redraw with more than 50FPS (#6371)
2099 return;
2100 }
2102#endif
2104 FXButton* vehStats = myStatButtons[STAT_VEHS];
2105 FXButton* delayStats = myStatButtons[STAT_DELAYED];
2106 FXButton* teleStats = myStatButtons[STAT_TELEPORTS];
2107 FXButton* personStats = myStatButtons[STAT_PERSONS];
2108 FXButton* containerStats = myStatButtons[STAT_CONTAINERS];
2109
2110 const int running = myRunThread->getNet().getVehicleControl().getRunningVehicleNo();
2111 const int backlog = myRunThread->getNet().getInsertionControl().getWaitingVehicleNo();
2112 const int teleports = myRunThread->getNet().getVehicleControl().getTeleportCount();
2113 const int departed = myRunThread->getNet().getVehicleControl().getDepartedVehicleNo();
2114 if (backlog > running) {
2115 if (vehStats->getIcon() == GUIIconSubSys::getIcon(GUIIcon::GREENVEHICLE)) {
2117 }
2118 } else {
2119 if (vehStats->getIcon() == GUIIconSubSys::getIcon(GUIIcon::YELLOWVEHICLE)) {
2121 }
2122 }
2123 vehStats->setText(toString(running).c_str());
2124 if (backlog > 0) {
2125 if (!delayStats->shown()) {
2126 delayStats->show();
2127 }
2128 delayStats->setText(toString(backlog).c_str());
2129 } else {
2130 if (delayStats->shown()) {
2131 delayStats->hide();
2132 }
2133 }
2134 if (teleports > 0) {
2135 if (!teleStats->shown()) {
2136 teleStats->show();
2137 }
2138 teleStats->setText((toString(100.00 * teleports / departed) + "%").c_str());
2139 }
2140 if (myRunThread->getNet().hasPersons()) {
2141 if (!personStats->shown()) {
2142 personStats->show();
2143 }
2144 personStats->setText(toString(myRunThread->getNet().getPersonControl().getRunningNumber()).c_str());
2145 }
2146 if (myRunThread->getNet().hasContainers()) {
2147 if (!containerStats->shown()) {
2148 containerStats->show();
2149 }
2150 containerStats->setText(toString(myRunThread->getNet().getContainerControl().getRunningNumber()).c_str());
2151 }
2152 if (myAmGaming) {
2153 if (myTLSGame) {
2155 } else {
2157 }
2158 }
2160 getApp()->forceRefresh(); // restores keyboard focus
2161 }
2162 // try to load dynamic selection
2163 if (myDynamicSelection != nullptr) {
2164 std::stringstream tmp;
2166 if (tmp.str().empty()) {
2167 delete myDynamicSelection;
2168 myDynamicSelection = nullptr;
2169 } else {
2170 myDynamicSelection->str(tmp.str());
2171 myDynamicSelection->clear(); // first clear error state before seek works
2172 myDynamicSelection->seekg(0);
2173 }
2174 }
2176 update();
2177}
2178
2179
2180void
2182 GUIEvent_Message* ec = static_cast<GUIEvent_Message*>(e);
2184 setStatusBarText(ec->getMsg());
2185 } else {
2187 }
2188}
2189
2190
2191void
2194 onCmdStop(nullptr, 0, nullptr);
2195 if (ec->getReason() == MSNet::SIMSTATE_LOADING) {
2196 onCmdReload(nullptr, 0, nullptr);
2197 } else if (GUIGlobals::gQuitOnEnd) {
2199 getApp()->exit(ec->getReason() == MSNet::SIMSTATE_ERROR_IN_SIM);
2200 } else if (GUIGlobals::gDemoAutoReload) {
2201 onCmdReload(nullptr, 1, nullptr);
2202 } else if (!myHaveNotifiedAboutSimEnd) {
2203 // GUIRunThread::deleteSim() triggers the final message to the log file
2204 // (this will never reach the GUI but we cannot use WRITE_MESSAGE here
2205 // to avoid a duplicate log entry)
2207 TLF("Simulation ended at time: %. (%)",
2209 // build the text
2210 const std::string text = TLF("Simulation ended at time: %.", time2string(ec->getTimeStep())) + "\n" +
2211 TL("Reason:") + MSNet::getStateMessage(ec->getReason()) + "\n" +
2212 TL("Do you want to close all open files and views?");
2213 FXuint answer = FXMessageBox::question(this, MBOX_YES_NO, TL("Simulation ended"), "%s", text.c_str());
2214 if (answer == 1) { //1:yes, 2:no, 4:esc
2216 } else {
2219 update();
2220 }
2222 }
2223}
2224
2225
2226void
2231#ifdef HAVE_DANGEROUS_SOUNDS // disable user-configurable command execution for public build
2232 if (myJamSounds.getOverallProb() > 0) {
2233 // play honking sound if some vehicle is waiting too long
2234 for (; it != end; ++it) {
2235 // XXX use impatience instead of waiting time ?
2236 if (it->second->getWaitingTime() > TIME2STEPS(myJamSoundTime)) {
2237 const std::string cmd = myJamSounds.get(&myGamingRNG);
2238 if (cmd != "") {
2239 // yay! fun with dangerous commands... Never use this over the internet
2241 // one sound per simulation step is enough
2242 break;
2243 }
2244 }
2245 }
2246 }
2249 if (myPreviousCollisionNumber != collisions) {
2250 const std::string cmd = myCollisionSounds.get(&myGamingRNG);
2251 if (cmd != "") {
2252 // yay! fun with dangerous commands... Never use this over the internet
2254 }
2255 myPreviousCollisionNumber = collisions;
2256 }
2257 }
2258#endif
2259 // update performance indicators
2260 for (it = vc.loadedVehBegin(); it != end; ++it) {
2261 const MSVehicle* veh = dynamic_cast<MSVehicle*>(it->second);
2262 assert(veh != 0);
2263 if (veh->isOnRoad() && !veh->isStopped()) {
2264 const double vmax = veh->getLane()->getVehicleMaxSpeed(veh);
2265 if (veh->getSpeed() < SUMO_const_haltingSpeed) {
2267 if (veh->getVClass() == SVC_EMERGENCY) {
2269 }
2270 }
2271 myTimeLoss += TIME2STEPS(TS * (vmax - veh->getSpeed()) / vmax); // may be negative with speedFactor > 1
2272 }
2273
2274 }
2278}
2279
2280
2281void
2283 // update performance indicators
2287
2290 for (auto it = vc.loadedVehBegin(); it != end; ++it) {
2291 const MSVehicle* veh = dynamic_cast<MSVehicle*>(it->second);
2292 assert(veh != 0);
2293 if (veh->isOnRoad() && !veh->isStopped()) {
2295 }
2296 }
2298}
2299
2300
2301void
2303 if (!myAmLoading) {
2305 getApp()->beginWaitCursor();
2306 myAmLoading = true;
2307 myIsReload = false;
2309 gSchemeStorage.saveViewport(0, 0, -1, 0); // recenter view
2311 setStatusBarText(TLF("Loading '%'.", file));
2312 update();
2313 }
2314}
2315
2316
2319 if (!myRunThread->networkAvailable()) {
2320 myStatusbar->getStatusLine()->setText(TL("No simulation loaded!"));
2321 return nullptr;
2322 }
2323 GUISUMOAbstractView* oldView = nullptr;
2324 if (myMDIClient->numChildren() > 0) {
2325 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
2326 if (w != nullptr) {
2327 oldView = w->getView();
2328 }
2329 }
2330 if (caption == "") {
2331 caption = "View #" + toString(myViewNumber++);
2332 }
2333 FXuint opts = MDI_TRACKING;
2334 GUISUMOViewParent* w = new GUISUMOViewParent(myMDIClient, myMDIMenu, FXString(caption.c_str()),
2335 this, GUIIconSubSys::getIcon(GUIIcon::SUMO_MINI), opts, 10, 10, 200, 100);
2337 if (oldView != nullptr) {
2338 // copy viewport
2339 oldView->copyViewportTo(v);
2340 }
2341 w->create();
2342 if (myMDIClient->numChildren() == 1) {
2343 w->maximize();
2344 } else {
2345 myMDIClient->vertical(true);
2346 }
2347 myMDIClient->setActiveChild(w);
2348
2349 return v;
2350}
2351
2352
2353FXGLCanvas*
2355 if (myMDIClient->numChildren() == 0) {
2356 return nullptr;
2357 }
2358 GUISUMOViewParent* share_tmp1 =
2359 static_cast<GUISUMOViewParent*>(myMDIClient->childAtIndex(0));
2360 return share_tmp1->getBuildGLCanvas();
2361}
2362
2363
2364void
2366 myTrackerLock.lock();
2367 myLCDLabel->setText("----------------");
2368 for (std::vector<FXButton*>::const_iterator it = myStatButtons.begin(); it != myStatButtons.end(); ++it) {
2369 (*it)->setText("-");
2370 if (it != myStatButtons.begin()) {
2371 (*it)->hide();
2372 }
2373 }
2374 // save decals and viewport
2375 for (GUIGlChildWindow* window : myGLWindows) {
2376 GUISUMOAbstractView* view = window->getView();
2379 view->getChanger().getZPos(), view->getChanger().getRotation());
2380 }
2381 // delete the simulation
2383 // reset the caption
2384 setTitle(MFXUtils::getTitleText("SUMO " VERSION_STRING));
2385 // clear decals and release GPU textures
2386 for (GUIGlChildWindow* window : myGLWindows) {
2387 GUISUMOAbstractView* view = window->getView();
2388 if (view->makeCurrent()) {
2389 view->clearDecals();
2393 view->makeNonCurrent();
2394 }
2395 }
2396 // remove trackers and other external windows (must be delayed until deleteSim)
2397 while (!myGLWindows.empty()) {
2398 delete myGLWindows.front();
2399 }
2400 // make a copy because deleting modifyes the vector;
2401 std::vector<FXMainWindow*> trackerWindows = myTrackerWindows;
2402 for (FXMainWindow* const window : trackerWindows) {
2403 delete window;
2404 }
2405 myTrackerWindows.clear();
2406 // clear selected items
2407 gSelected.clear();
2408 // add a separator to the log
2410 myTrackerLock.unlock();
2411 // remove coordinate information
2412 myGeoCoordinate->setText(TL("N/A"));
2413 myGeoCoordinate->disable();
2414 myGeoCoordinate->setEditable(false);
2415 myCartesianCoordinate->setText(TL("N/A"));
2416 if (myTestCoordinate) {
2417 myTestCoordinate->setText(TL("N/A"));
2418 }
2419 update();
2420}
2421
2422
2423FXCursor*
2425 return getApp()->getDefaultCursor(DEF_ARROW_CURSOR);
2426}
2427
2428
2433
2434
2435double
2439
2440
2441void
2443 loadConfigOrNet("");
2444 if (wait) {
2445 while (myAmLoading) {
2446 myRunThread->sleep(50);
2447 }
2448 }
2449}
2450
2451
2452void
2454 myStatusbar->getStatusLine()->setText(text.c_str());
2455 myStatusbar->getStatusLine()->setNormalText(text.c_str());
2456}
2457
2458
2459void
2461 myRecentNetworks.appendFile(f);
2462}
2463
2464
2465void
2467 myRecentConfigs.appendFile(f);
2468}
2469
2470
2471void
2473 if (myShowTimeAsHMS) {
2474 myLCDLabel->setToolTipText("HH:MM:SS");
2475 if (myAmGaming) {
2477 myTimeLossLabel->setToolTipText("HH:MM:SS");
2479 }
2480 } else {
2481 myLCDLabel->setToolTipText(TL("seconds"));
2482 if (myAmGaming) {
2484 myTimeLossLabel->setToolTipText(TL("seconds"));
2486 }
2487 }
2488}
2489
2490
2491void
2493 time -= DELTA_T; // synchronize displayed time with netstate output
2494 if (time < 0) {
2495 myLCDLabel->setText("----------------");
2496 return;
2497 }
2498 if (myAmGaming) {
2499 // show time counting backwards
2500 time = myRunThread->getSimEndTime() - time;
2501 }
2502 std::ostringstream str;
2503 str << std::setfill('0');
2504 const bool hideFraction = myAmGaming || DELTA_T % 1000 == 0;
2505 if (myShowTimeAsHMS) {
2506 SUMOTime day = time / SUMOTime_DAY;
2507 if (day > 0) {
2508 str << day << '-';
2509 time %= SUMOTime_DAY;
2510 }
2511 str << std::setw(2);
2512 str << time / SUMOTime_HOUR << '-';
2513 time %= SUMOTime_HOUR;
2514 str << std::setw(2) << time / SUMOTime_MINUTE << '-';
2515 time %= SUMOTime_MINUTE;
2516 }
2517 str << std::setw(2) << time / 1000;
2518 if (!hideFraction) {
2519 str << '.' << std::setw(3) << time % 1000;
2520 }
2521 myLCDLabel->setText(str.str().c_str());
2522}
2523
2524
2525void
2527 if (press != nullptr) {
2528 myHotkeyPress[key] = press;
2529 }
2530 if (release != nullptr) {
2531 myHotkeyRelease[key] = release;
2532 }
2533}
2534
2535
2536long
2537GUIApplicationWindow::onKeyPress(FXObject* o, FXSelector sel, void* ptr) {
2538 FXEvent* e = (FXEvent*) ptr;
2539 if (e->code == KEY_Escape) {
2540 if (myGeoCoordinate && myGeoCoordinate->hasFocus()) {
2541 myGeoCoordinate->killFocus();
2542 if (getActiveView()) {
2544 }
2545 return 1;
2546 }
2547 if (myCartesianCoordinate && myCartesianCoordinate->hasFocus()) {
2548 myCartesianCoordinate->killFocus();
2549 if (getActiveView()) {
2551 }
2552 return 1;
2553 }
2554 }
2555 // PgUp and PgDown switch between widgets by default and binding them via menu shortcuts does not work reliably
2556 // so we must intercept them before FXMainWindow can handle it
2557 if (e->code == FX::KEY_Page_Up) {
2558 onCmdDelayInc(nullptr, 0, nullptr);
2559 } else if (e->code == FX::KEY_Page_Down) {
2560 onCmdDelayDec(nullptr, 0, nullptr);
2561 } else {
2562 // disable hotkeys without modifiers for the game
2563 const bool ignoreSimple = myAmGaming && (e->state & (CONTROLMASK | SHIFTMASK | ALTMASK)) == 0;
2564 const long handled = ignoreSimple ? 0 : FXMainWindow::onKeyPress(o, sel, ptr);
2565 if (handled == 0 && myMDIClient->numChildren() > 0) {
2566 auto it = myHotkeyPress.find(e->code);
2567 if (it != myHotkeyPress.end()) {
2568 it->second->execute(SIMSTEP);
2569 }
2570 if (!ignoreSimple) {
2571 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
2572 if (w != nullptr) {
2573 w->onKeyPress(nullptr, sel, ptr);
2574 }
2575 }
2576 }
2577 }
2578 return 0;
2579}
2580
2581
2582long
2583GUIApplicationWindow::onKeyRelease(FXObject* o, FXSelector sel, void* ptr) {
2584 const long handled = FXMainWindow::onKeyRelease(o, sel, ptr);
2585 if (handled == 0 && myMDIClient->numChildren() > 0) {
2586 FXEvent* e = (FXEvent*) ptr;
2587 auto it = myHotkeyRelease.find(e->code);
2588 if (it != myHotkeyRelease.end()) {
2589 it->second->execute(SIMSTEP);
2590 }
2591 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
2592 if (w != nullptr) {
2593 w->onKeyRelease(nullptr, sel, ptr);
2594 }
2595 }
2596 return 0;
2597}
2598
2599
2600double
2602 return mySimDelay;
2603}
2604
2605
2606void
2608 mySimDelay = delay;
2609}
2610
2611
2612void
2614 myEventMutex.lock();
2615 myEvents.push_back(event);
2617 //myEventCondition.wait(myEventMutex);
2618 myEventMutex.unlock();
2619}
2620
2621
2622void
2623GUIApplicationWindow::setBreakpoints(const std::vector<SUMOTime>& breakpoints) {
2624 if (myRunThread != nullptr) {
2626 myRunThread->getBreakpoints().assign(breakpoints.begin(), breakpoints.end());
2627 myRunThread->getBreakpointLock().unlock();
2629 }
2630}
2631
2632
2633void
2635 const SUMOTime begin = string2time(OptionsCont::getOptions().getString("begin"));
2636 if (time >= begin) {
2637 // ensure breakpoint is valid
2638 time -= (time - begin) % DELTA_T;
2639 std::vector<SUMOTime> breakpoints = retrieveBreakpoints();
2640 if (std::find(breakpoints.begin(), breakpoints.end(), time) == breakpoints.end()) {
2641 breakpoints.push_back(time);
2642 std::sort(breakpoints.begin(), breakpoints.end());
2643 setBreakpoints(breakpoints);
2644 setStatusBarText(TLF("Set breakpoint at %", time2string(time)));
2645 }
2646 }
2647}
2648
2649
2650const std::vector<SUMOTime>
2653 std::vector<SUMOTime> result = myRunThread->getBreakpoints();
2654 myRunThread->getBreakpointLock().unlock();
2655 return result;
2656}
2657
2658
2659void
2663
2664/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ MID_HOTKEY_CTRL_Q_CLOSE
Main window closes.
Definition GUIAppEnum.h:115
@ ID_RUNTHREAD_EVENT
The testing thread.
Definition GUIAppEnum.h:350
@ MID_HOTKEY_CTRL_T_OPENNETEDIT_OPENSUMO
Open current SUMO simulation/network in netedit, or current netedit simulation/network in SUMO.
Definition GUIAppEnum.h:123
@ MID_LISTINTERNAL
Locator configuration - menu entry.
Definition GUIAppEnum.h:360
@ MID_TOOLBAREDIT_LOADADDITIONALS
load additionals in sumo-gui/netedit after press ctrl+T
Definition GUIAppEnum.h:691
@ MID_NEW_MICROVIEW
Open a new microscopic view.
Definition GUIAppEnum.h:338
@ MID_HOTKEY_CTRL_W_CLOSESIMULATION
Close simulation - ID.
Definition GUIAppEnum.h:129
@ MID_HOTKEY_CTRL_D_SINGLESIMULATIONSTEP_OPENDEMANDELEMENTS
Perform a single simulation step in SUMO and open Demand Elements in netedit.
Definition GUIAppEnum.h:89
@ MID_HOTKEY_CTRL_O_OPENSIMULATION_OPENNETWORK
Open simulation in SUMO and open network in netedit.
Definition GUIAppEnum.h:111
@ MID_HOTKEY_F9_EDIT_VIEWSCHEME
open edit scheme menu
Definition GUIAppEnum.h:248
@ MID_HOTKEY_CTRL_J_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition GUIAppEnum.h:101
@ MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS
hotkey for start simulation in SUMO and set editing mode additionals AND stops in netedit
Definition GUIAppEnum.h:43
@ MID_TRACI_STATUS
update traci status
Definition GUIAppEnum.h:377
@ MID_LANGUAGE_TR
change language to turkish
@ MID_CHANGELOG
changelog button
Definition GUIAppEnum.h:665
@ MID_HOTKEY_CTRL_B_EDITBREAKPOINT_OPENDATAELEMENTS
Edit simulation breakpoints in SUMO and open Data Elements in netedit.
Definition GUIAppEnum.h:85
@ MID_TOOLBAREDIT_LOADDEMAND
load demand in sumo-gui/netedit after press ctrl+T
Definition GUIAppEnum.h:693
@ MID_HOTKEY_F1_ONLINEDOCUMENTATION
open online documentation
Definition GUIAppEnum.h:232
@ MID_HOTKEY_CTRL_U_OPENEDGEDATA
Load edge data for visualization.
Definition GUIAppEnum.h:125
@ MID_HOTKEY_CTRL_R_RELOAD
Reload the previously loaded simulation.
Definition GUIAppEnum.h:119
@ MID_HOTKEY_CTRL_S_STOPSIMULATION_SAVENETWORK
Stop the simulation in SUMO and save network in netedit.
Definition GUIAppEnum.h:117
@ MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE
hotkey for perform a single simulation step in SUMO and set delete mode in netedit
Definition GUIAppEnum.h:49
@ MID_HOTKEY_CTRL_A_STARTSIMULATION_OPENADDITIONALELEMENTS
Start the simulation in SUMO and open Additionals Elements in netedit.
Definition GUIAppEnum.h:83
@ MID_HOTKEY_SHIFT_O_LOCATEPOI
Locate poi - button.
Definition GUIAppEnum.h:182
@ MID_LANGUAGE_ZHT
change language to chinese (traditional)
@ MID_LANGUAGE_ES
change language to spanish
@ MID_HOTKEY_SHIFT_A_LOCATEADDITIONAL
Locate additional structure - button.
Definition GUIAppEnum.h:172
@ MID_SIMLOAD
(quick)-load state from file
Definition GUIAppEnum.h:330
@ MID_DEMAND_SCALE
scale traffic
Definition GUIAppEnum.h:407
@ MID_HOTKEY_CTRL_I_EDITVIEWPORT
Open viewport editor.
Definition GUIAppEnum.h:99
@ MID_SHOWTOOLTIPS_MENU
Show tool tips in menus - button.
Definition GUIAppEnum.h:393
@ MID_RECENTFILE
Loads a file previously loaded.
Definition GUIAppEnum.h:320
@ MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT
hotkey for stop simulation in SUMO and set select mode in netedit
Definition GUIAppEnum.h:63
@ MID_HOTKEY_SHIFT_C_LOCATECONTAINER
Locate container - button.
Definition GUIAppEnum.h:174
@ MID_HOTKEY_CTRL_SHIFT_N_NEWWINDOW
open a new window (SUMO AND netedit)
Definition GUIAppEnum.h:218
@ MID_HOTKEY_SHIFT_V_LOCATEVEHICLE
Locate vehicle - button.
Definition GUIAppEnum.h:192
@ MID_HOTKEY_SHIFT_F11_HALLOFFAME
show the hall of fame dialog
Definition GUIAppEnum.h:254
@ MID_HOTKEY_SHIFT_L_LOCATEPOLY
Locate polygons - button.
Definition GUIAppEnum.h:180
@ MID_HOTKEY_CTRL_K_OPENTLSPROGRAMS
Load file with TLS Programs.
Definition GUIAppEnum.h:103
@ MID_LANGUAGE_IT
change language to italian
@ MID_HOTKEY_SHIFT_E_LOCATEEDGE
Locate edge - button.
Definition GUIAppEnum.h:176
@ MID_HOTKEY_ALT_B_BREAKPOINT_EARLY
hotkey for setting a breakpoint ahead of the current time
Definition GUIAppEnum.h:165
@ MID_CLEARMESSAGEWINDOW
Clear simulation output.
Definition GUIAppEnum.h:369
@ MID_HOTKEY_CTRL_F_FULSCREENMODE
Fullscreen mode - menu entry.
Definition GUIAppEnum.h:93
@ MID_SIMSAVE
Save state to file.
Definition GUIAppEnum.h:328
@ MID_TUTORIAL
tutorial button
Definition GUIAppEnum.h:669
@ MID_LISTTELEPORTING
Definition GUIAppEnum.h:362
@ MID_HOTKEY_CTRL_G_GAMINGMODE_TOGGLEGRID
Toggle Gaming mode in SUMO and grid in netedit.
Definition GUIAppEnum.h:95
@ MID_SHOWNETSTATS
Show network statistics.
Definition GUIAppEnum.h:371
@ ID_LOADTHREAD_EVENT
The loading thread.
Definition GUIAppEnum.h:348
@ MID_SHOWTOOLTIPS_VIEW
Show tool tips in view - button.
Definition GUIAppEnum.h:391
@ MID_GEO_COORDINATE
enter geo coordinate to center view
Definition GUIAppEnum.h:379
@ MID_HOTKEY_SHIFT_P_LOCATEPERSON
Locate person - button.
Definition GUIAppEnum.h:184
@ MID_HOTKEY_CTRL_P_OPENSHAPES
Load additional file with poi and polygons.
Definition GUIAppEnum.h:113
@ MID_LANGUAGE_EN
change language to english
@ MID_HOTKEY_SHIFT_J_LOCATEJUNCTION
Locate junction - button.
Definition GUIAppEnum.h:178
@ MID_SHOWPERSONSTATS
Show person statistics.
Definition GUIAppEnum.h:375
@ MID_DELAY_TOGGLE
toggle delay between alternative value
Definition GUIAppEnum.h:405
@ MID_HOTKEYS
hotkeys button
Definition GUIAppEnum.h:667
@ MID_TIMELINK_BREAKPOINT
Set breakpionts from messages - Option.
Definition GUIAppEnum.h:581
@ MID_HOTKEY_B_BREAKPOINT
hotkey for setting a breakpoint
Definition GUIAppEnum.h:47
@ MID_LANGUAGE_DE
change language to german
@ MID_HOTKEY_ALT_F4_CLOSE
Main window closes.
Definition GUIAppEnum.h:163
@ MID_TIME_TOGGLE
toggle time display mode
Definition GUIAppEnum.h:399
@ MID_DELAY_DEC
decrease sim delay
Definition GUIAppEnum.h:403
@ MID_LISTPARKING
Definition GUIAppEnum.h:361
@ MID_NEW_OSGVIEW
Open a new microscopic 3D view.
Definition GUIAppEnum.h:340
@ MID_CARTESIAN_COORDINATE
enter cartesian coordinate to center view
Definition GUIAppEnum.h:381
@ MID_LANGUAGE_JA
change language to japanese
@ MID_FEEDBACK
feedback button
Definition GUIAppEnum.h:671
@ MID_HOTKEY_CTRL_H_APPSETTINGS_OPENEDGETYPES
open app setting dialog in SUMO and open edge type files in netedit
Definition GUIAppEnum.h:97
@ MID_HOTKEY_CTRL_SHIFT_S_SAVESUMOCONFIG
save SUMOConfig (SUMO AND netedit)
Definition GUIAppEnum.h:222
@ MID_HOTKEY_F12_ABOUT
open about dialog
Definition GUIAppEnum.h:256
@ MID_HOTKEY_CTRL_E_EDITSELECTION_LOADNETEDITCONFIG
Edit selection in SUMO and load neteditConfig in netedit.
Definition GUIAppEnum.h:91
@ MID_HOTKEY_SHIFT_T_LOCATETLS
Locate TLS - button.
Definition GUIAppEnum.h:190
@ MID_DELAY_INC
increase sim delay
Definition GUIAppEnum.h:401
@ MID_HOTKEY_CTRL_N_OPENNETWORK_NEWNETWORK
open network in SUMO and create new empty network in netedit
Definition GUIAppEnum.h:109
@ MID_HOTKEY_CTRL_QUICK_RELOAD
Quick-Reload the previously loaded simulation (keep the net)
Definition GUIAppEnum.h:121
@ MID_LANGUAGE_ZH
change language to chinese (simplified)
@ MID_SHOWVEHSTATS
Show vehicle statistics.
Definition GUIAppEnum.h:373
@ MID_LANGUAGE_FR
change language to french
@ MID_HOTKEY_CTRL_SHIFT_T_OPEN_NET
load only the network in sumo-gui/netedit
Definition GUIAppEnum.h:224
@ MID_WINDOW
Main window-ID.
Definition GUIAppEnum.h:300
@ MID_LANGUAGE_KO
change language to korean
#define STAT_CONTAINERS
FXDEFMAP(GUIApplicationWindow) GUIApplicationWindowMap[]
#define STAT_DELAYED
#define MIN_DRAW_DELAY
#define STAT_PERSONS
#define STAT_TELEPORTS
#define STAT_VEHS
GUICompleteSchemeStorage gSchemeStorage
#define GUIDesignSlider
Definition GUIDesigns.h:536
#define GUIDesignSpinDial
Definition GUIDesigns.h:516
#define GUIDesignToolBarGrip
design for toolbar grip (used to change the position of toolbar with mouse)
Definition GUIDesigns.h:480
#define GUIDesignButtonStatusBarFixed
button rectangular with thick and raise frame with a width of 100
Definition GUIDesigns.h:124
#define GUIDesignMDIButtonLeft
Definition GUIDesigns.h:220
#define GUIDesignToolBarRaisedSameTop
design for first toolbar shell positioned in the same position of dock
Definition GUIDesigns.h:486
#define GUIDesignButtonToolbar
little button with icon placed in navigation toolbar
Definition GUIDesigns.h:144
#define GUIDesignHorizontalFrameStatusBar
Horizontal frame used in status bar.
Definition GUIDesigns.h:359
#define GUIDesignToolBar
design for default toolbar
Definition GUIDesigns.h:465
#define GUIDesignSplitter
Definition GUIDesigns.h:505
#define GUIDesignSplitterMDI
MDI Splitter.
Definition GUIDesigns.h:508
#define GUIDesignMFXCheckableButtonSquare
Definition GUIDesigns.h:158
#define GUIDesignToolbarMenuBar
Definition GUIDesigns.h:459
#define GUIDesignToolBarRaisedNextTop
design for first toolbar shell positioned in the next-top position of dock
Definition GUIDesigns.h:483
#define GUIDesignButtonToolbarText
Definition GUIDesigns.h:141
#define GUIDesignMDIButtonRight
MDIButton oriented to right.
Definition GUIDesigns.h:223
#define GUIDesignStatusBar
design used in status bar
Definition GUIDesigns.h:477
@ SIMULATION_ENDED
Send when the simulation is over;.
@ MESSAGE_OCCURRED
send when a message occurred
@ GLDEBUG_OCCURRED
send when a gldebug occurred
@ ERROR_OCCURRED
send when a error occurred
@ SIMULATION_STEP
send when a simulation step has been performed
@ ADD_VIEW
Send when a new should be opened (via TraCI)
@ CLOSE_VIEW
Send when a view should be closed (via TraCI)
@ SIMULATION_LOADED
send when a simulation has been loaded
@ STATUS_OCCURRED
send when a status change occurred
@ DEBUG_OCCURRED
send when a debug occurred
@ WARNING_OCCURRED
send when a warning occurred
@ GLO_MAX
empty max
GUISelectedStorage gSelected
A global holder of selected objects.
FXString gCurrentFolder
The folder used as last.
@ INSERTION_DELAY
@ EDITVIEWPORT
@ CLEARMESSAGEWINDOW
@ NETEDIT_MINI
@ GREENVEHICLE
@ LOCATEVEHICLE
@ LOCATEPERSON
@ SHOWTOOLTIPS_MENU
@ WINDOWS_TILE_VERT
@ GREENCONTAINER
@ WINDOWS_CASCADE
@ SHOWTOOLTIPS_VIEW
@ OPEN
open icons
@ LOCATECONTAINER
@ LOCATEJUNCTION
@ APP_BREAKPOINTS
@ SAVE_SUMOCONFIG
@ WINDOWS_TILE_HORI
@ YELLOWVEHICLE
@ OPEN_SUMOCONFIG
@ SAVE
save icons
@ KEY_SPACE
std::vector< std::string > & split(const std::string &s, char delim, std::vector< std::string > &elems)
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define WRITE_MESSAGEF(...)
Definition MsgHandler.h:289
#define WRITE_ERRORF(...)
Definition MsgHandler.h:296
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define SPEED2DIST(x)
Definition SUMOTime.h:48
#define SUMOTime_MINUTE
Definition SUMOTime.h:39
#define SIMSTEP
Definition SUMOTime.h:69
constexpr SUMOTime TIME2STEPS(double x)
Definition SUMOTime.h:60
#define SUMOTime_DAY
Definition SUMOTime.h:37
#define SUMOTime_HOUR
Definition SUMOTime.h:38
#define TS
Definition SUMOTime.h:45
StringBijection< SUMOVehicleClass > SumoVehicleClassStrings(sumoVehicleClassStringInitializer, SVC_CUSTOM2, false)
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_EMERGENCY
public emergency vehicles
int GUIDesignHeight
the default height for GUI elements
Definition StdDefs.cpp:41
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
Definition StdDefs.h:62
T MAX2(T a, T b)
Definition StdDefs.h:86
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
#define TLC(context, string)
Definition Translation.h:47
Base (microsim) event class.
Definition Command.h:50
void setSelector(FXSelector sel)
set the selector
void setTarget(FXObject *tgt)
set the target
static bool isReadable(std::string path)
Checks whether the given file is readable.
static void resetFont()
to be called when the font context is invalidated
Definition GLHelper.cpp:666
The main window of the SUMO-gui.
long onCmdDelayInc(FXObject *, FXSelector, void *)
Called on "delay inc".
long onUpdReload(FXObject *, FXSelector, void *)
Determines whether reloading is enabled.
long onCmdShowStats(FXObject *, FXSelector, void *)
Called on commands from the statistic buttons.
FXToolBarShell * myToolBarDrag2
long onCmdTimeToggle(FXObject *, FXSelector, void *)
Called on "time toggle".
virtual void sendBlockingEvent(GUIEvent *event)
Sends an event from the application thread to the GUI and waits until it is handled.
GUIDialog_Breakpoints * myBreakpointDialog
breakpoint dialog
FXEX::MFXThreadEvent myLoadThreadEvent
io-event with the load-thread
void handleEvent_Message(GUIEvent *e)
called when event "message" ocurred
GUILoadThread * myLoadThread
the thread that loads simulations
MFXLabelTooltip * myScaleTrafficTooltip
the demand scale label
void handleEvent_SimulationEnded(GUIEvent *e)
called when event "simulation ended" ocurred
FXMenuCheck * myGamingModeCheckbox
menu checkbox to activate game mode
int myViewNumber
The current view number.
FXToolBarShell * myToolBarDrag4
long onCmdAbout(FXObject *, FXSelector, void *)
Shows the about dialog.
SUMOTime myWaitingTime
waiting time
long onCmdFeedback(FXObject *, FXSelector, void *)
Shows the feedback dialog.
long onClipboardRequest(FXObject *sender, FXSelector sel, void *ptr)
Somebody wants our clipped text.
long onUpdTraCIStatus(FXObject *, FXSelector, void *)
Determines whether traci is active.
long onUpdStep(FXObject *, FXSelector, void *)
Determines whether "step" is enabled.
bool myAmLoading
information whether the gui is currently loading and the load-options shall be greyed out
long onCmdAppSettings(FXObject *, FXSelector, void *)
Opens the application settings menu (Settings->Application Settings...)
long onKeyPress(FXObject *o, FXSelector sel, void *data)
called when a key is pressed
void handleEvent_SimulationLoaded(GUIEvent *e)
called when event "simulation loaded" ocurred
long onCmdBreakpoint(FXObject *, FXSelector, void *)
Called to set a breakpoint via hotkey.
FXToolBarShell * myToolBarDrag9
FXRealSpinner * mySimDelaySpinner
Simulation delay spinner.
long onCmdBreakpointEarly(FXObject *, FXSelector, void *)
Called to set an early breakpoint via hotkey.
long onCmdChangelog(FXObject *sender, FXSelector sel, void *ptr)
called if the user selects help->Changelog
long onCmdOpenInNetedit(FXObject *, FXSelector, void *)
Called on menu Edit->open in Netedit.
void handleEvent_SimulationStep(GUIEvent *e)
called when event "simulation step" ocurred
bool myHaveNotifiedAboutSimEnd
whether the simulation end was already announced
void setStatusBarText(const std::string &text)
set status bar text
FXToolBarShell * myToolBarDrag10
MFXCheckableButton * myShowToolTipsView
checkable button for show tool tips in view
FXMenuPane * myFileMenuRecentConfigs
FXMenu pane for recent configs.
long onCmdStop(FXObject *, FXSelector, void *)
Called on "stop".
MFXRecentNetworks myRecentNetworks
List of recent networks.
MFXLCDLabel * myTimeLossLabel
time loss label
double myJamSoundTime
waiting time after which vehicles trigger jam sounds
FXRealSpinner * myDemandScaleSpinner
the demand scale
long onCmdTutorial(FXObject *sender, FXSelector sel, void *ptr)
called if the user selects help->Tutorial
long onCmdShowToolTipsMenu(FXObject *, FXSelector, void *)
Called on "show tool tips in menu".
virtual void setDelay(double delay)
Sets the delay of the parent application in milliseconds.
MFXLCDLabel * myEmergencyVehicleLabel
emergency vehicle label
std::stringstream * myDynamicSelection
FXToolBarShell * myToolBarDrag7
double mySimDelay
the simulation delay in milliseconds
void addRecentConfig(const FX::FXString &f)
add recent config to recent file list
SUMOTime getCurrentSimTime() const
get current simulation time
long onUpdAddView(FXObject *, FXSelector, void *)
Determines whether adding a view is enabled.
FXToolBarShell * myToolBarDrag1
for some menu detaching fun
long onCmdEditViewScheme(FXObject *, FXSelector, void *)
Called on menu Edit->Visualization.
long onRunThreadEvent(FXObject *, FXSelector, void *)
Called on an event from the simulation thread.
MFXLCDLabel * myTotalDistanceLabel
total distance label
bool hadDependentBuild
flag to mark if GUIApplicationWIndow has depend build
SUMOTime myEmergencyVehicleCount
emergency vehicle count
FXMenuPane * myFileMenuRecentNetworks
FXMenu pane for recent networks.
FXCursor * getDefaultCursor()
get default cursor
SUMOTime myTimeLoss
time loss
void checkGamingEventsDRT()
handles additional game-related events (DRT)
FXMDIMenu * myMDIMenu
The menu used for the MDI-windows.
GUIApplicationWindow(FXApp *a)
Constructor.
void updateTimeLCDTooltip()
update LCD timer tooltip
long onCmdListTeleporting(FXObject *, FXSelector, void *)
Toggle listing of teleporting vehicles.
long onCmdNewWindow(FXObject *, FXSelector, void *)
Called on menu File->New Window.
long onCmdStep(FXObject *, FXSelector, void *)
Called on "step".
FXMutex myEventMutex
the mutex for the waiting semaphore
double getTrackerInterval() const
get tracker interval
long onCmdClose(FXObject *, FXSelector, void *)
Called on menu File->Close.
virtual void buildToolBars()
Builds the tool bar.
long onCmdDelayToggle(FXObject *, FXSelector, void *)
Called on "delay toggle".
FXMenuCheck * myLoadAdditionalsInNetedit
menuCheck for enable/disable load additionals in netedit
void buildRecentNetworks(FXMenuPane *fileMenu, FXMenuPane *fileMenuRecentNetworks)
build recent networks
FXMenuPane * myFileMenu
the submenus
long onCmdToggleSecondaryShape(FXObject *, FXSelector, void *)
Toggle draw junction shape.
virtual double getDelay() const
Returns the simulation delay in miliseconds.
long onCmdStart(FXObject *, FXSelector, void *)
Called on "play".
GUIMessageWindow * myMessageWindow
A window to display messages, warnings and error in.
GUIRunThread * getRunner()
get run thread
void loadConfigOrNet(const std::string &file)
starts to load a simulation
FXToolBar * myToolBar1
The application tool bar.
bool myWasStarted
the information whether the simulation was started before
MFXCheckableButton * myShowToolTipsMenu
checkable button for show tool tips in menu
FXSplitter * myMainSplitter
The splitter that divides the main window into views and the log window.
long onCmdListParking(FXObject *, FXSelector, void *)
Toggle listing of parking vehicles.
long onUpdNeedsSumoConfig(FXObject *, FXSelector, void *)
Determines whether some buttons which require an sumoConfig may be shown.
void loadOnStartup(const bool wait=false)
config or net on startup
void addBreakpoint(SUMOTime time)
Adds the given breakpoint.
long onCmdListInternal(FXObject *, FXSelector, void *)
Toggle listing of internal structures.
bool myTLSGame
flag for enable TLS gameMode
FXEX::MFXThreadEvent myRunThreadEvent
io-event with the run-thread
void dependentBuild(const bool isLibsumo)
build dependt
long onCmdFullScreen(FXObject *, FXSelector, void *)
Toggle full screen mode.
long onCmdEditBreakpoints(FXObject *, FXSelector, void *)
Called on menu Edit->Edit Breakpoints.
long onCmdOpenShapes(FXObject *, FXSelector, void *)
Called on menu File->Load Shapes.
FXToolBarShell * myMenuBarDrag
const std::vector< SUMOTime > retrieveBreakpoints() const
retrieve list of breakpoints
long onCmdQuit(FXObject *, FXSelector, void *)
Called by FOX if the application shall be closed (Called either by FileMenu->Quit,...
FXToolBarShell * myToolBarDrag8
long onUpdStart(FXObject *sender, FXSelector, void *ptr)
Determines whether "play" is enabled.
GUISUMOAbstractView * openNewView(GUISUMOViewParent::ViewType vt=GUISUMOViewParent::VIEW_2D_OPENGL, std::string caption="")
opens a new simulation display
FXGLCanvas * getBuildGLCanvas() const
get build GLCanvas
RandomDistributor< std::string > myJamSounds
random list of jam sounds
long onCmdNewView(FXObject *, FXSelector, void *)
Called if a new view shall be opened (2D view)
FXMenuCommand * myOpenNetInNetedit
menuCommand for opening only the network in netedit
GUIRunThread * myRunThread
the thread that runs simulations
long onCmdClearMsgWindow(FXObject *, FXSelector, void *)
Called if the message window shall be cleared.
long onCmdToggleDrawJunctionShape(FXObject *, FXSelector, void *)
Toggle draw junction shape.
virtual void create()
Creates the main window (required by FOX)
std::map< int, Command * > myHotkeyPress
custom hotkeys pressed
FXToolBarShell * myToolBarDrag5
MFXLCDLabel * myWaitingTimeLabel
waiting time label
long onCmdDemandScale(FXObject *, FXSelector, void *)
Called on "demand scale".
long onKeyRelease(FXObject *o, FXSelector sel, void *data)
called when a key is released
RandomDistributor< std::string > myCollisionSounds
random list of collision sounds
FXMenuCascade * mySelectLanesMenuCascade
the menu cascades
long onCmdOpenNetwork(FXObject *, FXSelector, void *)
Called on menu File->Open Network.
virtual void setBreakpoints(const std::vector< SUMOTime > &breakpoints)
Sets the breakpoints of the parent application.
long onUpdNeedsNetwork(FXObject *, FXSelector, void *)
Determines whether some buttons which require an active network may be shown.
long onCmdLoadState(FXObject *, FXSelector, void *)
Called on "save state".
void eraseBreakpointDialog()
erase current breakpoint dialog
int myPreviousCollisionNumber
previous collision number
long onCmdEditChosen(FXObject *, FXSelector, void *)
Called on menu Edit->Edit Chosen.
virtual void detach()
Detaches the tool/menu bar.
long onCmdDelayDec(FXObject *, FXSelector, void *)
Called on "delay dec".
long onCmdOpenRecent(FXObject *, FXSelector, void *)
Called on opening a recent file.
MFXRecentNetworks myRecentConfigs
List of recent configs.
long onUpdOpenRecent(FXObject *, FXSelector, void *)
Determines whether opening a recent file is enabled.
MFXSynchQue< GUIEvent * > myEvents
List of got requests.
bool myShowTimeAsHMS
whether to show time as hour:minute:second
double myAlternateSimDelay
The alternate simulation delay in milliseconds for toggling.
long onUpdStop(FXObject *, FXSelector, void *)
Determines whether "stop" is enabled.
FXDataTarget * mySimDelayTarget
Simulation delay target.
long onCmdSaveConfig(FXObject *, FXSelector, void *)
Called on menu File->Close.
void closeAllWindows()
this method closes all windows and deletes the current simulation
void updateTimeLCD(SUMOTime time)
updates the simulation time display
long onCmdSaveState(FXObject *, FXSelector, void *)
Called on "save state".
std::map< int, Command * > myHotkeyRelease
custom hotkeys released
long onCmdShowToolTipsView(FXObject *, FXSelector, void *)
Called on "show tool tips in view".
FXToolBarShell * myToolBarDrag3
long onLoadThreadEvent(FXObject *, FXSelector, void *)
Called on an event from the loading thread.
long onCmdReload(FXObject *, FXSelector, void *)
Called on reload.
void addRecentNetwork(const FX::FXString &f)
add recent network to recent file list
void buildRecentConfigs(FXMenuPane *fileMenu, FXMenuPane *fileMenuRecentConfigs)
build recent configs
long onUpdOpen(FXObject *, FXSelector, void *)
Determines whether opening is enabled.
long onCmdHallOfFame(FXObject *, FXSelector, void *)
Shows the Hall of Fame dialog.
double myTotalDistance
total distance
long onCmdLocate(FXObject *, FXSelector, void *)
Called on menu commands from the Locator menu.
FXToolBar * myToolBar6
toolbars used in game
FXToolBarShell * myToolBarDrag6
toolbars shell used in game
long long myGuiSettingsFileMTime
last modification time of the gui setting file
FXSlider * mySimDelaySlider
Simulation delay slider.
long onCmdOpenConfiguration(FXObject *, FXSelector, void *)
Called on menu File->Open Configuration.
long onCmdOpenEdgeData(FXObject *, FXSelector, void *)
Called on menu File->Load EdgeData.
FXMenuCheck * myLoadDemandInNetedit
menuCheck for enable/disable load demand elements in netedit
virtual void addToWindowsMenu(FXMenuPane *menuPane)
FOX need this.
long onCmdEditViewport(FXObject *, FXSelector, void *)
Called on menu Edit->Viewport.
MFXLCDLabel * myLCDLabel
the simulation step display
FXMenuBar * myMenuBar
The application menu bar.
static std::mt19937 myGamingRNG
A random number generator used to choose a gaming sound.
long onCmdHotkeys(FXObject *sender, FXSelector sel, void *ptr)
called if the user selects help->Hotkeys
long myLastStepEventMillis
last time the simulation view was redrawn due to a simStep
virtual ~GUIApplicationWindow()
Destructor.
long onCmdHelp(FXObject *sender, FXSelector sel, void *ptr)
called if the user selects help->Documentation
void addHotkey(int key, Command *press, Command *release)
register custom hotkey action
virtual void fillMenuBar()
Builds the menu bar.
bool myIsReload
whether we are reloading the simulation
std::vector< FXButton * > myStatButtons
Buttons showing and running values and triggering statistic windows.
virtual void eventOccurred()
a certain event ocurred
void checkGamingEvents()
handles additional game-related events
long onCmdQuickReload(FXObject *, FXSelector, void *)
Called on quick-reload.
FXMenuCommand * myOpenInNetedit
menuCommand for opening simulation/network in netedit
long onCmdGaming(FXObject *, FXSelector, void *)
Toggle gaming mode.
void clearDecals()
Clear the default decals.
void saveViewport(const double x, const double y, const double z, const double rot)
Makes the given viewport the default.
void saveDecals(const std::vector< GUISUMOAbstractView::Decal > &decals)
Makes the given decals the default.
static void close()
close GUICursorSubSys
static void initCursors(FXApp *a)
Initiate GUICursorSubSys.
static FXLabel * buildFXLabel(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXuint opts, 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)
Construct label with given text and icon.
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
static FXMenuTitle * buildFXMenuTitle(FXComposite *p, const std::string &text, FXIcon *icon, FXMenuPane *menuPane)
build menu title
static FXMenuCommand * buildFXMenuCommandRecentFile(FXComposite *p, const std::string &text, FXObject *tgt, FXSelector sel)
build menu command (for recent files)
static FXMenuCheck * buildFXMenuCheckbox(FXComposite *p, const std::string &text, const std::string &info, FXObject *tgt, FXSelector sel)
build menu checkbox
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
static FXMenuCommand * buildFXMenuCommandShortcut(FXComposite *p, const std::string &text, const std::string &shortcut, const std::string &info, FXIcon *icon, FXObject *tgt, FXSelector sel)
build menu command
The application's "About" - dialog.
void create()
Creates the widget.
The dialog to change the application (gui) settings.
Editor for simulation breakpoints.
The application's "Feedback" dialog.
void create()
Creates the widget.
Editor for the list of chosen objects.
The SUMO User Conference "Hall of Fame" - dialog / easter egg.
void create()
Creates the widget.
const std::string & getCaption() const
const std::string & getSchemeName() const
const std::string & getCaption() const
const std::string & getMsg() const
Returns the message.
Event sent when the simulation is over.
MSNet::SimulationState getReason() const
Returns the reason the simulation has ended due.
SUMOTime getTimeStep() const
Returns the time step the simulation has ended at.
const SUMOTime myBegin
the time the simulation shall start with
const std::vector< std::string > mySettingsFiles
the name of the settings file to load
const bool myOsgView
whether to load the OpenSceneGraph view
const SUMOTime myEnd
the time the simulation shall end with
const bool myViewportFromRegistry
whether loading viewport from registry
const std::string myFile
the name of the loaded file
GUIEventType getOwnType() const
returns the event type
Definition GUIEvent.h:89
virtual void create()
create GUIGlChildWindow
GUISUMOAbstractView * getView() const
return GUISUMOAbstractView
virtual FXGLCanvas * getBuildGLCanvas() const
get build GL Canvas
GUIGlID getGlID() const
Returns the numerical id of the object.
static double gTrackerInterval
the aggregation period for tracker windows in seconds
Definition GUIGlobals.h:46
static bool gRunAfterLoad
the simulation shall start direct after loading
Definition GUIGlobals.h:37
static bool gQuitOnEnd
the window shall be closed when the simulation has ended
Definition GUIGlobals.h:40
static bool gDemoAutoReload
the simulation shall reload when it has ended (demo)
Definition GUIGlobals.h:43
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
static void initIcons(FXApp *a)
Initiate GUIIconSubSys.
static void close()
close GUIIconSubSys
Representation of a lane in the micro simulation (gui-version)
Definition GUILane.h:60
void loadConfigOrNet(const std::string &file)
begins the loading of the given file
const std::string & getFileName() const
void setWindowSizeAndPos()
perform initial window positioning and sizing according to user options / previous call
bool myListParking
information whether the locator should list parking vehicles
void removeViewByID(const std::string &id)
long onCmdUnfocusCoordinate(FXObject *, FXSelector, void *)
called when a coordinate field in the status bar loses focus
std::vector< FXMainWindow * > myTrackerWindows
list of tracker windows
FXMenuPane * myLanguageMenu
Language menu common to all applications.
GUISUMOAbstractView * getActiveView() const
get the active view or 0
long onCmdSetGeoCoordinate(FXObject *, FXSelector, void *)
called when user enters a geo coordinate in the status bar
bool myListTeleporting
information whether the locator should list teleporting vehicles
std::map< std::string, std::string > myOnlineMaps
online mapping services for the context menu
MFXStaticToolTip * myStaticTooltipMenu
static toolTip used in menus
FXMDIClient * myMDIClient
The multi view panel.
long onCmdSetCartesianCoordinate(FXObject *, FXSelector, void *)
called when user enters a cartesian coordinate in the status bar
FXHorizontalFrame * myTraCiFrame
frames for coordinates
void buildLanguageMenu(FXMenuBar *menuBar)
long onCmdChangeLanguage(FXObject *, FXSelector, void *)
MFXStaticToolTip * myStaticTooltipView
static toolTip used in view
bool listParking() const
return whether to list parking vehicles
FXHorizontalFrame * myGeoFrame
FXTextField * myCartesianCoordinate
Coordinate fields for the current cartesian, geo-coordinate and test coordinates.
FXHorizontalFrame * myTestFrame
FXHorizontalFrame * myCartesianFrame
FXLabel * myTestCoordinate
FXMutex myTrackerLock
A lock to make the removal and addition of trackers secure.
FXDockSite * myTopDock
dock sites
bool myListInternal
information whether the locator should list internal structures
void storeWindowSizeAndPos()
record window position and size in registry
long onCmdFocusCoordinate(FXObject *, FXSelector, void *)
called when user focuses a coordinate field in the status bar
bool myAmFullScreen
FOX need this.
FXStatusBar * myStatusbar
The status bar.
void updateChildren(int msg=MID_SIMSTEP)
update childrens
FXTextField * myGeoCoordinate
FXGLVisual * myGLVisual
The gl-visual used.
bool myAmGaming
information whether the gui is currently in gaming mode
std::vector< GUIGlChildWindow * > myGLWindows
list of GLWindows
long onUpdChangeLanguage(FXObject *, FXSelector, void *)
A logging window for the gui.
void addSeparator()
Adds a a separator to this log window.
void clear()
Clears the window.
void appendMsg(GUIEventType eType, const std::string &msg)
Adds new text to the window.
static SUMOTime getBreakPointOffset()
ask whether locate links is enabled
MSTransportableControl & getPersonControl() override
Returns the person control.
Definition GUINet.cpp:130
void flushOutputsAtEnd()
flush outputs once the simulation has reached its end
Definition GUINet.cpp:814
GUITrafficLightLogicWrapper * getTLLWrapper(MSTrafficLightLogic *tll)
Definition GUINet.cpp:226
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own parameter window.
Definition GUINet.cpp:486
static GUINet * getGUIInstance()
Returns the pointer to the unique instance of GUINet (singleton).
Definition GUINet.cpp:581
MSTransportableControl & getContainerControl() override
Returns the container control.
Definition GUINet.cpp:139
virtual double getRotation() const =0
Returns the rotation of the canvas stored in this changer.
virtual double getXPos() const =0
Returns the x-offset of the field to show stored in this changer.
virtual double getYPos() const =0
Returns the y-offset of the field to show stored in this changer.
virtual double getZPos() const =0
Returns the camera height corresponding to the current zoom factor.
void singleStep()
called when the user presses the "single step"-button
GUINet & getNet() const
returns the loaded network
virtual void begin()
starts the simulation (execution of one step after another)
SUMOTime getSimBegin()
get simulation begin time
void resume()
called when the user presses the "resume"-button
virtual bool simulationIsStartable() const
check if simulation is startable
bool networkAvailable() const
returns the information whether a network has been loaded
virtual bool simulationIsStepable() const
check if simulation is stepable
std::vector< SUMOTime > & getBreakpoints()
get list of breakpoints
virtual bool init(GUINet *net, SUMOTime start, SUMOTime end)
initialises the thread with the new simulation
FXMutex & getBreakpointLock()
get breakpoint lock
SUMOTime getSimEndTime() const
get simulation end time
virtual bool simulationIsStopable() const
check if simulation is stopableo
virtual void deleteSim()
deletes the existing simulation
void stop()
halts the simulation execution
void prepareDestruction()
halts the thread before it shall be deleted
MFXComboBoxIcon * getColoringSchemesCombo()
get coloring schemes combo
void addDecals(const std::vector< Decal > &decals)
add decals
void processPendingTextureDeletes()
process pending texture deletions
FXbool makeCurrent()
A reimplementation due to some internal reasons.
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
GUIPerspectiveChanger & getChanger() const
get changer
std::vector< Decal > & getDecals()
The list of decals to show.
void clearDecals()
clear all decals
virtual void updatePositionInformationLabel() const
update position information labels
virtual void setViewportFromToRot(const Position &lookFrom, const Position &lookAt, double rotation)
applies the given viewport settings
GUIVisualizationSettings * editVisualisationSettings() const
edit visualization settings (allow modify VisualizationSetings, use carefully)
virtual void copyViewportTo(GUISUMOAbstractView *view)
copy the viewport to the given view
virtual bool setColorScheme(const std::string &)
set color scheme
A single child window which contains a view of the simulation area.
ViewType
Available view types.
@ VIEW_3D_OSG
plain 3D OSG view (
@ VIEW_2D_OPENGL
plain 2D openGL view (
virtual GUISUMOAbstractView * init(FXGLCanvas *share, GUINet &net, ViewType type)
"Initialises" this window by building the contents
long onCmdLocate(FXObject *, FXSelector, void *)
locator-callback
long onKeyRelease(FXObject *o, FXSelector sel, void *data)
void setToolBarVisibility(const bool value)
about toggled gaming status
long onKeyPress(FXObject *o, FXSelector sel, void *data)
handle keys
void clear()
Clears the list of selected objects.
void select(GUIGlID id, bool update=true)
Adds the object with the given id.
std::string load(const std::string &filename, GUIGlObjectType type=GLO_MAX, std::ostream *dynamicNotFound=nullptr)
Loads a selection list (optionally with restricted type)
An XML-handler for visualisation schemes.
double getDelay() const
Returns the parsed delay.
const std::string & getSettingName() const
std::vector< std::string > getTrackers()
RandomDistributor< std::string > getEventDistribution(const std::string &id)
const std::string & getViewType() const
Returns the parsed view type.
void applyViewport(GUISUMOAbstractView *view) const
Sets the viewport which has been parsed.
const std::vector< SUMOTime > & getBreakpoints() const
Returns the parsed breakpoints.
void setSnapshots(GUISUMOAbstractView *view) const
Makes a snapshot if it has been parsed.
const std::vector< GUISUMOAbstractView::Decal > & getDecals() const
Returns the parsed decals.
Storage for geometrical objects extended by mutexes.
static void buildAccelerators(FXAccelTable *accelTable, FXObject *target, const bool sumogui)
build accelerators
static void changeAccelerator(FXAccelTable *accelTable, FXObject *target, GUIShortcut keysym, long msg)
change accelerator (used for toggle dynamically binding space key with start/end simulation)
static void resetTextures()
Reset textures.
static void initTextures(FXApp *a)
Initiate GUITextureSubSys for textures.
void begin2TrackPhases(GUIMainWindow *app=nullptr)
Builds a GUITLLogicPhasesTrackerWindow which will receive new phases.
static std::string clipped
Definition GUIUserIO.h:58
bool drawJunctionShape
whether the shape of the junction should be drawn
bool secondaryShape
whether secondary lane shape shall be drawn
GUIColorer laneColorer
The lane colorer.
bool amChecked() const
check if this MFXCheckableButton is checked
void setChecked(bool val, const bool inform=false)
check or uncheck this MFXCheckableButton
long setCurrentItem(const FXint index, FXbool notify=FALSE)
Set the current item (index is zero-based)
FXint findItem(const FXString &text) const
find item
void setVertical(const FXint len)
set segment vertical length - must be more than twice the segment width
void setGroove(const FXint w)
set groove width - must be less than segment width
void setThickness(const FXint w)
set segment width - must be less than half the segment length
void setToolTipText(const FXString &text)
set tooltip text
void setText(FXString lbl)
manipulate text in LCD label
void setHorizontal(const FXint len)
set segment horizontal length - must be more than twice the segment width
void setFgColor(FXColor clr)
set forground color
static void sleep(long ms)
void enableStaticToolTip(const bool value)
enable/disable static tooltip
void push_back(T what)
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
Definition MFXUtils.cpp:146
static FXString getTitleText(const FXString &appname, FXString filename="")
Returns the title text in dependence to an optional file name.
Definition MFXUtils.cpp:62
static FXbool userPermitsOverwritingWhenFileExists(FXWindow *const parent, const FXString &file)
Returns true if either the file given by its name does not exist or the user allows overwriting it.
Definition MFXUtils.cpp:41
static FXString assureExtension(const FXFileDialog &openDialog)
Corrects missing extension.
Definition MFXUtils.cpp:71
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
bool isStopped() const
Returns whether the vehicle is at a stop.
static const MSEdgeVector & getAllEdges()
Returns all edges with a numerical id.
Definition MSEdge.cpp:1144
int getWaitingVehicleNo() const
Returns the number of waiting vehicles.
SVCPermissions getPermissions() const
Returns the vehicle class permissions for this lane.
Definition MSLane.h:640
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition MSLane.h:575
SUMOTime loadState(const std::string &fileName, const bool catchExceptions)
load state from file and return new time
Definition MSNet.cpp:1853
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:201
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition MSNet.h:475
@ SIMSTATE_LOADING
The simulation is loading.
Definition MSNet.h:96
@ SIMSTATE_ERROR_IN_SIM
An error occurred during the simulation step.
Definition MSNet.h:106
static std::string getStateMessage(SimulationState state)
Returns the message to show if a certain state occurs.
Definition MSNet.cpp:1037
void quickReload()
reset state to the beginning without reloading the network
Definition MSNet.cpp:1832
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
bool hasContainers() const
Returns whether containers are simulated.
Definition MSNet.h:435
bool hasPersons() const
Returns whether persons are simulated.
Definition MSNet.h:419
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition MSNet.h:455
ShapeContainer & getShapeContainer()
Returns the shapes container.
Definition MSNet.h:525
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:402
static void saveState(const std::string &file, SUMOTime step, bool usePrefix=true)
Saves the current state.
MSTrafficLightLogic * getActive() const
bool knows(const std::string &id) const
Returns the information whether the named tls is stored.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
The parent class for traffic light logics.
int getRunningNumber() const
Returns the number of build and inserted, but not yet deleted transportables.
int getWaitingForVehicleNumber() const
Returns the number of transportables waiting for a ride.
The class responsible for building and deletion of vehicles.
int getRunningVehicleNo() const
Returns the number of build and inserted, but not yet deleted vehicles.
void setScale(double scale)
sets the demand scaling factor
int getCollisionCount() const
return the number of collisions
int getDepartedVehicleNo() const
Returns the number of inserted vehicles.
std::map< std::string, SUMOVehicle * >::const_iterator constVehIt
Definition of the internal vehicles map iterator.
constVehIt loadedVehBegin() const
Returns the begin of the internal vehicle map.
int getTeleportCount() const
return the number of teleports (including collisions)
constVehIt loadedVehEnd() const
Returns the end of the internal vehicle map.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
bool isOnRoad() const
Returns the information whether the vehicle is on a road (is simulated)
Definition MSVehicle.h:605
const MSLane * getLane() const
Returns the lane the vehicle is on.
Definition MSVehicle.h:581
double getSpeed() const
Returns the vehicle's current speed.
Definition MSVehicle.h:490
The XML-Handler for shapes loading network loading.
Definition NLHandler.h:55
void writeConfiguration(std::ostream &os, const bool filled, const bool complete, const bool addComments, const std::string &relativeTo="", const bool forceRelative=false, const bool inComment=false, const std::string &indent="") const
Writes the configuration.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
static OptionsCont & getOptions()
Retrieves the options.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
void set(double x, double y)
set positions x and y
Definition Position.h:82
double x() const
Returns the x-position.
Definition Position.h:52
double y() const
Returns the y-position.
Definition Position.h:57
static const RGBColor GREEN
Definition RGBColor.h:205
static const RGBColor RED
named colors
Definition RGBColor.h:204
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
T get(SumoRNG *which=nullptr) const
Draw a sample of the distribution.
static StringBijection< StateFileExtension > StateFileExtensions
state file extensions
static StringBijection< SumoConfigFileExtension > SumoConfigFileExtensions
sumo config file extensions
static StringBijection< EdgeDataFileExtension > EdgeDataFileExtensions
edgedata file extensions
static StringBijection< ShapesFileExtension > ShapesFileExtensions
additional file extensions
static StringBijection< NetFileExtension > NetFileExtensions
net file extensions
std::vector< std::string > getVector()
return vector of strings
static std::string replace(std::string str, const std::string &what, const std::string &by)
Replaces all occurrences of the second string by the third string within the first string.
A few system-specific functions.
Definition SysUtils.h:30
static unsigned long runHiddenCommand(const std::string &cmd)
run a shell command without popping up any windows (particuarly on win32)
Definition SysUtils.cpp:70
static long long getModifiedTime(const std::string &fname)
@brie get modified time
Definition SysUtils.cpp:110
static long getCurrentMillis()
Returns the current time in milliseconds.
Definition SysUtils.cpp:45
static TraCIServer * getInstance()
Definition TraCIServer.h:68
static FXIcon * getVClassIcon(const SUMOVehicleClass vc)
returns icon associated to the given vClass
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false, const bool isRoute=false, const bool isExternal=false, const bool catchExceptions=true)
Runs the given handler on the given file; returns if everything's ok.
static std::string transcodeToLocal(const std::string &utf8String)
convert a string from UTF-8 to the local codepage
@ SEL_THREAD_EVENT
Definition fxexdefs.h:173
@ SEL_THREAD
Definition fxexdefs.h:155