netgen_main.cpp File Reference


Detailed Description

Author:
Markus Hartinger
Date:
Mar, 2003
Version:
Id
netgen_main.cpp 8386 2010-03-05 22:29:33Z behrisch

Definition in file netgen_main.cpp.

#include <config.h>
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <netbuild/NBNetBuilder.h>
#include <netgen/NGNet.h>
#include <netgen/NGRandomNetBuilder.h>
#include <netbuild/NBTypeCont.h>
#include <utils/options/OptionsCont.h>
#include <utils/options/OptionsIO.h>
#include <utils/options/Option.h>
#include <utils/common/MsgHandler.h>
#include <utils/common/SystemFrame.h>
#include <utils/common/UtilExceptions.h>
#include <utils/common/RandHelper.h>
#include <utils/common/ToString.h>
#include <utils/geom/GeoConvHelper.h>
#include <utils/xml/XMLSubSys.h>
#include <utils/iodevices/OutputDevice.h>

Go to the source code of this file.

Functions

NGNetbuildNetwork (NBNetBuilder &nb)
bool checkOptions ()
void fillOptions ()
int main (int argc, char **argv)


Function Documentation

NGNet* buildNetwork ( NBNetBuilder nb  ) 

Definition at line 254 of file netgen_main.cpp.

References TNeighbourDistribution::add(), NGNet::createChequerBoard(), NGNet::createSpiderWeb(), OptionsCont::getBool(), MsgHandler::getErrorInstance(), OptionsCont::getFloat(), OptionsCont::getInt(), OptionsCont::getOptions(), MsgHandler::inform(), OptionsCont::isDefault(), and SUMOReal.

Referenced by main().

00254                                {
00255     OptionsCont &oc = OptionsCont::getOptions();
00256     // spider-net
00257     if (oc.getBool("spider-net")) {
00258         // check values
00259         bool hadError = false;
00260         if (oc.getInt("arms") < 3) {
00261             MsgHandler::getErrorInstance()->inform("Spider networks need at least 3 arms.");
00262             hadError = true;
00263         }
00264         if (oc.getInt("circles") < 1) {
00265             MsgHandler::getErrorInstance()->inform("Spider networks need at least one circle.");
00266             hadError = true;
00267         }
00268         if (oc.getFloat("radius") < 10) {
00269             MsgHandler::getErrorInstance()->inform("The radius of spider networks must be at least 10m.");
00270             hadError = true;
00271         }
00272         if (hadError) {
00273             throw ProcessError();
00274         }
00275         // build if everything's ok
00276         NGNet *net = new NGNet(nb);
00277         net->createSpiderWeb(
00278             oc.getInt("arms"),
00279             oc.getInt("circles"),
00280             oc.getFloat("radius"),
00281             !oc.getBool("nocenter"));
00282         return net;
00283     }
00284     // grid-net
00285     if (oc.getBool("grid-net")) {
00286         // get options
00287         int xNo = oc.getInt("x-no");
00288         int yNo = oc.getInt("y-no");
00289         SUMOReal xLength = oc.getFloat("x-length");
00290         SUMOReal yLength = oc.getFloat("y-length");
00291         SUMOReal attachLength = oc.getFloat("attach-length");
00292         if (oc.isDefault("x-no")&&!oc.isDefault("number")) {
00293             xNo = oc.getInt("number");
00294         }
00295         if (oc.isDefault("y-no")&&!oc.isDefault("number")) {
00296             yNo = oc.getInt("number");
00297         }
00298         if (oc.isDefault("x-length")&&!oc.isDefault("length")) {
00299             xLength = oc.getFloat("length");
00300         }
00301         if (oc.isDefault("y-length")&&!oc.isDefault("length")) {
00302             yLength = oc.getFloat("length");
00303         }
00304         // check values
00305         bool hadError = false;
00306         if (xNo<2 || yNo<2) {
00307             MsgHandler::getErrorInstance()->inform("The number of nodes must be at least 2 in both directions.");
00308             hadError = true;
00309         }
00310         if (xLength<10. || yLength<10.) {
00311             MsgHandler::getErrorInstance()->inform("The distance between nodes must be at least 10m in both directions.");
00312             hadError = true;
00313         }
00314         if (attachLength != 0.0 && attachLength<10.) {
00315             MsgHandler::getErrorInstance()->inform("The length of attached streets must be at least 10m.");
00316             hadError = true;
00317         }
00318         if (hadError) {
00319             throw ProcessError();
00320         }
00321         // build if everything's ok
00322         NGNet *net = new NGNet(nb);
00323         net->createChequerBoard(xNo, yNo, xLength, yLength, attachLength);
00324         return net;
00325     }
00326     // random net
00327     TNeighbourDistribution neighborDist;
00328     neighborDist.add(1, oc.getFloat("dist1"));
00329     neighborDist.add(2, oc.getFloat("dist2"));
00330     neighborDist.add(3, oc.getFloat("dist3"));
00331     neighborDist.add(4, oc.getFloat("dist4"));
00332     neighborDist.add(5, oc.getFloat("dist5"));
00333     neighborDist.add(6, oc.getFloat("dist6"));
00334     NGNet *net = new NGNet(nb);
00335     NGRandomNetBuilder randomNet(*net,
00336                                  oc.getFloat("min-angle"),
00337                                  oc.getFloat("rand-min-distance"),
00338                                  oc.getFloat("rand-max-distance"),
00339                                  oc.getFloat("connectivity"),
00340                                  oc.getInt("num-tries"),
00341                                  neighborDist);
00342     randomNet.createNet(oc.getInt("iterations"));
00343     return net;
00344 }

bool checkOptions (  ) 

Definition at line 63 of file netgen_main.cpp.

References OptionsCont::getBool(), MsgHandler::getErrorInstance(), OptionsCont::getOptions(), OptionsCont::getString(), MsgHandler::inform(), and OptionsCont::isSet().

Referenced by main().

00063                {
00064     OptionsCont &oc = OptionsCont::getOptions();
00065     // check whether exactly one type of a network to build was wished
00066     int no = 0;
00067     if (oc.getBool("spider-net")) {
00068         no++;
00069     }
00070     if (oc.getBool("grid-net")) {
00071         no++;
00072     }
00073     if (oc.getBool("random-net")) no++;
00074     if (no==0) {
00075         MsgHandler::getErrorInstance()->inform("You have to specify the type of network to generate.");
00076         return false;
00077     }
00078     if (no>1) {
00079         MsgHandler::getErrorInstance()->inform("You may specify only one type of network to generate at once.");
00080         return false;
00081     }
00082     // check whether the junction type to use is properly set
00083     if (oc.isSet("default-junction-type")) {
00084         std::string type = oc.getString("default-junction-type");
00085         if (type!="traffic_light"&&type!="priority"&&type!="right_before_left") {
00086             MsgHandler::getErrorInstance()->inform("Only the following junction types are known: traffic_light, priority, right_before_left");
00087             return false;
00088         }
00089     }
00090     // check whether the output is valid and can be build
00091     if (!oc.isSet("output-file")) {
00092         MsgHandler::getErrorInstance()->inform("No output specified.");
00093         return false;
00094     }
00095     //
00096     return true;
00097 }

void fillOptions (  ) 

build and retrieve the options (settings)

Definition at line 102 of file netgen_main.cpp.

References OptionsCont::addCallExample(), SystemFrame::addConfigurationOptions(), OptionsCont::addDescription(), OptionsCont::addOptionSubTopic(), SystemFrame::addReportOptions(), OptionsCont::addSynonyme(), OptionsCont::doRegister(), OptionsCont::getOptions(), NBNetBuilder::insertNetBuildOptions(), RandHelper::insertRandOptions(), PI, OptionsCont::setAdditionalHelpMessage(), and SUMOReal.

00102               {
00103     OptionsCont &oc = OptionsCont::getOptions();
00104     oc.addCallExample("-c <CONFIGURATION>");
00105     oc.addCallExample("--grid-net [grid-network options] -o <OUTPUTFILE>");
00106     oc.addCallExample("--spider-net [spider-network opts] -o <OUTPUTFILE>");
00107     oc.addCallExample("--random-net [random-network opts] -o <OUTPUTFILE>");
00108 
00109     oc.setAdditionalHelpMessage(" Either \"--grid-net\", \"--spider-net\" or \"--random-net\" must be \n  supplied. In dependance to these switches other options are used.");
00110 
00111     // insert options sub-topics
00112     SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
00113     oc.addOptionSubTopic("Grid Network");
00114     oc.addOptionSubTopic("Spider Network");
00115     oc.addOptionSubTopic("Random Network");
00116     oc.addOptionSubTopic("Output");
00117     oc.addOptionSubTopic("TLS Building");
00118     oc.addOptionSubTopic("Ramp Guessing");
00119     oc.addOptionSubTopic("Edge Removal");
00120     oc.addOptionSubTopic("Unregulated Nodes");
00121     oc.addOptionSubTopic("Processing");
00122     oc.addOptionSubTopic("Building Defaults");
00123     SystemFrame::addReportOptions(oc); // fill this subtopic, too
00124 
00125 
00126     // register the options
00127     // register grid-net options
00128     oc.doRegister("grid-net", 'g', new Option_Bool(false));
00129     oc.addSynonyme("grid-net", "grid");
00130     oc.addDescription("grid-net", "Grid Network", "Forces NETGEN to build a grid-like network");
00131 
00132     oc.doRegister("grid-number", new Option_Integer(5));
00133     oc.addSynonyme("grid-number", "number");
00134     oc.addDescription("grid-number", "Grid Network", "The number of junctions in both dirs");
00135 
00136     oc.doRegister("grid-length", new Option_Float(100));
00137     oc.addSynonyme("grid-length", "length");
00138     oc.addDescription("grid-length", "Grid Network", "The length of streets in both dirs");
00139 
00140     oc.doRegister("grid-x-number", new Option_Integer(5));
00141     oc.addSynonyme("grid-x-number", "x-no");
00142     oc.addDescription("grid-x-number", "Grid Network", "The number of junctions in x-dir; Overrides --grid-number");
00143 
00144     oc.doRegister("grid-y-number", new Option_Integer(5));
00145     oc.addSynonyme("grid-y-number", "y-no");
00146     oc.addDescription("grid-y-number", "Grid Network", "The number of junctions in y-dir; Overrides --grid-number");
00147 
00148     oc.doRegister("grid-x-length", new Option_Float(100));
00149     oc.addSynonyme("grid-x-length", "x-length");
00150     oc.addDescription("grid-x-length", "Grid Network", "The length of horizontal streets; Overrides --grid-length");
00151 
00152     oc.doRegister("grid-y-length", new Option_Float(100));
00153     oc.addSynonyme("grid-y-length", "y-length");
00154     oc.addDescription("grid-y-length", "Grid Network", "The length of vertical streets; Overrides --grid-length");
00155 
00156     oc.doRegister("attach-length", new Option_Float(0));
00157     oc.addDescription("attach-length", "Grid Network", "The length of streets attached at the boundary; 0 means no streets are attached");
00158 
00159 
00160     // register spider-net options
00161     oc.doRegister("spider-net", 's', new Option_Bool(false));
00162     oc.addSynonyme("spider-net", "spider");
00163     oc.addDescription("spider-net", "Spider Network", "Forces NETGEN to build a spider-net-like network");
00164 
00165     oc.doRegister("spider-arm-number", new Option_Integer(13));
00166     oc.addSynonyme("spider-arm-number", "arms");
00167     oc.addDescription("spider-arm-number", "Spider Network", "The number of axes within the net");
00168 
00169     oc.doRegister("spider-circle-number", new Option_Integer(20));
00170     oc.addSynonyme("spider-circle-number", "circles");
00171     oc.addDescription("spider-circle-number", "Spider Network", "The number of circles of the net");
00172 
00173     oc.doRegister("spider-space-rad", new Option_Float(100));
00174     oc.addSynonyme("spider-space-rad", "radius");
00175     oc.addDescription("spider-space-rad", "Spider Network", "The distances between the circles");
00176 
00177     oc.doRegister("spider-omit-center", new Option_Bool(false));
00178     oc.addSynonyme("spider-omit-center", "nocenter");
00179     oc.addDescription("spider-omit-center", "Spider Network", "Omit the central node of the network");
00180 
00181 
00182     // register random-net options
00183     oc.doRegister("random-net", 'r', new Option_Bool(false));
00184     oc.addSynonyme("random-net", "random");
00185     oc.addDescription("random-net", "Random Network", "Forces NETGEN to build a random network");
00186 
00187     oc.doRegister("rand-iterations", new Option_Integer(2000));
00188     oc.addSynonyme("rand-iterations", "iterations");
00189     oc.addDescription("rand-iterations", "Random Network", "Describes how many times an edge shall be added to the net");
00190 
00191     oc.doRegister("rand-bidi-probability", new Option_Float(1));
00192     oc.addSynonyme("rand-bidi-probability", "bidi");
00193     oc.addDescription("rand-bidi-probability", "Random Network", "Defines the probability to build a reverse edge");
00194 
00195     oc.doRegister("rand-max-distance", new Option_Float(250));
00196     oc.addSynonyme("rand-max-distance", "max-dist");
00197     oc.addDescription("rand-max-distance", "Random Network", "");
00198 
00199     oc.doRegister("rand-min-distance", new Option_Float(100));
00200     oc.addSynonyme("rand-min-distance", "min-dist");
00201     oc.addDescription("rand-min-distance", "Random Network", "");
00202 
00203     oc.doRegister("rand-min-angle", new Option_Float((SUMOReal)(45.0/180.0*PI)));
00204     oc.addSynonyme("rand-min-angle", "min-angle");
00205     oc.addDescription("rand-min-angle", "Random Network", "");
00206 
00207     oc.doRegister("rand-num-tries", new Option_Integer(50));
00208     oc.addSynonyme("rand-num-tries", "num-tries");
00209     oc.addDescription("rand-num-tries", "Random Network", "");
00210 
00211     oc.doRegister("rand-connectivity", new Option_Float((SUMOReal) 0.95));
00212     oc.addSynonyme("rand-connectivity", "connectivity");
00213     oc.addDescription("rand-connectivity", "Random Network", "");
00214 
00215     oc.doRegister("rand-neighbor-dist1", new Option_Float(0));
00216     oc.addSynonyme("rand-neighbor-dist1", "dist1");
00217     oc.addDescription("rand-neighbor-dist1", "Random Network", "");
00218 
00219     oc.doRegister("rand-neighbor-dist2", new Option_Float(0));
00220     oc.addSynonyme("rand-neighbor-dist2", "dist2");
00221     oc.addDescription("rand-neighbor-dist2", "Random Network", "");
00222 
00223     oc.doRegister("rand-neighbor-dist3", new Option_Float(10));
00224     oc.addSynonyme("rand-neighbor-dist3", "dist3");
00225     oc.addDescription("rand-neighbor-dist3", "Random Network", "");
00226 
00227     oc.doRegister("rand-neighbor-dist4", new Option_Float(10));
00228     oc.addSynonyme("rand-neighbor-dist4", "dist4");
00229     oc.addDescription("rand-neighbor-dist4", "Random Network", "");
00230 
00231     oc.doRegister("rand-neighbor-dist5", new Option_Float(2));
00232     oc.addSynonyme("rand-neighbor-dist5", "dist5");
00233     oc.addDescription("rand-neighbor-dist5", "Random Network", "");
00234 
00235     oc.doRegister("rand-neighbor-dist6", new Option_Float(1));
00236     oc.addSynonyme("rand-neighbor-dist6", "dist6");
00237     oc.addDescription("rand-neighbor-dist6", "Random Network", "");
00238 
00239 
00240     // add netbuilding options
00241     NBNetBuilder::insertNetBuildOptions(oc);
00242     // register building options
00243     oc.doRegister("default-junction-type", 'j', new Option_String());
00244     oc.addSynonyme("default-junction-type", "junctions");
00245     oc.addDescription("default-junction-type", "Building Defaults", "[traffic_light|priority|right_before_left] Determines the type of the build junctions");
00246 
00247 
00248     // add rand options
00249     RandHelper::insertRandOptions();
00250 }

int main ( int  argc,
char **  argv 
)

Definition at line 349 of file netgen_main.cpp.

References NBNetBuilder::applyOptions(), NBNetBuilder::buildLoaded(), buildNetwork(), checkOptions(), SystemFrame::close(), OutputDevice::closeAll(), fillOptions(), NBNetBuilder::getEdgeCont(), MsgHandler::getErrorInstance(), NBNetBuilder::getNodeCont(), OptionsIO::getOptions(), OptionsCont::getOptions(), MsgHandler::inform(), XMLSubSys::init(), MsgHandler::initOutputOptions(), RandHelper::initRandGlobal(), OptionsCont::processMetaOptions(), OptionsCont::resetWritable(), OptionsCont::setApplicationDescription(), OptionsCont::setApplicationName(), NBEdgeCont::size(), NBNodeCont::size(), NGNet::toNB(), and WRITE_MESSAGE.

00349                             {
00350     OptionsCont &oc = OptionsCont::getOptions();
00351     // give some application descriptions
00352     oc.setApplicationDescription("Road network generator for the microscopic road traffic simulation SUMO.");
00353     oc.setApplicationName("netgen", "SUMO netgen Version " + (std::string)VERSION_STRING);
00354     int ret = 0;
00355     try {
00356         // initialise the application system (messaging, xml, options)
00357         XMLSubSys::init(false);
00358         fillOptions();
00359         OptionsIO::getOptions(true, argc, argv);
00360         if (oc.processMetaOptions(argc < 2)) {
00361             SystemFrame::close();
00362             return 0;
00363         }
00364         MsgHandler::initOutputOptions();
00365         if (!checkOptions()) throw ProcessError();
00366         RandHelper::initRandGlobal();
00367         NBNetBuilder nb;
00368         nb.applyOptions(oc);
00369         // build the netgen-network description
00370         NGNet *net = buildNetwork(nb);
00371         // ... and we have to do this...
00372         oc.resetWritable();
00373         // transfer to the netbuilding structures
00374         net->toNB();
00375         delete net;
00376         // report generated structures
00377         WRITE_MESSAGE(" Generation done;");
00378         WRITE_MESSAGE("   " + toString<int>(nb.getNodeCont().size()) + " nodes generated.");
00379         WRITE_MESSAGE("   " + toString<int>(nb.getEdgeCont().size()) + " edges generated.");
00380         nb.buildLoaded();
00381     } catch (ProcessError &e) {
00382         if (std::string(e.what())!=std::string("Process Error") && std::string(e.what())!=std::string("")) {
00383             MsgHandler::getErrorInstance()->inform(e.what());
00384         }
00385         MsgHandler::getErrorInstance()->inform("Quitting (on error).", false);
00386         ret = 1;
00387 #ifndef _DEBUG
00388     } catch (...) {
00389         MsgHandler::getErrorInstance()->inform("Quitting (on unknown error).", false);
00390         ret = 1;
00391 #endif
00392     }
00393     OutputDevice::closeAll();
00394     SystemFrame::close();
00395     if (ret==0) {
00396         std::cout << "Success." << std::endl;
00397     }
00398     return ret;
00399 }


Generated on Wed May 5 00:06:38 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6