Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/GNELoadThread.cpp
193694 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2026 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
/****************************************************************************/
14
/// @file GNELoadThread.cpp
15
/// @author Jakob Erdmann
16
/// @date Feb 2011
17
///
18
// The thread that performs the loading of a Netedit-net (adapted from
19
// GUILoadThread)
20
/****************************************************************************/
21
22
#include <netbuild/NBFrame.h>
23
#include <netbuild/NBNetBuilder.h>
24
#include <netimport/NIFrame.h>
25
#include <netimport/NILoader.h>
26
#include <netwrite/NWFrame.h>
27
#include <utils/common/MsgRetrievingFunction.h>
28
#include <utils/common/SystemFrame.h>
29
#include <utils/gui/events/GUIEvent_Message.h>
30
#include <utils/options/OptionsCont.h>
31
#include <utils/options/OptionsIO.h>
32
#include <utils/xml/XMLSubSys.h>
33
34
#include "GNEApplicationWindow.h"
35
#include "GNELoadThread.h"
36
#include "GNENet.h"
37
38
// ===========================================================================
39
// member method definitions
40
// ===========================================================================
41
GNELoadThread::GNELoadThread(GNEApplicationWindow* applicationWindow, MFXSynchQue<GUIEvent*>& eq, FXEX::MFXThreadEvent& ev) :
42
MFXSingleEventThread(applicationWindow->getApp(), applicationWindow),
43
myApplicationWindow(applicationWindow),
44
myEventQueue(eq),
45
myEventThrow(ev) {
46
myDebugRetriever = new MsgRetrievingFunction<GNELoadThread>(this, &GNELoadThread::retrieveMessage, MsgHandler::MsgType::MT_DEBUG);
47
myGLDebugRetriever = new MsgRetrievingFunction<GNELoadThread>(this, &GNELoadThread::retrieveMessage, MsgHandler::MsgType::MT_GLDEBUG);
48
myErrorRetriever = new MsgRetrievingFunction<GNELoadThread>(this, &GNELoadThread::retrieveMessage, MsgHandler::MsgType::MT_ERROR);
49
myMessageRetriever = new MsgRetrievingFunction<GNELoadThread>(this, &GNELoadThread::retrieveMessage, MsgHandler::MsgType::MT_MESSAGE);
50
myWarningRetriever = new MsgRetrievingFunction<GNELoadThread>(this, &GNELoadThread::retrieveMessage, MsgHandler::MsgType::MT_WARNING);
51
MsgHandler::getErrorInstance()->addRetriever(myErrorRetriever);
52
}
53
54
55
GNELoadThread::~GNELoadThread() {
56
delete myDebugRetriever;
57
delete myGLDebugRetriever;
58
delete myErrorRetriever;
59
delete myMessageRetriever;
60
delete myWarningRetriever;
61
}
62
63
64
FXint
65
GNELoadThread::run() {
66
auto& neteditOptions = OptionsCont::getOptions();
67
// register message callbacks
68
MsgHandler::getMessageInstance()->addRetriever(myMessageRetriever);
69
MsgHandler::getErrorInstance()->addRetriever(myErrorRetriever);
70
MsgHandler::getWarningInstance()->addRetriever(myWarningRetriever);
71
// type of loading
72
GNEEvent_FileLoaded::Type type = GNEEvent_FileLoaded::Type::INVALID_TYPE;
73
// declare loaded file
74
std::string loadedFile;
75
// check conditions
76
if (neteditOptions.getBool("new")) {
77
// create new network
78
type = GNEEvent_FileLoaded::Type::NEW;
79
} else if (neteditOptions.getString("osm-files").size() > 0) {
80
// load an osm file
81
type = GNEEvent_FileLoaded::Type::OSM;
82
} else if (neteditOptions.getString("sumo-net-file").size() > 0) {
83
// load a network file
84
type = GNEEvent_FileLoaded::Type::NETWORK;
85
// set network as default file in file bucket
86
myApplicationWindow->getFileBucketHandler()->setDefaultFilenameFile(FileBucket::Type::NETWORK, neteditOptions.getString("sumo-net-file"));
87
} else if (neteditOptions.getString("netecfg-file").size() > 0) {
88
// load a sumo config file
89
type = GNEEvent_FileLoaded::Type::NETECFG;
90
// set sumo config as loaded file
91
loadedFile = neteditOptions.getString("netecfg-file");
92
} else if (neteditOptions.getString("sumocfg-file").size() > 0) {
93
// load a sumo config file
94
type = GNEEvent_FileLoaded::Type::SUMOCFG;
95
// set sumo config as loaded file
96
loadedFile = neteditOptions.getString("sumocfg-file");
97
} else if (neteditOptions.getString("netccfg-file").size() > 0) {
98
// load a netconvert config file
99
type = GNEEvent_FileLoaded::Type::NETCCFG;
100
// set netconvert config file as loaded file
101
loadedFile = neteditOptions.getString("netccfg-file");
102
} else if (neteditOptions.getString("configuration-file").size() > 0) {
103
// get configuration
104
loadedFile = neteditOptions.getString("configuration-file");
105
// check the extension to determine what we're loading
106
if (StringUtils::endsWith(loadedFile, ".netccfg")) {
107
// load a netconvert config file
108
type = GNEEvent_FileLoaded::Type::NETCCFG;
109
} else if (StringUtils::endsWith(loadedFile, ".sumocfg")) {
110
// load a sumo config file
111
type = GNEEvent_FileLoaded::Type::SUMOCFG;
112
} else if (StringUtils::endsWith(loadedFile, ".netecfg")) {
113
// load a netedit config file
114
type = GNEEvent_FileLoaded::Type::NETECFG;
115
} else {
116
// invalid config
117
type = GNEEvent_FileLoaded::Type::INVALID_CONFIG;
118
// stop loading
119
return submitEndAndCleanup(type, nullptr, loadedFile);
120
}
121
} else if (loadConsoleOptions()) {
122
// load information through console
123
type = GNEEvent_FileLoaded::Type::CONSOLE;
124
}
125
// run handlers
126
if (type == GNEEvent_FileLoaded::Type::SUMOCFG) {
127
// declare parser for sumo config file
128
GNEApplicationWindowHelper::GNESumoConfigHandler confighandler(myApplicationWindow, loadedFile);
129
// if there is an error loading sumo config, stop
130
if (!confighandler.loadSumoConfig()) {
131
return submitEndAndCleanup(type, nullptr, loadedFile);
132
}
133
} else if (type == GNEEvent_FileLoaded::Type::NETCCFG) {
134
// declare parser for netedit config file
135
GNEApplicationWindowHelper::GNENetconvertConfigHandler confighandler(loadedFile);
136
// if there is an error loading sumo config, stop
137
if (!confighandler.loadNetconvertConfig()) {
138
return submitEndAndCleanup(type, nullptr, loadedFile);
139
}
140
} else if (type == GNEEvent_FileLoaded::Type::NETECFG) {
141
// declare parser for netedit config file
142
GNEApplicationWindowHelper::GNENeteditConfigHandler confighandler(myApplicationWindow, loadedFile);
143
// if there is an error loading sumo config, stop
144
if (!confighandler.loadNeteditConfig()) {
145
return submitEndAndCleanup(type, nullptr, loadedFile);
146
}
147
}
148
// check input
149
if (type == GNEEvent_FileLoaded::Type::INVALID_TYPE) {
150
return submitEndAndCleanup(type, nullptr, loadedFile);
151
}
152
// update aggregate warnings
153
if (neteditOptions.isDefault("aggregate-warnings")) {
154
neteditOptions.setDefault("aggregate-warnings", "5");
155
}
156
// init output options
157
MsgHandler::initOutputOptions();
158
// if there is an error checking options, stop
159
if (!(NIFrame::checkOptions(neteditOptions) && NBFrame::checkOptions(neteditOptions) &&
160
NWFrame::checkOptions(neteditOptions) && SystemFrame::checkOptions(neteditOptions))) {
161
// options are not valid
162
return submitEndAndCleanup(GNEEvent_FileLoaded::Type::INVALID_OPTIONS, nullptr, loadedFile);
163
}
164
// clear message instances
165
MsgHandler::getErrorInstance()->clear();
166
MsgHandler::getWarningInstance()->clear();
167
MsgHandler::getMessageInstance()->clear();
168
// init global random seed
169
RandHelper::initRandGlobal();
170
// check if geo projection can be initialized
171
if (!GeoConvHelper::init(neteditOptions)) {
172
return submitEndAndCleanup(GNEEvent_FileLoaded::Type::INVALID_PROJECTION, nullptr, loadedFile);
173
}
174
// set validation
175
XMLSubSys::setValidation(neteditOptions.getString("xml-validation"), neteditOptions.getString("xml-validation.net"), neteditOptions.getString("xml-validation.routes"));
176
// check if Debug has to be enabled
177
MsgHandler::enableDebugMessages(neteditOptions.getBool("gui-testing-debug"));
178
// check if GL Debug has to be enabled
179
MsgHandler::enableDebugGLMessages(neteditOptions.getBool("gui-testing-debug-gl"));
180
// create netBuilder (will be destroyed in GNENet destructor)
181
NBNetBuilder* netBuilder = new NBNetBuilder();
182
// apply netedit options in netBuilder. In this options we have all information for building network
183
netBuilder->applyOptions(neteditOptions);
184
// declare network
185
GNENet* net = nullptr;
186
// check if create a new net
187
if (neteditOptions.getBool("new")) {
188
// create new network
189
net = new GNENet(myApplicationWindow, netBuilder);
190
} else {
191
// declare net loader
192
NILoader nl(*netBuilder);
193
try {
194
// try to load network using netedit options
195
nl.load(neteditOptions);
196
if (true) { // CHECK
197
// make coordinate conversion usable before first netBuilder->compute()
198
GeoConvHelper::computeFinal();
199
} else {
200
WRITE_MESSAGE(TL("Performing initial computation ..."));
201
// perform one-time processing (i.e. edge removal)
202
netBuilder->compute(neteditOptions);
203
// @todo remove one-time processing options!
204
}
205
// check if ignore errors
206
if (neteditOptions.getBool("ignore-errors")) {
207
MsgHandler::getErrorInstance()->clear();
208
}
209
// check whether any errors occurred
210
if (MsgHandler::getErrorInstance()->wasInformed()) {
211
throw ProcessError();
212
} else {
213
// now create net with al information loaded in net builder
214
net = new GNENet(myApplicationWindow, netBuilder);
215
// check if change traffic direction
216
if (neteditOptions.getBool("lefthand")) {
217
// force initial geometry computation without volatile options because the net will look strange otherwise
218
net->computeAndUpdate(neteditOptions, false);
219
}
220
// check if add prefixes
221
if (neteditOptions.getString("prefix").size() > 0) {
222
// change prefixes in attributeCarriers
223
net->getAttributeCarriers()->addPrefixToEdges(neteditOptions.getString("prefix"));
224
net->getAttributeCarriers()->addPrefixToJunctions(neteditOptions.getString("prefix"));
225
// change prefix in containers
226
net->getNetBuilder()->getNodeCont().addPrefix(neteditOptions.getString("prefix"));
227
net->getNetBuilder()->getEdgeCont().addPrefix(neteditOptions.getString("prefix"));
228
}
229
}
230
} catch (ProcessError& e) {
231
if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
232
WRITE_ERROR(e.what());
233
}
234
WRITE_ERROR(TL("Failed to build network."));
235
// check if delete network
236
if (net != nullptr) {
237
delete net;
238
net = nullptr;
239
} else {
240
// GNENet not created, then delete netBuilder
241
delete netBuilder;
242
}
243
} catch (std::exception& e) {
244
WRITE_ERROR(e.what());
245
// check if delete network
246
if (net != nullptr) {
247
delete net;
248
net = nullptr;
249
} else {
250
// GNENet not created, then delete netBuilder
251
delete netBuilder;
252
}
253
}
254
}
255
// only a single setting file is supported
256
return submitEndAndCleanup(type, net, loadedFile, neteditOptions.getString("gui-settings-file"),
257
neteditOptions.getBool("registry-viewport"));
258
}
259
260
261
FXint
262
GNELoadThread::submitEndAndCleanup(GNEEvent_FileLoaded::Type type, GNENet* net, const std::string& loadedFile,
263
const std::string& guiSettingsFile, const bool viewportFromRegistry) {
264
// remove message callbacks
265
MsgHandler::getErrorInstance()->removeRetriever(myErrorRetriever);
266
MsgHandler::getWarningInstance()->removeRetriever(myWarningRetriever);
267
MsgHandler::getMessageInstance()->removeRetriever(myMessageRetriever);
268
// inform parent about the process
269
myEventQueue.push_back(new GNEEvent_FileLoaded(type, net, loadedFile, guiSettingsFile, viewportFromRegistry));
270
myEventThrow.signal();
271
return 0;
272
}
273
274
275
void
276
GNELoadThread::fillOptions(OptionsCont& neteditOptions) {
277
neteditOptions.clear();
278
neteditOptions.addCallExample("--new", TL("Start plain GUI with empty net"));
279
neteditOptions.addCallExample("-s <SUMO_NET>", TL("Open a SUMO network"));
280
neteditOptions.addCallExample("-c <CONFIGURATION>", TL("Open a configuration file (netedit or netconvert config)"));
281
neteditOptions.addCallExample("-sumocfg-file <CONFIGURATION>", TL("Open a SUMO config file"));
282
283
SystemFrame::addConfigurationOptions(neteditOptions); // this subtopic is filled here, too
284
neteditOptions.addOptionSubTopic("Input");
285
neteditOptions.addOptionSubTopic("Output");
286
GeoConvHelper::addProjectionOptions(neteditOptions);
287
neteditOptions.addOptionSubTopic("Processing");
288
neteditOptions.addOptionSubTopic("Building Defaults");
289
neteditOptions.addOptionSubTopic("TLS Building");
290
neteditOptions.addOptionSubTopic("Ramp Guessing");
291
neteditOptions.addOptionSubTopic("Edge Removal");
292
neteditOptions.addOptionSubTopic("Unregulated Nodes");
293
neteditOptions.addOptionSubTopic("Junctions");
294
neteditOptions.addOptionSubTopic("Pedestrian");
295
neteditOptions.addOptionSubTopic("Bicycle");
296
neteditOptions.addOptionSubTopic("Railway");
297
neteditOptions.addOptionSubTopic("Formats");
298
neteditOptions.addOptionSubTopic("Netedit");
299
neteditOptions.addOptionSubTopic("Visualisation");
300
neteditOptions.addOptionSubTopic("Time");
301
302
// TOPIC: Input
303
neteditOptions.doRegister("netecfg-file", new Option_FileName());
304
neteditOptions.addSynonyme("netecfg-file", "netecfg");
305
neteditOptions.addDescription("netecfg-file", "Input", TL("Load netedit config"));
306
neteditOptions.addXMLDefault("netecfg-file", "neteditConfiguration");
307
neteditOptions.setOptionEditable("netecfg-file", false);
308
309
neteditOptions.doRegister("sumocfg-file", new Option_FileName());
310
neteditOptions.addSynonyme("sumocfg-file", "sumocfg");
311
neteditOptions.addDescription("sumocfg-file", "Input", TL("Load sumo config"));
312
neteditOptions.addXMLDefault("sumocfg-file", "sumoConfiguration");
313
neteditOptions.setOptionEditable("sumocfg-file", false);
314
315
neteditOptions.doRegister("netccfg-file", new Option_FileName());
316
neteditOptions.addSynonyme("netccfg-file", "netccfg");
317
neteditOptions.addDescription("netccfg-file", "Input", TL("Load netconvert config"));
318
neteditOptions.addXMLDefault("netccfg-file", "netconvertConfiguration");
319
neteditOptions.setOptionEditable("netccfg-file", false);
320
321
neteditOptions.doRegister("additional-files", 'a', new Option_FileName());
322
neteditOptions.addSynonyme("additional-files", "additional");
323
neteditOptions.addDescription("additional-files", "Input", TL("Load additional and shapes descriptions from FILE(s)"));
324
neteditOptions.setOptionEditable("additional-files", false);
325
326
neteditOptions.doRegister("route-files", 'r', new Option_FileName());
327
neteditOptions.addSynonyme("route-files", "routes");
328
neteditOptions.addDescription("route-files", "Input", TL("Load demand elements descriptions from FILE(s)"));
329
neteditOptions.setOptionEditable("route-files", false);
330
331
neteditOptions.doRegister("data-files", 'd', new Option_FileName());
332
neteditOptions.addSynonyme("data-files", "data");
333
neteditOptions.addDescription("data-files", "Input", TL("Load data elements descriptions from FILE(s)"));
334
neteditOptions.setOptionEditable("data-files", false);
335
336
neteditOptions.doRegister("meandata-files", 'm', new Option_FileName());
337
neteditOptions.addSynonyme("meandata-files", "meandata");
338
neteditOptions.addDescription("meandata-files", "Input", TL("Load meanData descriptions from FILE(s)"));
339
neteditOptions.setOptionEditable("meandata-files", false);
340
341
neteditOptions.doRegister("ignore-missing-inputs", new Option_Bool(false));
342
neteditOptions.addDescription("ignore-missing-inputs", "Input", TL("Reset path values (additional, route, data...) after loading netedit config"));
343
344
neteditOptions.doRegister("autosave-netconvert-file", new Option_Bool(false));
345
neteditOptions.addDescription("autosave-netconvert-file", "Input", TL("If enabled, automatically save a netconvert configuration after saving a netedit config"));
346
347
neteditOptions.doRegister("selection-file", new Option_FileName());
348
neteditOptions.addDescription("selection-file", "Input", TL("Load element selection"));
349
350
neteditOptions.doRegister("test-file", new Option_FileName());
351
neteditOptions.addDescription("test-file", "Input", TL("Test file"));
352
353
// TOPIC: Output
354
355
neteditOptions.doRegister("tls-file", new Option_FileName());
356
neteditOptions.addDescription("tls-file", "Output", TL("File in which TLS Programs must be saved"));
357
neteditOptions.setOptionEditable("tls-file", false);
358
359
neteditOptions.doRegister("edgetypes-file", new Option_FileName());
360
neteditOptions.addDescription("edgetypes-file", "Output", TL("File in which edgeTypes must be saved"));
361
neteditOptions.setOptionEditable("edgetypes-file", false);
362
363
// TOPIC: Netedit
364
365
neteditOptions.doRegister("new-network", new Option_Bool(false));
366
neteditOptions.addSynonyme("new-network", "new");
367
neteditOptions.addDescription("new-network", "Netedit", TL("Start netedit with a new network"));
368
369
neteditOptions.doRegister("attribute-help-output", new Option_FileName());
370
neteditOptions.addDescription("attribute-help-output", "Netedit", TL("Write attribute help to file"));
371
372
neteditOptions.doRegister("ignore-supermode-question", new Option_Bool(false));
373
neteditOptions.addDescription("ignore-supermode-question", "Netedit", TL("Ignore question dialog during changing between supermodes in undo-redo"));
374
375
neteditOptions.doRegister("ignore.additionalelements", new Option_Bool(false));
376
neteditOptions.addDescription("ignore.additionalelements", "Netedit", TL("Ignore additional elements during loading of sumo-configs"));
377
378
neteditOptions.doRegister("ignore.routeelements", new Option_Bool(false));
379
neteditOptions.addDescription("ignore.routeelements", "Netedit", TL("Ignore route elements during loading of sumo-configs"));
380
381
neteditOptions.doRegister("e2.friendlyPos.automatic", new Option_Bool(true));
382
neteditOptions.addDescription("e2.friendlyPos.automatic", "Netedit", TL("If the lane is shorter than the additional, automatically enable friendlyPos"));
383
384
neteditOptions.doRegister("force-saving", new Option_Bool(false));
385
neteditOptions.addDescription("force-saving", "Netedit", TL("If enabled, loaded elements will be saved regardless of whether they have been edited or not (usually used in netedit test)"));
386
387
// network prefixes
388
389
neteditOptions.doRegister("node-prefix", new Option_String("J"));
390
neteditOptions.addDescription("node-prefix", "Netedit", TL("Prefix for node naming"));
391
392
neteditOptions.doRegister("edge-prefix", new Option_String("E"));
393
neteditOptions.addDescription("edge-prefix", "Netedit", TL("Prefix for edge naming"));
394
395
neteditOptions.doRegister("edge-infix", new Option_String(""));
396
neteditOptions.addDescription("edge-infix", "Netedit", TL("Enable edge-infix (<fromNodeID><infix><toNodeID>)"));
397
398
// additional prefixes
399
400
neteditOptions.doRegister("busStop-prefix", new Option_String("bs"));
401
neteditOptions.addDescription("busStop-prefix", "Netedit", TL("Prefix for busStop naming"));
402
403
neteditOptions.doRegister("trainStop-prefix", new Option_String("ts"));
404
neteditOptions.addDescription("trainStop-prefix", "Netedit", TL("Prefix for trainStop naming"));
405
406
neteditOptions.doRegister("containerStop-prefix", new Option_String("ct"));
407
neteditOptions.addDescription("containerStop-prefix", "Netedit", TL("Prefix for containerStop naming"));
408
409
neteditOptions.doRegister("chargingStation-prefix", new Option_String("cs"));
410
neteditOptions.addDescription("chargingStation-prefix", "Netedit", TL("Prefix for chargingStation naming"));
411
412
neteditOptions.doRegister("parkingArea-prefix", new Option_String("pa"));
413
neteditOptions.addDescription("parkingArea-prefix", "Netedit", TL("Prefix for parkingArea naming"));
414
415
neteditOptions.doRegister("e1Detector-prefix", new Option_String("e1"));
416
neteditOptions.addDescription("e1Detector-prefix", "Netedit", TL("Prefix for e1Detector naming"));
417
418
neteditOptions.doRegister("e2Detector-prefix", new Option_String("e2"));
419
neteditOptions.addDescription("e2Detector-prefix", "Netedit", TL("Prefix for e2Detector naming"));
420
421
neteditOptions.doRegister("e3Detector-prefix", new Option_String("e3"));
422
neteditOptions.addDescription("e3Detector-prefix", "Netedit", TL("Prefix for e3Detector naming"));
423
424
neteditOptions.doRegister("e1InstantDetector-prefix", new Option_String("e1i"));
425
neteditOptions.addDescription("e1InstantDetector-prefix", "Netedit", TL("Prefix for e1InstantDetector naming"));
426
427
neteditOptions.doRegister("rerouter-prefix", new Option_String("rr"));
428
neteditOptions.addDescription("rerouter-prefix", "Netedit", TL("Prefix for rerouter naming"));
429
430
neteditOptions.doRegister("calibrator-prefix", new Option_String("ca"));
431
neteditOptions.addDescription("calibrator-prefix", "Netedit", TL("Prefix for calibrator naming"));
432
433
neteditOptions.doRegister("routeProbe-prefix", new Option_String("rp"));
434
neteditOptions.addDescription("routeProbe-prefix", "Netedit", TL("Prefix for routeProbe naming"));
435
436
neteditOptions.doRegister("vss-prefix", new Option_String("vs"));
437
neteditOptions.addDescription("vss-prefix", "Netedit", TL("Prefix for variable speed sign naming"));
438
439
neteditOptions.doRegister("tractionSubstation-prefix", new Option_String("tr"));
440
neteditOptions.addDescription("tractionSubstation-prefix", "Netedit", TL("Prefix for traction substation naming"));
441
442
neteditOptions.doRegister("overheadWire-prefix", new Option_String("ow"));
443
neteditOptions.addDescription("overheadWire-prefix", "Netedit", TL("Prefix for overhead wire naming"));
444
445
neteditOptions.doRegister("polygon-prefix", new Option_String("po"));
446
neteditOptions.addDescription("polygon-prefix", "Netedit", TL("Prefix for polygon naming"));
447
448
neteditOptions.doRegister("poi-prefix", new Option_String("poi"));
449
neteditOptions.addDescription("poi-prefix", "Netedit", TL("Prefix for poi naming"));
450
451
neteditOptions.doRegister("jps.walkableArea-prefix", new Option_String("jps.walkable_area"));
452
neteditOptions.addDescription("jps.walkableArea-prefix", "Netedit", TL("Prefix for jps walkable area naming"));
453
454
neteditOptions.doRegister("jps.obstacle-prefix", new Option_String("jps.obstacle"));
455
neteditOptions.addDescription("jps.obstacle-prefix", "Netedit", TL("Prefix for jps obstacle naming"));
456
457
// demand prefixes
458
459
neteditOptions.doRegister("route-prefix", new Option_String("r"));
460
neteditOptions.addDescription("route-prefix", "Netedit", TL("Prefix for route naming"));
461
462
neteditOptions.doRegister("routeDistribution-prefix", new Option_String("rd"));
463
neteditOptions.addDescription("routeDistribution-prefix", "Netedit", TL("Prefix for route distribution naming"));
464
465
neteditOptions.doRegister("vType-prefix", new Option_String("t"));
466
neteditOptions.addDescription("vType-prefix", "Netedit", TL("Prefix for type naming"));
467
468
neteditOptions.doRegister("vTypeDistribution-prefix", new Option_String("td"));
469
neteditOptions.addDescription("vTypeDistribution-prefix", "Netedit", TL("Prefix for type distribution naming"));
470
471
neteditOptions.doRegister("vehicle-prefix", new Option_String("v"));
472
neteditOptions.addDescription("vehicle-prefix", "Netedit", TL("Prefix for vehicle naming"));
473
474
neteditOptions.doRegister("trip-prefix", new Option_String("t"));
475
neteditOptions.addDescription("trip-prefix", "Netedit", TL("Prefix for trip naming"));
476
477
neteditOptions.doRegister("flow-prefix", new Option_String("f"));
478
neteditOptions.addDescription("flow-prefix", "Netedit", TL("Prefix for flow naming"));
479
480
neteditOptions.doRegister("person-prefix", new Option_String("p"));
481
neteditOptions.addDescription("person-prefix", "Netedit", TL("Prefix for person naming"));
482
483
neteditOptions.doRegister("personflow-prefix", new Option_String("pf"));
484
neteditOptions.addDescription("personflow-prefix", "Netedit", TL("Prefix for personFlow naming"));
485
486
neteditOptions.doRegister("container-prefix", new Option_String("c"));
487
neteditOptions.addDescription("container-prefix", "Netedit", TL("Prefix for container naming"));
488
489
neteditOptions.doRegister("containerflow-prefix", new Option_String("cf"));
490
neteditOptions.addDescription("containerflow-prefix", "Netedit", TL("Prefix for containerFlow naming"));
491
492
// data prefixes
493
494
neteditOptions.doRegister("dataSet-prefix", new Option_String("ds"));
495
neteditOptions.addDescription("dataSet-prefix", "Netedit", TL("Prefix for dataSet naming"));
496
497
// mean data prefixes
498
499
neteditOptions.doRegister("meanDataEdge-prefix", new Option_String("ed"));
500
neteditOptions.addDescription("meanDataEdge-prefix", "Netedit", TL("Prefix for meanDataEdge naming"));
501
502
neteditOptions.doRegister("meanDataLane-prefix", new Option_String("ld"));
503
neteditOptions.addDescription("meanDataLane-prefix", "Netedit", TL("Prefix for meanDataLane naming"));
504
505
// TOPIC: Visualisation
506
507
// textures
508
509
neteditOptions.doRegister("disable-laneIcons", new Option_Bool(false));
510
neteditOptions.addDescription("disable-laneIcons", "Visualisation", TL("Disable icons of special lanes"));
511
512
neteditOptions.doRegister("disable-textures", 'T', new Option_Bool(false)); // !!!
513
neteditOptions.addDescription("disable-textures", "Visualisation", TL("Disable textures"));
514
515
neteditOptions.doRegister("gui-settings-file", 'g', new Option_FileName());
516
neteditOptions.addDescription("gui-settings-file", "Visualisation", TL("Load visualisation settings from FILE"));
517
518
// windows position
519
520
neteditOptions.doRegister("registry-viewport", new Option_Bool(false));
521
neteditOptions.addDescription("registry-viewport", "Visualisation", TL("Load current viewport from registry"));
522
523
neteditOptions.doRegister("window-size", new Option_StringVector());
524
neteditOptions.addDescription("window-size", "Visualisation", TL("Create initial window with the given x,y size"));
525
526
neteditOptions.doRegister("window-pos", new Option_StringVector());
527
neteditOptions.addDescription("window-pos", "Visualisation", TL("Create initial window at the given x,y position"));
528
529
// testing
530
531
neteditOptions.doRegister("gui-testing", new Option_Bool(false));
532
neteditOptions.addDescription("gui-testing", "Visualisation", TL("Enable overlay for screen recognition"));
533
534
neteditOptions.doRegister("gui-testing-debug", new Option_Bool(false));
535
neteditOptions.addDescription("gui-testing-debug", "Visualisation", TL("Enable output messages during GUI-Testing"));
536
537
neteditOptions.doRegister("gui-testing-debug-gl", new Option_Bool(false));
538
neteditOptions.addDescription("gui-testing-debug-gl", "Visualisation", TL("Enable output messages during GUI-Testing specific of gl functions"));
539
540
neteditOptions.doRegister("gui-testing.setting-output", new Option_FileName());
541
neteditOptions.addDescription("gui-testing.setting-output", "Visualisation", TL("Save gui settings in the given settings-output file"));
542
543
// TOPIC: Time
544
545
// register the simulation settings (needed for GNERouteHandler)
546
547
neteditOptions.doRegister("begin", new Option_String("0", "TIME"));
548
neteditOptions.addDescription("begin", "Time", TL("Defines the begin time in seconds; The simulation starts at this time"));
549
550
neteditOptions.doRegister("end", new Option_String("-1", "TIME"));
551
neteditOptions.addDescription("end", "Time", TL("Defines the end time in seconds; The simulation ends at this time"));
552
553
neteditOptions.doRegister("default.action-step-length", new Option_Float(0.0));
554
neteditOptions.addDescription("default.action-step-length", "Processing", TL("Length of the default interval length between action points for the car-following and lane-change models (in seconds). If not specified, the simulation step-length is used per default. Vehicle- or VType-specific settings override the default. Must be a multiple of the simulation step-length."));
555
556
neteditOptions.doRegister("default.speeddev", new Option_Float(-1));
557
neteditOptions.addDescription("default.speeddev", "Processing", TL("Select default speed deviation. A negative value implies vClass specific defaults (0.1 for the default passenger class)"));
558
559
// fill rest of options
560
561
NIFrame::fillOptions(neteditOptions, true);
562
NBFrame::fillOptions(neteditOptions, false);
563
NWFrame::fillOptions(neteditOptions, false);
564
RandHelper::insertRandOptions(neteditOptions);
565
566
// don't edit net and config file
567
neteditOptions.setOptionEditable("sumo-net-file", false);
568
neteditOptions.setOptionEditable("configuration-file", false);
569
}
570
571
572
void
573
GNELoadThread::setDefaultOptions(OptionsCont& neteditOptions) {
574
neteditOptions.resetWritable();
575
neteditOptions.set("offset.disable-normalization", "true"); // preserve the given network as far as possible
576
neteditOptions.set("no-turnarounds", "true"); // otherwise it is impossible to manually removed turn-arounds
577
}
578
579
580
bool
581
GNELoadThread::loadConsoleOptions() {
582
// only loaded once
583
if (myApplicationWindow->consoleOptionsLoaded()) {
584
// get netedit options
585
auto& neteditOptions = OptionsCont::getOptions();
586
// fill (reset) all options
587
fillOptions(neteditOptions);
588
// set default options defined in GNELoadThread::setDefaultOptions(...)
589
setDefaultOptions(neteditOptions);
590
try {
591
// set all values writable, because certain attributes already setted can be updated through console
592
OptionsCont::getOptions().resetWritable();
593
// load options from console
594
OptionsIO::getOptions();
595
return true;
596
} catch (ProcessError& e) {
597
if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
598
WRITE_ERROR(e.what());
599
}
600
WRITE_ERROR(TL("Failed to reset options."));
601
return false;
602
}
603
} else {
604
return false;
605
}
606
}
607
608
609
void
610
GNELoadThread::newNetwork() {
611
auto& neteditOptions = OptionsCont::getOptions();
612
// reset netedit options
613
fillOptions(neteditOptions);
614
setDefaultOptions(neteditOptions);
615
// enable option "new"
616
neteditOptions.resetWritable();
617
neteditOptions.set("new", "true");
618
// start thread
619
start();
620
}
621
622
623
void
624
GNELoadThread::loadNetworkOrConfig() {
625
// start thread
626
start();
627
}
628
629
630
void
631
GNELoadThread::retrieveMessage(const MsgHandler::MsgType type, const std::string& msg) {
632
myEventQueue.push_back(new GUIEvent_Message(type, msg));
633
myEventThrow.signal();
634
}
635
636
/****************************************************************************/
637
638