Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2001-2024 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 2258 : fillOptions() { 52 2258 : OptionsCont& oc = OptionsCont::getOptions(); 53 4516 : oc.addCallExample("-c <CONFIGURATION>", "generate net with options read from file"); 54 4516 : 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 2258 : SystemFrame::addConfigurationOptions(oc); // this subtopic is filled here, too 59 2258 : oc.addOptionSubTopic("Input"); 60 2258 : oc.addOptionSubTopic("Output"); 61 2258 : GeoConvHelper::addProjectionOptions(oc); 62 2258 : oc.addOptionSubTopic("Processing"); 63 2258 : oc.addOptionSubTopic("Building Defaults"); 64 2258 : oc.addOptionSubTopic("TLS Building"); 65 2258 : oc.addOptionSubTopic("Ramp Guessing"); 66 2258 : oc.addOptionSubTopic("Edge Removal"); 67 2258 : oc.addOptionSubTopic("Unregulated Nodes"); 68 2258 : oc.addOptionSubTopic("Junctions"); 69 2258 : oc.addOptionSubTopic("Pedestrian"); 70 2258 : oc.addOptionSubTopic("Bicycle"); 71 2258 : oc.addOptionSubTopic("Railway"); 72 2258 : oc.addOptionSubTopic("Formats"); 73 : 74 2258 : NIFrame::fillOptions(oc); 75 2258 : NBFrame::fillOptions(oc, false); 76 2258 : NWFrame::fillOptions(oc, false); 77 2258 : RandHelper::insertRandOptions(oc); 78 2258 : } 79 : 80 : 81 : bool 82 2237 : checkOptions() { 83 2237 : OptionsCont& oc = OptionsCont::getOptions(); 84 2237 : bool ok = NIFrame::checkOptions(oc); 85 2237 : ok &= NBFrame::checkOptions(oc); 86 2237 : ok &= NWFrame::checkOptions(oc); 87 2237 : ok &= SystemFrame::checkOptions(oc); 88 2237 : return ok; 89 : } 90 : 91 : 92 : /* ------------------------------------------------------------------------- 93 : * main 94 : * ----------------------------------------------------------------------- */ 95 : int 96 2258 : main(int argc, char** argv) { 97 2258 : OptionsCont& oc = OptionsCont::getOptions(); 98 2258 : oc.setApplicationDescription(TL("Network importer / builder for the microscopic, multi-modal traffic simulation SUMO.")); 99 4516 : oc.setApplicationName("netconvert", "Eclipse SUMO netconvert Version " VERSION_STRING); 100 : int ret = 0; 101 : try { 102 2258 : XMLSubSys::init(); 103 2258 : fillOptions(); 104 2258 : OptionsIO::setArgs(argc, argv); 105 2258 : OptionsIO::getOptions(); 106 2257 : if (oc.processMetaOptions(argc < 2)) { 107 20 : SystemFrame::close(); 108 20 : return 0; 109 : } 110 4416 : if (oc.isSet("edge-files") && !oc.isSet("type-files") && oc.isDefault("ignore-errors.edge-type")) { 111 1900 : oc.setDefault("ignore-errors.edge-type", "true"); 112 : } 113 6711 : XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"), "never"); 114 4474 : if (oc.isDefault("aggregate-warnings")) { 115 4424 : oc.setDefault("aggregate-warnings", "5"); 116 : } 117 2237 : MsgHandler::initOutputOptions(); 118 2237 : if (!checkOptions()) { 119 3 : throw ProcessError(); 120 : } 121 2234 : RandHelper::initRandGlobal(); 122 : // build the projection 123 2234 : if (!GeoConvHelper::init(oc)) { 124 0 : throw ProcessError(TL("Could not build projection!")); 125 : } 126 2234 : NBNetBuilder nb; 127 2234 : nb.applyOptions(oc); 128 : // load data 129 2224 : NILoader nl(nb); 130 2224 : nl.load(oc); 131 : // flush aggregated errors and optionally ignore them 132 1990 : MsgHandler::getErrorInstance()->clear(oc.getBool("ignore-errors")); 133 : // check whether any errors occurred 134 1990 : if (MsgHandler::getErrorInstance()->wasInformed()) { 135 244 : throw ProcessError(); 136 : } 137 1746 : nb.compute(oc); 138 : // check whether any errors occurred 139 1744 : if (MsgHandler::getErrorInstance()->wasInformed()) { 140 2 : throw ProcessError(); 141 : } 142 : // report 143 1742 : nb.getNodeCont().printBuiltNodesStatistics(); 144 1742 : NWFrame::writeNetwork(oc, nb); 145 3216 : } catch (const ProcessError& e) { 146 498 : MsgHandler::getWarningInstance()->clear(false); 147 498 : MsgHandler::getErrorInstance()->clear(false); 148 1077 : if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) { 149 386 : WRITE_ERROR(e.what()); 150 : } 151 498 : MsgHandler::getErrorInstance()->inform("Quitting (on error).", false); 152 : ret = 1; 153 : #ifndef _DEBUG 154 498 : } catch (const std::exception& e) { 155 0 : MsgHandler::getWarningInstance()->clear(false); 156 0 : MsgHandler::getErrorInstance()->clear(false); 157 0 : if (std::string(e.what()) != std::string("")) { 158 0 : WRITE_ERROR(e.what()); 159 : } 160 0 : MsgHandler::getErrorInstance()->inform("Quitting (on error).", false); 161 : ret = 1; 162 0 : } catch (...) { 163 0 : MsgHandler::getWarningInstance()->clear(false); 164 0 : MsgHandler::getErrorInstance()->clear(false); 165 0 : MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false); 166 : ret = 1; 167 : #endif 168 0 : } 169 2238 : DistributionCont::clear(); 170 2238 : SystemFrame::close(); 171 : // report about ending 172 2238 : if (ret == 0) { 173 : std::cout << "Success." << std::endl; 174 : } 175 : return ret; 176 : } 177 : 178 : 179 : /****************************************************************************/