Eclipse SUMO - Simulation of Urban MObility
GUILoadThread.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-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
17 // Class describing the thread that performs the loading of a simulation
18 /****************************************************************************/
19 
20 
21 // ===========================================================================
22 // included modules
23 // ===========================================================================
24 #include <config.h>
25 
26 #include <iostream>
27 #include <ctime>
33 #include <utils/options/Option.h>
40 #include <utils/xml/XMLSubSys.h>
41 #include <guisim/GUINet.h>
42 #include <guisim/GUIEventControl.h>
44 #include <netload/NLBuilder.h>
45 #include <netload/NLHandler.h>
52 #include <microsim/MSGlobals.h>
53 #include <microsim/MSFrame.h>
57 #include "TraCIServerAPI_GUI.h"
58 #include "GUIApplicationWindow.h"
59 #include "GUILoadThread.h"
60 #include "GUIGlobals.h"
62 
63 
64 // ===========================================================================
65 // member method definitions
66 // ===========================================================================
69  : FXSingleEventThread(app, mw), myParent(mw), myEventQue(eq),
70  myEventThrow(ev) {
75 }
76 
77 
79  delete myErrorRetriever;
80  delete myMessageRetriever;
81  delete myWarningRetriever;
82 }
83 
84 
85 FXint
87  // register message callbacks
91 
92  // try to load the given configuration
94  try {
95  oc.clear();
97  if (myFile != "") {
98  // triggered by menu option or reload
99  if (myLoadNet) {
100  oc.set("net-file", myFile);
101  } else {
102  oc.set("configuration-file", myFile);
103  }
104  oc.resetWritable(); // there may be command line options
106  } else {
107  // triggered at application start
109  if (oc.isSet("configuration-file")) {
110  myFile = oc.getString("configuration-file");
111  } else if (oc.isSet("net-file")) {
112  myFile = oc.getString("net-file");
113  myLoadNet = true;
114  }
115  myEventQue.push_back(new GUIEvent_Message("Loading '" + myFile + "'."));
117  myParent->addRecentFile(FXPath::absolute(myFile.c_str()), myLoadNet);
118  }
119  myTitle = myFile;
120  // within gui-based applications, nothing is reported to the console
124  // do this once again to get parsed options
125  if (oc.getBool("duration-log.statistics") && oc.isDefault("verbose")) {
126  // must be done before calling initOutputOptions (which checks option "verbose")
127  // but initOutputOptions must come before checkOptions (so that warnings are printed)
128  oc.set("verbose", "true");
129  }
131  if (!MSFrame::checkOptions()) {
132  throw ProcessError();
133  }
134  XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"));
135  GUIGlobals::gRunAfterLoad = oc.getBool("start");
136  GUIGlobals::gQuitOnEnd = oc.getBool("quit-on-end");
138  GUIGlobals::gTrackerInterval = oc.getFloat("tracker-interval");
139  } catch (ProcessError& e) {
140  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
141  WRITE_ERROR(e.what());
142  }
143  // the options are not valid but maybe we want to quit
144  GUIGlobals::gQuitOnEnd = oc.getBool("quit-on-end");
145  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
146  submitEndAndCleanup(nullptr, 0, 0);
147  return 0;
148  }
149 
150  // initialise global settings
153  GUITexturesHelper::allowTextures(!oc.getBool("disable-textures"));
154 
155  MSVehicleControl* vehControl = nullptr;
158  vehControl = new GUIMEVehicleControl();
159  } else {
160  vehControl = new GUIVehicleControl();
161  }
162 
163  GUINet* net = nullptr;
164  SUMOTime simStartTime = 0;
165  SUMOTime simEndTime = 0;
166  std::vector<std::string> guiSettingsFiles;
167  bool osgView = false;
168  GUIEdgeControlBuilder* eb = nullptr;
169  try {
170  net = new GUINet(
171  vehControl,
172  new GUIEventControl(),
173  new GUIEventControl(),
174  new GUIEventControl());
175  // need to init TraCI-Server before loading routes to catch VEHICLE_STATE_BUILT
176  std::map<int, TraCIServer::CmdExecutor> execs;
180 
181  eb = new GUIEdgeControlBuilder();
182  GUIDetectorBuilder db(*net);
183  NLJunctionControlBuilder jb(*net, db);
185  NLHandler handler("", *net, db, tb, *eb, jb);
186  tb.setHandler(&handler);
187  NLBuilder builder(oc, *net, *eb, jb, db, handler);
191  if (!builder.build()) {
192  throw ProcessError();
193  } else {
194  net->initGUIStructures();
195  simStartTime = string2time(oc.getString("begin"));
196  simEndTime = string2time(oc.getString("end"));
197  guiSettingsFiles = oc.getStringVector("gui-settings-file");
198 #ifdef HAVE_OSG
199  osgView = oc.getBool("osg-view");
200 #endif
201  if (oc.isSet("edgedata-files")) {
202  if (!oc.isUsableFileList("edgedata-files")) {
203  WRITE_ERROR("Could not load edgedata-files '" + oc.getString("edgedata-files") + "'");
204  } else {
205  for (const std::string& file : oc.getStringVector("edgedata-files")) {
206  net->loadEdgeData(file);
207  }
208  }
209  }
210  }
211  } catch (ProcessError& e) {
212  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
213  WRITE_ERROR(e.what());
214  }
215  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
216  delete net;
217  net = nullptr;
218 #ifndef _DEBUG
219  } catch (std::exception& e) {
220  WRITE_ERROR(e.what());
221  delete net;
222  net = nullptr;
223 #endif
224  }
225  if (net == nullptr) {
226  MSNet::clearAll();
227  }
228  delete eb;
229  submitEndAndCleanup(net, simStartTime, simEndTime, guiSettingsFiles, osgView,
230  oc.getBool("registry-viewport"));
231  return 0;
232 }
233 
234 
235 void
237  const SUMOTime simStartTime,
238  const SUMOTime simEndTime,
239  const std::vector<std::string>& guiSettingsFiles,
240  const bool osgView,
241  const bool viewportFromRegistry) {
242  // remove message callbacks
246  // inform parent about the process
247  GUIEvent* e = new GUIEvent_SimulationLoaded(net, simStartTime, simEndTime, myTitle, guiSettingsFiles, osgView, viewportFromRegistry);
250 }
251 
252 
253 void
254 GUILoadThread::loadConfigOrNet(const std::string& file, bool isNet) {
255  myFile = file;
256  myLoadNet = isNet;
257  if (myFile != "") {
258  OptionsIO::setArgs(0, nullptr);
259  }
260  start();
261 }
262 
263 
264 void
265 GUILoadThread::retrieveMessage(const MsgHandler::MsgType type, const std::string& msg) {
266  GUIEvent* e = new GUIEvent_Message(type, msg);
269 }
270 
271 
272 const std::string&
274  return myFile;
275 }
276 
277 
278 /****************************************************************************/
void setHandler(NLHandler *handler)
Sets the parent handler to use for nested parsing.
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
Definition: MsgHandler.cpp:72
The message is only something to show.
Definition: MsgHandler.h:53
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:81
The class responsible for building and deletion of vehicles (gui-version)
OutputDevice * myWarningRetriever
Definition: GUILoadThread.h:94
long long int SUMOTime
Definition: SUMOTime.h:35
static void getOptions(const bool commandLineOnly=false)
Parses the command line arguments and loads the configuration.
Definition: OptionsIO.cpp:76
void resetWritable()
Resets all options to be writeable.
The main interface for loading a microsim.
Definition: NLBuilder.h:61
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:59
const std::string & getFileName() const
void addRecentFile(const FX::FXString &f, const bool isNet)
bool loadEdgeData(const std::string &file)
load edgeData from file
Definition: GUINet.cpp:595
static bool gRunAfterLoad
the simulation shall start direct after loading
Definition: GUIGlobals.h:45
FXEX::FXThreadEvent & myEventThrow
Definition: GUILoadThread.h:98
The class responsible for building and deletion of vehicles (gui-version)
void initGUIStructures()
Initialises gui wrappers.
Definition: GUINet.cpp:258
virtual void addRetriever(OutputDevice *retriever)
Adds a further retriever to the instance responsible for a certain msg type.
Definition: MsgHandler.cpp:166
Derivation of NLEdgeControlBuilder which builds gui-edges.
Builds detectors for guisim.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
OutputDevice * myErrorRetriever
The instances of message retriever encapsulations Needed to be deleted from the handler later on...
Definition: GUILoadThread.h:94
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
static bool gDemoAutoReload
the simulation shall reload when it has ended (demo)
Definition: GUIGlobals.h:51
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xcc: Change GUI State)
static void setArgs(int argc, char **argv)
Stores the command line arguments for later parsing.
Definition: OptionsIO.cpp:55
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:58
OutputDevice * myMessageRetriever
Definition: GUILoadThread.h:94
static void fillOptions()
Inserts options used by the simulation into the OptionsCont-singleton.
Definition: MSFrame.cpp:61
Builds trigger objects for guisim.
virtual ~GUILoadThread()
destructor
FXSynchQue< GUIEvent * > & myEventQue
Definition: GUILoadThread.h:96
void loadConfigOrNet(const std::string &file, bool isNet)
begins the loading of the given file
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
GUIApplicationWindow * myParent
the parent window to inform about the loading
Definition: GUILoadThread.h:84
void push_back(T what)
Definition: FXSynchQue.h:91
void clear()
Removes all information from the container.
bool isUsableFileList(const std::string &name) const
Checks whether the named option is usable as a file list (with at least a single file) ...
static double gTrackerInterval
the aggregation period for tracker windows in seconds
Definition: GUIGlobals.h:54
std::string myTitle
the title string for the application
Definition: GUILoadThread.h:90
Builder of microsim-junctions and tls.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
void submitEndAndCleanup(GUINet *net, const SUMOTime simStartTime, const SUMOTime simEndTime, const std::vector< std::string > &guiSettingsFiles=std::vector< std::string >(), const bool osgView=false, const bool viewportFromRegistry=false)
Closes the loading process.
SUMOTime string2time(const std::string &r)
Definition: SUMOTime.cpp:42
std::vector< std::string > getStringVector(const std::string &name) const
Returns the list of string-vector-value of the named option (only for Option_String) ...
virtual void removeRetriever(OutputDevice *retriever)
Removes the retriever from the handler.
Definition: MsgHandler.cpp:174
static MsgHandler * getMessageInstance()
Returns the instance to add normal messages to.
Definition: MsgHandler.cpp:59
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
bool myLoadNet
Information whether only the network shall be loaded.
The XML-Handler for network loading.
Definition: NLHandler.h:81
static bool gQuitOnEnd
the window shall be closed when the simulation has ended
Definition: GUIGlobals.h:48
static bool checkOptions()
Checks the set options.
Definition: MSFrame.cpp:559
virtual bool build()
Builds and initialises the simulation.
Definition: NLBuilder.cpp:117
static void initRandomness()
initializes all RNGs
Definition: NLBuilder.cpp:266
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:245
void retrieveMessage(const MsgHandler::MsgType type, const std::string &msg)
Retrieves messages from the loading module.
The message is a warning.
Definition: MsgHandler.h:55
Encapsulates an object&#39;s method for using it as a message retriever.
static void clearAll()
Clears all dictionaries.
Definition: MSNet.cpp:639
static void openSocket(const std::map< int, CmdExecutor > &execs)
Initialises the server.
bool set(const std::string &name, const std::string &value)
Sets the given value for the named option.
A MSNet extended by some values for usage within the gui.
Definition: GUINet.h:83
TRACI_CONST int CMD_GET_GUI_VARIABLE
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
GUILoadThread(FXApp *app, GUIApplicationWindow *mw, FXSynchQue< GUIEvent *> &eq, FXEX::FXThreadEvent &ev)
constructor
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:118
A storage for options typed value containers)
Definition: OptionsCont.h:90
Stores time-dependant events and executes them at the proper time (guisim)
static void setMSGlobals(OptionsCont &oc)
Sets the global microsim-options.
Definition: MSFrame.cpp:683
std::string myFile
the path to load the simulation from
Definition: GUILoadThread.h:87
static void allowTextures(const bool val)
switch texture drawing on and off
The class responsible for building and deletion of vehicles.
static bool UseMesoSim
this should be set at the same time as MSGlobals::gUseMesoSim
virtual void clear()
Clears information whether an error occurred previously.
Definition: MsgHandler.cpp:160
static void initOutputOptions()
init output options
Definition: MsgHandler.cpp:208
static bool gUseMesoSim
Definition: MSGlobals.h:91
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xac: Get GUI Variable)
The message is an error.
Definition: MsgHandler.h:57
TRACI_CONST int CMD_SET_GUI_VARIABLE
The main window of the SUMO-gui.