Eclipse SUMO - Simulation of Urban MObility
NGFrame.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3// Copyright (C) 2011-2022 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/****************************************************************************/
20// Sets and checks options for netgen
21/****************************************************************************/
22#include <config.h>
23
24#include <string>
25#include "NGFrame.h"
32
33
34// ===========================================================================
35// method definitions
36// ===========================================================================
37void
40 oc.doRegister("type-files", 't', new Option_FileName());
41 oc.addDescription("type-files", "Input", "Read edge-type defs from FILE");
42
43 oc.doRegister("alphanumerical-ids", new Option_Bool(true));
44 oc.addDescription("alphanumerical-ids", "Output", "The Ids of generated nodes use an alphanumerical code for easier readability when possible");
45
46 // register processing options
47 oc.doRegister("turn-lanes", new Option_Integer(0));
48 oc.addDescription("turn-lanes", "Processing", "Generate INT left-turn lanes");
49 oc.doRegister("turn-lanes.length", new Option_Float(20));
50 oc.addDescription("turn-lanes.length", "Processing", "Set the length of generated turning lanes to FLOAT");
51
52 oc.doRegister("perturb-x", new Option_String("0"));
53 oc.addDescription("perturb-x", "Processing", "Apply random spatial perturbation in x direction according the the given distribution");
54 oc.doRegister("perturb-y", new Option_String("0"));
55 oc.addDescription("perturb-y", "Processing", "Apply random spatial perturbation in y direction according the the given distribution");
56 oc.doRegister("perturb-z", new Option_String("0"));
57 oc.addDescription("perturb-z", "Processing", "Apply random spatial perturbation in z direction according the the given distribution");
58
59
60 // register grid-net options
61 oc.doRegister("grid", 'g', new Option_Bool(false));
62 oc.addSynonyme("grid", "grid-net", true);
63 oc.addDescription("grid", "Grid Network", "Forces NETGEN to build a grid-like network");
64
65 oc.doRegister("grid.number", new Option_Integer(5));
66 oc.addSynonyme("grid.number", "grid-number", true);
67 oc.addSynonyme("grid.number", "number");
68 oc.addDescription("grid.number", "Grid Network", "The number of junctions in both dirs");
69
70 oc.doRegister("grid.length", new Option_Float(100));
71 oc.addSynonyme("grid.length", "grid-length", true);
72 oc.addSynonyme("grid.length", "length");
73 oc.addDescription("grid.length", "Grid Network", "The length of streets in both dirs");
74
75 oc.doRegister("grid.x-number", new Option_Integer(5));
76 oc.addSynonyme("grid.x-number", "grid-x-number", true);
77 oc.addSynonyme("grid.x-number", "x-no");
78 oc.addDescription("grid.x-number", "Grid Network", "The number of junctions in x-dir; Overrides --grid-number");
79
80 oc.doRegister("grid.y-number", new Option_Integer(5));
81 oc.addSynonyme("grid.y-number", "grid-y-number", true);
82 oc.addSynonyme("grid.y-number", "y-no");
83 oc.addDescription("grid.y-number", "Grid Network", "The number of junctions in y-dir; Overrides --grid-number");
84
85 oc.doRegister("grid.x-length", new Option_Float(100));
86 oc.addSynonyme("grid.x-length", "grid-x-length", true);
87 oc.addSynonyme("grid.x-length", "x-length");
88 oc.addDescription("grid.x-length", "Grid Network", "The length of horizontal streets; Overrides --grid-length");
89
90 oc.doRegister("grid.y-length", new Option_Float(100));
91 oc.addSynonyme("grid.y-length", "grid-y-length", true);
92 oc.addSynonyme("grid.y-length", "y-length");
93 oc.addDescription("grid.y-length", "Grid Network", "The length of vertical streets; Overrides --grid-length");
94
95 oc.doRegister("grid.attach-length", new Option_Float(0));
96 oc.addSynonyme("grid.attach-length", "attach-length", true);
97 oc.addDescription("grid.attach-length", "Grid Network", "The length of streets attached at the boundary; 0 means no streets are attached");
98
99 oc.doRegister("grid.x-attach-length", new Option_Float(0));
100 oc.addDescription("grid.x-attach-length", "Grid Network", "The length of streets attached at the boundary in x direction; 0 means no streets are attached");
101 oc.doRegister("grid.y-attach-length", new Option_Float(0));
102 oc.addDescription("grid.y-attach-length", "Grid Network", "The length of streets attached at the boundary in y direction; 0 means no streets are attached");
103
104 // register spider-net options
105 oc.doRegister("spider", 's', new Option_Bool(false));
106 oc.addSynonyme("spider", "spider-net", true);
107 oc.addDescription("spider", "Spider Network", "Forces NETGEN to build a spider-net-like network");
108
109 oc.doRegister("spider.arm-number", new Option_Integer(13));
110 oc.addSynonyme("spider.arm-number", "spider-arm-number", true);
111 oc.addSynonyme("spider.arm-number", "arms");
112 oc.addDescription("spider.arm-number", "Spider Network", "The number of axes within the net");
113
114 oc.doRegister("spider.circle-number", new Option_Integer(20));
115 oc.addSynonyme("spider.circle-number", "spider-circle-number", true);
116 oc.addSynonyme("spider.circle-number", "circles");
117 oc.addDescription("spider.circle-number", "Spider Network", "The number of circles of the net");
118
119 oc.doRegister("spider.space-radius", new Option_Float(100));
120 oc.addSynonyme("spider.space-radius", "spider-space-rad", true);
121 oc.addSynonyme("spider.space-radius", "radius");
122 oc.addDescription("spider.space-radius", "Spider Network", "The distances between the circles");
123
124 oc.doRegister("spider.omit-center", new Option_Bool(false));
125 oc.addSynonyme("spider.omit-center", "spider-omit-center", true);
126 oc.addSynonyme("spider.omit-center", "nocenter");
127 oc.addDescription("spider.omit-center", "Spider Network", "Omit the central node of the network");
128
129
130 // register random-net options
131 oc.doRegister("rand", 'r', new Option_Bool(false));
132 oc.addSynonyme("rand", "random-net", true);
133 oc.addDescription("rand", "Random Network", "Forces NETGEN to build a random network");
134
135 oc.doRegister("rand.iterations", new Option_Integer(2000));
136 oc.addSynonyme("rand.iterations", "rand-iterations", true);
137 oc.addSynonyme("rand.iterations", "iterations");
138 oc.addDescription("rand.iterations", "Random Network", "Describes how many times an edge shall be added to the net");
139
140 oc.doRegister("bidi-probability", new Option_Float(1));
141 oc.addSynonyme("bidi-probability", "rand-bidi-probability", true);
142 oc.addSynonyme("bidi-probability", "bidi");
143 oc.addSynonyme("bidi-probability", "rand.bidi-probability");
144 oc.addDescription("bidi-probability", "Random Network", "Defines the probability to build a reverse edge");
145
146 oc.doRegister("rand.max-distance", new Option_Float(250));
147 oc.addSynonyme("rand.max-distance", "rand-max-distance", true);
148 oc.addSynonyme("rand.max-distance", "max-dist");
149 oc.addDescription("rand.max-distance", "Random Network", "The maximum distance for each edge");
150
151 oc.doRegister("rand.min-distance", new Option_Float(100));
152 oc.addSynonyme("rand.min-distance", "rand-min-distance", true);
153 oc.addSynonyme("rand.min-distance", "min-dist");
154 oc.addDescription("rand.min-distance", "Random Network", "The minimum distance for each edge");
155
156 oc.doRegister("rand.min-angle", new Option_Float(45.0));
157 oc.addSynonyme("rand.min-angle", "rand-min-anglee", true);
158 oc.addSynonyme("rand.min-angle", "min-angle");
159 oc.addDescription("rand.min-angle", "Random Network", "The minimum angle for each pair of (bidirectional) roads in DEGREES");
160
161 oc.doRegister("rand.num-tries", new Option_Integer(50));
162 oc.addSynonyme("rand.num-tries", "rand-num-tries", true);
163 oc.addSynonyme("rand.num-tries", "num-tries");
164 oc.addDescription("rand.num-tries", "Random Network", "The number of tries for creating each node");
165
166 oc.doRegister("rand.connectivity", new Option_Float((double) 0.95));
167 oc.addSynonyme("rand.connectivity", "rand-connectivity", true);
168 oc.addSynonyme("rand.connectivity", "connectivity");
169 oc.addDescription("rand.connectivity", "Random Network", "Probability for roads to continue at each node");
170
171 oc.doRegister("rand.neighbor-dist1", new Option_Float(0));
172 oc.addSynonyme("rand.neighbor-dist1", "rand-neighbor-dist1", true);
173 oc.addSynonyme("rand.neighbor-dist1", "dist1");
174 oc.addDescription("rand.neighbor-dist1", "Random Network", "Probability for a node having exactly 1 neighbor");
175
176 oc.doRegister("rand.neighbor-dist2", new Option_Float(0));
177 oc.addSynonyme("rand.neighbor-dist2", "rand-neighbor-dist2", true);
178 oc.addSynonyme("rand.neighbor-dist2", "dist2");
179 oc.addDescription("rand.neighbor-dist2", "Random Network", "Probability for a node having exactly 2 neighbors");
180
181 oc.doRegister("rand.neighbor-dist3", new Option_Float(10));
182 oc.addSynonyme("rand.neighbor-dist3", "rand-neighbor-dist3", true);
183 oc.addSynonyme("rand.neighbor-dist3", "dist3");
184 oc.addDescription("rand.neighbor-dist3", "Random Network", "Probability for a node having exactly 3 neighbors");
185
186 oc.doRegister("rand.neighbor-dist4", new Option_Float(10));
187 oc.addSynonyme("rand.neighbor-dist4", "rand-neighbor-dist4", true);
188 oc.addSynonyme("rand.neighbor-dist4", "dist4");
189 oc.addDescription("rand.neighbor-dist4", "Random Network", "Probability for a node having exactly 4 neighbors");
190
191 oc.doRegister("rand.neighbor-dist5", new Option_Float(2));
192 oc.addSynonyme("rand.neighbor-dist5", "rand-neighbor-dist5", true);
193 oc.addSynonyme("rand.neighbor-dist5", "dist5");
194 oc.addDescription("rand.neighbor-dist5", "Random Network", "Probability for a node having exactly 5 neighbors");
195
196 oc.doRegister("rand.neighbor-dist6", new Option_Float(1));
197 oc.addSynonyme("rand.neighbor-dist6", "rand-neighbor-dist6", true);
198 oc.addSynonyme("rand.neighbor-dist6", "dist6");
199 oc.addDescription("rand.neighbor-dist6", "Random Network", "Probability for a node having exactly 6 neighbors");
200
201 oc.doRegister("random-lanenumber", new Option_Bool(false));
202 oc.addSynonyme("random-lanenumber", "rand.random-lanenumber", false);
203 oc.addDescription("random-lanenumber", "Random Network", "Draw lane numbers randomly from [1,default.lanenumber]");
204
205 oc.doRegister("random-priority", new Option_Bool(false));
206 oc.addSynonyme("random-priority", "rand.random-priority", false);
207 oc.addDescription("random-priority", "Random Network", "Draw edge priority randomly from [1,default.priority]");
208
209 oc.doRegister("random-type", new Option_Bool(false));
210 oc.addDescription("random-type", "Random Network", "Draw edge type randomly from all loaded types");
211
212 oc.doRegister("rand.grid", new Option_Bool(false));
213 oc.addDescription("rand.grid", "Random Network", "Place nodes on a regular grid with spacing rand.min-distance");
214}
215
216
217bool
220 bool ok = true;
221 // check whether exactly one type of a network to build was wished
222 int no = 0;
223 if (oc.getBool("spider")) {
224 no++;
225 }
226 if (oc.getBool("grid")) {
227 no++;
228 }
229 if (oc.getBool("rand")) {
230 no++;
231 }
232 if (no == 0) {
233 WRITE_ERROR(TL("You have to specify the type of network to generate."));
234 ok = false;
235 }
236 if (no > 1) {
237 WRITE_ERROR(TL("You may specify only one type of network to generate at once."));
238 ok = false;
239 }
240 // check whether the junction type to use is properly set
241 if (oc.isSet("default-junction-type")) {
242 std::string type = oc.getString("default-junction-type");
255 WRITE_ERROR("Only the following junction types are known: " +
268 ok = false;
269 }
270 }
271 if (oc.getBool("random-type") && !oc.isSet("type-files")) {
272 WRITE_WARNING(TL("Option 'random-type' takes no effect unless 'type-files' are loaded"));
273 }
274 return ok;
275}
276
277
278/****************************************************************************/
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:274
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:265
#define TL(string)
Definition: MsgHandler.h:282
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
static void fillOptions()
Inserts options used by the network generator.
Definition: NGFrame.cpp:38
static bool checkOptions()
Checks set options from the OptionsCont-singleton for being valid.
Definition: NGFrame.cpp:218
An integer-option.
Definition: Option.h:289
A storage for options typed value containers)
Definition: OptionsCont.h:89
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:76
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
Definition: OptionsCont.cpp:97
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:59