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>
33 #include <netimport/NIFrame.h>
35 #include <netimport/NITypeLoader.h>
36 #include <netwrite/NWFrame.h>
40 #include <utils/gui/div/GLHelper.h>
55 #include <utils/xml/XMLSubSys.h>
56 
57 #include "GNEApplicationWindow.h"
58 #include "GNEEvent_NetworkLoaded.h"
59 #include "GNELoadThread.h"
60 #include "GNENet.h"
61 #include "GNEViewNet.h"
62 #include "GNEUndoList.h"
63 #include "GNEViewParent.h"
64 
65 #ifdef HAVE_VERSION_H
66 #include <version.h>
67 #endif
68 
69 // ===========================================================================
70 // FOX-declarations
71 // ===========================================================================
72 
73 FXDEFMAP(GNEApplicationWindow) GNEApplicationWindowMap[] = {
74  // quit calls
78  FXMAPFUNC(SEL_CLOSE, MID_WINDOW, GNEApplicationWindow::onCmdQuit),
79 
80  // toolbar file
85  FXMAPFUNC(SEL_UPDATE, MID_OPEN_NETWORK, GNEApplicationWindow::onUpdOpen),
87  FXMAPFUNC(SEL_UPDATE, MID_OPEN_CONFIG, GNEApplicationWindow::onUpdOpen),
91  FXMAPFUNC(SEL_UPDATE, MID_RECENTFILE, GNEApplicationWindow::onUpdOpen),
94  // network
105  // TLS
110  // edge types
117  // additionals
126  // demand elements
135  // data elements
144  // other
149 
150  // Toolbar supermode
154 
155  // Toolbar modes
171 
172  // Toolbar edit
181  // Network view options
210  // Demand view options
231  // Data view options
246  // view
261  /* Prepared for #6042
262  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_CTRL_X_CUT, GNEApplicationWindow::onCmdCut),
263  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_CTRL_C_COPY, GNEApplicationWindow::onCmdCopy),
264  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_CTRL_V_PASTE, GNEApplicationWindow::onCmdPaste),
265  */
266 
267  // toolbar lock
273 
274  // Toolbar processing
288 
289  // Toolbar locate
290  FXMAPFUNC(SEL_COMMAND, MID_LOCATEJUNCTION, GNEApplicationWindow::onCmdLocate),
292  FXMAPFUNC(SEL_COMMAND, MID_LOCATEEDGE, GNEApplicationWindow::onCmdLocate),
294  FXMAPFUNC(SEL_COMMAND, MID_LOCATEVEHICLE, GNEApplicationWindow::onCmdLocate),
296  FXMAPFUNC(SEL_COMMAND, MID_LOCATEPERSON, GNEApplicationWindow::onCmdLocate),
298  FXMAPFUNC(SEL_COMMAND, MID_LOCATEROUTE, GNEApplicationWindow::onCmdLocate),
300  FXMAPFUNC(SEL_COMMAND, MID_LOCATESTOP, GNEApplicationWindow::onCmdLocate),
302  FXMAPFUNC(SEL_COMMAND, MID_LOCATETLS, GNEApplicationWindow::onCmdLocate),
304  FXMAPFUNC(SEL_COMMAND, MID_LOCATEADD, GNEApplicationWindow::onCmdLocate),
306  FXMAPFUNC(SEL_COMMAND, MID_LOCATEPOI, GNEApplicationWindow::onCmdLocate),
308  FXMAPFUNC(SEL_COMMAND, MID_LOCATEPOLY, GNEApplicationWindow::onCmdLocate),
310 
311  // toolbar tools
314 
315  // toolbar windows
317 
318  // toolbar help
321 
322  // alt + <number>
343 
344  // key events
345  FXMAPFUNC(SEL_KEYPRESS, 0, GNEApplicationWindow::onKeyPress),
346  FXMAPFUNC(SEL_KEYRELEASE, 0, GNEApplicationWindow::onKeyRelease),
347  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_ESC, GNEApplicationWindow::onCmdAbort),
348  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_DEL, GNEApplicationWindow::onCmdDel),
349  FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_ENTER, GNEApplicationWindow::onCmdEnter),
351 
352  // threads events
355 
356  // Edge template functions
360 
361  // Other
362  FXMAPFUNC(SEL_CLIPBOARD_REQUEST, 0, GNEApplicationWindow::onClipboardRequest),
369 };
370 
371 // Object implementation
372 FXIMPLEMENT(GNEApplicationWindow, FXMainWindow, GNEApplicationWindowMap, ARRAYNUMBER(GNEApplicationWindowMap))
373 
374 
375 // ===========================================================================
376 // GNEApplicationWindow method definitions
377 // ===========================================================================
378 
379 GNEApplicationWindow::GNEApplicationWindow(FXApp* a, const std::string& configPattern) :
380  GUIMainWindow(a),
381  myUndoList(new GNEUndoList(this)),
382  myConfigPattern(configPattern),
383  myToolbarsGrip(this),
384  myMenuBarFile(this),
385  myFileMenuCommands(this),
386  myModesMenuCommands(this),
387  myEditMenuCommands(this),
388  myLockMenuCommands(this),
389  myProcessingMenuCommands(this),
390  myLocateMenuCommands(this),
391  myToolsMenuCommands(this),
392  myWindowsMenuCommands(this),
393  mySupermodeCommands(this),
394  myTitlePrefix("NETEDIT " VERSION_STRING) {
395  // init icons
397  // init Textures
399  // init cursors
401  // create undoList dialog (after initCursors)
402  myUndoListDialog = new GNEUndoListDialog(this);
403 }
404 
405 
406 void
408  // do this not twice
409  if (myHadDependentBuild) {
410  WRITE_ERROR("DEBUG: GNEApplicationWindow::dependentBuild called twice");
411  return;
412  }
413  myHadDependentBuild = true;
414  setTarget(this);
415  setSelector(MID_WINDOW);
416  // build toolbar menu
418  // build the thread - io
421  // build the status bar
422  myStatusbar = new FXStatusBar(this, GUIDesignStatusBar);
423  {
424  myGeoFrame =
425  new FXHorizontalFrame(myStatusbar, GUIDesignHorizontalFrameStatusBar);
426  myGeoCoordinate = new FXLabel(myGeoFrame, "N/A\t\tOriginal coordinate (before coordinate transformation in netconvert)", nullptr, LAYOUT_CENTER_Y);
428  new FXHorizontalFrame(myStatusbar, GUIDesignHorizontalFrameStatusBar);
429  myCartesianCoordinate = new FXLabel(myCartesianFrame, "N/A\t\tNetwork coordinate", nullptr, LAYOUT_CENTER_Y);
430  }
431  // make the window a mdi-window
432  myMainSplitter = new FXSplitter(this, GUIDesignSplitter | SPLITTER_VERTICAL | SPLITTER_REVERSED);
433  myMDIClient = new FXMDIClient(myMainSplitter, GUIDesignSplitterMDI);
434  myMDIMenu = new FXMDIMenu(this, myMDIClient);
435  // build the message window
437  myMainSplitter->setSplit(1, 65);
438  // fill menu and tool bar
439  fillMenuBar();
440  // build additional threads
441  myLoadThread = new GNELoadThread(getApp(), this, myEvents, myLoadThreadEvent);
442  // set the status bar
443  myStatusbar->getStatusLine()->setText("Ready.");
444  // set the caption
445  setTitle(myTitlePrefix);
446  // set Netedit ICON
449  // build NETEDIT Accelerators (hotkeys)
451 }
452 
453 
454 void
457  gCurrentFolder = getApp()->reg().readStringEntry("SETTINGS", "basedir", "");
458  FXMainWindow::create();
459  myFileMenu->create();
460  myModesMenu->create();
461  myEditMenu->create();
462  myFileMenuTLS->create();
463  myFileMenuEdgeTypes->create();
464  myFileMenuAdditionals->create();
465  myFileMenuDemandElements->create();
466  myFileMenuDataElements->create();
467  //mySettingsMenu->create();
468  myWindowsMenu->create();
469  myHelpMenu->create();
470 
471  FXint textWidth = getApp()->getNormalFont()->getTextWidth("8", 1) * 22;
472  myCartesianFrame->setWidth(textWidth);
473  myGeoFrame->setWidth(textWidth);
474 
475  show(PLACEMENT_DEFAULT);
476  if (!OptionsCont::getOptions().isSet("window-size")) {
477  if (getApp()->reg().readIntEntry("SETTINGS", "maximized", 0) == 1) {
478  maximize();
479  }
480  }
481 
482 }
483 
484 
486  closeAllWindows();
487  // Close icons
489  // Close gifs (Textures)
491  // delete visuals
492  delete myGLVisual;
493  // must delete menus to avoid segfault on removing accelerators
494  // (http://www.fox-toolkit.net/faq#TOC-What-happens-when-the-application-s)
495  delete myFileMenuTLS;
496  delete myFileMenuEdgeTypes;
497  delete myFileMenuAdditionals;
499  delete myFileMenuDataElements;
500  delete myFileMenu;
501  delete myModesMenu;
502  delete myEditMenu;
503  delete myLockMenu;
504  delete myProcessingMenu;
505  delete myLocatorMenu;
506  delete myToolsMenu;
507  delete myWindowsMenu;
508  delete myHelpMenu;
509  // Delete load thread
510  delete myLoadThread;
511  // drop all events
512  while (!myEvents.empty()) {
513  // get the next event
514  GUIEvent* e = myEvents.top();
515  myEvents.pop();
516  delete e;
517  }
518  // delete undoList and dialog
519  delete myUndoList;
520  delete myUndoListDialog;
521 }
522 
523 
524 long
525 GNEApplicationWindow::onCmdQuit(FXObject*, FXSelector, void*) {
526  if (continueWithUnsavedChanges("quit")) {
528  getApp()->reg().writeStringEntry("SETTINGS", "basedir", gCurrentFolder.text());
529  if (isMaximized()) {
530  getApp()->reg().writeIntEntry("SETTINGS", "maximized", 1);
531  } else {
532  getApp()->reg().writeIntEntry("SETTINGS", "maximized", 0);
533  }
534  getApp()->exit(0);
535  }
536  return 1;
537 }
538 
539 
540 long
541 GNEApplicationWindow::onCmdEditChosen(FXObject*, FXSelector, void*) {
542  GUIDialog_GLChosenEditor* chooser =
544  chooser->create();
545  chooser->show();
546  return 1;
547 }
548 
549 
550 long
551 GNEApplicationWindow::onCmdNewNetwork(FXObject*, FXSelector, void*) {
552  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
553  if (myViewNet && !onCmdClose(0, 0, 0)) {
554  return 1;
555  } else {
559  loadConfigOrNet("", true, false, true, true);
560  return 1;
561  }
562 }
563 
564 
565 long
566 GNEApplicationWindow::onCmdOpenConfiguration(FXObject*, FXSelector, void*) {
567  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
568  if (myViewNet && !onCmdClose(0, 0, 0)) {
569  return 1;
570  } else {
571  // get the new file name
572  FXFileDialog opendialog(this, "Open Netconvert Configuration");
573  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_CONFIG));
574  opendialog.setSelectMode(SELECTFILE_EXISTING);
575  opendialog.setPatternList(myConfigPattern.c_str());
576  if (gCurrentFolder.length() != 0) {
577  opendialog.setDirectory(gCurrentFolder);
578  }
579  if (opendialog.execute()) {
580  gCurrentFolder = opendialog.getDirectory();
581  std::string file = opendialog.getFilename().text();
582  // load config
583  loadConfigOrNet(file, false);
584  // add it into recent configs
585  myMenuBarFile.myRecentNetsAndConfigs.appendFile(file.c_str());
586  }
587  return 1;
588  }
589 }
590 
591 
592 long
593 GNEApplicationWindow::onCmdOpenNetwork(FXObject*, FXSelector, void*) {
594  // get the new file name
595  FXFileDialog opendialog(this, "Open Network");
596  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
597  opendialog.setSelectMode(SELECTFILE_EXISTING);
598  opendialog.setPatternList("SUMO nets (*.net.xml)\nAll files (*)");
599  if (gCurrentFolder.length() != 0) {
600  opendialog.setDirectory(gCurrentFolder);
601  }
602  if (opendialog.execute()) {
603  // get file
604  const std::string file = opendialog.getFilename().text();
605  // check if file isn't empty first
606  if (!file.empty()) {
607  // check if current edited Net can be closed(und therefore the undo - list cleared, see #5753)
608  if (myViewNet) {
609  // call close
610  onCmdClose(0, 0, 0);
611  // if after close there is myViewNet yet, abort
612  if (myViewNet) {
613  return 0;
614  }
615  }
616  // set current folder
617  gCurrentFolder = opendialog.getDirectory();
618  // load network
619  loadConfigOrNet(file, true);
620  // add it into recent nets
621  myMenuBarFile.myRecentNetsAndConfigs.appendFile(file.c_str());
622  // when a net is loaded, save additionals and TLSPrograms are disabled
626  }
627  }
628  return 0;
629 }
630 
631 
632 long
633 GNEApplicationWindow::onCmdOpenForeign(FXObject*, FXSelector, void*) {
634  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
635  if (myViewNet && !onCmdClose(0, 0, 0)) {
636  return 1;
637  } else {
638  // get the new file name
639  FXFileDialog opendialog(this, "Import Foreign Network");
640  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
641  opendialog.setSelectMode(SELECTFILE_EXISTING);
642  FXString osmPattern("OSM net (*.osm.xml,*.osm)");
643  opendialog.setPatternText(0, osmPattern);
644  if (gCurrentFolder.length() != 0) {
645  opendialog.setDirectory(gCurrentFolder);
646  }
647  if (opendialog.execute()) {
648  gCurrentFolder = opendialog.getDirectory();
649  std::string file = opendialog.getFilename().text();
650 
653  if (osmPattern.contains(opendialog.getPattern())) {
654  // recommended osm options
655  // https://sumo.dlr.de/wiki/Networks/Import/OpenStreetMap#Recommended_NETCONVERT_Options
656  oc.set("osm-files", file);
657  oc.set("geometry.remove", "true");
658  oc.set("ramps.guess", "true");
659  oc.set("junctions.join", "true");
660  oc.set("tls.guess-signals", "true");
661  oc.set("tls.discard-simple", "true");
662  } else {
663  throw ProcessError("Attempted to import unknown file format '" + file + "'.");
664  }
665 
666  GUIDialog_Options* wizard =
667  new GUIDialog_Options(this, "Select Import Options", getWidth(), getHeight());
668 
669  if (wizard->execute()) {
670  NIFrame::checkOptions(); // needed to set projection parameters
671  loadConfigOrNet("", false, false, false);
672  }
673  }
674  return 1;
675  }
676 }
677 
678 
679 long
680 GNEApplicationWindow::onCmdOpenTLSPrograms(FXObject*, FXSelector, void*) {
681  // write debug information
682  WRITE_DEBUG("Open TLSProgram dialog");
683  // get the shape file name
684  FXFileDialog opendialog(this, "Open TLS Programs file");
685  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::MODETLS));
686  opendialog.setSelectMode(SELECTFILE_EXISTING);
687  opendialog.setPatternList("TLSProgram files (*.xml)\nAll files (*)");
688  if (gCurrentFolder.length() != 0) {
689  opendialog.setDirectory(gCurrentFolder);
690  }
691  if (opendialog.execute()) {
692  // close additional dialog
693  WRITE_DEBUG("Close TLSProgram dialog");
694  gCurrentFolder = opendialog.getDirectory();
695  std::string file = opendialog.getFilename().text();
696  // Run parser
697  myUndoList->begin(Supermode::NETWORK, GUIIcon::MODETLS, "loading TLS Programs from '" + file + "'");
698  myNet->computeNetwork(this);
699  if (myNet->getViewNet()->getViewParent()->getTLSEditorFrame()->parseTLSPrograms(file) == false) {
700  // Abort undo/redo
702  } else {
703  // commit undo/redo operation
704  myUndoList->end();
705  update();
706  }
707  } else {
708  // write debug information
709  WRITE_DEBUG("Cancel TLSProgram dialog");
710  }
711  return 1;
712 }
713 
714 
715 long
716 GNEApplicationWindow::onCmdOpenEdgeTypes(FXObject*, FXSelector, void*) {
717  // open dialog
718  FXFileDialog opendialog(this, "Load edgeType file");
719  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::MODECREATEEDGE));
720  opendialog.setSelectMode(SELECTFILE_EXISTING);
721  opendialog.setPatternList("*.xml");
722  if (gCurrentFolder.length() != 0) {
723  opendialog.setDirectory(gCurrentFolder);
724  }
725  if (opendialog.execute()) {
726  // declare type container
727  NBTypeCont typeContainerAux;
728  // declare type handler
729  NIXMLTypesHandler* handler = new NIXMLTypesHandler(typeContainerAux);
730  // load edge types
731  NITypeLoader::load(handler, {opendialog.getFilename().text()}, "types");
732  // write information
733  WRITE_MESSAGE("Loaded " + toString(typeContainerAux.size()) + " edge types");
734  // now create GNETypes based on typeContainerAux
736  // iterate over typeContainerAux
737  for (const auto& auxEdgeType : typeContainerAux) {
738  // create new edge type
739  GNEEdgeType* edgeType = new GNEEdgeType(myNet, auxEdgeType.first, auxEdgeType.second);
740  // add lane types
741  for (const auto& laneType : auxEdgeType.second->laneTypeDefinitions) {
742  edgeType->addLaneType(new GNELaneType(edgeType, laneType));
743  }
744  // add it using undoList
745  myViewNet->getUndoList()->add(new GNEChange_EdgeType(edgeType, true), true);
746 
747  }
748  // end undo list
749  myViewNet->getUndoList()->end();
750  // refresh edge type selector
752  }
753  return 0;
754 }
755 
756 
757 long
758 GNEApplicationWindow::onCmdOpenRecent(FXObject*, FXSelector, void* fileData) {
759  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
760  if (myViewNet && !onCmdClose(0, 0, 0)) {
761  return 1;
762  } else if (myAmLoading) {
763  myStatusbar->getStatusLine()->setText("Already loading!");
764  return 1;
765  } else {
766  // get filedata
767  std::string file((const char*)fileData);
768  // check if we're loading a network or a config (.netccfg for configs)
769  if (file.find(".netccfg") != std::string::npos) {
770  // load config
771  loadConfigOrNet(file, false);
772  } else {
773  // load network
774  loadConfigOrNet(file, true);
775  }
776  return 1;
777  }
778 }
779 
780 
781 long
782 GNEApplicationWindow::onCmdReload(FXObject*, FXSelector, void*) {
783  // first check that current edited Net can be closed (und therefore the undo-list cleared, see #5753)
784  if (myViewNet) {
785  // check if current network can be closed
786  if (continueWithUnsavedChanges("reload")) {
787  closeAllWindows();
788  // disable save additionals and TLS menu
791  // disable toolbargrip modes
792  myToolbarsGrip.menu->disable();
793  // hide all Supermode, Network and demand commands
798  // hide view options
802  } else {
803  // abort reloading (because "cancel button" was pressed)
804  return 1;
805  }
806  }
807  // @note. If another network has been load during this session, it might not be desirable to set useStartupOptions
808  loadConfigOrNet(OptionsCont::getOptions().getString("sumo-net-file"), true, true);
809  return 1;
810 }
811 
812 
813 long
814 GNEApplicationWindow::onCmdClose(FXObject*, FXSelector, void*) {
815  if (continueWithUnsavedChanges("close")) {
816  closeAllWindows();
817  // add a separator to the log
819  // disable save additionals and TLS menu
822  // hide all Supermode, Network and demand commands
827  // hide view options
831  }
832  return 1;
833 }
834 
835 
836 long
837 GNEApplicationWindow::onCmdLocate(FXObject*, FXSelector sel, void*) {
838  if (myMDIClient->numChildren() > 0) {
839  GNEViewParent* w = dynamic_cast<GNEViewParent*>(myMDIClient->getActiveChild());
840  if (w != nullptr) {
841  w->onCmdLocate(nullptr, sel, nullptr);
842  }
843  }
844  return 1;
845 }
846 
847 
848 long
849 GNEApplicationWindow::onCmdRunNetDiff(FXObject*, FXSelector, void*) {
851  // check that currently there is a View
852  if (myViewNet == nullptr) {
853  return 0;
854  }
855 #ifdef WIN32
856  // check that python folder is defined in PATH
857  const char* path = getenv("PATH");
858  if ((strstr(path, "Python") == nullptr) && (strstr(path, "python") == nullptr)) {
859  WRITE_ERROR("Python folder must be defined in PATH");
860  return 0;
861  }
862 #endif
863  // check that SUMO_HOME is defined
864  const char* sumoPath = getenv("SUMO_HOME");
865  if (sumoPath == nullptr) {
866  WRITE_ERROR("Enviroment variable SUMO_HOME must be defined");
867  return 0;
868  }
869  // get netdiff path
870  const std::string netDiff = std::string(sumoPath) + "/tools/net/netdiff.py";
871  if (!FileHelpers::isReadable(netDiff)) {
872  WRITE_ERROR("netdiff.py cannot be found in path '" + netDiff + "'");
873  return 0;
874  }
875  // check if network is saved
876  if (!myViewNet->getNet()->isNetSaved()) {
877  // save network
878  onCmdSaveNetwork(nullptr, 0, nullptr);
879  if (!myViewNet->getNet()->isNetSaved()) {
880  return 0;
881  }
882  }
883  // get the second network to ddiff
884  FXFileDialog opendialog(this, "Open diff Network");
885  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::OPEN_NET));
886  opendialog.setSelectMode(SELECTFILE_EXISTING);
887  opendialog.setPatternList("SUMO nets (*.net.xml)\nAll files (*)");
888  if (gCurrentFolder.length() != 0) {
889  opendialog.setDirectory(gCurrentFolder);
890  }
891  if (opendialog.execute()) {
892  // get file
893  const std::string secondNet = opendialog.getFilename().text();
894  // check if secondNet isn't empty
895  if (secondNet.empty()) {
896  return 0;
897  }
898  // extract folder
899  const std::string secondNetFolder = getFolder(secondNet).text();
900  // declare python command
901  std::string cmd = "cd " + secondNetFolder + "&" + // folder to save diff files (the same of second net)
902  "python " + netDiff + // netdiff.py
903  " " + oc.getString("output-file") + // netA (current)
904  " " + secondNet + // net B
905  " diff"; // netdiff options
906  // start in background
907 #ifndef WIN32
908  cmd = cmd + " &";
909 #else
910  // see "help start" for the parameters
911  cmd = "start /B \"\" " + cmd;
912 #endif
913  WRITE_MESSAGE("Running " + cmd + ".");
914  // yay! fun with dangerous commands... Never use this over the internet
916  }
917  return 1;
918 }
919 
920 
921 long
922 GNEApplicationWindow::onUpdOpen(FXObject* sender, FXSelector, void*) {
923  sender->handle(this, myAmLoading ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
924  return 1;
925 }
926 
927 
928 long
929 GNEApplicationWindow::onCmdClearMsgWindow(FXObject*, FXSelector, void*) {
931  return 1;
932 }
933 
934 
935 long
937  // write warning if netedit is running in testing mode
938  WRITE_DEBUG("Toggle load additionals in sumo-gui");
939  return 1;
940 }
941 
942 
943 long
944 GNEApplicationWindow::onCmdLoadDemandInSUMOGUI(FXObject*, FXSelector, void*) {
945  // write warning if netedit is running in testing mode
946  WRITE_DEBUG("Toggle load demand in sumo-gui");
947  return 1;
948 }
949 
950 
951 long
952 GNEApplicationWindow::onCmdAbout(FXObject*, FXSelector, void*) {
953  // write warning if netedit is running in testing mode
954  WRITE_DEBUG("Opening about dialog");
955  // create and open about dialog
956  GNEAbout* about = new GNEAbout(this);
957  about->create();
958  about->show(PLACEMENT_OWNER);
959  // write warning if netedit is running in testing mode
960  WRITE_DEBUG("Closed about dialog");
961  return 1;
962 }
963 
964 
965 long GNEApplicationWindow::onClipboardRequest(FXObject*, FXSelector, void* ptr) {
966  FXEvent* event = (FXEvent*)ptr;
967  FXString string = GUIUserIO::clipped.c_str();
968  setDNDData(FROM_CLIPBOARD, event->target, string);
969  return 1;
970 }
971 
972 
973 long
974 GNEApplicationWindow::onLoadThreadEvent(FXObject*, FXSelector, void*) {
975  eventOccurred();
976  return 1;
977 }
978 
979 
980 void
982  while (!myEvents.empty()) {
983  // get the next event
984  GUIEvent* e = myEvents.top();
985  myEvents.pop();
986  // process
987  switch (e->getOwnType()) {
990  break;
997  break;
998  default:
999  break;
1000  }
1001  delete e;
1002  }
1003 }
1004 
1005 
1006 void
1009  myAmLoading = false;
1010  GNEEvent_NetworkLoaded* ec = static_cast<GNEEvent_NetworkLoaded*>(e);
1011  // check whether the loading was successfull
1012  if (ec->net == nullptr) {
1013  // report failure
1014  setStatusBarText("Loading of '" + ec->file + "' failed!");
1015  } else {
1016  // set new Net
1017  myNet = ec->net;
1018  // report success
1019  setStatusBarText("'" + ec->file + "' loaded.");
1021  // build viewparent toolbar grips before creating view parent
1023  // initialise NETEDIT View
1024  GNEViewParent* viewParent = new GNEViewParent(myMDIClient, myMDIMenu, "NETEDIT VIEW", this, nullptr, myNet, ec->isNewNet, myUndoList, nullptr, MDI_TRACKING, 10, 10, 300, 200);
1025  // create it maximized
1026  viewParent->maximize();
1027  // mark it as Active child
1028  myMDIClient->setActiveChild(viewParent);
1029  // cast pointer myViewNet
1030  myViewNet = dynamic_cast<GNEViewNet*>(viewParent->getView());
1031  // set settings in view
1032  if (viewParent->getView() && ec->settingsFile != "") {
1033  GUISettingsHandler settings(ec->settingsFile, true, true);
1034  settings.addSettings(viewParent->getView());
1035  viewParent->getView()->addDecals(settings.getDecals());
1036  settings.applyViewport(viewParent->getView());
1037  settings.setSnapshots(viewParent->getView());
1038  }
1039  // set network name on the caption
1040  setTitle(MFXUtils::getTitleText(myTitlePrefix, ec->file.c_str()));
1041  // force supermode network
1042  if (myViewNet) {
1044  }
1045  if (myViewNet && ec->viewportFromRegistry) {
1046  Position off;
1047  off.set(getApp()->reg().readRealEntry("viewport", "x"), getApp()->reg().readRealEntry("viewport", "y"), getApp()->reg().readRealEntry("viewport", "z"));
1048  Position p(off.x(), off.y(), 0);
1049  myViewNet->setViewportFromToRot(off, p, 0);
1050  }
1051  }
1052  getApp()->endWaitCursor();
1054  // check if additionals/shapes has to be loaded at start
1055  if (oc.isSet("additional-files") && !oc.getString("additional-files").empty() && myNet) {
1056  // obtain vector of additional files
1057  std::vector<std::string> additionalFiles = oc.getStringVector("additional-files");
1058  // begin undolist
1059  myUndoList->begin(Supermode::NETWORK, GUIIcon::SUPERMODENETWORK, "loading additionals and shapes from '" + toString(additionalFiles) + "'");
1060  // iterate over every additional file
1061  for (const auto& additionalFile : additionalFiles) {
1062  WRITE_MESSAGE("loading additionals and shapes from '" + additionalFile + "'");
1063  // declare general handler
1064  GNEGeneralHandler generalHandler(myNet, additionalFile, true);
1065  // disable validation for additionals
1066  XMLSubSys::setValidation("never", "auto", "auto");
1067  // Run parser
1068  if (!generalHandler.parse()) {
1069  WRITE_ERROR("Loading of " + additionalFile + " failed.");
1070  }
1071  // disable validation for additionals
1072  XMLSubSys::setValidation("auto", "auto", "auto");
1073  }
1074  // end undo list
1075  myUndoList->end();
1076  // disable save additionals (because additionals were loaded through console)
1077  myNet->requireSaveAdditionals(false);
1078  }
1079  // check if demand elements has to be loaded at start
1080  if (oc.isSet("route-files") && !oc.getString("route-files").empty() && myNet) {
1081  // obtain vector of route files
1082  std::vector<std::string> demandElementsFiles = oc.getStringVector("route-files");
1083  // begin undolist
1084  myUndoList->begin(Supermode::DEMAND, GUIIcon::SUPERMODEDEMAND, "loading demand elements from '" + toString(demandElementsFiles) + "'");
1085  // iterate over every route file
1086  for (const auto& demandElementsFile : demandElementsFiles) {
1087  WRITE_MESSAGE("Loading demand elements from '" + demandElementsFile + "'");
1088  GNEGeneralHandler handler(myNet, demandElementsFile, true);
1089  // disable validation for demand elements
1090  XMLSubSys::setValidation("never", "auto", "auto");
1091  if (!handler.parse()) {
1092  WRITE_ERROR("Loading of " + demandElementsFile + " failed.");
1093  }
1094  // disable validation for demand elements
1095  XMLSubSys::setValidation("auto", "auto", "auto");
1096  }
1097  // end undo list
1098  myUndoList->end();
1099  // disable save demand elements (because demand elements were loaded through console)
1101  }
1102  // check if data elements has to be loaded at start
1103  if (oc.isSet("data-files") && !oc.getString("data-files").empty() && myNet) {
1104  // obtain vector of data files
1105  std::vector<std::string> dataElementsFiles = oc.getStringVector("data-files");
1106  // disable interval bar update
1108  // disable update data
1110  // begin undolist
1111  myUndoList->begin(Supermode::DATA, GUIIcon::SUPERMODEDATA, "loading data elements from '" + toString(dataElementsFiles) + "'");
1112  // iterate over every data file
1113  for (const auto& dataElementsFile : dataElementsFiles) {
1114  WRITE_MESSAGE("Loading data elements from '" + dataElementsFile + "'");
1115  GNEDataHandler dataHandler(myNet, dataElementsFile, true);
1116  // disable validation for data elements
1117  XMLSubSys::setValidation("never", "auto", "auto");
1118  if (!dataHandler.parse()) {
1119  WRITE_ERROR("Loading of " + dataElementsFile + " failed.");
1120  }
1121  // disable validation for data elements
1122  XMLSubSys::setValidation("auto", "auto", "auto");
1123  }
1124  // end undolist
1125  myUndoList->end();
1126  // disable save data elements (because data elements were loaded through console)
1128  // enable update data
1130  // enable interval bar update
1132  }
1133  // check if additionals output must be changed
1134  if (oc.isSet("additionals-output")) {
1135  // overwrite "additional-files" with value "additionals-output"
1136  oc.resetWritable();
1137  oc.set("additional-files", oc.getString("additionals-output"));
1138  }
1139  // check if demand elements output must be changed
1140  if (oc.isSet("demandelements-output")) {
1141  // overwrite "route-files" with value "demandelements-output"
1142  oc.resetWritable();
1143  oc.set("route-files", oc.getString("demandelements-output"));
1144  }
1145  // check if data elements output must be changed
1146  if (oc.isSet("dataelements-output")) {
1147  // overwrite "data-files" with value "dataelements-output"
1148  oc.resetWritable();
1149  oc.set("data-files", oc.getString("dataelements-output"));
1150  }
1151  // after loading net shouldn't be saved
1152  if (myNet) {
1153  myNet->requireSaveNet(false);
1154  }
1155  // update app
1156  update();
1157  // restore focus
1158  setFocus();
1159 }
1160 
1161 
1162 void
1164  GUIEvent_Message* ec = static_cast<GUIEvent_Message*>(e);
1165  myMessageWindow->appendMsg(ec->getOwnType(), ec->getMsg());
1166 }
1167 
1168 // ---------------------------------------------------------------------------
1169 // private methods
1170 // ---------------------------------------------------------------------------
1171 
1172 void
1174  // build file menu
1175  myFileMenu = new FXMenuPane(this, LAYOUT_FIX_HEIGHT);
1177  myFileMenuTLS = new FXMenuPane(this);
1178  myFileMenuEdgeTypes = new FXMenuPane(this);
1179  myFileMenuAdditionals = new FXMenuPane(this);
1180  myFileMenuDemandElements = new FXMenuPane(this);
1181  myFileMenuDataElements = new FXMenuPane(this);
1183  // build recent files
1185  new FXMenuSeparator(myFileMenu);
1187  "&Quit", "Ctrl+Q", "Quit the Application.",
1188  nullptr, this, MID_HOTKEY_CTRL_Q_CLOSE);
1189  // build modes menu
1190  myModesMenu = new FXMenuPane(this);
1192  myModesMenuTitle->setTarget(this);
1194  // build Supermode commands and hide it
1197  // build separator between supermodes y modes
1198  new FXMenuSeparator(myModesMenu);
1199  // build modes menu commands
1201  // build edit menu
1202  myEditMenu = new FXMenuPane(this);
1204  // build edit menu commands
1206  // build separator
1207  new FXMenuSeparator(myEditMenu);
1208  // build view options
1212  // hide view options
1216  // build view menu commands
1218  // build separator
1219  new FXMenuSeparator(myEditMenu);
1220  // build front element menu commands
1222  // build separator
1223  new FXMenuSeparator(myEditMenu);
1224  // build open in sumo menu commands
1226  // build lock menu
1227  myLockMenu = new FXMenuPane(this);
1229  myLockMenuTitle->setTarget(this);
1231  // build lock menu commmands
1233  // build processing menu (trigger netbuild computations)
1234  myProcessingMenu = new FXMenuPane(this);
1237  // build locate menu
1238  myLocatorMenu = new FXMenuPane(this);
1241  // build tools menu
1242  myToolsMenu = new FXMenuPane(this);
1245  // build windows menu
1246  myWindowsMenu = new FXMenuPane(this);
1249  // build help menu
1250  myHelpMenu = new FXMenuPane(this);
1252  // build help menu commands
1254  "&Online Documentation", "F1", "Open Online documentation.",
1255  nullptr, this, MID_HOTKEY_F1_ONLINEDOCUMENTATION);
1257  "&About", "F12", "About netedit.",
1259 }
1260 
1261 
1262 void
1263 GNEApplicationWindow::loadConfigOrNet(const std::string file, bool isNet, bool isReload, bool useStartupOptions, bool newNet) {
1265  getApp()->beginWaitCursor();
1266  myAmLoading = true;
1267  closeAllWindows();
1268  if (isReload) {
1269  myLoadThread->start();
1270  setStatusBarText("Reloading.");
1271  } else {
1272  gSchemeStorage.saveViewport(0, 0, -1, 0); // recenter view
1273  myLoadThread->loadConfigOrNet(file, isNet, useStartupOptions, newNet);
1274  setStatusBarText("Loading '" + file + "'.");
1275  }
1276  // show supermode commands menu
1278  // show Network command menus (because Network is the default supermode)
1280  // update window
1281  update();
1282 }
1283 
1284 
1285 FXGLCanvas*
1287  // NETEDIT uses only a single View, then return nullptr
1288  return nullptr;
1289 }
1290 
1291 
1292 SUMOTime
1294  return 0;
1295 }
1296 
1297 
1298 double
1300  return 1;
1301 }
1302 
1303 
1304 GNEUndoList*
1306  return myUndoList;
1307 }
1308 
1309 
1312  return myUndoListDialog;
1313 }
1314 
1315 
1316 GNEViewNet*
1318  return myViewNet;
1319 }
1320 
1321 
1324  return myToolbarsGrip;
1325 }
1326 
1327 
1328 void
1330  // check if view has to be saved
1331  if (myViewNet) {
1333  }
1334  // lock tracker
1335  myTrackerLock.lock();
1336  // remove trackers and other external windows
1337  while (!myGLWindows.empty()) {
1338  delete myGLWindows.front();
1339  }
1340  myViewNet = nullptr;
1341  for (FXMainWindow* const window : myTrackerWindows) {
1342  window->destroy();
1343  delete window;
1344  }
1345  myTrackerWindows.clear();
1346  // reset the caption
1347  setTitle(myTitlePrefix);
1348  // unlock tracker
1349  myTrackerLock.unlock();
1350  // remove coordinate information
1351  myGeoCoordinate->setText("N/A");
1352  myCartesianCoordinate->setText("N/A");
1353  // check if net can be deleted
1354  if (myNet != nullptr) {
1355  delete myNet;
1356  myNet = nullptr;
1358  }
1360  // Reset textures
1362  // reset fonts
1364  // disable saving commmand
1366 }
1367 
1368 
1369 FXCursor*
1371  return getApp()->getDefaultCursor(DEF_ARROW_CURSOR);
1372 }
1373 
1374 
1375 void
1378  // Disable normalization preserve the given network as far as possible
1379  oc.set("offset.disable-normalization", "true");
1380  loadConfigOrNet("", true, false, true, oc.getBool("new"));
1381 }
1382 
1383 
1384 void
1385 GNEApplicationWindow::setStatusBarText(const std::string& statusBarText) {
1386  myStatusbar->getStatusLine()->setText(statusBarText.c_str());
1387  myStatusbar->getStatusLine()->setNormalText(statusBarText.c_str());
1388 }
1389 
1390 
1391 long
1393  // obtain option container
1395  // declare variable to save FXMessageBox outputs.
1396  FXuint answer = 0;
1397  // declare string to save paths in wich additionals, shapes demand and data elements will be saved
1398  std::string additionalsSavePath = oc.getString("additional-files");
1399  std::string demandElementsSavePath = oc.getString("route-files");
1400  std::string dataElementsSavePath = oc.getString("data-files");
1401  // write warning if netedit is running in testing mode
1402  WRITE_DEBUG("Opening FXMessageBox 'Volatile Recomputing'");
1403  // open question dialog box
1404  answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, "Recompute with volatile options",
1405  "Changes produced in the net due a recomputing with volatile options cannot be undone. Continue?");
1406  if (answer != 1) { //1:yes, 2:no, 4:esc
1407  // write warning if netedit is running in testing mode
1408  if (answer == 2) {
1409  WRITE_DEBUG("Closed FXMessageBox 'Volatile Recomputing' with 'No'");
1410  } else if (answer == 4) {
1411  WRITE_DEBUG("Closed FXMessageBox 'Volatile Recomputing' with 'ESC'");
1412  }
1413  // abort recompute with volatile options
1414  return 0;
1415  } else {
1416  // write warning if netedit is running in testing mode
1417  WRITE_DEBUG("Closed FXMessageBox 'Volatile Recomputing' with 'Yes'");
1418  // Check if there are additionals in our net
1420  // ask user if want to save additionals if weren't saved previously
1421  if (oc.getString("additional-files") == "") {
1422  // write warning if netedit is running in testing mode
1423  WRITE_DEBUG("Opening FXMessageBox 'Save additionals before recomputing'");
1424  // open question dialog box
1425  answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, "Save additionals before recomputing with volatile options",
1426  "Would you like to save additionals before recomputing?");
1427  if (answer != 1) { //1:yes, 2:no, 4:esc
1428  // write warning if netedit is running in testing mode
1429  if (answer == 2) {
1430  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before recomputing' with 'No'");
1431  } else if (answer == 4) {
1432  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before recomputing' with 'ESC'");
1433  }
1434  } else {
1435  // write warning if netedit is running in testing mode
1436  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before recomputing' with 'Yes'");
1437  // Open a dialog to set filename output
1438  FXString file = MFXUtils::getFilename2Write(this,
1439  "Save demand element file", ".xml",
1441  gCurrentFolder).text();
1442  // add xml extension
1443  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
1444  // check that file is valid
1445  if (fileWithExtension != "") {
1446  // update additional files
1447  oc.resetWritable();
1448  oc.set("additional-files", fileWithExtension);
1449  // set obtanied filename output into additionalsSavePath (can be "")
1450  additionalsSavePath = oc.getString("additional-files");
1451  }
1452  }
1453  }
1454  // Check if additional must be saved in a temporal directory, if user didn't define a directory for additionals
1455  if (oc.getString("additional-files") == "") {
1456  // Obtain temporal directory provided by FXSystem::getCurrentDirectory()
1457  additionalsSavePath = FXSystem::getTempDirectory().text() + std::string("/tmpAdditionalsNetedit.xml");
1458  }
1459  // Start saving additionals
1460  getApp()->beginWaitCursor();
1461  try {
1462  myNet->saveAdditionals(additionalsSavePath);
1463  } catch (IOError& e) {
1464  // write warning if netedit is running in testing mode
1465  WRITE_DEBUG("Opening FXMessageBox 'Error saving additionals before recomputing'");
1466  // open error message box
1467  FXMessageBox::error(this, MBOX_OK, "Saving additionals in temporal folder failed!", "%s", e.what());
1468  // write warning if netedit is running in testing mode
1469  WRITE_DEBUG("Closed FXMessageBox 'Error saving additionals before recomputing' with 'OK'");
1470  }
1471  // end saving additionals
1473  getApp()->endWaitCursor();
1474  // restore focus
1475  setFocus();
1476  } else {
1477  // clear additional path
1478  additionalsSavePath = "";
1479  }
1480  // Check if there are demand elements in our net (3 due default vehicle types and person types)
1482  // ask user if want to save demand elements if weren't saved previously
1483  if (oc.getString("route-files") == "") {
1484  // write warning if netedit is running in testing mode
1485  WRITE_DEBUG("Opening FXMessageBox 'Save demand elements before recomputing'");
1486  // open question dialog box
1487  answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, "Save demand elements before recomputing with volatile options",
1488  "Would you like to save demand elements before recomputing?");
1489  if (answer != 1) { //1:yes, 2:no, 4:esc
1490  // write warning if netedit is running in testing mode
1491  if (answer == 2) {
1492  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before recomputing' with 'No'");
1493  } else if (answer == 4) {
1494  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before recomputing' with 'ESC'");
1495  }
1496  } else {
1497  // write warning if netedit is running in testing mode
1498  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before recomputing' with 'Yes'");
1499  // Open a dialog to set filename output
1500  FXString file = MFXUtils::getFilename2Write(this,
1501  "Save demand element file", ".rou.xml",
1503  gCurrentFolder).text();
1504  // add xml extension
1505  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
1506  // check that file is valid
1507  if (fileWithExtension != "") {
1508  // update route files
1509  oc.resetWritable();
1510  oc.set("route-files", fileWithExtension);
1511  // set obtanied filename output into demand elementSavePath (can be "")
1512  demandElementsSavePath = oc.getString("route-files");
1513  }
1514  }
1515  }
1516  // Check if demand element must be saved in a temporal directory, if user didn't define a directory for demand elements
1517  if (oc.getString("route-files") == "") {
1518  // Obtain temporal directory provided by FXSystem::getCurrentDirectory()
1519  demandElementsSavePath = FXSystem::getTempDirectory().text() + std::string("/tmpDemandElementsNetedit.xml");
1520  }
1521  // Start saving demand elements
1522  getApp()->beginWaitCursor();
1523  try {
1524  myNet->saveDemandElements(demandElementsSavePath);
1525  } catch (IOError& e) {
1526  // write warning if netedit is running in testing mode
1527  WRITE_DEBUG("Opening FXMessageBox 'Error saving demand elements before recomputing'");
1528  // open error message box
1529  FXMessageBox::error(this, MBOX_OK, "Saving demand elements in temporal folder failed!", "%s", e.what());
1530  // write warning if netedit is running in testing mode
1531  WRITE_DEBUG("Closed FXMessageBox 'Error saving demand elements before recomputing' with 'OK'");
1532  }
1533  // end saving demand elements
1535  getApp()->endWaitCursor();
1536  // restore focus
1537  setFocus();
1538  } else {
1539  // clear demand element path
1540  demandElementsSavePath = "";
1541  }
1542  // Check if there are data elements in our net
1543  if (myNet->getAttributeCarriers()->getDataSets().size() > 0) {
1544  // ask user if want to save data elements if weren't saved previously
1545  if (oc.getString("data-files") == "") {
1546  // write warning if netedit is running in testing mode
1547  WRITE_DEBUG("Opening FXMessageBox 'Save data elements before recomputing'");
1548  // open question dialog box
1549  answer = FXMessageBox::question(myNet->getViewNet()->getApp(), MBOX_YES_NO, "Save data elements before recomputing with volatile options",
1550  "Would you like to save data elements before recomputing?");
1551  if (answer != 1) { //1:yes, 2:no, 4:esc
1552  // write warning if netedit is running in testing mode
1553  if (answer == 2) {
1554  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before recomputing' with 'No'");
1555  } else if (answer == 4) {
1556  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before recomputing' with 'ESC'");
1557  }
1558  } else {
1559  // write warning if netedit is running in testing mode
1560  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before recomputing' with 'Yes'");
1561  // Open a dialog to set filename output
1562  FXString file = MFXUtils::getFilename2Write(this,
1563  "Save data element file", ".rou.xml",
1565  gCurrentFolder).text();
1566  // add xml extension
1567  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
1568  // check that file is valid
1569  if (fileWithExtension != "") {
1570  // update data files
1571  oc.resetWritable();
1572  oc.set("data-files", fileWithExtension);
1573  // set obtanied filename output into data elementSavePath (can be "")
1574  dataElementsSavePath = oc.getString("data-files");
1575  }
1576  }
1577  }
1578  // Check if data element must be saved in a temporal directory, if user didn't define a directory for data elements
1579  if (oc.getString("data-files") == "") {
1580  // Obtain temporal directory provided by FXSystem::getCurrentDirectory()
1581  dataElementsSavePath = FXSystem::getTempDirectory().text() + std::string("/tmpDataElementsNetedit.xml");
1582  }
1583  // Start saving data elements
1584  getApp()->beginWaitCursor();
1585  try {
1586  myNet->saveDataElements(dataElementsSavePath);
1587  } catch (IOError& e) {
1588  // write warning if netedit is running in testing mode
1589  WRITE_DEBUG("Opening FXMessageBox 'Error saving data elements before recomputing'");
1590  // open error message box
1591  FXMessageBox::error(this, MBOX_OK, "Saving data elements in temporal folder failed!", "%s", e.what());
1592  // write warning if netedit is running in testing mode
1593  WRITE_DEBUG("Closed FXMessageBox 'Error saving data elements before recomputing' with 'OK'");
1594  }
1595  // end saving data elements
1597  getApp()->endWaitCursor();
1598  // restore focus
1599  setFocus();
1600  } else {
1601  // clear data element path
1602  dataElementsSavePath = "";
1603  }
1604  // compute with volatile options
1605  myNet->computeNetwork(this, true, true, additionalsSavePath, demandElementsSavePath, dataElementsSavePath);
1606  updateControls();
1607  return 1;
1608  }
1609 }
1610 
1611 
1612 void
1615 }
1616 
1617 
1618 void
1622 }
1623 
1624 
1625 void
1629 }
1630 
1631 
1632 void
1636 }
1637 
1638 
1639 void
1643 }
1644 
1645 
1646 void
1650 }
1651 
1652 
1653 void
1657 }
1658 
1659 
1660 long
1661 GNEApplicationWindow::onCmdSetSuperMode(FXObject* sender, FXSelector sel, void* ptr) {
1662  // check that currently there is a View
1663  if (myViewNet) {
1664  myViewNet->onCmdSetSupermode(sender, sel, ptr);
1665  }
1666  return 1;
1667 }
1668 
1669 
1670 long
1671 GNEApplicationWindow::onCmdSetMode(FXObject* sender, FXSelector sel, void* ptr) {
1672  // check that currently there is a View
1673  if (myViewNet) {
1674  myViewNet->onCmdSetMode(sender, sel, ptr);
1675  }
1676  return 1;
1677 }
1678 
1679 
1680 long
1681 GNEApplicationWindow::onCmdLockElements(FXObject*, FXSelector, void*) {
1682  if (myViewNet) {
1684  }
1685  return 1;
1686 }
1687 
1688 
1689 long
1690 GNEApplicationWindow::onCmdLockAllElements(FXObject*, FXSelector, void*) {
1691  // lock all
1694  return 1;
1695 }
1696 
1697 
1698 long
1699 GNEApplicationWindow::onCmdUnlockAllElements(FXObject*, FXSelector, void*) {
1700  // unlock all
1703  return 1;
1704 }
1705 
1706 
1707 long
1708 GNEApplicationWindow::onCmdLockSelectElements(FXObject*, FXSelector, void*) {
1709  if (myViewNet) {
1710  myViewNet->update();
1711  }
1712  return 1;
1713 }
1714 
1715 
1716 long
1717 GNEApplicationWindow::onUpdLockMenuTitle(FXObject*, FXSelector, void*) {
1718  if (myViewNet) {
1720  // supermode network
1725  myLockMenuTitle->enable();
1726  } else {
1727  myLockMenuTitle->disable();
1728  }
1730  // supermode demand
1735  myLockMenuTitle->enable();
1736  } else {
1737  myLockMenuTitle->disable();
1738  }
1739  } else if (myViewNet->getEditModes().isCurrentSupermodeData()) {
1740  // supermode data
1744  myLockMenuTitle->enable();
1745  } else {
1746  myLockMenuTitle->disable();
1747  }
1748  } else {
1749  myLockMenuTitle->disable();
1750  }
1751  } else {
1752  myLockMenuTitle->disable();
1753  }
1754  return 1;
1755 }
1756 
1757 long
1758 GNEApplicationWindow::onCmdProcessButton(FXObject*, FXSelector sel, void*) {
1759  // first check if there is a view
1760  if (myViewNet) {
1761  // process depending of supermode
1763  // check what FXMenuCommand was called
1764  switch (FXSELID(sel)) {
1766  // show extra information for tests
1767  WRITE_DEBUG("Key F5 (Compute) pressed");
1768  myNet->computeNetwork(this, true, false);
1769  updateControls();
1770  break;
1772  // show extra information for tests
1773  WRITE_DEBUG("Keys Shift + F5 (Compute with volatile options) pressed");
1775  break;
1777  // show extra information for tests
1778  WRITE_DEBUG("Key F6 (Clean junction) pressed");
1780  break;
1782  // show extra information for tests
1783  WRITE_DEBUG("Key F7 (Join junctions) pressed");
1785  break;
1787  // show extra information for tests
1788  WRITE_DEBUG("Key F8 (Clean invalid crossings) pressed");
1790  break;
1791  default:
1792  break;
1793  }
1795  // check what FXMenuCommand was called
1796  switch (FXSELID(sel)) {
1798  // show extra information for tests
1799  WRITE_DEBUG("Key F5 (Compute) pressed");
1801  updateControls();
1802  break;
1804  // show extra information for tests
1805  WRITE_DEBUG("Key F6 (RemoveUnusedRoutes) pressed");
1807  break;
1809  // show extra information for tests
1810  WRITE_DEBUG("Key F7 (JoinRoutes) pressed");
1812  break;
1814  // show extra information for tests
1815  WRITE_DEBUG("Key F7 (AdjustPersonPlans) pressed");
1817  break;
1819  // show extra information for tests
1820  WRITE_DEBUG("Key F8 (CleanInvalidDemandElements) pressed");
1822  break;
1823  default:
1824  break;
1825  }
1826  }
1827  }
1828  return 1;
1829 }
1830 
1831 
1832 long
1833 GNEApplicationWindow::onCmdNewWindow(FXObject*, FXSelector, void*) {
1834  FXRegistry reg("SUMO netedit", "netedit");
1835  std::string netedit = "netedit";
1836  const char* sumoPath = getenv("SUMO_HOME");
1837  if (sumoPath != nullptr) {
1838  std::string newPath = std::string(sumoPath) + "/bin/netedit";
1839  if (FileHelpers::isReadable(newPath) || FileHelpers::isReadable(newPath + ".exe")) {
1840  netedit = "\"" + newPath + "\"";
1841  }
1842  }
1843  std::string cmd = netedit;
1844  // start in background
1845 #ifndef WIN32
1846  cmd = cmd + " &";
1847 #else
1848  // see "help start" for the parameters
1849  cmd = "start /B \"\" " + cmd;
1850 #endif
1851  WRITE_MESSAGE("Running " + cmd + ".");
1852  // yay! fun with dangerous commands... Never use this over the internet
1854  return 1;
1855 }
1856 
1857 
1858 long
1859 GNEApplicationWindow::onCmdOpenSUMOGUI(FXObject*, FXSelector, void*) {
1860  // check that currently there is a View
1861  if (myViewNet) {
1862  // first check if network is saved
1863  if (!myViewNet->getNet()->isNetSaved()) {
1864  // save network
1865  onCmdSaveNetwork(nullptr, 0, nullptr);
1866  if (!myViewNet->getNet()->isNetSaved()) {
1867  return 0;
1868  }
1869  }
1870  // now check if additionals must be loaded and are saved
1871  if ((myEditMenuCommands.loadAdditionalsInSUMOGUI->getCheck() == TRUE) &&
1873  // save additionals
1874  onCmdSaveAdditionals(nullptr, 0, nullptr);
1875  // check if additionals were sucesfully saved. If not, abort
1876  if (!myViewNet->getNet()->isAdditionalsSaved()) {
1877  return 0;
1878  }
1879  }
1880  // finally check if demand elements must be loaded and are saved
1881  if ((myEditMenuCommands.loadDemandInSUMOGUI->getCheck() == TRUE) &&
1883  // save additionals
1884  onCmdSaveDemandElements(nullptr, 0, nullptr);
1885  // check if demand elements were sucesfully saved. If not, abort
1886  if (!myViewNet->getNet()->isDemandElementsSaved()) {
1887  return 0;
1888  }
1889  }
1890  // obtain viewport
1891  FXRegistry reg("SUMO GUI", "sumo-gui");
1892  reg.read();
1893  reg.writeRealEntry("viewport", "x", myViewNet->getChanger().getXPos());
1894  reg.writeRealEntry("viewport", "y", myViewNet->getChanger().getYPos());
1895  reg.writeRealEntry("viewport", "z", myViewNet->getChanger().getZPos());
1896  reg.write();
1897  std::string sumogui = "sumo-gui";
1898  const char* sumoPath = getenv("SUMO_HOME");
1899  if (sumoPath != nullptr) {
1900  std::string newPath = std::string(sumoPath) + "/bin/sumo-gui";
1901  if (FileHelpers::isReadable(newPath) || FileHelpers::isReadable(newPath + ".exe")) {
1902  sumogui = "\"" + newPath + "\"";
1903  }
1904  }
1905  // declare comand
1906  std::string cmd = sumogui + " --registry-viewport" + " -n " + "\"" + OptionsCont::getOptions().getString("output-file") + "\"";
1907  // obtainer options container
1909  // if load additionals is enabled, add it to command
1910  if ((myEditMenuCommands.loadAdditionalsInSUMOGUI->getCheck() == TRUE) && (oc.getString("additional-files").size() > 0)) {
1911  cmd += " -a \"" + oc.getString("additional-files") + "\"";
1912  }
1913  // if load demand is enabled, add it to command
1914  if ((myEditMenuCommands.loadDemandInSUMOGUI->getCheck() == TRUE) && (oc.getString("route-files").size() > 0)) {
1915  cmd += " -r \"" + oc.getString("route-files") + "\"";
1916  }
1917  // if we have trips or flow over junctions, add option junction-taz
1920  cmd += " --junction-taz";
1921  }
1922  // start in background
1923 #ifndef WIN32
1924  cmd = cmd + " &";
1925 #else
1926  // see "help start" for the parameters
1927  cmd = "start /B \"\" " + cmd;
1928 #endif
1929  WRITE_MESSAGE("Running " + cmd + ".");
1930  // yay! fun with dangerous commands... Never use this over the internet
1932  }
1933  return 1;
1934 }
1935 
1936 
1937 long
1938 GNEApplicationWindow::onCmdAbort(FXObject*, FXSelector, void*) {
1939  // check that view exists
1940  if (myViewNet) {
1941  // show extra information for tests
1942  WRITE_DEBUG("Key ESC (abort) pressed");
1943  // first check if we're selecting a subset of edges in TAZ Frame
1945  // show extra information for tests
1946  WRITE_DEBUG("Cleaning current selected edges");
1947  // clear current selection
1949  } else if (myViewNet->getViewParent()->getInspectorFrame()->shown()) {
1950  // show extra information for tests
1951  WRITE_DEBUG("Cleaning inspected elements");
1952  // clear inspected elements
1954  } else {
1955  // abort current operation
1957  }
1958  }
1959  return 1;
1960 }
1961 
1962 
1963 long
1964 GNEApplicationWindow::onCmdDel(FXObject*, FXSelector, void*) {
1965  // check that view exists
1966  if (myViewNet) {
1967  // show extra information for tests
1968  WRITE_DEBUG("Key DEL (delete) pressed");
1969  myViewNet->hotkeyDel();
1970  }
1971  return 1;
1972 }
1973 
1974 
1975 long
1976 GNEApplicationWindow::onCmdEnter(FXObject*, FXSelector, void*) {
1977  // check that view exists
1978  if (myViewNet) {
1979  // show extra information for tests
1980  WRITE_DEBUG("Key ENTER pressed");
1982  }
1983  return 1;
1984 }
1985 
1986 
1987 long
1988 GNEApplicationWindow::onCmdBackspace(FXObject*, FXSelector, void*) {
1989  // check that view exists
1990  if (myViewNet) {
1991  // show extra information for tests
1992  WRITE_DEBUG("Key BACKSPACE pressed");
1994  }
1995  return 1;
1996 }
1997 
1998 long
1999 GNEApplicationWindow::onCmdForceSaveNetwork(FXObject* /*sender*/, FXSelector /*sel*/, void* /*ptr*/) {
2000  // check that view exists
2001  if (myViewNet) {
2002  myViewNet->getNet()->requireSaveNet(true);
2003  myViewNet->update();
2004  }
2005  return 1;
2006 }
2007 
2008 
2009 long
2010 GNEApplicationWindow::onCmdForceSaveAdditionals(FXObject* /*sender*/, FXSelector /*sel*/, void* /*ptr*/) {
2011  // check that view exists
2012  if (myViewNet) {
2014  update();
2015  }
2016  return 1;
2017 }
2018 
2019 
2020 long
2021 GNEApplicationWindow::onCmdForceSaveDemandElements(FXObject* /*sender*/, FXSelector /*sel*/, void* /*ptr*/) {
2022  // check that view exists
2023  if (myViewNet) {
2025  update();
2026  }
2027  return 1;
2028 }
2029 
2030 
2031 long
2032 GNEApplicationWindow::onCmdForceSaveDataElements(FXObject* /*sender*/, FXSelector /*sel*/, void* /*ptr*/) {
2033  // check that view exists
2034  if (myViewNet) {
2036  update();
2037  }
2038  return 1;
2039 }
2040 
2041 
2042 long
2043 GNEApplicationWindow::onCmdFocusFrame(FXObject*, FXSelector, void*) {
2044  // check that view exists
2045  if (myViewNet) {
2047  }
2048  return 1;
2049 }
2050 
2051 
2052 long
2053 GNEApplicationWindow::onUpdRequireViewNet(FXObject* sender, FXSelector, void*) {
2054  // enable or disable sender element depending of viewNet
2055  sender->handle(this, myViewNet ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2056  return 1;
2057 }
2058 
2059 
2060 long
2061 GNEApplicationWindow::onCmdEditViewport(FXObject*, FXSelector, void*) {
2062  // check that view exists
2063  if (myViewNet) {
2065  }
2066  return 1;
2067 }
2068 
2069 
2070 long
2071 GNEApplicationWindow::onCmdEditViewScheme(FXObject*, FXSelector, void*) {
2072  // check that view exists
2073  if (myViewNet) {
2075  }
2076  return 1;
2077 }
2078 
2079 
2080 long
2081 GNEApplicationWindow::onCmdToggleGrid(FXObject* obj, FXSelector sel, void* ptr) {
2082  // check that view exists
2083  if (myViewNet) {
2084  // Toggle getMenuCheckShowGrid of GNEViewNet
2086  // show extra information for tests
2087  WRITE_DEBUG("Disabled grid throught Ctrl+g hotkey");
2088  } else {
2089  // show extra information for tests
2090  WRITE_DEBUG("Enabled grid throught Ctrl+g hotkey");
2091  }
2092  // Call manually toggle grid function
2093  myViewNet->onCmdToggleShowGrid(obj, sel, ptr);
2094  }
2095  return 1;
2096 }
2097 
2098 
2099 long
2100 GNEApplicationWindow::onCmdSetFrontElement(FXObject* /*obj*/, FXSelector /*sel*/, void* /*ptr*/) {
2101  if (myViewNet) {
2102  if (myViewNet->getViewParent()->getInspectorFrame()->shown()) {
2103  // get inspected AC
2104  GNEAttributeCarrier* inspectedAC = (myViewNet->getInspectedAttributeCarriers().size() == 1) ? myViewNet->getInspectedAttributeCarriers().front() : nullptr;
2105  // set or clear front attribute
2106  if (myViewNet->getFrontAttributeCarrier() == inspectedAC) {
2108  } else {
2109  myViewNet->setFrontAttributeCarrier(inspectedAC);
2110  }
2112  } else {
2114  }
2115  }
2116  return 1;
2117 }
2118 
2119 
2120 long
2121 GNEApplicationWindow::onCmdToggleEditOptions(FXObject* obj, FXSelector sel, void* /* ptr */) {
2122  // first check that we have a ViewNet
2123  if (myViewNet) {
2124  // first check what selector was called
2125  int numericalKeyPressed = sel - FXSEL(SEL_COMMAND, MID_HOTKEY_ALT_0_TOGGLEEDITOPTION) - 1;
2126  // check that numericalKeyPressed is valid
2127  if ((numericalKeyPressed < 0) || (numericalKeyPressed > 10)) {
2128  return 1;
2129  }
2130  // declare a vector in which save visible menu commands
2131  std::vector<MFXCheckableButton*> visibleMenuCommands;
2132  // get common, network and demand visible menu commands
2136  // now check that numericalKeyPressed isn't greather than visible view options
2137  if (numericalKeyPressed >= (int)visibleMenuCommands.size()) {
2138  return 1;
2139  }
2140  // toggle edit options
2142  visibleMenuCommands.at(numericalKeyPressed), numericalKeyPressed, obj, sel)) {
2143  return 1;
2145  visibleMenuCommands.at(numericalKeyPressed), numericalKeyPressed, obj, sel)) {
2146  return 1;
2148  visibleMenuCommands.at(numericalKeyPressed), numericalKeyPressed, obj, sel)) {
2149  return 1;
2150  }
2151  }
2152  return 1;
2153 }
2154 
2155 
2156 long
2157 GNEApplicationWindow::onCmdHelp(FXObject*, FXSelector, void*) {
2158  FXLinkLabel::fxexecute("https://sumo.dlr.de/docs/netedit.html");
2159  return 1;
2160 }
2161 
2162 
2163 long
2164 GNEApplicationWindow::onCmdOptions(FXObject*, FXSelector, void*) {
2165  GUIDialog_Options* wizard =
2166  new GUIDialog_Options(this, "Configure Options", getWidth(), getHeight());
2167 
2168  if (wizard->execute()) {
2169  NIFrame::checkOptions(); // needed to set projection parameters
2172  SystemFrame::checkOptions(); // needed to set precision
2173  }
2174  return 1;
2175 }
2176 
2177 
2178 long
2179 GNEApplicationWindow::onCmdUndo(FXObject*, FXSelector, void*) {
2180  WRITE_DEBUG("Keys Ctrl+Z (Undo) pressed");
2181  // Check conditions
2182  if (myViewNet == nullptr) {
2183  return 0;
2184  } else if (!myEditMenuCommands.undoLastChange->isEnabled()) {
2185  return 0;
2186  } else {
2187  // check supermode (currently ignore supermode data)
2190  // abort if user doesn't press "yes"
2192  return 0;
2193  }
2194  }
2195  myViewNet->getUndoList()->undo();
2196  // update current show frame after undo
2199  }
2200  // update manually undo/redo menu commands (see #6005)
2203  // update toolbar undo-redo buttons
2205  // check if update undoRedo dialog
2206  if (myUndoListDialog->shown()) {
2208  }
2209  return 1;
2210  }
2211 }
2212 
2213 
2214 long
2215 GNEApplicationWindow::onCmdRedo(FXObject*, FXSelector, void*) {
2216  WRITE_DEBUG("Keys Ctrl+Y (Redo) pressed");
2217  // Check conditions
2218  if (myViewNet == nullptr) {
2219  return 0;
2220  } else if (!myEditMenuCommands.redoLastChange->isEnabled()) {
2221  return 0;
2222  } else {
2223  // check supermode (currently ignore supermode data)
2226  // abort if user doesn't press "yes"
2228  return 0;
2229  }
2230  }
2231  myViewNet->getUndoList()->redo();
2232  // update current show frame after redo
2235  }
2236  // update manually undo/redo menu commands (see #6005)
2239  // update toolbar undo-redo buttons
2241  // check if update undoRedo dialog
2242  if (myUndoListDialog->shown()) {
2244  }
2245  return 1;
2246  }
2247 }
2248 
2249 
2250 long
2251 GNEApplicationWindow::onCmdOpenUndoListDialog(FXObject*, FXSelector, void*) {
2252  // avoid open two dialogs
2253  if (myUndoListDialog->shown()) {
2255  } else {
2257  }
2258  return 1;
2259 }
2260 
2261 
2262 long
2263 GNEApplicationWindow::onUpdOpenUndoListDialog(FXObject* sender, FXSelector, void*) {
2264  // check if net exist
2265  if (myNet) {
2266  sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2267  } else {
2268  sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2269  if (myUndoListDialog->shown()) {
2271  }
2272  }
2273  return 1;
2274 }
2275 
2276 
2277 long
2278 GNEApplicationWindow::onCmdComputePathManager(FXObject*, FXSelector, void*) {
2279  // first check viewNet
2281  // update path calculator
2283  }
2284  return 1;
2285 }
2286 
2287 
2288 long
2289 GNEApplicationWindow::onCmdCut(FXObject*, FXSelector, void*) {
2290  WRITE_DEBUG("Key Ctrl+X (Cut) pressed");
2291  // Prepared for #6042
2292  return 1;
2293 }
2294 
2295 
2296 long
2297 GNEApplicationWindow::onCmdCopy(FXObject*, FXSelector, void*) {
2298  WRITE_DEBUG("Key Ctrl+C (Copy) pressed");
2299  // Prepared for #6042
2300  return 1;
2301 }
2302 
2303 
2304 long
2305 GNEApplicationWindow::onCmdPaste(FXObject*, FXSelector, void*) {
2306  WRITE_DEBUG("Key Ctrl+V (Paste) pressed");
2307  // Prepared for #6042
2308  return 1;
2309 }
2310 
2311 
2312 long
2313 GNEApplicationWindow::onCmdSetTemplate(FXObject*, FXSelector, void*) {
2314  WRITE_DEBUG("Key Ctrl+F1 (Set Template) pressed");
2315  // first check if myViewNet exist
2316  if (myViewNet) {
2317  // call set template in inspector frame
2319  }
2320  return 1;
2321 }
2322 
2323 
2324 long
2325 GNEApplicationWindow::onCmdCopyTemplate(FXObject*, FXSelector, void*) {
2326  WRITE_DEBUG("Key Ctrl+F2 (Copy Template) pressed");
2327  // first check if myViewNet exist
2328  if (myViewNet) {
2329  // call copy template in inspector frame
2331  }
2332  return 1;
2333 }
2334 
2335 
2336 long
2337 GNEApplicationWindow::onCmdClearTemplate(FXObject*, FXSelector, void*) {
2338  WRITE_DEBUG("Key Ctrl+F3 (Clear Template) pressed");
2339  // first check if myViewNet exist
2340  if (myViewNet) {
2341  // call clear template in inspector frame
2343  }
2344  return 1;
2345 }
2346 
2347 
2348 long
2349 GNEApplicationWindow::onCmdSaveAsNetwork(FXObject*, FXSelector, void*) {
2350  // open dialog
2351  FXString file = MFXUtils::getFilename2Write(this,
2352  "Save Network as", ".net.xml",
2354  gCurrentFolder);
2355  // add xml extension
2356  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".net.xml");
2357  // check that file with extension is valid
2358  if (fileWithExtension != "") {
2360  oc.resetWritable();
2361  oc.set("output-file", fileWithExtension);
2362  setTitle(MFXUtils::getTitleText(myTitlePrefix, fileWithExtension.c_str()));
2363  onCmdSaveNetwork(nullptr, 0, nullptr);
2364  }
2365  return 1;
2366 }
2367 
2368 
2369 long
2370 GNEApplicationWindow::onCmdSaveAsPlainXML(FXObject*, FXSelector, void*) {
2371  // obtain option container
2373  // declare current folder
2374  FXString currentFolder = gCurrentFolder;
2375  // check if there is a saved network
2376  if (oc.getString("output-file").size() > 0) {
2377  // extract folder
2378  currentFolder = getFolder(oc.getString("output-file"));
2379  }
2380  // open dialog
2381  FXString file = MFXUtils::getFilename2Write(this,
2382  "Save plain-xml edge-file (other names will be deduced from this)", "",
2384  currentFolder);
2385  // check that file is valid (note: in this case we don't need to use function FileHelpers::addExtension)
2386  if (file != "") {
2387  bool wasSet = oc.isSet("plain-output-prefix");
2388  std::string oldPrefix = oc.getString("plain-output-prefix");
2389  std::string prefix = file.text();
2390  // if the name of an edg.xml file was given, remove the suffix
2391  if (StringUtils::endsWith(prefix, ".edg.xml")) {
2392  prefix = prefix.substr(0, prefix.size() - 8);
2393  }
2394  if (StringUtils::endsWith(prefix, ".")) {
2395  prefix = prefix.substr(0, prefix.size() - 1);
2396  }
2397  oc.resetWritable();
2398  oc.set("plain-output-prefix", prefix);
2399  getApp()->beginWaitCursor();
2400  try {
2401  myNet->savePlain(oc);
2402  } catch (IOError& e) {
2403  // write warning if netedit is running in testing mode
2404  WRITE_DEBUG("Opening FXMessageBox 'Error saving plainXML'");
2405  // open message box
2406  FXMessageBox::error(this, MBOX_OK, "Saving plain xml failed!", "%s", e.what());
2407  // write warning if netedit is running in testing mode
2408  WRITE_DEBUG("Closed FXMessageBox 'Error saving plainXML' with 'OK'");
2409  }
2410  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Plain XML saved with prefix '" + prefix + "'.\n");
2412  if (wasSet) {
2413  oc.resetWritable();
2414  oc.set("plain-output-prefix", oldPrefix);
2415  } else {
2416  oc.unSet("plain-output-prefix");
2417  }
2418  getApp()->endWaitCursor();
2419  // restore focus
2420  setFocus();
2421  }
2422  return 1;
2423 }
2424 
2425 
2426 long
2427 GNEApplicationWindow::onCmdSaveJoined(FXObject*, FXSelector, void*) {
2428  // obtain option container
2430  // declare current folder
2431  FXString currentFolder = gCurrentFolder;
2432  // check if there is a saved network
2433  if (oc.getString("output-file").size() > 0) {
2434  // extract folder
2435  currentFolder = getFolder(oc.getString("output-file"));
2436  }
2437  // open dialog
2438  FXString file = MFXUtils::getFilename2Write(this,
2439  "Save joined-junctions", ".nod.xml",
2441  currentFolder);
2442  // add xml extension
2443  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
2444  // check that file with extension is valid
2445  if (fileWithExtension != "") {
2446  bool wasSet = oc.isSet("junctions.join-output");
2447  std::string oldFile = oc.getString("junctions.join-output");
2448  oc.resetWritable();
2449  oc.set("junctions.join-output", fileWithExtension);
2450  getApp()->beginWaitCursor();
2451  try {
2452  myNet->saveJoined(oc);
2453  } catch (IOError& e) {
2454  // write warning if netedit is running in testing mode
2455  WRITE_DEBUG("Opening FXMessageBox 'error saving joined'");
2456  // opening error message
2457  FXMessageBox::error(this, MBOX_OK, "Saving joined junctions failed!", "%s", e.what());
2458  // write warning if netedit is running in testing mode
2459  WRITE_DEBUG("Closed FXMessageBox 'error saving joined' with 'OK'");
2460  }
2461  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Joined junctions saved to '" + fileWithExtension + "'.\n");
2463  if (wasSet) {
2464  oc.resetWritable();
2465  oc.set("junctions.join-output", oldFile);
2466  } else {
2467  oc.unSet("junctions.join-output");
2468  }
2469  getApp()->endWaitCursor();
2470  // restore focus
2471  setFocus();
2472  }
2473  return 1;
2474 }
2475 
2476 
2477 long
2478 GNEApplicationWindow::onUpdNeedsNetwork(FXObject* sender, FXSelector, void*) {
2479  // check if net exist
2480  if (myNet) {
2481  sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2482  } else {
2483  sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2484  }
2485  return 1;
2486 }
2487 
2488 
2489 long
2490 GNEApplicationWindow::onUpdNeedsFrontElement(FXObject* sender, FXSelector, void*) {
2491  // check if net, viewnet and front attribute exist
2493  sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2494  } else {
2495  sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2496  }
2497  return 1;
2498 }
2499 
2500 
2501 long
2502 GNEApplicationWindow::onUpdReload(FXObject* sender, FXSelector, void*) {
2503  sender->handle(this, ((myNet == nullptr) || !OptionsCont::getOptions().isSet("sumo-net-file")) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2504  return 1;
2505 }
2506 
2507 
2508 long
2509 GNEApplicationWindow::onUpdSaveAllElements(FXObject* sender, FXSelector, void*) {
2510  bool enable = false;
2511  if (myNet) {
2512  if (!myNet->isNetSaved()) {
2513  enable = true;
2514  }
2515  if (!myNet->isAdditionalsSaved()) {
2516  enable = true;
2517  }
2518  if (!myNet->isDemandElementsSaved()) {
2519  enable = true;
2520  }
2521  if (!myNet->isDataElementsSaved()) {
2522  enable = true;
2523  }
2524  }
2525  sender->handle(this, enable ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2526  return 1;
2527 }
2528 
2529 
2530 long
2531 GNEApplicationWindow::onUpdSaveNetwork(FXObject* sender, FXSelector, void*) {
2532  sender->handle(this, ((myNet == nullptr) || myNet->isNetSaved()) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2533  return 1;
2534 }
2535 
2536 
2537 long
2538 GNEApplicationWindow::onUpdSaveAdditionals(FXObject* sender, FXSelector, void*) {
2539  sender->handle(this, ((myNet == nullptr) || myNet->isAdditionalsSaved()) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2540  return 1;
2541 }
2542 
2543 
2544 long
2545 GNEApplicationWindow::onUpdSaveDemandElements(FXObject* sender, FXSelector, void*) {
2546  sender->handle(this, ((myNet == nullptr) || myNet->isDemandElementsSaved()) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2547  return 1;
2548 }
2549 
2550 
2551 long
2552 GNEApplicationWindow::onUpdSaveDataElements(FXObject* sender, FXSelector, void*) {
2553  sender->handle(this, ((myNet == nullptr) || myNet->isDataElementsSaved()) ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2554  return 1;
2555 }
2556 
2557 
2558 long
2559 GNEApplicationWindow::onUpdUndo(FXObject* obj, FXSelector sel, void* ptr) {
2560  return myUndoList->onUpdUndo(obj, sel, ptr);
2561 }
2562 
2563 
2564 long
2565 GNEApplicationWindow::onUpdRedo(FXObject* obj, FXSelector sel, void* ptr) {
2566  return myUndoList->onUpdRedo(obj, sel, ptr);
2567 }
2568 
2569 
2570 long
2571 GNEApplicationWindow::onUpdComputePathManager(FXObject* sender, FXSelector /*sel*/, void* /*ptr*/) {
2572  // first check viewNet
2573  if (myViewNet) {
2574  // check supermode network
2576  // disable
2577  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2579  // disable
2580  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2581  } else {
2582  // enable
2583  return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
2584  }
2585  } else {
2586  // disable
2587  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
2588  }
2589 }
2590 
2591 
2592 long
2593 GNEApplicationWindow::onCmdToggleViewOption(FXObject* obj, FXSelector sel, void* ptr) {
2594  // check viewNet
2595  if (myViewNet) {
2596  // continue depending of selector
2597  switch (FXSELID(sel)) {
2599  return myViewNet->onCmdToggleShowGrid(obj, sel, ptr);
2601  return myViewNet->onCmdToggleDrawSpreadVehicles(obj, sel, ptr);
2603  return myViewNet->onCmdToggleShowDemandElementsNetwork(obj, sel, ptr);
2605  return myViewNet->onCmdToggleSelectEdges(obj, sel, ptr);
2607  return myViewNet->onCmdToggleShowConnections(obj, sel, ptr);
2609  return myViewNet->onCmdToggleHideConnections(obj, sel, ptr);
2611  return myViewNet->onCmdToggleShowAdditionalSubElements(obj, sel, ptr);
2613  return myViewNet->onCmdToggleExtendSelection(obj, sel, ptr);
2615  return myViewNet->onCmdToggleChangeAllPhases(obj, sel, ptr);
2617  return myViewNet->onCmdToggleWarnAboutMerge(obj, sel, ptr);
2619  return myViewNet->onCmdToggleShowJunctionBubbles(obj, sel, ptr);
2621  return myViewNet->onCmdToggleMoveElevation(obj, sel, ptr);
2623  return myViewNet->onCmdToggleChainEdges(obj, sel, ptr);
2625  return myViewNet->onCmdToggleAutoOppositeEdge(obj, sel, ptr);
2627  return myViewNet->onCmdToggleShowGrid(obj, sel, ptr);
2629  return myViewNet->onCmdToggleDrawSpreadVehicles(obj, sel, ptr);
2631  return myViewNet->onCmdToggleHideNonInspecteDemandElements(obj, sel, ptr);
2633  return myViewNet->onCmdToggleHideShapes(obj, sel, ptr);
2635  return myViewNet->onCmdToggleShowTrips(obj, sel, ptr);
2637  return myViewNet->onCmdToggleShowAllPersonPlans(obj, sel, ptr);
2639  return myViewNet->onCmdToggleLockPerson(obj, sel, ptr);
2641  return myViewNet->onCmdToggleShowAllContainerPlans(obj, sel, ptr);
2643  return myViewNet->onCmdToggleLockContainer(obj, sel, ptr);
2645  return myViewNet->onCmdToggleShowOverlappedRoutes(obj, sel, ptr);
2647  return myViewNet->onCmdToggleShowAdditionals(obj, sel, ptr);
2649  return myViewNet->onCmdToggleShowShapes(obj, sel, ptr);
2651  return myViewNet->onCmdToggleShowDemandElementsData(obj, sel, ptr);
2653  return myViewNet->onCmdToggleTAZRelDrawing(obj, sel, ptr);
2655  return myViewNet->onCmdToggleTAZRelDrawing(obj, sel, ptr);
2657  return myViewNet->onCmdToggleTAZRelOnlyFrom(obj, sel, ptr);
2659  return myViewNet->onCmdToggleTAZRelOnlyTo(obj, sel, ptr);
2660  default:
2661  return 0;
2662  }
2663  } else {
2664  return 0;
2665  }
2666 }
2667 
2668 
2669 long
2670 GNEApplicationWindow::onUpdToggleViewOption(FXObject* obj, FXSelector sel, void* /*ptr*/) {
2671  // get menuCheck
2672  FXMenuCheckIcon* menuCheck = dynamic_cast<FXMenuCheckIcon*>(obj);
2673  // check viewNet
2674  if (myViewNet && menuCheck) {
2675  // continue depending of selector
2676  switch (FXSELID(sel)) {
2679  menuCheck->setCheck(TRUE);
2680  } else {
2681  menuCheck->setCheck(FALSE);
2682  }
2683  break;
2686  menuCheck->setCheck(TRUE);
2687  } else {
2688  menuCheck->setCheck(FALSE);
2689  }
2690  break;
2693  menuCheck->setCheck(TRUE);
2694  } else {
2695  menuCheck->setCheck(FALSE);
2696  }
2697  break;
2700  menuCheck->setCheck(TRUE);
2701  } else {
2702  menuCheck->setCheck(FALSE);
2703  }
2704  break;
2707  menuCheck->setCheck(TRUE);
2708  } else {
2709  menuCheck->setCheck(FALSE);
2710  }
2711  break;
2714  menuCheck->setCheck(TRUE);
2715  } else {
2716  menuCheck->setCheck(FALSE);
2717  }
2718  break;
2721  menuCheck->setCheck(TRUE);
2722  } else {
2723  menuCheck->setCheck(FALSE);
2724  }
2725  break;
2728  menuCheck->setCheck(TRUE);
2729  } else {
2730  menuCheck->setCheck(FALSE);
2731  }
2732  break;
2735  menuCheck->setCheck(TRUE);
2736  } else {
2737  menuCheck->setCheck(FALSE);
2738  }
2739  break;
2742  menuCheck->setCheck(TRUE);
2743  } else {
2744  menuCheck->setCheck(FALSE);
2745  }
2746  break;
2749  menuCheck->setCheck(TRUE);
2750  } else {
2751  menuCheck->setCheck(FALSE);
2752  }
2753  break;
2756  menuCheck->setCheck(TRUE);
2757  } else {
2758  menuCheck->setCheck(FALSE);
2759  }
2760  break;
2763  menuCheck->setCheck(TRUE);
2764  } else {
2765  menuCheck->setCheck(FALSE);
2766  }
2767  break;
2770  menuCheck->setCheck(TRUE);
2771  } else {
2772  menuCheck->setCheck(FALSE);
2773  }
2774  break;
2777  menuCheck->setCheck(TRUE);
2778  } else {
2779  menuCheck->setCheck(FALSE);
2780  }
2781  break;
2784  menuCheck->setCheck(TRUE);
2785  } else {
2786  menuCheck->setCheck(FALSE);
2787  }
2788  break;
2791  menuCheck->setCheck(TRUE);
2792  } else {
2793  menuCheck->setCheck(FALSE);
2794  }
2795  break;
2798  menuCheck->setCheck(TRUE);
2799  } else {
2800  menuCheck->setCheck(FALSE);
2801  }
2802  break;
2805  menuCheck->setCheck(TRUE);
2806  } else {
2807  menuCheck->setCheck(FALSE);
2808  }
2809  break;
2812  menuCheck->setCheck(TRUE);
2813  } else {
2814  menuCheck->setCheck(FALSE);
2815  }
2816  // special case for lock persons
2817  if (myViewNet->getDemandViewOptions().menuCheckLockPerson->isEnabled()) {
2818  menuCheck->enable();
2819  } else {
2820  menuCheck->disable();
2821  }
2822  break;
2825  menuCheck->setCheck(TRUE);
2826  } else {
2827  menuCheck->setCheck(FALSE);
2828  }
2829  break;
2832  menuCheck->setCheck(TRUE);
2833  } else {
2834  menuCheck->setCheck(FALSE);
2835  }
2836  // special case for lock containers
2838  menuCheck->enable();
2839  } else {
2840  menuCheck->disable();
2841  }
2842  break;
2845  menuCheck->setCheck(TRUE);
2846  } else {
2847  menuCheck->setCheck(FALSE);
2848  }
2849  break;
2852  menuCheck->setCheck(TRUE);
2853  } else {
2854  menuCheck->setCheck(FALSE);
2855  }
2856  break;
2859  menuCheck->setCheck(TRUE);
2860  } else {
2861  menuCheck->setCheck(FALSE);
2862  }
2863  break;
2866  menuCheck->setCheck(TRUE);
2867  } else {
2868  menuCheck->setCheck(FALSE);
2869  }
2870  break;
2873  menuCheck->setCheck(TRUE);
2874  } else {
2875  menuCheck->setCheck(FALSE);
2876  }
2877  break;
2880  menuCheck->setCheck(TRUE);
2881  } else {
2882  menuCheck->setCheck(FALSE);
2883  }
2884  break;
2887  menuCheck->setCheck(TRUE);
2888  } else {
2889  menuCheck->setCheck(FALSE);
2890  }
2891  break;
2892 
2895  menuCheck->setCheck(TRUE);
2896  } else {
2897  menuCheck->setCheck(FALSE);
2898  }
2899  break;
2902  menuCheck->setCheck(TRUE);
2903  } else {
2904  menuCheck->setCheck(FALSE);
2905  }
2906  break;
2907  default:
2908  break;
2909  }
2910  }
2911  return 0;
2912 }
2913 
2914 
2915 long
2916 GNEApplicationWindow::onCmdSaveAllElements(FXObject*, FXSelector, void*) {
2917  // save all elements
2918  if (!myNet->isNetSaved()) {
2919  onCmdSaveNetwork(nullptr, 0, nullptr);
2920  }
2921  if (!myNet->isAdditionalsSaved()) {
2922  onCmdSaveAdditionals(nullptr, 0, nullptr);
2923  }
2924  if (!myNet->isDemandElementsSaved()) {
2925  onCmdSaveDemandElements(nullptr, 0, nullptr);
2926  }
2927  if (!myNet->isDataElementsSaved()) {
2928  onCmdSaveDataElements(nullptr, 0, nullptr);
2929  }
2930  return 1;
2931 }
2932 
2933 
2934 long
2935 GNEApplicationWindow::onCmdSaveNetwork(FXObject*, FXSelector, void*) {
2937  // function onCmdSaveAsNetwork must be executed if this is the first save
2938  if (oc.getString("output-file") == "" || oc.isDefault("output-file")) {
2939  return onCmdSaveAsNetwork(nullptr, 0, nullptr);
2940  } else {
2941  getApp()->beginWaitCursor();
2942  try {
2943  myNet->save(oc);
2944  } catch (IOError& e) {
2945  // write warning if netedit is running in testing mode
2946  WRITE_DEBUG("Opening FXMessageBox 'error saving network'");
2947  // open error message box
2948  FXMessageBox::error(this, MBOX_OK, "Saving Network failed!", "%s", e.what());
2949  // write warning if netedit is running in testing mode
2950  WRITE_DEBUG("Closed FXMessageBox 'error saving network' with 'OK'");
2951  }
2952  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Network saved in " + oc.getString("output-file") + ".\n");
2953  // After saveing a net sucesfully, add it into Recent Nets list.
2954  myMenuBarFile.myRecentNetsAndConfigs.appendFile(oc.getString("output-file").c_str());
2956  getApp()->endWaitCursor();
2957  // restore focus
2958  setFocus();
2959  return 1;
2960  }
2961 }
2962 
2963 
2964 long
2965 GNEApplicationWindow::onCmdSaveTLSPrograms(FXObject*, FXSelector, void*) {
2966  // obtain option container
2968  // check if save additional menu is enabled
2969  if (myFileMenuCommands.saveTLSPrograms->isEnabled()) {
2970  // Check if TLS Programs file was already set at start of netedit or with a previous save
2971  if (oc.getString("TLSPrograms-output").empty()) {
2972  // declare current folder
2973  FXString currentFolder = gCurrentFolder;
2974  // check if there is a saved network
2975  if (oc.getString("output-file").size() > 0) {
2976  // extract folder
2977  currentFolder = getFolder(oc.getString("output-file"));
2978  }
2979  // open dialog
2980  FXString file = MFXUtils::getFilename2Write(this,
2981  "Save TLS Programs", ".xml",
2983  currentFolder);
2984  // add xml extension
2985  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
2986  // check tat file is valid
2987  if (file == "") {
2988  // None TLS Programs file was selected, then stop function
2989  return 0;
2990  } else {
2991  // change value of "TLSPrograms-output"
2992  oc.resetWritable();
2993  oc.set("TLSPrograms-output", fileWithExtension);
2994  }
2995  }
2996  // Start saving TLS Programs
2997  getApp()->beginWaitCursor();
2998  try {
2999  myNet->computeNetwork(this, true); // GNEChange_TLS does not triggere GNENet:requireRecompute
3000  myNet->saveTLSPrograms(oc.getString("TLSPrograms-output"));
3001  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "TLS Programs saved in " + oc.getString("TLSPrograms-output") + ".\n");
3003  } catch (IOError& e) {
3004  // write warning if netedit is running in testing mode
3005  WRITE_DEBUG("Opening FXMessageBox 'error saving TLS Programs'");
3006  // open error message box
3007  FXMessageBox::error(this, MBOX_OK, "Saving TLS Programs failed!", "%s", e.what());
3008  // write warning if netedit is running in testing mode
3009  WRITE_DEBUG("Closed FXMessageBox 'error saving TLS Programs' with 'OK'");
3010  }
3012  getApp()->endWaitCursor();
3013  // restore focus
3014  setFocus();
3015  return 1;
3016  } else {
3017  return 0;
3018  }
3019 }
3020 
3021 
3022 long
3023 GNEApplicationWindow::onCmdSaveEdgeTypes(FXObject*, FXSelector, void*) {
3024  // obtain option container
3026  // check if save additional menu is enabled
3027  if (myFileMenuCommands.saveEdgeTypes->isEnabled()) {
3028  // Check if edgeType file was already set at start of netedit or with a previous save
3029  if (oc.getString("edgeTypes-output").empty()) {
3030  // declare current folder
3031  FXString currentFolder = gCurrentFolder;
3032  // check if there is a saved network
3033  if (oc.getString("output-file").size() > 0) {
3034  // extract folder
3035  currentFolder = getFolder(oc.getString("output-file"));
3036  }
3037  // open dialog
3038  FXString file = MFXUtils::getFilename2Write(this,
3039  "Save edgeType file", ".xml",
3041  currentFolder);
3042  // add xml extension
3043  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3044  // check tat file is valid
3045  if (file == "") {
3046  // None edgeType Programs file was selected, then stop function
3047  return 0;
3048  } else {
3049  // change value of "edgeTypes-output"
3050  oc.resetWritable();
3051  oc.set("edgeTypes-output", fileWithExtension);
3052  }
3053  }
3054  // Start saving edgeTypes
3055  getApp()->beginWaitCursor();
3056  try {
3057  myNet->saveEdgeTypes(oc.getString("edgeTypes-output"));
3058  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "EdgeType saved in " + oc.getString("edgeTypes-output") + ".\n");
3059  myFileMenuCommands.saveEdgeTypes->disable();
3060  } catch (IOError& e) {
3061  // write warning if netedit is running in testing mode
3062  WRITE_DEBUG("Opening FXMessageBox 'error saving edgeTypes'");
3063  // open error message box
3064  FXMessageBox::error(this, MBOX_OK, "Saving edgeTypes failed!", "%s", e.what());
3065  // write warning if netedit is running in testing mode
3066  WRITE_DEBUG("Closed FXMessageBox 'error saving edgeTypes' with 'OK'");
3067  }
3069  getApp()->endWaitCursor();
3070  // restore focus
3071  setFocus();
3072  return 1;
3073  } else {
3074  return 0;
3075  }
3076 }
3077 
3078 
3079 long
3080 GNEApplicationWindow::onCmdSaveTLSProgramsAs(FXObject*, FXSelector, void*) {
3081  // obtain option container
3083  // declare current folder
3084  FXString currentFolder = gCurrentFolder;
3085  // check if there is a saved network
3086  if (oc.getString("output-file").size() > 0) {
3087  // extract folder
3088  currentFolder = getFolder(oc.getString("output-file"));
3089  }
3090  // Open window to select TLS Programs file
3091  FXString file = MFXUtils::getFilename2Write(this,
3092  "Save TLS Programs as", ".xml",
3094  currentFolder);
3095  // add xml extension
3096  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3097  // check tat file is valid
3098  if (fileWithExtension != "") {
3099  // change value of "TLSPrograms-files"
3101  OptionsCont::getOptions().set("TLSPrograms-output", fileWithExtension);
3102  // save TLS Programs
3103  return onCmdSaveTLSPrograms(nullptr, 0, nullptr);
3104  } else {
3105  return 1;
3106  }
3107 }
3108 
3109 
3110 long
3111 GNEApplicationWindow::onCmdSaveEdgeTypesAs(FXObject*, FXSelector, void*) {
3112  // obtain option container
3114  // declare current folder
3115  FXString currentFolder = gCurrentFolder;
3116  // check if there is a saved network
3117  if (oc.getString("output-file").size() > 0) {
3118  // extract folder
3119  currentFolder = getFolder(oc.getString("output-file"));
3120  }
3121  // Open window to select edgeType file
3122  FXString file = MFXUtils::getFilename2Write(this,
3123  "Save edgeType file as", ".xml",
3125  currentFolder);
3126  // add xml extension
3127  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3128  // check tat file is valid
3129  if (fileWithExtension != "") {
3130  // change value of "edgeTypes-files"
3131  OptionsCont::getOptions().set("edgeTypes-output", fileWithExtension);
3132  // save edgeTypes
3133  return onCmdSaveEdgeTypes(nullptr, 0, nullptr);
3134  } else {
3135  return 1;
3136  }
3137 }
3138 
3139 
3140 long
3141 GNEApplicationWindow::onCmdOpenAdditionals(FXObject*, FXSelector, void*) {
3142  // write debug information
3143  WRITE_DEBUG("Open additional dialog");
3144  // get the Additional file name
3145  FXFileDialog opendialog(this, "Open Additionals file");
3146  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::MODEADDITIONAL));
3147  opendialog.setSelectMode(SELECTFILE_EXISTING);
3148  opendialog.setPatternList("XML files (*.xml)\nAll files (*)");
3149  if (gCurrentFolder.length() != 0) {
3150  opendialog.setDirectory(gCurrentFolder);
3151  }
3152  if (opendialog.execute()) {
3153  // close additional dialog
3154  WRITE_DEBUG("Close additional dialog");
3155  // udpate current folder
3156  gCurrentFolder = opendialog.getDirectory();
3157  std::string file = opendialog.getFilename().text();
3158  // disable validation for additionals
3159  XMLSubSys::setValidation("never", "auto", "auto");
3160  // Create additional handler
3161  GNEGeneralHandler generalHandler(myNet, file, true);
3162  // begin undoList operation
3163  myUndoList->begin(Supermode::NETWORK, GUIIcon::SUPERMODENETWORK, "reloading additionals from '" + file + "'");
3164  // Run parser
3165  if (!generalHandler.parse()) {
3166  WRITE_ERROR("Loading of " + file + " failed.");
3167  }
3168  // end undoList operation and update view
3169  myUndoList->end();
3170  update();
3171  // restore validation for additionals
3172  XMLSubSys::setValidation("auto", "auto", "auto");
3173  } else {
3174  // write debug information
3175  WRITE_DEBUG("Cancel additional dialog");
3176  }
3177  return 1;
3178 }
3179 
3180 
3181 long
3182 GNEApplicationWindow::onCmdReloadAdditionals(FXObject*, FXSelector, void*) {
3183  // get file
3184  const std::string file = OptionsCont::getOptions().getString("additional-files");
3185  // disable validation for additionals
3186  XMLSubSys::setValidation("never", "auto", "auto");
3187  // Create general handler
3188  GNEGeneralHandler generalHandler(myNet, file, true);
3189  // begin undoList operation
3190  myUndoList->begin(Supermode::DEMAND, GUIIcon::SUPERMODENETWORK, "reloading additionals from '" + file + "'");
3191  // clear additionals
3193  // Run parser
3194  if (!generalHandler.parse()) {
3195  WRITE_ERROR("Reloading of " + file + " failed.");
3196  }
3197  // end undoList operation and update view
3198  myUndoList->end();
3199  update();
3200  // restore validation for additionals
3201  XMLSubSys::setValidation("auto", "auto", "auto");
3202  return 1;
3203 }
3204 
3205 
3206 long
3207 GNEApplicationWindow::onUpdReloadAdditionals(FXObject*, FXSelector, void*) {
3208  // check if file exist
3209  if (OptionsCont::getOptions().getString("additional-files").empty()) {
3210  myFileMenuCommands.reloadAdditionals->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
3211  } else {
3212  myFileMenuCommands.reloadAdditionals->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
3213  }
3214  return 1;
3215 }
3216 
3217 
3218 long
3219 GNEApplicationWindow::onCmdSaveAdditionals(FXObject*, FXSelector, void*) {
3220  // obtain option container
3222  // check if save additional menu is enabled
3223  if (myFileMenuCommands.saveAdditionals->isEnabled()) {
3224  // Check if additionals file was already set at start of netedit or with a previous save
3225  if (oc.getString("additional-files").empty()) {
3226  // declare current folder
3227  FXString currentFolder = gCurrentFolder;
3228  // check if there is a saved network
3229  if (oc.getString("output-file").size() > 0) {
3230  // extract folder
3231  currentFolder = getFolder(oc.getString("output-file"));
3232  }
3233  // open dialog
3234  FXString file = MFXUtils::getFilename2Write(this,
3235  "Save Additionals file", ".xml",
3237  currentFolder);
3238  // add xml extension
3239  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3240  // check tat file is valid
3241  if (fileWithExtension != "") {
3242  // change value of "additional-files"
3243  oc.resetWritable();
3244  oc.set("additional-files", fileWithExtension);
3245  } else {
3246  // None additionals file was selected, then stop function
3247  return 0;
3248  }
3249  }
3250  // Start saving additionals
3251  getApp()->beginWaitCursor();
3252  try {
3253  // compute before saving (for detectors positions)
3254  myNet->computeNetwork(this);
3255  myNet->saveAdditionals(oc.getString("additional-files"));
3256  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Additionals saved in " + oc.getString("additional-files") + ".\n");
3258  } catch (IOError& e) {
3259  // write warning if netedit is running in testing mode
3260  WRITE_DEBUG("Opening FXMessageBox 'error saving additionals'");
3261  // open error message box
3262  FXMessageBox::error(this, MBOX_OK, "Saving additionals failed!", "%s", e.what());
3263  // write warning if netedit is running in testing mode
3264  WRITE_DEBUG("Closed FXMessageBox 'error saving additionals' with 'OK'");
3265  }
3267  getApp()->endWaitCursor();
3268  // restore focus
3269  setFocus();
3270  return 1;
3271  } else {
3272  return 0;
3273  }
3274 }
3275 
3276 
3277 long
3278 GNEApplicationWindow::onCmdSaveAdditionalsAs(FXObject*, FXSelector, void*) {
3279  // obtain option container
3281  // declare current folder
3282  FXString currentFolder = gCurrentFolder;
3283  // check if there is a saved network
3284  if (oc.getString("output-file").size() > 0) {
3285  // extract folder
3286  currentFolder = getFolder(oc.getString("output-file"));
3287  }
3288  // Open window to select additional file
3289  FXString file = MFXUtils::getFilename2Write(this,
3290  "Save Additionals file as", ".xml",
3292  currentFolder);
3293  // add xml extension
3294  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3295  // check tat file is valid
3296  if (fileWithExtension != "") {
3297  // reset writtable flag
3299  // change value of "additional-files"
3300  OptionsCont::getOptions().set("additional-files", fileWithExtension);
3301  // change flag of menu command for save additionals
3303  // save additionals
3304  return onCmdSaveAdditionals(nullptr, 0, nullptr);
3305  } else {
3306  return 1;
3307  }
3308 }
3309 
3310 
3311 long
3312 GNEApplicationWindow::onCmdOpenDemandElements(FXObject*, FXSelector, void*) {
3313  // write debug information
3314  WRITE_DEBUG("Open demand element dialog");
3315  // get the demand element file name
3316  FXFileDialog opendialog(this, "Open demand element file");
3317  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SUPERMODEDEMAND));
3318  opendialog.setSelectMode(SELECTFILE_EXISTING);
3319  opendialog.setPatternList("XML files (*.xml)\nDemand files (*rou.xml)\nAll files (*)");
3320  if (gCurrentFolder.length() != 0) {
3321  opendialog.setDirectory(gCurrentFolder);
3322  }
3323  if (opendialog.execute()) {
3324  // close additional dialog
3325  WRITE_DEBUG("Close demand element dialog");
3326  // udpate current folder
3327  gCurrentFolder = opendialog.getDirectory();
3328  std::string file = opendialog.getFilename().text();
3329  // disable validation for additionals
3330  XMLSubSys::setValidation("never", "auto", "auto");
3331  // Create generic handler
3332  GNEGeneralHandler handler(myNet, file, true);
3333  // begin undoList operation
3334  myUndoList->begin(Supermode::DEMAND, GUIIcon::SUPERMODEDEMAND, "loading demand elements from '" + file + "'");
3335  // Run parser for additionals
3336  if (!handler.parse()) {
3337  WRITE_ERROR("Loading of " + file + " failed.");
3338  }
3339  // end undoList operation and update view
3340  myUndoList->end();
3341  update();
3342  // restore validation for demand
3343  XMLSubSys::setValidation("auto", "auto", "auto");
3344  } else {
3345  // write debug information
3346  WRITE_DEBUG("Cancel demand element dialog");
3347  }
3348  return 1;
3349 }
3350 
3351 
3352 long
3354  // get file
3355  const std::string file = OptionsCont::getOptions().getString("route-files");
3356  // disable validation for additionals
3357  XMLSubSys::setValidation("never", "auto", "auto");
3358  // Create handler
3359  GNEGeneralHandler handler(myNet, file, true);
3360  // begin undoList operation
3361  myUndoList->begin(Supermode::DEMAND, GUIIcon::SUPERMODEDEMAND, "reloading demand elements from '" + file + "'");
3362  // clear demand elements
3364  // Run parser for additionals
3365  if (!handler.parse()) {
3366  WRITE_ERROR("Reloading of " + file + " failed.");
3367  }
3368  // end undoList operation and update view
3369  myUndoList->end();
3370  update();
3371  // restore validation for demand
3372  XMLSubSys::setValidation("auto", "auto", "auto");
3373  return 1;
3374 }
3375 
3376 
3377 long
3379  // check if file exist
3380  if (OptionsCont::getOptions().getString("route-files").empty()) {
3381  myFileMenuCommands.reloadDemandElements->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
3382  } else {
3383  myFileMenuCommands.reloadDemandElements->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
3384  }
3385  return 1;
3386 }
3387 
3388 
3389 long
3390 GNEApplicationWindow::onCmdSaveDemandElements(FXObject*, FXSelector, void*) {
3391  // obtain option container
3393  // check if save demand element menu is enabled
3394  if (myFileMenuCommands.saveDemandElements->isEnabled()) {
3395  // Check if demand elements file was already set at start of netedit or with a previous save
3396  if (oc.getString("route-files").empty()) {
3397  // declare current folder
3398  FXString currentFolder = gCurrentFolder;
3399  // check if there is a saved network
3400  if (oc.getString("output-file").size() > 0) {
3401  // extract folder
3402  currentFolder = getFolder(oc.getString("output-file"));
3403  }
3404  // open dialog
3405  FXString file = MFXUtils::getFilename2Write(this,
3406  "Save demand element file", ".rou.xml",
3408  currentFolder);
3409  // add xml extension
3410  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
3411  // check tat file is valid
3412  if (fileWithExtension != "") {
3413  // change value of "route-files"
3414  oc.resetWritable();
3415  oc.set("route-files", fileWithExtension);
3416  } else {
3417  // None demand elements file was selected, then stop function
3418  return 0;
3419  }
3420  }
3421  // Start saving demand elements
3422  getApp()->beginWaitCursor();
3423  try {
3424  myNet->saveDemandElements(oc.getString("route-files"));
3425  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Demand elements saved in " + oc.getString("route-files") + ".\n");
3427  } catch (IOError& e) {
3428  // write warning if netedit is running in testing mode
3429  WRITE_DEBUG("Opening FXMessageBox 'error saving demand elements'");
3430  // open error message box
3431  FXMessageBox::error(this, MBOX_OK, "Saving demand elements failed!", "%s", e.what());
3432  // write warning if netedit is running in testing mode
3433  WRITE_DEBUG("Closed FXMessageBox 'error saving demand elements' with 'OK'");
3434  }
3436  getApp()->endWaitCursor();
3437  // restore focus
3438  setFocus();
3439  return 1;
3440  } else {
3441  return 0;
3442  }
3443 }
3444 
3445 
3446 long
3448  // obtain option container
3450  // declare current folder
3451  FXString currentFolder = gCurrentFolder;
3452  // check if there is a saved network
3453  if (oc.getString("output-file").size() > 0) {
3454  // extract folder
3455  currentFolder = getFolder(oc.getString("output-file"));
3456  }
3457  // Open window to select additionasl file
3458  FXString file = MFXUtils::getFilename2Write(this,
3459  "Save demand element file as", ".rou.xml",
3461  currentFolder);
3462  // add xml extension
3463  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".rou.xml");
3464  // check that file is correct
3465  if (fileWithExtension != "") {
3466  // reset writtable flag
3468  // change value of "route-files"
3469  OptionsCont::getOptions().set("route-files", fileWithExtension);
3470  // change flag of menu command for save demand elements
3472  // save demand elements
3473  return onCmdSaveDemandElements(nullptr, 0, nullptr);
3474  } else {
3475  return 1;
3476  }
3477 }
3478 
3479 
3480 long
3481 GNEApplicationWindow::onCmdOpenDataElements(FXObject*, FXSelector, void*) {
3482  // write debug information
3483  WRITE_DEBUG("Open data element dialog");
3484  // get the data element file name
3485  FXFileDialog opendialog(this, "Open data element file");
3486  opendialog.setIcon(GUIIconSubSys::getIcon(GUIIcon::SUPERMODEDATA));
3487  opendialog.setSelectMode(SELECTFILE_EXISTING);
3488  opendialog.setPatternList("XML files (*.xml)\nData files (*dat.xml)\nAll files (*)");
3489  if (gCurrentFolder.length() != 0) {
3490  opendialog.setDirectory(gCurrentFolder);
3491  }
3492  if (opendialog.execute()) {
3493  // close additional dialog
3494  WRITE_DEBUG("Close data element dialog");
3495  // udpate current folder
3496  gCurrentFolder = opendialog.getDirectory();
3497  std::string file = opendialog.getFilename().text();
3498  // disable interval bar update
3500  // disable update data
3502  // disable validation for data elements
3503  XMLSubSys::setValidation("never", "auto", "auto");
3504  // Create data handler
3505  GNEDataHandler dataHandler(myNet, file, true);
3506  // begin undoList operation
3507  myUndoList->begin(Supermode::DATA, GUIIcon::SUPERMODEDATA, "loading data elements from '" + file + "'");
3508  // Run data parser
3509  if (!dataHandler.parse()) {
3510  WRITE_ERROR("Loading of " + file + " failed.");
3511  }
3512  // restore validation for data
3513  XMLSubSys::setValidation("auto", "auto", "auto");
3514  // end undoList operation and update view
3515  myUndoList->end();
3516  // enable update data
3518  // enable interval bar update
3520  // update
3521  update();
3522  } else {
3523  // write debug information
3524  WRITE_DEBUG("Cancel data element dialog");
3525  }
3526  return 1;
3527 }
3528 
3529 
3530 long
3531 GNEApplicationWindow::onCmdReloadDataElements(FXObject*, FXSelector, void*) {
3532  // get file
3533  const std::string file = OptionsCont::getOptions().getString("data-files");
3534  // disable interval bar update
3536  // disable update data
3538  // disable validation for additionals
3539  XMLSubSys::setValidation("never", "auto", "auto");
3540  // Create additional handler
3541  GNEDataHandler dataHandler(myNet, file, true);
3542  // begin undoList operation
3543  myUndoList->begin(Supermode::DATA, GUIIcon::SUPERMODEDATA, "reloading data elements from '" + file + "'");
3544  // clear data elements
3546  // Run data parser
3547  if (!dataHandler.parse()) {
3548  WRITE_ERROR("Reloading of " + file + " failed.");
3549  }
3550  // restore validation for data
3551  XMLSubSys::setValidation("auto", "auto", "auto");
3552  // end undoList operation and update view
3553  myUndoList->end();
3554  // enable update data
3556  // enable interval bar update
3558  // update
3559  update();
3560  return 1;
3561 }
3562 
3563 
3564 long
3565 GNEApplicationWindow::onUpdReloadDataElements(FXObject*, FXSelector, void*) {
3566  // check if file exist
3567  if (OptionsCont::getOptions().getString("data-files").empty()) {
3568  myFileMenuCommands.reloadDataElements->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
3569  } else {
3570  myFileMenuCommands.reloadDataElements->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
3571  }
3572  return 1;
3573 }
3574 
3575 
3576 long
3577 GNEApplicationWindow::onCmdSaveDataElements(FXObject*, FXSelector, void*) {
3578  // obtain option container
3580  // check if save data element menu is enabled
3581  if (myFileMenuCommands.saveDataElements->isEnabled()) {
3582  // Check if data elements file was already set at start of netedit or with a previous save
3583  if (oc.getString("data-files").empty()) {
3584  // declare current folder
3585  FXString currentFolder = gCurrentFolder;
3586  // check if there is a saved network
3587  if (oc.getString("output-file").size() > 0) {
3588  // extract folder
3589  currentFolder = getFolder(oc.getString("output-file"));
3590  }
3591  // open dialog
3592  FXString file = MFXUtils::getFilename2Write(this,
3593  "Save data element file", ".xml",
3595  currentFolder);
3596  // add xml extension
3597  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3598  // check tat file is valid
3599  if (fileWithExtension != "") {
3600  // change value of "data-files"
3601  oc.resetWritable();
3602  oc.set("data-files", fileWithExtension);
3603  } else {
3604  // None data elements file was selected, then stop function
3605  return 0;
3606  }
3607  }
3608  // Start saving data elements
3609  getApp()->beginWaitCursor();
3610  try {
3611  myNet->saveDataElements(oc.getString("data-files"));
3612  myMessageWindow->appendMsg(GUIEventType::MESSAGE_OCCURRED, "Data elements saved in " + oc.getString("data-files") + ".\n");
3614  } catch (IOError& e) {
3615  // write warning if netedit is running in testing mode
3616  WRITE_DEBUG("Opening FXMessageBox 'error saving data elements'");
3617  // open error message box
3618  FXMessageBox::error(this, MBOX_OK, "Saving data elements failed!", "%s", e.what());
3619  // write warning if netedit is running in testing mode
3620  WRITE_DEBUG("Closed FXMessageBox 'error saving data elements' with 'OK'");
3621  }
3623  getApp()->endWaitCursor();
3624  // restore focus
3625  setFocus();
3626  return 1;
3627  } else {
3628  return 0;
3629  }
3630 }
3631 
3632 
3633 long
3634 GNEApplicationWindow::onCmdSaveDataElementsAs(FXObject*, FXSelector, void*) {
3635  // obtain option container
3637  // declare current folder
3638  FXString currentFolder = gCurrentFolder;
3639  // check if there is a saved network
3640  if (oc.getString("output-file").size() > 0) {
3641  // extract folder
3642  currentFolder = getFolder(oc.getString("output-file"));
3643  }
3644  // Open window to select additionasl file
3645  FXString file = MFXUtils::getFilename2Write(this,
3646  "Save data element file as", ".xml",
3648  currentFolder);
3649  // add xml extension
3650  std::string fileWithExtension = FileHelpers::addExtension(file.text(), ".xml");
3651  // check that file is correct
3652  if (fileWithExtension != "") {
3653  // reset writtable flag
3655  // change value of "data-files"
3656  OptionsCont::getOptions().set("data-files", fileWithExtension);
3657  // change flag of menu command for save data elements
3659  // save data elements
3660  return onCmdSaveDataElements(nullptr, 0, nullptr);
3661  } else {
3662  return 1;
3663  }
3664 }
3665 
3666 
3667 bool
3669  FXuint answer = 0;
3670  if (myViewNet && myNet && !myNet->isNetSaved()) {
3671  // write warning if netedit is running in testing mode
3672  WRITE_DEBUG("Opening FXMessageBox 'Confirm " + operation + " network'");
3673  // open question box
3674  answer = FXMessageBox::question(getApp(), MBOX_QUIT_SAVE_CANCEL,
3675  ("Confirm " + operation + " Network").c_str(), "%s",
3676  ("You have unsaved changes in the network. Do you wish to " + operation + " and discard all changes?").c_str());
3677  // restore focus to view net
3678  myViewNet->setFocus();
3679  // if user close dialog box, check additionals and demand elements
3680  if (answer == MBOX_CLICKED_QUIT) {
3681  // write warning if netedit is running in testing mode
3682  WRITE_DEBUG("Closed FXMessageBox 'Confirm " + operation + " network' with 'Quit'");
3683  if (continueWithUnsavedAdditionalChanges(operation) &&
3686  // clear undo list
3687  clearUndoList();
3688  return true;
3689  } else {
3690  return false;
3691  }
3692  } else if (answer == MBOX_CLICKED_SAVE) {
3693  // save network
3694  onCmdSaveNetwork(nullptr, 0, nullptr);
3695  // check
3696  if (continueWithUnsavedAdditionalChanges(operation) &&
3699  // clear undo list
3700  clearUndoList();
3701  return true;
3702  } else {
3703  return false;
3704  }
3705  } else {
3706  // write warning if netedit is running in testing mode
3707  if (answer == 2) {
3708  WRITE_DEBUG("Closed FXMessageBox 'Confirm " + operation + " network' with 'No'");
3709  } else if (answer == 4) {
3710  WRITE_DEBUG("Closed FXMessageBox 'Confirm " + operation + " network' with 'ESC'");
3711  }
3712  // return false to stop closing/reloading
3713  return false;
3714  }
3715  } else {
3716  if (continueWithUnsavedAdditionalChanges(operation) &&
3719  // clear undo list
3720  clearUndoList();
3721  return true;
3722  } else {
3723  // return false to stop closing/reloading
3724  return false;
3725  }
3726  }
3727 }
3728 
3729 
3730 bool
3732  // Check if there are non saved additionals
3733  if (myViewNet && myFileMenuCommands.saveAdditionals->isEnabled()) {
3734  WRITE_DEBUG("Opening FXMessageBox 'Save additionals before " + operation + "'");
3735  // open question box
3736  FXuint answer = FXMessageBox::question(getApp(), MBOX_QUIT_SAVE_CANCEL,
3737  ("Save additionals before " + operation).c_str(), "%s",
3738  ("You have unsaved additionals. Do you wish to " + operation + " and discard all changes?").c_str());
3739  // restore focus to view net
3740  myViewNet->setFocus();
3741  // if answer was affirmative, but there was an error during saving additionals, return false to stop closing/reloading
3742  if (answer == MBOX_CLICKED_QUIT) {
3743  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before " + operation + "' with 'Quit'");
3744  // nothing to save, return true
3745  return true;
3746  } else if (answer == MBOX_CLICKED_SAVE) {
3747  // write warning if netedit is running in testing mode
3748  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before " + operation + "' with 'Yes'");
3749  if (onCmdSaveAdditionals(nullptr, 0, nullptr) == 1) {
3750  // additionals sucesfully saved
3751  return true;
3752  } else {
3753  // error saving additionals, abort saving
3754  return false;
3755  }
3756  } else {
3757  // write warning if netedit is running in testing mode
3758  if (answer == 2) {
3759  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before " + operation + "' with 'No'");
3760  } else if (answer == 4) {
3761  WRITE_DEBUG("Closed FXMessageBox 'Save additionals before " + operation + "' with 'ESC'");
3762  }
3763  // abort saving
3764  return false;
3765  }
3766  } else {
3767  // nothing to save, return true
3768  return true;
3769  }
3770 }
3771 
3772 
3773 bool
3775  // Check if there are non saved demand elements
3776  if (myViewNet && myFileMenuCommands.saveDemandElements->isEnabled()) {
3777  WRITE_DEBUG("Opening FXMessageBox 'Save demand elements before " + operation + "'");
3778  // open question box
3779  FXuint answer = FXMessageBox::question(getApp(), MBOX_QUIT_SAVE_CANCEL,
3780  ("Save demand elements before " + operation).c_str(), "%s",
3781  ("You have unsaved demand elements. Do you wish to " + operation + " and discard all changes?").c_str());
3782  // restore focus to view net
3783  myViewNet->setFocus();
3784  // if answer was affirmative, but there was an error during saving demand elements, return false to stop closing/reloading
3785  if (answer == MBOX_CLICKED_QUIT) {
3786  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before " + operation + "' with 'Quit'");
3787  // nothing to save, return true
3788  return true;
3789  } else if (answer == MBOX_CLICKED_SAVE) {
3790  // write warning if netedit is running in testing mode
3791  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before " + operation + "' with 'Yes'");
3792  if (onCmdSaveDemandElements(nullptr, 0, nullptr) == 1) {
3793  // demand elements sucesfully saved
3794  return true;
3795  } else {
3796  // error saving demand elements, abort saving
3797  return false;
3798  }
3799  } else {
3800  // write warning if netedit is running in testing mode
3801  if (answer == 2) {
3802  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before " + operation + "' with 'No'");
3803  } else if (answer == 4) {
3804  WRITE_DEBUG("Closed FXMessageBox 'Save demand elements before " + operation + "' with 'ESC'");
3805  }
3806  // abort saving
3807  return false;
3808  }
3809  } else {
3810  // nothing to save, return true
3811  return true;
3812  }
3813 }
3814 
3815 
3816 bool
3818  // Check if there are non saved data elements
3819  if (myViewNet && myFileMenuCommands.saveDataElements->isEnabled()) {
3820  WRITE_DEBUG("Opening FXMessageBox 'Save data elements before " + operation + "'");
3821  // open question box
3822  FXuint answer = FXMessageBox::question(getApp(), MBOX_QUIT_SAVE_CANCEL,
3823  ("Save data elements before " + operation).c_str(), "%s",
3824  ("You have unsaved data elements. Do you wish to " + operation + " and discard all changes?").c_str());
3825  // restore focus to view net
3826  myViewNet->setFocus();
3827  // if answer was affirmative, but there was an error during saving data elements, return false to stop closing/reloading
3828  if (answer == MBOX_CLICKED_QUIT) {
3829  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before " + operation + "' with 'Quit'");
3830  // nothing to save, return true
3831  return true;
3832  } else if (answer == MBOX_CLICKED_SAVE) {
3833  // write warning if netedit is running in testing mode
3834  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before " + operation + "' with 'Yes'");
3835  if (onCmdSaveDataElements(nullptr, 0, nullptr) == 1) {
3836  // data elements sucesfully saved
3837  return true;
3838  } else {
3839  // error saving data elements, abort saving
3840  return false;
3841  }
3842  } else {
3843  // write warning if netedit is running in testing mode
3844  if (answer == 2) {
3845  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before " + operation + "' with 'No'");
3846  } else if (answer == 4) {
3847  WRITE_DEBUG("Closed FXMessageBox 'Save data elements before " + operation + "' with 'ESC'");
3848  }
3849  // abort saving
3850  return false;
3851  }
3852  } else {
3853  // nothing to save, return true
3854  return true;
3855  }
3856 }
3857 
3858 
3859 FXString
3860 GNEApplicationWindow::getFolder(const std::string& folder) const {
3861  // declare folder
3862  std::string newFolder = folder;
3863  // declare stop flag
3864  bool stop = false;
3865  // continue while stop is false
3866  while (!stop) {
3867  if (newFolder.empty()) {
3868  // new folder empty, then stop
3869  stop = true;
3870  } else if ((newFolder.back() == '\'') || (newFolder.back() == '\\') ||
3871  (newFolder.back() == '/') /* || (newFolder.back() == '//') */) {
3872  // removed file, then stop
3873  stop = true;
3874  } else {
3875  newFolder.pop_back();
3876  }
3877  }
3878  // if is empty, return gCurrentFolder
3879  if (newFolder.empty()) {
3880  return gCurrentFolder;
3881  }
3882  return FXString(newFolder.c_str());
3883 }
3884 
3885 
3886 void
3888  // check that view exists
3889  if (myViewNet) {
3891  }
3892 }
3893 
3894 
3895 void
3897  // remove lock hotkeys
3899  // check supermode
3900  if (supermode == Supermode::NETWORK) {
3901  // menu commands
3905  // lock
3909  // processing
3913  } else if (supermode == Supermode::DEMAND) {
3914  // menu commands
3918  // lock
3922  // processing
3926  } else if (supermode == Supermode::DATA) {
3927  // menu commands
3931  // lock
3935  // processing
3939  } else {
3940  // menu commands
3944  // lock
3948  // processing
3952  }
3953 }
3954 
3955 
3956 void
3957 GNEApplicationWindow::disableUndoRedo(const std::string& reason) {
3958  myUndoRedoListEnabled = reason;
3959 }
3960 
3961 
3962 void
3964  myUndoRedoListEnabled.clear();
3965 }
3966 
3967 
3968 const std::string&
3970  return myUndoRedoListEnabled;
3971 }
3972 
3973 
3976  return myEditMenuCommands;
3977 }
3978 
3979 
3982  return myLockMenuCommands;
3983 }
3984 
3985 
3986 void
3988  if (myViewNet) {
3989  // destropy Popup (to avoid crashes)
3991  }
3992  // clear undo list and return true to continue with closing/reload
3993  myUndoList->clear();
3994 }
3995 
3996 // ---------------------------------------------------------------------------
3997 // GNEApplicationWindow - protected methods
3998 // ---------------------------------------------------------------------------
3999 
4001  myToolbarsGrip(this),
4002  myMenuBarFile(this),
4003  myFileMenuCommands(this),
4004  myModesMenuCommands(this),
4005  myEditMenuCommands(this),
4006  myLockMenuCommands(nullptr),
4007  myProcessingMenuCommands(this),
4008  myLocateMenuCommands(this),
4009  myToolsMenuCommands(this),
4010  myWindowsMenuCommands(this),
4011  mySupermodeCommands(this) {
4012 }
4013 
4014 
4015 long
4016 GNEApplicationWindow::onKeyPress(FXObject* o, FXSelector sel, void* eventData) {
4017  const long handled = FXMainWindow::onKeyPress(o, sel, eventData);
4018  if (handled == 0 && myMDIClient->numChildren() > 0) {
4019  GNEViewParent* w = dynamic_cast<GNEViewParent*>(myMDIClient->getActiveChild());
4020  if (w != nullptr) {
4021  w->onKeyPress(nullptr, sel, eventData);
4022  }
4023  }
4024  return 0;
4025 }
4026 
4027 
4028 long
4029 GNEApplicationWindow::onKeyRelease(FXObject* o, FXSelector sel, void* eventData) {
4030  const long handled = FXMainWindow::onKeyRelease(o, sel, eventData);
4031  if (handled == 0 && myMDIClient->numChildren() > 0) {
4032  GNEViewParent* w = dynamic_cast<GNEViewParent*>(myMDIClient->getActiveChild());
4033  if (w != nullptr) {
4034  w->onKeyRelease(nullptr, sel, eventData);
4035  }
4036  }
4037  return 0;
4038 }
4039 
4040 
4041 /****************************************************************************/
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
@ 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
@ MID_GNE_TOOLBAREDIT_LOADADDITIONALS
load additionals in SUMO-GUI after press ctrl+T
Definition: GUIAppEnum.h:662
@ MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES
automatically create opposite edge
Definition: GUIAppEnum.h:708
@ MID_HOTKEY_SHIFT_F7_ADJUST_PERSON_PLANS
Adjust person plans (start und end positions, arrival positions, etc.)
Definition: GUIAppEnum.h:222
@ MID_HOTKEY_CTRL_Q_CLOSE
Main window closes.
Definition: GUIAppEnum.h:103
@ MID_HOTKEY_SHIFT_F5_COMPUTEJUNCTIONS_VOLATILE
compute junctions with volatile options
Definition: GUIAppEnum.h:220
@ MID_HOTKEY_CTRL_SHIFT_B_SAVEDATAELEMENTS
save Data Elements
Definition: GUIAppEnum.h:159
@ MID_HOTKEY_F3_SUPERMODE_DEMAND
select demand supermode in NETEDIT
Definition: GUIAppEnum.h:187
@ MID_GNE_UNDOLISTDIALOG
open undo list dialog
Definition: GUIAppEnum.h:1302
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS
show all person plans
Definition: GUIAppEnum.h:738
@ MID_GNE_UNLOCK_ALLELEMENTS
unlock all element
Definition: GUIAppEnum.h:718
@ MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING
toogle TAZRel drawing
Definition: GUIAppEnum.h:760
@ MID_LOCATEPERSON
Locate person - button.
Definition: GUIAppEnum.h:359
@ MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition: GUIAppEnum.h:684
@ MID_HOTKEY_CTRL_Y_REDO
Undo.
Definition: GUIAppEnum.h:117
@ MID_HOTKEY_CTRL_SHIFT_H_SAVEEDGETYPES
save Edge Types
Definition: GUIAppEnum.h:157
@ MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION
move elevation instead of x,y
Definition: GUIAppEnum.h:704
@ MID_HOTKEY_ALT_9_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:145
@ MID_HOTKEY_S_MODES_SELECT
hotkey for mode selecting objects
Definition: GUIAppEnum.h:61
@ MID_LOCATEJUNCTION
Locate junction - button.
Definition: GUIAppEnum.h:349
@ MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS
hide connections
Definition: GUIAppEnum.h:692
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS
show connections
Definition: GUIAppEnum.h:690
@ MID_GNE_SAVEALLELEMENTS
save all element
Definition: GUIAppEnum.h:630
@ MID_HOTKEY_ALT_5_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:137
@ MID_GNE_TOOLBAREDIT_LOADDEMAND
load demand in SUMO-GUI after press ctrl+T
Definition: GUIAppEnum.h:664
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO
toogle draz TAZRel only to
Definition: GUIAppEnum.h:766
@ MID_OPEN_CONFIG
Open configuration - ID.
Definition: GUIAppEnum.h:264
@ MID_HOTKEY_CTRL_W_CLOSESIMULATION
Close simulation - ID.
Definition: GUIAppEnum.h:113
@ MID_HOTKEY_ALT_2_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:131
@ MID_GNE_LOCK_ALLELEMENTS
lock all element
Definition: GUIAppEnum.h:716
@ MID_HOTKEY_F7_JOIN_SELECTEDJUNCTIONS_ROUTES
join selected junctions in network mode and normalice demand element ids in demand mode
Definition: GUIAppEnum.h:195
@ 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:191
@ MID_GNE_LOCK_MENUTITLE
selector for LockMenuTitle
Definition: GUIAppEnum.h:1300
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON
lock person
Definition: GUIAppEnum.h:740
@ MID_HOTKEY_V_MODES_VEHICLE
hotkey for mode create vehicles
Definition: GUIAppEnum.h:67
@ MID_HOTKEY_F9_EDIT_VIEWSCHEME
open edit scheme menu
Definition: GUIAppEnum.h:199
@ MID_HOTKEY_E_MODES_EDGE_EDGEDATA
hotkey for mode adding edges AND edgeDatas
Definition: GUIAppEnum.h:49
@ MID_GNE_LOCK_SELECTEDELEMENTS
lock selected element
Definition: GUIAppEnum.h:720
@ MID_LOCATEPOLY
Locate polygons - button.
Definition: GUIAppEnum.h:369
@ MID_HOTKEY_DEL
hot key delete selections or elements
Definition: GUIAppEnum.h:233
@ MID_HOTKEY_CTRL_N_NEWNETWORK
create new empty newtork
Definition: GUIAppEnum.h:101
@ MID_HOTKEY_CTRL_SHIFT_S_SAVENETWORK_AS
save network as
Definition: GUIAppEnum.h:167
@ MID_GNE_NETWORKVIEWOPTIONS_ASKFORMERGE
ask before merging junctions
Definition: GUIAppEnum.h:700
@ MID_GNE_TOOLBARFILE_OPENFOREIGN
open foreign network
Definition: GUIAppEnum.h:628
@ 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:728
@ MID_HOTKEY_ALT_3_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:133
@ MID_HOTKEY_F1_ONLINEDOCUMENTATION
open online documentation
Definition: GUIAppEnum.h:183
@ MID_HOTKEY_CTRL_SHIFT_D_SAVEDEMANDELEMENTS
Save Demand Elements.
Definition: GUIAppEnum.h:161
@ MID_HOTKEY_CTRL_R_RELOAD
Reload the previously loaded simulation.
Definition: GUIAppEnum.h:107
@ MID_HOTKEY_CTRL_SHIFT_V_FORCESAVEDEMANDELEMENTS
Force save demand elements (flag)
Definition: GUIAppEnum.h:173
@ MID_HOTKEY_CTRL_S_STOPSIMULATION_SAVENETWORK
Stop the simulation in SUMO and save network in NETEDIT.
Definition: GUIAppEnum.h:105
@ MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES
create edges in chain mode
Definition: GUIAppEnum.h:706
@ MID_HOTKEY_ESC
hot key <ESC> abort current edit operation
Definition: GUIAppEnum.h:231
@ MID_GNE_TOOLBARFILE_SAVEDATA_AS
save data elements as
Definition: GUIAppEnum.h:644
@ MID_HOTKEY_F10_OPTIONSMENU
open options menu
Definition: GUIAppEnum.h:201
@ MID_HOTKEY_F11_FRONTELEMENT
set/clear front element
Definition: GUIAppEnum.h:203
@ MID_HOTKEY_R_MODES_CROSSING_ROUTE_EDGERELDATA
hotkey for mode editing crossing, routes and edge rel datas
Definition: GUIAppEnum.h:63
@ MID_HOTKEY_F8_CLEANINVALID_CROSSINGS_DEMANDELEMENTS
clean invalid crossings in network mode and demand elements in demand mode
Definition: GUIAppEnum.h:197
@ MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition: GUIAppEnum.h:758
@ MID_HOTKEY_I_MODES_INSPECT
hotkey for mode inspecting object attributes
Definition: GUIAppEnum.h:55
@ MID_LOCATEADD
Locate addtional structure - button.
Definition: GUIAppEnum.h:365
@ MID_LOCATEPOI
Locate poi - button.
Definition: GUIAppEnum.h:367
@ MID_HOTKEY_CTRL_SHIFT_W_FORCESAVEDATAELEMENTS
Force save data elements (flag)
Definition: GUIAppEnum.h:175
@ MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES
hide shapes
Definition: GUIAppEnum.h:734
@ MID_HOTKEY_P_MODES_POLYGON_PERSON
hotkey for mode creating polygons
Definition: GUIAppEnum.h:59
@ MID_OPEN_NETWORK
Open network - ID.
Definition: GUIAppEnum.h:266
@ MID_HOTKEY_CTRL_SHIFT_U_FORCESAVEADDITIONALS
Force save additionals (flag)
Definition: GUIAppEnum.h:171
@ MID_HOTKEY_ALT_4_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:135
@ MID_GNE_TOOLBARFILE_SAVETLSPROGRAMS_AS
save TLS Programs as
Definition: GUIAppEnum.h:636
@ MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS
show additionals
Definition: GUIAppEnum.h:754
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES
show junctions as bubbles
Definition: GUIAppEnum.h:702
@ MID_HOTKEY_Z_MODES_TAZ_TAZREL
hotkey for mode editing TAZ and TAZRel
Definition: GUIAppEnum.h:71
@ MID_HOTKEY_M_MODES_MOVE
hotkey for mode moving element
Definition: GUIAppEnum.h:57
@ MID_GNE_TOOLBARFILE_RELOAD_DEMANDELEMENTS
reload demand elements
Definition: GUIAppEnum.h:642
@ MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION
extend selection
Definition: GUIAppEnum.h:696
@ MID_HOTKEY_CTRL_I_EDITVIEWPORT
Open viewport editor.
Definition: GUIAppEnum.h:91
@ MID_RECENTFILE
Loads a file previously loaded.
Definition: GUIAppEnum.h:272
@ MID_HOTKEY_CTRL_J_SAVEJOINEDJUNCTIONS
save joined junctions
Definition: GUIAppEnum.h:95
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS
show sub-additionals
Definition: GUIAppEnum.h:694
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS
show all container plans
Definition: GUIAppEnum.h:742
@ MID_HOTKEY_CTRL_SHIFT_N_NEWWINDOW
Open a New Window.
Definition: GUIAppEnum.h:165
@ MID_HOTKEY_F4_SUPERMODE_DATA
select data supermode in NETEDIT
Definition: GUIAppEnum.h:189
@ MID_HOTKEY_F6_CLEAN_SOLITARYJUNCTIONS_UNUSEDROUTES
clean junctions without edges in network mode and unused routes in demand mode
Definition: GUIAppEnum.h:193
@ MID_LOCATESTOP
Locate stop - button.
Definition: GUIAppEnum.h:357
@ MID_HOTKEY_ALT_1_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:129
@ MID_HOTKEY_CTRL_K_OPENTLSPROGRAMS
Load file with TLS Programs.
Definition: GUIAppEnum.h:97
@ MID_GNE_LOCK_ELEMENT
lock element
Definition: GUIAppEnum.h:714
@ MID_HOTKEY_W_MODES_PROHIBITION
hotkey for mode editing connection prohibitions
Definition: GUIAppEnum.h:69
@ MID_CLEARMESSAGEWINDOW
Clear simulation output.
Definition: GUIAppEnum.h:331
@ MID_HOTKEY_CTRL_G_GAMINGMODE_TOGGLEGRID
Toggle Gaming mode in SUMO and grid in NETEDIT.
Definition: GUIAppEnum.h:87
@ MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL
toogle draz TAZ fill
Definition: GUIAppEnum.h:762
@ MID_HOTKEY_ALT_6_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:139
@ ID_LOADTHREAD_EVENT
The loading thread.
Definition: GUIAppEnum.h:298
@ MID_GNE_TOOLBARFILE_RELOAD_ADDITIONALS
reload additionals
Definition: GUIAppEnum.h:634
@ MID_HOTKEY_A_MODES_ADDITIONAL_STOP
hotkey for mode editing additionals AND stops
Definition: GUIAppEnum.h:43
@ MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS
show demand elements
Definition: GUIAppEnum.h:686
@ MID_HOTKEY_ALT_0_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:127
@ MID_GNE_TOOLBARFILE_SAVEADDITIONALS_AS
save additionals as
Definition: GUIAppEnum.h:632
@ MID_GNE_TOOLBARFILE_SAVEEDGETYPES_AS
save edgeTypes as
Definition: GUIAppEnum.h:638
@ MID_HOTKEY_H_MODE_CONTAINERDATA
hotkey for mode containerData
Definition: GUIAppEnum.h:53
@ MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED
hide non-inspected demand element
Definition: GUIAppEnum.h:732
@ MID_HOTKEY_C_MODES_CONNECT_PERSONPLAN
hotkey for mode connecting lanes
Definition: GUIAppEnum.h:45
@ MID_HOTKEY_ALT_F4_CLOSE
Main window closes.
Definition: GUIAppEnum.h:147
@ MID_HOTKEY_CTRL_SHIFT_A_SAVEADDITIONALS
Save Additional Elements.
Definition: GUIAppEnum.h:155
@ MID_LOCATEEDGE
Locate edge - button.
Definition: GUIAppEnum.h:351
@ MID_HOTKEY_G_MODE_CONTAINER
hotkey for mode container
Definition: GUIAppEnum.h:51
@ MID_HOTKEY_SHIFT_F2_TEMPLATE_COPY
copy template
Definition: GUIAppEnum.h:216
@ MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES
change all phases
Definition: GUIAppEnum.h:698
@ MID_HOTKEY_CTRL_A_STARTSIMULATION_OPENADDITIONALS
Start the simulation in SUMO and open Additionals Elemements in NETEDIT.
Definition: GUIAppEnum.h:79
@ MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES
show shapes
Definition: GUIAppEnum.h:756
@ MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM
toogle draz TAZRel only from
Definition: GUIAppEnum.h:764
@ MID_HOTKEY_ALT_8_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:143
@ MID_GNE_TOOLBARTOOLS_NETDIFF
call tool netdiff
Definition: GUIAppEnum.h:654
@ MID_LOCATEVEHICLE
Locate vehicle - button.
Definition: GUIAppEnum.h:353
@ MID_LOCATETLS
Locate TLS - button.
Definition: GUIAppEnum.h:363
@ MID_GNE_TOOLBARFILE_SAVEDEMAND_AS
save demand elements as
Definition: GUIAppEnum.h:640
@ MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES
Draw vehicles in begin position or spread in lane.
Definition: GUIAppEnum.h:730
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES
show overlapped routes
Definition: GUIAppEnum.h:746
@ MID_HOTKEY_CTRL_Z_UNDO
Redo.
Definition: GUIAppEnum.h:119
@ MID_GNE_MODESMENUTITLE
selector for ModesMenuTitle
Definition: GUIAppEnum.h:1298
@ MID_HOTKEY_CTRL_SHIFT_T_FORCESAVENETEWORK
Force save network (flag)
Definition: GUIAppEnum.h:169
@ MID_HOTKEY_BACKSPACE
hot key <Backspace> remove last sub-operation
Definition: GUIAppEnum.h:237
@ MID_HOTKEY_ALT_7_TOGGLEEDITOPTION
toggle edit option
Definition: GUIAppEnum.h:141
@ MID_HOTKEY_F12_ABOUT
open about dialog
Definition: GUIAppEnum.h:207
@ MID_HOTKEY_ENTER
hot key <ENTER> accept current operation
Definition: GUIAppEnum.h:235
@ MID_GNE_TOOLBARFILE_RELOAD_DATAELEMENTS
reload data elements
Definition: GUIAppEnum.h:646
@ MID_HOTKEY_CTRL_SHIFT_K_SAVETLS
save TLS Programs
Definition: GUIAppEnum.h:163
@ MID_HOTKEY_SHIFT_F1_TEMPLATE_SET
set template
Definition: GUIAppEnum.h:214
@ MID_HOTKEY_F2_SUPERMODE_NETWORK
select network supermode in NETEDIT
Definition: GUIAppEnum.h:185
@ MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER
lock container
Definition: GUIAppEnum.h:744
@ MID_HOTKEY_SHIFT_F12_FOCUSUPPERELEMENT
focus upper element of current frame (only used in NETEDIT)
Definition: GUIAppEnum.h:224
@ MID_HOTKEY_D_MODES_DELETE
hotkey for mode deleting things
Definition: GUIAppEnum.h:47
@ MID_HOTKEY_T_MODES_TLS_TYPE
hotkey for mode editing TLS AND types
Definition: GUIAppEnum.h:65
@ MID_HOTKEY_SHIFT_F3_TEMPLATE_CLEAR
clear template
Definition: GUIAppEnum.h:218
@ MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES
select edges
Definition: GUIAppEnum.h:688
@ MID_HOTKEY_CTRL_H_OPENEDGETYPES
open edge type files
Definition: GUIAppEnum.h:89
@ MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS
show all trips
Definition: GUIAppEnum.h:736
@ MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID
show grid
Definition: GUIAppEnum.h:682
@ MID_LOCATEROUTE
Locate route - button.
Definition: GUIAppEnum.h:355
@ MID_HOTKEY_CTRL_L_SAVEASPLAINXML
save network as plain XML
Definition: GUIAppEnum.h:99
@ MID_GNE_TOOLBAREDIT_COMPUTEPATHMANAGER
compute path manager
Definition: GUIAppEnum.h:666
@ MID_HOTKEY_CTRL_T_OPENSUMONETEDIT
Open current network in SUMO or in NETEDIT.
Definition: GUIAppEnum.h:109
@ MID_WINDOW
Main window-ID.
Definition: GUIAppEnum.h:245
GUICompleteSchemeStorage gSchemeStorage
#define GUIDesignHorizontalFrameStatusBar
Horizontal frame used in status bar.
Definition: GUIDesigns.h:302
#define GUIDesignSplitter
Definition: GUIDesigns.h:406
#define GUIDesignSplitterMDI
MDI Splitter.
Definition: GUIDesigns.h:409
#define GUIDesignStatusBar
design used in status bar
Definition: GUIDesigns.h:378
@ 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:290
#define WRITE_MESSAGE(msg)
Definition: MsgHandler.h:282
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:288
long long int SUMOTime
Definition: SUMOTime.h:32
@ 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
Definition: DataHandler.cpp:42
void setTarget(FXObject *tgt)
set the target
Definition: FXBaseObject.h:128
void setSelector(FXSelector sel)
set the selector
Definition: FXBaseObject.h:138
void setCheck(FXbool s=TRUE)
Set check state (TRUE, FALSE or MAYBE)
bool empty()
Definition: FXSynchQue.h:128
void pop()
Definition: FXSynchQue.h:65
static std::string addExtension(const std::string &path, const std::string &extension)
Add an extension to the given file path.
Definition: FileHelpers.cpp:91
static bool isReadable(std::string path)
Checks whether the given file is readable.
Definition: FileHelpers.cpp:49
static void resetFont()
to be called when the font context is invalidated
Definition: GLHelper.cpp:524
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 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)
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)
hanlde event of type message
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 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)
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
void enableSaveAdditionalsMenu()
enable save additionals
long onCmdToggleEditOptions(FXObject *, FXSelector, void *)
called if the user press key combination Alt + <0-9>
FXEX::FXThreadEvent myLoadThreadEvent
io-event with the load-thread
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 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.
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 onCmdOpenNetwork(FXObject *, FXSelector, void *)
called when the command/FXCall open network is executed
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
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 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
long onCmdClearTemplate(FXObject *, FXSelector, void *)
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 onCmdRunNetDiff(FXObject *, FXSelector, void *)
called when the command/FXCall run NetDiff is executed
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 onCmdToggleGrid(FXObject *, FXSelector, void *)
called if the user press key combination Ctrl + G to toggle grid
void dependentBuild()
build dependent
FXMenuPane * myFileMenuDemandElements
long onCmdEditChosen(FXObject *, FXSelector, void *)
called when the command/FXCall edit chosen is executed
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 *)
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
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 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 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 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
FXSynchQue< GUIEvent * > myEvents
List of got requests.
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 onCmdOpenDataElements(FXObject *, FXSelector, void *)
called when the command/FXCall open data is executed
void updateSuperModeMenuCommands(const Supermode supermode)
update FXMenuCommands depending of supermode
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 onCmdRedo(FXObject *, FXSelector, void *)
long onUpdUndo(FXObject *obj, FXSelector sel, void *ptr)
called when the update/FXCall undo is executed
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 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.
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
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
virtual void updateFrameAfterUndoRedo()
function called after undo/redo in the current frame (can be reimplemented in frame children)
Definition: GNEFrame.cpp:151
void refreshNeteditAttributesEditor(bool forceRefresh)
refresh netedit attributes
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, bool isNet, bool useStartupOptions, 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
int getNumberOfDemandElements() const
Return the number of demand elements.
int getNumberOfAdditionals() const
get number of additonals
void clearAdditionalElements(GNEUndoList *undoList)
clear additionals
Definition: GNENet.cpp:1906
void removeSolitaryJunctions(GNEUndoList *undoList)
removes junctions that have no edges
Definition: GNENet.cpp:1554
bool joinSelectedJunctions(GNEUndoList *undoList)
join selected junctions
Definition: GNENet.cpp:1365
void save(OptionsCont &oc)
save the network
Definition: GNENet.cpp:1156
void saveDemandElements(const std::string &filename)
save demand element elements of the network
Definition: GNENet.cpp:2071
void saveTLSPrograms(const std::string &filename)
save TLS Programs elements of the network
Definition: GNENet.cpp:2400
bool isNetSaved() const
return if net has to be saved
Definition: GNENet.cpp:1150
void enableUpdateData()
Definition: GNENet.cpp:2467
void requireSaveNet(bool value)
inform that net has to be saved
Definition: GNENet.cpp:1144
void saveEdgeTypes(const std::string &filename)
save edgeTypes elements of the network
Definition: GNENet.cpp:2421
void savePlain(OptionsCont &oc)
save plain xml representation of the network (and nothing else)
Definition: GNENet.cpp:1179
void clearDemandElements(GNEUndoList *undoList)
clear demand elements
Definition: GNENet.cpp:1931
void adjustPersonPlans(GNEUndoList *undoList)
adjust person plans
Definition: GNENet.cpp:1661
void requireSaveAdditionals(bool value)
inform that additionals has to be saved
Definition: GNENet.cpp:1994
void cleanInvalidDemandElements(GNEUndoList *undoList)
clean invalid demand elements
Definition: GNENet.cpp:1706
void cleanUnusedRoutes(GNEUndoList *undoList)
clean unused routes
Definition: GNENet.cpp:1571
GNENetHelper::AttributeCarriers * getAttributeCarriers() const
get all attribute carriers used in this net
Definition: GNENet.cpp:125
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:1234
bool isAdditionalsSaved() const
check if additionals are saved
Definition: GNENet.cpp:2052
void disableUpdateData()
disable update data elements after inserting or removing an element in net
Definition: GNENet.cpp:2478
bool cleanInvalidCrossings(GNEUndoList *undoList)
clear invalid crossings
Definition: GNENet.cpp:1502
void joinRoutes(GNEUndoList *undoList)
join routes
Definition: GNENet.cpp:1597
void requireSaveDemandElements(bool value)
inform that demand elements has to be saved
Definition: GNENet.cpp:2058
GNEPathManager * getPathManager()
get path manager
Definition: GNENet.cpp:131
void requireSaveDataElements(bool value)
inform that data sets has to be saved
Definition: GNENet.cpp:2123
void saveJoined(OptionsCont &oc)
save log of joined junctions (and nothing else)
Definition: GNENet.cpp:1187
void saveDataElements(const std::string &filename)
save data set elements of the network
Definition: GNENet.cpp:2136
void saveAdditionals(const std::string &filename)
save additional elements of the network
Definition: GNENet.cpp:2007
bool isDataElementsSaved() const
check if data sets are saved
Definition: GNENet.cpp:2149
GNEViewNet * getViewNet() const
get view net
Definition: GNENet.cpp:1964
void computeDemandElements(GNEApplicationWindow *window)
compute demand elements param[in] window The window to inform about delay
Definition: GNENet.cpp:1290
bool isDemandElementsSaved() const
check if demand elements are saved
Definition: GNENet.cpp:2117
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
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
bool parseTLSPrograms(const std::string &file)
parse TLS Programs from a file
Dialog for edit rerouters.
void updateList()
update data table
bool shown() const
shown
void setFocus()
Move the focus to this window.
void hide()
hide window
void open()
open 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...
void enableIntervalBarUpdate()
enable interval bar update
void disableIntervalBarUpdate()
enable interval bar update
long onCmdToggleShowDemandElementsNetwork(FXObject *, FXSelector, void *)
toggle show demand elements (network)
const GNEViewNetHelper::DataViewOptions & getDataViewOptions() const
get data view options
Definition: GNEViewNet.cpp:537
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:513
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 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:525
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
GNEViewNetHelper::IntervalBar & getIntervalBar()
get interval bar
long onCmdToggleHideNonInspecteDemandElements(FXObject *, FXSelector, void *)
toggle hide non inspected demand elements
GNEViewParent * getViewParent() const
get the net object
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:485
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:697
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:379
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:531
long onCmdToggleHideConnections(FXObject *, FXSelector, void *)
toggle hide connections
A single child window which contains a view of the simulation area.
Definition: GNEViewParent.h:82
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:77
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
FXLabel * myCartesianCoordinate
Labels for the current cartesian and geo-coordinate.
FXMDIClient * myMDIClient
The multi view panel.
FXHorizontalFrame * myGeoFrame
FXLabel * myGeoCoordinate
FXHorizontalFrame * myCartesianFrame
FXMutex myTrackerLock
A lock to make the removal and addition of trackers secure.
void storeWindowSizeAndPos()
record window position and size in registry
FXStatusBar * myStatusbar
The status bar.
FXGLVisual * myGLVisual
The gl-visual used.
std::vector< GUIGlChildWindow * > myGLWindows
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
GUIVisualizationSettings & getVisualisationSettings() const
get visualization settings
virtual void showViewportEditor()
show viewport editor
GUIPerspectiveChanger & getChanger() const
get changer
virtual void setViewportFromToRot(const Position &lookFrom, const Position &lookAt, double rotation)
applies the given viewport settings
void destroyPopup()
destoys 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 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
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:670
A storage for available edgeTypes of edges.
Definition: NBTypeCont.h:52
int size() const
Returns the number of known edgeTypes.
Definition: NBTypeCont.cpp:243
static bool checkOptions()
Checks set options from the OptionsCont-singleton for being valid.
Definition: NIFrame.cpp:368
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
void unSet(const std::string &name, bool failOnNonExistant=true) const
Marks the option as unset.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
bool set(const std::string &name, const std::string &value)
Sets the given value for the named option.
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 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:58
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:64
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:180
@ SEL_THREAD
Definition: fxexdefs.h:162
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
FXMenuCommand * saveTLSPrograms
FXMenuCommand for enable or disable save additionals.
FXMenuCommand * saveEdgeTypes
FXMenuCommand for enable or disable save edgeTypes.
FXMenuCommand * saveDemandElementsAs
FXMenuCommand for enable or disable save demand elements as.
FXMenuCommand * saveDataElementsAs
FXMenuCommand for enable or disable save data elements as.
FXMenuCommand * saveAdditionals
FXMenuCommand for enable or disable save additionals.
FXMenuCommand * saveDemandElements
FXMenuCommand for enable or disable save demand elements.
FXMenuCommand * saveDataElements
FXMenuCommand for enable or disable save data elements.
FXMenuCommand * reloadAdditionals
FXMenuCommand for reload additionals.
FXMenuCommand * reloadDataElements
FXMenuCommand for reload data elements.
FXMenuCommand * reloadDemandElements
FXMenuCommand for reload demand elements.
void buildFileMenuCommands(FXMenuPane *fileMenu, FXMenuPane *fileMenuTLS, FXMenuPane *fileMenuEdgeTypes, FXMenuPane *fileMenuAdditionals, FXMenuPane *fileMenuDemandElements, FXMenuPane *fileMenuDataElements)
build menu commands
FXMenuCommand * saveAdditionalsAs
FXMenuCommand for enable or disable save additionals As.
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
FXRecentNetworks 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
void showDemandProcessingMenuCommands()
show demand processing menu commands
void hideDemandProcessingMenuCommands()
show demand processing menu commands
void hideDataProcessingMenuCommands()
show data processing menu commands
void showNetworkProcessingMenuCommands()
show network processing menu commands
void buildProcessingMenuCommands(FXMenuPane *editMenu)
build 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 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 * menuCheckShowAdditionals
menu check to show Additionals
MFXCheckableButton * menuCheckShowShapes
menu check to show Shapes
void getVisibleDataMenuCommands(std::vector< MFXCheckableButton * > &commands) const
get visible demand menu commands
MFXCheckableButton * menuCheckToogleTAZRelOnlyTo
menu check to toogle TAZRel only to
MFXCheckableButton * menuCheckShowDemandElements
menu check to show Demand Elements
MFXCheckableButton * menuCheckToogleTAZRelOnlyFrom
menu check to toogle TAZRel only from
MFXCheckableButton * menuCheckToogleTAZDrawFill
menu check to toogle TAZ draw fill
MFXCheckableButton * menuCheckToogleTAZRelDrawing
menu check to toogle TAZ Rel drawing
MFXCheckableButton * menuCheckShowAllTrips
show all trips
MFXCheckableButton * menuCheckToggleGrid
menu check to show grid button
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
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 * menuCheckToggleGrid
checkable button to show grid button
MFXCheckableButton * menuCheckShowJunctionBubble
checkable button to show connection as buuble 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