LCOV - code coverage report
Current view: top level - src - netconvert_main.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 87.2 % 86 75
Test Date: 2025-11-13 15:38:19 Functions: 100.0 % 3 3

            Line data    Source code
       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         2033 : fillOptions() {
      52         2033 :     OptionsCont& oc = OptionsCont::getOptions();
      53         4066 :     oc.addCallExample("-c <CONFIGURATION>", TL("generate net with options read from file"));
      54         4066 :     oc.addCallExample("-n ./nodes.xml -e ./edges.xml -v -t ./owntypes.xml",
      55         2033 :                       TL("generate net with given nodes, edges, and edge types doing verbose output"));
      56              : 
      57              :     // insert options sub-topics
      58         2033 :     SystemFrame::addConfigurationOptions(oc); // this subtopic is filled here, too
      59         2033 :     oc.addOptionSubTopic("Input");
      60         2033 :     oc.addOptionSubTopic("Output");
      61         2033 :     GeoConvHelper::addProjectionOptions(oc);
      62         2033 :     oc.addOptionSubTopic("Processing");
      63         2033 :     oc.addOptionSubTopic("Building Defaults");
      64         2033 :     oc.addOptionSubTopic("TLS Building");
      65         2033 :     oc.addOptionSubTopic("Ramp Guessing");
      66         2033 :     oc.addOptionSubTopic("Edge Removal");
      67         2033 :     oc.addOptionSubTopic("Unregulated Nodes");
      68         2033 :     oc.addOptionSubTopic("Junctions");
      69         2033 :     oc.addOptionSubTopic("Pedestrian");
      70         2033 :     oc.addOptionSubTopic("Bicycle");
      71         2033 :     oc.addOptionSubTopic("Railway");
      72         2033 :     oc.addOptionSubTopic("Formats");
      73              : 
      74         2033 :     NIFrame::fillOptions(oc);
      75         2033 :     NBFrame::fillOptions(oc, false);
      76         2033 :     NWFrame::fillOptions(oc, false);
      77         2033 :     RandHelper::insertRandOptions(oc);
      78         2033 : }
      79              : 
      80              : 
      81              : bool
      82         2017 : checkOptions() {
      83         2017 :     OptionsCont& oc = OptionsCont::getOptions();
      84         2017 :     bool ok = NIFrame::checkOptions(oc);
      85         2017 :     ok &= NBFrame::checkOptions(oc);
      86         2017 :     ok &= NWFrame::checkOptions(oc);
      87         2017 :     ok &= SystemFrame::checkOptions(oc);
      88         2017 :     return ok;
      89              : }
      90              : 
      91              : 
      92              : /* -------------------------------------------------------------------------
      93              :  * main
      94              :  * ----------------------------------------------------------------------- */
      95              : int
      96         2033 : main(int argc, char** argv) {
      97         2033 :     OptionsCont& oc = OptionsCont::getOptions();
      98         2033 :     oc.setApplicationDescription(TL("Network importer / builder for the microscopic, multi-modal traffic simulation SUMO."));
      99         4066 :     oc.setApplicationName("netconvert", "Eclipse SUMO netconvert " VERSION_STRING);
     100              :     int ret = 0;
     101              :     try {
     102         2033 :         XMLSubSys::init();
     103         2033 :         fillOptions();
     104         2033 :         OptionsIO::setArgs(argc, argv);
     105         2033 :         OptionsIO::getOptions();
     106         2032 :         if (oc.processMetaOptions(argc < 2)) {
     107           15 :             SystemFrame::close();
     108           15 :             return 0;
     109              :         }
     110         4191 :         if (oc.isSet("edge-files") && !oc.isSet("type-files") && oc.isDefault("ignore-errors.edge-type")) {
     111         1974 :             oc.setDefault("ignore-errors.edge-type", "true");
     112              :         }
     113         6051 :         XMLSubSys::setValidation(oc.getString("xml-validation"), oc.getString("xml-validation.net"), "never");
     114         4034 :         if (oc.isDefault("aggregate-warnings")) {
     115         3956 :             oc.setDefault("aggregate-warnings", "5");
     116              :         }
     117         2017 :         MsgHandler::initOutputOptions();
     118         2017 :         if (!checkOptions()) {
     119            4 :             throw ProcessError();
     120              :         }
     121         2013 :         RandHelper::initRandGlobal();
     122              :         // build the projection
     123         2013 :         if (!GeoConvHelper::init(oc)) {
     124            0 :             throw ProcessError(TL("Could not build projection!"));
     125              :         }
     126         2013 :         NBNetBuilder nb;
     127         2013 :         nb.applyOptions(oc);
     128              :         // load data
     129         2003 :         NILoader nl(nb);
     130         2003 :         nl.load(oc);
     131              :         // flush aggregated errors and optionally ignore them
     132         1848 :         MsgHandler::getErrorInstance()->clear(oc.getBool("ignore-errors"));
     133              :         // check whether any errors occurred
     134         1848 :         if (MsgHandler::getErrorInstance()->wasInformed()) {
     135          123 :             throw ProcessError();
     136              :         }
     137         1725 :         nb.compute(oc);
     138              :         // check whether any errors occurred
     139         1724 :         if (MsgHandler::getErrorInstance()->wasInformed()) {
     140            2 :             throw ProcessError();
     141              :         }
     142              :         // report
     143         1722 :         nb.getNodeCont().printBuiltNodesStatistics();
     144         1722 :         NWFrame::writeNetwork(oc, nb);
     145         2594 :     } catch (const ProcessError& e) {
     146          298 :         MsgHandler::getWarningInstance()->clear(false);
     147          298 :         MsgHandler::getErrorInstance()->clear(false);
     148          524 :         if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
     149          226 :             WRITE_ERROR(e.what());
     150              :         }
     151          298 :         MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
     152              :         ret = 1;
     153              : #ifndef _DEBUG
     154          298 :     } 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         2018 :     DistributionCont::clear();
     170         2018 :     SystemFrame::close();
     171              :     // report about ending
     172         2018 :     if (ret == 0) {
     173              :         std::cout << "Success." << std::endl;
     174              :     }
     175              :     return ret;
     176              : }
     177              : 
     178              : 
     179              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1