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-2025 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
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>
68#include <utils/xml/XMLSubSys.h>
69
73#include "GUIGlobals.h"
74#include "GUILoadThread.h"
75#include "GUIRunThread.h"
81
82
83#define MIN_DRAW_DELAY 20
84//#define HAVE_DANGEROUS_SOUNDS
85
86// ===========================================================================
87// FOX-declarations
88// ===========================================================================
89FXDEFMAP(GUIApplicationWindow) GUIApplicationWindowMap[] = {
90 // close
94 FXMAPFUNC(SEL_CLOSE, MID_WINDOW, GUIApplicationWindow::onCmdQuit),
95 // toolbar
112 // gaming
122 // OSG
123#ifdef HAVE_OSG
124 FXMAPFUNC(SEL_COMMAND, MID_NEW_OSGVIEW, GUIApplicationWindow::onCmdNewOSG),
126
127#endif
128 // Time
135 FXMAPFUNC(SEL_COMMAND, MID_DELAY_INC, GUIApplicationWindow::onCmdDelayInc),
136 FXMAPFUNC(SEL_COMMAND, MID_DELAY_DEC, GUIApplicationWindow::onCmdDelayDec),
137 FXMAPFUNC(SEL_COMMAND, MID_SIMSAVE, GUIApplicationWindow::onCmdSaveState),
138 FXMAPFUNC(SEL_COMMAND, MID_SIMLOAD, GUIApplicationWindow::onCmdLoadState),
145 // Stats
149 // these functions do not assign shortcut keys to commands, but rather affect the button enable status upon other events (e.g. simulation loaded)
150 // since those events are invoked through pseudo key events (?), the same key shortcuts as in cmd must be supplied as well
180 FXMAPFUNC(SEL_COMMAND, MID_HOTKEYS, GUIApplicationWindow::onCmdHotkeys),
181 FXMAPFUNC(SEL_COMMAND, MID_TUTORIAL, GUIApplicationWindow::onCmdTutorial),
183 FXMAPFUNC(SEL_COMMAND, MID_FEEDBACK, GUIApplicationWindow::onCmdFeedback),
185 // forward requests to the active view
204 // languages
227 // keys
228 FXMAPFUNC(SEL_KEYPRESS, 0, GUIApplicationWindow::onKeyPress),
229 FXMAPFUNC(SEL_KEYRELEASE, 0, GUIApplicationWindow::onKeyRelease),
230 // clipboard
231 FXMAPFUNC(SEL_CLIPBOARD_REQUEST, 0, GUIApplicationWindow::onClipboardRequest),
232 // events
237};
238
239// Object implementation
240FXIMPLEMENT(GUIApplicationWindow, FXMainWindow, GUIApplicationWindowMap, ARRAYNUMBER(GUIApplicationWindowMap))
241
242// ===========================================================================
243// static members
244// ===========================================================================
246
247
248// ===========================================================================
249// member method definitions
250// ===========================================================================
251#ifdef _MSC_VER
252#pragma warning(push)
253#pragma warning(disable: 4355) // mask warning about "this" in initializers
254#endif
256 GUIMainWindow(a),
257 myFileMenuRecentNetworks(new FXMenuPane(this)),
258 myFileMenuRecentConfigs(new FXMenuPane(this)),
259 myRecentNetworks(a, "networks"),
260 myRecentConfigs(a, "configs"),
261 myLastStepEventMillis(SysUtils::getCurrentMillis() - MIN_DRAW_DELAY) {
262 // init icons
264 // init Textures
266 // init cursors
268 // disable tooltips
269 a->setTooltipTime(1000000000);
270 a->setTooltipPause(1000000000);
271}
272#ifdef _MSC_VER
273#pragma warning(pop)
274#endif
275
276
281
282
283void
285 // don't do this twice
286 if (hadDependentBuild) {
287 return;
288 }
289 hadDependentBuild = true;
290 setTarget(this);
291 setSelector(MID_WINDOW);
292 // build menu bar
293 myMenuBarDrag = new FXToolBarShell(this, GUIDesignToolBar);
295 new FXToolBarGrip(myMenuBar, myMenuBar, FXMenuBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
297 // build the thread - io
302 // build the status bar
303 myStatusbar = new FXStatusBar(this, GUIDesignStatusBar);
304 {
305 // build TraCi info
307 auto button = GUIDesigns::buildFXButton(myTraCiFrame, "TraCI", "", "", nullptr, this, MID_TRACI_STATUS, GUIDesignButtonStatusBarFixed);
308 button->setBackColor(FXRGBA(253, 255, 206, 255));
309 if (TraCIServer::getInstance() == nullptr) {
310 myTraCiFrame->hide();
311 }
312 // build geo coordiantes
314 myGeoCoordinate = GUIDesigns::buildFXLabel(myGeoFrame, TL("N/A"), "", TL("Original coordinate (before coordinate transformation in netconvert)"), nullptr, LAYOUT_CENTER_Y);
315 // build cartesian coordinates
317 myCartesianCoordinate = GUIDesigns::buildFXLabel(myCartesianFrame, TL("N/A"), "", TL("Network coordinate"), nullptr, LAYOUT_CENTER_Y);
318 // build buttons
321 myStatButtons.back()->hide();
323 myStatButtons.back()->hide();
324 }
325 // make the window a mdi-window
326 myMainSplitter = new FXSplitter(this, GUIDesignSplitter | SPLITTER_VERTICAL | SPLITTER_REVERSED);
328 myMDIMenu = new FXMDIMenu(this, myMDIClient);
329 new FXMDIWindowButton(myMenuBar, myMDIMenu, myMDIClient, FXMDIClient::ID_MDI_MENUWINDOW, GUIDesignMDIButtonLeft);
330 new FXMDIDeleteButton(myMenuBar, myMDIClient, FXMDIClient::ID_MDI_MENUCLOSE, GUIDesignMDIButtonRight);
331 new FXMDIRestoreButton(myMenuBar, myMDIClient, FXMDIClient::ID_MDI_MENURESTORE, GUIDesignMDIButtonRight);
332 new FXMDIMinimizeButton(myMenuBar, myMDIClient, FXMDIClient::ID_MDI_MENUMINIMIZE, GUIDesignMDIButtonRight);
333 // build the message window
335 // fill menu and tool bar
336 fillMenuBar();
337 myToolBar6->hide();
338 myToolBar7->hide();
339 myToolBar9->hide();
340 myToolBar10->hide();
341 // build additional threads
342 myLoadThread = new GUILoadThread(getApp(), this, myEvents, myLoadThreadEvent, isLibsumo);
344 // set the status bar
345 setStatusBarText(TL("Ready."));
346 // set the caption
347 setTitle(MFXUtils::getTitleText("SUMO " VERSION_STRING));
348 // start the simulation-thread (it will loop until the application ends deciding by itself whether to perform a step or not)
349 myRunThread->start();
352}
353
354
355void
358 gCurrentFolder = getApp()->reg().readStringEntry("SETTINGS", "basedir", "");
359 FXMainWindow::create();
360 myMenuBarDrag->create();
361 myToolBarDrag1->create();
362 myToolBarDrag2->create();
363 myToolBarDrag3->create();
364 myToolBarDrag4->create();
365 myToolBarDrag5->create();
366 myToolBarDrag6->create();
367 myToolBarDrag7->create();
368 myFileMenu->create();
369 mySelectByPermissions->create();
370 myEditMenu->create();
371 mySettingsMenu->create();
372 myLocatorMenu->create();
373 myControlMenu->create();
374 myWindowMenu->create();
375 myLanguageMenu->create();
376 myHelpMenu->create();
377 FXint textWidth = getApp()->getNormalFont()->getTextWidth("8", 1) * 24;
378 myCartesianFrame->setWidth(textWidth);
379 myGeoFrame->setWidth(textWidth);
380 if (myTestFrame) {
381 myTestFrame->setWidth(textWidth);
382 }
383
384 show(PLACEMENT_DEFAULT);
385 if (!OptionsCont::getOptions().isSet("window-size")) {
386 if (getApp()->reg().readIntEntry("SETTINGS", "maximized", 0) == 1) {
387 maximize();
388 }
389 }
390 myShowTimeAsHMS = (getApp()->reg().readIntEntry("gui", "timeasHMS", 0) == 1);
391 myAlternateSimDelay = getApp()->reg().readIntEntry("gui", "alternateSimDelay", 100);
392 const std::string& onlineMaps = getApp()->reg().readStringEntry("gui", "onlineMaps", "");
393 for (const std::string& entry : StringTokenizer(onlineMaps, "\n").getVector()) {
394 const std::vector<std::string> split = StringTokenizer(entry, "\t").getVector();
395 if (split.size() == 2) {
396 myOnlineMaps[split[0]] = split[1];
397 }
398 }
399 if (myOnlineMaps.empty()) {
400 myOnlineMaps["GeoHack"] = "https://geohack.toolforge.org/geohack.php?params=%lat;%lon_scale:1000";
401 myOnlineMaps["Google Maps"] = "https://www.google.com/maps?ll=%lat,%lon&t=h&z=18";
402 myOnlineMaps["OSM"] = "https://www.openstreetmap.org/?mlat=%lat&mlon=%lon&zoom=18&layers=M";
403 }
405}
406
407
410 myRunThread->join();
412 // close icons
415 // delete visual
416 delete myGLVisual;
417 // delete some non-parented windows
418 delete myToolBarDrag1;
419 delete mySimDelayTarget;
420 // delete rest of elements
423 delete myRunThread;
424 delete myFileMenu;
425 delete myEditMenu;
427 delete mySettingsMenu;
428 delete myLocatorMenu;
429 delete myControlMenu;
430 delete myLanguageMenu;
431 delete myWindowMenu;
432 delete myHelpMenu;
433 delete myLoadThread;
434
435 while (!myEvents.empty()) {
436 // get the next event
437 GUIEvent* e = myEvents.top();
438 myEvents.pop();
439 delete e;
440 }
441 for (auto item : myHotkeyPress) {
442 delete item.second;
443 }
444 for (auto item : myHotkeyRelease) {
445 delete item.second;
446 }
447}
448
449
450void
452 FXMainWindow::detach();
453 myMenuBarDrag->detach();
454 myToolBarDrag1->detach();
455}
456
457
458void
459GUIApplicationWindow::addToWindowsMenu(FXMenuPane* /*menuPane*/) {
460 // unused, implement in children
461}
462
463
464void
466 // build file menu
467 myFileMenu = new FXMenuPane(this);
470 TL("New Window"), "Ctrl+Shift+N", TL("Open a new sumo-gui window."),
471 nullptr, this, MID_HOTKEY_CTRL_SHIFT_N_NEWWINDOW);
472 new FXMenuSeparator(myFileMenu);
474 TL("&Open Simulation..."), "Ctrl+O", TL("Open a simulation (Configuration file)."),
477 TL("Open &Network..."), "Ctrl+N", TL("Open a network."),
480 TL("Open Shapes "), "Ctrl+P", TL("Load POIs and Polygons for visualization."),
483 TL("Open EdgeData "), "Ctrl+U", TL("Load edge related data for visualization."),
486 TL("&Reload"), "Ctrl+R", TL("Reloads the simulation / the network."),
489 TL("Quick-Reload"), "Ctrl+0", TL("Reloads the simulation (but not network)."),
491 new FXMenuSeparator(myFileMenu);
493 TL("Save Configuration"), "Ctrl+Shift+S", TL("Save current options as a configuration file."),
496 TL("Close"), "Ctrl+W", TL("Close the simulation."),
498 new FXMenuSeparator(myFileMenu);
499 // build recent files
502 new FXMenuSeparator(myFileMenu);
504 TL("&Quit"), "Ctrl+Q", TL("Quit the Application."),
505 nullptr, this, MID_HOTKEY_CTRL_Q_CLOSE);
506 // build edit menu
507 mySelectByPermissions = new FXMenuPane(this);
508 std::vector<std::string> vehicleClasses = SumoVehicleClassStrings.getStrings();
509 for (const auto& vehicleClass : vehicleClasses) {
511 }
512 myEditMenu = new FXMenuPane(this);
515 TL("Edit Selected..."), "Ctrl+E", TL("Opens a dialog for editing the list of selected items."),
517 mySelectLanesMenuCascade = new FXMenuCascade(myEditMenu, TL("Select lanes which allow..."), GUIIconSubSys::getIcon(GUIIcon::FLAG), mySelectByPermissions);
518 mySelectLanesMenuCascade->setHelpText(TL("Opens a menu for selecting a vehicle class by which to selected lanes."));
519 new FXMenuSeparator(myEditMenu);
521 TL("Set Breakpoint"), "B", TL("Sets a breakpoint at the current simulation step"),
524 TL("Set Breakpoint with offset"), "Alt+B", TL("Sets a breakpoint at the current simulation step + offset configured in application settings"),
527 TL("Edit Breakpoints"), "Ctrl+B", TL("Opens a dialog for editing breakpoints."),
530 TL("Edit Visualisation"), "F9", TL("Opens a dialog for editing visualization settings."),
533 TL("Edit Viewport"), "Ctrl+I", TL("Opens a dialog for editing viewing area, zoom and rotation."),
535 new FXMenuSeparator(myEditMenu);
536 // add open in sumo options
537 myLoadAdditionalsInNetedit = GUIDesigns::buildFXMenuCheckbox(myEditMenu, TL("Load additionals in netedit"), TL("Load additionals in netedit."), this, MID_TOOLBAREDIT_LOADADDITIONALS);
538 myLoadAdditionalsInNetedit->setCheck(TRUE);
539 myLoadDemandInNetedit = GUIDesigns::buildFXMenuCheckbox(myEditMenu, TL("Load demand in netedit"), TL("Load demand in netedit."), this, MID_TOOLBAREDIT_LOADDEMAND);
540 myLoadDemandInNetedit->setCheck(FALSE);
542 TL("Open in netedit"), "Ctrl+T", TL("Opens current simulation in NETEDIT."),
545 TL("Open network in netedit"), "Ctrl+Shift+T", TL("Opens current network in NETEDIT."),
547 // build settings menu
548 mySettingsMenu = new FXMenuPane(this);
551 TL("Application Settings"), "Ctrl+H", TL("Open a Dialog for Application Settings editing."),
553 myGamingModeCheckbox = new FXMenuCheck(mySettingsMenu,
554 TL("Gaming Mode\tCtrl+G\tToggle gaming mode on/off."),
557 TL("Full Screen Mode"), "Ctrl+F", TL("Toggle full screen mode on/off."),
559 // build Locate menu
560 myLocatorMenu = new FXMenuPane(this);
563 TL("&Junctions"), "Shift+J", TL("Open a dialog for locating a Junction."),
566 TL("&Edges"), "Shift+E", TL("Open a dialog for locating an Edge."),
569 TL("&Vehicles"), "Shift+V", TL("Open a dialog for locating a Vehicle."),
572 TL("&Persons"), "Shift+P", TL("Open a dialog for locating a Person."),
575 TL("&Container"), "Shift+C", TL("Open a dialog for locating a Container."),
578 TL("&TLS"), "Shift+T", TL("Open a dialog for locating a Traffic Light."),
581 TL("&Additional"), "Shift+A", TL("Open a dialog for locating an Additional Structure."),
584 TL("P&oI"), "Shift+O", TL("Open a dialog for locating a Point of Interest."),
587 TL("Po&lygon"), "Shift+L", TL("Open a dialog for locating a Polygon."),
589 new FXMenuSeparator(myLocatorMenu);
590 GUIDesigns::buildFXMenuCheckbox(myLocatorMenu, TL("Show Internal Structures"), TL("Show internal junctions and streets in locator dialog."), this, MID_LISTINTERNAL);
591 FXMenuCheck* listParking = GUIDesigns::buildFXMenuCheckbox(myLocatorMenu, TL("Show Parking Vehicles"), TL("Show parking vehicles in locator dialog."), this, MID_LISTPARKING);
592 listParking->setCheck(myListParking);
593 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);
594 // build control menu
595 // the shortcut designator is not only at text in the submenu but also defines the real shortcut key assigned with it!
596 // secondary shortcuts (ctrl+A, ctrl+S, ctrl+D) are defined in GUIShortcutsSubSys::buildSUMOAccelerators
597 myControlMenu = new FXMenuPane(this);
598 GUIDesigns::buildFXMenuTitle(myMenuBar, TL("Simulation"), nullptr, myControlMenu);
600 TL("Run"), "A,space", TL("Start/ Resume the simulation."),
603 TLC("Simulation", "Stop"), "S,space", TL("Halt the simulation."),
606 TL("Step"), "D", TL("Perform one simulation step."),
609 TL("Delay+"), "PgUp", TL("Increase simulation step delay."), nullptr, this, MID_DELAY_INC);
611 TL("Delay-"), "PgDn", TL("Decrease simulation step delay."), nullptr, this, MID_DELAY_DEC);
613 TL("Save"), "", TL("Save the current simulation state to a file."),
616 TL("Load"), "", TL("Load simulation state for the current network from file."),
618 // build windows menu
619 myWindowMenu = new FXMenuPane(this);
621 GUIDesigns::buildFXMenuCommandShortcut(myWindowMenu, TL("Open new view"), "", TL("Open a new microscopic view."), GUIIconSubSys::getIcon(GUIIcon::MICROVIEW), this, MID_NEW_MICROVIEW);
622#ifdef HAVE_OSG
624#endif
626 TL("Tile &Horizontally"), "", TL("Tile the views horizontally."),
627 GUIIconSubSys::getIcon(GUIIcon::WINDOWS_TILE_HORI), myMDIClient, FXMDIClient::ID_MDI_TILEHORIZONTAL);
629 TL("Tile &Vertically"), "", TL("Tile the views vertically."),
630 GUIIconSubSys::getIcon(GUIIcon::WINDOWS_TILE_VERT), myMDIClient, FXMDIClient::ID_MDI_TILEVERTICAL);
632 TL("Cascade"), "", TL("Cascade the views."),
634 myMDIClient, FXMDIClient::ID_MDI_CASCADE);
636 TL("&Close"), "", TL("Close the selected view."),
637 nullptr, myMDIClient, FXMDIClient::ID_MDI_CLOSE);
638 FXMenuSeparator* sep2 = new FXMenuSeparator(myWindowMenu);
639 sep2->setTarget(myMDIClient);
640 sep2->setSelector(FXMDIClient::ID_MDI_ANY);
641 // for whatever reason, sonar complains in the next line that sep2 may leak, but fox does the cleanup
642 GUIDesigns::buildFXMenuCommand(myWindowMenu, "", nullptr, myMDIClient, FXMDIClient::ID_MDI_1); // NOSONAR
643 GUIDesigns::buildFXMenuCommand(myWindowMenu, "", nullptr, myMDIClient, FXMDIClient::ID_MDI_2);
644 GUIDesigns::buildFXMenuCommand(myWindowMenu, "", nullptr, myMDIClient, FXMDIClient::ID_MDI_3);
645 GUIDesigns::buildFXMenuCommand(myWindowMenu, "", nullptr, myMDIClient, FXMDIClient::ID_MDI_4);
646 GUIDesigns::buildFXMenuCommand(myWindowMenu, TL("&Others..."), nullptr, myMDIClient, FXMDIClient::ID_MDI_OVER_5);
647
648 new FXMenuSeparator(myWindowMenu);
649 GUIDesigns::buildFXMenuCheckbox(myWindowMenu, TL("Show Status Line"), TL("Toggle the Status Bar on/off."), myStatusbar, FXWindow::ID_TOGGLESHOWN);
650 GUIDesigns::buildFXMenuCheckbox(myWindowMenu, TL("Show Message Window"), TL("Toggle the Message Window on/off."), myMessageWindow, FXWindow::ID_TOGGLESHOWN);
651 GUIDesigns::buildFXMenuCheckbox(myWindowMenu, TL("Show Simulation Time"), TL("Toggle the Simulation Time on/off."), myToolBar3, FXWindow::ID_TOGGLESHOWN);
652 GUIDesigns::buildFXMenuCheckbox(myWindowMenu, TL("Show Simulation Delay"), TL("Toggle the Simulation Delay Entry on/off."), myToolBar4, FXWindow::ID_TOGGLESHOWN);
654
655 new FXMenuSeparator(myWindowMenu);
657 TL("Clear Message Window"), "", TL("Clear the message window."),
659 // build windows menu
661 // build help menu
662 myHelpMenu = new FXMenuPane(this);
664 TL("&Help"),
665 nullptr, myHelpMenu);
666 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Online Documentation"), "F1", TL("Open Online documentation."),
667 nullptr, this, MID_HOTKEY_F1_ONLINEDOCUMENTATION);
668 new FXMenuSeparator(myHelpMenu);
669 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Changelog"), "", TL("Open Changelog."),
670 nullptr, this, MID_CHANGELOG);
671 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Hotkeys"), "", TL("Open Hotkeys."),
672 nullptr, this, MID_HOTKEYS);
673 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Tutorial"), "", TL("Open Tutorial."),
674 nullptr, this, MID_TUTORIAL);
675 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Feedback"), "", TL("Open feedback dialog."),
676 nullptr, this, MID_FEEDBACK);
677 new FXMenuSeparator(myHelpMenu);
678 GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&About"), "F12", TL("About sumo-gui."),
680 // build SUMO Accelerators (hotkeys)
681 GUIShortcutsSubSys::buildAccelerators(getAccelTable(), this, true);
682}
683
684
685void
687 // file and simulation tool bar
688 {
689 myToolBarDrag1 = new FXToolBarShell(this, GUIDesignToolBar);
691 new FXToolBarGrip(myToolBar1, myToolBar1, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
692 // build file tools
693 new MFXButtonTooltip(myToolBar1, myStaticTooltipMenu, TL("\tOpen simulation\tOpen a simulation (Configuration file)."),
695 new MFXButtonTooltip(myToolBar1, myStaticTooltipMenu, TL("\tOpen network\tOpen a network."),
697 new MFXButtonTooltip(myToolBar1, myStaticTooltipMenu, TL("\tReload\tReloads the simulation / the network."),
699 }
700 // simulation toolbar
701 {
702 myToolBarDrag2 = new FXToolBarShell(this, GUIDesignToolBar);
704 new FXToolBarGrip(myToolBar2, myToolBar2, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
705 // build simulation tools
706 new MFXButtonTooltip(myToolBar2, myStaticTooltipMenu, TL("\tRun\tStart/Resume the loaded simulation."),
708 new MFXButtonTooltip(myToolBar2, myStaticTooltipMenu, TL("\tStop\tHalt the running simulation."),
710 new MFXButtonTooltip(myToolBar2, myStaticTooltipMenu, TL("\tStep\tPerform a single simulation step."),
712 }
713 // Simulation Step Display
714 {
715 myToolBarDrag3 = new FXToolBarShell(this, GUIDesignToolBar);
717 new FXToolBarGrip(myToolBar3, myToolBar3, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
718 new MFXButtonTooltip(myToolBar3, myStaticTooltipMenu, TL("Time:\tToggle between time formats\tToggle between seconds and hour:minute:seconds display."), nullptr, this, MID_TIME_TOGGLE, GUIDesignButtonToolbarText);
719
720 myLCDLabel = new MFXLCDLabel(myToolBar3, myStaticTooltipMenu, 16, nullptr, 0, JUSTIFY_RIGHT);
725 myLCDLabel->setText("----------------");
726 }
727 // Simulation Delay
728 {
729 myToolBarDrag4 = new FXToolBarShell(this, GUIDesignToolBar);
731 new FXToolBarGrip(myToolBar4, myToolBar4, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
732 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);
733 // create spinner for delay
734 mySimDelay = 0;
735 mySimDelayTarget = new FXDataTarget(mySimDelay);
737 // create slider
738 mySimDelaySlider = new FXSlider(myToolBar4, mySimDelayTarget, FXDataTarget::ID_VALUE, GUIDesignSlider);
739 mySimDelaySlider->setRange(0, 1000);
740 mySimDelaySlider->setHeadSize(10);
741 mySimDelaySlider->setIncrement(50);
742 mySimDelaySlider->setTickDelta(100);
743 mySimDelaySlider->setValue((int)mySimDelay);
744 //mySimDelayTarget->setNumberFormat(0);
745 //mySimDelayTarget->setIncrements(1, 10, 10);
746 mySimDelaySpinner->setIncrement(10);
747 mySimDelaySpinner->setRange(0, 10000);
748 mySimDelaySpinner->setValue(mySimDelay);
749 }
750 // Scale traffic (flows and incrementally loaded vehicles)
751 {
752 myToolBarDrag8 = new FXToolBarShell(this, GUIDesignToolBar);
754 new FXToolBarGrip(myToolBar8, myToolBar8, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
755 myScaleTrafficTooltip = new MFXLabelTooltip(myToolBar8, myStaticTooltipMenu, TL("Scale Traffic:"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
756 myScaleTrafficTooltip->setHelpText(TL("Scale traffic volume from running flows and from vehicles that are loaded incrementally from route files."));
758 myDemandScaleSpinner->setIncrement(0.5);
759 myDemandScaleSpinner->setRange(0, 1000);
760 myDemandScaleSpinner->setValue(1);
761 }
762 // Views
763 {
764 myToolBarDrag5 = new FXToolBarShell(this, GUIDesignToolBar);
766 new FXToolBarGrip(myToolBar5, myToolBar5, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
767 // build view tools
768 new MFXButtonTooltip(myToolBar5, myStaticTooltipMenu, (std::string("\t") + TL("Open new view") + std::string("\t") + TL("Open a new microscopic view.")).c_str(),
770#ifdef HAVE_OSG
771 new MFXButtonTooltip(myToolBar5, myStaticTooltipMenu, (std::string("\t") + TL("Open new 3D view") + std::string("\t") + TL("Open a new 3D view.")).c_str(),
773#endif
774 }
776 {
777 // total waitingTime
778 myToolBarDrag6 = new FXToolBarShell(this, GUIDesignToolBar);
780 new FXToolBarGrip(myToolBar6, myToolBar6, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
781 GUIDesigns::buildFXLabel(myToolBar6, TL("Waiting Time:"), "", TL("Time spent waiting accumulated for all vehicles"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
782 myWaitingTimeLabel = new MFXLCDLabel(myToolBar6, myStaticTooltipMenu, 13, nullptr, 0, JUSTIFY_RIGHT);
787 myWaitingTimeLabel->setText("-------------");
788 // idealistic time loss
789 myToolBarDrag7 = new FXToolBarShell(this, GUIDesignToolBar);
791 new FXToolBarGrip(myToolBar7, myToolBar7, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
792 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);
793 myTimeLossLabel = new MFXLCDLabel(myToolBar7, myStaticTooltipMenu, 13, nullptr, 0, JUSTIFY_RIGHT);
798 myTimeLossLabel->setText("-------------");
799 // total driving distance
800 myToolBarDrag9 = new FXToolBarShell(this, GUIDesignToolBar);
802 new FXToolBarGrip(myToolBar9, myToolBar9, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
803 GUIDesigns::buildFXLabel(myToolBar9, TL("Distance (km):"), "", TL("Total distance driven by DRT vehicles"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
804 myTotalDistanceLabel = new MFXLCDLabel(myToolBar9, myStaticTooltipMenu, 13, nullptr, 0, JUSTIFY_RIGHT);
809 myTotalDistanceLabel->setText("-------------");
810 // emergency vehicle counts
811 myToolBarDrag10 = new FXToolBarShell(this, GUIDesignToolBar);
813 new FXToolBarGrip(myToolBar10, myToolBar10, FXToolBar::ID_TOOLBARGRIP, GUIDesignToolBarGrip);
814 GUIDesigns::buildFXLabel(myToolBar10, TL("Emergency Vehicle waiting time:"), "", TL("Time spent waiting accumulated for emergency vehicles"), nullptr, LAYOUT_TOP | LAYOUT_LEFT);
815 myEmergencyVehicleLabel = new MFXLCDLabel(myToolBar10, myStaticTooltipMenu, 13, nullptr, 0, JUSTIFY_RIGHT);
820 myEmergencyVehicleLabel->setText("-------------");
821 }
822}
823
824
825void
826GUIApplicationWindow::buildRecentNetworks(FXMenuPane* fileMenu, FXMenuPane* fileMenuRecentNetworks) {
827 // for whatever reason, sonar complains in the next line that sep1 may leak, but fox does the cleanup
828 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_1);
829 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_2);
830 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_3);
831 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_4);
832 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_5);
833 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_6);
834 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_7);
835 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_8);
836 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_9);
837 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentNetworks, "", &myRecentNetworks, FXRecentFiles::ID_FILE_10);
838 new FXMenuSeparator(fileMenuRecentNetworks); // NOSONAR, Fox does the cleanup
839 GUIDesigns::buildFXMenuCommand(fileMenuRecentNetworks, TL("Cl&ear Recent Networks"), nullptr, &myRecentNetworks, FXRecentFiles::ID_CLEAR);
840 GUIDesigns::buildFXMenuCommand(fileMenuRecentNetworks, TL("No Recent Networks"), nullptr, &myRecentNetworks, MFXRecentNetworks::ID_NOFILES);
841 // set target
842 myRecentNetworks.setTarget(this);
843 myRecentNetworks.setSelector(MID_RECENTFILE);
844 new FXMenuCascade(fileMenu, TL("Recent Networks"), nullptr, fileMenuRecentNetworks);
845}
846
847
848void
849GUIApplicationWindow::buildRecentConfigs(FXMenuPane* fileMenu, FXMenuPane* fileMenuRecentConfigs) {
850 // for whatever reason, sonar complains in the next line that sep1 may leak, but fox does the cleanup
851 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_1);
852 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_2);
853 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_3);
854 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_4);
855 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_5);
856 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_6);
857 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_7);
858 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_8);
859 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_9);
860 GUIDesigns::buildFXMenuCommandRecentFile(fileMenuRecentConfigs, "", &myRecentConfigs, FXRecentFiles::ID_FILE_10);
861 new FXMenuSeparator(fileMenuRecentConfigs); // NOSONAR, Fox does the cleanup
862 GUIDesigns::buildFXMenuCommand(fileMenuRecentConfigs, TL("Cl&ear Recent Configs"), nullptr, &myRecentConfigs, FXRecentFiles::ID_CLEAR);
863 GUIDesigns::buildFXMenuCommand(fileMenuRecentConfigs, TL("No Recent Configs"), nullptr, &myRecentConfigs, MFXRecentNetworks::ID_NOFILES);
864 // set target
865 myRecentConfigs.setTarget(this);
866 myRecentConfigs.setSelector(MID_RECENTFILE);
867 new FXMenuCascade(fileMenu, TL("Recent Configs"), nullptr, fileMenuRecentConfigs);
868}
869
870
871long
872GUIApplicationWindow::onCmdQuit(FXObject*, FXSelector, void*) {
874 getApp()->reg().writeStringEntry("SETTINGS", "basedir", gCurrentFolder.text());
875 getApp()->reg().writeIntEntry("SETTINGS", "maximized", isMaximized() ? 1 : 0);
876 getApp()->reg().writeIntEntry("gui", "timeasHMS", myShowTimeAsHMS ? 1 : 0);
877 getApp()->reg().writeIntEntry("gui", "alternateSimDelay", (int)myAlternateSimDelay);
879 getApp()->exit(0);
880 return 1;
881}
882
883
884long
885GUIApplicationWindow::onCmdEditChosen(FXObject* menu, FXSelector, void*) {
886 FXMenuCommand* mc = dynamic_cast<FXMenuCommand*>(menu);
887 if (mc->getText() == StringUtils::replace(TL("Edit Selected..."), "&", "").c_str()) {
889 chooser->create();
890 chooser->show();
891 } else {
893 const SUMOVehicleClass svc = SumoVehicleClassStrings.get(mc->getText().text());
894 for (MSEdgeVector::const_iterator i = MSEdge::getAllEdges().begin(); i != MSEdge::getAllEdges().end(); ++i) {
895 const std::vector<MSLane*>& lanes = (*i)->getLanes();
896 for (std::vector<MSLane*>::const_iterator it = lanes.begin(); it != lanes.end(); ++it) {
897 GUILane* lane = dynamic_cast<GUILane*>(*it);
898 assert(lane != 0);
899 if ((lane->getPermissions() & svc) != 0) {
900 gSelected.select(lane->getGlID());
901 }
902 }
903 }
904 if (myMDIClient->numChildren() > 0) {
905 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
906 if (w != nullptr) {
907 // color by selection
909 }
910 }
911 }
913 }
914 return 1;
915}
916
917
918long
919GUIApplicationWindow::onCmdEditBreakpoints(FXObject*, FXSelector, void*) {
920 if (myBreakpointDialog == nullptr) {
922 } else {
923 myBreakpointDialog->restore();
924 myBreakpointDialog->setFocus();
925 myBreakpointDialog->raise();
926 }
927 return 1;
928}
929
930
931long
932GUIApplicationWindow::onCmdEditViewport(FXObject*, FXSelector, void*) {
933 if (!myGLWindows.empty()) {
934 myGLWindows[0]->getView()->showViewportEditor();
935 }
936 return 1;
937}
938
939
940long
941GUIApplicationWindow::onCmdEditViewScheme(FXObject*, FXSelector, void*) {
942 if (!myGLWindows.empty()) {
943 myGLWindows[0]->getView()->showViewschemeEditor();
944 }
945 return 1;
946}
947
948
949long
950GUIApplicationWindow::onCmdHelp(FXObject*, FXSelector, void*) {
951 MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/sumo-gui.html");
952 return 1;
953}
954
955
956long
957GUIApplicationWindow::onCmdChangelog(FXObject*, FXSelector, void*) {
958 // update in every version
959 MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/ChangeLog.html");
960 return 1;
961}
962
963
964long
965GUIApplicationWindow::onCmdHotkeys(FXObject*, FXSelector, void*) {
966 MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/sumo-gui.html#keyboard_shortcuts");
967 return 1;
968}
969
970
971long
972GUIApplicationWindow::onCmdTutorial(FXObject*, FXSelector, void*) {
973 MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/Tutorials/index.html");
974 return 1;
975}
976
977
978long
979GUIApplicationWindow::onCmdOpenInNetedit(FXObject* sender, FXSelector, void* ptr) {
980 if (myGLWindows.empty()) {
981 return 1;
982 }
983 bool onlyNet;
984 if (sender == myOpenNetInNetedit) {
985 onlyNet = true;
986 } else if (sender == myOpenInNetedit) {
987 onlyNet = false;
988 } else {
989 // we have to check (menu-item) sender first because ptr is only valid when
990 // triggered via hotkey
991 FXEvent* e = (FXEvent*) ptr;
992 onlyNet = (e->state & SHIFTMASK) != 0;
993 }
994 FXRegistry reg("SUMO netedit", "netedit");
995 reg.read();
996 const GUISUMOAbstractView* const v = myGLWindows[0]->getView();
997 reg.writeRealEntry("viewport", "x", v->getChanger().getXPos());
998 reg.writeRealEntry("viewport", "y", v->getChanger().getYPos());
999 reg.writeRealEntry("viewport", "z", v->getChanger().getZPos());
1000 reg.write();
1001 std::string netedit = "netedit";
1002 const char* sumoPath = getenv("SUMO_HOME");
1003 if (sumoPath != nullptr) {
1004 std::string newPath = std::string(sumoPath) + "/bin/netedit";
1005 if (FileHelpers::isReadable(newPath) || FileHelpers::isReadable(newPath + ".exe")) {
1006 netedit = "\"" + newPath + "\"";
1007 }
1008 }
1009 // declare command for calling netedit using the viewport saved in registry
1010 std::string cmd = netedit + " --registry-viewport";
1011 // continue depending if we're loading only a network or the entire sumo config
1012 if (myLoadAdditionalsInNetedit->shown() && !onlyNet) {
1013 cmd += " --sumocfg-file \"" + OptionsCont::getOptions().getString("configuration-file") + "\"";
1014 // check if ignore additional or demand elements
1015 if (myLoadAdditionalsInNetedit->getCheck() == FALSE) {
1016 cmd += " --ignore.additionalelements";
1017 }
1018 if (myLoadDemandInNetedit->getCheck() == FALSE) {
1019 cmd += " --ignore.routeelements";
1020 }
1021 } else {
1022 cmd += " -s \"" + OptionsCont::getOptions().getString("net-file") + "\"";
1023 }
1024 // start in background
1025#ifndef WIN32
1026 cmd = cmd + " &";
1027#else
1028 // see "help start" for the parameters
1029 cmd = "start /B \"\" " + cmd;
1030#endif
1031 WRITE_MESSAGEF(TL("Running %."), cmd);
1032 // yay! fun with dangerous commands... Never use this over the internet
1034 return 1;
1035}
1036
1037
1038long
1039GUIApplicationWindow::onCmdNewWindow(FXObject*, FXSelector, void*) {
1040 FXRegistry reg("SUMO sumo-gui", "sumo-gui");
1041 std::string sumo_gui = "sumo-gui";
1042 const char* sumoPath = getenv("SUMO_HOME");
1043 if (sumoPath != nullptr) {
1044 std::string newPath = std::string(sumoPath) + "/bin/sumo_gui";
1045 if (FileHelpers::isReadable(newPath) || FileHelpers::isReadable(newPath + ".exe")) {
1046 sumo_gui = "\"" + newPath + "\"";
1047 }
1048 }
1049 std::string cmd = sumo_gui;
1050 // start in background
1051#ifndef WIN32
1052 cmd = cmd + " &";
1053#else
1054 // see "help start" for the parameters
1055 cmd = "start /B \"\" " + cmd;
1056#endif
1057 WRITE_MESSAGEF(TL("Running %."), cmd);
1058 // yay! fun with dangerous commands... Never use this over the internet
1060 return 1;
1061}
1062
1063
1064long
1066 // get the new file name
1067 FXFileDialog opendialog(this, TL("Open Simulation Configuration"));
1069 opendialog.setSelectMode(SELECTFILE_EXISTING);
1070 opendialog.setPatternList(SUMOXMLDefinitions::SumoConfigFileExtensions.getMultilineString().c_str());
1071 if (gCurrentFolder.length() != 0) {
1072 opendialog.setDirectory(gCurrentFolder);
1073 }
1074 if (opendialog.execute()) {
1075 gCurrentFolder = opendialog.getDirectory();
1076 std::string file = opendialog.getFilename().text();
1077 loadConfigOrNet(file);
1078 myRecentConfigs.appendFile(file.c_str());
1079 }
1080 return 1;
1081}
1082
1083
1084long
1085GUIApplicationWindow::onCmdOpenNetwork(FXObject*, FXSelector, void*) {
1086 // get the new file name
1087 FXFileDialog opendialog(this, TL("Open Network"));
1088 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
1089 opendialog.setSelectMode(SELECTFILE_EXISTING);
1090 opendialog.setPatternList(SUMOXMLDefinitions::NetFileExtensions.getMultilineString().c_str());
1091 if (gCurrentFolder.length() != 0) {
1092 opendialog.setDirectory(gCurrentFolder);
1093 }
1094 if (opendialog.execute()) {
1095 gCurrentFolder = opendialog.getDirectory();
1096 std::string file = opendialog.getFilename().text();
1097 loadConfigOrNet(file);
1098 myRecentNetworks.appendFile(file.c_str());
1099 }
1100 return 1;
1101}
1102
1103
1104long
1105GUIApplicationWindow::onCmdOpenShapes(FXObject*, FXSelector, void*) {
1106 // get the shape file name
1107 FXFileDialog opendialog(this, TL("Open Shapes"));
1108 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_SHAPES));
1109 opendialog.setSelectMode(SELECTFILE_EXISTING);
1110 opendialog.setPatternList(SUMOXMLDefinitions::ShapesFileExtensions.getMultilineString().c_str());
1111 if (gCurrentFolder.length() != 0) {
1112 opendialog.setDirectory(gCurrentFolder);
1113 }
1114 if (opendialog.execute()) {
1115 gCurrentFolder = opendialog.getDirectory();
1116 std::string file = opendialog.getFilename().text();
1117
1118 dynamic_cast<GUIShapeContainer&>(myRunThread->getNet().getShapeContainer()).allowReplacement();
1120 if (!XMLSubSys::runParser(handler, file, false)) {
1121 WRITE_MESSAGEF(TL("Loading of % failed."), file);
1122 }
1123 update();
1124 if (myMDIClient->numChildren() > 0) {
1125 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1126 if (w != nullptr) {
1127 w->getView()->update();
1128 }
1129 }
1130 }
1131 return 1;
1132}
1133
1134
1135long
1136GUIApplicationWindow::onCmdOpenEdgeData(FXObject*, FXSelector, void*) {
1137 // get the shape file name
1138 FXFileDialog opendialog(this, TL("Open EdgeData"));
1139 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
1140 opendialog.setSelectMode(SELECTFILE_EXISTING);
1141 opendialog.setPatternList(SUMOXMLDefinitions::EdgeDataFileExtensions.getMultilineString().c_str());
1142 if (gCurrentFolder.length() != 0) {
1143 opendialog.setDirectory(gCurrentFolder);
1144 }
1145 if (opendialog.execute()) {
1146 gCurrentFolder = opendialog.getDirectory();
1147 std::string file = opendialog.getFilename().text();
1148 if (!GUINet::getGUIInstance()->loadEdgeData(file)) {
1149 WRITE_MESSAGEF(TL("Loading of % failed."), file);
1150 }
1151 update();
1152 if (myMDIClient->numChildren() > 0) {
1153 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1154 if (w != nullptr) {
1155 w->getView()->update();
1156 }
1157 }
1158 }
1159 return 1;
1160}
1161
1162
1163long
1164GUIApplicationWindow::onCmdReload(FXObject* sender, FXSelector sel, void*) {
1165 if (!myAmLoading && (sender == nullptr || TraCIServer::getInstance() == nullptr)) {
1167 getApp()->beginWaitCursor();
1168 myAmLoading = true;
1169 myIsReload = sender != nullptr || sel == 1;
1171 myLoadThread->start();
1172 if (sender == nullptr) {
1173 setStatusBarText(sel == 1 ? TL("Auto-Reloading.") : TL("TraCI-Loading."));
1174 } else {
1175 setStatusBarText(TL("Reloading."));
1176 }
1177 update();
1178 }
1179 return 1;
1180}
1181
1182
1183long
1184GUIApplicationWindow::onCmdQuickReload(FXObject*, FXSelector, void*) {
1185 if (!myAmLoading) {
1186 setStatusBarText(TL("Quick-Reloading."));
1188 }
1189 return 1;
1190}
1191
1192
1193long
1194GUIApplicationWindow::onCmdOpenRecent(FXObject* /* sender */, FXSelector, void* ptr) {
1195 if (myAmLoading) {
1196 myStatusbar->getStatusLine()->setText(TL("Already loading!"));
1197 return 1;
1198 }
1199 std::string file((const char*)ptr);
1200 loadConfigOrNet(file);
1201 return 1;
1202}
1203
1204
1205long
1206GUIApplicationWindow::onCmdSaveConfig(FXObject*, FXSelector, void*) {
1207 // get the new file name
1208 FXFileDialog opendialog(this, TL("Save SUMO Configuration"));
1209 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SAVE));
1210 opendialog.setSelectMode(SELECTFILE_ANY);
1211 opendialog.setPatternList(SUMOXMLDefinitions::SumoConfigFileExtensions.getMultilineString().c_str());
1212 if (gCurrentFolder.length() != 0) {
1213 opendialog.setDirectory(gCurrentFolder);
1214 }
1215 if (!opendialog.execute() || !MFXUtils::userPermitsOverwritingWhenFileExists(this, opendialog.getFilename())) {
1216 return 1;
1217 }
1218 const std::string file = MFXUtils::assureExtension(opendialog).text();
1219 std::ofstream out(StringUtils::transcodeToLocal(file));
1220 if (out.good()) {
1221 OptionsCont::getOptions().writeConfiguration(out, true, false, false, file, true);
1222 setStatusBarText(TLF("Configuration saved to %.", file));
1223 } else {
1224 setStatusBarText(TLF("Could not save configuration to %.", file));
1225 }
1226 out.close();
1227 return 1;
1228}
1229
1230
1231long
1232GUIApplicationWindow::onCmdClose(FXObject*, FXSelector, void*) {
1234 return 1;
1235}
1236
1237
1238long
1239GUIApplicationWindow::onUpdOpen(FXObject* sender, FXSelector, void* ptr) {
1240 sender->handle(this,
1241 myAmLoading ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1242 ptr);
1243 return 1;
1244}
1245
1246
1247long
1248GUIApplicationWindow::onUpdReload(FXObject* sender, FXSelector, void* ptr) {
1249 sender->handle(this,
1251 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1252 ptr);
1253 return 1;
1254}
1255
1256
1257long
1258GUIApplicationWindow::onUpdOpenRecent(FXObject* sender, FXSelector, void* ptr) {
1259 sender->handle(this,
1260 myAmLoading ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1261 ptr);
1262 return 1;
1263}
1264
1265
1266long
1267GUIApplicationWindow::onUpdAddView(FXObject* sender, FXSelector, void* ptr) {
1268 sender->handle(this,
1270 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1271 ptr);
1272 return 1;
1273}
1274
1275
1276long
1277GUIApplicationWindow::onCmdStart(FXObject*, FXSelector, void*) {
1278 // check whether a net was loaded successfully
1279 if (!myRunThread->networkAvailable()) {
1280 myStatusbar->getStatusLine()->setText(TL("No simulation loaded!"));
1281 return 1;
1282 }
1283 // check whether it was started before and paused;
1284 if (!myWasStarted) {
1285 myRunThread->begin();
1286 myWasStarted = true;
1287 }
1289 getApp()->forceRefresh(); // only calling myToolBar2->forceRefresh somehow looses keyboard focus
1290 return 1;
1291}
1292
1293
1294long
1295GUIApplicationWindow::onCmdStop(FXObject*, FXSelector, void*) {
1296 myRunThread->stop();
1297 getApp()->forceRefresh(); // only calling myToolBar2->forceRefresh somehow looses keyboard focus
1298 return 1;
1299}
1300
1301
1302long
1303GUIApplicationWindow::onCmdStep(FXObject*, FXSelector, void*) {
1304 // check whether a net was loaded successfully
1305 if (!myRunThread->networkAvailable()) {
1306 myStatusbar->getStatusLine()->setText(TL("No simulation loaded!"));
1307 return 1;
1308 }
1309 // check whether it was started before and paused;
1310 if (!myWasStarted) {
1311 myRunThread->begin();
1312 myWasStarted = true;
1313 }
1315 return 1;
1316}
1317
1318
1319long
1320GUIApplicationWindow::onCmdSaveState(FXObject*, FXSelector, void*) {
1321 // get the new file name
1322 FXFileDialog opendialog(this, TL("Save Simulation State"));
1323 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SAVE));
1324 opendialog.setSelectMode(SELECTFILE_ANY);
1325 opendialog.setPatternList(SUMOXMLDefinitions::StateFileExtensions.getMultilineString().c_str());
1326 if (gCurrentFolder.length() != 0) {
1327 opendialog.setDirectory(gCurrentFolder);
1328 }
1329 if (!opendialog.execute() || !MFXUtils::userPermitsOverwritingWhenFileExists(this, opendialog.getFilename())) {
1330 return 1;
1331 }
1332 const std::string file = MFXUtils::assureExtension(opendialog).text();
1333 MSStateHandler::saveState(file, MSNet::getInstance()->getCurrentTimeStep(), false);
1334 setStatusBarText(TLF("Simulation state saved to '%'.", file));
1335 return 1;
1336}
1337
1338
1339long
1340GUIApplicationWindow::onCmdLoadState(FXObject*, FXSelector, void*) {
1341 // get the new file name
1342 FXFileDialog opendialog(this, TL("Load Simulation State"));
1343 opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN));
1344 opendialog.setSelectMode(SELECTFILE_ANY);
1345 opendialog.setPatternList(SUMOXMLDefinitions::StateFileExtensions.getMultilineString().c_str());
1346 if (gCurrentFolder.length() != 0) {
1347 opendialog.setDirectory(gCurrentFolder);
1348 }
1349 if (opendialog.execute() && FXStat::exists(opendialog.getFilename())) {
1350 gCurrentFolder = opendialog.getDirectory();
1351 const std::string file = opendialog.getFilename().text();
1352 try {
1353 MSNet::getInstance()->loadState(file, true);
1354 setStatusBarText(TLF("State loaded from '%'.", file));
1355 } catch (ProcessError& e) {
1356 setStatusBarText(TLF("Failed to load state from '%' (%).", file, e.what()));
1357 }
1358 }
1359 return 1;
1360}
1361
1362
1363long
1364GUIApplicationWindow::onCmdTimeToggle(FXObject*, FXSelector, void*) {
1365 // toggle show time as HMS
1370 }
1371 return 1;
1372}
1373
1374
1375long
1376GUIApplicationWindow::onCmdDelayInc(FXObject*, FXSelector, void*) {
1377 if (mySimDelay < 10) {
1378 mySimDelay = 10;
1379 } else if (mySimDelay >= 20 && mySimDelay < 50) {
1380 mySimDelay = 50;
1381 } else if (mySimDelay >= 200 && mySimDelay < 500) {
1382 mySimDelay = 500;
1383 } else {
1384 mySimDelay *= 2;
1385 }
1386 if (mySimDelay > 1000) {
1387 // setting high delay by pressing the key too often is hard to recover from
1388 mySimDelay = 1000;
1389 }
1390 mySimDelaySlider->setValue((int)mySimDelay);
1391 mySimDelaySpinner->setValue(mySimDelay);
1392 return 1;
1393}
1394
1395
1396long
1397GUIApplicationWindow::onCmdDelayDec(FXObject*, FXSelector, void*) {
1398 if (mySimDelay <= 10) {
1399 mySimDelay = 0;
1400 } else if (mySimDelay > 20 && mySimDelay <= 50) {
1401 mySimDelay = 20;
1402 } else if (mySimDelay > 200 && mySimDelay <= 500) {
1403 mySimDelay = 200;
1404 } else {
1405 mySimDelay /= 2;
1406 }
1407 mySimDelaySlider->setValue((int)mySimDelay);
1408 mySimDelaySpinner->setValue(mySimDelay);
1409 return 1;
1410}
1411
1412
1413long
1414GUIApplicationWindow::onCmdDelayToggle(FXObject*, FXSelector, void*) {
1415 const double tmp = myAlternateSimDelay;
1417 mySimDelay = tmp;
1418 return 1;
1419}
1420
1421
1422long
1423GUIApplicationWindow::onCmdDemandScale(FXObject*, FXSelector, void*) {
1426 }
1427 return 1;
1428}
1429
1430
1431long
1432GUIApplicationWindow::onCmdClearMsgWindow(FXObject*, FXSelector, void*) {
1434 return 1;
1435}
1436
1437
1438long
1439GUIApplicationWindow::onCmdBreakpoint(FXObject*, FXSelector, void*) {
1440 // see updateTimeLCD for the DELTA_T
1443 }
1444 return 1;
1445}
1446
1447
1448long
1449GUIApplicationWindow::onCmdBreakpointEarly(FXObject*, FXSelector, void*) {
1450 // see updateTimeLCD for the DELTA_T
1453 }
1454 return 1;
1455}
1456
1457
1458long
1459GUIApplicationWindow::onUpdStart(FXObject* sender, FXSelector, void* ptr) {
1460 sender->handle(this,
1462 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1463 ptr);
1465 // bind start simulation with space key
1467 }
1468 return 1;
1469}
1470
1471
1472long
1473GUIApplicationWindow::onUpdStop(FXObject* sender, FXSelector, void* ptr) {
1474 sender->handle(this,
1476 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1477 ptr);
1479 // bind stop simulation with space key
1481 }
1482 return 1;
1483}
1484
1485
1486long
1487GUIApplicationWindow::onUpdStep(FXObject* sender, FXSelector, void* ptr) {
1488 sender->handle(this,
1490 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1491 ptr);
1492 return 1;
1493}
1494
1495
1496long
1497GUIApplicationWindow::onUpdNeedsNetwork(FXObject* sender, FXSelector, void* ptr) {
1498 // check if there is a loaded network and gui isn't loading
1500 sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), ptr);
1501 // enable certain elements manually
1502 mySelectLanesMenuCascade->enable();
1503 myScaleTrafficTooltip->setTipText(TL("Scale number of vehicles in simulation"));
1504 } else {
1505 sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
1506 // disable certain elements manually
1507 mySelectLanesMenuCascade->disable();
1508 myScaleTrafficTooltip->setTipText("");
1509 }
1510 return 1;
1511}
1512
1513
1514long
1515GUIApplicationWindow::onUpdNeedsSumoConfig(FXObject* sender, FXSelector, void* ptr) {
1516 // check if there is a loaded network and gui isn't loading
1517 if (myRunThread->networkAvailable() && !myAmLoading && OptionsCont::getOptions().isSet("configuration-file")) {
1518 sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), ptr);
1519 sender->handle(this, FXSEL(SEL_COMMAND, ID_SHOW), ptr);
1520 myOpenInNetedit->setText(TL("Open sumo config in netedit"));
1521 } else {
1522 sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), ptr);
1523 sender->handle(this, FXSEL(SEL_COMMAND, ID_HIDE), ptr);
1524 myOpenInNetedit->setText(TL("Open network in netedit"));
1525 }
1526 return 1;
1527}
1528
1529
1530long
1531GUIApplicationWindow::onUpdTraCIStatus(FXObject* /*sender*/, FXSelector, void* /*ptr*/) {
1533 myTraCiFrame->show();
1534 } else {
1535 myTraCiFrame->hide();
1536 }
1537 return 1;
1538}
1539
1540
1541long
1542GUIApplicationWindow::onCmdLocate(FXObject*, FXSelector sel, void*) {
1543 if (myMDIClient->numChildren() > 0) {
1544 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1545 if (w != nullptr) {
1546 w->onCmdLocate(nullptr, sel, nullptr);
1547 }
1548 }
1549 return 1;
1550}
1551
1552
1553long
1554GUIApplicationWindow::onCmdShowStats(FXObject*, FXSelector, void*) {
1555 if (myMDIClient->numChildren() > 0) {
1556 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1558 }
1559 return 1;
1560}
1561
1562
1563long
1564GUIApplicationWindow::onCmdAppSettings(FXObject*, FXSelector, void*) {
1566 d->create();
1567 d->show(PLACEMENT_OWNER);
1568 return 1;
1569}
1570
1571
1572long
1573GUIApplicationWindow::onCmdGaming(FXObject*, FXSelector, void*) {
1574 if (myGLWindows.empty()) {
1575 return 1;
1576 }
1578 myGLWindows[0]->getView()->editVisualisationSettings()->gaming = myAmGaming;
1579 if (myAmGaming) {
1580 myGamingModeCheckbox->setCheck(TRUE);
1581 myMenuBar->hide();
1582 myStatusbar->hide();
1583 myToolBar1->hide();
1584 myToolBar2->hide();
1585 myToolBar4->hide();
1586 myToolBar5->hide();
1587 myToolBar6->show();
1588 myToolBar8->hide();
1589 myToolBar10->show();
1590 if (myTLSGame) {
1591 myToolBar7->show();
1592 } else {
1593 myToolBar9->show();
1594 }
1595 myMessageWindow->hide();
1601 } else {
1602 myGamingModeCheckbox->setCheck(FALSE);
1603 myMenuBar->show();
1604 myStatusbar->show();
1605 myToolBar1->show();
1606 myToolBar2->show();
1607 myToolBar4->show();
1608 myToolBar5->show();
1609 myToolBar6->hide();
1610 myToolBar7->hide();
1611 myToolBar8->show();
1612 myToolBar9->hide();
1613 myToolBar10->hide();
1614 myMessageWindow->show();
1616 }
1617 if (myMDIClient->numChildren() > 0) {
1618 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1619 if (w != nullptr) {
1621 }
1622 }
1623 update();
1624 return 1;
1625}
1626
1627
1628long
1630 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1631 if (w != nullptr) {
1632 // show or hide grid depending of myNetworkViewOptions.menuCheckToggleGrid
1635 } else {
1637 }
1638 w->getView()->update();
1639 }
1640 return 1;
1641}
1642
1643
1644long
1646 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1647 if (w != nullptr) {
1648 // toggle secondary shape visualization
1650 w->getView()->update();
1651 }
1652 return 1;
1653}
1654
1655
1656long
1657GUIApplicationWindow::onCmdFullScreen(FXObject*, FXSelector, void*) {
1658 if (myGLWindows.empty()) {
1659 return 1;
1660 }
1662 if (myAmFullScreen) {
1663 getApp()->reg().writeIntEntry("SETTINGS", "x", getX());
1664 getApp()->reg().writeIntEntry("SETTINGS", "y", getY());
1665 getApp()->reg().writeIntEntry("SETTINGS", "width", getWidth());
1666 getApp()->reg().writeIntEntry("SETTINGS", "height", getHeight());
1667 maximize();
1668 setDecorations(DECOR_NONE);
1669 place(PLACEMENT_MAXIMIZED);
1670 myMenuBar->hide();
1671 myStatusbar->hide();
1672 myToolBar1->hide();
1673 myToolBar2->hide();
1674 myToolBar3->hide();
1675 myToolBar4->hide();
1676 myToolBar5->hide();
1677 myToolBar6->hide();
1678 myToolBar7->hide();
1679 myToolBar8->hide();
1680 myMessageWindow->hide();
1681 if (myMDIClient->numChildren() > 0) {
1682 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
1683 if (w != nullptr) {
1684 w->setToolBarVisibility(false);
1685 }
1686 }
1687 update();
1688 } else {
1689 place(PLACEMENT_VISIBLE);
1690 setDecorations(DECOR_ALL);
1691 restore();
1692 myToolBar3->show();
1694 onCmdGaming(nullptr, 0, nullptr);
1695 setWidth(getApp()->reg().readIntEntry("SETTINGS", "width", 600));
1696 setHeight(getApp()->reg().readIntEntry("SETTINGS", "height", 400));
1697 setX(getApp()->reg().readIntEntry("SETTINGS", "x", 150));
1698 setY(getApp()->reg().readIntEntry("SETTINGS", "y", 150));
1699 }
1700 return 1;
1701}
1702
1703
1704long
1705GUIApplicationWindow::onCmdListInternal(FXObject*, FXSelector, void*) {
1707 return 1;
1708}
1709
1710
1711long
1712GUIApplicationWindow::onCmdListParking(FXObject*, FXSelector, void*) {
1714 return 1;
1715}
1716
1717long
1718GUIApplicationWindow::onCmdListTeleporting(FXObject*, FXSelector, void*) {
1720 return 1;
1721}
1722
1723
1724long
1725GUIApplicationWindow::onCmdNewView(FXObject*, FXSelector, void*) {
1727 return 1;
1728}
1729
1730
1731#ifdef HAVE_OSG
1732long
1733GUIApplicationWindow::onCmdNewOSG(FXObject*, FXSelector, void*) {
1735 return 1;
1736}
1737#endif
1738
1739
1740long
1741GUIApplicationWindow::onCmdFeedback(FXObject*, FXSelector, void*) {
1742 // create and open feedback dialog
1743 GUIDialog_Feedback* feedback = new GUIDialog_Feedback(this);
1744 feedback->create();
1745 feedback->show(PLACEMENT_OWNER);
1746 return 1;
1747}
1748
1749
1750long
1751GUIApplicationWindow::onCmdAbout(FXObject*, FXSelector, void*) {
1752 GUIDialog_AboutSUMO* about = new GUIDialog_AboutSUMO(this);
1753 about->create();
1754 about->show(PLACEMENT_OWNER);
1755 return 1;
1756}
1757
1758
1759long
1760GUIApplicationWindow::onCmdHallOfFame(FXObject*, FXSelector, void*) {
1762 hall->create();
1763 hall->show(PLACEMENT_OWNER);
1764 return 1;
1765}
1766
1767
1768long GUIApplicationWindow::onClipboardRequest(FXObject* /* sender */, FXSelector /* sel */, void* ptr) {
1769 FXEvent* event = (FXEvent*)ptr;
1770 FXString string = GUIUserIO::clipped.c_str();
1771 setDNDData(FROM_CLIPBOARD, event->target, string);
1772 return 1;
1773}
1774
1775
1776long
1777GUIApplicationWindow::onLoadThreadEvent(FXObject*, FXSelector, void*) {
1778 eventOccurred();
1779 return 1;
1780}
1781
1782
1783long
1784GUIApplicationWindow::onRunThreadEvent(FXObject*, FXSelector, void*) {
1785 eventOccurred();
1786 return 1;
1787}
1788
1789
1790void
1792 while (!myEvents.empty()) {
1793 // get the next event
1794 GUIEvent* e = myEvents.top();
1795 myEvents.pop();
1796 // process
1797 switch (e->getOwnType()) {
1800 setFocus();
1801 break;
1803 if (myRunThread->networkAvailable()) { // avoid race-condition related crash if reload was pressed
1805 }
1806 break;
1814 break;
1816 GUIEvent_AddView* ave = dynamic_cast<GUIEvent_AddView*>(e);
1818 if (ave->getSchemeName() != "") {
1819 MFXComboBoxIcon* sCombo = v->getColoringSchemesCombo();
1820 int index = sCombo->findItem(ave->getSchemeName().c_str());
1821 if (index >= 0) {
1822 sCombo->setCurrentItem(index);
1823 }
1824 v->setColorScheme(ave->getSchemeName());
1825 }
1826 break;
1827 }
1829 GUIEvent_CloseView* ave = dynamic_cast<GUIEvent_CloseView*>(e);
1830 removeViewByID(ave->getCaption());
1831 break;
1832 }
1835 break;
1836 default:
1837 break;
1838 }
1839 delete e;
1840 }
1841 myToolBar2->forceRefresh();
1842 myToolBar3->forceRefresh();
1843}
1844
1845
1846void
1848 myAmLoading = false;
1850 // check whether the loading was successful
1851 if (ec->myNet == nullptr) {
1852 // report failure
1853 setStatusBarText(TLF("Loading of '%' failed!", ec->myFile));
1856 getApp()->exit(1);
1857 }
1858 } else {
1859 // initialise simulation thread
1860 if (!myRunThread->init(ec->myNet, ec->myBegin, ec->myEnd)) {
1863 getApp()->exit(1);
1864 }
1865 } else {
1866 // report success
1867 setStatusBarText(TLF("'%' loaded.", ec->myFile));
1869 myWasStarted = false;
1871 // initialise views
1872 myViewNumber = 0;
1874 // check/record settings file modification time
1875 long long mTime = myGuiSettingsFileMTime;
1876 if (ec->mySettingsFiles.size() > 0) {
1877 for (std::string fname : ec->mySettingsFiles) {
1878 mTime = MAX2(mTime, SysUtils::getModifiedTime(fname));
1879 }
1880 }
1881 // always reload if settings were modified or to restore multiple views
1882 if (!myIsReload) {
1884 }
1885 if (ec->mySettingsFiles.size() > 0 && (!myIsReload || myGuiSettingsFileMTime < mTime || ec->mySettingsFiles.size() > 1)) {
1886 // open a view for each file and apply settings
1887 for (std::string fname : ec->mySettingsFiles) {
1888 GUISettingsHandler settings(fname);
1889 GUISUMOViewParent::ViewType vt = defaultType;
1890 if (settings.getViewType() == "osg" || settings.getViewType() == "3d") {
1892 }
1893 if (settings.getViewType() == "opengl" || settings.getViewType() == "2d") {
1895 }
1896 GUISUMOAbstractView* view = openNewView(vt);
1897 if (view == nullptr) {
1898 break;
1899 }
1900 if (settings.getSettingName() != "") {
1901 view->setColorScheme(settings.getSettingName());
1902 MFXComboBoxIcon* sCombo = view->getColoringSchemesCombo();
1903 int index = sCombo->findItem(settings.getSettingName().c_str());
1904 if (index >= 0) {
1905 sCombo->setCurrentItem(index);
1906 }
1907 }
1908 view->addDecals(settings.getDecals());
1909 settings.applyViewport(view);
1910 settings.setSnapshots(view);
1911 if (settings.getDelay() > 0.) {
1912 mySimDelay = settings.getDelay();
1913 }
1914 if (settings.getBreakpoints().size() > 0) {
1916 myRunThread->getBreakpoints().assign(settings.getBreakpoints().begin(), settings.getBreakpoints().end());
1917 myRunThread->getBreakpointLock().unlock();
1918 }
1919 myJamSounds = settings.getEventDistribution("jam");
1920 myCollisionSounds = settings.getEventDistribution("collision");
1921 if (settings.getJamSoundTime() > 0) {
1922 myJamSoundTime = settings.getJamSoundTime();
1923 }
1924 for (const std::string& tlsID : settings.getTrackers()) {
1925 if (MSNet::getInstance()->getTLSControl().knows(tlsID)) {
1928 if (tllW) {
1929 tllW->begin2TrackPhases(this);
1930 }
1931 } else {
1932 WRITE_WARNINGF("Tracker for unknown tlLogic '%' in settings file '%'", tlsID, fname);
1933 }
1934 }
1935 }
1936 } else {
1937 openNewView(defaultType);
1938 }
1939 myGuiSettingsFileMTime = mTime;
1940 if (!OptionsCont::getOptions().isDefault("delay")) {
1941 setDelay(OptionsCont::getOptions().getFloat("delay"));
1942 mySimDelaySlider->setValue((int)mySimDelay);
1943 mySimDelaySpinner->setValue(mySimDelay);
1944 }
1945 if (!OptionsCont::getOptions().isDefault("breakpoints") && !myIsReload) {
1946 std::vector<SUMOTime> breakpoints;
1947 for (const std::string& val : OptionsCont::getOptions().getStringVector("breakpoints")) {
1948 SUMOTime t = string2time(val);
1949 // round down to nearest reachable time step
1950 t -= t % DELTA_T;
1951 breakpoints.push_back(t);
1952 }
1953 std::sort(breakpoints.begin(), breakpoints.end());
1955 myRunThread->getBreakpoints().assign(breakpoints.begin(), breakpoints.end());
1956 myRunThread->getBreakpointLock().unlock();
1957 }
1958 if (!OptionsCont::getOptions().isDefault("selection-file")) {
1959 delete myDynamicSelection;
1960 myDynamicSelection = new std::stringstream();
1961 std::string msg = gSelected.load(OptionsCont::getOptions().getString("selection-file"), GLO_MAX, myDynamicSelection);
1962 if (msg != "") {
1963 WRITE_ERRORF("Errors while loading selection: %", msg.c_str());
1964 }
1965 if (!myDynamicSelection->str().empty()) {
1966 std::string dummy;
1967 int numNotFound = 0;
1968 while (myDynamicSelection->good()) {
1969 (*myDynamicSelection) >> dummy;
1970 numNotFound++;
1971 }
1972 myDynamicSelection->clear(); // first clear error state before seek works
1973 myDynamicSelection->seekg(0);
1974 // @note for some reason the last line is read twice
1975 WRITE_MESSAGEF("% dynamic objects not present while loading selection", numNotFound - 1);
1976 }
1977 }
1978 myTLSGame = OptionsCont::getOptions().getString("game.mode") == "tls";
1979 if (OptionsCont::getOptions().getBool("game")) {
1980 if (myTLSGame) {
1981 setTitle(TL("SUMO Interactive Traffic Light"));
1982 } else {
1983 setTitle(TL("SUMO Interactive Demand-Responsive-Transport"));
1984 }
1985 onCmdGaming(nullptr, 0, nullptr);
1986 } else {
1987 // set simulation name on the caption
1988 setTitle(MFXUtils::getTitleText("SUMO " VERSION_STRING, ec->myFile.c_str()));
1989 }
1990 if (ec->myViewportFromRegistry) {
1991 Position off;
1992 off.set(getApp()->reg().readRealEntry("viewport", "x"),
1993 getApp()->reg().readRealEntry("viewport", "y"),
1994 getApp()->reg().readRealEntry("viewport", "z"));
1995 Position p(off.x(), off.y(), 0);
1996 GUISUMOAbstractView* view = myGLWindows[0]->getView();
1997 view->setViewportFromToRot(off, p, 0);
1998 }
1999 // set simulation step begin information
2000 myLCDLabel->setText("----------------");
2001 for (std::vector<FXButton*>::const_iterator it = myStatButtons.begin(); it != myStatButtons.end(); ++it) {
2002 (*it)->setText("-");
2003 }
2004 // initialize scale from options unless already set in the UI
2005 if (myDemandScaleSpinner->getValue() == 1 || !OptionsCont::getOptions().isDefault("scale")) {
2007 }
2009 }
2010 }
2011 getApp()->endWaitCursor();
2012 // start if wished
2014 onCmdStart(nullptr, 0, nullptr);
2015 }
2016 update();
2017}
2018
2019
2020void
2022#ifdef WIN32
2023 long t = SysUtils::getCurrentMillis();
2024 // only skip if the simulation is running
2025 if (t - myLastStepEventMillis < MIN_DRAW_DELAY && myRunThread->simulationIsStopable()) {
2026 // do not try to redraw with more than 50FPS (#6371)
2027 return;
2028 }
2030#endif
2032 const int running = myRunThread->getNet().getVehicleControl().getRunningVehicleNo();
2033 const int backlog = myRunThread->getNet().getInsertionControl().getWaitingVehicleNo();
2034 if (backlog > running) {
2035 if (myStatButtons.front()->getIcon() == GUIIconSubSys::getIcon(GUIIcon::GREENVEHICLE)) {
2037 }
2038 } else {
2039 if (myStatButtons.front()->getIcon() == GUIIconSubSys::getIcon(GUIIcon::YELLOWVEHICLE)) {
2041 }
2042 }
2043 myStatButtons.front()->setText(toString(running).c_str());
2044 if (myRunThread->getNet().hasPersons()) {
2045 if (!myStatButtons[1]->shown()) {
2046 myStatButtons[1]->show();
2047 }
2049 }
2050 if (myRunThread->getNet().hasContainers()) {
2051 if (!myStatButtons[2]->shown()) {
2052 myStatButtons[2]->show();
2053 }
2055 }
2056 if (myAmGaming) {
2057 if (myTLSGame) {
2059 } else {
2061 }
2062 }
2064 getApp()->forceRefresh(); // restores keyboard focus
2065 }
2066 // try to load dynamic selection
2067 if (myDynamicSelection != nullptr) {
2068 std::stringstream tmp;
2070 if (tmp.str().empty()) {
2071 delete myDynamicSelection;
2072 myDynamicSelection = nullptr;
2073 } else {
2074 myDynamicSelection->str(tmp.str());
2075 myDynamicSelection->clear(); // first clear error state before seek works
2076 myDynamicSelection->seekg(0);
2077 }
2078 }
2080 update();
2081}
2082
2083
2084void
2086 GUIEvent_Message* ec = static_cast<GUIEvent_Message*>(e);
2088 setStatusBarText(ec->getMsg());
2089 } else {
2091 }
2092}
2093
2094
2095void
2098 onCmdStop(nullptr, 0, nullptr);
2099 if (ec->getReason() == MSNet::SIMSTATE_LOADING) {
2100 onCmdReload(nullptr, 0, nullptr);
2101 } else if (GUIGlobals::gQuitOnEnd) {
2103 getApp()->exit(ec->getReason() == MSNet::SIMSTATE_ERROR_IN_SIM);
2104 } else if (GUIGlobals::gDemoAutoReload) {
2105 onCmdReload(nullptr, 1, nullptr);
2106 } else if (!myHaveNotifiedAboutSimEnd) {
2107 // GUIRunThread::deleteSim() triggers the final message to the log file
2108 // (this will never reach the GUI but we cannot use WRITE_MESSAGE here
2109 // to avoid a duplicate log entry)
2111 TLF("Simulation ended at time: %. (%)",
2113 // build the text
2114 const std::string text = TLF("Simulation ended at time: %.", time2string(ec->getTimeStep())) + "\n" +
2115 TL("Reason:") + MSNet::getStateMessage(ec->getReason()) + "\n" +
2116 TL("Do you want to close all open files and views?");
2117 FXuint answer = FXMessageBox::question(this, MBOX_YES_NO, TL("Simulation ended"), "%s", text.c_str());
2118 if (answer == 1) { //1:yes, 2:no, 4:esc
2120 } else {
2123 update();
2124 }
2126 }
2127}
2128
2129
2130void
2135#ifdef HAVE_DANGEROUS_SOUNDS // disable user-configurable command execution for public build
2136 if (myJamSounds.getOverallProb() > 0) {
2137 // play honking sound if some vehicle is waiting too long
2138 for (; it != end; ++it) {
2139 // XXX use impatience instead of waiting time ?
2140 if (it->second->getWaitingTime() > TIME2STEPS(myJamSoundTime)) {
2141 const std::string cmd = myJamSounds.get(&myGamingRNG);
2142 if (cmd != "") {
2143 // yay! fun with dangerous commands... Never use this over the internet
2145 // one sound per simulation step is enough
2146 break;
2147 }
2148 }
2149 }
2150 }
2153 if (myPreviousCollisionNumber != collisions) {
2154 const std::string cmd = myCollisionSounds.get(&myGamingRNG);
2155 if (cmd != "") {
2156 // yay! fun with dangerous commands... Never use this over the internet
2158 }
2159 myPreviousCollisionNumber = collisions;
2160 }
2161 }
2162#endif
2163 // update performance indicators
2164 for (it = vc.loadedVehBegin(); it != end; ++it) {
2165 const MSVehicle* veh = dynamic_cast<MSVehicle*>(it->second);
2166 assert(veh != 0);
2167 if (veh->isOnRoad() && !veh->isStopped()) {
2168 const double vmax = veh->getLane()->getVehicleMaxSpeed(veh);
2169 if (veh->getSpeed() < SUMO_const_haltingSpeed) {
2171 if (veh->getVClass() == SVC_EMERGENCY) {
2173 }
2174 }
2175 myTimeLoss += TIME2STEPS(TS * (vmax - veh->getSpeed()) / vmax); // may be negative with speedFactor > 1
2176 }
2177
2178 }
2182}
2183
2184
2185void
2187 // update performance indicators
2191
2194 for (auto it = vc.loadedVehBegin(); it != end; ++it) {
2195 const MSVehicle* veh = dynamic_cast<MSVehicle*>(it->second);
2196 assert(veh != 0);
2197 if (veh->isOnRoad() && !veh->isStopped()) {
2199 }
2200 }
2202}
2203
2204
2205void
2207 if (!myAmLoading) {
2209 getApp()->beginWaitCursor();
2210 myAmLoading = true;
2211 myIsReload = false;
2213 gSchemeStorage.saveViewport(0, 0, -1, 0); // recenter view
2215 setStatusBarText(TLF("Loading '%'.", file));
2216 update();
2217 }
2218}
2219
2220
2223 if (!myRunThread->networkAvailable()) {
2224 myStatusbar->getStatusLine()->setText(TL("No simulation loaded!"));
2225 return nullptr;
2226 }
2227 GUISUMOAbstractView* oldView = nullptr;
2228 if (myMDIClient->numChildren() > 0) {
2229 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
2230 if (w != nullptr) {
2231 oldView = w->getView();
2232 }
2233 }
2234 if (caption == "") {
2235 caption = "View #" + toString(myViewNumber++);
2236 }
2237 FXuint opts = MDI_TRACKING;
2238 GUISUMOViewParent* w = new GUISUMOViewParent(myMDIClient, myMDIMenu, FXString(caption.c_str()),
2239 this, GUIIconSubSys::getIcon(GUIIcon::SUMO_MINI), opts, 10, 10, 200, 100);
2241 if (oldView != nullptr) {
2242 // copy viewport
2243 oldView->copyViewportTo(v);
2244 }
2245 w->create();
2246 if (myMDIClient->numChildren() == 1) {
2247 w->maximize();
2248 } else {
2249 myMDIClient->vertical(true);
2250 }
2251 myMDIClient->setActiveChild(w);
2252
2253 return v;
2254}
2255
2256
2257FXGLCanvas*
2259 if (myMDIClient->numChildren() == 0) {
2260 return nullptr;
2261 }
2262 GUISUMOViewParent* share_tmp1 =
2263 static_cast<GUISUMOViewParent*>(myMDIClient->childAtIndex(0));
2264 return share_tmp1->getBuildGLCanvas();
2265}
2266
2267
2268void
2270 myTrackerLock.lock();
2271 myLCDLabel->setText("----------------");
2272 for (std::vector<FXButton*>::const_iterator it = myStatButtons.begin(); it != myStatButtons.end(); ++it) {
2273 (*it)->setText("-");
2274 if (it != myStatButtons.begin()) {
2275 (*it)->hide();
2276 }
2277 }
2278 // delete the simulation
2280 // reset the caption
2281 setTitle(MFXUtils::getTitleText("SUMO " VERSION_STRING));
2282 // remove trackers and other external windows (must be delayed until deleteSim)
2283 while (!myGLWindows.empty()) {
2284 delete myGLWindows.front();
2285 }
2286 // make a copy because deleting modifyes the vector;
2287 std::vector<FXMainWindow*> trackerWindows = myTrackerWindows;
2288 for (FXMainWindow* const window : trackerWindows) {
2289 delete window;
2290 }
2291 myTrackerWindows.clear();
2292 // clear selected items
2293 gSelected.clear();
2294 // add a separator to the log
2296 myTrackerLock.unlock();
2297 // remove coordinate information
2298 myGeoCoordinate->setText(TL("N/A"));
2299 myCartesianCoordinate->setText(TL("N/A"));
2300 if (myTestCoordinate) {
2301 myTestCoordinate->setText(TL("N/A"));
2302 }
2303 //
2306 update();
2307}
2308
2309
2310FXCursor*
2312 return getApp()->getDefaultCursor(DEF_ARROW_CURSOR);
2313}
2314
2315
2320
2321
2322double
2326
2327
2328void
2330 loadConfigOrNet("");
2331 if (wait) {
2332 while (myAmLoading) {
2333 myRunThread->sleep(50);
2334 }
2335 }
2336}
2337
2338
2339void
2341 myStatusbar->getStatusLine()->setText(text.c_str());
2342 myStatusbar->getStatusLine()->setNormalText(text.c_str());
2343}
2344
2345
2346void
2348 myRecentNetworks.appendFile(f);
2349}
2350
2351
2352void
2354 myRecentConfigs.appendFile(f);
2355}
2356
2357
2358void
2360 if (myShowTimeAsHMS) {
2361 myLCDLabel->setToolTipText("HH:MM:SS");
2362 if (myAmGaming) {
2364 myTimeLossLabel->setToolTipText("HH:MM:SS");
2366 }
2367 } else {
2368 myLCDLabel->setToolTipText(TL("seconds"));
2369 if (myAmGaming) {
2371 myTimeLossLabel->setToolTipText(TL("seconds"));
2373 }
2374 }
2375}
2376
2377
2378void
2380 time -= DELTA_T; // synchronize displayed time with netstate output
2381 if (time < 0) {
2382 myLCDLabel->setText("----------------");
2383 return;
2384 }
2385 if (myAmGaming) {
2386 // show time counting backwards
2387 time = myRunThread->getSimEndTime() - time;
2388 }
2389 std::ostringstream str;
2390 str << std::setfill('0');
2391 const bool hideFraction = myAmGaming || DELTA_T % 1000 == 0;
2392 if (myShowTimeAsHMS) {
2393 SUMOTime day = time / 86400000;
2394 if (day > 0) {
2395 str << day << '-';
2396 time %= 86400000;
2397 }
2398 str << std::setw(2);
2399 str << time / 3600000 << '-';
2400 time %= 3600000;
2401 str << std::setw(2) << time / 60000 << '-';
2402 time %= 60000;
2403 }
2404 str << std::setw(2) << time / 1000;
2405 if (!hideFraction) {
2406 str << '.' << std::setw(3) << time % 1000;
2407 }
2408 myLCDLabel->setText(str.str().c_str());
2409}
2410
2411
2412void
2414 if (press != nullptr) {
2415 myHotkeyPress[key] = press;
2416 }
2417 if (release != nullptr) {
2418 myHotkeyRelease[key] = release;
2419 }
2420}
2421
2422
2423long
2424GUIApplicationWindow::onKeyPress(FXObject* o, FXSelector sel, void* ptr) {
2425 FXEvent* e = (FXEvent*) ptr;
2426 // PgUp and PgDown switch between widgets by default and binding them via menu shortcuts does not work reliably
2427 // so we must intercept them before FXMainWindow can handle it
2428 if (e->code == FX::KEY_Page_Up) {
2429 onCmdDelayInc(nullptr, 0, nullptr);
2430 } else if (e->code == FX::KEY_Page_Down) {
2431 onCmdDelayDec(nullptr, 0, nullptr);
2432 } else {
2433 // disable hotkeys without modifiers for the game
2434 const bool ignoreSimple = myAmGaming && (e->state & (CONTROLMASK | SHIFTMASK | ALTMASK)) == 0;
2435 const long handled = ignoreSimple ? 0 : FXMainWindow::onKeyPress(o, sel, ptr);
2436 if (handled == 0 && myMDIClient->numChildren() > 0) {
2437 auto it = myHotkeyPress.find(e->code);
2438 if (it != myHotkeyPress.end()) {
2439 it->second->execute(SIMSTEP);
2440 }
2441 if (!ignoreSimple) {
2442 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
2443 if (w != nullptr) {
2444 w->onKeyPress(nullptr, sel, ptr);
2445 }
2446 }
2447 }
2448 }
2449 return 0;
2450}
2451
2452
2453long
2454GUIApplicationWindow::onKeyRelease(FXObject* o, FXSelector sel, void* ptr) {
2455 const long handled = FXMainWindow::onKeyRelease(o, sel, ptr);
2456 if (handled == 0 && myMDIClient->numChildren() > 0) {
2457 FXEvent* e = (FXEvent*) ptr;
2458 auto it = myHotkeyRelease.find(e->code);
2459 if (it != myHotkeyRelease.end()) {
2460 it->second->execute(SIMSTEP);
2461 }
2462 GUISUMOViewParent* w = dynamic_cast<GUISUMOViewParent*>(myMDIClient->getActiveChild());
2463 if (w != nullptr) {
2464 w->onKeyRelease(nullptr, sel, ptr);
2465 }
2466 }
2467 return 0;
2468}
2469
2470
2471double
2473 return mySimDelay;
2474}
2475
2476
2477void
2479 mySimDelay = delay;
2480}
2481
2482
2483void
2485 myEventMutex.lock();
2486 myEvents.push_back(event);
2488 //myEventCondition.wait(myEventMutex);
2489 myEventMutex.unlock();
2490}
2491
2492
2493void
2494GUIApplicationWindow::setBreakpoints(const std::vector<SUMOTime>& breakpoints) {
2495 if (myRunThread != nullptr) {
2497 myRunThread->getBreakpoints().assign(breakpoints.begin(), breakpoints.end());
2498 myRunThread->getBreakpointLock().unlock();
2500 }
2501}
2502
2503
2504void
2506 const SUMOTime begin = string2time(OptionsCont::getOptions().getString("begin"));
2507 if (time >= begin) {
2508 // ensure breakpoint is valid
2509 time -= (time - begin) % DELTA_T;
2510 std::vector<SUMOTime> breakpoints = retrieveBreakpoints();
2511 if (std::find(breakpoints.begin(), breakpoints.end(), time) == breakpoints.end()) {
2512 breakpoints.push_back(time);
2513 std::sort(breakpoints.begin(), breakpoints.end());
2514 setBreakpoints(breakpoints);
2515 setStatusBarText(TLF("Set breakpoint at %", time2string(time)));
2516 }
2517 }
2518}
2519
2520
2521const std::vector<SUMOTime>
2524 std::vector<SUMOTime> result = myRunThread->getBreakpoints();
2525 myRunThread->getBreakpointLock().unlock();
2526 return result;
2527}
2528
2529
2530void
2534
2535/****************************************************************************/
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:683
@ 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:657
@ 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:685
@ 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:403
@ MID_HOTKEY_CTRL_I_EDITVIEWPORT
Open viewport editor.
Definition GUIAppEnum.h:99
@ 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_LANGUAGE_HU
change language to hungarian
@ 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:661
@ 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_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:401
@ MID_HOTKEYS
hotkeys button
Definition GUIAppEnum.h:659
@ MID_TIMELINK_BREAKPOINT
Set breakpionts from messages - Option.
Definition GUIAppEnum.h:573
@ 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:395
@ MID_DELAY_DEC
decrease sim delay
Definition GUIAppEnum.h:399
@ MID_LISTPARKING
Definition GUIAppEnum.h:361
@ MID_NEW_OSGVIEW
Open a new microscopic 3D view.
Definition GUIAppEnum.h:340
@ MID_LANGUAGE_JA
change language to japanese
@ MID_FEEDBACK
feedback button
Definition GUIAppEnum.h:663
@ 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:397
@ 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
FXDEFMAP(GUIApplicationWindow) GUIApplicationWindowMap[]
#define MIN_DRAW_DELAY
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 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.
@ EDITVIEWPORT
@ CLEARMESSAGEWINDOW
@ NETEDIT_MINI
@ GREENVEHICLE
@ LOCATEVEHICLE
@ LOCATEPERSON
@ WINDOWS_TILE_VERT
@ GREENCONTAINER
@ WINDOWS_CASCADE
@ 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:45
#define SIMSTEP
Definition SUMOTime.h:61
#define TS
Definition SUMOTime.h:42
#define TIME2STEPS(x)
Definition SUMOTime.h:57
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
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:46
#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
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
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
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
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.
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)
std::vector< FXMainWindow * > myTrackerWindows
list of tracker windows
FXMenuPane * myLanguageMenu
Language menu common to all applications.
bool myListTeleporting
information whether the locator should list teleporting vehicles
FXLabel * myCartesianCoordinate
Labels for the current cartesian, geo-coordinate and test coordinates.
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.
FXHorizontalFrame * myTraCiFrame
frames for coordinates
void buildLanguageMenu(FXMenuBar *menuBar)
long onCmdChangeLanguage(FXObject *, FXSelector, void *)
bool listParking() const
return whether to list parking vehicles
FXHorizontalFrame * myGeoFrame
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
bool myAmFullScreen
FOX need this.
FXLabel * myGeoCoordinate
FXStatusBar * myStatusbar
The status bar.
void updateChildren(int msg=MID_SIMSTEP)
update childrens
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:801
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 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
const GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings (read only)
GUIPerspectiveChanger & getChanger() const
get changer
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 initTextures(FXApp *a)
Initiate GUITextureSubSys for textures.
static void clearTextures()
clears loaded 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.
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 push_back(T what)
static FXColor getFXColor(const RGBColor &col)
converts FXColor to RGBColor
Definition MFXUtils.cpp:145
static FXString getTitleText(const FXString &appname, FXString filename="")
Returns the title text in dependence to an optional file name.
Definition MFXUtils.cpp:61
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:40
static FXString assureExtension(const FXFileDialog &openDialog)
Corrects missing extension.
Definition MFXUtils.cpp:70
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:1122
int getWaitingVehicleNo() const
Returns the number of waiting vehicles.
SVCPermissions getPermissions() const
Returns the vehicle class permissions for this lane.
Definition MSLane.h:619
double getVehicleMaxSpeed(const SUMOTrafficObject *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
Definition MSLane.h:574
SUMOTime loadState(const std::string &fileName, const bool catchExceptions)
load state from file and return new time
Definition MSNet.cpp:1791
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:187
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition MSNet.h:465
@ 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:998
void quickReload()
reset state to the beginning without reloading the network
Definition MSNet.cpp:1770
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
bool hasContainers() const
Returns whether containers are simulated.
Definition MSNet.h:425
bool hasPersons() const
Returns whether persons are simulated.
Definition MSNet.h:409
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition MSNet.h:445
ShapeContainer & getShapeContainer()
Returns the shapes container.
Definition MSNet.h:515
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:392
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
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.
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:189
static const RGBColor RED
named colors
Definition RGBColor.h:188
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.
static std::string transcodeToLocal(const std::string &utf8String)
convert a string from UTF-8 to the local codepage
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:69
static long long getModifiedTime(const std::string &fname)
@brie get modified time
Definition SysUtils.cpp:109
static long getCurrentMillis()
Returns the current time in milliseconds.
Definition SysUtils.cpp:44
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.
@ SEL_THREAD_EVENT
Definition fxexdefs.h:173
@ SEL_THREAD
Definition fxexdefs.h:155