Eclipse SUMO - Simulation of Urban MObility
GNEApplicationWindow.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2022 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 /****************************************************************************/
18 // Functions from main window of NETEDIT
19 /****************************************************************************/
20 #include <netbuild/NBFrame.h>
36 #include <netimport/NIFrame.h>
38 #include <netimport/NITypeLoader.h>
39 #include <netwrite/NWFrame.h>
43 #include <utils/gui/div/GLHelper.h>
56 #include <utils/xml/XMLSubSys.h>
57 
58 #include "GNEApplicationWindow.h"
59 #include "GNEEvent_NetworkLoaded.h"
60 #include "GNELoadThread.h"
61 #include "GNENet.h"
62 #include "GNEViewNet.h"
63 #include "GNEUndoList.h"
64 #include "GNEViewParent.h"
65 
66 #ifdef HAVE_VERSION_H
67 #include <version.h>
68 #endif
69 
70 // ===========================================================================
71 // FOX-declarations
72 // ===========================================================================
73 
74 FXDEFMAP(GNEApplicationWindow) GNEApplicationWindowMap[] = {
75  // quit calls
79  FXMAPFUNC(SEL_CLOSE, MID_WINDOW, GNEApplicationWindow::onCmdQuit),
80 
81  // toolbar file
86  FXMAPFUNC(SEL_UPDATE, MID_OPEN_NETWORK, GNEApplicationWindow::onUpdOpen),
88  FXMAPFUNC(SEL_UPDATE, MID_OPEN_CONFIG, GNEApplicationWindow::onUpdOpen),
92  FXMAPFUNC(SEL_UPDATE, MID_RECENTFILE, GNEApplicationWindow::onUpdOpen),
95  // network
106  // SUMOConfig
114  // TLS
121  // edge types
130  // additionals
139  // demand elements
148  // data elements
157  // other
162 
163  // Toolbar supermode
167 
168  // Toolbar modes
184 
185  // Toolbar edit
194  // Network view options
227  // Demand view options
250  // Data view options
267  // view
282 
285  /* Prepared for #6042
286  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_CTRL_X_CUT, GNEApplicationWindow::onCmdCut),
287  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_CTRL_C_COPY, GNEApplicationWindow::onCmdCopy),
288  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_CTRL_V_PASTE, GNEApplicationWindow::onCmdPaste),
289  */
290 
291  // toolbar lock
297 
298  // Toolbar processing
313 
314 
315  // Toolbar locate
316  FXMAPFUNC(SEL_COMMAND, MID_LOCATEJUNCTION, GNEApplicationWindow::onCmdLocate),
318  FXMAPFUNC(SEL_COMMAND, MID_LOCATEEDGE, GNEApplicationWindow::onCmdLocate),
322  FXMAPFUNC(SEL_COMMAND, MID_LOCATEVEHICLE, GNEApplicationWindow::onCmdLocate),
324  FXMAPFUNC(SEL_COMMAND, MID_LOCATEPERSON, GNEApplicationWindow::onCmdLocate),
326  FXMAPFUNC(SEL_COMMAND, MID_LOCATEROUTE, GNEApplicationWindow::onCmdLocate),
328  FXMAPFUNC(SEL_COMMAND, MID_LOCATESTOP, GNEApplicationWindow::onCmdLocate),
330  FXMAPFUNC(SEL_COMMAND, MID_LOCATETLS, GNEApplicationWindow::onCmdLocate),
332  FXMAPFUNC(SEL_COMMAND, MID_LOCATEADD, GNEApplicationWindow::onCmdLocate),
334  FXMAPFUNC(SEL_COMMAND, MID_LOCATEPOI, GNEApplicationWindow::onCmdLocate),
336  FXMAPFUNC(SEL_COMMAND, MID_LOCATEPOLY, GNEApplicationWindow::onCmdLocate),
338 
339  // toolbar tools
342 
343  // toolbar windows
345 
346  // toolbar help
348  FXMAPFUNC(SEL_COMMAND, MID_CHANGELOG, GNEApplicationWindow::onCmdChangelog),
349  FXMAPFUNC(SEL_COMMAND, MID_HOTKEYS, GNEApplicationWindow::onCmdHotkeys),
350  FXMAPFUNC(SEL_COMMAND, MID_TUTORIAL, GNEApplicationWindow::onCmdTutorial),
352 
353  // alt + <number>
374 
375  // key events
376  FXMAPFUNC(SEL_KEYPRESS, 0, GNEApplicationWindow::onKeyPress),
377  FXMAPFUNC(SEL_KEYRELEASE, 0, GNEApplicationWindow::onKeyRelease),
378  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_ESC, GNEApplicationWindow::onCmdAbort),
379  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_DEL, GNEApplicationWindow::onCmdDel),
380  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_ENTER, GNEApplicationWindow::onCmdEnter),
382 
383  // threads events
386 
387  // Edge template functions
391 
392  // Other
393  FXMAPFUNC(SEL_CLIPBOARD_REQUEST, 0, GNEApplicationWindow::onClipboardRequest),
401 };
402 
403 // Object implementation
404 FXIMPLEMENT(GNEApplicationWindow, FXMainWindow, GNEApplicationWindowMap, ARRAYNUMBER(GNEApplicationWindowMap))
405 
406 
407 // ===========================================================================
408 // GNEApplicationWindow method definitions
409 // ===========================================================================
410 
411 #ifdef _MSC_VER
412 #pragma warning(push)
413 /* Disable warning about using "this" in the constructor */
414 #pragma warning(disable: 4355)
415 #endif
416 GNEApplicationWindow::GNEApplicationWindow(FXApp* a, const std::string& configPattern) :
417  GUIMainWindow(a),
418  myUndoList(new GNEUndoList(this)),
419  myConfigPattern(configPattern),
420  myToolbarsGrip(this),
421  myMenuBarFile(this),
422  myFileMenuCommands(this),
423  myModesMenuCommands(this),
424  myEditMenuCommands(this),
425  myLockMenuCommands(this),
426  myProcessingMenuCommands(this),
427  myLocateMenuCommands(this),
428  myToolsMenuCommands(this),
429  myWindowsMenuCommands(this),
430  mySupermodeCommands(this),
431  myTitlePrefix("NETEDIT " VERSION_STRING) {
432  // init icons
434  // init Textures
436  // init cursors
438  // create undoList dialog (after initCursors)
440  a->setTooltipTime(1000000000);
441  a->setTooltipPause(1000000000);
442 }
443 #ifdef _MSC_VER
444 #pragma warning(pop)
445 #endif
446 
447 
448 void
450  // do this not twice
451  if (myHadDependentBuild) {
452  WRITE_ERROR(TL("DEBUG: GNEApplicationWindow::dependentBuild called twice"));
453  return;
454  }
455  myHadDependentBuild = true;
456  setTarget(this);
457  setSelector(MID_WINDOW);
458  // build toolbar menu
460  // build the thread - io
463  // build the status bar
464  myStatusbar = new FXStatusBar(this, GUIDesignStatusBar);
465  // build geo coordinates label
466  auto requiereRecomputingFrame = new FXHorizontalFrame(myStatusbar, GUIDesignHorizontalFrameStatusBar);
467  myRequireRecomputingButton = new MFXButtonTooltip(requiereRecomputingFrame, myStaticTooltipMenu,
468  TL("Recomputing\t\tRecomputing is needed"), nullptr, this, MID_GNE_RECOMPUTINGNEEDED, GUIDesignButtonStatusBarFixed);
469  // build geo coordinates label
470  myGeoFrame = new FXHorizontalFrame(myStatusbar, GUIDesignHorizontalFrameStatusBar);
471  myGeoCoordinate = new FXLabel(myGeoFrame, TL("N/A\t\tOriginal coordinate (before coordinate transformation in netconvert)"), nullptr, GUIDesignLabelStatusBar);
472  // build cartesian coordinates label
474  myCartesianCoordinate = new FXLabel(myCartesianFrame, TL("N/A\t\tNetwork coordinate"), nullptr, GUIDesignLabelStatusBar);
475  // build test coordinates label (only if gui-testing is enabled)
476  if (OptionsCont::getOptions().getBool("gui-testing")) {
478  myTestCoordinate = new FXLabel(myTestFrame, TL("N/A\t\tTest coordinate"), nullptr, GUIDesignLabelStatusBar);
479  }
480  // make the window a mdi-window
481  myMainSplitter = new FXSplitter(this, GUIDesignSplitter | SPLITTER_VERTICAL | SPLITTER_REVERSED);
482  myMDIClient = new FXMDIClient(myMainSplitter, GUIDesignSplitterMDI);
483  myMDIMenu = new FXMDIMenu(this, myMDIClient);
484  // build the message window
486  myMainSplitter->setSplit(1, 65);
487  // fill menu and tool bar
488  fillMenuBar();
489  // build additional threads
490  myLoadThread = new GNELoadThread(getApp(), this, myEvents, myLoadThreadEvent);
491  // set the status bar
492  myStatusbar->getStatusLine()->setText(TL("Ready."));
493  // set the caption
494  setTitle(myTitlePrefix);
495  // set Netedit ICON
498  // build NETEDIT Accelerators (hotkeys)
500 }
501 
502 
503 void
505  // set windows size and position
507  // set current folder
508  gCurrentFolder = getApp()->reg().readStringEntry("SETTINGS", "basedir", "");
509  // Create main window
510  FXMainWindow::create();
511  // create menu panes
512  myFileMenu->create();
513  myModesMenu->create();
514  myEditMenu->create();
515  myFileMenuSUMOConfig->create();
516  myFileMenuTLS->create();
517  myFileMenuEdgeTypes->create();
518  myFileMenuAdditionals->create();
519  myFileMenuDemandElements->create();
520  myFileMenuDataElements->create();
521  myWindowMenu->create();
522  myHelpMenu->create();
523 
524  FXint textWidth = getApp()->getNormalFont()->getTextWidth("8", 1) * 22;
525  myCartesianFrame->setWidth(textWidth);
526  myGeoFrame->setWidth(textWidth);
527 
528  // fill online maps
529  if (myOnlineMaps.empty()) {
530  myOnlineMaps["GeoHack"] = "https://geohack.toolforge.org/geohack.php?params=%lat;%lon_scale:1000";
531  myOnlineMaps["GoogleSat"] = "https://www.google.com/maps?ll=%lat,%lon&t=h&z=18";
532  myOnlineMaps["OSM"] = "https://www.openstreetmap.org/?mlat=%lat&mlon=%lon&zoom=18&layers=M";
533  }
534 
535  show(PLACEMENT_DEFAULT);
536  if (!OptionsCont::getOptions().isSet("window-size")) {
537  if (getApp()->reg().readIntEntry("SETTINGS", "maximized", 0) == 1) {
538  maximize();
539  }
540  }
541 
542 }
543 
544 
546  closeAllWindows();
547  // Close icons
549  // Close gifs (Textures)
551  // delete visuals
552  delete myGLVisual;
553  // must delete menus to avoid segfault on removing accelerators
554  // (http://www.fox-toolkit.net/faq#TOC-What-happens-when-the-application-s)
555  delete myFileMenuSUMOConfig;
556  delete myFileMenuTLS;
557  delete myFileMenuEdgeTypes;
558  delete myFileMenuAdditionals;
560  delete myFileMenuDataElements;
561  delete myFileMenu;
562  delete myModesMenu;
563  delete myEditMenu;
564  delete myLockMenu;
565  delete myProcessingMenu;
566  delete myLocatorMenu;
567  delete myToolsMenu;
568  delete myWindowMenu;
569  delete myHelpMenu;
570  // Delete load thread
571  delete myLoadThread;
572  // drop all events
573  while (!myEvents.empty()) {
574  // get the next event
575  GUIEvent* e = myEvents.top();
576  myEvents.pop();
577  delete e;
578  }
579  // delete undoList and dialog
580  delete myUndoList;
581  delete myUndoListDialog;
582 }
583 
584 
585 long
586 GNEApplicationWindow::onCmdQuit(FXObject*, FXSelector, void*) {
587  if (continueWithUnsavedChanges("quit")) {
589  getApp()->reg().writeStringEntry("SETTINGS", "basedir", gCurrentFolder.text());
590  if (isMaximized()) {
591  getApp()->reg().writeIntEntry("SETTINGS", "maximized", 1);
592  } else {
593  getApp()->reg().writeIntEntry("SETTINGS", "maximized", 0);
594  }
595  getApp()->exit(0);
596  }
597  return 1;
598 }
599 
600 
601 long
602 GNEApplicationWindow::onCmdEditChosen(FXObject*, FXSelector, void*) {
603  GUIDialog_GLChosenEditor* chooser =
605  chooser->create();
606  chooser->show();
607  return 1;
608 }
609 
610 
611 long
612 GNEApplicationWindow::onCmdNewNetwork(FXObject*, FXSelector, void*) {
613  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
614  if (myViewNet && !onCmdClose(0, 0, 0)) {
615  return 1;
616  } else {
620  loadConfigOrNet("", true, false, true, true);
621  return 1;
622  }
623 }
624 
625 
626 long
627 GNEApplicationWindow::onCmdOpenConfiguration(FXObject*, FXSelector, void*) {
628  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
629  if (myViewNet && !onCmdClose(0, 0, 0)) {
630  return 1;
631  } else {
632  // get the new file name
633  FXFileDialog opendialog(this, TL("Open Netconvert Configuration"));
634  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_CONFIG));
635  opendialog.setSelectMode(SELECTFILE_EXISTING);
636  opendialog.setPatternList(myConfigPattern.c_str());
637  if (gCurrentFolder.length() != 0) {
638  opendialog.setDirectory(gCurrentFolder);
639  }
640  if (opendialog.execute()) {
641  gCurrentFolder = opendialog.getDirectory();
642  std::string file = opendialog.getFilename().text();
643  // load config
644  loadConfigOrNet(file, false);
645  // add it into recent configs
646  myMenuBarFile.myRecentNetsAndConfigs.appendFile(file.c_str());
647  }
648  return 1;
649  }
650 }
651 
652 
653 long
654 GNEApplicationWindow::onCmdOpenNetwork(FXObject*, FXSelector, void*) {
655  // get the new file name
656  FXFileDialog opendialog(this, TL("Open Network"));
657  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
658  opendialog.setSelectMode(SELECTFILE_EXISTING);
659  opendialog.setPatternList("SUMO nets (*.net.xml,*.net.xml.gz)\nAll files (*)");
660  if (gCurrentFolder.length() != 0) {
661  opendialog.setDirectory(gCurrentFolder);
662  }
663  if (opendialog.execute()) {
664  // get file
665  const std::string file = opendialog.getFilename().text();
666  // check if file isn't empty first
667  if (!file.empty()) {
668  // check if current edited Net can be closed (and therefore the undo-list cleared, see #5753)
669  if (myViewNet) {
670  // call close
671  onCmdClose(0, 0, 0);
672  // if after close there is myViewNet yet, abort
673  if (myViewNet) {
674  return 0;
675  }
676  }
677  // set current folder
678  gCurrentFolder = opendialog.getDirectory();
679  // load network
680  loadConfigOrNet(file, true);
681  // add it into recent nets
682  myMenuBarFile.myRecentNetsAndConfigs.appendFile(file.c_str());
683  // when a net is loaded, save additionals and TLSPrograms are disabled
687  }
688  }
689  return 0;
690 }
691 
692 
693 long
694 GNEApplicationWindow::onCmdOpenForeign(FXObject*, FXSelector, void*) {
695  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
696  if (myViewNet && !onCmdClose(0, 0, 0)) {
697  return 1;
698  } else {
699  // get the new file name
700  FXFileDialog opendialog(this, TL("Import Foreign Network"));
701  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
702  opendialog.setSelectMode(SELECTFILE_EXISTING);
703  FXString osmPattern("OSM net (*.osm.xml,*.osm)");
704  opendialog.setPatternText(0, osmPattern);
705  if (gCurrentFolder.length() != 0) {
706  opendialog.setDirectory(gCurrentFolder);
707  }
708  if (opendialog.execute()) {
709  gCurrentFolder = opendialog.getDirectory();
710  std::string file = opendialog.getFilename().text();
711 
714  if (osmPattern.contains(opendialog.getPattern())) {
715  // recommended osm options
716  // https://sumo.dlr.de/wiki/Networks/Import/OpenStreetMap#Recommended_NETCONVERT_Options
717  oc.set("osm-files", file);
718  oc.set("geometry.remove", "true");
719  oc.set("ramps.guess", "true");
720  oc.set("junctions.join", "true");
721  oc.set("tls.guess-signals", "true");
722  oc.set("tls.discard-simple", "true");
723  } else {
724  throw ProcessError("Attempted to import unknown file format '" + file + "'.");
725  }
726 
727  GUIDialog_Options* wizard =
728  new GUIDialog_Options(this, TL("Select Import Options"), getWidth(), getHeight());
729 
730  if (wizard->execute()) {
731  NIFrame::checkOptions(); // needed to set projection parameters
732  loadConfigOrNet("", false, false, false);
733  }
734  }
735  return 1;
736  }
737 }
738 
739 
740 long
741 GNEApplicationWindow::onCmdOpenSUMOConfig(FXObject*, FXSelector, void*) {
742  // write debug information
743  WRITE_DEBUG("Open SUMOConfig dialog");
744  // get the SUMOConfig file name
745  FXFileDialog opendialog(this, TL("Open SUMOConfig file"));
746  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SUMO_MINI));
747  opendialog.setSelectMode(SELECTFILE_EXISTING);
748  opendialog.setPatternList("SUMOConfig files (*.sumocfg)\nAll files (*)");
749  if (gCurrentFolder.length() != 0) {
750  opendialog.setDirectory(gCurrentFolder);
751  }
752  if (opendialog.execute()) {
753  // close additional dialog
754  WRITE_DEBUG("Close SUMOConfig dialog");
755  gCurrentFolder = opendialog.getDirectory();
756  std::string file = opendialog.getFilename().text();
757  // write info
758  WRITE_MESSAGE("Loading SUMOConfig from '" + file + "'");
759  // close all windows
760  closeAllWindows();
761  // disable validation for additionals
762  XMLSubSys::setValidation("never", "auto", "auto");
763  // Create additional handler
764  GNEApplicationWindowHelper::GNEConfigHandler confighandler(this, file);
765  // Run parser
766  if (!confighandler.parse()) {
767  WRITE_ERROR("Loading of " + file + " failed.");
768  }
769  // update view
770  update();
771  // restore validation for additionals
772  XMLSubSys::setValidation("auto", "auto", "auto");
773  } else {
774  // write debug information
775  WRITE_DEBUG("Cancel SUMOConfig dialog");
776  }
777  return 1;
778 }
779 
780 
781 long
782 GNEApplicationWindow::onCmdReloadSUMOConfig(FXObject*, FXSelector, void*) {
783  const auto file = OptionsCont::getOptions().getString("SUMOConfig-output");
784  if (file.size() > 0) {
785  // disable validation for additionals
786  XMLSubSys::setValidation("never", "auto", "auto");
787  // Create additional handler
788  GNEApplicationWindowHelper::GNEConfigHandler confighandler(this, file);
789  // Run parser
790  if (!confighandler.parse()) {
791  WRITE_ERROR("Loading of " + file + " failed.");
792  }
793  update();
794  // restore validation for additionals
795  XMLSubSys::setValidation("auto", "auto", "auto");
796  }
797  return 1;
798 }
799 
800 
801 long
802 GNEApplicationWindow::onUpdReloadSUMOConfig(FXObject*, FXSelector, void*) {
803  // check if file exist
804  if (myViewNet && !OptionsCont::getOptions().getString("SUMOConfig-output").empty()) {
805  return myFileMenuCommands.reloadSUMOConfig->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
806  } else {
807  return myFileMenuCommands.reloadSUMOConfig->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
808  }
809 }
810 
811 
812 long
813 GNEApplicationWindow::onCmdOpenTLSPrograms(FXObject*, FXSelector, void*) {
814  // write debug information
815  WRITE_DEBUG("Open TLSProgram dialog");
816  // get the TLSPrograms file name
817  FXFileDialog opendialog(this, TL("Open TLS Programs file"));
818  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::MODETLS));
819  opendialog.setSelectMode(SELECTFILE_EXISTING);
820  opendialog.setPatternList("TLSProgram files (*.xml,*.xml.gz)\nAll files (*)");
821  if (gCurrentFolder.length() != 0) {
822  opendialog.setDirectory(gCurrentFolder);
823  }
824  if (opendialog.execute()) {
825  // close additional dialog
826  WRITE_DEBUG("Close TLSProgram dialog");
827  gCurrentFolder = opendialog.getDirectory();
828  std::string file = opendialog.getFilename().text();
829  // Run parser
830  myUndoList->begin(Supermode::NETWORK, GUIIcon::MODETLS, "loading TLS Programs from '" + file + "'");
831  myNet->computeNetwork(this);
832  if (myNet->getViewNet()->getViewParent()->getTLSEditorFrame()->parseTLSPrograms(file) == false) {
833  // Abort undo/redo
835  } else {
836  // commit undo/redo operation
837  myUndoList->end();
838  update();
839  }
840  } else {
841  // write debug information
842  WRITE_DEBUG("Cancel TLSProgram dialog");
843  }
844  return 1;
845 }
846 
847 
848 long
849 GNEApplicationWindow::onCmdReloadTLSPrograms(FXObject*, FXSelector, void*) {
850  // Run parser
851  myUndoList->begin(Supermode::NETWORK, GUIIcon::MODETLS, "loading TLS Programs from '" + OptionsCont::getOptions().getString("TLSPrograms-output") + "'");
852  myNet->computeNetwork(this);
853  if (myNet->getViewNet()->getViewParent()->getTLSEditorFrame()->parseTLSPrograms(OptionsCont::getOptions().getString("TLSPrograms-output")) == false) {
854  // Abort undo/redo
856  } else {
857  // commit undo/redo operation
858  myUndoList->end();
859  update();
860  }
861  return 1;
862 }
863 
864 
865 long
866 GNEApplicationWindow::onUpdReloadTLSPrograms(FXObject*, FXSelector, void*) {
867  // check if file exist
868  if (myViewNet && OptionsCont::getOptions().getString("TLSPrograms-output").empty()) {
869  return myFileMenuCommands.reloadTLSPrograms->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
870  } else {
871  return myFileMenuCommands.reloadTLSPrograms->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
872  }
873 }
874 
875 
876 long
877 GNEApplicationWindow::onCmdOpenEdgeTypes(FXObject*, FXSelector, void*) {
878  // open dialog
879  FXFileDialog opendialog(this, TL("Load edgeType file"));
880  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::MODECREATEEDGE));
881  opendialog.setSelectMode(SELECTFILE_EXISTING);
882  opendialog.setPatternList("*.xml,*.xml.gz");
883  if (gCurrentFolder.length() != 0) {
884  opendialog.setDirectory(gCurrentFolder);
885  }
886  if (opendialog.execute()) {
887  // declare type container
888  NBTypeCont typeContainerAux;
889  // declare type handler
890  NIXMLTypesHandler* handler = new NIXMLTypesHandler(typeContainerAux);
891  // load edge types
892  NITypeLoader::load(handler, {opendialog.getFilename().text()}, "types");
893  // write information
894  WRITE_MESSAGE("Loaded " + toString(typeContainerAux.size()) + " edge types");
895  // now create GNETypes based on typeContainerAux
897  // iterate over typeContainerAux
898  for (const auto& auxEdgeType : typeContainerAux) {
899  // create new edge type
900  GNEEdgeType* edgeType = new GNEEdgeType(myNet, auxEdgeType.first, auxEdgeType.second);
901  // add lane types
902  for (const auto& laneType : auxEdgeType.second->laneTypeDefinitions) {
903  edgeType->addLaneType(new GNELaneType(edgeType, laneType));
904  }
905  // add it using undoList
906  myViewNet->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
907 
908  }
909  // end undo list
910  myViewNet->getUndoList()->end();
911  // refresh edge type selector
913  }
914  return 0;
915 }
916 
917 
918 long
919 GNEApplicationWindow::onCmdReloadEdgeTypes(FXObject*, FXSelector, void*) {
920  // declare type container
921  NBTypeCont typeContainerAux;
922  // declare type handler
923  NIXMLTypesHandler* handler = new NIXMLTypesHandler(typeContainerAux);
924  // load edge types
925  NITypeLoader::load(handler, {OptionsCont::getOptions().getString("edgeTypes-output")}, "types");
926  // write information
927  WRITE_MESSAGE("Loaded " + toString(typeContainerAux.size()) + " edge types");
928  // now create GNETypes based on typeContainerAux
930  // iterate over typeContainerAux
931  for (const auto& auxEdgeType : typeContainerAux) {
932  // create new edge type
933  GNEEdgeType* edgeType = new GNEEdgeType(myNet, auxEdgeType.first, auxEdgeType.second);
934  // add lane types
935  for (const auto& laneType : auxEdgeType.second->laneTypeDefinitions) {
936  edgeType->addLaneType(new GNELaneType(edgeType, laneType));
937  }
938  // add it using undoList
939  myViewNet->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
940 
941  }
942  // end undo list
943  myViewNet->getUndoList()->end();
944  // refresh edge type selector
946  return 0;
947 }
948 
949 
950 long
951 GNEApplicationWindow::onUpdReloadEdgeTypes(FXObject*, FXSelector, void*) {
952  // check if file exist
953  if (myViewNet && OptionsCont::getOptions().getString("edgeTypes-output").empty()) {
954  return myFileMenuCommands.reloadEdgeTypes->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
955  } else {
956  return myFileMenuCommands.reloadEdgeTypes->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
957  }
958 }
959 
960 
961 long
962 GNEApplicationWindow::onCmdOpenRecent(FXObject*, FXSelector, void* fileData) {
963  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
964  if (myViewNet && !onCmdClose(0, 0, 0)) {
965  return 1;
966  } else if (myAmLoading) {
967  myStatusbar->getStatusLine()->setText(TL("Already loading!"));
968  return 1;
969  } else {
970  // get filedata
971  std::string file((const char*)fileData);
972  // check if we're loading a network or a config (.netccfg for configs)
973  if (file.find(".netccfg") != std::string::npos) {
974  // load config
975  loadConfigOrNet(file, false);
976  } else {
977  // load network
978  loadConfigOrNet(file, true);
979  }
980  return 1;
981  }
982 }
983 
984 
985 long
986 GNEApplicationWindow::onCmdReload(FXObject*, FXSelector, void*) {
987  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
988  if (myViewNet) {
989  // check if current network can be closed
990  if (continueWithUnsavedChanges("reload")) {
991  closeAllWindows();
992  // disable save additionals and TLS menu
995  // disable toolbargrip modes
996  myToolbarsGrip.menu->disable();
997  // hide all Supermode, Network and demand commands
1002  // hide view options
1006  } else {
1007  // abort reloading (because "cancel button" was pressed)
1008  return 1;
1009  }
1010  }
1011  // @note. If another network has been load during this session, it might not be desirable to set useStartupOptions
1012  loadConfigOrNet(OptionsCont::getOptions().getString("sumo-net-file"), true, true);
1013  return 1;
1014 }
1015 
1016 
1017 long
1018 GNEApplicationWindow::onCmdClose(FXObject*, FXSelector, void*) {
1019  if (continueWithUnsavedChanges("close")) {
1020  closeAllWindows();
1021  // add a separator to the log
1023  // disable save additionals and TLS menu
1026  // hide all Supermode, Network and demand commands
1031  // hide view options
1035  }
1036  return 1;
1037 }
1038 
1039 
1040 long
1041 GNEApplicationWindow::onCmdLocate(FXObject*, FXSelector sel, void*) {
1042  if (myMDIClient->numChildren() > 0) {
1043  GNEViewParent* w = dynamic_cast<GNEViewParent*>(myMDIClient->getActiveChild());
1044  if (w != nullptr) {
1045  w->onCmdLocate(nullptr, sel, nullptr);
1046  }
1047  }
1048  return 1;
1049 }
1050 
1051 
1052 long
1053 GNEApplicationWindow::onCmdToolNetDiff(FXObject*, FXSelector, void*) {
1054  // open a modal NetDiff tool dialog
1055  GNEToolNetDiff(this); // NOSONAR
1056 
1057  /*
1058  OptionsCont& oc = OptionsCont::getOptions();
1059  // check that currently there is a View
1060  if (myViewNet == nullptr) {
1061  return 0;
1062  }
1063  #ifdef WIN32
1064  // check that python folder is defined in PATH
1065  const char* path = getenv("PATH");
1066  if ((strstr(path, "Python") == nullptr) && (strstr(path, "python") == nullptr)) {
1067  WRITE_ERROR(TL("Python folder must be defined in PATH"));
1068  return 0;
1069  }
1070  #endif
1071  // check that SUMO_HOME is defined
1072  const char* sumoPath = getenv("SUMO_HOME");
1073  if (sumoPath == nullptr) {
1074  WRITE_ERROR(TL("Enviroment variable SUMO_HOME must be defined"));
1075  return 0;
1076  }
1077  // get netdiff path
1078  const std::string netDiff = std::string(sumoPath) + "/tools/net/netdiff.py";
1079  if (!FileHelpers::isReadable(netDiff)) {
1080  WRITE_ERROR("netdiff.py cannot be found in path '" + netDiff + "'");
1081  return 0;
1082  }
1083  // check if network is saved
1084  if (!myViewNet->getNet()->isNetSaved()) {
1085  // save network
1086  onCmdSaveNetwork(nullptr, 0, nullptr);
1087  if (!myViewNet->getNet()->isNetSaved()) {
1088  return 0;
1089  }
1090  }
1091  // get the second network to ddiff
1092  FXFileDialog opendialog(this, TL("Open diff Network"));
1093  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
1094  opendialog.setSelectMode(SELECTFILE_EXISTING);
1095  opendialog.setPatternList("SUMO nets (*.net.xml,*.net.xml.gz)\nAll files (*)");
1096  if (gCurrentFolder.length() != 0) {
1097  opendialog.setDirectory(gCurrentFolder);
1098  }
1099  if (opendialog.execute()) {
1100  // get file
1101  const std::string secondNet = opendialog.getFilename().text();
1102  // check if secondNet isn't empty
1103  if (secondNet.empty()) {
1104  return 0;
1105  }
1106  // extract folder
1107  const std::string secondNetFolder = getFolder(secondNet).text();
1108  // declare python command
1109  std::string cmd = "cd " + secondNetFolder + TL("&") + // folder to save diff files (the same of second net)
1110  "python " + netDiff + // netdiff.py
1111  " " + oc.getString("output-file") + // netA (current)
1112  " " + secondNet + // net B
1113  " diff"; // netdiff options
1114  // start in background
1115  #ifndef WIN32
1116  cmd = cmd + " &";
1117  #else
1118  // see "help start" for the parameters
1119  cmd = "start /B \"\" " + cmd;
1120  #endif
1121  WRITE_MESSAGE("Running " + cmd + ".");
1122  // yay! fun with dangerous commands... Never use this over the internet
1123  SysUtils::runHiddenCommand(cmd);
1124  }
1125  */
1126  return 1;
1127 }
1128 
1129 
1130 long
1131 GNEApplicationWindow::onUpdOpen(FXObject* sender, FXSelector, void*) {
1132  sender->handle(this, myAmLoading ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
1133  return 1;
1134 }
1135 
1136 
1137 long
1138 GNEApplicationWindow::onCmdClearMsgWindow(FXObject*, FXSelector, void*) {
1140  return 1;
1141 }
1142 
1143 
1144 long
1146  // write warning if netedit is running in testing mode
1147  WRITE_DEBUG("Toggle load additionals in sumo-gui");
1148  return 1;
1149 }
1150 
1151 
1152 long
1153 GNEApplicationWindow::onCmdLoadDemandInSUMOGUI(FXObject*, FXSelector, void*) {
1154  // write warning if netedit is running in testing mode
1155  WRITE_DEBUG("Toggle load demand in sumo-gui");
1156  return 1;
1157 }
1158 
1159 
1160 long
1161 GNEApplicationWindow::onCmdAbout(FXObject*, FXSelector, void*) {
1162  // write warning if netedit is running in testing mode
1163  WRITE_DEBUG("Opening about dialog");
1164  // create and open about dialog
1165  GNEAbout* about = new GNEAbout(this);
1166  about->create();
1167  about->show(PLACEMENT_OWNER);
1168  // write warning if netedit is running in testing mode
1169  WRITE_DEBUG("Closed about dialog");
1170  return 1;
1171 }
1172 
1173 
1174 long GNEApplicationWindow::onClipboardRequest(FXObject*, FXSelector, void* ptr) {
1175  FXEvent* event = (FXEvent*)ptr;
1176  FXString string = GUIUserIO::clipped.c_str();
1177  setDNDData(FROM_CLIPBOARD, event->target, string);
1178  return 1;
1179 }
1180 
1181 
1182 long
1183 GNEApplicationWindow::onLoadThreadEvent(FXObject*, FXSelector, void*) {
1184  eventOccurred();
1185  return 1;
1186 }
1187 
1188 
1189 void
1191  while (!myEvents.empty()) {
1192  // get the next event
1193  GUIEvent* e = myEvents.top();
1194  myEvents.pop();
1195  // process
1196  switch (e->getOwnType()) {
1199  break;
1206  break;
1207  default:
1208  break;
1209  }
1210  delete e;
1211  }
1212 }
1213 
1214 
1215 void
1218  myAmLoading = false;
1219  GNEEvent_NetworkLoaded* ec = static_cast<GNEEvent_NetworkLoaded*>(e);
1220  // check whether the loading was successfull
1221  if (ec->net == nullptr) {
1222  // report failure
1223  setStatusBarText("Loading of '" + ec->file + "' failed!");
1224  } else {
1225  // set new Net
1226  myNet = ec->net;
1227  // report success
1228  setStatusBarText("'" + ec->file + "' loaded.");
1230  // build viewparent toolbar grips before creating view parent
1232  // initialise NETEDIT View
1233  GNEViewParent* viewParent = new GNEViewParent(myMDIClient, myMDIMenu, "NETEDIT VIEW", this, nullptr, myNet, ec->isNewNet, myUndoList, nullptr, MDI_TRACKING, 10, 10, 300, 200);
1234  // create it maximized
1235  viewParent->maximize();
1236  // mark it as Active child
1237  myMDIClient->setActiveChild(viewParent);
1238  // cast pointer myViewNet
1239  myViewNet = dynamic_cast<GNEViewNet*>(viewParent->getView());
1240  // set settings in view
1241  if (viewParent->getView() && ec->settingsFile != "") {
1242  GUISettingsHandler settings(ec->settingsFile, true, true);
1243  settings.addSettings(viewParent->getView());
1244  viewParent->getView()->addDecals(settings.getDecals());
1245  settings.applyViewport(viewParent->getView());
1246  settings.setSnapshots(viewParent->getView());
1247  }
1248  // set network name on the caption
1249  setTitle(MFXUtils::getTitleText(myTitlePrefix, ec->file.c_str()));
1250  // force supermode network
1251  if (myViewNet) {
1253  }
1254  if (myViewNet && ec->viewportFromRegistry) {
1255  Position off;
1256  off.set(getApp()->reg().readRealEntry("viewport", "x"), getApp()->reg().readRealEntry("viewport", "y"), getApp()->reg().readRealEntry("viewport", "z"));
1257  Position p(off.x(), off.y(), 0);
1258  myViewNet->setViewportFromToRot(off, p, 0);
1259  }
1260  }
1261  getApp()->endWaitCursor();
1263  // check if additionals/shapes has to be loaded at start
1264  if (oc.isSet("additional-files") && !oc.getString("additional-files").empty() && myNet) {
1265  // obtain vector of additional files
1266  std::vector<std::string> additionalFiles = oc.getStringVector("additional-files");
1267  // begin undolist
1268  myUndoList->begin(Supermode::NETWORK, GUIIcon::SUPERMODENETWORK, "loading additionals and shapes from '" + toString(additionalFiles) + "'");
1269  // flag for check if there is error creating elements
1270  bool errorCreatingElement = false;
1271  // iterate over every additional file
1272  for (const auto& additionalFile : additionalFiles) {
1273  WRITE_MESSAGE("loading additionals and shapes from '" + additionalFile + "'");
1274  // declare general handler
1275  GNEGeneralHandler handler(myNet, additionalFile, true, false);
1276  // disable validation for additionals
1277  XMLSubSys::setValidation("never", "auto", "auto");
1278  // Run parser
1279  if (!handler.parse()) {
1280  WRITE_ERROR("Loading of " + additionalFile + " failed.");
1281  } else {
1282  // set additional-files
1283  oc.resetWritable();
1284  oc.set("additional-files", additionalFile);
1285  }
1286  // disable validation for additionals
1287  XMLSubSys::setValidation("auto", "auto", "auto");
1288  // enable demand elements if there is an error creating element
1289  if (handler.isErrorCreatingElement()) {
1290  errorCreatingElement = true;
1291  }
1292  }
1293  // check if enable save demand elements
1294  if (errorCreatingElement) {
1296  } else {
1297  myNet->requireSaveAdditionals(false);
1298  }
1299  // end undo list
1300  myUndoList->end();
1301  }
1302  // check if demand elements has to be loaded at start
1303  if (oc.isSet("route-files") && !oc.getString("route-files").empty() && myNet) {
1304  // obtain vector of route files
1305  std::vector<std::string> demandElementsFiles = oc.getStringVector("route-files");
1306  // begin undolist
1307  myUndoList->begin(Supermode::DEMAND, GUIIcon::SUPERMODEDEMAND, "loading demand elements from '" + toString(demandElementsFiles) + "'");
1308  // flag for check if there is error creating elements
1309  bool errorCreatingElement = false;
1310  // iterate over every route file
1311  for (const auto& demandElementsFile : demandElementsFiles) {
1312  WRITE_MESSAGE("Loading demand elements from '" + demandElementsFile + "'");
1313  GNEGeneralHandler handler(myNet, demandElementsFile, true, false);
1314  // disable validation for demand elements
1315  XMLSubSys::setValidation("never", "auto", "auto");
1316  if (!handler.parse()) {
1317  WRITE_ERROR("Loading of " + demandElementsFile + " failed.");
1318  } else {
1319  // set first demandElementsFiles as default file
1320  oc.resetWritable();
1321  oc.set("route-files", demandElementsFile);
1322  }
1323  // disable validation for demand elements
1324  XMLSubSys::setValidation("auto", "auto", "auto");
1325  // enable demand elements if there is an error creating element
1326  if (handler.isErrorCreatingElement()) {
1327  errorCreatingElement = true;
1328  }
1329  }
1330  // check if enable save demand elements
1331  if (errorCreatingElement) {
1333  } else {
1335  }
1336  // end undo list
1337  myUndoList->end();
1338  }
1339  // check if data elements has to be loaded at start
1340  if (oc.isSet("data-files") && !oc.getString("data-files").empty() && myNet) {
1341  // obtain vector of data files
1342  std::vector<std::string> dataElementsFiles = oc.getStringVector("data-files");
1343  // disable update data
1345  // begin undolist
1346  myUndoList->begin(Supermode::DATA, GUIIcon::SUPERMODEDATA, "loading data elements from '" + toString(dataElementsFiles) + "'");
1347  // disable save data elements (because data elements were loaded through console)
1349  // iterate over every data file
1350  for (const auto& dataElementsFile : dataElementsFiles) {
1351  WRITE_MESSAGE("Loading data elements from '" + dataElementsFile + "'");
1352  GNEDataHandler dataHandler(myNet, dataElementsFile, true);
1353  // disable validation for data elements
1354  XMLSubSys::setValidation("never", "auto", "auto");
1355  if (!dataHandler.parse()) {
1356  WRITE_ERROR("Loading of " + dataElementsFile + " failed.");
1357  } else {
1358  // set first dataElementsFiles as default file
1359  oc.resetWritable();
1360  oc.set("data-files", dataElementsFile);
1361  }
1362  // disable validation for data elements
1363  XMLSubSys::setValidation("auto", "auto", "auto");
1364  // enable demand elements if there is an error creating element
1365  if (dataHandler.isErrorCreatingElement()) {
1367  } else {
1369  }
1370  }
1371  // end undolist
1372  myUndoList->end();
1373  // enable update data
1375  }
1376  // check if additionals output must be changed
1377  if (oc.isSet("additionals-output")) {
1378  // overwrite "additional-files" with value "additionals-output"
1379  oc.resetWritable();
1380  oc.set("additional-files", oc.getString("additionals-output"));
1381  }
1382  // check if demand elements output must be changed
1383  if (oc.isSet("demandelements-output")) {
1384  // overwrite "route-files" with value "demandelements-output"
1385  oc.resetWritable();
1386  oc.set("route-files", oc.getString("demandelements-output"));
1387  }
1388  // check if data elements output must be changed
1389  if (oc.isSet("dataelements-output")) {
1390  // overwrite "data-files" with value "dataelements-output"
1391  oc.resetWritable();
1392  oc.set("data-files", oc.getString("dataelements-output"));
1393  }
1394  // after loading net shouldn't be saved
1395  if (myNet) {
1396  myNet->requireSaveNet(false);
1397  }
1398  // write reload message
1399  if (myReloading) {
1400  WRITE_MESSAGE(TL("Reload successfully"));
1401  myReloading = false;
1402  }
1403  // update app
1404  update();
1405  // restore focus
1406  setFocus();
1407 }
1408 
1409 
1410 void
1412  GUIEvent_Message* ec = static_cast<GUIEvent_Message*>(e);
1413  myMessageWindow->appendMsg(ec->getOwnType(), ec->getMsg());
1414 }
1415 
1416 // ---------------------------------------------------------------------------
1417 // private methods
1418 // ---------------------------------------------------------------------------
1419 
1420 void
1422  // build file menu
1423  myFileMenu = new FXMenuPane(this, LAYOUT_FIX_HEIGHT);
1425  myFileMenuSUMOConfig = new FXMenuPane(this);
1426  myFileMenuTLS = new FXMenuPane(this);
1427  myFileMenuEdgeTypes = new FXMenuPane(this);
1428  myFileMenuAdditionals = new FXMenuPane(this);
1429  myFileMenuDemandElements = new FXMenuPane(this);
1430  myFileMenuDataElements = new FXMenuPane(this);
1433  // build recent files
1435  new FXMenuSeparator(myFileMenu);
1437  TL("&Quit"), "Ctrl+Q", TL("Quit the Application."),
1438  nullptr, this, MID_HOTKEY_CTRL_Q_CLOSE);
1439  // build modes menu
1440  myModesMenu = new FXMenuPane(this);
1442  myModesMenuTitle->setTarget(this);
1444  // build Supermode commands and hide it
1447  // build separator between supermodes y modes
1448  new FXMenuSeparator(myModesMenu);
1449  // build modes menu commands
1451  // build edit menu
1452  myEditMenu = new FXMenuPane(this);
1454  // build edit menu commands
1456  // build separator
1457  new FXMenuSeparator(myEditMenu);
1458  // build view options
1462  // hide view options
1466  // build view menu commands
1468  // build separator
1469  new FXMenuSeparator(myEditMenu);
1470  // build front element menu commands
1472  // build separator
1473  new FXMenuSeparator(myEditMenu);
1474  // build open in sumo menu commands
1476  // build lock menu
1477  myLockMenu = new FXMenuPane(this);
1479  myLockMenuTitle->setTarget(this);
1481  // build lock menu commands
1483  // build processing menu (trigger netbuild computations)
1484  myProcessingMenu = new FXMenuPane(this);
1487  // build locate menu
1488  myLocatorMenu = new FXMenuPane(this);
1491  // build tools menu
1492  myToolsMenu = new FXMenuPane(this);
1495  // build windows menu
1496  myWindowMenu = new FXMenuPane(this);
1499  // build help menu
1500  myHelpMenu = new FXMenuPane(this);
1502  // build help menu commands
1503  GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Online Documentation"), "F1", TL("Open Online documentation."),
1504  nullptr, this, MID_HOTKEY_F1_ONLINEDOCUMENTATION);
1505  new FXMenuSeparator(myEditMenu);
1506  GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Changelog"), "", TL("Open Changelog."),
1507  nullptr, this, MID_CHANGELOG);
1508  GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Hotkeys"), "", TL("Open Hotkeys."),
1509  nullptr, this, MID_HOTKEYS);
1510  GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&Tutorial"), "", TL("Open Tutorial."),
1511  nullptr, this, MID_TUTORIAL);
1512  new FXMenuSeparator(myEditMenu);
1513  GUIDesigns::buildFXMenuCommandShortcut(myHelpMenu, TL("&About"), "F12", TL("About netedit."),
1515 }
1516 
1517 
1518 void
1519 GNEApplicationWindow::loadConfigOrNet(const std::string file, bool isNet, bool isReload, bool useStartupOptions, bool newNet) {
1521  getApp()->beginWaitCursor();
1522  myAmLoading = true;
1523  myReloading = isReload;
1524  closeAllWindows();
1525  if (isReload) {
1526  myLoadThread->start();
1527  setStatusBarText("Reloading.");
1528  } else {
1529  gSchemeStorage.saveViewport(0, 0, -1, 0); // recenter view
1530  myLoadThread->loadConfigOrNet(file, isNet, useStartupOptions, newNet);
1531  setStatusBarText("Loading '" + file + "'.");
1532  }
1533  // show supermode commands menu
1535  // show Network command menus (because Network is the default supermode)
1537  // update window
1538  update();
1539 }
1540 
1541 
1542 FXGLCanvas*
1544  // NETEDIT uses only a single View, then return nullptr
1545  return nullptr;
1546 }
1547 
1548 
1549 SUMOTime
1551  return 0;
1552 }
1553 
1554 
1555 double
1557  return 1;
1558 }
1559 
1560 
1561 GNEUndoList*
1563  return myUndoList;
1564 }
1565 
1566 
1569  return myUndoListDialog;
1570 }
1571 
1572 
1573 GNEViewNet*
1575  return myViewNet;
1576 }
1577 
1578 
1581  return myToolbarsGrip;
1582 }
1583 
1584 
1585 void
1587  if (myViewNet && myViewNet->getNet()) {
1588  // show
1590  // set label depending of recomputing
1591  if (myNet->getAttributeCarriers()->getJunctions().empty() || myNet->isNetRecomputed()) {
1592  myRequireRecomputingButton->setText("");
1593  myRequireRecomputingButton->setTipText("Network computed");
1595  myRequireRecomputingButton->setBackColor(FXRGBA(240, 255, 205, 255));
1596  } else {
1597  myRequireRecomputingButton->setText(TL("Press F5"));
1598  myRequireRecomputingButton->setTipText("Network requires recomputing");
1600  myRequireRecomputingButton->setBackColor(FXRGBA(253, 255, 206, 255));
1601  }
1602  } else {
1603  // hide
1605  }
1606 }
1607 
1608 
1609 void
1611  // check if view has to be saved
1612  if (myViewNet) {
1614  }
1615  // lock tracker
1616  myTrackerLock.lock();
1617  // remove trackers and other external windows
1618  while (!myGLWindows.empty()) {
1619  delete myGLWindows.front();
1620  }
1621  myViewNet = nullptr;
1622  for (FXMainWindow* const window : myTrackerWindows) {
1623  window->destroy();
1624  delete window;
1625  }
1626  myTrackerWindows.clear();
1627  // reset the caption
1628  setTitle(myTitlePrefix);
1629  // unlock tracker
1630  myTrackerLock.unlock();
1631  // remove coordinate information
1632  myGeoCoordinate->setText(TL("N/A"));
1633  myCartesianCoordinate->setText(TL("N/A"));
1634  if (myTestCoordinate) {
1635  myTestCoordinate->setText(TL("N/A"));
1636  }
1637  // check if net can be deleted
1638  if (myNet != nullptr) {
1639  delete myNet;
1640  myNet = nullptr;
1642  }
1644  // Reset textures
1646  // reset fonts
1648  // disable saving command
1650 }
1651 
1652 
1653 FXCursor*
1655  return getApp()->getDefaultCursor(DEF_ARROW_CURSOR);
1656 }
1657 
1658 
1659 void
1662  // Disable normalization preserve the given network as far as possible
1663  oc.set("offset.disable-normalization", "true");
1664  loadConfigOrNet("", true, false, true, oc.getBool("new"));
1665 }
1666 
1667 
1668 void
1669 GNEApplicationWindow::loadNet(const std::string& file) {
1670  loadConfigOrNet(file, true);
1671 }
1672 
1673 
1674 void
1675 GNEApplicationWindow::setStatusBarText(const std::string& statusBarText) {
1676  myStatusbar->getStatusLine()->setText(statusBarText.c_str());
1677  myStatusbar->getStatusLine()->setNormalText(statusBarText.c_str());
1678 }
1679 
1680 
1681 long
1683  // obtain option container
1685  // declare variable to save FXMessageBox outputs.
1686  FXuint answer = 0;
1687  // declare string to save paths in wich additionals, shapes demand and data elements will be saved
1688  std::string additionalsSavePath = oc.getString("additional-files");
1689  std::string demandElementsSavePath = oc.getString("route-files");
1690  std::string dataElementsSavePath = oc.getString("data-files");
1691  // write warning if netedit is running in testing mode
1692  WRITE_DEBUG("Opening FXMessageBox 'Volatile Recomputing'");
1693  // open question dialog box
1694  answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, TL("Recompute with volatile options"),
1695  "Changes produced in the net due a recomputing with volatile options cannot be undone. Continue?");
1696  if (answer != 1) { //1:yes, 2:no, 4:esc
1697  // write warning if netedit is running in testing mode
1698  if (answer == 2) {
1699  WRITE_DEBUG("Closed FXMessageBox 'Volatile Recomputing' with 'No'");
1700  } else if (answer == 4) {
1701  WRITE_DEBUG("Closed FXMessageBox 'Volatile Recomputing' with 'ESC'");
1702  }
1703  // abort recompute with volatile options
1704  return 0;
1705  } else {
1706  // write warning if netedit is running in testing mode
1707  WRITE_DEBUG("Closed FXMessageBox 'Volatile Recomputing' with 'Yes'");
1708  // Check if there are additionals in our net
1710  // ask user if want to save additionals if weren't saved previously
1711  if (oc.getString("additional-files") == "") {
1712  // write warning if netedit is running in testing mode
1713  WRITE_DEBUG("Opening FXMessageBox 'Save additionals before recomputing'");
1714  // open question dialog box
1715  answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, TL("Save additionals before recomputing with volatile options"),
1716  "Would you like to save additionals before recomputing?");
1717  if (answer != 1) { //1:yes, 2:no, 4:esc
1718  // write warning if netedit is running in testing mode
1719  if (answer == 2) {
1720  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before recomputing' with 'No'");
1721  } else if (answer == 4) {
1722  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before recomputing' with 'ESC'");
1723  }
1724  } else {
1725  // write warning if netedit is running in testing mode
1726  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before recomputing' with 'Yes'");
1727  // Open a dialog to set filename output
1728  FXString file = MFXUtils::getFilename2Write(this,
1729  TL("Save demand element file"), ".xml",
1731  gCurrentFolder).text();
1732  // add xml extension
1733  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
1734  // check that file is valid
1735  if (fileWithExtension != "") {
1736  // update additional files
1737  oc.resetWritable();
1738  oc.set("additional-files", fileWithExtension);
1739  // set obtanied filename output into additionalsSavePath (can be "")
1740  additionalsSavePath = oc.getString("additional-files");
1741  }
1742  }
1743  }
1744  // Check if additional must be saved in a temporary directory, if user didn't define a directory for additionals
1745  if (oc.getString("additional-files") == "") {
1746  // Obtain temporary directory provided by FXSystem::getCurrentDirectory()
1747  additionalsSavePath = FXSystem::getTempDirectory().text() + std::string("/tmpAdditionalsNetedit.xml");
1748  }
1749  // Start saving additionals
1750  getApp()->beginWaitCursor();
1751  try {
1752  myNet->saveAdditionals(additionalsSavePath);
1753  } catch (IOError& e) {
1754  // write warning if netedit is running in testing mode
1755  WRITE_DEBUG("Opening FXMessageBox 'Error saving additionals before recomputing'");
1756  // open error message box
1757  FXMessageBox::error(this, MBOX_OK, TL("Saving additionals in temporary folder failed!"), "%s", e.what());
1758  // write warning if netedit is running in testing mode
1759  WRITE_DEBUG("Closed FXMessageBox 'Error saving additionals before recomputing' with 'OK'");
1760  }
1761  // end saving additionals
1763  getApp()->endWaitCursor();
1764  // restore focus
1765  setFocus();
1766  } else {
1767  // clear additional path
1768  additionalsSavePath = "";
1769  }
1770  // Check if there are demand elements in our net
1772  // ask user if want to save demand elements if weren't saved previously
1773  if (oc.getString("route-files") == "") {
1774  // write warning if netedit is running in testing mode
1775  WRITE_DEBUG("Opening FXMessageBox 'Save demand elements before recomputing'");
1776  // open question dialog box
1777  answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, TL("Save demand elements before recomputing with volatile options"),
1778  "Would you like to save demand elements before recomputing?");
1779  if (answer != 1) { //1:yes, 2:no, 4:esc
1780  // write warning if netedit is running in testing mode
1781  if (answer == 2) {
1782  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before recomputing' with 'No'");
1783  } else if (answer == 4) {
1784  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before recomputing' with 'ESC'");
1785  }
1786  } else {
1787  // write warning if netedit is running in testing mode
1788  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before recomputing' with 'Yes'");
1789  // Open a dialog to set filename output
1790  FXString file = MFXUtils::getFilename2Write(this,
1791  TL("Save demand element file"), ".rou.xml",
1793  gCurrentFolder).text();
1794  // add xml extension
1795  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
1796  // check that file is valid
1797  if (fileWithExtension != "") {
1798  // update route files
1799  oc.resetWritable();
1800  oc.set("route-files", fileWithExtension);
1801  // set obtanied filename output into demand elementSavePath (can be "")
1802  demandElementsSavePath = oc.getString("route-files");
1803  }
1804  }
1805  }
1806  // Check if demand element must be saved in a temporary directory, if user didn't define a directory for demand elements
1807  if (oc.getString("route-files") == "") {
1808  // Obtain temporary directory provided by FXSystem::getCurrentDirectory()
1809  demandElementsSavePath = FXSystem::getTempDirectory().text() + std::string("/tmpDemandElementsNetedit.xml");
1810  }
1811  // Start saving demand elements
1812  getApp()->beginWaitCursor();
1813  try {
1814  myNet->saveDemandElements(demandElementsSavePath);
1815  } catch (IOError& e) {
1816  // write warning if netedit is running in testing mode
1817  WRITE_DEBUG("Opening FXMessageBox 'Error saving demand elements before recomputing'");
1818  // open error message box
1819  FXMessageBox::error(this, MBOX_OK, TL("Saving demand elements in temporary folder failed!"), "%s", e.what());
1820  // write warning if netedit is running in testing mode
1821  WRITE_DEBUG("Closed FXMessageBox 'Error saving demand elements before recomputing' with 'OK'");
1822  }
1823  // end saving demand elements
1825  getApp()->endWaitCursor();
1826  // restore focus
1827  setFocus();
1828  } else {
1829  // clear demand element path
1830  demandElementsSavePath = "";
1831  }
1832  // Check if there are data elements in our net
1833  if (myNet->getAttributeCarriers()->getDataSets().size() > 0) {
1834  // ask user if want to save data elements if weren't saved previously
1835  if (oc.getString("data-files") == "") {
1836  // write warning if netedit is running in testing mode
1837  WRITE_DEBUG("Opening FXMessageBox 'Save data elements before recomputing'");
1838  // open question dialog box
1839  answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, TL("Save data elements before recomputing with volatile options"),
1840  "Would you like to save data elements before recomputing?");
1841  if (answer != 1) { //1:yes, 2:no, 4:esc
1842  // write warning if netedit is running in testing mode
1843  if (answer == 2) {
1844  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before recomputing' with 'No'");
1845  } else if (answer == 4) {
1846  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before recomputing' with 'ESC'");
1847  }
1848  } else {
1849  // write warning if netedit is running in testing mode
1850  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before recomputing' with 'Yes'");
1851  // Open a dialog to set filename output
1852  FXString file = MFXUtils::getFilename2Write(this,
1853  TL("Save data element file"), ".rou.xml",
1855  gCurrentFolder).text();
1856  // add xml extension
1857  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
1858  // check that file is valid
1859  if (fileWithExtension != "") {
1860  // update data files
1861  oc.resetWritable();
1862  oc.set("data-files", fileWithExtension);
1863  // set obtanied filename output into data elementSavePath (can be "")
1864  dataElementsSavePath = oc.getString("data-files");
1865  }
1866  }
1867  }
1868  // Check if data element must be saved in a temporary directory, if user didn't define a directory for data elements
1869  if (oc.getString("data-files") == "") {
1870  // Obtain temporary directory provided by FXSystem::getCurrentDirectory()
1871  dataElementsSavePath = FXSystem::getTempDirectory().text() + std::string("/tmpDataElementsNetedit.xml");
1872  }
1873  // Start saving data elements
1874  getApp()->beginWaitCursor();
1875  try {
1876  myNet->saveDataElements(dataElementsSavePath);
1877  } catch (IOError& e) {
1878  // write warning if netedit is running in testing mode
1879  WRITE_DEBUG("Opening FXMessageBox 'Error saving data elements before recomputing'");
1880  // open error message box
1881  FXMessageBox::error(this, MBOX_OK, TL("Saving data elements in temporary folder failed!"), "%s", e.what());
1882  // write warning if netedit is running in testing mode
1883  WRITE_DEBUG("Closed FXMessageBox 'Error saving data elements before recomputing' with 'OK'");
1884  }
1885  // end saving data elements
1887  getApp()->endWaitCursor();
1888  // restore focus
1889  setFocus();
1890  } else {
1891  // clear data element path
1892  dataElementsSavePath = "";
1893  }
1894  // compute with volatile options
1895  myNet->computeNetwork(this, true, true, additionalsSavePath, demandElementsSavePath, dataElementsSavePath);
1896  updateControls();
1897  return 1;
1898  }
1899 }
1900 
1901 
1902 void
1905 }
1906 
1907 
1908 void
1912 }
1913 
1914 
1915 void
1919 }
1920 
1921 
1922 void
1926 }
1927 
1928 
1929 void
1933 }
1934 
1935 
1936 void
1940 }
1941 
1942 
1943 void
1947 }
1948 
1949 
1950 long
1951 GNEApplicationWindow::onCmdSetSuperMode(FXObject* sender, FXSelector sel, void* ptr) {
1952  // check that currently there is a View
1953  if (myViewNet) {
1954  myViewNet->onCmdSetSupermode(sender, sel, ptr);
1955  }
1956  return 1;
1957 }
1958 
1959 
1960 long
1961 GNEApplicationWindow::onCmdSetMode(FXObject* sender, FXSelector sel, void* ptr) {
1962  // check that currently there is a View
1963  if (myViewNet) {
1964  myViewNet->onCmdSetMode(sender, sel, ptr);
1965  }
1966  return 1;
1967 }
1968 
1969 
1970 long
1971 GNEApplicationWindow::onCmdLockElements(FXObject*, FXSelector, void*) {
1972  if (myViewNet) {
1974  }
1975  return 1;
1976 }
1977 
1978 
1979 long
1980 GNEApplicationWindow::onCmdLockAllElements(FXObject*, FXSelector, void*) {
1981  // lock all
1984  return 1;
1985 }
1986 
1987 
1988 long
1989 GNEApplicationWindow::onCmdUnlockAllElements(FXObject*, FXSelector, void*) {
1990  // unlock all
1993  return 1;
1994 }
1995 
1996 
1997 long
1998 GNEApplicationWindow::onCmdLockSelectElements(FXObject*, FXSelector, void*) {
1999  if (myViewNet) {
2000  myViewNet->update();
2001  }
2002  return 1;
2003 }
2004 
2005 
2006 long
2007 GNEApplicationWindow::onUpdLockMenuTitle(FXObject*, FXSelector, void*) {
2008  if (myViewNet) {
2010  // supermode network
2016  myLockMenuTitle->enable();
2017  } else {
2018  myLockMenuTitle->disable();
2019  }
2021  // supermode demand
2026  myLockMenuTitle->enable();
2027  } else {
2028  myLockMenuTitle->disable();
2029  }
2030  } else if (myViewNet->getEditModes().isCurrentSupermodeData()) {
2031  // supermode data
2035  myLockMenuTitle->enable();
2036  } else {
2037  myLockMenuTitle->disable();
2038  }
2039  } else {
2040  myLockMenuTitle->disable();
2041  }
2042  } else {
2043  myLockMenuTitle->disable();
2044  }
2045  return 1;
2046 }
2047 
2048 long
2049 GNEApplicationWindow::onCmdProcessButton(FXObject*, FXSelector sel, void*) {
2050  // first check if there is a view
2051  if (myViewNet) {
2052  // process depending of supermode
2054  // check what FXMenuCommand was called
2055  switch (FXSELID(sel)) {
2057  // show extra information for tests
2058  WRITE_DEBUG("Key F5 (Compute) pressed");
2059  myNet->computeNetwork(this, true, false);
2060  updateControls();
2061  break;
2063  // show extra information for tests
2064  WRITE_DEBUG("Keys Shift + F5 (Compute with volatile options) pressed");
2066  break;
2068  // show extra information for tests
2069  WRITE_DEBUG("Key F6 (Clean junction) pressed");
2071  break;
2073  // show extra information for tests
2074  WRITE_DEBUG("Key F7 (Join junctions) pressed");
2076  break;
2078  // show extra information for tests
2079  WRITE_DEBUG("Key F8 (Clean invalid crossings) pressed");
2081  break;
2082  default:
2083  break;
2084  }
2086  // check what FXMenuCommand was called
2087  switch (FXSELID(sel)) {
2089  // show extra information for tests
2090  WRITE_DEBUG("Key F5 (Compute) pressed");
2092  updateControls();
2093  break;
2095  // show extra information for tests
2096  WRITE_DEBUG("Key F6 (RemoveUnusedRoutes) pressed");
2098  break;
2100  // show extra information for tests
2101  WRITE_DEBUG("Key F7 (JoinRoutes) pressed");
2103  break;
2105  // show extra information for tests
2106  WRITE_DEBUG("Key F7 (AdjustPersonPlans) pressed");
2108  break;
2110  // show extra information for tests
2111  WRITE_DEBUG("Key F8 (CleanInvalidDemandElements) pressed");
2113  break;
2114  default:
2115  break;
2116  }
2117  }
2118  }
2119  return 1;
2120 }
2121 
2122 
2123 long
2124 GNEApplicationWindow::onCmdNewWindow(FXObject*, FXSelector, void*) {
2125  FXRegistry reg("SUMO netedit", "netedit");
2126  std::string netedit = "netedit";
2127  const char* sumoPath = getenv("SUMO_HOME");
2128  if (sumoPath != nullptr) {
2129  std::string newPath = std::string(sumoPath) + "/bin/netedit";
2130  if (FileHelpers::isReadable(newPath) || FileHelpers::isReadable(newPath + ".exe")) {
2131  netedit = "\"" + newPath + "\"";
2132  }
2133  }
2134  std::string cmd = netedit;
2135  // start in background
2136 #ifndef WIN32
2137  cmd = cmd + " &";
2138 #else
2139  // see "help start" for the parameters
2140  cmd = "start /B \"\" " + cmd;
2141 #endif
2142  WRITE_MESSAGE("Running " + cmd + ".");
2143  // yay! fun with dangerous commands... Never use this over the internet
2145  return 1;
2146 }
2147 
2148 
2149 long
2150 GNEApplicationWindow::onCmdOpenSUMOGUI(FXObject*, FXSelector, void*) {
2151  // check that currently there is a View
2152  if (myViewNet) {
2153  // first check if network is saved
2154  if (!myViewNet->getNet()->isNetSaved()) {
2155  // save network
2156  onCmdSaveNetwork(nullptr, 0, nullptr);
2157  if (!myViewNet->getNet()->isNetSaved()) {
2158  return 0;
2159  }
2160  }
2161  // now check if additionals must be loaded and are saved
2162  if ((myEditMenuCommands.loadAdditionalsInSUMOGUI->getCheck() == TRUE) &&
2164  // save additionals
2165  onCmdSaveAdditionals(nullptr, 0, nullptr);
2166  // check if additionals were successfully saved. If not, abort
2167  if (!myViewNet->getNet()->isAdditionalsSaved()) {
2168  return 0;
2169  }
2170  }
2171  // finally check if demand elements must be loaded and are saved
2172  if ((myEditMenuCommands.loadDemandInSUMOGUI->getCheck() == TRUE) &&
2174  // save additionals
2175  onCmdSaveDemandElements(nullptr, 0, nullptr);
2176  // check if demand elements were successfully saved. If not, abort
2177  if (!myViewNet->getNet()->isDemandElementsSaved()) {
2178  return 0;
2179  }
2180  }
2181  // obtain viewport
2182  FXRegistry reg("SUMO GUI", "sumo-gui");
2183  reg.read();
2184  reg.writeRealEntry("viewport", "x", myViewNet->getChanger().getXPos());
2185  reg.writeRealEntry("viewport", "y", myViewNet->getChanger().getYPos());
2186  reg.writeRealEntry("viewport", "z", myViewNet->getChanger().getZPos());
2187  reg.write();
2188  std::string sumogui = "sumo-gui";
2189  const char* sumoPath = getenv("SUMO_HOME");
2190  if (sumoPath != nullptr) {
2191  std::string newPath = std::string(sumoPath) + "/bin/sumo-gui";
2192  if (FileHelpers::isReadable(newPath) || FileHelpers::isReadable(newPath + ".exe")) {
2193  sumogui = "\"" + newPath + "\"";
2194  }
2195  }
2196  // declare comand
2197  std::string cmd = sumogui + " --registry-viewport" + " -n " + "\"" + OptionsCont::getOptions().getString("output-file") + "\"";
2198  // obtainer options container
2200  // if load additionals is enabled, add it to command
2201  if ((myEditMenuCommands.loadAdditionalsInSUMOGUI->getCheck() == TRUE) && (oc.getString("additional-files").size() > 0)) {
2202  cmd += " -a \"" + oc.getString("additional-files") + "\"";
2203  }
2204  // if load demand is enabled, add it to command
2205  if ((myEditMenuCommands.loadDemandInSUMOGUI->getCheck() == TRUE) && (oc.getString("route-files").size() > 0)) {
2206  cmd += " -r \"" + oc.getString("route-files") + "\"";
2207  }
2208  // if we have trips or flow over junctions, add option junction-taz
2211  cmd += " --junction-taz";
2212  }
2213  // start in background
2214 #ifndef WIN32
2215  cmd = cmd + " &";
2216 #else
2217  // see "help start" for the parameters
2218  cmd = "start /B \"\" " + cmd;
2219 #endif
2220  WRITE_MESSAGE("Running " + cmd + ".");
2221  // yay! fun with dangerous commands... Never use this over the internet
2223  }
2224  return 1;
2225 }
2226 
2227 
2228 long
2229 GNEApplicationWindow::onCmdAbort(FXObject*, FXSelector, void*) {
2230  // check that view exists
2231  if (myViewNet) {
2232  // show extra information for tests
2233  WRITE_DEBUG("Key ESC (abort) pressed");
2234  // first check if we're selecting a subset of edges in TAZ Frame
2236  // show extra information for tests
2237  WRITE_DEBUG("Cleaning current selected edges");
2238  // clear current selection
2240  } else if (myViewNet->getViewParent()->getInspectorFrame()->shown()) {
2241  // check if stop select parent
2243  // show extra information for tests
2244  WRITE_DEBUG("Stop select new parent");
2245  // and stop select paretn
2247  } else {
2248  // show extra information for tests
2249  WRITE_DEBUG("Cleaning inspected elements");
2250  // clear inspected elements
2252  }
2253  } else {
2254  // abort current operation
2256  }
2257  }
2258  return 1;
2259 }
2260 
2261 
2262 long
2263 GNEApplicationWindow::onCmdDel(FXObject*, FXSelector, void*) {
2264  // check that view exists
2265  if (myViewNet) {
2266  // show extra information for tests
2267  WRITE_DEBUG("Key DEL (delete) pressed");
2268  myViewNet->hotkeyDel();
2269  }
2270  return 1;
2271 }
2272 
2273 
2274 long
2275 GNEApplicationWindow::onCmdEnter(FXObject*, FXSelector, void*) {
2276  // check that view exists
2277  if (myViewNet) {
2278  // show extra information for tests
2279  WRITE_DEBUG("Key ENTER pressed");
2281  }
2282  return 1;
2283 }
2284 
2285 
2286 long
2287 GNEApplicationWindow::onCmdBackspace(FXObject*, FXSelector, void*) {
2288  // check that view exists
2289  if (myViewNet) {
2290  // show extra information for tests
2291  WRITE_DEBUG("Key BACKSPACE pressed");
2293  }
2294  return 1;
2295 }
2296 
2297 long
2298 GNEApplicationWindow::onCmdForceSaveNetwork(FXObject* /*sender*/, FXSelector /*sel*/, void* /*ptr*/) {
2299  // check that view exists
2300  if (myViewNet) {
2301  myViewNet->getNet()->requireSaveNet(true);
2302  myViewNet->update();
2303  }
2304  return 1;
2305 }
2306 
2307 
2308 long
2309 GNEApplicationWindow::onCmdForceSaveAdditionals(FXObject* /*sender*/, FXSelector /*sel*/, void* /*ptr*/) {
2310  // check that view exists
2311  if (myViewNet) {
2313  update();
2314  }
2315  return 1;
2316 }
2317 
2318 
2319 long
2320 GNEApplicationWindow::onCmdForceSaveDemandElements(FXObject* /*sender*/, FXSelector /*sel*/, void* /*ptr*/) {
2321  // check that view exists
2322  if (myViewNet) {
2324  update();
2325  }
2326  return 1;
2327 }
2328 
2329 
2330 long
2331 GNEApplicationWindow::onCmdForceSaveDataElements(FXObject* /*sender*/, FXSelector /*sel*/, void* /*ptr*/) {
2332  // check that view exists
2333  if (myViewNet) {
2335  update();
2336  }
2337  return 1;
2338 }
2339 
2340 
2341 long
2342 GNEApplicationWindow::onCmdFocusFrame(FXObject*, FXSelector, void*) {
2343  // check that view exists
2344  if (myViewNet) {
2346  }
2347  return 1;
2348 }
2349 
2350 
2351 long
2352 GNEApplicationWindow::onUpdRequireViewNet(FXObject* sender, FXSelector, void*) {
2353  // enable or disable sender element depending of viewNet
2354  sender->handle(this, myViewNet ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2355  return 1;
2356 }
2357 
2358 
2359 long
2360 GNEApplicationWindow::onUpdRequireRecomputing(FXObject*, FXSelector, void*) {
2362  return 1;
2363 }
2364 
2365 
2366 long
2367 GNEApplicationWindow::onCmdEditViewport(FXObject*, FXSelector, void*) {
2368  // check that view exists
2369  if (myViewNet) {
2371  }
2372  return 1;
2373 }
2374 
2375 
2376 long
2377 GNEApplicationWindow::onCmdEditViewScheme(FXObject*, FXSelector, void*) {
2378  // check that view exists
2379  if (myViewNet) {
2381  }
2382  return 1;
2383 }
2384 
2385 
2386 long
2387 GNEApplicationWindow::onCmdToggleGrid(FXObject* obj, FXSelector sel, void* ptr) {
2388  // check that view exists
2389  if (myViewNet) {
2390  // show debug info
2392  // show extra information for tests
2393  WRITE_DEBUG("Disabled grid throught Ctrl+g hotkey");
2394  } else {
2395  // show extra information for tests
2396  WRITE_DEBUG("Enabled grid throught Ctrl+g hotkey");
2397  }
2398  // Call manually toggle grid function
2399  myViewNet->onCmdToggleShowGrid(obj, sel, ptr);
2400  }
2401  return 1;
2402 }
2403 
2404 
2405 long
2406 GNEApplicationWindow::onCmdToggleDrawJunctionShape(FXObject* obj, FXSelector sel, void* ptr) {
2407  // check that view exists
2408  if (myViewNet) {
2409  // show debug info
2411  // show extra information for tests
2412  WRITE_DEBUG("Disabled draw junction shape throught Ctrl+j hotkey");
2413  } else {
2414  // show extra information for tests
2415  WRITE_DEBUG("Enabled draw junction shape throught Ctrl+j hotkey");
2416  }
2417  // Call manually toggle junction shape function
2418  myViewNet->onCmdToggleDrawJunctionShape(obj, sel, ptr);
2419  }
2420  return 1;
2421 }
2422 
2423 
2424 long
2425 GNEApplicationWindow::onCmdSetFrontElement(FXObject*, FXSelector, void*) {
2426  if (myViewNet) {
2427  if (myViewNet->getViewParent()->getInspectorFrame()->shown()) {
2428  // get inspected AC
2429  GNEAttributeCarrier* inspectedAC = (myViewNet->getInspectedAttributeCarriers().size() == 1) ? myViewNet->getInspectedAttributeCarriers().front() : nullptr;
2430  // set or clear front attribute
2431  if (myViewNet->getFrontAttributeCarrier() == inspectedAC) {
2433  } else {
2434  myViewNet->setFrontAttributeCarrier(inspectedAC);
2435  }
2437  } else {
2439  }
2440  }
2441  return 1;
2442 }
2443 
2444 
2445 long
2446 GNEApplicationWindow::onCmdToggleEditOptions(FXObject* obj, FXSelector sel, void* /* ptr */) {
2447  // first check that we have a ViewNet
2448  if (myViewNet) {
2449  // first check what selector was called
2450  int numericalKeyPressed = sel - FXSEL(SEL_COMMAND, MID_HOTKEY_ALT_0_TOGGLEEDITOPTION) - 1;
2451  // check that numericalKeyPressed is valid
2452  if ((numericalKeyPressed < 0) || (numericalKeyPressed > 10)) {
2453  return 1;
2454  }
2455  // declare a vector in which save visible menu commands
2456  std::vector<MFXCheckableButton*> visibleMenuCommands;
2457  // get common, network and demand visible menu commands
2461  // now check that numericalKeyPressed isn't greather than visible view options
2462  if (numericalKeyPressed >= (int)visibleMenuCommands.size()) {
2463  return 1;
2464  }
2465  // toggle edit options
2467  visibleMenuCommands.at(numericalKeyPressed), numericalKeyPressed, obj, sel)) {
2468  return 1;
2470  visibleMenuCommands.at(numericalKeyPressed), numericalKeyPressed, obj, sel)) {
2471  return 1;
2473  visibleMenuCommands.at(numericalKeyPressed), numericalKeyPressed, obj, sel)) {
2474  return 1;
2475  }
2476  }
2477  return 1;
2478 }
2479 
2480 
2481 long
2482 GNEApplicationWindow::onCmdHelp(FXObject*, FXSelector, void*) {
2483  MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/netedit.html");
2484  return 1;
2485 }
2486 
2487 
2488 long
2489 GNEApplicationWindow::onCmdChangelog(FXObject*, FXSelector, void*) {
2490  // update in every version
2491  MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/ChangeLog.html");
2492  return 1;
2493 }
2494 
2495 
2496 long
2497 GNEApplicationWindow::onCmdHotkeys(FXObject*, FXSelector, void*) {
2498  MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/sumo-gui.html#keyboard_shortcuts");
2499  return 1;
2500 }
2501 
2502 
2503 long
2506  return getApp()->reg().writeBoolEntry("NETEDIT", "RecomputeData", true);
2507  } else {
2508  return getApp()->reg().writeBoolEntry("NETEDIT", "RecomputeData", false);
2509  }
2510 }
2511 
2512 
2513 long
2514 GNEApplicationWindow::onCmdTutorial(FXObject*, FXSelector, void*) {
2515  MFXLinkLabel::fxexecute("https://sumo.dlr.de/docs/Tutorials/index.html");
2516  return 1;
2517 }
2518 
2519 
2520 long
2521 GNEApplicationWindow::onCmdOptions(FXObject*, FXSelector, void*) {
2522  GUIDialog_Options* wizard =
2523  new GUIDialog_Options(this, TL("Configure Options"), getWidth(), getHeight());
2524 
2525  if (wizard->execute()) {
2526  NIFrame::checkOptions(); // needed to set projection parameters
2529  SystemFrame::checkOptions(); // needed to set precision
2530  }
2531  return 1;
2532 }
2533 
2534 
2535 long
2536 GNEApplicationWindow::onCmdUndo(FXObject*, FXSelector, void*) {
2537  WRITE_DEBUG("Keys Ctrl+Z (Undo) pressed");
2538  // Check conditions
2539  if (myViewNet == nullptr) {
2540  return 0;
2541  } else if (!myEditMenuCommands.undoLastChange->isEnabled()) {
2542  return 0;
2543  } else {
2544  // check supermode (currently ignore supermode data)
2547  // abort if user doesn't press "yes"
2549  return 0;
2550  }
2551  }
2552  myViewNet->getUndoList()->undo();
2553  // update current show frame after undo
2556  }
2557  // update manually undo/redo menu commands (see #6005)
2560  // update toolbar undo-redo buttons
2562  return 1;
2563  }
2564 }
2565 
2566 
2567 long
2568 GNEApplicationWindow::onCmdRedo(FXObject*, FXSelector, void*) {
2569  WRITE_DEBUG("Keys Ctrl+Y (Redo) pressed");
2570  // Check conditions
2571  if (myViewNet == nullptr) {
2572  return 0;
2573  } else if (!myEditMenuCommands.redoLastChange->isEnabled()) {
2574  return 0;
2575  } else {
2576  // check supermode (currently ignore supermode data)
2579  // abort if user doesn't press "yes"
2581  return 0;
2582  }
2583  }
2584  myViewNet->getUndoList()->redo();
2585  // update current show frame after redo
2588  }
2589  // update manually undo/redo menu commands (see #6005)
2592  // update toolbar undo-redo buttons
2594  return 1;
2595  }
2596 }
2597 
2598 
2599 long
2600 GNEApplicationWindow::onCmdOpenUndoListDialog(FXObject*, FXSelector, void*) {
2601  // avoid open two dialogs
2602  if (myUndoListDialog->shown()) {
2604  } else {
2606  }
2607  return 1;
2608 }
2609 
2610 
2611 long
2612 GNEApplicationWindow::onUpdOpenUndoListDialog(FXObject* sender, FXSelector, void*) {
2613  // check if net exist and there is something to undo/redo
2614  if (myNet && (myEditMenuCommands.undoLastChange->isEnabled() || myEditMenuCommands.redoLastChange->isEnabled())) {
2615  sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2616  } else {
2617  sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2618  if (myUndoListDialog->shown()) {
2620  }
2621  }
2622  return 1;
2623 }
2624 
2625 
2626 long
2627 GNEApplicationWindow::onCmdComputePathManager(FXObject*, FXSelector, void*) {
2628  // first check viewNet
2630  // update path calculator
2632  }
2633  return 1;
2634 }
2635 
2636 
2637 long
2638 GNEApplicationWindow::onCmdCut(FXObject*, FXSelector, void*) {
2639  WRITE_DEBUG("Key Ctrl+X (Cut) pressed");
2640  // Prepared for #6042
2641  return 1;
2642 }
2643 
2644 
2645 long
2646 GNEApplicationWindow::onCmdCopy(FXObject*, FXSelector, void*) {
2647  WRITE_DEBUG("Key Ctrl+C (Copy) pressed");
2648  // Prepared for #6042
2649  return 1;
2650 }
2651 
2652 
2653 long
2654 GNEApplicationWindow::onCmdPaste(FXObject*, FXSelector, void*) {
2655  WRITE_DEBUG("Key Ctrl+V (Paste) pressed");
2656  // Prepared for #6042
2657  return 1;
2658 }
2659 
2660 
2661 long
2662 GNEApplicationWindow::onCmdSetTemplate(FXObject*, FXSelector, void*) {
2663  WRITE_DEBUG("Key Ctrl+F1 (Set Template) pressed");
2664  // first check if myViewNet exist
2665  if (myViewNet) {
2666  // call set template in inspector frame
2668  }
2669  return 1;
2670 }
2671 
2672 
2673 long
2674 GNEApplicationWindow::onCmdCopyTemplate(FXObject*, FXSelector, void*) {
2675  WRITE_DEBUG("Key Ctrl+F2 (Copy Template) pressed");
2676  // first check if myViewNet exist
2677  if (myViewNet) {
2678  // call copy template in inspector frame
2680  }
2681  return 1;
2682 }
2683 
2684 
2685 long
2686 GNEApplicationWindow::onCmdClearTemplate(FXObject*, FXSelector, void*) {
2687  WRITE_DEBUG("Key Ctrl+F3 (Clear Template) pressed");
2688  // first check if myViewNet exist
2689  if (myViewNet) {
2690  // call clear template in inspector frame
2692  }
2693  return 1;
2694 }
2695 
2696 
2697 long
2698 GNEApplicationWindow::onCmdSaveAsNetwork(FXObject*, FXSelector, void*) {
2699  // declar extensions
2700  const std::string netExtension = ".net.xml";
2701  const std::string zipNetExtension = netExtension + ".gz";
2702  const std::string wildcard = (netExtension + "\n*" + zipNetExtension);
2703  // open dialog
2704  FXString file = MFXUtils::getFilename2Write(this,
2705  TL("Save Network as"), wildcard.c_str(),
2707  gCurrentFolder);
2708  // get file with extension
2709  std::string fileWithExtension = file.text();
2710  // clear wildcard
2711  const size_t pos = fileWithExtension.find(wildcard);
2712  if (pos != std::string::npos) {
2713  // If found then erase it from string
2714  fileWithExtension.erase(pos, wildcard.length());
2715  }
2716  // check xml extension
2717  if (!GNEApplicationWindowHelper::stringEndsWith(fileWithExtension, netExtension) &&
2718  !GNEApplicationWindowHelper::stringEndsWith(fileWithExtension, zipNetExtension)) {
2719  fileWithExtension = FileHelpers::addExtension(fileWithExtension, netExtension);
2720  }
2721  // check that file with extension is valid
2722  if (fileWithExtension != "") {
2724  oc.resetWritable();
2725  oc.set("output-file", fileWithExtension);
2726  setTitle(MFXUtils::getTitleText(myTitlePrefix, fileWithExtension.c_str()));
2727  onCmdSaveNetwork(nullptr, 0, nullptr);
2728  }
2729  return 1;
2730 }
2731 
2732 
2733 long
2734 GNEApplicationWindow::onCmdSaveAsPlainXML(FXObject*, FXSelector, void*) {
2735  // obtain option container
2737  // declare current folder
2738  FXString currentFolder = gCurrentFolder;
2739  // check if there is a saved network
2740  if (oc.getString("output-file").size() > 0) {
2741  // extract folder
2742  currentFolder = getFolder(oc.getString("output-file"));
2743  }
2744  // open dialog
2745  FXString file = MFXUtils::getFilename2Write(this,
2746  TL("Save plain-xml edge-file (other names will be deduced from this)"), "",
2748  currentFolder);
2749  // check that file is valid (note: in this case we don't need to use function FileHelpers::addExtension)
2750  if (file != "") {
2751  std::string prefix = file.text();
2752  // if the name of an edg.xml file was given, remove the suffix
2753  if (StringUtils::endsWith(prefix, ".edg.xml")) {
2754  prefix = prefix.substr(0, prefix.size() - 8);
2755  }
2756  if (StringUtils::endsWith(prefix, ".")) {
2757  prefix = prefix.substr(0, prefix.size() - 1);
2758  }
2759  getApp()->beginWaitCursor();
2760  try {
2761  myNet->savePlain(oc, prefix);
2762  } catch (IOError& e) {
2763  // write warning if netedit is running in testing mode
2764  WRITE_DEBUG("Opening FXMessageBox 'Error saving plainXML'");
2765  // open message box
2766  FXMessageBox::error(this, MBOX_OK, TL("Saving plain xml failed!"), "%s", e.what());
2767  // write warning if netedit is running in testing mode
2768  WRITE_DEBUG("Closed FXMessageBox 'Error saving plainXML' with 'OK'");
2769  }
2770  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Plain XML saved with prefix '" + prefix + "'.\n");
2772  getApp()->endWaitCursor();
2773  // restore focus
2774  setFocus();
2775  }
2776  return 1;
2777 }
2778 
2779 
2780 long
2781 GNEApplicationWindow::onCmdSaveJoined(FXObject*, FXSelector, void*) {
2782  // obtain option container
2784  // declare current folder
2785  FXString currentFolder = gCurrentFolder;
2786  // check if there is a saved network
2787  if (oc.getString("output-file").size() > 0) {
2788  // extract folder
2789  currentFolder = getFolder(oc.getString("output-file"));
2790  }
2791  // open dialog
2792  FXString file = MFXUtils::getFilename2Write(this,
2793  TL("Save joined-junctions"), ".nod.xml",
2795  currentFolder);
2796  // add xml extension
2797  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
2798  // check that file with extension is valid
2799  if (fileWithExtension != "") {
2800  getApp()->beginWaitCursor();
2801  try {
2802  myNet->saveJoined(oc, fileWithExtension);
2803  } catch (IOError& e) {
2804  // write warning if netedit is running in testing mode
2805  WRITE_DEBUG("Opening FXMessageBox 'error saving joined'");
2806  // opening error message
2807  FXMessageBox::error(this, MBOX_OK, TL("Saving joined junctions failed!"), "%s", e.what());
2808  // write warning if netedit is running in testing mode
2809  WRITE_DEBUG("Closed FXMessageBox 'error saving joined' with 'OK'");
2810  }
2811  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Joined junctions saved to '" + fileWithExtension + "'.\n");
2813  getApp()->endWaitCursor();
2814  // restore focus
2815  setFocus();
2816  }
2817  return 1;
2818 }
2819 
2820 
2821 long
2822 GNEApplicationWindow::onUpdNeedsNetwork(FXObject* sender, FXSelector, void*) {
2823  // check if net exist
2824  if (myNet) {
2825  // enable menu cascades
2832  return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2833  } else {
2834  // disable menu cascades
2841  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2842  }
2843 }
2844 
2845 
2846 long
2847 GNEApplicationWindow::onUpdNeedsNetworkElement(FXObject* sender, FXSelector, void*) {
2848  // check if at least there is one edge in the network
2849  if (myNet && (myNet->getAttributeCarriers()->getEdges().size() > 0)) {
2850  return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2851  } else {
2852  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2853  }
2854 }
2855 
2856 
2857 long
2858 GNEApplicationWindow::onUpdNeedsFrontElement(FXObject* sender, FXSelector, void*) {
2859  // check if net, viewnet and front attribute exist
2861  return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2862  } else {
2863  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2864  }
2865 }
2866 
2867 
2868 long
2869 GNEApplicationWindow::onUpdReload(FXObject* sender, FXSelector, void*) {
2870  if ((myNet == nullptr) || !OptionsCont::getOptions().isSet("sumo-net-file")) {
2871  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2872  } else {
2873  return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2874  }
2875 }
2876 
2877 
2878 long
2879 GNEApplicationWindow::onUpdSaveAllElements(FXObject* sender, FXSelector, void*) {
2880  bool enable = false;
2881  if (myNet) {
2882  if (!myNet->isNetSaved()) {
2883  enable = true;
2884  }
2885  if (!myNet->isAdditionalsSaved()) {
2886  enable = true;
2887  }
2888  if (!myNet->isDemandElementsSaved()) {
2889  enable = true;
2890  }
2891  if (!myNet->isDataElementsSaved()) {
2892  enable = true;
2893  }
2894  }
2895  sender->handle(this, enable ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2896  return 1;
2897 }
2898 
2899 
2900 long
2901 GNEApplicationWindow::onUpdSaveNetwork(FXObject* sender, FXSelector, void*) {
2902  return sender->handle(this, ((myNet == nullptr) || myNet->isNetSaved()) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2903 }
2904 
2905 
2906 long
2907 GNEApplicationWindow::onUpdSaveAdditionals(FXObject* sender, FXSelector, void*) {
2908  if (myNet == nullptr) {
2909  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2911  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2912  } else {
2913  return sender->handle(this, myNet->isAdditionalsSaved() ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2914  }
2915 }
2916 
2917 
2918 long
2919 GNEApplicationWindow::onUpdSaveAdditionalsAs(FXObject* sender, FXSelector, void*) {
2920  return sender->handle(this, ((myNet == nullptr) || (myNet->getAttributeCarriers()->getNumberOfAdditionals() == 0)) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2921 }
2922 
2923 
2924 long
2925 GNEApplicationWindow::onUpdSaveDemandElements(FXObject* sender, FXSelector, void*) {
2926  return sender->handle(this, ((myNet == nullptr) || myNet->isDemandElementsSaved()) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2927 }
2928 
2929 
2930 long
2931 GNEApplicationWindow::onUpdSaveDemandElementsAs(FXObject* sender, FXSelector, void*) {
2932  return sender->handle(this, ((myNet == nullptr) || (myNet->getAttributeCarriers()->getNumberOfDemandElements() == 0)) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2933 }
2934 
2935 
2936 long
2937 GNEApplicationWindow::onUpdSaveDataElements(FXObject* sender, FXSelector, void*) {
2938  return sender->handle(this, ((myNet == nullptr) || myNet->isDataElementsSaved()) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2939 }
2940 
2941 
2942 long
2943 GNEApplicationWindow::onUpdSaveDataElementsAs(FXObject* sender, FXSelector, void*) {
2944  return sender->handle(this, ((myNet == nullptr) || (myNet->getAttributeCarriers()->getDataSets().size() == 0)) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2945 }
2946 
2947 
2948 long
2949 GNEApplicationWindow::onUpdUndo(FXObject* obj, FXSelector sel, void* ptr) {
2950  return myUndoList->onUpdUndo(obj, sel, ptr);
2951 }
2952 
2953 
2954 long
2955 GNEApplicationWindow::onUpdRedo(FXObject* obj, FXSelector sel, void* ptr) {
2956  return myUndoList->onUpdRedo(obj, sel, ptr);
2957 }
2958 
2959 
2960 long
2961 GNEApplicationWindow::onUpdComputePathManager(FXObject* sender, FXSelector /*sel*/, void* /*ptr*/) {
2962  // first check viewNet
2963  if (myViewNet) {
2964  // check supermode network
2966  // disable
2967  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2969  // disable
2970  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2971  } else {
2972  // enable
2973  return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2974  }
2975  } else {
2976  // disable
2977  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2978  }
2979 }
2980 
2981 
2982 long
2983 GNEApplicationWindow::onCmdToggleViewOption(FXObject* obj, FXSelector sel, void* ptr) {
2984  // check viewNet
2985  if (myViewNet) {
2986  // continue depending of selector
2987  switch (FXSELID(sel)) {
2988  // Network
2990  return myViewNet->onCmdToggleShowGrid(obj, sel, ptr);
2992  return myViewNet->onCmdToggleDrawJunctionShape(obj, sel, ptr);
2994  return myViewNet->onCmdToggleDrawSpreadVehicles(obj, sel, ptr);
2996  return myViewNet->onCmdToggleShowDemandElementsNetwork(obj, sel, ptr);
2998  return myViewNet->onCmdToggleSelectEdges(obj, sel, ptr);
3000  return myViewNet->onCmdToggleShowConnections(obj, sel, ptr);
3002  return myViewNet->onCmdToggleHideConnections(obj, sel, ptr);
3004  return myViewNet->onCmdToggleShowAdditionalSubElements(obj, sel, ptr);
3006  return myViewNet->onCmdToggleShowTAZElements(obj, sel, ptr);
3008  return myViewNet->onCmdToggleExtendSelection(obj, sel, ptr);
3010  return myViewNet->onCmdToggleChangeAllPhases(obj, sel, ptr);
3012  return myViewNet->onCmdToggleWarnAboutMerge(obj, sel, ptr);
3014  return myViewNet->onCmdToggleShowJunctionBubbles(obj, sel, ptr);
3016  return myViewNet->onCmdToggleMoveElevation(obj, sel, ptr);
3018  return myViewNet->onCmdToggleChainEdges(obj, sel, ptr);
3020  return myViewNet->onCmdToggleAutoOppositeEdge(obj, sel, ptr);
3021  // Demand
3023  return myViewNet->onCmdToggleShowGrid(obj, sel, ptr);
3025  return myViewNet->onCmdToggleDrawJunctionShape(obj, sel, ptr);
3027  return myViewNet->onCmdToggleDrawSpreadVehicles(obj, sel, ptr);
3029  return myViewNet->onCmdToggleHideNonInspecteDemandElements(obj, sel, ptr);
3031  return myViewNet->onCmdToggleHideShapes(obj, sel, ptr);
3033  return myViewNet->onCmdToggleShowTrips(obj, sel, ptr);
3035  return myViewNet->onCmdToggleShowAllPersonPlans(obj, sel, ptr);
3037  return myViewNet->onCmdToggleLockPerson(obj, sel, ptr);
3039  return myViewNet->onCmdToggleShowAllContainerPlans(obj, sel, ptr);
3041  return myViewNet->onCmdToggleLockContainer(obj, sel, ptr);
3043  return myViewNet->onCmdToggleShowOverlappedRoutes(obj, sel, ptr);
3044  // Data
3046  return myViewNet->onCmdToggleDrawJunctionShape(obj, sel, ptr);
3048  return myViewNet->onCmdToggleShowAdditionals(obj, sel, ptr);
3050  return myViewNet->onCmdToggleShowShapes(obj, sel, ptr);
3052  return myViewNet->onCmdToggleShowDemandElementsData(obj, sel, ptr);
3054  return myViewNet->onCmdToggleTAZRelDrawing(obj, sel, ptr);
3056  return myViewNet->onCmdToggleTAZRelDrawing(obj, sel, ptr);
3058  return myViewNet->onCmdToggleTAZRelOnlyFrom(obj, sel, ptr);
3060  return myViewNet->onCmdToggleTAZRelOnlyTo(obj, sel, ptr);
3061  default:
3062  return 0;
3063  }
3064  } else {
3065  return 0;
3066  }
3067 }
3068 
3069 
3070 long
3071 GNEApplicationWindow::onUpdToggleViewOption(FXObject* obj, FXSelector sel, void* /*ptr*/) {
3072  // get menuCheck
3073  MFXMenuCheckIcon* menuCheck = dynamic_cast<MFXMenuCheckIcon*>(obj);
3074  // check viewNet
3075  if (myViewNet && menuCheck) {
3076  // continue depending of selector
3077  switch (FXSELID(sel)) {
3078  // Network
3081  menuCheck->setCheck(TRUE);
3082  } else {
3083  menuCheck->setCheck(FALSE);
3084  }
3085  break;
3088  menuCheck->setCheck(TRUE);
3089  } else {
3090  menuCheck->setCheck(FALSE);
3091  }
3092  break;
3095  menuCheck->setCheck(TRUE);
3096  } else {
3097  menuCheck->setCheck(FALSE);
3098  }
3099  break;
3102  menuCheck->setCheck(TRUE);
3103  } else {
3104  menuCheck->setCheck(FALSE);
3105  }
3106  break;
3109  menuCheck->setCheck(TRUE);
3110  } else {
3111  menuCheck->setCheck(FALSE);
3112  }
3113  break;
3116  menuCheck->setCheck(TRUE);
3117  } else {
3118  menuCheck->setCheck(FALSE);
3119  }
3120  break;
3123  menuCheck->setCheck(TRUE);
3124  } else {
3125  menuCheck->setCheck(FALSE);
3126  }
3127  break;
3130  menuCheck->setCheck(TRUE);
3131  } else {
3132  menuCheck->setCheck(FALSE);
3133  }
3134  break;
3137  menuCheck->setCheck(TRUE);
3138  } else {
3139  menuCheck->setCheck(FALSE);
3140  }
3141  break;
3144  menuCheck->setCheck(TRUE);
3145  } else {
3146  menuCheck->setCheck(FALSE);
3147  }
3148  break;
3151  menuCheck->setCheck(TRUE);
3152  } else {
3153  menuCheck->setCheck(FALSE);
3154  }
3155  break;
3158  menuCheck->setCheck(TRUE);
3159  } else {
3160  menuCheck->setCheck(FALSE);
3161  }
3162  break;
3165  menuCheck->setCheck(TRUE);
3166  } else {
3167  menuCheck->setCheck(FALSE);
3168  }
3169  break;
3172  menuCheck->setCheck(TRUE);
3173  } else {
3174  menuCheck->setCheck(FALSE);
3175  }
3176  break;
3179  menuCheck->setCheck(TRUE);
3180  } else {
3181  menuCheck->setCheck(FALSE);
3182  }
3183  break;
3186  menuCheck->setCheck(TRUE);
3187  } else {
3188  menuCheck->setCheck(FALSE);
3189  }
3190  break;
3191  // Demand
3194  menuCheck->setCheck(TRUE);
3195  } else {
3196  menuCheck->setCheck(FALSE);
3197  }
3198  break;
3201  menuCheck->setCheck(TRUE);
3202  } else {
3203  menuCheck->setCheck(FALSE);
3204  }
3205  break;
3208  menuCheck->setCheck(TRUE);
3209  } else {
3210  menuCheck->setCheck(FALSE);
3211  }
3212  break;
3215  menuCheck->setCheck(TRUE);
3216  } else {
3217  menuCheck->setCheck(FALSE);
3218  }
3219  break;
3222  menuCheck->setCheck(TRUE);
3223  } else {
3224  menuCheck->setCheck(FALSE);
3225  }
3226  break;
3229  menuCheck->setCheck(TRUE);
3230  } else {
3231  menuCheck->setCheck(FALSE);
3232  }
3233  break;
3236  menuCheck->setCheck(TRUE);
3237  } else {
3238  menuCheck->setCheck(FALSE);
3239  }
3240  // special case for lock persons
3241  if (myViewNet->getDemandViewOptions().menuCheckLockPerson->isEnabled()) {
3242  menuCheck->enable();
3243  } else {
3244  menuCheck->disable();
3245  }
3246  break;
3249  menuCheck->setCheck(TRUE);
3250  } else {
3251  menuCheck->setCheck(FALSE);
3252  }
3253  break;
3256  menuCheck->setCheck(TRUE);
3257  } else {
3258  menuCheck->setCheck(FALSE);
3259  }
3260  // special case for lock containers
3262  menuCheck->enable();
3263  } else {
3264  menuCheck->disable();
3265  }
3266  break;
3269  menuCheck->setCheck(TRUE);
3270  } else {
3271  menuCheck->setCheck(FALSE);
3272  }
3273  break;
3276  menuCheck->setCheck(TRUE);
3277  } else {
3278  menuCheck->setCheck(FALSE);
3279  }
3280  break;
3281  // Data
3284  menuCheck->setCheck(TRUE);
3285  } else {
3286  menuCheck->setCheck(FALSE);
3287  }
3288  break;
3291  menuCheck->setCheck(TRUE);
3292  } else {
3293  menuCheck->setCheck(FALSE);
3294  }
3295  break;
3298  menuCheck->setCheck(TRUE);
3299  } else {
3300  menuCheck->setCheck(FALSE);
3301  }
3302  break;
3305  menuCheck->setCheck(TRUE);
3306  } else {
3307  menuCheck->setCheck(FALSE);
3308  }
3309  break;
3312  menuCheck->setCheck(TRUE);
3313  } else {
3314  menuCheck->setCheck(FALSE);
3315  }
3316  break;
3319  menuCheck->setCheck(TRUE);
3320  } else {
3321  menuCheck->setCheck(FALSE);
3322  }
3323  break;
3324 
3327  menuCheck->setCheck(TRUE);
3328  } else {
3329  menuCheck->setCheck(FALSE);
3330  }
3331  break;
3334  menuCheck->setCheck(TRUE);
3335  } else {
3336  menuCheck->setCheck(FALSE);
3337  }
3338  break;
3339  default:
3340  break;
3341  }
3342  }
3343  return 0;
3344 }
3345 
3346 
3347 long
3348 GNEApplicationWindow::onCmdSaveAllElements(FXObject*, FXSelector, void*) {
3349  // save all elements
3350  if (!myNet->isNetSaved()) {
3351  onCmdSaveNetwork(nullptr, 0, nullptr);
3352  }
3353  if (!myNet->isAdditionalsSaved()) {
3354  onCmdSaveAdditionals(nullptr, 0, nullptr);
3355  }
3356  if (!myNet->isDemandElementsSaved()) {
3357  onCmdSaveDemandElements(nullptr, 0, nullptr);
3358  }
3359  if (!myNet->isDataElementsSaved()) {
3360  onCmdSaveDataElements(nullptr, 0, nullptr);
3361  }
3362  return 1;
3363 }
3364 
3365 
3366 long
3367 GNEApplicationWindow::onCmdSaveNetwork(FXObject*, FXSelector, void*) {
3369  // function onCmdSaveAsNetwork must be executed if this is the first save
3370  if (oc.getString("output-file") == "" || oc.isDefault("output-file")) {
3371  return onCmdSaveAsNetwork(nullptr, 0, nullptr);
3372  } else {
3373  getApp()->beginWaitCursor();
3374  try {
3375  // obtain invalid networkElements (currently only edges or crossings
3376  std::vector<GNENetworkElement*> invalidNetworkElements;
3377  // iterate over crossings and edges
3378  for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {
3379  if (edge.second->isNetworkElementValid() == false) {
3380  invalidNetworkElements.push_back(edge.second);
3381  }
3382  }
3383  for (const auto& crossing : myViewNet->getNet()->getAttributeCarriers()->getCrossings()) {
3384  if (crossing->isNetworkElementValid() == false) {
3385  invalidNetworkElements.push_back(crossing);
3386  }
3387  }
3388  // if there are invalid network elements, open GNEFixNetworkElements
3389  if (invalidNetworkElements.size() > 0) {
3390  // 0 -> Canceled Saving, with or without selecting invalid network elements
3391  // 1 -> Invalid network elements fixed, friendlyPos enabled, or saved with invalid positions
3392  GNEFixNetworkElements fixNetworkElementsDialog(myViewNet, invalidNetworkElements);
3393  if (fixNetworkElementsDialog.execute() == 0) {
3394  // show debug information
3395  WRITE_DEBUG("network elements saving aborted");
3396  // stop
3397  return 1;
3398  } else {
3399  // Save network
3400  myNet->saveNetwork(oc);
3401  // show debug information
3402  WRITE_DEBUG("network elements saved after dialog");
3403  }
3404  } else {
3405  // Save network
3406  myNet->saveNetwork(oc);
3407  // show debug information
3408  WRITE_DEBUG("network elements saved");
3409  }
3410  } catch (IOError& e) {
3411  // write warning if netedit is running in testing mode
3412  WRITE_DEBUG("Opening FXMessageBox 'error saving network'");
3413  // open error message box
3414  FXMessageBox::error(this, MBOX_OK, TL("Saving Network failed!"), "%s", e.what());
3415  // write warning if netedit is running in testing mode
3416  WRITE_DEBUG("Closed FXMessageBox 'error saving network' with 'OK'");
3417  }
3418  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Network saved in " + oc.getString("output-file") + ".\n");
3419  // After saving a net successfully, add it into Recent Nets list.
3420  myMenuBarFile.myRecentNetsAndConfigs.appendFile(oc.getString("output-file").c_str());
3422  getApp()->endWaitCursor();
3423  // update view
3425  // set focus again in net
3426  myViewNet->setFocus();
3427  return 1;
3428  }
3429 }
3430 
3431 
3432 long
3433 GNEApplicationWindow::onCmdSaveSUMOConfig(FXObject*, FXSelector, void*) {
3434  // obtain option container
3436  // check if save additional menu is enabled
3437  if (myFileMenuCommands.saveSUMOConfig->isEnabled()) {
3438  // Check if SUMOConfig file was already set at start of netedit or with a previous save
3439  if (oc.getString("SUMOConfig-output").empty()) {
3440  // declare current folder
3441  FXString currentFolder = gCurrentFolder;
3442  // check if there is a saved network
3443  if (oc.getString("output-file").size() > 0) {
3444  // extract folder
3445  currentFolder = getFolder(oc.getString("output-file"));
3446  }
3447  // open dialog
3448  FXString file = MFXUtils::getFilename2Write(this,
3449  TL("Save SUMOConfig"), ".sumocfg",
3451  currentFolder);
3452  // add xml extension
3453  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".sumocfg");
3454  // check tat file is valid
3455  if (file == "") {
3456  // None SUMOConfig file was selected, then stop function
3457  return 0;
3458  } else {
3459  // change value of "SUMOConfig-output"
3460  oc.resetWritable();
3461  oc.set("SUMOConfig-output", fileWithExtension);
3462  }
3463  }
3464  // Start saving SUMOConfig
3465  getApp()->beginWaitCursor();
3466  // save all elements
3467  onCmdSaveAllElements(nullptr, 0, nullptr);
3468  // save config
3470  getApp()->endWaitCursor();
3471  // restore focus
3472  setFocus();
3473  return 1;
3474  } else {
3475  return 0;
3476  }
3477 }
3478 
3479 
3480 long
3481 GNEApplicationWindow::onCmdSaveSUMOConfigAs(FXObject*, FXSelector, void*) {
3482  // obtain option container
3484  // declare current folder
3485  FXString currentFolder = gCurrentFolder;
3486  // check if there is a saved network
3487  if (oc.getString("output-file").size() > 0) {
3488  // extract folder
3489  currentFolder = getFolder(oc.getString("output-file"));
3490  }
3491  // open dialog
3492  FXString file = MFXUtils::getFilename2Write(this,
3493  TL("Save SUMOConfig"), ".sumocfg",
3495  currentFolder);
3496  // add xml extension
3497  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".sumocfg");
3498  // check tat file is valid
3499  if (file == "") {
3500  // None SUMOConfig file was selected, then stop function
3501  return 0;
3502  } else {
3503  // change value of "SUMOConfig-output"
3504  oc.resetWritable();
3505  oc.set("SUMOConfig-output", fileWithExtension);
3506  }
3507  // Start saving SUMOConfig
3508  getApp()->beginWaitCursor();
3509  // save config
3511  getApp()->endWaitCursor();
3512  // restore focus
3513  setFocus();
3514  return 1;
3515 }
3516 
3517 
3518 long
3519 GNEApplicationWindow::onUpdSaveSUMOConfig(FXObject* sender, FXSelector, void*) {
3520  // check if net exist and there is junctions
3521  if (myNet) {
3522  sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
3523  } else {
3524  sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
3525  }
3526  return 1;
3527 }
3528 
3529 
3530 long
3531 GNEApplicationWindow::onCmdSaveTLSPrograms(FXObject*, FXSelector, void*) {
3532  // obtain option container
3534  // check if save additional menu is enabled
3535  if (myFileMenuCommands.saveTLSPrograms->isEnabled()) {
3536  // Check if TLS Programs file was already set at start of netedit or with a previous save
3537  if (oc.getString("TLSPrograms-output").empty()) {
3538  // declare current folder
3539  FXString currentFolder = gCurrentFolder;
3540  // check if there is a saved network
3541  if (oc.getString("output-file").size() > 0) {
3542  // extract folder
3543  currentFolder = getFolder(oc.getString("output-file"));
3544  }
3545  // open dialog
3546  FXString file = MFXUtils::getFilename2Write(this,
3547  TL("Save TLS Programs"), ".xml",
3549  currentFolder);
3550  // add xml extension
3551  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3552  // check tat file is valid
3553  if (file == "") {
3554  // None TLS Programs file was selected, then stop function
3555  return 0;
3556  } else {
3557  // change value of "TLSPrograms-output"
3558  oc.resetWritable();
3559  oc.set("TLSPrograms-output", fileWithExtension);
3560  }
3561  }
3562  // Start saving TLS Programs
3563  getApp()->beginWaitCursor();
3564  try {
3565  myNet->computeNetwork(this, true); // GNEChange_TLS does not triggere GNENet:requireRecompute
3566  myNet->saveTLSPrograms(oc.getString("TLSPrograms-output"));
3567  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "TLS Programs saved in " + oc.getString("TLSPrograms-output") + ".\n");
3569  } catch (IOError& e) {
3570  // write warning if netedit is running in testing mode
3571  WRITE_DEBUG("Opening FXMessageBox 'error saving TLS Programs'");
3572  // open error message box
3573  FXMessageBox::error(this, MBOX_OK, TL("Saving TLS Programs failed!"), "%s", e.what());
3574  // write warning if netedit is running in testing mode
3575  WRITE_DEBUG("Closed FXMessageBox 'error saving TLS Programs' with 'OK'");
3576  }
3578  getApp()->endWaitCursor();
3579  // restore focus
3580  setFocus();
3581  return 1;
3582  } else {
3583  return 0;
3584  }
3585 }
3586 
3587 
3588 long
3589 GNEApplicationWindow::onUpdSaveTLSPrograms(FXObject* sender, FXSelector, void*) {
3590  // check if net exist and there is junctions
3591  if (myNet && (myNet->getAttributeCarriers()->getJunctions().size() > 0)) {
3592  sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
3593  } else {
3594  sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
3595  }
3596  return 1;
3597 }
3598 
3599 
3600 long
3601 GNEApplicationWindow::onCmdSaveEdgeTypes(FXObject*, FXSelector, void*) {
3602  // obtain option container
3604  // check if save additional menu is enabled
3605  if (myFileMenuCommands.saveEdgeTypes->isEnabled()) {
3606  // Check if edgeType file was already set at start of netedit or with a previous save
3607  if (oc.getString("edgeTypes-output").empty()) {
3608  // declare current folder
3609  FXString currentFolder = gCurrentFolder;
3610  // check if there is a saved network
3611  if (oc.getString("output-file").size() > 0) {
3612  // extract folder
3613  currentFolder = getFolder(oc.getString("output-file"));
3614  }
3615  // open dialog
3616  FXString file = MFXUtils::getFilename2Write(this,
3617  TL("Save edgeType file"), ".xml",
3619  currentFolder);
3620  // add xml extension
3621  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3622  // check tat file is valid
3623  if (file == "") {
3624  // None edgeType Programs file was selected, then stop function
3625  return 0;
3626  } else {
3627  // change value of "edgeTypes-output"
3628  oc.resetWritable();
3629  oc.set("edgeTypes-output", fileWithExtension);
3630  }
3631  }
3632  // Start saving edgeTypes
3633  getApp()->beginWaitCursor();
3634  try {
3635  myNet->saveEdgeTypes(oc.getString("edgeTypes-output"));
3636  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "EdgeType saved in " + oc.getString("edgeTypes-output") + ".\n");
3637  myFileMenuCommands.saveEdgeTypes->disable();
3638  } catch (IOError& e) {
3639  // write warning if netedit is running in testing mode
3640  WRITE_DEBUG("Opening FXMessageBox 'error saving edgeTypes'");
3641  // open error message box
3642  FXMessageBox::error(this, MBOX_OK, TL("Saving edgeTypes failed!"), "%s", e.what());
3643  // write warning if netedit is running in testing mode
3644  WRITE_DEBUG("Closed FXMessageBox 'error saving edgeTypes' with 'OK'");
3645  }
3647  getApp()->endWaitCursor();
3648  // restore focus
3649  setFocus();
3650  return 1;
3651  } else {
3652  return 0;
3653  }
3654 }
3655 
3656 
3657 long
3658 GNEApplicationWindow::onUpdSaveEdgeTypes(FXObject* sender, FXSelector, void*) {
3659  // check if net exist and there are edge types
3660  if (myNet && (myNet->getAttributeCarriers()->getEdgeTypes().size() > 0)) {
3661  sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
3662  } else {
3663  sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
3664  }
3665  return 1;
3666 }
3667 
3668 
3669 long
3670 GNEApplicationWindow::onCmdSaveTLSProgramsAs(FXObject*, FXSelector, void*) {
3671  // obtain option container
3673  // declare current folder
3674  FXString currentFolder = gCurrentFolder;
3675  // check if there is a saved network
3676  if (oc.getString("output-file").size() > 0) {
3677  // extract folder
3678  currentFolder = getFolder(oc.getString("output-file"));
3679  }
3680  // Open window to select TLS Programs file
3681  FXString file = MFXUtils::getFilename2Write(this,
3682  TL("Save TLS Programs as"), ".xml",
3684  currentFolder);
3685  // add xml extension
3686  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3687  // check tat file is valid
3688  if (fileWithExtension != "") {
3689  // change value of "TLSPrograms-output"
3691  OptionsCont::getOptions().set("TLSPrograms-output", fileWithExtension);
3692  // save TLS Programs
3693  return onCmdSaveTLSPrograms(nullptr, 0, nullptr);
3694  } else {
3695  return 1;
3696  }
3697 }
3698 
3699 
3700 long
3701 GNEApplicationWindow::onCmdSaveEdgeTypesAs(FXObject*, FXSelector, void*) {
3702  // obtain option container
3704  // declare current folder
3705  FXString currentFolder = gCurrentFolder;
3706  // check if there is a saved network
3707  if (oc.getString("output-file").size() > 0) {
3708  // extract folder
3709  currentFolder = getFolder(oc.getString("output-file"));
3710  }
3711  // Open window to select edgeType file
3712  FXString file = MFXUtils::getFilename2Write(this,
3713  TL("Save edgeType file as"), ".xml",
3715  currentFolder);
3716  // add xml extension
3717  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3718  // check tat file is valid
3719  if (fileWithExtension != "") {
3720  // change value of "edgeTypes-output"
3721  OptionsCont::getOptions().set("edgeTypes-output", fileWithExtension);
3722  // save edgeTypes
3723  return onCmdSaveEdgeTypes(nullptr, 0, nullptr);
3724  } else {
3725  return 1;
3726  }
3727 }
3728 
3729 
3730 long
3731 GNEApplicationWindow::onUpdSaveEdgeTypesAs(FXObject* sender, FXSelector, void*) {
3732  // check if net exist and there are edge types
3733  if (myNet && (myNet->getAttributeCarriers()->getEdgeTypes().size() > 0)) {
3734  sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
3735  } else {
3736  sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
3737  }
3738  return 1;
3739 }
3740 
3741 
3742 long
3743 GNEApplicationWindow::onCmdOpenAdditionals(FXObject*, FXSelector, void*) {
3744  // write debug information
3745  WRITE_DEBUG("Open additional dialog");
3746  // get the Additional file name
3747  FXFileDialog opendialog(this, TL("Open Additionals file"));
3748  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::MODEADDITIONAL));
3749  opendialog.setSelectMode(SELECTFILE_EXISTING);
3750  opendialog.setPatternList("XML files (*.xml,*.xml.gz)\nAll files (*)");
3751  if (gCurrentFolder.length() != 0) {
3752  opendialog.setDirectory(gCurrentFolder);
3753  }
3754  if (opendialog.execute()) {
3755  // close additional dialog
3756  WRITE_DEBUG("Close additional dialog");
3757  // declare overwrite flag
3758  bool overwriteElements = false;
3759  // check if open question dialog box
3760  if (opendialog.getFilename().text() == OptionsCont::getOptions().getString("additional-files")) {
3761  // open overwrite dialog
3762  GNEOverwriteElementsDialog overwriteDialog(this, "additional");
3763  // continue depending of result
3764  if (overwriteDialog.getResult() == GNEOverwriteElementsDialog::Result::CANCEL) {
3765  // abort load
3766  return 0;
3767  } else if (overwriteDialog.getResult() == GNEOverwriteElementsDialog::Result::OVERWRITE) {
3768  // enable overwriteElements
3769  overwriteElements = true;
3770  }
3771  }
3772  // save previous status save
3773  const bool requireSaveAdditionals = !myNet->isAdditionalsSaved();
3774  const bool requireSaveDemandElements = !myNet->isDemandElementsSaved();
3775  const bool requireSaveDataElements = !myNet->isDataElementsSaved();
3776  // udpate current folder
3777  gCurrentFolder = opendialog.getDirectory();
3778  std::string file = opendialog.getFilename().text();
3779  // disable validation for additionals
3780  XMLSubSys::setValidation("never", "auto", "auto");
3781  // Create additional handler
3782  GNEGeneralHandler generalHandler(myNet, file, true, overwriteElements);
3783  // begin undoList operation
3784  myUndoList->begin(Supermode::NETWORK, GUIIcon::SUPERMODENETWORK, "reloading additionals from '" + file + "'");
3785  // Run parser
3786  if (!generalHandler.parse()) {
3787  WRITE_ERROR("Loading of " + file + " failed.");
3788  }
3789  // enable demand elements if there is an error creating element
3790  if (generalHandler.isErrorCreatingElement()) {
3792  }
3793  // end undoList operation and update view
3794  myUndoList->end();
3795  update();
3796  // restore validation for additionals
3797  XMLSubSys::setValidation("auto", "auto", "auto");
3798  // update require save additional elements
3799  myNet->requireSaveAdditionals(requireSaveAdditionals);
3800  myNet->requireSaveDemandElements(requireSaveDemandElements);
3801  myNet->requireSaveDataElements(requireSaveDataElements);
3802  // change value of "additional-files"
3804  oc.resetWritable();
3805  oc.set("additional-files", opendialog.getFilename().text());
3806  } else {
3807  // write debug information
3808  WRITE_DEBUG("Cancel additional dialog");
3809  }
3810  return 1;
3811 }
3812 
3813 
3814 long
3815 GNEApplicationWindow::onCmdReloadAdditionals(FXObject*, FXSelector, void*) {
3816  // get file
3817  const std::string file = OptionsCont::getOptions().getString("additional-files");
3818  // disable validation for additionals
3819  XMLSubSys::setValidation("never", "auto", "auto");
3820  // Create general handler
3821  GNEGeneralHandler generalHandler(myNet, file, true, true);
3822  // begin undoList operation
3823  myUndoList->begin(Supermode::DEMAND, GUIIcon::SUPERMODENETWORK, "reloading additionals from '" + file + "'");
3824  // clear additionals
3826  // Run parser
3827  if (!generalHandler.parse()) {
3828  WRITE_ERROR("Reloading of " + file + " failed.");
3829  }
3830  // end undoList operation and update view
3831  myUndoList->end();
3832  update();
3833  // restore validation for additionals
3834  XMLSubSys::setValidation("auto", "auto", "auto");
3835  return 1;
3836 }
3837 
3838 
3839 long
3840 GNEApplicationWindow::onUpdReloadAdditionals(FXObject*, FXSelector, void*) {
3841  // check if file exist
3842  if (myViewNet && OptionsCont::getOptions().getString("additional-files").empty()) {
3843  return myFileMenuCommands.reloadAdditionals->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
3844  } else {
3845  return myFileMenuCommands.reloadAdditionals->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
3846  }
3847 }
3848 
3849 
3850 long
3851 GNEApplicationWindow::onCmdSaveAdditionals(FXObject*, FXSelector, void*) {
3852  // obtain option container
3854  // check if save additional menu is enabled
3855  if (myFileMenuCommands.saveAdditionals->isEnabled()) {
3856  // Check if additionals file was already set at start of netedit or with a previous save
3857  if (oc.getString("additional-files").empty()) {
3858  // declare current folder
3859  FXString currentFolder = gCurrentFolder;
3860  // check if there is a saved network
3861  if (oc.getString("output-file").size() > 0) {
3862  // extract folder
3863  currentFolder = getFolder(oc.getString("output-file"));
3864  }
3865  // open dialog
3866  FXString file = MFXUtils::getFilename2Write(this,
3867  TL("Save Additionals file"), ".xml",
3869  currentFolder);
3870  // add xml extension
3871  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3872  // check tat file is valid
3873  if (fileWithExtension != "") {
3874  // change value of "additional-files"
3875  oc.resetWritable();
3876  oc.set("additional-files", fileWithExtension);
3877  } else {
3878  // None additionals file was selected, then stop function
3879  return 0;
3880  }
3881  }
3882  // Start saving additionals
3883  getApp()->beginWaitCursor();
3884  try {
3885  // compute before saving (for detectors positions)
3886  myNet->computeNetwork(this);
3887  myNet->saveAdditionals(oc.getString("additional-files"));
3888  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Additionals saved in " + oc.getString("additional-files") + ".\n");
3890  } catch (IOError& e) {
3891  // write warning if netedit is running in testing mode
3892  WRITE_DEBUG("Opening FXMessageBox 'error saving additionals'");
3893  // open error message box
3894  FXMessageBox::error(this, MBOX_OK, TL("Saving additionals failed!"), "%s", e.what());
3895  // write warning if netedit is running in testing mode
3896  WRITE_DEBUG("Closed FXMessageBox 'error saving additionals' with 'OK'");
3897  }
3899  getApp()->endWaitCursor();
3900  // restore focus
3901  setFocus();
3902  return 1;
3903  } else {
3904  return 0;
3905  }
3906 }
3907 
3908 
3909 long
3910 GNEApplicationWindow::onCmdSaveAdditionalsAs(FXObject*, FXSelector, void*) {
3911  // obtain option container
3913  // declare current folder
3914  FXString currentFolder = gCurrentFolder;
3915  // check if there is a saved network
3916  if (oc.getString("output-file").size() > 0) {
3917  // extract folder
3918  currentFolder = getFolder(oc.getString("output-file"));
3919  }
3920  // Open window to select additional file
3921  FXString file = MFXUtils::getFilename2Write(this,
3922  TL("Save Additionals file as"), ".xml",
3924  currentFolder);
3925  // add xml extension
3926  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3927  // check tat file is valid
3928  if (fileWithExtension != "") {
3929  // reset writtable flag
3931  // change value of "additional-files"
3932  OptionsCont::getOptions().set("additional-files", fileWithExtension);
3933  // change flag of menu command for save additionals
3935  // save additionals
3936  return onCmdSaveAdditionals(nullptr, 0, nullptr);
3937  } else {
3938  return 1;
3939  }
3940 }
3941 
3942 
3943 long
3944 GNEApplicationWindow::onCmdOpenDemandElements(FXObject*, FXSelector, void*) {
3945  // write debug information
3946  WRITE_DEBUG("Open demand element dialog");
3947  // get the demand element file name
3948  FXFileDialog opendialog(this, TL("Open demand element file"));
3949  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SUPERMODEDEMAND));
3950  opendialog.setSelectMode(SELECTFILE_EXISTING);
3951  opendialog.setPatternList("XML files (*.xml,*.xml.gz)\nDemand files (*rou.xml,*rou.xml.gz)\nAll files (*)");
3952  if (gCurrentFolder.length() != 0) {
3953  opendialog.setDirectory(gCurrentFolder);
3954  }
3955  if (opendialog.execute()) {
3956  // close additional dialog
3957  WRITE_DEBUG("Close demand element dialog");
3958  // declare overwrite flag
3959  bool overwriteElements = false;
3960  // check if open question dialog box
3961  if (opendialog.getFilename().text() == OptionsCont::getOptions().getString("route-files")) {
3962  // open overwrite dialog
3963  GNEOverwriteElementsDialog overwriteDialog(this, "route");
3964  // continue depending of result
3965  if (overwriteDialog.getResult() == GNEOverwriteElementsDialog::Result::CANCEL) {
3966  // abort load
3967  return 0;
3968  } else if (overwriteDialog.getResult() == GNEOverwriteElementsDialog::Result::OVERWRITE) {
3969  // enable overwriteElements
3970  overwriteElements = true;
3971  }
3972  }
3973  // save previous status save
3974  const bool requireSaveAdditionals = !myNet->isAdditionalsSaved();
3975  const bool requireSaveDemandElements = !myNet->isDemandElementsSaved();
3976  const bool requireSaveDataElements = !myNet->isDataElementsSaved();
3977  // udpate current folder
3978  gCurrentFolder = opendialog.getDirectory();
3979  std::string file = opendialog.getFilename().text();
3980  // disable validation for additionals
3981  XMLSubSys::setValidation("never", "auto", "auto");
3982  // Create generic handler
3983  GNEGeneralHandler handler(myNet, file, true, overwriteElements);
3984  // begin undoList operation
3985  myUndoList->begin(Supermode::DEMAND, GUIIcon::SUPERMODEDEMAND, "loading demand elements from '" + file + "'");
3986  // Run parser for additionals
3987  if (!handler.parse()) {
3988  WRITE_ERROR("Loading of " + file + " failed.");
3989  }
3990  // enable demand elements if there is an error creating element
3991  if (handler.isErrorCreatingElement()) {
3993  }
3994  // end undoList operation and update view
3995  myUndoList->end();
3996  update();
3997  // restore validation for demand
3998  XMLSubSys::setValidation("auto", "auto", "auto");
3999  // update require save additional elements
4000  myNet->requireSaveAdditionals(requireSaveAdditionals);
4001  myNet->requireSaveDemandElements(requireSaveDemandElements);
4002  myNet->requireSaveDataElements(requireSaveDataElements);
4003  // change value of "route-files"
4005  oc.resetWritable();
4006  oc.set("route-files", opendialog.getFilename().text());
4007  } else {
4008  // write debug information
4009  WRITE_DEBUG("Cancel demand element dialog");
4010  }
4011  return 1;
4012 }
4013 
4014 
4015 long
4017  // get file
4018  const std::string file = OptionsCont::getOptions().getString("route-files");
4019  // disable validation for additionals
4020  XMLSubSys::setValidation("never", "auto", "auto");
4021  // Create handler
4022  GNEGeneralHandler handler(myNet, file, true, true);
4023  // begin undoList operation
4024  myUndoList->begin(Supermode::DEMAND, GUIIcon::SUPERMODEDEMAND, "reloading demand elements from '" + file + "'");
4025  // clear demand elements
4027  // Run parser for additionals
4028  if (!handler.parse()) {
4029  WRITE_ERROR("Reloading of " + file + " failed.");
4030  }
4031  // end undoList operation and update view
4032  myUndoList->end();
4033  update();
4034  // restore validation for demand
4035  XMLSubSys::setValidation("auto", "auto", "auto");
4036  return 1;
4037 }
4038 
4039 
4040 long
4042  // check if file exist
4043  if (myViewNet && OptionsCont::getOptions().getString("route-files").empty()) {
4044  return myFileMenuCommands.reloadDemandElements->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
4045  } else {
4046  return myFileMenuCommands.reloadDemandElements->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
4047  }
4048 }
4049 
4050 
4051 long
4052 GNEApplicationWindow::onCmdSaveDemandElements(FXObject*, FXSelector, void*) {
4053  // obtain option container
4055  // check if save demand element menu is enabled
4056  if (myFileMenuCommands.saveDemandElements->isEnabled()) {
4057  // Check if demand elements file was already set at start of netedit or with a previous save
4058  if (oc.getString("route-files").empty()) {
4059  // declare current folder
4060  FXString currentFolder = gCurrentFolder;
4061  // check if there is a saved network
4062  if (oc.getString("output-file").size() > 0) {
4063  // extract folder
4064  currentFolder = getFolder(oc.getString("output-file"));
4065  }
4066  // open dialog
4067  FXString file = MFXUtils::getFilename2Write(this,
4068  TL("Save demand element file"), ".rou.xml",
4070  currentFolder);
4071  // add xml extension
4072  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
4073  // check tat file is valid
4074  if (fileWithExtension != "") {
4075  // change value of "route-files"
4076  oc.resetWritable();
4077  oc.set("route-files", fileWithExtension);
4078  } else {
4079  // None demand elements file was selected, then stop function
4080  return 0;
4081  }
4082  }
4083  // Start saving demand elements
4084  getApp()->beginWaitCursor();
4085  try {
4086  myNet->saveDemandElements(oc.getString("route-files"));
4087  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Demand elements saved in " + oc.getString("route-files") + ".\n");
4089  } catch (IOError& e) {
4090  // write warning if netedit is running in testing mode
4091  WRITE_DEBUG("Opening FXMessageBox 'error saving demand elements'");
4092  // open error message box
4093  FXMessageBox::error(this, MBOX_OK, TL("Saving demand elements failed!"), "%s", e.what());
4094  // write warning if netedit is running in testing mode
4095  WRITE_DEBUG("Closed FXMessageBox 'error saving demand elements' with 'OK'");
4096  }
4098  getApp()->endWaitCursor();
4099  // restore focus
4100  setFocus();
4101  return 1;
4102  } else {
4103  return 0;
4104  }
4105 }
4106 
4107 
4108 long
4110  // obtain option container
4112  // declare current folder
4113  FXString currentFolder = gCurrentFolder;
4114  // check if there is a saved network
4115  if (oc.getString("output-file").size() > 0) {
4116  // extract folder
4117  currentFolder = getFolder(oc.getString("output-file"));
4118  }
4119  // Open window to select additionasl file
4120  FXString file = MFXUtils::getFilename2Write(this,
4121  TL("Save demand element file as"), ".rou.xml",
4123  currentFolder);
4124  // add xml extension
4125  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
4126  // check that file is correct
4127  if (fileWithExtension != "") {
4128  // reset writtable flag
4130  // change value of "route-files"
4131  OptionsCont::getOptions().set("route-files", fileWithExtension);
4132  // change flag of menu command for save demand elements
4134  // save demand elements
4135  return onCmdSaveDemandElements(nullptr, 0, nullptr);
4136  } else {
4137  return 1;
4138  }
4139 }
4140 
4141 
4142 long
4143 GNEApplicationWindow::onCmdOpenDataElements(FXObject*, FXSelector, void*) {
4144  // write debug information
4145  WRITE_DEBUG("Open data element dialog");
4146  // get the data element file name
4147  FXFileDialog opendialog(this, TL("Open data element file"));
4148  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SUPERMODEDATA));
4149  opendialog.setSelectMode(SELECTFILE_EXISTING);
4150  opendialog.setPatternList("XML files (*.xml,*.xml.gz)\nData files (*dat.xml,*dat.xml.gz)\nAll files (*)");
4151  if (gCurrentFolder.length() != 0) {
4152  opendialog.setDirectory(gCurrentFolder);
4153  }
4154  if (opendialog.execute()) {
4155  // close additional dialog
4156  WRITE_DEBUG("Close data element dialog");
4157  // check if open question dialog box
4158  if (opendialog.getFilename().text() == OptionsCont::getOptions().getString("data-files")) {
4159  // open question dialog box
4160  const auto answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, TL("Load same data file"),
4161  "Selected data file was already loaded. Continue?");
4162  if (answer != 1) { //1:yes, 2:no, 4:esc
4163  // write warning if netedit is running in testing mode
4164  if (answer == 2) {
4165  WRITE_DEBUG("Closed FXMessageBox 'Load same data file' with 'No'");
4166  } else if (answer == 4) {
4167  WRITE_DEBUG("Closed FXMessageBox 'Load same data file' with 'ESC'");
4168  }
4169  return 0;
4170  }
4171  }
4172  // save previous status save
4173  const bool requireSaveAdditionals = !myNet->isAdditionalsSaved();
4174  const bool requireSaveDemandElements = !myNet->isDemandElementsSaved();
4175  const bool requireSaveDataElements = !myNet->isDataElementsSaved();
4176  // udpate current folder
4177  gCurrentFolder = opendialog.getDirectory();
4178  std::string file = opendialog.getFilename().text();
4179  // disable update data
4181  // disable validation for data elements
4182  XMLSubSys::setValidation("never", "auto", "auto");
4183  // Create data handler
4184  GNEDataHandler dataHandler(myNet, file, true);
4185  // begin undoList operation
4186  myUndoList->begin(Supermode::DATA, GUIIcon::SUPERMODEDATA, "loading data elements from '" + file + "'");
4187  // Run data parser
4188  if (!dataHandler.parse()) {
4189  WRITE_ERROR("Loading of " + file + " failed.");
4190  }
4191  // end undoList operation and update view
4192  myUndoList->end();
4193  // enable update data
4195  // update
4196  update();
4197  // restore validation for data
4198  XMLSubSys::setValidation("auto", "auto", "auto");
4199  // update require save additional elements
4200  myNet->requireSaveAdditionals(requireSaveAdditionals);
4201  myNet->requireSaveDemandElements(requireSaveDemandElements);
4202  myNet->requireSaveDataElements(requireSaveDataElements);
4203  // change value of "data-files"
4205  oc.resetWritable();
4206  oc.set("data-files", opendialog.getFilename().text());
4207  } else {
4208  // write debug information
4209  WRITE_DEBUG("Cancel data element dialog");
4210  }
4211  return 1;
4212 }
4213 
4214 
4215 long
4216 GNEApplicationWindow::onCmdReloadDataElements(FXObject*, FXSelector, void*) {
4217  // get file
4218  const std::string file = OptionsCont::getOptions().getString("data-files");
4219  // disable update data
4221  // disable validation for additionals
4222  XMLSubSys::setValidation("never", "auto", "auto");
4223  // Create additional handler
4224  GNEDataHandler dataHandler(myNet, file, true);
4225  // begin undoList operation
4226  myUndoList->begin(Supermode::DATA, GUIIcon::SUPERMODEDATA, "reloading data elements from '" + file + "'");
4227  // clear data elements
4229  // Run data parser
4230  if (!dataHandler.parse()) {
4231  WRITE_ERROR("Reloading of " + file + " failed.");
4232  }
4233  // enable demand elements if there is an error creating element
4234  if (dataHandler.isErrorCreatingElement()) {
4236  }
4237  // restore validation for data
4238  XMLSubSys::setValidation("auto", "auto", "auto");
4239  // end undoList operation and update view
4240  myUndoList->end();
4241  // enable update data
4243  // update
4244  update();
4245  return 1;
4246 }
4247 
4248 
4249 long
4250 GNEApplicationWindow::onUpdReloadDataElements(FXObject*, FXSelector, void*) {
4251  // check if file exist
4252  if (myViewNet && OptionsCont::getOptions().getString("data-files").empty()) {
4253  return myFileMenuCommands.reloadDataElements->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
4254  } else {
4255  return myFileMenuCommands.reloadDataElements->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
4256  }
4257 }
4258 
4259 
4260 long
4261 GNEApplicationWindow::onCmdSaveDataElements(FXObject*, FXSelector, void*) {
4262  // obtain option container
4264  // check if save data element menu is enabled
4265  if (myFileMenuCommands.saveDataElements->isEnabled()) {
4266  // Check if data elements file was already set at start of netedit or with a previous save
4267  if (oc.getString("data-files").empty()) {
4268  // declare current folder
4269  FXString currentFolder = gCurrentFolder;
4270  // check if there is a saved network
4271  if (oc.getString("output-file").size() > 0) {
4272  // extract folder
4273  currentFolder = getFolder(oc.getString("output-file"));
4274  }
4275  // open dialog
4276  FXString file = MFXUtils::getFilename2Write(this,
4277  TL("Save data element file"), ".xml",
4279  currentFolder);
4280  // add xml extension
4281  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
4282  // check tat file is valid
4283  if (fileWithExtension != "") {
4284  // change value of "data-files"
4285  oc.resetWritable();
4286  oc.set("data-files", fileWithExtension);
4287  } else {
4288  // None data elements file was selected, then stop function
4289  return 0;
4290  }
4291  }
4292  // Start saving data elements
4293  getApp()->beginWaitCursor();
4294  try {
4295  myNet->saveDataElements(oc.getString("data-files"));
4296  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Data elements saved in " + oc.getString("data-files") + ".\n");
4298  } catch (IOError& e) {
4299  // write warning if netedit is running in testing mode
4300  WRITE_DEBUG("Opening FXMessageBox 'error saving data elements'");
4301  // open error message box
4302  FXMessageBox::error(this, MBOX_OK, TL("Saving data elements failed!"), "%s", e.what());
4303  // write warning if netedit is running in testing mode
4304  WRITE_DEBUG("Closed FXMessageBox 'error saving data elements' with 'OK'");
4305  }
4307  getApp()->endWaitCursor();
4308  // restore focus
4309  setFocus();
4310  return 1;
4311  } else {
4312  return 0;
4313  }
4314 }
4315 
4316 
4317 long
4318 GNEApplicationWindow::onCmdSaveDataElementsAs(FXObject*, FXSelector, void*) {
4319  // obtain option container
4321  // declare current folder
4322  FXString currentFolder = gCurrentFolder;
4323  // check if there is a saved network
4324  if (oc.getString("output-file").size() > 0) {
4325  // extract folder
4326  currentFolder = getFolder(oc.getString("output-file"));
4327  }
4328  // Open window to select additionasl file
4329  FXString file = MFXUtils::getFilename2Write(this,
4330  TL("Save data element file as"), ".xml",
4332  currentFolder);
4333  // add xml extension
4334  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
4335  // check that file is correct
4336  if (fileWithExtension != "") {
4337  // reset writtable flag
4339  // change value of "data-files"
4340  OptionsCont::getOptions().set("data-files", fileWithExtension);
4341  // change flag of menu command for save data elements
4343  // save data elements
4344  return onCmdSaveDataElements(nullptr, 0, nullptr);
4345  } else {
4346  return 1;
4347  }
4348 }
4349 
4350 
4351 bool
4353  FXuint answer = 0;
4354  if (myViewNet && myNet && !myNet->isNetSaved()) {
4355  // write warning if netedit is running in testing mode
4356  WRITE_DEBUG("Opening FXMessageBox 'Confirm " + operation + " network'");
4357  // open question box
4358  answer = FXMessageBox::question(getApp(), MBOX_QUIT_SAVE_CANCEL,
4359  ("Confirm " + operation + " Network").c_str(), "%s",
4360  ("You have unsaved changes in the network. Do you wish to " + operation + " and discard all changes?").c_str());
4361  // restore focus to view net
4362  myViewNet->setFocus();
4363  // if user close dialog box, check additionals and demand elements
4364  if (answer == MBOX_CLICKED_QUIT) {
4365  // write warning if netedit is running in testing mode
4366  WRITE_DEBUG("Closed FXMessageBox 'Confirm " + operation + " network' with 'Quit'");
4367  if (continueWithUnsavedAdditionalChanges(operation) &&
4370  // clear undo list
4371  clearUndoList();
4372  return true;
4373  } else {
4374  return false;
4375  }
4376  } else if (answer == MBOX_CLICKED_SAVE) {
4377  // save network
4378  onCmdSaveNetwork(nullptr, 0, nullptr);
4379  // check
4380  if (continueWithUnsavedAdditionalChanges(operation) &&
4383  // clear undo list
4384  clearUndoList();
4385  return true;
4386  } else {
4387  return false;
4388  }
4389  } else {
4390  // write warning if netedit is running in testing mode
4391  if (answer == 2) {
4392  WRITE_DEBUG("Closed FXMessageBox 'Confirm " + operation + " network' with 'No'");
4393  } else if (answer == 4) {
4394  WRITE_DEBUG("Closed FXMessageBox 'Confirm " + operation + " network' with 'ESC'");
4395  }
4396  // return false to stop closing/reloading
4397  return false;
4398  }
4399  } else {
4400  if (continueWithUnsavedAdditionalChanges(operation) &&
4403  // clear undo list
4404  clearUndoList();
4405  return true;
4406  } else {
4407  // return false to stop closing/reloading
4408  return false;
4409  }
4410  }
4411 }
4412 
4413 
4414 bool
4416  // Check if there are non saved additionals
4417  if (myViewNet && myFileMenuCommands.saveAdditionals->isEnabled()) {
4418  WRITE_DEBUG("Opening FXMessageBox 'Save additionals before " + operation + "'");
4419  // open question box
4420  FXuint answer = FXMessageBox::question(getApp(), MBOX_QUIT_SAVE_CANCEL,
4421  ("Save additionals before " + operation).c_str(), "%s",
4422  ("You have unsaved additionals. Do you wish to " + operation + " and discard all changes?").c_str());
4423  // restore focus to view net
4424  myViewNet->setFocus();
4425  // if answer was affirmative, but there was an error during saving additionals, return false to stop closing/reloading
4426  if (answer == MBOX_CLICKED_QUIT) {
4427  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before " + operation + "' with 'Quit'");
4428  // nothing to save, return true
4429  return true;
4430  } else if (answer == MBOX_CLICKED_SAVE) {
4431  // write warning if netedit is running in testing mode
4432  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before " + operation + "' with 'Yes'");
4433  if (onCmdSaveAdditionals(nullptr, 0, nullptr) == 1) {
4434  // additionals successfully saved
4435  return true;
4436  } else {
4437  // error saving additionals, abort saving
4438  return false;
4439  }
4440  } else {
4441  // write warning if netedit is running in testing mode
4442  if (answer == 2) {
4443  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before " + operation + "' with 'No'");
4444  } else if (answer == 4) {
4445  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before " + operation + "' with 'ESC'");
4446  }
4447  // abort saving
4448  return false;
4449  }
4450  } else {
4451  // nothing to save, return true
4452  return true;
4453  }
4454 }
4455 
4456 
4457 bool
4459  // Check if there are non saved demand elements
4460  if (myViewNet && myFileMenuCommands.saveDemandElements->isEnabled()) {
4461  WRITE_DEBUG("Opening FXMessageBox 'Save demand elements before " + operation + "'");
4462  // open question box
4463  FXuint answer = FXMessageBox::question(getApp(), MBOX_QUIT_SAVE_CANCEL,
4464  ("Save demand elements before " + operation).c_str(), "%s",
4465  ("You have unsaved demand elements. Do you wish to " + operation + " and discard all changes?").c_str());
4466  // restore focus to view net
4467  myViewNet->setFocus();
4468  // if answer was affirmative, but there was an error during saving demand elements, return false to stop closing/reloading
4469  if (answer == MBOX_CLICKED_QUIT) {
4470  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before " + operation + "' with 'Quit'");
4471  // nothing to save, return true
4472  return true;
4473  } else if (answer == MBOX_CLICKED_SAVE) {
4474  // write warning if netedit is running in testing mode
4475  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before " + operation + "' with 'Yes'");
4476  if (onCmdSaveDemandElements(nullptr, 0, nullptr) == 1) {
4477  // demand elements successfully saved
4478  return true;
4479  } else {
4480  // error saving demand elements, abort saving
4481  return false;
4482  }
4483  } else {
4484  // write warning if netedit is running in testing mode
4485  if (answer == 2) {
4486  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before " + operation + "' with 'No'");
4487  } else if (answer == 4) {
4488  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before " + operation + "' with 'ESC'");
4489  }
4490  // abort saving
4491  return false;
4492  }
4493  } else {
4494  // nothing to save, return true
4495  return true;
4496  }
4497 }
4498 
4499 
4500 bool
4502  // Check if there are non saved data elements
4503  if (myViewNet && myFileMenuCommands.saveDataElements->isEnabled()) {
4504  WRITE_DEBUG("Opening FXMessageBox 'Save data elements before " + operation + "'");
4505  // open question box
4506  FXuint answer = FXMessageBox::question(getApp(), MBOX_QUIT_SAVE_CANCEL,
4507  ("Save data elements before " + operation).c_str(), "%s",
4508  ("You have unsaved data elements. Do you wish to " + operation + " and discard all changes?").c_str());
4509  // restore focus to view net
4510  myViewNet->setFocus();
4511  // if answer was affirmative, but there was an error during saving data elements, return false to stop closing/reloading
4512  if (answer == MBOX_CLICKED_QUIT) {
4513  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before " + operation + "' with 'Quit'");
4514  // nothing to save, return true
4515  return true;
4516  } else if (answer == MBOX_CLICKED_SAVE) {
4517  // write warning if netedit is running in testing mode
4518  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before " + operation + "' with 'Yes'");
4519  if (onCmdSaveDataElements(nullptr, 0, nullptr) == 1) {
4520  // data elements successfully saved
4521  return true;
4522  } else {
4523  // error saving data elements, abort saving
4524  return false;
4525  }
4526  } else {
4527  // write warning if netedit is running in testing mode
4528  if (answer == 2) {
4529  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before " + operation + "' with 'No'");
4530  } else if (answer == 4) {
4531  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before " + operation + "' with 'ESC'");
4532  }
4533  // abort saving
4534  return false;
4535  }
4536  } else {
4537  // nothing to save, return true
4538  return true;
4539  }
4540 }
4541 
4542 
4543 FXString
4544 GNEApplicationWindow::getFolder(const std::string& folder) const {
4545  // declare folder
4546  std::string newFolder = folder;
4547  // declare stop flag
4548  bool stop = false;
4549  // continue while stop is false
4550  while (!stop) {
4551  if (newFolder.empty()) {
4552  // new folder empty, then stop
4553  stop = true;
4554  } else if ((newFolder.back() == '\'') || (newFolder.back() == '\\') ||
4555  (newFolder.back() == '/') /* || (newFolder.back() == '//') */) {
4556  // removed file, then stop
4557  stop = true;
4558  } else {
4559  newFolder.pop_back();
4560  }
4561  }
4562  // if is empty, return gCurrentFolder
4563  if (newFolder.empty()) {
4564  return gCurrentFolder;
4565  }
4566  return FXString(newFolder.c_str());
4567 }
4568 
4569 
4570 void
4572  // check that view exists
4573  if (myViewNet) {
4575  }
4576 }
4577 
4578 
4579 void
4581  // remove lock hotkeys
4583  // check supermode
4584  if (supermode == Supermode::NETWORK) {
4585  // menu commands
4589  // lock
4593  // processing
4598  } else if (supermode == Supermode::DEMAND) {
4599  // menu commands
4603  // lock
4607  // processing
4612  } else if (supermode == Supermode::DATA) {
4613  // menu commands
4617  // lock
4621  // processing
4626  } else {
4627  // menu commands
4632  // lock
4636  // processing
4640  }
4641 }
4642 
4643 
4644 void
4645 GNEApplicationWindow::disableUndoRedo(const std::string& reason) {
4646  myUndoRedoListEnabled = reason;
4647 }
4648 
4649 
4650 void
4652  myUndoRedoListEnabled.clear();
4653 }
4654 
4655 
4656 const std::string&
4658  return myUndoRedoListEnabled;
4659 }
4660 
4661 
4664  return myEditMenuCommands;
4665 }
4666 
4667 
4670  return myLockMenuCommands;
4671 }
4672 
4673 
4674 void
4676  if (myViewNet) {
4677  // destroy Popup (to avoid crashes)
4679  }
4680  // clear undo list and return true to continue with closing/reload
4681  myUndoList->clear();
4682 }
4683 
4684 
4687  return myProcessingMenuCommands;
4688 }
4689 
4690 // ---------------------------------------------------------------------------
4691 // GNEApplicationWindow - protected methods
4692 // ---------------------------------------------------------------------------
4693 
4694 #ifdef _MSC_VER
4695 #pragma warning(push)
4696 /* Disable warning about using "this" in the constructor */
4697 #pragma warning(disable: 4355)
4698 #endif
4700  myToolbarsGrip(this),
4701  myMenuBarFile(this),
4702  myFileMenuCommands(this),
4703  myModesMenuCommands(this),
4704  myEditMenuCommands(this),
4705  myLockMenuCommands(nullptr),
4706  myProcessingMenuCommands(this),
4707  myLocateMenuCommands(this),
4708  myToolsMenuCommands(this),
4709  myWindowsMenuCommands(this),
4710  mySupermodeCommands(this) {
4711 }
4712 #ifdef _MSC_VER
4713 #pragma warning(pop)
4714 #endif
4715 
4716 
4717 long
4718 GNEApplicationWindow::onKeyPress(FXObject* o, FXSelector sel, void* eventData) {
4719  const long handled = FXMainWindow::onKeyPress(o, sel, eventData);
4720  if (handled == 0 && myMDIClient->numChildren() > 0) {
4721  GNEViewParent* w = dynamic_cast<GNEViewParent*>(myMDIClient->getActiveChild());
4722  if (w != nullptr) {
4723  w->onKeyPress(nullptr, sel, eventData);
4724  }
4725  }
4726  return 0;
4727 }
4728 
4729 
4730 long
4731 GNEApplicationWindow::onKeyRelease(FXObject* o, FXSelector sel, void* eventData) {
4732  const long handled = FXMainWindow::onKeyRelease(o, sel, eventData);
4733  if (handled == 0 && myMDIClient->numChildren() > 0) {
4734  GNEViewParent* w = dynamic_cast<GNEViewParent*>(myMDIClient->getActiveChild());
4735  if (w != nullptr) {
4736  w->onKeyRelease(nullptr, sel, eventData);
4737  }
4738  }
4739  return 0;
4740 }
4741 
4742 
4743 /****************************************************************************/
FXDEFMAP(GNEApplicationWindow) GNEApplicationWindowMap[]
@ DATA_SELECT
mode for selecting data elements
@ DATA_INSPECT
mode for inspecting data elements
@ DATA_DELETE
mode for deleting data elements
Supermode
@brie enum for supermodes
@ NETWORK
Network mode (Edges, junctions, etc..)
@ DATA
Data mode (edgeData, LaneData etc..)
@ DEMAND
Demand mode (Routes, Vehicles etc..)
@ NETWORK_DELETE
mode for deleting network elements
@ NETWORK_MOVE
mode for moving network elements
@ NETWORK_SELECT
mode for selecting network elements
@ NETWORK_INSPECT
mode for inspecting network elements
@ NETWORK_CONNECT
mode for connecting lanes
@ DEMAND_INSPECT
mode for inspecting demand elements
@ DEMAND_DELETE
mode for deleting demand elements
@ DEMAND_SELECT
mode for selecting demand elements
@ DEMAND_MOVE
mode for moving demand elements
long long int SUMOTime
Definition: GUI.h:35
@ MID_GNE_TOOLBAREDIT_LOADADDITIONALS
load additionals in SUMO-GUI after press ctrl+T
Definition: GUIAppEnum.h:725
@ MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES
automatically create opposite edge
Definition: GUIAppEnum.h:777
@ MID_HOTKEY_A_MODE_ADDITIONAL_STOP
hotkey for mode editing additionals AND stops
Definition: GUIAppEnum.h:43
@ MID_HOTKEY_SHIFT_F7_ADJUST_PERSON_PLANS
Adjust person plans (start und end positions, arrival positions, etc.)
Definition: GUIAppEnum.h:228
@ MID_HOTKEY_CTRL_Q_CLOSE
Main window closes.
Definition: GUIAppEnum.h:105
@ MID_HOTKEY_SHIFT_F5_COMPUTEJUNCTIONS_VOLATILE
compute junctions with volatile options
Definition: GUIAppEnum.h:226
@ MID_HOTKEY_CTRL_SHIFT_B_SAVEDATAELEMENTS
save Data Elements
Definition: GUIAppEnum.h:163
@ MID_HOTKEY_F3_SUPERMODE_DEMAND
select demand supermode in NETEDIT
Definition: GUIAppEnum.h:193
@ MID_GNE_UNDOLISTDIALOG
open undo list dialog
Definition: GUIAppEnum.h:1433
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS
show all person plans
Definition: GUIAppEnum.h:809
@ MID_GNE_UNLOCK_ALLELEMENTS
unlock all element
Definition: GUIAppEnum.h:787
@ MID_HOTKEY_CTRL_SHIFT_M_SAVESUMOCONFIG
save SUMOConfig
Definition: GUIAppEnum.h:171
@ MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING
toggle TAZRel drawing
Definition: GUIAppEnum.h:833
@ MID_GNE_TOGGLE_COMPUTE_NETWORK_DATA
enable/disable computing after switchin between supermodes
Definition: GUIAppEnum.h:731
@ MID_LOCATEPERSON
Locate person - button.
Definition: GUIAppEnum.h:369
@ MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition: GUIAppEnum.h:751
@ MID_HOTKEY_CTRL_Y_REDO
Undo.
Definition: GUIAppEnum.h:121
@ MID_HOTKEY_CTRL_SHIFT_H_SAVEEDGETYPES
save Edge Types
Definition: GUIAppEnum.h:161
@ MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION
move elevation instead of x,y
Definition: GUIAppEnum.h:773
@ MID_HOTKEY_ALT_9_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:149
@ MID_GNE_TOOLBARFILE_RELOAD_EDGETYPES
reload edge types
Definition: GUIAppEnum.h:693
@ MID_LOCATEJUNCTION
Locate junction - button.
Definition: GUIAppEnum.h:357
@ MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS
hide connections
Definition: GUIAppEnum.h:759
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS
show connections
Definition: GUIAppEnum.h:757
@ MID_GNE_SAVEALLELEMENTS
save all element
Definition: GUIAppEnum.h:683
@ MID_HOTKEY_ALT_5_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:141
@ MID_GNE_TOOLBAREDIT_LOADDEMAND
load demand in SUMO-GUI after press ctrl+T
Definition: GUIAppEnum.h:727
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO
toggle draw TAZRel only to
Definition: GUIAppEnum.h:839
@ MID_OPEN_CONFIG
Open configuration - ID.
Definition: GUIAppEnum.h:270
@ MID_HOTKEY_M_MODE_MOVE
hotkey for mode moving element
Definition: GUIAppEnum.h:57
@ MID_HOTKEY_CTRL_W_CLOSESIMULATION
Close simulation - ID.
Definition: GUIAppEnum.h:117
@ MID_HOTKEY_ALT_2_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:135
@ MID_GNE_LOCK_ALLELEMENTS
lock all element
Definition: GUIAppEnum.h:785
@ MID_HOTKEY_F7_JOIN_SELECTEDJUNCTIONS_ROUTES
join selected junctions in network mode and normalice demand element ids in demand mode
Definition: GUIAppEnum.h:201
@ MID_HOTKEY_CTRL_D_SINGLESIMULATIONSTEP_OPENDEMANDELEMENTS
Perform a single simulation step in SUMO and open Demand Elements in NETEDIT.
Definition: GUIAppEnum.h:85
@ MID_HOTKEY_F5_COMPUTE_NETWORK_DEMAND
compute Network in network mode and Demand elements in demand mode
Definition: GUIAppEnum.h:197
@ MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition: GUIAppEnum.h:825
@ MID_GNE_LOCK_MENUTITLE
selector for LockMenuTitle
Definition: GUIAppEnum.h:1431
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS
show TAZ elements
Definition: GUIAppEnum.h:763
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON
lock person
Definition: GUIAppEnum.h:811
@ MID_HOTKEY_Z_MODE_TAZ_TAZREL
hotkey for mode editing TAZ and TAZRel
Definition: GUIAppEnum.h:71
@ MID_HOTKEY_F9_EDIT_VIEWSCHEME
open edit scheme menu
Definition: GUIAppEnum.h:205
@ MID_GNE_DEMANDVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition: GUIAppEnum.h:799
@ MID_GNE_LOCK_SELECTEDELEMENTS
lock selected element
Definition: GUIAppEnum.h:789
@ MID_LOCATEPOLY
Locate polygons - button.
Definition: GUIAppEnum.h:379
@ MID_HOTKEY_CTRL_J_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition: GUIAppEnum.h:95
@ MID_GNE_TOOLBARFILE_SAVESUMOCONFIG_AS
save SUMOConfig as
Definition: GUIAppEnum.h:699
@ MID_GNE_TOOLBARFILE_RELOAD_TLSPROGRAMS
reload TLS Programs
Definition: GUIAppEnum.h:689
@ MID_HOTKEY_DEL
hot key delete selections or elements
Definition: GUIAppEnum.h:239
@ MID_HOTKEY_CTRL_N_NEWNETWORK
create new empty network
Definition: GUIAppEnum.h:103
@ MID_HOTKEY_CTRL_SHIFT_S_SAVENETWORK_AS
save network as
Definition: GUIAppEnum.h:173
@ MID_CHANGELOG
changelog button
Definition: GUIAppEnum.h:643
@ MID_GNE_NETWORKVIEWOPTIONS_ASKFORMERGE
ask before merging junctions
Definition: GUIAppEnum.h:769
@ MID_GNE_TOOLBARFILE_OPENFOREIGN
open foreign network
Definition: GUIAppEnum.h:681
@ MID_HOTKEY_CTRL_B_EDITBREAKPOINT_OPENDATAELEMENTS
Edit simulation breakpoints in SUMO and open Data Elements in NETEDIT.
Definition: GUIAppEnum.h:81
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID
show grid
Definition: GUIAppEnum.h:797
@ MID_HOTKEY_ALT_3_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:137
@ MID_HOTKEY_F1_ONLINEDOCUMENTATION
open online documentation
Definition: GUIAppEnum.h:189
@ MID_HOTKEY_CTRL_SHIFT_D_SAVEDEMANDELEMENTS
Save Demand Elements.
Definition: GUIAppEnum.h:165
@ MID_HOTKEY_CTRL_R_RELOAD
Reload the previously loaded simulation.
Definition: GUIAppEnum.h:109
@ MID_HOTKEY_CTRL_SHIFT_V_FORCESAVEDEMANDELEMENTS
Force save demand elements (flag)
Definition: GUIAppEnum.h:179
@ MID_HOTKEY_CTRL_S_STOPSIMULATION_SAVENETWORK
Stop the simulation in SUMO and save network in NETEDIT.
Definition: GUIAppEnum.h:107
@ MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES
create edges in chain mode
Definition: GUIAppEnum.h:775
@ MID_HOTKEY_ESC
hot key <ESC> abort current edit operation
Definition: GUIAppEnum.h:237
@ MID_GNE_TOOLBARFILE_SAVEDATA_AS
save data elements as
Definition: GUIAppEnum.h:707
@ MID_HOTKEY_F10_OPTIONSMENU
open options menu
Definition: GUIAppEnum.h:207
@ MID_HOTKEY_F11_FRONTELEMENT
set/clear front element
Definition: GUIAppEnum.h:209
@ MID_HOTKEY_F8_CLEANINVALID_CROSSINGS_DEMANDELEMENTS
clean invalid crossings in network mode and demand elements in demand mode
Definition: GUIAppEnum.h:203
@ MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition: GUIAppEnum.h:831
@ MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN
hotkey for mode prohibition AND container plan
Definition: GUIAppEnum.h:53
@ MID_HOTKEY_T_MODE_TLS_TYPE
hotkey for mode editing TLS AND Vehicle Types
Definition: GUIAppEnum.h:65
@ MID_LOCATEADD
Locate additional structure - button.
Definition: GUIAppEnum.h:375
@ MID_LOCATEPOI
Locate poi - button.
Definition: GUIAppEnum.h:377
@ MID_HOTKEY_CTRL_SHIFT_W_FORCESAVEDATAELEMENTS
Force save data elements (flag)
Definition: GUIAppEnum.h:181
@ MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES
hide shapes
Definition: GUIAppEnum.h:805
@ MID_OPEN_NETWORK
Open network - ID.
Definition: GUIAppEnum.h:272
@ MID_HOTKEY_CTRL_SHIFT_U_FORCESAVEADDITIONALS
Force save additionals (flag)
Definition: GUIAppEnum.h:177
@ MID_HOTKEY_ALT_4_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:139
@ MID_GNE_TOOLBARFILE_SAVETLSPROGRAMS_AS
save TLS Programs as
Definition: GUIAppEnum.h:697
@ MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS
show additionals
Definition: GUIAppEnum.h:827
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES
show junctions as bubbles
Definition: GUIAppEnum.h:771
@ MID_GNE_TOOLBARFILE_RELOAD_DEMANDELEMENTS
reload demand elements
Definition: GUIAppEnum.h:705
@ MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION
extend selection
Definition: GUIAppEnum.h:765
@ MID_HOTKEY_CTRL_I_EDITVIEWPORT
Open viewport editor.
Definition: GUIAppEnum.h:91
@ MID_HOTKEY_S_MODE_SELECT
hotkey for mode selecting objects
Definition: GUIAppEnum.h:61
@ MID_RECENTFILE
Loads a file previously loaded.
Definition: GUIAppEnum.h:278
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS
show sub-additionals
Definition: GUIAppEnum.h:761
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS
show all container plans
Definition: GUIAppEnum.h:813
@ MID_HOTKEY_CTRL_SHIFT_N_NEWWINDOW
Open a New Window.
Definition: GUIAppEnum.h:169
@ MID_HOTKEY_F4_SUPERMODE_DATA
select data supermode in NETEDIT
Definition: GUIAppEnum.h:195
@ MID_HOTKEY_F6_CLEAN_SOLITARYJUNCTIONS_UNUSEDROUTES
clean junctions without edges in network mode and unused routes in demand mode
Definition: GUIAppEnum.h:199
@ MID_LOCATESTOP
Locate stop - button.
Definition: GUIAppEnum.h:367
@ MID_HOTKEY_ALT_1_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:133
@ MID_HOTKEY_CTRL_K_OPENTLSPROGRAMS
Load file with TLS Programs.
Definition: GUIAppEnum.h:97
@ MID_GNE_LOCK_ELEMENT
lock element
Definition: GUIAppEnum.h:783
@ MID_CLEARMESSAGEWINDOW
Clear simulation output.
Definition: GUIAppEnum.h:339
@ MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA
hotkey for mode editing crossing, routes and edge rel datas
Definition: GUIAppEnum.h:63
@ MID_HOTKEY_W_MODE_WIRE
hotkey for mode editing overhead wires
Definition: GUIAppEnum.h:69
@ MID_TUTORIAL
tutorial button
Definition: GUIAppEnum.h:647
@ MID_HOTKEY_CTRL_G_GAMINGMODE_TOGGLEGRID
Toggle Gaming mode in SUMO and grid in NETEDIT.
Definition: GUIAppEnum.h:87
@ MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL
toggle draw TAZ fill
Definition: GUIAppEnum.h:835
@ MID_HOTKEY_ALT_6_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:143
@ MID_HOTKEY_D_MODE_DELETE
hotkey for mode deleting things
Definition: GUIAppEnum.h:47
@ ID_LOADTHREAD_EVENT
The loading thread.
Definition: GUIAppEnum.h:306
@ MID_GNE_TOOLBARFILE_RELOAD_ADDITIONALS
reload additionals
Definition: GUIAppEnum.h:695
@ MID_HOTKEY_V_MODE_VEHICLE
hotkey for mode create vehicles
Definition: GUIAppEnum.h:67
@ MID_HOTKEY_I_MODE_INSPECT
hotkey for mode inspecting object attributes
Definition: GUIAppEnum.h:55
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition: GUIAppEnum.h:753
@ MID_HOTKEY_ALT_0_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:131
@ MID_GNE_TOOLBARFILE_SAVEADDITIONALS_AS
save additionals as
Definition: GUIAppEnum.h:687
@ MID_GNE_TOOLBARFILE_SAVEEDGETYPES_AS
save edgeTypes as
Definition: GUIAppEnum.h:701
@ MID_HOTKEYS
hotkeys button
Definition: GUIAppEnum.h:645
@ MID_HOTKEY_C_MODE_CONNECT_PERSONPLAN
hotkey for mode connecting lanes ABD person plan
Definition: GUIAppEnum.h:45
@ MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED
hide non-inspected demand element
Definition: GUIAppEnum.h:803
@ MID_HOTKEY_ALT_F4_CLOSE
Main window closes.
Definition: GUIAppEnum.h:151
@ MID_HOTKEY_CTRL_SHIFT_A_SAVEADDITIONALS
Save Additional Elements.
Definition: GUIAppEnum.h:159
@ MID_LOCATEWALKINGAREA
Locate edge - button.
Definition: GUIAppEnum.h:361
@ MID_LOCATEEDGE
Locate edge - button.
Definition: GUIAppEnum.h:359
@ MID_HOTKEY_G_MODE_CONTAINER
hotkey for mode container
Definition: GUIAppEnum.h:51
@ MID_HOTKEY_SHIFT_F2_TEMPLATE_COPY
copy template
Definition: GUIAppEnum.h:222
@ MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES
change all phases
Definition: GUIAppEnum.h:767
@ MID_HOTKEY_CTRL_A_STARTSIMULATION_OPENADDITIONALS
Start the simulation in SUMO and open Additionals Elements in NETEDIT.
Definition: GUIAppEnum.h:79
@ MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES
show shapes
Definition: GUIAppEnum.h:829
@ MID_HOTKEY_E_MODE_EDGE_EDGEDATA
hotkey for mode adding edges AND edgeDatas
Definition: GUIAppEnum.h:49
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM
toggle draw TAZRel only from
Definition: GUIAppEnum.h:837
@ MID_HOTKEY_ALT_8_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:147
@ MID_GNE_TOOLBARTOOLS_NETDIFF
call tool netdiff
Definition: GUIAppEnum.h:717
@ MID_LOCATEVEHICLE
Locate vehicle - button.
Definition: GUIAppEnum.h:363
@ MID_LOCATETLS
Locate TLS - button.
Definition: GUIAppEnum.h:373
@ MID_GNE_TOOLBARFILE_RELOAD_SUMOCONFIG
reload SUMOConfig
Definition: GUIAppEnum.h:691
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE
toggle draw junction shape
Definition: GUIAppEnum.h:749
@ MID_GNE_RECOMPUTINGNEEDED
check if recomputing is needed
Definition: GUIAppEnum.h:1437
@ MID_HOTKEY_CTRL_M_OPENSUMOCONFIG
open sumo config
Definition: GUIAppEnum.h:101
@ MID_GNE_TOOLBARFILE_SAVEDEMAND_AS
save demand elements as
Definition: GUIAppEnum.h:703
@ MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition: GUIAppEnum.h:801
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES
show overlapped routes
Definition: GUIAppEnum.h:817
@ MID_HOTKEY_CTRL_Z_UNDO
Redo.
Definition: GUIAppEnum.h:123
@ MID_GNE_MODESMENUTITLE
selector for ModesMenuTitle
Definition: GUIAppEnum.h:1429
@ MID_HOTKEY_CTRL_SHIFT_T_FORCESAVENETEWORK
Force save network (flag)
Definition: GUIAppEnum.h:175
@ MID_HOTKEY_BACKSPACE
hot key <Backspace> remove last sub-operation
Definition: GUIAppEnum.h:243
@ MID_HOTKEY_ALT_7_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:145
@ MID_HOTKEY_F12_ABOUT
open about dialog
Definition: GUIAppEnum.h:213
@ MID_HOTKEY_ENTER
hot key <ENTER> accept current operation
Definition: GUIAppEnum.h:241
@ MID_GNE_TOOLBARFILE_RELOAD_DATAELEMENTS
reload data elements
Definition: GUIAppEnum.h:709
@ MID_HOTKEY_CTRL_SHIFT_K_SAVETLS
save TLS Programs
Definition: GUIAppEnum.h:167
@ MID_HOTKEY_SHIFT_F1_TEMPLATE_SET
set template
Definition: GUIAppEnum.h:220
@ MID_HOTKEY_F2_SUPERMODE_NETWORK
select network supermode in NETEDIT
Definition: GUIAppEnum.h:191
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER
lock container
Definition: GUIAppEnum.h:815
@ MID_HOTKEY_SHIFT_F12_FOCUSUPPERELEMENT
focus upper element of current frame (only used in NETEDIT)
Definition: GUIAppEnum.h:230
@ MID_HOTKEY_SHIFT_F3_TEMPLATE_CLEAR
clear template
Definition: GUIAppEnum.h:224
@ MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES
select edges
Definition: GUIAppEnum.h:755
@ MID_HOTKEY_CTRL_H_OPENEDGETYPES
open edge type files
Definition: GUIAppEnum.h:89
@ MID_GNE_SAVEJOINEDJUNCTIONS
save joined junctions
Definition: GUIAppEnum.h:685
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS
show all trips
Definition: GUIAppEnum.h:807
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID
show grid
Definition: GUIAppEnum.h:747
@ MID_LOCATEROUTE
Locate route - button.
Definition: GUIAppEnum.h:365
@ MID_HOTKEY_P_MODE_POLYGON_PERSON
hotkey for mode creating polygons
Definition: GUIAppEnum.h:59
@ MID_HOTKEY_CTRL_L_SAVEASPLAINXML
save network as plain XML
Definition: GUIAppEnum.h:99
@ MID_GNE_TOOLBAREDIT_COMPUTEPATHMANAGER
compute path manager
Definition: GUIAppEnum.h:729
@ MID_HOTKEY_CTRL_T_OPENSUMONETEDIT
Open current network in SUMO or in NETEDIT.
Definition: GUIAppEnum.h:113
@ MID_WINDOW
Main window-ID.
Definition: GUIAppEnum.h:251
GUICompleteSchemeStorage gSchemeStorage
#define GUIDesignButtonStatusBarFixed
button rectangular with thick and raise frame with a width of 100
Definition: GUIDesigns.h:101
#define GUIDesignHorizontalFrameStatusBar
Horizontal frame used in status bar.
Definition: GUIDesigns.h:344
#define GUIDesignLabelStatusBar
label used in statusBar
Definition: GUIDesigns.h:286
#define GUIDesignSplitter
Definition: GUIDesigns.h:463
#define GUIDesignSplitterMDI
MDI Splitter.
Definition: GUIDesigns.h:466
#define GUIDesignStatusBar
design used in status bar
Definition: GUIDesigns.h:435
@ MESSAGE_OCCURRED
send when a message occured
@ GLDEBUG_OCCURRED
send when a gldebug occured
@ ERROR_OCCURRED
send when a error occured
@ SIMULATION_LOADED
send when a simulation has been loaded
@ DEBUG_OCCURRED
send when a debug occured
@ WARNING_OCCURRED
send when a warning occured
GUISelectedStorage gSelected
A global holder of selected objects.
FXString gCurrentFolder
The folder used as last.
@ MODEADDITIONAL
@ SUPERMODEDEMAND
@ NETEDIT_MINI
@ MODECREATEEDGE
@ SUPERMODENETWORK
@ SUPERMODEDATA
#define WRITE_DEBUG(msg)
Definition: MsgHandler.h:276
#define WRITE_MESSAGE(msg)
Definition: MsgHandler.h:267
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:274
#define TL(string)
Definition: MsgHandler.h:282
@ GNE_TAG_TRIP_JUNCTIONS
a trip between junctions (used in NETEDIT)
@ GNE_TAG_FLOW_JUNCTIONS
a flow between junctions (used in NETEDIT)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
bool parse()
parse
bool parse()
parse
Definition: DataHandler.cpp:42
bool isErrorCreatingElement() const
get flag for check if a element wasn't created
void setSelector(FXSelector sel)
set the selector
void setTarget(FXObject *tgt)
set the target
static std::string addExtension(const std::string &path, const std::string &extension)
Add an extension to the given file path.
Definition: FileHelpers.cpp:93
static bool isReadable(std::string path)
Checks whether the given file is readable.
Definition: FileHelpers.cpp:51
static void resetFont()
to be called when the font context is invalidated
Definition: GLHelper.cpp:600
The application's "About" - dialog.
Definition: GNEAbout.h:33
void create()
Creates the widget.
Definition: GNEAbout.cpp:85
The main window of the Netedit.
long onCmdReloadSUMOConfig(FXObject *, FXSelector, void *)
called when the command/FXCall reload SUMOConfig is executed
long onCmdSaveAsNetwork(FXObject *, FXSelector, void *)
called when the command/FXCall save network as is executed
long onCmdSaveAdditionals(FXObject *, FXSelector, void *)
called when the command/FXCall save additionals is executed
GNEApplicationWindowHelper::SupermodeCommands mySupermodeCommands
Supermode Commands.
long onCmdSaveTLSProgramsAs(FXObject *, FXSelector, void *)
called when the command/FXCall save TLSPrograms as is executed
FXMenuTitle * myModesMenuTitle
menu title for modes
void create()
Creates the main window (required by FOX)
long onCmdToggleDrawJunctionShape(FXObject *, FXSelector, void *)
called if the user press key combination Ctrl + J to toggle draw junction shape
GNEApplicationWindowHelper::WindowsMenuCommands myWindowsMenuCommands
Windows Menu Commands.
GNELoadThread * myLoadThread
the thread that loads the network
void clearUndoList()
clear undo list
GNENet * myNet
we are responsible for the net
long onCmdSaveEdgeTypes(FXObject *, FXSelector, void *)
called when the command/FXCall save edge types is executed
long onCmdOpenUndoListDialog(FXObject *, FXSelector, void *)
void handleEvent_Message(GUIEvent *e)
handle event of type message
long onCmdOpenSUMOConfig(FXObject *, FXSelector, void *)
called when the command/FXCall open SUMOConfig is executed
bool continueWithUnsavedDemandElementChanges(const std::string &operation)
warns about unsaved changes in demand elements and gives the user the option to abort
long onCmdReloadDataElements(FXObject *, FXSelector, void *)
called when the command/FXCall reload data elements is executed
long onCmdLoadAdditionalsInSUMOGUI(FXObject *, FXSelector, void *)
called when user toggle windows checkbox "load additionals"
long onCmdOpenTLSPrograms(FXObject *, FXSelector, void *)
called when the command/FXCall open TLS programs is executed
long onUpdComputePathManager(FXObject *obj, FXSelector sel, void *ptr)
called when the update/FXCall compute path manager is executed
void updateControls()
update control contents after undo/redo or recompute
GNEApplicationWindowHelper::LockMenuCommands myLockMenuCommands
Lock Menu Commands.
long computeJunctionWithVolatileOptions()
called if the user selects Processing->compute junctions with volatile options
long onCmdNewNetwork(FXObject *, FXSelector, void *)
called when the command/FXCall new network is executed
GNEApplicationWindow()
FOX needs this for static members.
long onClipboardRequest(FXObject *sender, FXSelector sel, void *ptr)
called when the command/FXCall clipboard request is executed
FXMenuPane * myFileMenuAdditionals
long onCmdSaveSUMOConfig(FXObject *, FXSelector, void *)
called when the command/FXCall save SUMOConfig is executed
long onUpdSaveNetwork(FXObject *, FXSelector, void *)
called when the update/FXCall save network is executed
std::string myUndoRedoListEnabled
string to check if undo/redo list is enabled (a String is used to keep the disabling reason)
long onUpdSaveEdgeTypesAs(FXObject *, FXSelector, void *)
called when the command/FXCall save edgeTypes as is updated
std::string myConfigPattern
Input file pattern.
long onUpdReloadDataElements(FXObject *, FXSelector, void *)
called when the command/FXCall reload data elements is updated
long onCmdClose(FXObject *, FXSelector, void *)
called when the command/FXCall close is executed
long onCmdEditViewport(FXObject *, FXSelector, void *)
Called on menu Edit->Viewport.
long onCmdToggleViewOption(FXObject *, FXSelector, void *)
toggle viewOption
FXEX::MFXThreadEvent myLoadThreadEvent
io-event with the load-thread
void enableSaveAdditionalsMenu()
enable save additionals
long onCmdToggleEditOptions(FXObject *, FXSelector, void *)
called if the user press key combination Alt + <0-9>
GNEApplicationWindowHelper::MenuBarFile myMenuBarFile
MenuBarFile.
long onCmdOpenAdditionals(FXObject *, FXSelector, void *)
called when the command/FXCall open additionals is executed
long onCmdForceSaveDataElements(FXObject *sender, FXSelector sel, void *ptr)
force save data elements (flag)
long onCmdForceSaveAdditionals(FXObject *sender, FXSelector sel, void *ptr)
force save additionals (flag)
long onUpdSaveSUMOConfig(FXObject *, FXSelector, void *)
called when the command/FXCall save SUMOConfig is updated
long onUpdRedo(FXObject *obj, FXSelector sel, void *ptr)
called when the update/FXCall redo is executed
long onUpdReload(FXObject *, FXSelector, void *)
called when the update/FXCall reload is executed
GNEApplicationWindowHelper::ProcessingMenuCommands myProcessingMenuCommands
Processing Menu Commands.
long onUpdSaveAdditionalsAs(FXObject *, FXSelector, void *)
called when the update/FXCall save additionals as is executed
GNEApplicationWindowHelper::EditMenuCommands & getEditMenuCommands()
getEdit Menu Commands (needed for show/hide menu commands)
void setStatusBarText(const std::string &statusBarText)
set text of the statusBar
GNEUndoList * myUndoList
the one and only undo list
long onUpdSaveDataElements(FXObject *, FXSelector, void *)
called when the update/FXCall save data elements is executed
long onCmdPaste(FXObject *, FXSelector, void *)
long onCmdSaveAsPlainXML(FXObject *, FXSelector, void *)
called when the command/FXCall save as plain xml is executed
void disableSaveDemandElementsMenu()
disable save demand elements
long onUpdSaveDemandElementsAs(FXObject *, FXSelector, void *)
called when the update/FXCall save demand elements as is executed
long onCmdOpenNetwork(FXObject *, FXSelector, void *)
called when the command/FXCall open network is executed
long onUpdReloadSUMOConfig(FXObject *, FXSelector, void *)
called when the command/FXCall reload SUMOConfig is updated
void closeAllWindows()
this method closes all windows and deletes the current simulation *‍/
long onCmdForceSaveNetwork(FXObject *sender, FXSelector sel, void *ptr)
force save network (flag)
long onCmdComputePathManager(FXObject *, FXSelector, void *)
bool continueWithUnsavedDataElementChanges(const std::string &operation)
warns about unsaved changes in data elements and gives the user the option to abort
long onCmdCopyTemplate(FXObject *, FXSelector, void *)
void enableSaveDataElementsMenu()
enable save data elements
FXString getFolder(const std::string &folder) const
extract folder
long onLoadThreadEvent(FXObject *, FXSelector, void *)
called when the command/FXCall load thread is executed
long onUpdRequireRecomputing(FXObject *sender, FXSelector sel, void *ptr)
update label for requiere recomputing
FXMDIMenu * myMDIMenu
The menu used for the MDI-windows.
long onCmdReloadDemandElements(FXObject *, FXSelector, void *)
called when the command/FXCall reload demand elements is executed
long onUpdSaveDemandElements(FXObject *, FXSelector, void *)
called when the update/FXCall save demand elements is executed
void loadConfigOrNet(const std::string file, bool isNet, bool isReload=false, bool useStartupOptions=false, bool newNet=false)
starts to load a netimport configuration or a network *‍/
long onUpdReloadAdditionals(FXObject *, FXSelector, void *)
called when the command/FXCall reload additionals is updated
SUMOTime getCurrentSimTime() const
get current simulation time (pure virtual but we don't need it)
long onCmdOptions(FXObject *, FXSelector, void *)
called if the user selects Processing->Configure Options
long onCmdReloadEdgeTypes(FXObject *, FXSelector, void *)
called when the command/FXCall reload edge types is executed
long onCmdLockAllElements(FXObject *, FXSelector sel, void *)
called when user press lock all elements button
long onKeyPress(FXObject *o, FXSelector sel, void *data)
called when a key is pressed
void disableSaveAdditionalsMenu()
disable save additionals
long onCmdQuit(FXObject *, FXSelector, void *)
Called by FOX if the application shall be closed.
long onCmdSaveEdgeTypesAs(FXObject *, FXSelector, void *)
called when the command/FXCall save edgeTypes as is executed
long onCmdClearMsgWindow(FXObject *, FXSelector, void *)
called when the command/FXCall clear message windows is executed
long onCmdLockElements(FXObject *, FXSelector sel, void *)
called when user press a lock menu check
MFXButtonTooltip * myRequireRecomputingButton
Button used for show if recomputing is needed.
long onCmdClearTemplate(FXObject *, FXSelector, void *)
MFXSynchQue< GUIEvent * > myEvents
List of got requests.
GNEUndoList * getUndoList()
get pointer to undoList
long onUpdNeedsFrontElement(FXObject *, FXSelector, void *)
called when the update/FXCall needs front element is executed
long onCmdProcessButton(FXObject *, FXSelector sel, void *)
called when user press a process button (or a shortcut)
FXMenuTitle * myLockMenuTitle
menu title for lock
void loadOptionOnStartup()
load net on startup
GNEViewNet * getViewNet()
get pointer to viewNet
long onCmdSaveAdditionalsAs(FXObject *, FXSelector, void *)
called when the command/FXCall save additionals as is executed
GNEUndoListDialog * getUndoListDialog()
get pointer to undoList dialog
GNEApplicationWindowHelper::LocateMenuCommands myLocateMenuCommands
Locate Menu Commands.
bool continueWithUnsavedChanges(const std::string &operation)
warns about unsaved changes and gives the user the option to abort
long onCmdUndo(FXObject *, FXSelector, void *)
called when user press Ctrl+Z
long onCmdAbout(FXObject *, FXSelector, void *)
called when the command/FXCall show about dialog is executed
long onUpdReloadEdgeTypes(FXObject *, FXSelector, void *)
called when the command/FXCall reload edge types is updated
long onCmdToggleGrid(FXObject *, FXSelector, void *)
called if the user press key combination Ctrl + G to toggle grid
void dependentBuild()
build dependent
long onUpdSaveDataElementsAs(FXObject *, FXSelector, void *)
called when the update/FXCall save data elements as is executed
FXMenuPane * myFileMenuDemandElements
void loadNet(const std::string &file)
load network
long onCmdEditChosen(FXObject *, FXSelector, void *)
called when the command/FXCall edit chosen is executed
long onUpdReloadTLSPrograms(FXObject *, FXSelector, void *)
called when the command/FXCall reload TLS programs is updated
GNEApplicationWindowHelper::EditMenuCommands myEditMenuCommands
Edit Menu Commands.
long onCmdForceSaveDemandElements(FXObject *sender, FXSelector sel, void *ptr)
force save demand elements (flag)
long onCmdSetSuperMode(FXObject *sender, FXSelector sel, void *ptr)
called if the user hits an edit-supermode hotkey
long onCmdAbort(FXObject *sender, FXSelector sel, void *ptr)
called if the user hits esc
GNEViewNet * myViewNet
pointer to current view net
long onCmdReloadAdditionals(FXObject *, FXSelector, void *)
called when the command/FXCall reload additionals is executed
long onUpdOpenUndoListDialog(FXObject *, FXSelector, void *)
long onUpdNeedsNetworkElement(FXObject *, FXSelector, void *)
called when the update/FXCall needs at least one newtork element is executed
const FXString myTitlePrefix
the prefix for the window title
void enableSaveTLSProgramsMenu()
enable save TLS Programs
double getTrackerInterval() const
get current tracker interval (pure virtual but we don't need it)
long onCmdReload(FXObject *, FXSelector, void *)
called when the command/FXCall reload is executed
void disableSaveDataElementsMenu()
disable save data elements
void fillMenuBar()
Builds the menu bar.
long onCmdFocusFrame(FXObject *sender, FXSelector sel, void *ptr)
called if the user hits key combination for focus on frame
GNEApplicationWindowHelper::LockMenuCommands & getLockMenuCommands()
get lock Menu Commands
long onCmdHelp(FXObject *sender, FXSelector sel, void *ptr)
called if the user selects help->Documentation
long onUpdRequireViewNet(FXObject *sender, FXSelector sel, void *ptr)
enable or disable sender object depending if viewNet exist
long onCmdSaveDemandElements(FXObject *, FXSelector, void *)
called when the command/FXCall save demand elements is executed
long onCmdCut(FXObject *, FXSelector, void *)
called when user press Ctrl+Z
long onCmdNewWindow(FXObject *, FXSelector, void *)
long onCmdOpenEdgeTypes(FXObject *, FXSelector, void *)
called when the command/FXCall open edgeType is executed
bool myReloading
information whether the gui is currently reloading
void enableSaveDemandElementsMenu()
enable save demand elements
long onCmdLoadDemandInSUMOGUI(FXObject *, FXSelector, void *)
called when user toggle windows checkbox "load demand"
long onUpdLockMenuTitle(FXObject *, FXSelector sel, void *)
enable or disable lock menu title
bool myAmLoading
information whether the gui is currently loading and the load-options shall be greyed out
long onCmdOpenConfiguration(FXObject *, FXSelector, void *)
called when the command/FXCall open configuration is executed
long onUpdSaveAdditionals(FXObject *, FXSelector, void *)
called when the update/FXCall save additionals is executed
long onCmdSaveDemandElementsAs(FXObject *, FXSelector, void *)
called when the command/FXCall save demand elements as is executed
long onCmdReloadTLSPrograms(FXObject *, FXSelector, void *)
called when the command/FXCall reload TLS programs is executed
long onCmdSaveDataElementsAs(FXObject *, FXSelector, void *)
called when the command/FXCall save data elements as is executed
GNEApplicationWindowHelper::FileMenuCommands myFileMenuCommands
File Menu Commands.
long onCmdSaveAllElements(FXObject *, FXSelector, void *)
called when the command/FXCall save all elements is executed
long onCmdOpenRecent(FXObject *, FXSelector, void *)
called when the command/FXCall open recent is executed
long onCmdChangelog(FXObject *sender, FXSelector sel, void *ptr)
called if the user selects help->Changelog
long onUpdOpen(FXObject *, FXSelector, void *)
called when the command/FXCall on update open executed
long onCmdSetMode(FXObject *sender, FXSelector sel, void *ptr)
called if the user hits an edit-mode hotkey
bool myHadDependentBuild
check if had dependent build
long onCmdBackspace(FXObject *sender, FXSelector sel, void *ptr)
called if the user hits backspace
void updateRecomputingLabel()
update recomputing label
void handleEvent_NetworkLoaded(GUIEvent *e)
handle event of type Network loaded
long onCmdCopy(FXObject *, FXSelector, void *)
long onCmdOpenSUMOGUI(FXObject *sender, FXSelector sel, void *ptr)
called if the user hints ctrl + T
long onUpdSaveAllElements(FXObject *, FXSelector, void *)
called when the update/FXCall save all elements is executed
void disableUndoRedo(const std::string &reason)
disable undo-redo giving a string with the reason
long onCmdOpenDemandElements(FXObject *, FXSelector, void *)
called when the command/FXCall open demand is executed
long onCmdToogleComputeNetworkData(FXObject *, FXSelector, void *)
called when toogle checkbox compute network when swichting between supermodes
void enableUndoRedo()
disable undo-redo
bool continueWithUnsavedAdditionalChanges(const std::string &operation)
warns about unsaved changes in additionals and gives the user the option to abort
long onUpdToggleViewOption(FXObject *, FXSelector, void *)
update viewOption
GNEApplicationWindowHelper::ToolsMenuCommands myToolsMenuCommands
Tools Menu Commands.
long onCmdUnlockAllElements(FXObject *, FXSelector sel, void *)
called when user press unlock all elements button
const std::string & isUndoRedoEnabled() const
check if undo-redo is enabled
long onUpdNeedsNetwork(FXObject *, FXSelector, void *)
called when the update/FXCall needs network is executed
GNEApplicationWindowHelper::ToolbarsGrip & getToolbarsGrip()
get ToolbarsGrip
long onCmdSaveDataElements(FXObject *, FXSelector, void *)
called when the command/FXCall save data elements is executed
long onCmdLocate(FXObject *, FXSelector, void *)
called when the command/FXCall locate is executed
long onCmdDel(FXObject *sender, FXSelector sel, void *ptr)
called if the user hits del
long onCmdHotkeys(FXObject *sender, FXSelector sel, void *ptr)
called if the user selects help->Hotkeys
long onCmdOpenDataElements(FXObject *, FXSelector, void *)
called when the command/FXCall open data is executed
void updateSuperModeMenuCommands(const Supermode supermode)
update FXMenuCommands depending of supermode
long onCmdToolNetDiff(FXObject *, FXSelector, void *)
called when the command/FXCall run NetDiff is executed
long onCmdSetFrontElement(FXObject *, FXSelector, void *)
called if the user call set front element
GNEUndoListDialog * myUndoListDialog
undoList dialog
long onUpdReloadDemandElements(FXObject *, FXSelector, void *)
called when the command/FXCall reload demand elements is updated
long onCmdEnter(FXObject *sender, FXSelector sel, void *ptr)
called if the user hits enter
FXCursor * getDefaultCursor()
get default cursor
long onCmdSetTemplate(FXObject *, FXSelector, void *)
long onCmdTutorial(FXObject *sender, FXSelector sel, void *ptr)
called if the user selects help->Tutorial
long onCmdRedo(FXObject *, FXSelector, void *)
long onUpdUndo(FXObject *obj, FXSelector sel, void *ptr)
called when the update/FXCall undo is executed
const GNEApplicationWindowHelper::ProcessingMenuCommands & getProcessingMenuCommands() const
get processing Menu Commands
GUIMessageWindow * myMessageWindow
A window to display messages, warnings and error in.
FXSplitter * myMainSplitter
The splitter that divides the main window into view and the log window.
long onCmdLockSelectElements(FXObject *, FXSelector sel, void *)
called when user press lock select elements button
long onCmdSaveTLSPrograms(FXObject *, FXSelector, void *)
called when the command/FXCall save TLSPrograms is executed
long onUpdSaveEdgeTypes(FXObject *, FXSelector, void *)
called when the command/FXCall save edge types is updated
long onCmdSaveJoined(FXObject *, FXSelector, void *)
called when the command/FXCall save joined is executed
long onCmdSaveNetwork(FXObject *, FXSelector, void *)
called when the command/FXCall save network is executed
FXMenuPane * myFileMenu
the submenus
GNEApplicationWindowHelper::ToolbarsGrip myToolbarsGrip
Toolbars Grip.
FXMenuPane * myFileMenuDataElements
long onKeyRelease(FXObject *o, FXSelector sel, void *data)
called when a key is released
GNEApplicationWindowHelper::ModesMenuCommands myModesMenuCommands
Modes Menu Commands.
long onUpdSaveTLSPrograms(FXObject *, FXSelector, void *)
called when the command/FXCall save TLSPrograms is updated
FXGLCanvas * getBuildGLCanvas() const
get build GL Canvas (must be implemented in all children)
long onCmdEditViewScheme(FXObject *, FXSelector, void *)
Called on menu Edit->Visualization.
long onCmdOpenForeign(FXObject *, FXSelector, void *)
called when the command/FXCall open foreign is executed
long onCmdSaveSUMOConfigAs(FXObject *, FXSelector, void *)
called when the command/FXCall save SUMOConfig as is executed
void refreshEdgeTypeSelector()
refresh edge type selector
EdgeTypeSelector * getEdgeTypeSelector() const
get edgeType selector
void addLaneType(GNELaneType *laneType)
add laneType
const bool viewportFromRegistry
whether loading viewport from registry
const std::string file
the name of the loaded file
const bool isNewNet
flag for new net
GNENet *const net
the loaded net
const std::string settingsFile
the name of the settings file to load
Dialog fix network elements.
virtual void updateFrameAfterUndoRedo()
function called after undo/redo in the current frame (can be reimplemented in frame children)
Definition: GNEFrame.cpp:251
bool isErrorCreatingElement() const
get flag for check if a element wasn't created
bool isSelectingParent() const
check if we're selecting a new parent
void refreshNeteditAttributesEditor(bool forceRefresh)
refresh netedit attributes
void stopSelectParent()
stop select new parent
void clearTemplate()
clear template (used by shortcut)
void setTemplate()
set template (used by shortcut)
void copyTemplate()
copy template (used by shortcut)
void inspectSingleElement(GNEAttributeCarrier *AC)
Inspect a single element.
TemplateEditor * getTemplateEditor() const
get template editor
GNEInspectorFrame::NeteditAttributesEditor * getNeteditAttributesEditor() const
get Netedit Attributes editor
void loadConfigOrNet(const std::string &file, const bool isNet, const bool useStartupOptions, const bool newNet=false)
begins the loading of a netconvert configuration or a a network
static void fillOptions(OptionsCont &oc)
clears and initializes the OptionsCont
static void setDefaultOptions(OptionsCont &oc)
sets required options for proper functioning
const std::map< SumoXMLTag, std::set< GNEDemandElement * > > & getDemandElements() const
get demand elements
const std::set< GNEDataSet * > & getDataSets() const
get demand elements
const std::map< std::string, GNEEdge * > & getEdges() const
map with the ID and pointer to edges of net
int getNumberOfDemandElements() const
Return the number of demand elements.
int getNumberOfAdditionals() const
get number of additionals
const std::set< GNECrossing * > & getCrossings() const
get crossings
const std::map< std::string, GNEJunction * > & getJunctions() const
get junctions
const std::map< std::string, GNEEdgeType * > & getEdgeTypes() const
map with the ID and pointer to edgeTypes of net
void clearAdditionalElements(GNEUndoList *undoList)
clear additionals
Definition: GNENet.cpp:1941
void removeSolitaryJunctions(GNEUndoList *undoList)
removes junctions that have no edges
Definition: GNENet.cpp:1589
void saveJoined(OptionsCont &oc, const std::string &filename)
save log of joined junctions (and nothing else)
Definition: GNENet.cpp:1222
bool joinSelectedJunctions(GNEUndoList *undoList)
join selected junctions
Definition: GNENet.cpp:1400
void saveDemandElements(const std::string &filename)
save demand element elements of the network
Definition: GNENet.cpp:2096
void saveTLSPrograms(const std::string &filename)
save TLS Programs elements of the network
Definition: GNENet.cpp:2550
bool isNetSaved() const
return if net has to be saved
Definition: GNENet.cpp:1185
void enableUpdateData()
Definition: GNENet.cpp:2617
void savePlain(OptionsCont &oc, const std::string &prefix)
save plain xml representation of the network (and nothing else)
Definition: GNENet.cpp:1214
void requireSaveNet(bool value)
inform that net has to be saved
Definition: GNENet.cpp:1179
void saveEdgeTypes(const std::string &filename)
save edgeTypes elements of the network
Definition: GNENet.cpp:2571
void clearDemandElements(GNEUndoList *undoList)
clear demand elements
Definition: GNENet.cpp:1954
void adjustPersonPlans(GNEUndoList *undoList)
adjust person plans
Definition: GNENet.cpp:1696
void requireSaveAdditionals(bool value)
inform that additionals has to be saved
Definition: GNENet.cpp:2017
void cleanInvalidDemandElements(GNEUndoList *undoList)
clean invalid demand elements
Definition: GNENet.cpp:1741
void cleanUnusedRoutes(GNEUndoList *undoList)
clean unused routes
Definition: GNENet.cpp:1606
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition: GNENet.cpp:132
void computeNetwork(GNEApplicationWindow *window, bool force=false, bool volatileOptions=false, std::string additionalPath="", std::string demandPath="", std::string dataPath="")
trigger full netbuild computation param[in] window The window to inform about delay param[in] force W...
Definition: GNENet.cpp:1269
bool isAdditionalsSaved() const
check if additionals are saved
Definition: GNENet.cpp:2077
void disableUpdateData()
disable update data elements after inserting or removing an element in net
Definition: GNENet.cpp:2628
bool isNetRecomputed() const
check if net require recomputing
Definition: GNENet.cpp:1382
bool cleanInvalidCrossings(GNEUndoList *undoList)
clear invalid crossings
Definition: GNENet.cpp:1537
void joinRoutes(GNEUndoList *undoList)
join routes
Definition: GNENet.cpp:1632
void requireSaveDemandElements(bool value)
inform that demand elements has to be saved
Definition: GNENet.cpp:2083
GNEPathManager * getPathManager()
get path manager
Definition: GNENet.cpp:138
void requireSaveDataElements(bool value)
inform that data sets has to be saved
Definition: GNENet.cpp:2150
void saveDataElements(const std::string &filename)
save data set elements of the network
Definition: GNENet.cpp:2163
void saveAdditionals(const std::string &filename)
save additional elements of the network
Definition: GNENet.cpp:2030
void saveNetwork(OptionsCont &oc)
save the network
Definition: GNENet.cpp:1191
bool isDataElementsSaved() const
check if data sets are saved
Definition: GNENet.cpp:2178
GNEViewNet * getViewNet() const
get view net
Definition: GNENet.cpp:1987
void computeDemandElements(GNEApplicationWindow *window)
compute demand elements param[in] window The window to inform about delay
Definition: GNENet.cpp:1325
bool isDemandElementsSaved() const
check if demand elements are saved
Definition: GNENet.cpp:2144
Dialog for edit rerouters.
void updatePathCalculator()
update path calculator (called when SuperModes Demand or Data is selected)
bool isPathCalculatorUpdated() const
check if pathCalculator is updated
PathCalculator * getPathCalculator()
obtain instance of PathCalculator
bool isChangesPending() const
return true if there is changes to save
const std::vector< CurrentTAZ::TAZEdgeColor > & getEdgeAndTAZChildrenSelected() const
get map with edge and TAZChildren
void clearSelectedEdges()
clear current TAZ children
TAZSelectionStatistics * getTAZSelectionStatisticsModule() const
get TAZ Selection Statistics modul
TAZSaveChanges * getTAZSaveChangesModule() const
get TAZ Save Changes modul
bool parseTLSPrograms(const std::string &file)
parse TLS Programs from a file
Dialog for edit rerouters.
void show()
show window
bool shown() const
check if dialog is shown
void setFocus()
Move the focus to this window.
void hide()
hide window
void end()
End undo command sub-group. If the sub-group is still empty, it will be deleted; otherwise,...
void undo()
undo the last command group
long onUpdUndo(FXObject *, FXSelector, void *)
event after Undo
void begin(GUIIcon icon, const std::string &description)
Begin undo command sub-group with current supermode. This begins a new group of commands that are tre...
void abortAllChangeGroups()
reverts and discards ALL active chained change groups
Supermode getRedoSupermode() const
get redo supermode
long onUpdRedo(FXObject *, FXSelector, void *)
event after Redo
Supermode getUndoSupermode() const
get undo supermode
void redo()
redo the last command group
void add(GNEChange *command, bool doit=false, bool merge=true)
Add new command, executing it if desired. The new command will be merged with the previous command if...
long onCmdToggleShowDemandElementsNetwork(FXObject *, FXSelector, void *)
toggle show demand elements (network)
const GNEViewNetHelper::DataViewOptions & getDataViewOptions() const
get data view options
Definition: GNEViewNet.cpp:656
GNENet * getNet() const
get the net object
const GNEAttributeCarrier * getFrontAttributeCarrier() const
get front attributeCarrier
void hotkeyBackSpace()
handle backspace keypress
const GNEViewNetHelper::EditModes & getEditModes() const
get edit modes
Definition: GNEViewNet.cpp:632
void setFrontAttributeCarrier(GNEAttributeCarrier *AC)
set front attributeCarrier
long onCmdToggleShowDemandElementsData(FXObject *, FXSelector, void *)
toggle show demand elements (data)
void abortOperation(bool clearSelection=true)
abort current edition operation
long onCmdToggleWarnAboutMerge(FXObject *, FXSelector, void *)
toggle warn for merge
long onCmdToggleDrawSpreadVehicles(FXObject *, FXSelector, void *)
toggle draw vehicles in begin position or spread in lane
long onCmdToggleShowConnections(FXObject *, FXSelector, void *)
toggle show connections
long onCmdToggleShowTAZElements(FXObject *, FXSelector, void *)
toggle show TAZ elements
long onCmdToggleMoveElevation(FXObject *, FXSelector, void *)
toggle move elevation
long onCmdToggleShowAllPersonPlans(FXObject *, FXSelector, void *)
toggle show all person plans in super mode demand
long onCmdToggleTAZRelOnlyTo(FXObject *, FXSelector, void *)
toggle TAZRez only to
const GNEViewNetHelper::NetworkViewOptions & getNetworkViewOptions() const
get network view options
Definition: GNEViewNet.cpp:644
void hotkeyFocusFrame()
handle focus frame keypress
long onCmdToggleChainEdges(FXObject *, FXSelector, void *)
toggle chain edges
long onCmdToggleLockContainer(FXObject *, FXSelector, void *)
toggle lock container in super mode demand
long onCmdToggleShowGrid(FXObject *, FXSelector, void *)
toggle show grid
long onCmdToggleHideNonInspecteDemandElements(FXObject *, FXSelector, void *)
toggle hide non inspected demand elements
GNEViewParent * getViewParent() const
get the net object
long onCmdToggleDrawJunctionShape(FXObject *, FXSelector, void *)
toggle draw junction shape
long onCmdToggleShowShapes(FXObject *, FXSelector, void *)
toggle show shapes in super mode data
GNEUndoList * getUndoList() const
get the undoList object
void saveVisualizationSettings() const
Definition: GNEViewNet.cpp:604
long onCmdSetSupermode(FXObject *, FXSelector sel, void *)
long onCmdToggleExtendSelection(FXObject *, FXSelector, void *)
toggle extend selection
bool aksChangeSupermode(const std::string &operation, Supermode expectedSupermode)
ask about change supermode
Definition: GNEViewNet.cpp:846
long onCmdSetMode(FXObject *, FXSelector sel, void *)
called when user press a mode button (Network or demand)
void hotkeyEnter()
handle enter keypress
void forceSupermodeNetwork()
set supermode Network (used after load/create new network)
Definition: GNEViewNet.cpp:421
const std::vector< GNEAttributeCarrier * > & getInspectedAttributeCarriers() const
get inspected attribute carriers
long onCmdToggleShowOverlappedRoutes(FXObject *, FXSelector, void *)
toggle hide non inspected demand elements
long onCmdToggleAutoOppositeEdge(FXObject *, FXSelector, void *)
toggle autoOpposite edge
GNEViewNetHelper::LockManager & getLockManager()
get lock manager
void updateControls()
update control contents after undo/redo or recompute
void hotkeyDel()
handle del keypress
long onCmdToggleChangeAllPhases(FXObject *, FXSelector, void *)
toggle change all phases
long onCmdToggleTAZRelDrawing(FXObject *, FXSelector, void *)
toggle TAZRel drawing
long onCmdToggleShowJunctionBubbles(FXObject *, FXSelector, void *)
toggle show junction bubbles
long onCmdToggleShowAdditionalSubElements(FXObject *, FXSelector, void *)
toggle show additional sub-elements
long onCmdToggleShowAllContainerPlans(FXObject *, FXSelector, void *)
toggle show all container plans in super mode demand
long onCmdToggleTAZRelOnlyFrom(FXObject *, FXSelector, void *)
toggle TAZRez only from
long onCmdToggleShowAdditionals(FXObject *, FXSelector, void *)
toggle show additionals in super mode data
long onCmdToggleLockPerson(FXObject *, FXSelector, void *)
toggle lock person in super mode demand
long onCmdToggleSelectEdges(FXObject *, FXSelector, void *)
toggle select edges
long onCmdToggleShowTrips(FXObject *, FXSelector, void *)
toggle show all trips in super mode demand
long onCmdToggleHideShapes(FXObject *, FXSelector, void *)
toggle hide shapes in super mode demand
const GNEViewNetHelper::DemandViewOptions & getDemandViewOptions() const
get demand view options
Definition: GNEViewNet.cpp:650
void updateViewNet() const
Mark the entire GNEViewNet to be repainted later.
Definition: GNEViewNet.cpp:414
long onCmdToggleHideConnections(FXObject *, FXSelector, void *)
toggle hide connections
A single child window which contains a view of the simulation area.
Definition: GNEViewParent.h:84
void updateUndoRedoButtons()
update toolbar undo/redo buttons (called when user press Ctrl+Z/Y)
long onKeyPress(FXObject *o, FXSelector sel, void *data)
Called when user press a key.
GNETAZFrame * getTAZFrame() const
get frame for NETWORK_TAZ
GNETLSEditorFrame * getTLSEditorFrame() const
get frame for NETWORK_TLS
GNEInspectorFrame * getInspectorFrame() const
get frame for inspect elements
GNECreateEdgeFrame * getCreateEdgeFrame() const
get frame for NETWORK_CREATEEDGE
GNEFrame * getCurrentShownFrame() const
get current frame (note: it can be null)
long onCmdLocate(FXObject *, FXSelector, void *)
locator-callback
long onKeyRelease(FXObject *o, FXSelector sel, void *data)
Called when user releases a key.
void saveViewport(const double x, const double y, const double z, const double rot)
Makes the given viewport the default.
static void initCursors(FXApp *a)
Initiate GUICursorSubSys.
static FXMenuTitle * buildFXMenuTitle(FXComposite *p, const std::string &text, FXIcon *icon, FXMenuPane *menuPane)
build menu title
Definition: GUIDesigns.cpp:31
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
Definition: GUIDesigns.cpp:53
Editor for the list of chosen objects.
const std::string & getMsg() const
Returns the message.
GUIEventType getOwnType() const
returns the event type
Definition: GUIEvent.h:83
GUISUMOAbstractView * getView() const
return GUISUMOAbstractView
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
void setWindowSizeAndPos()
perform initial window positioning and sizing according to user options / previous call
std::vector< FXMainWindow * > myTrackerWindows
list of tracker windows
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 * myGeoFrame
FXHorizontalFrame * myTestFrame
FXHorizontalFrame * myCartesianFrame
FXLabel * myTestCoordinate
FXMutex myTrackerLock
A lock to make the removal and addition of trackers secure.
void storeWindowSizeAndPos()
record window position and size in registry
FXLabel * myGeoCoordinate
FXStatusBar * myStatusbar
The status bar.
FXGLVisual * myGLVisual
The gl-visual used.
std::vector< GUIGlChildWindow * > myGLWindows
list of GLWindows
A logging window for the gui.
void addSeparator()
Adds a a separator to this log window.
void unregisterMsgHandlers()
unregister message handlers
void clear()
Clears the window.
void appendMsg(GUIEventType eType, const std::string &msg)
Adds new text to the window.
void registerMsgHandlers()
register message handlers
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 addDecals(const std::vector< Decal > &decals)
add decals
void showViewschemeEditor()
show viewsscheme editor
virtual void showViewportEditor()
show viewport editor
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
void destroyPopup()
destroys the popup
An XML-handler for visualisation schemes.
const std::vector< std::string > & addSettings(GUISUMOAbstractView *view=0) const
Adds the parsed settings to the global list of settings.
void applyViewport(GUISUMOAbstractView *view) const
Sets the viewport which has been parsed.
void setSnapshots(GUISUMOAbstractView *view) const
Makes a snapshot if it has been parsed.
const std::vector< GUISUMOAbstractView::Decal > & getDecals() const
Returns the parsed decals.
static void buildNETEDITAccelerators(GNEApplicationWindow *GNEApp)
build NETEDIT Accelerators
static void close()
close GUITextureSubSys
static void resetTextures()
Reset textures.
static void initTextures(FXApp *a)
Initiate GUITextureSubSys for textures.
static std::string clipped
Definition: GUIUserIO.h:58
bool drawJunctionShape
whether the shape of the junction should be drawn
bool showGrid
Information whether a grid shall be shown.
bool parse()
parse
static void resetLoaded()
resets loaded location elements
bool amChecked() const
check if this MFXCheckableButton is checked
FXbool getCheck() const
Get check state (TRUE, FALSE or MAYBE)
void setCheck(FXbool s=TRUE)
Set check state (TRUE, FALSE or MAYBE)
void pop()
Definition: MFXSynchQue.h:65
bool empty()
Definition: MFXSynchQue.h:128
static FXString getFilename2Write(FXWindow *parent, const FXString &header, const FXString &extension, FXIcon *icon, FXString &currentFolder)
Returns the file name to write.
Definition: MFXUtils.cpp:82
static FXString getTitleText(const FXString &appname, FXString filename="")
Returns the title text in dependance to an optional file name.
Definition: MFXUtils.cpp:60
static bool checkOptions()
Checks set options from the OptionsCont-singleton for being valid.
Definition: NBFrame.cpp:696
A storage for available edgeTypes of edges.
Definition: NBTypeCont.h:52
int size() const
Returns the number of known edgeTypes.
Definition: NBTypeCont.cpp:255
static bool checkOptions()
Checks set options from the OptionsCont-singleton for being valid.
Definition: NIFrame.cpp:370
static bool load(SUMOSAXHandler *handler, const std::vector< std::string > &files, const std::string &type, const bool stringParse=false)
Importer for edge type information stored in XML.
static bool checkOptions()
Checks set options from the OptionsCont-singleton for being valid.
Definition: NWFrame.cpp:125
A storage for options typed value containers)
Definition: OptionsCont.h:89
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
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.
bool set(const std::string &name, const std::string &value, const bool append=false)
Sets the given value for the named option.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
void resetWritable()
Resets all options to be writeable.
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:59
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:85
double x() const
Returns the x-position.
Definition: Position.h:55
double y() const
Returns the y-position.
Definition: Position.h:60
static bool endsWith(const std::string &str, const std::string suffix)
Checks whether a given string ends with the suffix.
static unsigned long runHiddenCommand(const std::string &cmd)
run a shell command without popping up any windows (particuarly on win32)
Definition: SysUtils.cpp:72
static bool checkOptions()
checks shared options and sets StdDefs
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme, const std::string &routeValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:65
@ SEL_THREAD_EVENT
Definition: fxexdefs.h:173
@ SEL_THREAD
Definition: fxexdefs.h:155
void buildDataViewOptionsMenuChecks(FXMenuPane *editMenu)
build menu checks
void buildDemandViewOptionsMenuChecks(FXMenuPane *editMenu)
build menu checks
void buildNetworkViewOptionsMenuChecks(FXMenuPane *editMenu)
build menu checks
DemandViewOptions demandViewOptions
demand view options
NetworkViewOptions networkViewOptions
network view options
void buildUndoRedoMenuCommands(FXMenuPane *editMenu)
build undo-redo menu commands
void buildViewMenuCommands(FXMenuPane *editMenu)
build view menu commands
FXMenuCheck * loadAdditionalsInSUMOGUI
menu check for load additionals in SUMO GUI
FXMenuCommand * undoLastChange
FXMenuCommand for undo last change.
FXMenuCheck * loadDemandInSUMOGUI
menu check for load demand in SUMO GUI
FXMenuCommand * redoLastChange
FXMenuCommand for redo last change.
void buildOpenSUMOMenuCommands(FXMenuPane *editMenu)
build open sumo menu commands
void buildFrontElementMenuCommand(FXMenuPane *editMenu)
build front element commands
FXMenuCascade * dataMenuCascade
FXMenuCascade for data.
FXMenuCascade * TLSMenuCascade
FXMenuCascade for TLS.
FXMenuCommand * saveSUMOConfig
FXMenuCommand for enable or disable save SUMOConfig.
FXMenuCommand * saveTLSPrograms
FXMenuCommand for enable or disable save TLS Programs.
FXMenuCascade * demandMenuCascade
FXMenuCascade for demand.
FXMenuCommand * saveEdgeTypes
FXMenuCommand for enable or disable save edgeTypes.
FXMenuCommand * reloadTLSPrograms
FXMenuCommand for reload TLS Programs.
FXMenuCascade * additionalMenuCascade
FXMenuCascade for additional.
FXMenuCommand * saveDemandElementsAs
FXMenuCommand for enable or disable save demand elements as.
FXMenuCommand * saveDataElementsAs
FXMenuCommand for enable or disable save data elements as.
FXMenuCascade * SUMOConfigMenuCascade
FXMenuCascade for SUMOConfig.
FXMenuCommand * saveAdditionals
FXMenuCommand for enable or disable save additionals.
FXMenuCommand * saveDemandElements
FXMenuCommand for enable or disable save demand elements.
FXMenuCommand * reloadSUMOConfig
FXMenuCommand for reload SUMOConfig.
FXMenuCommand * saveDataElements
FXMenuCommand for enable or disable save data elements.
FXMenuCommand * reloadAdditionals
FXMenuCommand for reload additionals.
FXMenuCommand * reloadDataElements
FXMenuCommand for reload data elements.
void buildFileMenuCommands(FXMenuPane *fileMenu, FXMenuPane *fileMenuSUMOConfig, FXMenuPane *fileMenuTLS, FXMenuPane *fileMenuEdgeTypes, FXMenuPane *fileMenuAdditionals, FXMenuPane *fileMenuDemandElements, FXMenuPane *fileMenuDataElements)
build menu commands
FXMenuCommand * reloadDemandElements
FXMenuCommand for reload demand elements.
FXMenuCommand * reloadEdgeTypes
FXMenuCommand for reload Edge Types.
FXMenuCommand * saveAdditionalsAs
FXMenuCommand for enable or disable save additionals As.
FXMenuCascade * edgeTypesMenuCascade
FXMenuCascade for edgeTypes.
void buildLocateMenuCommands(FXMenuPane *locateMenu)
build menu commands
void buildLockMenuCommands(FXMenuPane *editMenu)
build menu commands
void hideNetworkLockMenuCommands()
show network processing menu commands
void hideDemandLockMenuCommands()
show demand processing menu commands
void hideDataLockMenuCommands()
show data processing menu commands
void showDataLockMenuCommands()
show data processing menu commands
void showNetworkLockMenuCommands()
show network processing menu commands
void showDemandLockMenuCommands()
show demand processing menu commands
void buildRecentFiles(FXMenuPane *fileMenu)
build recent files
MFXRecentNetworks myRecentNetsAndConfigs
List of recent nets and config files.
void buildModesMenuCommands(FXMenuPane *modesMenu)
build modes menu commands
DemandMenuCommands demandMenuCommands
Demand Menu Commands.
DataMenuCommands dataMenuCommands
Data Menu Commands.
NetworkMenuCommands networkMenuCommands
Network Menu Commands.
void showDataProcessingMenuCommands()
show data processing menu commands
MFXMenuCheckIcon * menuCheckRecomputeDataMode
checkBox for recomputing when changing data mode
void showDemandProcessingMenuCommands()
show demand processing menu commands
void hideDemandProcessingMenuCommands()
show demand processing menu commands
void hideDataProcessingMenuCommands()
show data processing menu commands
void buildProcessingMenuCommands(FXMenuPane *processingMenu)
build menu commands
void showNetworkProcessingMenuCommands()
show network processing menu commands
void hideNetworkProcessingMenuCommands()
show network processing menu commands
void buildSupermodeCommands(FXMenuPane *editMenu)
build menu commands
void buildMenuToolbarsGrip()
build menu toolbar grips
FXMenuBar * menu
The application menu bar (for file, edit, processing...)
void buildToolsMenuCommands(FXMenuPane *locateMenu)
build menu commands
void buildWindowsMenuCommands(FXMenuPane *windowsMenu, FXStatusBar *statusbar, GUIMessageWindow *messageWindow)
build menu commands
static bool toggleEditOptionsData(GNEViewNet *viewNet, const MFXCheckableButton *menuCheck, const int numericalKeyPressed, FXObject *obj, FXSelector sel)
toggle edit options Data menu commands (called in GNEApplicationWindow::onCmdToggleEditOptions)
static bool stringEndsWith(const std::string &str, const std::string &suffix)
check if a string ends with another string
static void saveSUMOConfig()
save SUMOConfig
static bool toggleEditOptionsDemand(GNEViewNet *viewNet, const MFXCheckableButton *menuCheck, const int numericalKeyPressed, FXObject *obj, FXSelector sel)
toggle edit options Demand menu commands (called in GNEApplicationWindow::onCmdToggleEditOptions)
static bool toggleEditOptionsNetwork(GNEViewNet *viewNet, const MFXCheckableButton *menuCheck, const int numericalKeyPressed, FXObject *obj, FXSelector sel)
toggle edit options Network menu commands (called in GNEApplicationWindow::onCmdToggleEditOptions)
MFXCheckableButton * menuCheckToggleTAZDrawFill
menu check to toggle TAZ draw fill
MFXCheckableButton * menuCheckShowAdditionals
menu check to show Additionals
MFXCheckableButton * menuCheckShowShapes
menu check to show Shapes
MFXCheckableButton * menuCheckToggleTAZRelOnlyFrom
menu check to toggle TAZRel only from
MFXCheckableButton * menuCheckToggleDrawJunctionShape
checkable button to show junction shapes
void getVisibleDataMenuCommands(std::vector< MFXCheckableButton * > &commands) const
get visible demand menu commands
MFXCheckableButton * menuCheckToggleTAZRelDrawing
menu check to toggle TAZ Rel drawing
MFXCheckableButton * menuCheckShowDemandElements
menu check to show Demand Elements
MFXCheckableButton * menuCheckToggleTAZRelOnlyTo
menu check to toggle TAZRel only to
MFXCheckableButton * menuCheckShowAllTrips
show all trips
MFXCheckableButton * menuCheckToggleGrid
menu check to show grid button
MFXCheckableButton * menuCheckToggleDrawJunctionShape
checkable button to show junction shapes
MFXCheckableButton * menuCheckDrawSpreadVehicles
menu check to draw vehicles in begin position or spread in lane
MFXCheckableButton * menuCheckShowOverlappedRoutes
show overlapped routes
MFXCheckableButton * menuCheckShowAllPersonPlans
show all person plans
MFXCheckableButton * menuCheckShowAllContainerPlans
show all container plans
MFXCheckableButton * menuCheckHideNonInspectedDemandElements
Hide non inspected demand elements.
MFXCheckableButton * menuCheckHideShapes
Hide shapes (Polygons and POIs)
MFXCheckableButton * menuCheckLockPerson
Lock Person.
void getVisibleDemandMenuCommands(std::vector< MFXCheckableButton * > &commands) const
get visible demand menu commands
MFXCheckableButton * menuCheckLockContainer
Lock Container.
DataEditMode dataEditMode
the current Data edit mode
DemandEditMode demandEditMode
the current Demand edit mode
Supermode currentSupermode
the current supermode
NetworkEditMode networkEditMode
the current Network edit mode
bool isCurrentSupermodeDemand() const
@check if current supermode is Demand
bool isCurrentSupermodeData() const
@check if current supermode is Data
bool isCurrentSupermodeNetwork() const
@check if current supermode is Network
MFXCheckableButton * menuCheckSelectEdges
checkable button to select only edges
MFXCheckableButton * menuCheckChainEdges
checkable button to the endpoint for a created edge should be set as the new source
MFXCheckableButton * menuCheckShowDemandElements
checkable button to show Demand Elements
MFXCheckableButton * menuCheckMoveElevation
checkable button to apply movement to elevation
MFXCheckableButton * menuCheckShowTAZElements
checkable button to show TAZ elements
void getVisibleNetworkMenuCommands(std::vector< MFXCheckableButton * > &commands) const
get visible network menu commands
MFXCheckableButton * menuCheckAutoOppositeEdge
check checkable to create auto create opposite edge
MFXCheckableButton * menuCheckDrawSpreadVehicles
checkable button to draw vehicles in begin position or spread in lane
MFXCheckableButton * menuCheckShowConnections
checkable button to show connections
MFXCheckableButton * menuCheckHideConnections
checkable button to hide connections in connect mode
MFXCheckableButton * menuCheckToggleDrawJunctionShape
checkable button to show junction shapes
MFXCheckableButton * menuCheckToggleGrid
checkable button to show grid button
MFXCheckableButton * menuCheckShowJunctionBubble
checkable button to show connection as bubble in "Move" mode.
MFXCheckableButton * menuCheckWarnAboutMerge
checkable button to we should warn about merging junctions
MFXCheckableButton * menuCheckShowAdditionalSubElements
checkable button to show additional sub-elements
MFXCheckableButton * menuCheckChangeAllPhases
checkable button to set change all phases
MFXCheckableButton * menuCheckExtendSelection
checkable button to extend to edge nodes