Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netconvert_main.cpp
169649 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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 netconvert_main.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date Tue, 20 Nov 2001
19
///
20
// Main for NETCONVERT
21
/****************************************************************************/
22
#include <config.h>
23
24
#ifdef HAVE_VERSION_H
25
#include <version.h>
26
#endif
27
28
#include <iostream>
29
#include <string>
30
#include <netimport/NIFrame.h>
31
#include <netimport/NILoader.h>
32
#include <netbuild/NBFrame.h>
33
#include <netbuild/NBNetBuilder.h>
34
#include <netwrite/NWFrame.h>
35
#include <utils/options/OptionsIO.h>
36
#include <utils/options/OptionsCont.h>
37
#include <utils/common/UtilExceptions.h>
38
#include <utils/common/RandHelper.h>
39
#include <utils/common/SystemFrame.h>
40
#include <utils/common/MsgHandler.h>
41
#include <utils/distribution/DistributionCont.h>
42
#include <utils/xml/XMLSubSys.h>
43
#include <utils/iodevices/OutputDevice.h>
44
#include <utils/geom/GeoConvHelper.h>
45
46
47
// ===========================================================================
48
// method definitions
49
// ===========================================================================
50
void
51
fillOptions() {
52
OptionsCont& oc = OptionsCont::getOptions();
53
oc.addCallExample("-c <CONFIGURATION>", "generate net with options read from file");
54
oc.addCallExample("-n ./nodes.xml -e ./edges.xml -v -t ./owntypes.xml",
55
"generate net with given nodes, edges, and edge types doing verbose output");
56
57
// insert options sub-topics
58
SystemFrame::addConfigurationOptions(oc); // this subtopic is filled here, too
59
oc.addOptionSubTopic("Input");
60
oc.addOptionSubTopic("Output");
61
GeoConvHelper::addProjectionOptions(oc);
62
oc.addOptionSubTopic("Processing");
63
oc.addOptionSubTopic("Building Defaults");
64
oc.addOptionSubTopic("TLS Building");
65
oc.addOptionSubTopic("Ramp Guessing");
66
oc.addOptionSubTopic("Edge Removal");
67
oc.addOptionSubTopic("Unregulated Nodes");
68
oc.addOptionSubTopic("Junctions");
69
oc.addOptionSubTopic("Pedestrian");
70
oc.addOptionSubTopic("Bicycle");
71
oc.addOptionSubTopic("Railway");
72
oc.addOptionSubTopic("Formats");
73
74
NIFrame::fillOptions(oc);
75
NBFrame::fillOptions(oc, false);
76
NWFrame::fillOptions(oc, false);
77
RandHelper::insertRandOptions(oc);
78
}
79
80
81
bool
82
checkOptions() {
83
OptionsCont& oc = OptionsCont::getOptions();
84
bool ok = NIFrame::checkOptions(oc);
85
ok &= NBFrame::checkOptions(oc);
86
ok &= NWFrame::checkOptions(oc);
87
ok &= SystemFrame::checkOptions(oc);
88
return ok;
89
}
90
91
92
/* -------------------------------------------------------------------------
93
* main
94
* ----------------------------------------------------------------------- */
95
int
96
main(int argc, char** argv) {
97
OptionsCont& oc = OptionsCont::getOptions();
98
oc.setApplicationDescription(TL("Network importer / builder for the microscopic, multi-modal traffic simulation SUMO."));
99
oc.setApplicationName("netconvert", "Eclipse SUMO netconvert " VERSION_STRING);
100
int ret = 0;
101
try {
102
XMLSubSys::init();
103
fillOptions();
104
OptionsIO::setArgs(argc, argv);
105
OptionsIO::getOptions();
106
if (oc.processMetaOptions(argc < 2)) {
107
SystemFrame::close();
108
return 0;
109
}
110
if (oc.isSet("edge-files") && !oc.isSet("type-files") && oc.isDefault("ignore-errors.edge-type")) {
111
oc.setDefault("ignore-errors.edge-type", "true");
112
}
113
XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"), "never");
114
if (oc.isDefault("aggregate-warnings")) {
115
oc.setDefault("aggregate-warnings", "5");
116
}
117
MsgHandler::initOutputOptions();
118
if (!checkOptions()) {
119
throw ProcessError();
120
}
121
RandHelper::initRandGlobal();
122
// build the projection
123
if (!GeoConvHelper::init(oc)) {
124
throw ProcessError(TL("Could not build projection!"));
125
}
126
NBNetBuilder nb;
127
nb.applyOptions(oc);
128
// load data
129
NILoader nl(nb);
130
nl.load(oc);
131
// flush aggregated errors and optionally ignore them
132
MsgHandler::getErrorInstance()->clear(oc.getBool("ignore-errors"));
133
// check whether any errors occurred
134
if (MsgHandler::getErrorInstance()->wasInformed()) {
135
throw ProcessError();
136
}
137
nb.compute(oc);
138
// check whether any errors occurred
139
if (MsgHandler::getErrorInstance()->wasInformed()) {
140
throw ProcessError();
141
}
142
// report
143
nb.getNodeCont().printBuiltNodesStatistics();
144
NWFrame::writeNetwork(oc, nb);
145
} catch (const ProcessError& e) {
146
MsgHandler::getWarningInstance()->clear(false);
147
MsgHandler::getErrorInstance()->clear(false);
148
if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
149
WRITE_ERROR(e.what());
150
}
151
MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
152
ret = 1;
153
#ifndef _DEBUG
154
} catch (const std::exception& e) {
155
MsgHandler::getWarningInstance()->clear(false);
156
MsgHandler::getErrorInstance()->clear(false);
157
if (std::string(e.what()) != std::string("")) {
158
WRITE_ERROR(e.what());
159
}
160
MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
161
ret = 1;
162
} catch (...) {
163
MsgHandler::getWarningInstance()->clear(false);
164
MsgHandler::getErrorInstance()->clear(false);
165
MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false);
166
ret = 1;
167
#endif
168
}
169
DistributionCont::clear();
170
SystemFrame::close();
171
// report about ending
172
if (ret == 0) {
173
std::cout << "Success." << std::endl;
174
}
175
return ret;
176
}
177
178
179
/****************************************************************************/
180
181