Eclipse SUMO - Simulation of Urban MObility
NIFrame.cpp
Go to the documentation of this file.
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 /****************************************************************************/
21 // Sets and checks options for netimport
22 /****************************************************************************/
23 #include <config.h>
24 
25 #include <string>
26 #include <iostream>
27 #include <fstream>
28 #include <utils/options/Option.h>
32 #include <utils/common/ToString.h>
36 #include <netbuild/NBNetBuilder.h>
37 #include <netwrite/NWFrame.h>
39 #include "NIImporter_DlrNavteq.h"
40 #include "NIFrame.h"
41 
42 
43 // ===========================================================================
44 // method definitions
45 // ===========================================================================
46 
47 void
48 NIFrame::fillOptions(OptionsCont& oc, bool forNetedit) {
49  // register input formats
50  oc.doRegister("sumo-net-file", 's', new Option_FileName());
51  oc.addSynonyme("sumo-net-file", "sumo-net", true);
52  oc.addSynonyme("sumo-net-file", "net-file");
53  oc.addDescription("sumo-net-file", "Input", TL("Read SUMO-net from FILE"));
54  oc.addXMLDefault("sumo-net-file", "net");
55 
56  oc.doRegister("node-files", 'n', new Option_FileName());
57  oc.addSynonyme("node-files", "xml-node-files", true);
58  oc.addSynonyme("node-files", "xml-nodes", true);
59  oc.addSynonyme("node-files", "nodes");
60  oc.addDescription("node-files", "Input", TL("Read XML-node defs from FILE"));
61 
62  oc.doRegister("edge-files", 'e', new Option_FileName());
63  oc.addSynonyme("edge-files", "xml-edge-files", true);
64  oc.addSynonyme("edge-files", "xml-edges", true);
65  oc.addSynonyme("edge-files", "edges");
66  oc.addDescription("edge-files", "Input", TL("Read XML-edge defs from FILE"));
67 
68  oc.doRegister("connection-files", 'x', new Option_FileName());
69  oc.addSynonyme("connection-files", "xml-connection-files", true);
70  oc.addSynonyme("connection-files", "xml-connections", true);
71  oc.addSynonyme("connection-files", "connections");
72  oc.addDescription("connection-files", "Input", TL("Read XML-connection defs from FILE"));
73 
74  oc.doRegister("tllogic-files", 'i', new Option_FileName());
75  oc.addDescription("tllogic-files", "Input", TL("Read XML-traffic light defs from FILE"));
76 
77  oc.doRegister("type-files", 't', new Option_FileName());
78  oc.addSynonyme("type-files", "xml-type-files", true);
79  oc.addSynonyme("type-files", "xml-types", true);
80  oc.addSynonyme("type-files", "types");
81  oc.addDescription("type-files", "Input", TL("Read XML-type defs from FILE"));
82 
83  if (!forNetedit) {
84  // would cause confusion because netedit loads stops and shapes using option --additional-files
85  oc.doRegister("ptstop-files", new Option_FileName());
86  oc.addDescription("ptstop-files", "Input", TL("Reads public transport stops from FILE"));
87  oc.doRegister("ptline-files", new Option_FileName());
88  oc.addDescription("ptline-files", "Input", TL("Reads public transport lines from FILE"));
89  oc.doRegister("polygon-files", new Option_FileName());
90  oc.addDescription("polygon-files", "Input", TL("Reads polygons from FILE for embedding in network where applicable"));
91  }
92 
93  oc.doRegister("shapefile-prefix", new Option_FileName());
94  oc.addSynonyme("shapefile-prefix", "shapefile");
95  oc.addSynonyme("shapefile-prefix", "arcview", true);
96  oc.addSynonyme("shapefile-prefix", "tiger", true);
97  oc.addDescription("shapefile-prefix", "Input", TL("Read shapefiles (ArcView, Tiger, ...) from files starting with 'FILE'"));
98 
99  oc.doRegister("dlr-navteq-prefix", new Option_FileName());
100  oc.addSynonyme("dlr-navteq-prefix", "dlr-navteq");
101  oc.addSynonyme("dlr-navteq-prefix", "elmar2", true);
102  oc.addDescription("dlr-navteq-prefix", "Input", TL("Read converted Navteq GDF data (unsplitted Elmar-network) from path 'FILE'"));
103 
104  oc.doRegister("osm-files", new Option_FileName());
105  oc.addSynonyme("osm-files", "osm");
106  oc.addDescription("osm-files", "Input", TL("Read OSM-network from path 'FILE(s)'"));
107 
108  oc.doRegister("opendrive-files", new Option_FileName());
109  oc.addSynonyme("opendrive-files", "opendrive");
110  oc.addDescription("opendrive-files", "Input", TL("Read OpenDRIVE-network from FILE"));
111 
112  oc.doRegister("visum-file", new Option_FileName());
113  oc.addSynonyme("visum-file", "visum");
114  oc.addDescription("visum-file", "Input", TL("Read VISUM-net from FILE"));
115 
116  oc.doRegister("vissim-file", new Option_FileName());
117  oc.addSynonyme("vissim-file", "vissim");
118  oc.addDescription("vissim-file", "Input", TL("Read VISSIM-net from FILE"));
119 
120  oc.doRegister("robocup-dir", new Option_FileName());
121  oc.addSynonyme("robocup-dir", "robocup-net", true);
122  oc.addSynonyme("robocup-dir", "robocup");
123  oc.addDescription("robocup-dir", "Input", TL("Read RoboCup-net from DIR"));
124 
125  oc.doRegister("matsim-files", new Option_FileName());
126  oc.addSynonyme("matsim-files", "matsim");
127  oc.addDescription("matsim-files", "Input", TL("Read MATsim-net from FILE"));
128 
129  oc.doRegister("itsumo-files", new Option_FileName());
130  oc.addSynonyme("itsumo-files", "itsumo");
131  oc.addDescription("itsumo-files", "Input", TL("Read ITSUMO-net from FILE"));
132 
133  oc.doRegister("heightmap.shapefiles", new Option_FileName());
134  oc.addDescription("heightmap.shapefiles", "Input", TL("Read heightmap from ArcGIS shapefile"));
135 
136  oc.doRegister("heightmap.geotiff", new Option_FileName());
137  oc.addDescription("heightmap.geotiff", "Input", TL("Read heightmap from GeoTIFF"));
138 
139  // need to do this here to be able to check for network and route input options
141 
142  // register basic processing options
143  oc.doRegister("ignore-errors", new Option_Bool(false));
144  oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
145  oc.addDescription("ignore-errors", "Report", TL("Continue on broken input"));
146 
147  oc.doRegister("ignore-errors.connections", new Option_Bool(false));
148  oc.addDescription("ignore-errors.connections", "Report", TL("Continue on invalid connections"));
149 
150  oc.doRegister("show-errors.connections-first-try", new Option_Bool(false));
151  oc.addDescription("show-errors.connections-first-try", "Report", TL("Show errors in connections at parsing"));
152 
153  oc.doRegister("ignore-errors.edge-type", new Option_Bool(false));
154  oc.addDescription("ignore-errors.edge-type", "Report", TL("Continue on unknown edge types"));
155 
156  oc.doRegister("speed-in-kmh", new Option_Bool(false));
157  oc.addDescription("speed-in-kmh", "Processing", TL("vmax is parsed as given in km/h"));
158 
159  oc.doRegister("construction-date", new Option_String());
160  oc.addDescription("construction-date", "Processing", TL("Use YYYY-MM-DD date to determine the readiness of features under construction"));
161 
162  oc.doRegister("flatten", new Option_Bool(false));
163  oc.addDescription("flatten", "Processing", TL("Remove all z-data"));
164 
165  oc.doRegister("discard-params", new Option_StringVector());
166  oc.addDescription("discard-params", "Formats", TL("Remove the list of keys from all params"));
167 
168  oc.doRegister("ignore-change-restrictions", new Option_StringVector(StringVector({"authority"})));
169  oc.addDescription("ignore-change-restrictions", "Formats", TL("List vehicle classes that may ignore lane changing restrictions ('all' discards all restrictions)"));
170 
171  oc.doRegister("ignore-widths", new Option_Bool(false));
172  oc.addSynonyme("ignore-widths", "opendrive.ignore-widths", false);
173  oc.addDescription("ignore-widths", "Formats", TL("Whether lane widths shall be ignored."));
174 
175  // register xml options
176  oc.doRegister("plain.extend-edge-shape", new Option_Bool(false));
177  oc.addSynonyme("plain.extend-edge-shape", "xml.keep-shape", true);
178  oc.addDescription("plain.extend-edge-shape", "Processing", TL("If edge shapes do not end at the node positions, extend them"));
179 
180  // register osm options
181  oc.doRegister("osm.skip-duplicates-check", new Option_Bool(false));
182  oc.addDescription("osm.skip-duplicates-check", "Formats", TL("Skips the check for duplicate nodes and edges"));
183 
184  oc.doRegister("osm.elevation", new Option_Bool(false));
185  oc.addDescription("osm.elevation", "Formats", TL("Imports elevation data"));
186 
187  oc.doRegister("osm.layer-elevation", new Option_Float(0));
188  oc.addDescription("osm.layer-elevation", "Formats", TL("Reconstruct (relative) elevation based on layer data. Each layer is raised by FLOAT m"));
189 
190  oc.doRegister("osm.layer-elevation.max-grade", new Option_Float(10));
191  oc.addDescription("osm.layer-elevation.max-grade", "Formats", TL("Maximum grade threshold in % at 50km/h when reconstructing elevation based on layer data. The value is scaled according to road speed."));
192 
193  oc.doRegister("osm.oneway-spread-right", new Option_Bool(false));
194  oc.addDescription("osm.oneway-spread-right", "Formats", TL("Whether one-way roads should be spread to the side instead of centered"));
195 
196  oc.doRegister("osm.lane-access", new Option_Bool(false));
197  oc.addDescription("osm.lane-access", "Formats", TL("Import lane-specific access restrictions"));
198 
199  oc.doRegister("osm.bike-access", new Option_Bool(false));
200  oc.addSynonyme("osm.bike-access", "osm.bike-lanes");
201  oc.addDescription("osm.bike-access", "Formats", TL("Import bike lanes and fix directions and permissions on bike paths"));
202 
203  oc.doRegister("osm.sidewalks", new Option_Bool(false));
204  oc.addDescription("osm.sidewalks", "Formats", TL("Import sidewalks"));
205 
206  oc.doRegister("osm.crossings", new Option_Bool(false));
207  oc.addDescription("osm.crossings", "Formats", TL("Import crossings"));
208 
209  oc.doRegister("osm.turn-lanes", new Option_Bool(false));
210  oc.addDescription("osm.turn-lanes", "Formats", TL("Import turning arrows from OSM to help with connection building"));
211 
212  oc.doRegister("osm.stop-output.length", new Option_Float(25));
213  oc.addDescription("osm.stop-output.length", "Formats", TL("The default length of a public transport stop in FLOAT m"));
214  oc.doRegister("osm.stop-output.length.bus", new Option_Float(15));
215  oc.addDescription("osm.stop-output.length.bus", "Formats", TL("The default length of a bus stop in FLOAT m"));
216  oc.doRegister("osm.stop-output.length.tram", new Option_Float(25));
217  oc.addDescription("osm.stop-output.length.tram", "Formats", TL("The default length of a tram stop in FLOAT m"));
218  oc.doRegister("osm.stop-output.length.train", new Option_Float(200));
219  oc.addDescription("osm.stop-output.length.train", "Formats", TL("The default length of a train stop in FLOAT m"));
220 
221  oc.doRegister("osm.railsignals", new Option_StringVector(StringVector({ "DEFAULT"})));
222  oc.addDescription("osm.railsignals", "Formats", TL("Specify custom rules for importing railway signals"));
223 
224  oc.doRegister("osm.all-attributes", new Option_Bool(false));
225  oc.addSynonyme("osm.all-attributes", "osm.all-tags");
226  oc.addDescription("osm.all-attributes", "Formats", TL("Whether additional attributes shall be imported"));
227 
228  oc.doRegister("osm.extra-attributes", new Option_StringVector(StringVector({ "all" })));
229  oc.addSynonyme("osm.extra-attributes", "osm.extra-tags");
230  oc.addDescription("osm.extra-attributes", "Formats", TL("List of additional attributes that shall be imported from OSM via osm.all-attributes (set 'all' to import all)"));
231 
232  oc.doRegister("osm.speedlimit-none", new Option_Float(39.4444));
233  oc.addDescription("osm.speedlimit-none", "Formats", TL("The speed limit to be set when there is no actual speed limit in reality"));
234 
235  // register matsim options
236  oc.doRegister("matsim.keep-length", new Option_Bool(false));
237  oc.addDescription("matsim.keep-length", "Formats", TL("The edge lengths given in the MATSIM-file will be kept"));
238 
239  oc.doRegister("matsim.lanes-from-capacity", new Option_Bool(false));
240  oc.addDescription("matsim.lanes-from-capacity", "Formats", TL("The lane number will be computed from the capacity"));
241 
242 
243  // register shapefile options
244  oc.doRegister("shapefile.street-id", new Option_String());
245  oc.addSynonyme("shapefile.street-id", "arcview.street-id", true);
246  oc.addDescription("shapefile.street-id", "Formats", TL("Read edge ids from column STR"));
247 
248  oc.doRegister("shapefile.from-id", new Option_String());
249  oc.addSynonyme("shapefile.from-id", "arcview.from-id", true);
250  oc.addDescription("shapefile.from-id", "Formats", TL("Read from-node ids from column STR"));
251 
252  oc.doRegister("shapefile.to-id", new Option_String());
253  oc.addSynonyme("shapefile.to-id", "arcview.to-id", true);
254  oc.addDescription("shapefile.to-id", "Formats", TL("Read to-node ids from column STR"));
255 
256  oc.doRegister("shapefile.type-id", new Option_String());
257  oc.addSynonyme("shapefile.type-id", "arcview.type-id", true);
258  oc.addDescription("shapefile.type-id", "Formats", TL("Read type ids from column STR"));
259 
260  oc.doRegister("shapefile.laneNumber", new Option_String());
261  oc.addDescription("shapefile.laneNumber", "Formats", TL("Read lane number from column STR"));
262 
263  oc.doRegister("shapefile.speed", new Option_String());
264  oc.addDescription("shapefile.speed", "Formats", TL("Read speed from column STR"));
265 
266  oc.doRegister("shapefile.length", new Option_String());
267  oc.addDescription("shapefile.length", "Formats", TL("Read custom edge length from column STR"));
268 
269  oc.doRegister("shapefile.width", new Option_String());
270  oc.addDescription("shapefile.width", "Formats", TL("Read total edge width from column STR"));
271 
272  oc.doRegister("shapefile.name", new Option_String());
273  oc.addDescription("shapefile.name", "Formats", TL("Read (non-unique) name from column STR"));
274 
275  oc.doRegister("shapefile.node-join-dist", new Option_Float(0));
276  oc.addDescription("shapefile.node-join-dist", "Formats", TL("Distance threshold for determining whether distinct shapes are connected (used when from-id and to-id are not available)"));
277 
278  oc.doRegister("shapefile.add-params", new Option_StringVector());
279  oc.addDescription("shapefile.add-params", "Formats", TL("Add the list of field names as edge params"));
280 
281  oc.doRegister("shapefile.use-defaults-on-failure", new Option_Bool(false));
282  oc.addSynonyme("shapefile.use-defaults-on-failure", "arcview.use-defaults-on-failure", true);
283  oc.addDescription("shapefile.use-defaults-on-failure", "Formats", TL("Uses edge type defaults on problems"));
284 
285  oc.doRegister("shapefile.all-bidirectional", new Option_Bool(false));
286  oc.addSynonyme("shapefile.all-bidirectional", "shapefile.all-bidi");
287  oc.addSynonyme("shapefile.all-bidirectional", "arcview.all-bidi", true);
288  oc.addDescription("shapefile.all-bidirectional", "Formats", TL("Insert edges in both directions"));
289 
290  oc.doRegister("shapefile.guess-projection", new Option_Bool(false));
291  oc.addSynonyme("shapefile.guess-projection", "arcview.guess-projection", true);
292  oc.addDescription("shapefile.guess-projection", "Formats", TL("Guess the proper projection"));
293 
294  oc.doRegister("shapefile.traditional-axis-mapping", new Option_Bool(false));
295  oc.addDescription("shapefile.traditional-axis-mapping", "Formats", TL("Use traditional axis order (lon, lat)"));
296 
297 
298  // register dlr-navteq options
299  oc.doRegister("dlr-navteq.tolerant-permissions", new Option_Bool(false));
300  oc.addDescription("dlr-navteq.tolerant-permissions", "Formats", TL("Allow more vehicle classes by default"));
301 
302  oc.doRegister("dlr-navteq.keep-length", new Option_Bool(false));
303  oc.addDescription("dlr-navteq.keep-length", "Formats", TL("The edge lengths given in the DLR Navteq-file will be kept"));
304 
305 
306  // register vissim options
307  oc.doRegister("vissim.join-distance", new Option_Float(5.0f));
308  oc.addSynonyme("vissim.join-distance", "vissim.offset", true);
309  oc.addDescription("vissim.join-distance", "Formats", TL("Structure join offset"));
310 
311  oc.doRegister("vissim.default-speed", new Option_Float(50.0f));
312  oc.addDescription("vissim.default-speed", "Formats", TL("Use FLOAT as default speed"));
313 
314  oc.doRegister("vissim.speed-norm", new Option_Float(1.0f));
315  oc.addDescription("vissim.speed-norm", "Formats", TL("Factor for edge velocity"));
316 
317  oc.doRegister("vissim.report-unset-speeds", new Option_Bool(false));
318  oc.addDescription("vissim.report-unset-speeds", "Formats", TL("Writes lanes without an explicit speed set"));
319 
320 
321  // register visum options
322  oc.doRegister("visum.language-file", new Option_FileName());
323  oc.addDescription("visum.language-file", "Formats", TL("Load language mappings from FILE"));
324 
325  oc.doRegister("visum.use-type-priority", new Option_Bool(false));
326  oc.addDescription("visum.use-type-priority", "Formats", TL("Uses priorities from types"));
327 
328  oc.doRegister("visum.use-type-laneno", new Option_Bool(false));
329  oc.addDescription("visum.use-type-laneno", "Formats", TL("Uses lane numbers from types"));
330 
331  oc.doRegister("visum.use-type-speed", new Option_Bool(false));
332  oc.addDescription("visum.use-type-speed", "Formats", TL("Uses speeds from types"));
333 
334  oc.doRegister("visum.connector-speeds", new Option_Float(100.));
335  oc.addDescription("visum.connector-speeds", "Formats", TL("Sets connector speed"));
336 
337  oc.doRegister("visum.connectors-lane-number", new Option_Integer(3));
338  oc.addSynonyme("visum.connectors-lane-number", "visum.connector-laneno", true);
339  oc.addDescription("visum.connectors-lane-number", "Formats", TL("Sets connector lane number"));
340 
341  oc.doRegister("visum.no-connectors", new Option_Bool(true));
342  oc.addDescription("visum.no-connectors", "Formats", TL("Excludes connectors"));
343 
344  oc.doRegister("visum.recompute-lane-number", new Option_Bool(false));
345  oc.addSynonyme("visum.recompute-lane-number", "visum.recompute-laneno", true);
346  oc.addDescription("visum.recompute-lane-number", "Formats", TL("Computes the number of lanes from the edges' capacities"));
347 
348  oc.doRegister("visum.verbose-warnings", new Option_Bool(false));
349  oc.addDescription("visum.verbose-warnings", "Formats", TL("Prints all warnings, some of which are due to VISUM misbehaviour"));
350 
351  oc.doRegister("visum.lanes-from-capacity.norm", new Option_Float(1800.));
352  oc.addSynonyme("visum.lanes-from-capacity.norm", "capacity-norm", true);
353  oc.addSynonyme("visum.lanes-from-capacity.norm", "lanes-from-capacity.norm");
354  oc.addDescription("visum.lanes-from-capacity.norm", "Formats", TL("The factor for flow to no. lanes conversion"));
355 
356 
357  // register opendrive options
358  oc.doRegister("opendrive.import-all-lanes", new Option_Bool(false));
359  oc.addDescription("opendrive.import-all-lanes", "Formats", TL("Imports all lane types"));
360  oc.doRegister("opendrive.curve-resolution", new Option_Float(2.0));
361  oc.addDescription("opendrive.curve-resolution", "Formats", TL("The geometry resolution in m when importing curved geometries as line segments."));
362  oc.doRegister("opendrive.advance-stopline", new Option_Float(0.0));
363  oc.addDescription("opendrive.advance-stopline", "Formats", TL("Allow stop lines to be built beyond the start of the junction if the geometries allow so"));
364  oc.doRegister("opendrive.min-width", new Option_Float(1.8));
365  oc.addDescription("opendrive.min-width", "Formats", TL("The minimum lane width for determining start or end of variable-width lanes"));
366  oc.doRegister("opendrive.internal-shapes", new Option_Bool(false));
367  oc.addDescription("opendrive.internal-shapes", "Formats", TL("Import internal lane shapes"));
368  oc.doRegister("opendrive.position-ids", new Option_Bool(false));
369  oc.addDescription("opendrive.position-ids", "Formats", TL("Sets edge-id based on road-id and offset in m (legacy)"));
370  oc.doRegister("opendrive.lane-shapes", new Option_Bool(false));
371  oc.addDescription("opendrive.lane-shapes", "Formats", TL("Use custom lane shapes to compensate discarded lane types"));
372  oc.doRegister("opendrive.signal-groups", new Option_Bool(false));
373  oc.addDescription("opendrive.signal-groups", "Formats", TL("Use the OpenDRIVE controller information for the generated signal program"));
374  oc.doRegister("opendrive.ignore-misplaced-signals", new Option_Bool(false));
375  oc.addDescription("opendrive.ignore-misplaced-signals", "Formats", TL("Ignore traffic signals which do not control any driving lane"));
376 
377  // register some additional options
378  oc.doRegister("tls.discard-loaded", new Option_Bool(false));
379  oc.addDescription("tls.discard-loaded", "TLS Building", "Does not instantiate traffic lights loaded from other formats than plain-XML");
380 
381  oc.doRegister("tls.discard-simple", new Option_Bool(false));
382  oc.addDescription("tls.discard-simple", "TLS Building", "Does not instantiate traffic lights at geometry-like nodes loaded from other formats than plain-XML");
383 
384  // register railway options
385  oc.doRegister("railway.signals.discard", new Option_Bool(false));
386  oc.addDescription("railway.signals.discard", "Railway", TL("Discard all railway signal information loaded from other formats than plain-xml"));
387 }
388 
389 
390 bool
392  bool ok = oc.checkDependingSuboptions("shapefile", "shapefile.");
393  ok &= oc.checkDependingSuboptions("visum-file", "visum.");
394  ok &= oc.checkDependingSuboptions("vissim-file", "vissim.");
395 #ifdef PROJ_API_FILE
396  int numProjections = oc.getBool("simple-projection") + oc.getBool("proj.utm") + oc.getBool("proj.dhdn") + (oc.getString("proj").length() > 1);
397  if ((oc.isSet("osm-files") || oc.isSet("dlr-navteq-prefix") || oc.isSet("shapefile-prefix")) && numProjections == 0) {
398  if (oc.isDefault("proj")) {
399  oc.set("proj.utm", "true");
400  }
401  }
402  if (oc.isSet("dlr-navteq-prefix") && oc.isDefault("proj.scale")) {
404  }
405 #else
406  if ((oc.isSet("osm-files") || oc.isSet("dlr-navteq-prefix") || oc.isSet("shapefile-prefix")) && !oc.getBool("simple-projection")) {
407  WRITE_ERROR(TL("Cannot import network data without PROJ-Library. Please install package proj before building sumo"));
408  ok = false;
409  }
410 #endif
411  if (oc.isSet("sumo-net-file")) {
412  if (oc.isWriteable("no-turnarounds")) {
413  // changed default since turnarounds are loaded from the net file.
414  oc.set("no-turnarounds", "true");
415  }
416  if (oc.isWriteable("offset.disable-normalization")) {
417  // changed default since we wish to preserve the network as far as possible
418  oc.set("offset.disable-normalization", "true");
419  }
420  if (oc.isWriteable("geometry.max-grade.fix")) {
421  // changed default since we wish to preserve the network as far as possible
422  oc.set("geometry.max-grade.fix", "false");
423  }
424  if (oc.isWriteable("geometry.min-radius.fix.railways")) {
425  // changed default since we wish to preserve the network as far as possible
426  oc.set("geometry.min-radius.fix.railways", "false");
427  }
428  }
429  if (!oc.isSet("type-files")) {
430  const char* sumoPath = std::getenv("SUMO_HOME");
431  if (sumoPath == nullptr) {
432  WRITE_WARNING(TL("Environment variable SUMO_HOME is not set, using built in type maps."));
433  } else {
434  const std::string path = sumoPath + std::string("/data/typemap/");
435  if (oc.isSet("osm-files")) {
436  oc.setDefault("type-files", path + "osmNetconvert.typ.xml");
437  }
438  if (oc.isSet("opendrive-files")) {
439  oc.setDefault("type-files", path + "opendriveNetconvert.typ.xml");
440  }
441  }
442  }
443  if (oc.isSet("opendrive-files")) {
444  if (oc.isDefault("tls.left-green.time")) {
445  // legacy behavior. see #2114
446  oc.setDefault("tls.left-green.time", "0");
447  }
448  if (oc.isDefault("rectangular-lane-cut")) {
449  // a better interpretation of imported geometries
450  oc.setDefault("rectangular-lane-cut", "true");
451  }
452  if (oc.isDefault("geometry.max-grade.fix")) {
453  // a better interpretation of imported geometries
454  oc.setDefault("geometry.max-grade.fix", "false");
455  }
456  if (oc.isDefault("no-turnarounds") && oc.isDefault("no-turnarounds.except-deadend")) {
457  // changed default since all connections (connecting roads) are loaded from the input.
458  oc.set("no-turnarounds.except-deadend", "true");
459  }
460  }
461  if (!oc.isDefault("osm.extra-attributes") && oc.isDefault("osm.all-attributes")) {
462  oc.setDefault("osm.all-attributes", "true");
463  }
464  if (oc.getBool("osm.crossings") && !oc.getBool("osm.sidewalks")) {
465  WRITE_WARNING(TL("It is recommend to use option osm.crossings with osm.sidewalks"));
466  }
467  if (oc.isSet("shapefile-prefix") && !oc.isDefault("shapefile.name")) {
468  oc.setDefault("output.street-names", "true");
469  }
470 
471  return ok;
472 }
473 
474 
475 /****************************************************************************/
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:304
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:295
#define TL(string)
Definition: MsgHandler.h:315
std::vector< std::string > StringVector
Definition of a vector of strings.
Definition: Option.h:42
static bool checkOptions(OptionsCont &oc)
Checks set options for being valid.
Definition: NIFrame.cpp:391
static void fillOptions(OptionsCont &oc, bool forNetedit=false)
Inserts options used by the network importer and network building modules.
Definition: NIFrame.cpp:48
static const std::string GEO_SCALE
scaling factor for geo coordinates (DLRNavteq format uses this to increase floating point precisions)
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.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
bool isWriteable(const std::string &name)
Returns the information whether the named option may be 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)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
bool setDefault(const std::string &name, const std::string &value)
Sets the given value for the named option as new default value.
void doRegister(const std::string &name, Option *o)
Adds an option under the given name.
Definition: OptionsCont.cpp:76
bool set(const std::string &name, const std::string &value, const bool append=false)
Sets the given value for the named option.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
bool checkDependingSuboptions(const std::string &name, const std::string &prefix) const
Checks whether an option is set, which has options with a prefix depending on it.
void addXMLDefault(const std::string &name, const std::string &xmlRoot="")
Adds an XML root element to handle by default. The special root "" denotes the default handler.
static void addReportOptions(OptionsCont &oc)
Adds reporting options to the given container.
Definition: SystemFrame.cpp:67