SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
GUILoadThread.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // Class describing the thread that performs the loading of a simulation
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
12 // Copyright (C) 2001-2016 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <iostream>
34 #include <ctime>
40 #include <utils/options/Option.h>
47 #include <utils/xml/XMLSubSys.h>
48 #include <guisim/GUINet.h>
49 #include <guisim/GUIEventControl.h>
51 #include <netload/NLBuilder.h>
52 #include <netload/NLHandler.h>
58 #include <microsim/MSGlobals.h>
59 #include <microsim/MSFrame.h>
61 #include "GUIApplicationWindow.h"
62 #include "GUILoadThread.h"
63 #include "GUIGlobals.h"
65 
67 
68 #ifndef NO_TRACI
70 #include "TraCIServerAPI_GUI.h"
71 #endif
72 
73 #ifdef CHECK_MEMORY_LEAKS
74 #include <foreign/nvwa/debug_new.h>
75 #endif // CHECK_MEMORY_LEAKS
76 
77 
78 // ===========================================================================
79 // member method definitions
80 // ===========================================================================
83  : FXSingleEventThread(app, mw), myParent(mw), myEventQue(eq),
84  myEventThrow(ev) {
89 }
90 
91 
93  delete myErrorRetriever;
94  delete myMessageRetriever;
95  delete myWarningRetriever;
96 }
97 
98 
99 FXint
101  // register message callbacks
105 
106  // try to load the given configuration
108  try {
109  oc.clear();
111  if (myFile != "") {
112  // triggered by menu option or reload
113  if (myLoadNet) {
114  oc.set("net-file", myFile);
115  } else {
116  oc.set("configuration-file", myFile);
117  }
118  oc.resetWritable(); // there may be command line options
120  } else {
121  // triggered at application start
123  if (oc.isSet("configuration-file")) {
124  myFile = oc.getString("configuration-file");
125  } else if (oc.isSet("net-file")) {
126  myFile = oc.getString("net-file");
127  myLoadNet = true;
128  }
129  myEventQue.add(new GUIEvent_Message("Loading '" + myFile + "'."));
131  myParent->addRecentFile(FXPath::absolute(myFile.c_str()), myLoadNet);
132  }
133  myTitle = myFile;
134  // within gui-based applications, nothing is reported to the console
138  // do this once again to get parsed options
139  if (oc.getBool("duration-log.statistics") && oc.isDefault("verbose")) {
140  // must be done before calling initOutputOptions (which checks option "verbose")
141  // but initOutputOptions must come before checkOptions (so that warnings are printed)
142  oc.set("verbose", "true");
143  }
145  if (!MSFrame::checkOptions()) {
146  throw ProcessError();
147  }
148  XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"));
149  GUIGlobals::gRunAfterLoad = oc.getBool("start");
150  GUIGlobals::gQuitOnEnd = oc.getBool("quit-on-end");
152  } catch (ProcessError& e) {
153  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
154  WRITE_ERROR(e.what());
155  }
156  // the options are not valid but maybe we want to quit
157  GUIGlobals::gQuitOnEnd = oc.getBool("quit-on-end");
158  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
159  submitEndAndCleanup(0, 0, 0);
160  return 0;
161  }
162 
163  // initialise global settings
167  GUITexturesHelper::allowTextures(!oc.getBool("disable-textures"));
168  if (oc.getBool("game")) {
169  myParent->onCmdGaming(0, 0, 0);
170  }
171  MSVehicleControl* vehControl = 0;
174  vehControl = new GUIMEVehicleControl();
175  } else {
176  vehControl = new GUIVehicleControl();
177  }
178 
179  GUINet* net = 0;
180  SUMOTime simStartTime = 0;
181  SUMOTime simEndTime = 0;
182  std::vector<std::string> guiSettingsFiles;
183  bool osgView = false;
184  GUIEdgeControlBuilder* eb = 0;
185  try {
186  net = new GUINet(
187  vehControl,
188  new GUIEventControl(),
189  new GUIEventControl(),
190  new GUIEventControl());
191 #ifndef NO_TRACI
192  // need to init TraCI-Server before loading routes to catch VEHICLE_STATE_BUILT
193  std::map<int, TraCIServer::CmdExecutor> execs;
197 #endif
198 
199  eb = new GUIEdgeControlBuilder();
200  GUIDetectorBuilder db(*net);
201  NLJunctionControlBuilder jb(*net, db);
203  NLHandler handler("", *net, db, tb, *eb, jb);
204  tb.setHandler(&handler);
205  NLBuilder builder(oc, *net, *eb, jb, db, handler);
209  if (!builder.build()) {
210  throw ProcessError();
211  } else {
212  net->initGUIStructures();
213  simStartTime = string2time(oc.getString("begin"));
214  simEndTime = string2time(oc.getString("end"));
215  guiSettingsFiles = oc.getStringVector("gui-settings-file");
216 #ifdef HAVE_OSG
217  osgView = oc.getBool("osg-view");
218 #endif
219  }
220  } catch (ProcessError& e) {
221  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
222  WRITE_ERROR(e.what());
223  }
224  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
225  delete net;
226  net = 0;
227 #ifndef _DEBUG
228  } catch (std::exception& e) {
229  WRITE_ERROR(e.what());
230  delete net;
231  net = 0;
232 #endif
233  }
234  if (net == 0) {
235  MSNet::clearAll();
236  }
237  delete eb;
238  submitEndAndCleanup(net, simStartTime, simEndTime, guiSettingsFiles, osgView);
239  return 0;
240 }
241 
242 
243 void
245  const SUMOTime simStartTime,
246  const SUMOTime simEndTime,
247  const std::vector<std::string>& guiSettingsFiles,
248  const bool osgView) {
249  // remove message callbacks
253  // inform parent about the process
254  GUIEvent* e = new GUIEvent_SimulationLoaded(net, simStartTime, simEndTime, myTitle, guiSettingsFiles, osgView);
255  myEventQue.add(e);
257 }
258 
259 
260 void
261 GUILoadThread::loadConfigOrNet(const std::string& file, bool isNet) {
262  myFile = file;
263  myLoadNet = isNet;
264  if (myFile != "") {
265  OptionsIO::setArgs(0, 0);
266  }
267  start();
268 }
269 
270 
271 void
272 GUILoadThread::retrieveMessage(const MsgHandler::MsgType type, const std::string& msg) {
273  GUIEvent* e = new GUIEvent_Message(type, msg);
274  myEventQue.add(e);
276 }
277 
278 
279 const std::string&
281  return myFile;
282 }
283 
284 
285 /****************************************************************************/
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:71
The message is only something to show.
Definition: MsgHandler.h:62
MFXEventQue< GUIEvent * > & myEventQue
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) ...
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:80
The class responsible for building and deletion of vehicles (gui-version)
OutputDevice * myWarningRetriever
long long int SUMOTime
Definition: SUMOTime.h:43
static void getOptions(const bool commandLineOnly=false)
Parses the command line arguments and loads the configuration.
Definition: OptionsIO.cpp:72
void resetWritable()
Resets all options to be writeable.
The main interface for loading a microsim.
Definition: NLBuilder.h:68
static void setValidation(const std::string &validationScheme, const std::string &netValidationScheme)
Enables or disables validation.
Definition: XMLSubSys.cpp:69
void add(T what)
Definition: MFXEventQue.h:59
void addRecentFile(const FX::FXString &f, const bool isNet)
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
GUILoadThread(FXApp *app, GUIApplicationWindow *mw, MFXEventQue< GUIEvent * > &eq, FXEX::FXThreadEvent &ev)
constructor
static MTRand * getParsingRNG()
static bool gRunAfterLoad
the simulation shall start direct after loading
Definition: GUIGlobals.h:52
FXEX::FXThreadEvent & myEventThrow
The class responsible for building and deletion of vehicles (gui-version)
void initGUIStructures()
Initialises gui wrappers.
Definition: GUINet.cpp:264
void addRetriever(OutputDevice *retriever)
Adds a further retriever to the instance responsible for a certain msg type.
Definition: MsgHandler.cpp:161
void submitEndAndCleanup(GUINet *net, const SUMOTime simStartTime, const SUMOTime simEndTime, const std::vector< std::string > &guiSettingsFiles=std::vector< std::string >(), const bool osgView=false)
Closes the loading process.
Derivation of NLEdgeControlBuilder which builds gui-edges.
Builds detectors for guisim.
OutputDevice * myErrorRetriever
The instances of message retriever encapsulations Needed to be deleted from the handler later on...
#define CMD_SET_GUI_VARIABLE
static bool gDemoAutoReload
the simulation shall reload when it has ended (demo)
Definition: GUIGlobals.h:58
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:65
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:69
static void initRandGlobal(MTRand *which=0)
Reads the given random number options and initialises the random number generator in accordance...
Definition: RandHelper.cpp:68
OutputDevice * myMessageRetriever
static void fillOptions()
Inserts options used by the simulation into the OptionsCont-singleton.
Definition: MSFrame.cpp:69
Builds trigger objects for guisim.
virtual ~GUILoadThread()
destructor
void loadConfigOrNet(const std::string &file, bool isNet)
begins the loading of the given file
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
GUIApplicationWindow * myParent
the parent window to inform about the loading
Definition: GUILoadThread.h:90
void clear()
Removes all information from the container.
std::string myTitle
the title string for the application
Definition: GUILoadThread.h:96
Builder of microsim-junctions and tls.
SUMOTime string2time(const std::string &r)
Definition: SUMOTime.cpp:46
void removeRetriever(OutputDevice *retriever)
Removes the retriever from the handler.
Definition: MsgHandler.cpp:175
static MsgHandler * getMessageInstance()
Returns the instance to add normal messages to.
Definition: MsgHandler.cpp:62
#define CMD_GET_GUI_VARIABLE
const std::string & getFileName() const
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
bool myLoadNet
Information whether only the network shall be loaded.
The XML-Handler for network loading.
Definition: NLHandler.h:84
static bool gQuitOnEnd
the window shall be closed when the simulation has ended
Definition: GUIGlobals.h:55
long onCmdGaming(FXObject *, FXSelector, void *)
Toggle gaming mode.
static bool checkOptions()
Checks the set options.
Definition: MSFrame.cpp:448
virtual bool build()
Builds and initialises the simulation.
Definition: NLBuilder.cpp:122
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:206
void retrieveMessage(const MsgHandler::MsgType type, const std::string &msg)
Retrieves messages from the loading module.
The message is a warning.
Definition: MsgHandler.h:64
Encapsulates an object's method for using it as a message retriever.
static void clearAll()
Clears all dictionaries.
Definition: MSNet.cpp:575
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:89
static OutputDevice & getDevice(const std::string &name)
Returns the described OutputDevice.
void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:89
A storage for options typed value containers)
Definition: OptionsCont.h:99
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:518
std::string myFile
the path to load the simulation from
Definition: GUILoadThread.h:93
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
void clear()
Clears information whether an error occured previously.
Definition: MsgHandler.cpp:149
static void initOutputOptions()
Definition: MsgHandler.cpp:197
static bool gUseMesoSim
Definition: MSGlobals.h:95
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:66
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
The main window of the SUMO-gui.