SUMO - Simulation of Urban MObility
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  }
130  myTitle = myFile;
131  // within gui-based applications, nothing is reported to the console
135  // do this once again to get parsed options
136  if (oc.getBool("duration-log.statistics") && oc.isDefault("verbose")) {
137  // must be done before calling initOutputOptions (which checks option "verbose")
138  // but initOutputOptions must come before checkOptions (so that warnings are printed)
139  oc.set("verbose", "true");
140  }
142  XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"));
143  GUIGlobals::gRunAfterLoad = oc.getBool("start");
144  GUIGlobals::gQuitOnEnd = oc.getBool("quit-on-end");
145  if (!MSFrame::checkOptions()) {
146  throw ProcessError();
147  }
148  } catch (ProcessError& e) {
149  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
150  WRITE_ERROR(e.what());
151  }
152  // the options are not valid but maybe we want to quit
153  GUIGlobals::gQuitOnEnd = oc.getBool("quit-on-end");
154  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
155  submitEndAndCleanup(0, 0, 0);
156  return 0;
157  }
158 
159  // initialise global settings
163  GUITexturesHelper::allowTextures(!oc.getBool("disable-textures"));
164  if (oc.getBool("game")) {
165  myParent->onCmdGaming(0, 0, 0);
166  }
167  MSVehicleControl* vehControl = 0;
170  vehControl = new GUIMEVehicleControl();
171  } else {
172  vehControl = new GUIVehicleControl();
173  }
174 
175  GUINet* net = 0;
176  int simStartTime = 0;
177  int simEndTime = 0;
178  std::vector<std::string> guiSettingsFiles;
179  bool osgView = false;
180  GUIEdgeControlBuilder* eb = 0;
181  try {
182  net = new GUINet(
183  vehControl,
184  new GUIEventControl(),
185  new GUIEventControl(),
186  new GUIEventControl());
187 #ifndef NO_TRACI
188  // need to init TraCI-Server before loading routes to catch VEHICLE_STATE_BUILT
189  std::map<int, TraCIServer::CmdExecutor> execs;
193 #endif
194 
195  eb = new GUIEdgeControlBuilder();
196  GUIDetectorBuilder db(*net);
197  NLJunctionControlBuilder jb(*net, db);
199  NLHandler handler("", *net, db, tb, *eb, jb);
200  tb.setHandler(&handler);
201  NLBuilder builder(oc, *net, *eb, jb, db, handler);
205  if (!builder.build()) {
206  throw ProcessError();
207  } else {
208  net->initGUIStructures();
209  simStartTime = string2time(oc.getString("begin"));
210  simEndTime = string2time(oc.getString("end"));
211  guiSettingsFiles = oc.getStringVector("gui-settings-file");
212 #ifdef HAVE_OSG
213  osgView = oc.getBool("osg-view");
214 #endif
215  }
216  } catch (ProcessError& e) {
217  if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
218  WRITE_ERROR(e.what());
219  }
220  MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
221  delete net;
222  net = 0;
223 #ifndef _DEBUG
224  } catch (std::exception& e) {
225  WRITE_ERROR(e.what());
226  delete net;
227  net = 0;
228 #endif
229  }
230  if (net == 0) {
231  MSNet::clearAll();
232  }
233  delete eb;
234  submitEndAndCleanup(net, simStartTime, simEndTime, guiSettingsFiles, osgView);
235  return 0;
236 }
237 
238 
239 void
241  const SUMOTime simStartTime,
242  const SUMOTime simEndTime,
243  const std::vector<std::string>& guiSettingsFiles,
244  const bool osgView) {
245  // remove message callbacks
249  // inform parent about the process
250  GUIEvent* e = new GUIEvent_SimulationLoaded(net, simStartTime, simEndTime, myTitle, guiSettingsFiles, osgView);
251  myEventQue.add(e);
253 }
254 
255 
256 void
257 GUILoadThread::loadConfigOrNet(const std::string& file, bool isNet) {
258  myFile = file;
259  myLoadNet = isNet;
260  if (myFile != "") {
261  OptionsIO::setArgs(0, 0);
262  }
263  start();
264 }
265 
266 
267 void
268 GUILoadThread::retrieveMessage(const MsgHandler::MsgType type, const std::string& msg) {
269  GUIEvent* e = new GUIEvent_Message(type, msg);
270  myEventQue.add(e);
272 }
273 
274 
275 const std::string&
277  return myFile;
278 }
279 
280 
281 /****************************************************************************/
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
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
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:266
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 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:423
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
static void getOptions()
Parses the command line arguments and loads the configuration.
Definition: OptionsIO.cpp:72
Encapsulates an object&#39;s method for using it as a message retriever.
static void clearAll()
Clears all dictionaries.
Definition: MSNet.cpp:566
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:108
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:484
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:87
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.