Eclipse SUMO - Simulation of Urban MObility
NIImporter_SUMO.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 // Importer for networks stored in SUMO format
22 /****************************************************************************/
23 #include <config.h>
24 #include <string>
30 #include <utils/common/ToString.h>
34 #include <utils/xml/XMLSubSys.h>
38 #include <netbuild/NBEdge.h>
39 #include <netbuild/NBEdgeCont.h>
40 #include <netbuild/NBNode.h>
41 #include <netbuild/NBNodeCont.h>
43 #include <netbuild/NBNetBuilder.h>
44 #include "NILoader.h"
45 #include "NIXMLTypesHandler.h"
46 #include "NIImporter_SUMO.h"
47 
48 
49 // ===========================================================================
50 // method definitions
51 // ===========================================================================
52 // ---------------------------------------------------------------------------
53 // static methods (interface in this case)
54 // ---------------------------------------------------------------------------
55 void
57  NIImporter_SUMO importer(nb);
58  importer._loadNetwork(oc);
59 }
60 
61 
62 // ---------------------------------------------------------------------------
63 // loader methods
64 // ---------------------------------------------------------------------------
66  : SUMOSAXHandler("sumo-network"),
67  myNetBuilder(nb),
68  myNodeCont(nb.getNodeCont()),
69  myTLLCont(nb.getTLLogicCont()),
70  myTypesHandler(nb.getTypeCont()),
71  myCurrentEdge(nullptr),
72  myCurrentLane(nullptr),
73  myCurrentTL(nullptr),
74  myLocation(nullptr),
75  myNetworkVersion(0, 0),
76  myHaveSeenInternalEdge(false),
77  myAmLefthand(false),
78  myChangeLefthand(false),
79  myCornerDetail(0),
80  myLinkDetail(-1),
81  myRectLaneCut(false),
82  myWalkingAreas(false),
83  myLimitTurnSpeed(-1),
84  myCheckLaneFoesAll(false),
85  myCheckLaneFoesRoundabout(true),
86  myTlsIgnoreInternalJunctionJam(false),
87  myDefaultSpreadType(toString(LaneSpreadFunction::RIGHT)),
88  myGeomAvoidOverlap(true),
89  myJunctionsHigherSpeed(false),
90  myInternalJunctionsVehicleWidth(OptionsCont::getOptions().getFloat("internal-junctions.vehicle-width")),
91  myJunctionsMinimalShape(OptionsCont::getOptions().getBool("junctions.minimal-shape")),
92  myJunctionsEndpointShape(OptionsCont::getOptions().getBool("junctions.endpoint-shape")) {
93 }
94 
95 
97  for (std::map<std::string, EdgeAttrs*>::const_iterator i = myEdges.begin(); i != myEdges.end(); ++i) {
98  EdgeAttrs* ed = (*i).second;
99  for (std::vector<LaneAttrs*>::const_iterator j = ed->lanes.begin(); j != ed->lanes.end(); ++j) {
100  delete *j;
101  }
102  delete ed;
103  }
104  delete myLocation;
105 }
106 
107 
108 void
110  // check whether the option is set (properly)
111  if (!oc.isUsableFileList("sumo-net-file")) {
112  return;
113  }
114  const std::vector<std::string> discardableParams = oc.getStringVector("discard-params");
115  myDiscardableParams.insert(discardableParams.begin(), discardableParams.end());
116  // parse file(s)
117  const std::vector<std::string> files = oc.getStringVector("sumo-net-file");
118  for (std::vector<std::string>::const_iterator file = files.begin(); file != files.end(); ++file) {
119  if (!FileHelpers::isReadable(*file)) {
120  WRITE_ERRORF(TL("Could not open sumo-net-file '%'."), *file);
121  return;
122  }
123  setFileName(*file);
124  const long before = PROGRESS_BEGIN_TIME_MESSAGE("Parsing sumo-net from '" + *file + "'");
125  XMLSubSys::runParser(*this, *file, true);
126  PROGRESS_TIME_MESSAGE(before);
127  }
128  // build edges
129  const double maxSegmentLength = oc.getFloat("geometry.max-segment-length");
130  for (std::map<std::string, EdgeAttrs*>::const_iterator i = myEdges.begin(); i != myEdges.end(); ++i) {
131  EdgeAttrs* ed = (*i).second;
132  // skip internal edges
134  continue;
135  }
136  // get and check the nodes
137  NBNode* from = myNodeCont.retrieve(ed->fromNode);
138  NBNode* to = myNodeCont.retrieve(ed->toNode);
139  if (from == nullptr) {
140  WRITE_ERRORF(TL("Edge's '%' from-node '%' is not known."), ed->id, ed->fromNode);
141  continue;
142  }
143  if (to == nullptr) {
144  WRITE_ERRORF(TL("Edge's '%' to-node '%' is not known."), ed->id, ed->toNode);
145  continue;
146  }
147  if (from == to) {
148  WRITE_ERRORF(TL("Edge's '%' from-node and to-node '%' are identical."), ed->id, ed->toNode);
149  continue;
150  }
151  if (ed->shape.size() == 0 && maxSegmentLength > 0) {
152  ed->shape.push_back(from->getPosition());
153  ed->shape.push_back(to->getPosition());
154  // shape is already cartesian but we must use a copy because the original will be modified
155  NBNetBuilder::addGeometrySegments(ed->shape, PositionVector(ed->shape), maxSegmentLength);
156  }
157  // build and insert the edge
158  NBEdge* e = new NBEdge(ed->id, from, to,
160  (int) ed->lanes.size(),
162  ed->shape, ed->lsf, ed->streetName, "", true); // always use tryIgnoreNodePositions to keep original shape
163  e->setLoadedLength(ed->length);
165  e->setDistance(ed->distance);
166  if (!myNetBuilder.getEdgeCont().insert(e)) {
167  WRITE_ERRORF(TL("Could not insert edge '%'."), ed->id);
168  delete e;
169  continue;
170  }
172  if (ed->builtEdge != nullptr) {
174  ed->builtEdge->setBidi(ed->bidi != "");
175  }
176  }
177  // assign further lane attributes (edges are built)
178  EdgeVector toRemove;
179  const bool dismissVclasses = oc.getBool("dismiss-vclasses");
180  for (std::map<std::string, EdgeAttrs*>::const_iterator i = myEdges.begin(); i != myEdges.end(); ++i) {
181  EdgeAttrs* ed = (*i).second;
182  NBEdge* nbe = ed->builtEdge;
183  if (nbe == nullptr) { // inner edge or removed by explicit list, vclass, ...
184  continue;
185  }
186  const SumoXMLNodeType toType = nbe->getToNode()->getType();
187  for (int fromLaneIndex = 0; fromLaneIndex < (int) ed->lanes.size(); ++fromLaneIndex) {
188  LaneAttrs* lane = ed->lanes[fromLaneIndex];
189  // connections
190  const std::vector<Connection>& connections = lane->connections;
191  for (const Connection& c : connections) {
192  if (myEdges.count(c.toEdgeID) == 0) {
193  WRITE_ERRORF(TL("Unknown edge '%' given in connection."), c.toEdgeID);
194  continue;
195  }
196  NBEdge* toEdge = myEdges[c.toEdgeID]->builtEdge;
197  if (toEdge == nullptr) { // removed by explicit list, vclass, ...
198  continue;
199  }
200  if (toEdge->getFromNode() != nbe->getToNode()) { // inconsistency may occur when merging networks
201  WRITE_WARNINGF("Removing invalid connection from edge '%' to edge '%'", nbe->getID(), toEdge->getID());
202  continue;
203  }
204  // patch attribute uncontrolled for legacy networks where it is not set explicitly
205  bool uncontrolled = c.uncontrolled;
206 
207  if ((NBNode::isTrafficLight(toType) || toType == SumoXMLNodeType::RAIL_SIGNAL)
208  && c.tlLinkIndex == NBConnection::InvalidTlIndex) {
209  uncontrolled = true;
210  }
212  fromLaneIndex, toEdge, c.toLaneIdx, NBEdge::Lane2LaneInfoType::VALIDATED,
213  true, c.mayDefinitelyPass, c.keepClear ? KEEPCLEAR_TRUE : KEEPCLEAR_FALSE,
214  c.contPos, c.visibility, c.speed, c.friction, c.customLength, c.customShape, uncontrolled, c.permissions, c.indirectLeft, c.edgeType, c.changeLeft, c.changeRight);
215  if (c.getParametersMap().size() > 0) {
216  nbe->getConnectionRef(fromLaneIndex, toEdge, c.toLaneIdx).updateParameters(c.getParametersMap());
217  }
218  // maybe we have a tls-controlled connection
219  if (c.tlID != "" && myRailSignals.count(c.tlID) == 0) {
220  const std::map<std::string, NBTrafficLightDefinition*>& programs = myTLLCont.getPrograms(c.tlID);
221  if (programs.size() > 0) {
222  std::map<std::string, NBTrafficLightDefinition*>::const_iterator it;
223  for (it = programs.begin(); it != programs.end(); it++) {
224  NBLoadedSUMOTLDef* tlDef = dynamic_cast<NBLoadedSUMOTLDef*>(it->second);
225  if (tlDef) {
226  tlDef->addConnection(nbe, toEdge, fromLaneIndex, c.toLaneIdx, c.tlLinkIndex, c.tlLinkIndex2, false);
227  } else {
228  throw ProcessError("Corrupt traffic light definition '" + c.tlID + "' (program '" + it->first + "')");
229  }
230  }
231  } else {
232  WRITE_ERRORF(TL("The traffic light '%' is not known."), c.tlID);
233  }
234  }
235  }
236  // allow/disallow XXX preferred
237  if (!dismissVclasses) {
238  nbe->setPermissions(parseVehicleClasses(lane->allow, lane->disallow, myNetworkVersion), fromLaneIndex);
239  }
240  nbe->setPermittedChanging(fromLaneIndex, parseVehicleClasses(lane->changeLeft, ""), parseVehicleClasses(lane->changeRight, ""));
241  // width, offset
242  nbe->setLaneWidth(fromLaneIndex, lane->width);
243  nbe->setEndOffset(fromLaneIndex, lane->endOffset);
244  nbe->setSpeed(fromLaneIndex, lane->maxSpeed);
245  nbe->setFriction(fromLaneIndex, lane->friction);
246  nbe->setAcceleration(fromLaneIndex, lane->accelRamp);
247  nbe->getLaneStruct(fromLaneIndex).oppositeID = lane->oppositeID;
248  nbe->getLaneStruct(fromLaneIndex).type = lane->type;
249  nbe->getLaneStruct(fromLaneIndex).updateParameters(lane->getParametersMap());
250  if (lane->customShape) {
251  nbe->setLaneShape(fromLaneIndex, lane->shape);
252  }
253  // stop offset for lane
254  bool stopOffsetSet = false;
255  if (lane->laneStopOffset.isDefined() || nbe->getEdgeStopOffset().isDefined()) {
256  // apply lane-specific stopOffset (might be none as well)
257  stopOffsetSet = nbe->setEdgeStopOffset(fromLaneIndex, lane->laneStopOffset);
258  }
259  if (!stopOffsetSet) {
260  // apply default stop offset to lane
261  nbe->setEdgeStopOffset(fromLaneIndex, nbe->getEdgeStopOffset());
262  }
263  }
265  if (!nbe->hasLaneSpecificWidth() && nbe->getLanes()[0].width != NBEdge::UNSPECIFIED_WIDTH) {
266  nbe->setLaneWidth(-1, nbe->getLaneWidth(0));
267  }
269  nbe->setEndOffset(-1, nbe->getEndOffset(0));
270  }
271  if (!nbe->hasLaneSpecificStopOffsets() && nbe->getEdgeStopOffset().isDefined()) {
272  nbe->setEdgeStopOffset(-1, nbe->getEdgeStopOffset());
273  }
274  // check again after permissions are set
277  toRemove.push_back(nbe);
278  }
279  }
280  for (EdgeVector::iterator i = toRemove.begin(); i != toRemove.end(); ++i) {
282  }
283  // insert loaded prohibitions
284  for (std::vector<Prohibition>::const_iterator it = myProhibitions.begin(); it != myProhibitions.end(); it++) {
285  NBEdge* prohibitedFrom = myEdges[it->prohibitedFrom]->builtEdge;
286  NBEdge* prohibitedTo = myEdges[it->prohibitedTo]->builtEdge;
287  NBEdge* prohibitorFrom = myEdges[it->prohibitorFrom]->builtEdge;
288  NBEdge* prohibitorTo = myEdges[it->prohibitorTo]->builtEdge;
289  if (prohibitedFrom == nullptr) {
290  WRITE_WARNINGF(TL("Edge '%' in prohibition was not built."), it->prohibitedFrom);
291  } else if (prohibitedTo == nullptr) {
292  WRITE_WARNINGF(TL("Edge '%' in prohibition was not built."), it->prohibitedTo);
293  } else if (prohibitorFrom == nullptr) {
294  WRITE_WARNINGF(TL("Edge '%' in prohibition was not built."), it->prohibitorFrom);
295  } else if (prohibitorTo == nullptr) {
296  WRITE_WARNINGF(TL("Edge '%' in prohibition was not built."), it->prohibitorTo);
297  } else {
298  NBNode* n = prohibitedFrom->getToNode();
300  NBConnection(prohibitorFrom, prohibitorTo),
301  NBConnection(prohibitedFrom, prohibitedTo));
302  }
303  }
304  if (!myHaveSeenInternalEdge && oc.isWriteable("no-internal-links")) {
305  oc.set("no-internal-links", "true");
306  }
307  if (oc.isWriteable("lefthand")) {
308  oc.set("lefthand", toString(myAmLefthand));
309  }
310  if (oc.isWriteable("junctions.corner-detail")) {
311  oc.set("junctions.corner-detail", toString(myCornerDetail));
312  }
313  if (oc.isWriteable("junctions.internal-link-detail") && myLinkDetail > 0) {
314  oc.set("junctions.internal-link-detail", toString(myLinkDetail));
315  }
316  if (oc.isWriteable("rectangular-lane-cut")) {
317  oc.set("rectangular-lane-cut", toString(myRectLaneCut));
318  }
319  if (oc.isWriteable("walkingareas")) {
320  oc.set("walkingareas", toString(myWalkingAreas));
321  }
322  if (oc.isWriteable("junctions.limit-turn-speed")) {
323  oc.set("junctions.limit-turn-speed", toString(myLimitTurnSpeed));
324  }
325  if (oc.isWriteable("check-lane-foes.all") && oc.getBool("check-lane-foes.all") != myCheckLaneFoesAll) {
326  oc.set("check-lane-foes.all", toString(myCheckLaneFoesAll));
327  }
328  if (oc.isWriteable("check-lane-foes.roundabout") && oc.getBool("check-lane-foes.roundabout") != myCheckLaneFoesRoundabout) {
329  oc.set("check-lane-foes.roundabout", toString(myCheckLaneFoesRoundabout));
330  }
331  if (oc.isWriteable("tls.ignore-internal-junction-jam") && oc.getBool("tls.ignore-internal-junction-jam") != myTlsIgnoreInternalJunctionJam) {
332  oc.set("tls.ignore-internal-junction-jam", toString(myTlsIgnoreInternalJunctionJam));
333  }
334  if (oc.isWriteable("default.spreadtype") && oc.getString("default.spreadtype") != myDefaultSpreadType) {
335  oc.set("default.spreadtype", myDefaultSpreadType);
336  }
337  if (oc.isWriteable("geometry.avoid-overlap") && oc.getBool("geometry.avoid-overlap") != myGeomAvoidOverlap) {
338  oc.set("geometry.avoid-overlap", toString(myGeomAvoidOverlap));
339  }
340  if (oc.isWriteable("junctions.higher-speed") && oc.getBool("junctions.higher-speed") != myJunctionsHigherSpeed) {
341  oc.set("junctions.higher-speed", toString(myJunctionsHigherSpeed));
342  }
343  if (oc.isWriteable("internal-junctions.vehicle-width") && oc.getFloat("internal-junctions.vehicle-width") != myInternalJunctionsVehicleWidth) {
344  oc.set("internal-junctions.vehicle-width", toString(myInternalJunctionsVehicleWidth));
345  }
346  if (oc.isWriteable("junctions.minimal-shape") && oc.getBool("junctions.minimal-shape") != myJunctionsMinimalShape) {
347  oc.set("junctions.minimal-shape", toString(myJunctionsMinimalShape));
348  }
349  if (oc.isWriteable("junctions.endpoint-shape") && oc.getBool("junctions.endpoint-shape") != myJunctionsEndpointShape) {
350  oc.set("junctions.endpoint-shape", toString(myJunctionsEndpointShape));
351  }
352  if (!deprecatedVehicleClassesSeen.empty()) {
353  WRITE_WARNINGF(TL("Deprecated vehicle class(es) '%' in input network."), toString(deprecatedVehicleClassesSeen));
355  }
356  if (!oc.getBool("no-internal-links")) {
357  // add loaded crossings
358  for (const auto& crossIt : myPedestrianCrossings) {
359  NBNode* const node = myNodeCont.retrieve(crossIt.first);
360  for (const Crossing& crossing : crossIt.second) {
361  EdgeVector edges;
362  for (const std::string& edgeID : crossing.crossingEdges) {
363  NBEdge* edge = myNetBuilder.getEdgeCont().retrieve(edgeID);
364  // edge might have been removed due to options
365  if (edge != nullptr) {
366  edges.push_back(edge);
367  }
368  }
369  if (!edges.empty()) {
370  node->addCrossing(edges, crossing.width, crossing.priority,
371  crossing.customTLIndex, crossing.customTLIndex2, crossing.customShape, true, &crossing);
372  }
373  }
374  }
376  // add walking area custom shapes
377  for (const auto& item : myWACustomShapes) {
378  std::string nodeID = SUMOXMLDefinitions::getJunctionIDFromInternalEdge(item.first);
379  NBNode* node = myNodeCont.retrieve(nodeID);
380  std::vector<std::string> edgeIDs;
381  if (item.second.fromEdges.size() + item.second.toEdges.size() == 0) {
382  // must be a split crossing
383  assert(item.second.fromCrossed.size() > 0);
384  assert(item.second.toCrossed.size() > 0);
385  edgeIDs = item.second.fromCrossed;
386  edgeIDs.insert(edgeIDs.end(), item.second.toCrossed.begin(), item.second.toCrossed.end());
387  } else if (item.second.fromEdges.size() > 0) {
388  edgeIDs = item.second.fromEdges;
389  } else {
390  edgeIDs = item.second.toEdges;
391  }
392  EdgeVector edges;
393  for (const std::string& edgeID : edgeIDs) {
394  NBEdge* edge = myNetBuilder.getEdgeCont().retrieve(edgeID);
395  // edge might have been removed due to options
396  if (edge != nullptr) {
397  edges.push_back(edge);
398  }
399  }
400  if (edges.size() > 0) {
401  node->addWalkingAreaShape(edges, item.second.shape, item.second.width);
402  }
403  }
404  }
405  // add roundabouts
406  for (const std::vector<std::string>& ra : myRoundabouts) {
407  EdgeSet roundabout;
408  for (const std::string& edgeID : ra) {
409  NBEdge* edge = myNetBuilder.getEdgeCont().retrieve(edgeID);
410  if (edge == nullptr) {
411  if (!myNetBuilder.getEdgeCont().wasIgnored(edgeID)) {
412  WRITE_ERRORF(TL("Unknown edge '%' in roundabout"), (edgeID));
413  }
414  } else {
415  roundabout.insert(edge);
416  }
417  }
418  myNetBuilder.getEdgeCont().addRoundabout(roundabout);
419  }
420 }
421 
422 
423 void
425  const SUMOSAXAttributes& attrs) {
426  /* our goal is to reproduce the input net faithfully
427  * there are different types of objects in the netfile:
428  * 1) those which must be loaded into NBNetBuilder-Containers for processing
429  * 2) those which can be ignored because they are recomputed based on group 1
430  * 3) those which are of no concern to NBNetBuilder but should be exposed to
431  * netedit. We will probably have to patch NBNetBuilder to contain them
432  * and hand them over to netedit
433  * alternative idea: those shouldn't really be contained within the
434  * network but rather in separate files. teach netedit how to open those
435  * (POI?)
436  * 4) those which are of concern neither to NBNetBuilder nor netedit and
437  * must be copied over - need to patch NBNetBuilder for this.
438  * copy unknown by default
439  */
440  switch (element) {
441  case SUMO_TAG_NET: {
442  bool ok;
443  myNetworkVersion = StringUtils::toVersion(attrs.get<std::string>(SUMO_ATTR_VERSION, nullptr, ok, false));
444  myAmLefthand = attrs.getOpt<bool>(SUMO_ATTR_LEFTHAND, nullptr, ok, false);
445  myCornerDetail = attrs.getOpt<int>(SUMO_ATTR_CORNERDETAIL, nullptr, ok, 0);
446  myLinkDetail = attrs.getOpt<int>(SUMO_ATTR_LINKDETAIL, nullptr, ok, -1);
447  myRectLaneCut = attrs.getOpt<bool>(SUMO_ATTR_RECTANGULAR_LANE_CUT, nullptr, ok, false);
448  myWalkingAreas = attrs.getOpt<bool>(SUMO_ATTR_WALKINGAREAS, nullptr, ok, false);
449  myLimitTurnSpeed = attrs.getOpt<double>(SUMO_ATTR_LIMIT_TURN_SPEED, nullptr, ok, -1);
450  myCheckLaneFoesAll = attrs.getOpt<bool>(SUMO_ATTR_CHECKLANEFOES_ALL, nullptr, ok, false);
451  myCheckLaneFoesRoundabout = attrs.getOpt<bool>(SUMO_ATTR_CHECKLANEFOES_ROUNDABOUT, nullptr, ok, true);
453  myDefaultSpreadType = attrs.getOpt<std::string>(SUMO_ATTR_SPREADTYPE, nullptr, ok, myDefaultSpreadType);
459  // derived
460  const OptionsCont& oc = OptionsCont::getOptions();
461  myChangeLefthand = !oc.isDefault("lefthand") && (oc.getBool("lefthand") != myAmLefthand);
462 
463  break;
464  }
465  case SUMO_TAG_EDGE:
466  addEdge(attrs);
467  break;
468  case SUMO_TAG_LANE:
469  addLane(attrs);
470  break;
471  case SUMO_TAG_STOPOFFSET: {
472  bool ok = true;
473  addStopOffsets(attrs, ok);
474  }
475  break;
476  case SUMO_TAG_NEIGH:
478  break;
479  case SUMO_TAG_JUNCTION:
480  addJunction(attrs);
481  break;
482  case SUMO_TAG_REQUEST:
483  addRequest(attrs);
484  break;
485  case SUMO_TAG_CONNECTION:
486  addConnection(attrs);
487  break;
488  case SUMO_TAG_TLLOGIC:
490  if (myCurrentTL) {
491  myLastParameterised.push_back(myCurrentTL);
492  }
493  break;
494  case SUMO_TAG_PHASE:
495  addPhase(attrs, myCurrentTL);
496  break;
497  case SUMO_TAG_LOCATION:
498  delete myLocation;
499  myLocation = loadLocation(attrs);
500  break;
502  addProhibition(attrs);
503  break;
504  case SUMO_TAG_ROUNDABOUT:
505  addRoundabout(attrs);
506  break;
507  case SUMO_TAG_PARAM:
508  if (myLastParameterised.size() != 0) {
509  bool ok = true;
510  const std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, nullptr, ok);
511  if (myDiscardableParams.count(key) == 0) {
512  // circumventing empty string test
513  const std::string val = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : "";
514  myLastParameterised.back()->setParameter(key, val);
515  }
516  }
517  break;
518  default:
519  myTypesHandler.myStartElement(element, attrs);
520  break;
521  }
522 }
523 
524 
525 void
527  switch (element) {
528  case SUMO_TAG_EDGE:
529  if (myCurrentEdge != nullptr) {
530  if (myEdges.find(myCurrentEdge->id) != myEdges.end()) {
531  WRITE_WARNINGF(TL("Edge '%' occurred at least twice in the input."), myCurrentEdge->id);
532  for (LaneAttrs* const lane : myCurrentEdge->lanes) {
533  delete lane;
534  }
535  delete myCurrentEdge;
536  } else {
538  }
539  myCurrentEdge = nullptr;
540  myLastParameterised.pop_back();
541  }
542  break;
543  case SUMO_TAG_LANE:
544  if (myCurrentEdge != nullptr && myCurrentLane != nullptr) {
546  myCurrentEdge->lanes.push_back(myCurrentLane);
547  myLastParameterised.pop_back();
548  }
549  myCurrentLane = nullptr;
550  break;
551  case SUMO_TAG_TLLOGIC:
552  if (myCurrentTL == nullptr) {
553  WRITE_ERROR(TL("Unmatched closing tag for tl-logic."));
554  } else {
555  if (!myTLLCont.insert(myCurrentTL)) {
556  WRITE_WARNINGF(TL("Could not add program '%' for traffic light '%'"), myCurrentTL->getProgramID(), myCurrentTL->getID());
557  delete myCurrentTL;
558  }
559  myCurrentTL = nullptr;
560  myLastParameterised.pop_back();
561  }
562  break;
563  case SUMO_TAG_JUNCTION:
564  if (myCurrentJunction.node != nullptr) {
565  myLastParameterised.pop_back();
566  }
567  break;
568  case SUMO_TAG_CONNECTION:
569  // !!! this just avoids a crash but is not a real check that it was a connection
570  if (!myLastParameterised.empty()) {
571  myLastParameterised.pop_back();
572  }
573  break;
574  default:
575  break;
576  }
577 }
578 
579 
580 void
582  // get the id, report an error if not given or empty...
583  bool ok = true;
584  const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
585  if (!ok) {
586  return;
587  }
588  myCurrentEdge = new EdgeAttrs();
590  myCurrentEdge->builtEdge = nullptr;
591  myCurrentEdge->id = id;
592  // get the function
595  // add the crossing but don't do anything else
596  Crossing c(id);
597  c.crossingEdges = attrs.get<std::vector<std::string> >(SUMO_ATTR_CROSSING_EDGES, nullptr, ok);
599  return;
601  myHaveSeenInternalEdge = true;
602  return; // skip internal edges
603  }
604  // get the type
605  myCurrentEdge->type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "");
606  // get the origin and the destination node
607  myCurrentEdge->fromNode = attrs.getOpt<std::string>(SUMO_ATTR_FROM, id.c_str(), ok, "");
608  myCurrentEdge->toNode = attrs.getOpt<std::string>(SUMO_ATTR_TO, id.c_str(), ok, "");
609  myCurrentEdge->priority = attrs.getOpt<int>(SUMO_ATTR_PRIORITY, id.c_str(), ok, -1);
610  myCurrentEdge->type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "");
614  myCurrentEdge->maxSpeed = 0;
615  myCurrentEdge->streetName = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
616  myCurrentEdge->distance = attrs.getOpt<double>(SUMO_ATTR_DISTANCE, id.c_str(), ok, 0);
617  myCurrentEdge->bidi = attrs.getOpt<std::string>(SUMO_ATTR_BIDI, id.c_str(), ok, "");
618  if (myCurrentEdge->streetName != "" && OptionsCont::getOptions().isDefault("output.street-names")) {
619  OptionsCont::getOptions().set("output.street-names", "true");
620  }
621 
622  std::string lsfS = attrs.getOpt<std::string>(SUMO_ATTR_SPREADTYPE, id.c_str(), ok, myDefaultSpreadType);
623  if (SUMOXMLDefinitions::LaneSpreadFunctions.hasString(lsfS)) {
625  } else {
626  WRITE_ERRORF(TL("Unknown spreadType '%' for edge '%'."), lsfS, id);
627  }
628 }
629 
630 
631 void
633  bool ok = true;
634  std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
635  if (!ok) {
636  return;
637  }
638  if (myCurrentEdge == nullptr) {
639  WRITE_ERRORF(TL("Found lane '%' not within edge element."), id);
640  return;
641  }
642  const std::string expectedID = myCurrentEdge->id + "_" + toString(myCurrentEdge->lanes.size());
643  if (id != expectedID) {
644  WRITE_WARNINGF(TL("Renaming lane '%' to '%'."), id, expectedID);
645  }
646  myCurrentLane = new LaneAttrs();
648  myCurrentLane->customShape = attrs.getOpt<bool>(SUMO_ATTR_CUSTOMSHAPE, nullptr, ok, false);
649  myCurrentLane->shape = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok);
650  myCurrentLane->width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, id.c_str(), ok, (double) NBEdge::UNSPECIFIED_WIDTH);
651  myCurrentLane->type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "");
653  // save the width and the lane id of the crossing but don't do anything else
655  assert(crossings.size() > 0);
656  crossings.back().width = attrs.get<double>(SUMO_ATTR_WIDTH, id.c_str(), ok);
657  myLastParameterised.pop_back();
658  myLastParameterised.push_back(&crossings.back());
659  if (myCurrentLane->customShape) {
660  crossings.back().customShape = myCurrentLane->shape;
661  NBNetBuilder::transformCoordinates(crossings.back().customShape, true, myLocation);
662  }
664  // save custom shape if needed but don't do anything else
665  if (myCurrentLane->customShape) {
667  wacs.shape = myCurrentLane->shape;
668  wacs.width = myCurrentLane->width;
671  }
672  return;
674  return; // skip internal edges
675  }
676  if (attrs.hasAttribute("maxspeed")) {
677  // !!! deprecated
678  myCurrentLane->maxSpeed = attrs.getFloat("maxspeed");
679  } else {
680  myCurrentLane->maxSpeed = attrs.get<double>(SUMO_ATTR_SPEED, id.c_str(), ok);
681  }
682  myCurrentLane->friction = attrs.getOpt<double>(SUMO_ATTR_FRICTION, id.c_str(), ok, NBEdge::UNSPECIFIED_FRICTION, false); //sets 1 on empty
683  try {
684  myCurrentLane->allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, id.c_str(), ok, "", false);
685  } catch (EmptyData&) {
686  // !!! deprecated
687  myCurrentLane->allow = "";
688  }
689  myCurrentLane->disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, id.c_str(), ok, "");
690  myCurrentLane->endOffset = attrs.getOpt<double>(SUMO_ATTR_ENDOFFSET, id.c_str(), ok, (double) NBEdge::UNSPECIFIED_OFFSET);
691  myCurrentLane->accelRamp = attrs.getOpt<bool>(SUMO_ATTR_ACCELERATION, id.c_str(), ok, false);
692  myCurrentLane->changeLeft = attrs.getOpt<std::string>(SUMO_ATTR_CHANGE_LEFT, id.c_str(), ok, "");
693  myCurrentLane->changeRight = attrs.getOpt<std::string>(SUMO_ATTR_CHANGE_RIGHT, id.c_str(), ok, "");
694  if (myChangeLefthand) {
696  }
697 
698  // lane coordinates are derived (via lane spread) do not include them in convex boundary
700 }
701 
702 
703 void
705  const StopOffset offset(attrs, ok);
706  if (!ok) {
707  return;
708  }
709  // Admissibility of value will be checked in _loadNetwork(), when lengths are known
710  if (myCurrentLane == nullptr) {
712  WRITE_WARNINGF(TL("Duplicate definition of stopOffset for edge %.\nIgnoring duplicate specification."), myCurrentEdge->id);
713  } else {
714  myCurrentEdge->edgeStopOffset = offset;
715  }
716  } else {
718  WRITE_WARNINGF(TL("Duplicate definition of lane's stopOffset on edge %.\nIgnoring duplicate specifications."), myCurrentEdge->id);
719  } else {
720  myCurrentLane->laneStopOffset = offset;
721  }
722  }
723 }
724 
725 
726 void
728  // get the id, report an error if not given or empty...
729  myCurrentJunction.node = nullptr;
730  myCurrentJunction.intLanes.clear();
731  myCurrentJunction.response.clear();
732  bool ok = true;
733  std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
734  if (!ok) {
735  return;
736  }
737  if (id[0] == ':') { // internal node
738  return;
739  }
741  if (ok) {
743  // dead end is a computed status. Reset this to unknown so it will
744  // be corrected if additional connections are loaded
746  } else if (type == SumoXMLNodeType::INTERNAL) {
747  WRITE_WARNINGF("Invalid node type '%' for junction '%' in input network", toString(SumoXMLNodeType::INTERNAL), id);
749  }
750  }
751  Position pos = readPosition(attrs, id, ok);
753  NBNode* node = new NBNode(id, pos, type);
754  if (!myNodeCont.insert(node)) {
755  WRITE_WARNINGF(TL("Junction '%' occurred at least twice in the input."), id);
756  delete node;
757  myLastParameterised.push_back(myNodeCont.retrieve(id));
758  return;
759  } else {
760  myLastParameterised.push_back(node);
761  }
762  myCurrentJunction.node = node;
763  myCurrentJunction.intLanes = attrs.get<std::vector<std::string> >(SUMO_ATTR_INTLANES, nullptr, ok, false);
764  // set optional radius
765  if (attrs.hasAttribute(SUMO_ATTR_RADIUS)) {
766  node->setRadius(attrs.get<double>(SUMO_ATTR_RADIUS, id.c_str(), ok));
767  }
768  // handle custom shape
769  if (attrs.getOpt<bool>(SUMO_ATTR_CUSTOMSHAPE, id.c_str(), ok, false)) {
770  PositionVector shape = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok);
772  node->setCustomShape(shape);
773  }
775  // both types of nodes come without a tlLogic
776  myRailSignals.insert(id);
777  }
778  node->setRightOfWay(attrs.getOpt<RightOfWay>(SUMO_ATTR_RIGHT_OF_WAY, id.c_str(), ok, node->getRightOfWay()));
779  node->setFringeType(attrs.getOpt<FringeType>(SUMO_ATTR_FRINGE, id.c_str(), ok, node->getFringeType()));
780  if (attrs.hasAttribute(SUMO_ATTR_NAME)) {
781  node->setName(attrs.get<std::string>(SUMO_ATTR_NAME, id.c_str(), ok));
782  }
783 }
784 
785 
786 void
788  if (myCurrentJunction.node != nullptr) {
789  bool ok = true;
790  myCurrentJunction.response.push_back(attrs.get<std::string>(SUMO_ATTR_RESPONSE, nullptr, ok));
791  }
792 }
793 
794 
795 void
797  bool ok = true;
798  std::string fromID = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
799  if (myEdges.count(fromID) == 0) {
800  WRITE_ERRORF(TL("Unknown edge '%' given in connection."), fromID);
801  return;
802  }
803  EdgeAttrs* from = myEdges[fromID];
804  if (from->func == SumoXMLEdgeFunc::INTERNAL) {
805  // internal junction connection
806  return;
807  }
808 
809  Connection conn;
810  conn.toEdgeID = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
811  int fromLaneIdx = attrs.get<int>(SUMO_ATTR_FROM_LANE, nullptr, ok);
812  conn.toLaneIdx = attrs.get<int>(SUMO_ATTR_TO_LANE, nullptr, ok);
813  conn.tlID = attrs.getOpt<std::string>(SUMO_ATTR_TLID, nullptr, ok, "");
814  conn.mayDefinitelyPass = attrs.getOpt<bool>(SUMO_ATTR_PASS, nullptr, ok, false);
815  conn.keepClear = attrs.getOpt<bool>(SUMO_ATTR_KEEP_CLEAR, nullptr, ok, true);
816  conn.indirectLeft = attrs.getOpt<bool>(SUMO_ATTR_INDIRECT, nullptr, ok, false);
817  conn.edgeType = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, nullptr, ok, "");
818  double contPos = NBEdge::UNSPECIFIED_CONTPOS;
819  if (OptionsCont::getOptions().isSet("default.connection.cont-pos")) {
820  contPos = OptionsCont::getOptions().getFloat("default.connection.cont-pos");
821  }
822  conn.contPos = attrs.getOpt<double>(SUMO_ATTR_CONTPOS, nullptr, ok, contPos);
824  std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, nullptr, ok, "", false);
825  std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, nullptr, ok, "", false);
826  if (allow == "" && disallow == "") {
828  } else {
829  conn.permissions = parseVehicleClasses(allow, disallow, myNetworkVersion);
830  }
831  if (attrs.hasAttribute(SUMO_ATTR_CHANGE_LEFT)) {
832  conn.changeLeft = parseVehicleClasses(attrs.get<std::string>(SUMO_ATTR_CHANGE_LEFT, nullptr, ok), "");
833  } else {
835  }
837  conn.changeRight = parseVehicleClasses(attrs.get<std::string>(SUMO_ATTR_CHANGE_RIGHT, nullptr, ok), "");
838  } else {
840  }
841  if (myChangeLefthand) {
842  std::swap(conn.changeLeft, conn.changeRight);
843  }
844  conn.speed = attrs.getOpt<double>(SUMO_ATTR_SPEED, nullptr, ok, NBEdge::UNSPECIFIED_SPEED);
845  conn.friction = attrs.getOpt<double>(SUMO_ATTR_FRICTION, nullptr, ok, NBEdge::UNSPECIFIED_FRICTION);
846  conn.customLength = attrs.getOpt<double>(SUMO_ATTR_LENGTH, nullptr, ok, NBEdge::UNSPECIFIED_LOADED_LENGTH);
850  if (conn.tlID != "") {
851  conn.tlLinkIndex = attrs.get<int>(SUMO_ATTR_TLLINKINDEX, nullptr, ok);
852  conn.tlLinkIndex2 = attrs.getOpt<int>(SUMO_ATTR_TLLINKINDEX2, nullptr, ok, -1);
853  } else {
855  }
856  if ((int)from->lanes.size() <= fromLaneIdx) {
857  WRITE_ERRORF(TL("Invalid lane index '%' for connection from '%'."), toString(fromLaneIdx), fromID);
858  return;
859  }
860  from->lanes[fromLaneIdx]->connections.push_back(conn);
861  myLastParameterised.push_back(&from->lanes[fromLaneIdx]->connections.back());
862 
863  // determine crossing priority and tlIndex
864  if (myPedestrianCrossings.size() > 0) {
866  // connection from walkingArea to crossing
867  std::vector<Crossing>& crossings = myPedestrianCrossings[SUMOXMLDefinitions::getJunctionIDFromInternalEdge(fromID)];
868  for (std::vector<Crossing>::iterator it = crossings.begin(); it != crossings.end(); ++it) {
869  if (conn.toEdgeID == (*it).edgeID) {
870  if (conn.tlID != "") {
871  (*it).priority = true;
872  (*it).customTLIndex = conn.tlLinkIndex;
873  } else {
874  LinkState state = SUMOXMLDefinitions::LinkStates.get(attrs.get<std::string>(SUMO_ATTR_STATE, nullptr, ok));
875  (*it).priority = state == LINKSTATE_MAJOR;
876  }
877  }
878  }
879  } else if (from->func == SumoXMLEdgeFunc::CROSSING && myEdges[conn.toEdgeID]->func == SumoXMLEdgeFunc::WALKINGAREA) {
880  // connection from crossing to walkingArea (set optional linkIndex2)
882  if (fromID == c.edgeID) {
883  c.customTLIndex2 = attrs.getOpt<int>(SUMO_ATTR_TLLINKINDEX, nullptr, ok, -1);
884  }
885  }
886  }
887  }
888  // determine walking area reference edges
889  if (myWACustomShapes.size() > 0) {
890  EdgeAttrs* to = myEdges[conn.toEdgeID];
891  if (from->func == SumoXMLEdgeFunc::WALKINGAREA) {
892  std::map<std::string, WalkingAreaParsedCustomShape>::iterator it = myWACustomShapes.find(fromID);
893  if (it != myWACustomShapes.end()) {
894  if (to->func == SumoXMLEdgeFunc::NORMAL) {
895  // add target sidewalk as reference
896  it->second.toEdges.push_back(conn.toEdgeID);
897  } else if (to->func == SumoXMLEdgeFunc::CROSSING) {
898  // add target crossing edges as reference
900  if (conn.toEdgeID == crossing.edgeID) {
901  it->second.toCrossed.insert(it->second.toCrossed.end(), crossing.crossingEdges.begin(), crossing.crossingEdges.end());
902  }
903  }
904  }
905  }
906  } else if (to->func == SumoXMLEdgeFunc::WALKINGAREA) {
907  std::map<std::string, WalkingAreaParsedCustomShape>::iterator it = myWACustomShapes.find(conn.toEdgeID);
908  if (it != myWACustomShapes.end()) {
909  if (from->func == SumoXMLEdgeFunc::NORMAL) {
910  // add origin sidewalk as reference
911  it->second.fromEdges.push_back(fromID);
912  } else if (from->func == SumoXMLEdgeFunc::CROSSING) {
913  // add origin crossing edges as reference
915  if (fromID == crossing.edgeID) {
916  it->second.fromCrossed.insert(it->second.fromCrossed.end(), crossing.crossingEdges.begin(), crossing.crossingEdges.end());
917  }
918  }
919  }
920  }
921  }
922  }
923 }
924 
925 
926 void
928  bool ok = true;
929  std::string prohibitor = attrs.getOpt<std::string>(SUMO_ATTR_PROHIBITOR, nullptr, ok, "");
930  std::string prohibited = attrs.getOpt<std::string>(SUMO_ATTR_PROHIBITED, nullptr, ok, "");
931  if (!ok) {
932  return;
933  }
934  Prohibition p;
937  if (!ok) {
938  return;
939  }
940  myProhibitions.push_back(p);
941 }
942 
943 
946  if (currentTL) {
947  WRITE_ERRORF(TL("Definition of tl-logic '%' was not finished."), currentTL->getID());
948  return nullptr;
949  }
950  bool ok = true;
951  std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
952  SUMOTime offset = TIME2STEPS(attrs.get<double>(SUMO_ATTR_OFFSET, id.c_str(), ok));
953  std::string programID = attrs.getOpt<std::string>(SUMO_ATTR_PROGRAMID, id.c_str(), ok, "<unknown>");
954  std::string typeS = attrs.get<std::string>(SUMO_ATTR_TYPE, nullptr, ok);
955  TrafficLightType type;
956  if (SUMOXMLDefinitions::TrafficLightTypes.hasString(typeS)) {
958  } else {
959  WRITE_ERRORF(TL("Unknown traffic light type '%' for tlLogic '%'."), typeS, id);
960  return nullptr;
961  }
962  if (ok) {
963  return new NBLoadedSUMOTLDef(id, programID, offset, type);
964  } else {
965  return nullptr;
966  }
967 }
968 
969 
970 void
972  if (!currentTL) {
973  WRITE_ERROR(TL("found phase without tl-logic"));
974  return;
975  }
976  const std::string& id = currentTL->getID();
977  bool ok = true;
978  std::string state = attrs.get<std::string>(SUMO_ATTR_STATE, id.c_str(), ok);
979  SUMOTime duration = TIME2STEPS(attrs.get<double>(SUMO_ATTR_DURATION, id.c_str(), ok));
980  if (duration < 0) {
981  WRITE_ERRORF(TL("Phase duration for tl-logic '%/%' must be positive."), id, currentTL->getProgramID());
982  return;
983  }
984  // if the traffic light is an actuated traffic light, try to get the minimum and maximum durations and ends
985  std::vector<int> nextPhases = attrs.getOpt<std::vector<int> >(SUMO_ATTR_NEXT, id.c_str(), ok);
986  const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, nullptr, ok);
987  // Specific from actuated
992  // specific von NEMA
996  if (ok) {
997  currentTL->addPhase(duration, state, minDuration, maxDuration, earliestEnd, latestEnd, vehExt, yellow, red, nextPhases, name);
998  }
999 }
1000 
1001 
1003 NIImporter_SUMO::loadLocation(const SUMOSAXAttributes& attrs, bool setLoaded) {
1004  // @todo refactor parsing of location since its duplicated in NLHandler and PCNetProjectionLoader
1005  bool ok = true;
1006  GeoConvHelper* result = nullptr;
1007  PositionVector s = attrs.get<PositionVector>(SUMO_ATTR_NET_OFFSET, nullptr, ok);
1008  Boundary convBoundary = attrs.get<Boundary>(SUMO_ATTR_CONV_BOUNDARY, nullptr, ok);
1009  Boundary origBoundary = attrs.get<Boundary>(SUMO_ATTR_ORIG_BOUNDARY, nullptr, ok);
1010  std::string proj = attrs.get<std::string>(SUMO_ATTR_ORIG_PROJ, nullptr, ok);
1011  if (ok) {
1012  Position networkOffset = s[0];
1013  result = new GeoConvHelper(proj, networkOffset, origBoundary, convBoundary);
1014  result->resolveAbstractProjection();
1015  if (setLoaded) {
1016  GeoConvHelper::setLoaded(*result);
1017  }
1018  }
1019  return result;
1020 }
1021 
1022 
1023 Position
1024 NIImporter_SUMO::readPosition(const SUMOSAXAttributes& attrs, const std::string& id, bool& ok) {
1025  const double x = attrs.get<double>(SUMO_ATTR_X, id.c_str(), ok);
1026  const double y = attrs.get<double>(SUMO_ATTR_Y, id.c_str(), ok);
1027  const double z = attrs.getOpt<double>(SUMO_ATTR_Z, id.c_str(), ok, 0.);
1028  return Position(x, y, z);
1029 }
1030 
1031 
1032 void
1033 NIImporter_SUMO::parseProhibitionConnection(const std::string& attr, std::string& from, std::string& to, bool& ok) {
1034  // split from/to
1035  const std::string::size_type div = attr.find("->");
1036  if (div == std::string::npos) {
1037  WRITE_ERRORF(TL("Missing connection divider in prohibition attribute '%'"), attr);
1038  ok = false;
1039  }
1040  from = attr.substr(0, div);
1041  to = attr.substr(div + 2);
1042  // check whether the edges are known
1043  if (myEdges.count(from) == 0) {
1044  WRITE_ERRORF(TL("Unknown edge prohibition '%'"), from);
1045  ok = false;
1046  }
1047  if (myEdges.count(to) == 0) {
1048  WRITE_ERRORF(TL("Unknown edge prohibition '%'"), to);
1049  ok = false;
1050  }
1051 }
1052 
1053 
1054 void
1056  bool ok = true;
1057  const std::vector<std::string>& edgeIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_EDGES, nullptr, ok);
1058  if (ok) {
1059  myRoundabouts.push_back(edgeIDs);
1060  }
1061 }
1062 
1063 
1064 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
#define WRITE_WARNINGF(...)
Definition: MsgHandler.h:296
#define WRITE_ERRORF(...)
Definition: MsgHandler.h:305
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:304
#define PROGRESS_BEGIN_TIME_MESSAGE(msg)
Definition: MsgHandler.h:301
#define TL(string)
Definition: MsgHandler.h:315
#define PROGRESS_TIME_MESSAGE(before)
Definition: MsgHandler.h:302
std::set< NBEdge * > EdgeSet
container for unique edges
Definition: NBCont.h:50
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
Definition: NBCont.h:35
@ KEEPCLEAR_FALSE
Definition: NBCont.h:59
@ KEEPCLEAR_TRUE
Definition: NBCont.h:60
#define TIME2STEPS(x)
Definition: SUMOTime.h:57
std::set< std::string > deprecatedVehicleClassesSeen
const SVCPermissions SVC_UNSPECIFIED
permissions not specified
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
@ RIGHT
At the rightmost side of the lane.
TrafficLightType
@ SUMO_TAG_PHASE
a single phase description
@ SUMO_TAG_NET
root element of a network file
@ SUMO_TAG_STOPOFFSET
Information on vClass specific stop offsets at lane end.
@ SUMO_TAG_REQUEST
description of a logic request within the junction
@ SUMO_TAG_PROHIBITION
prohibition of circulation between two edges
@ SUMO_TAG_LOCATION
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_ROUNDABOUT
roundabout defined in junction
@ SUMO_TAG_TLLOGIC
a traffic light logic
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_PARAM
parameter associated to a certain key
@ SUMO_TAG_NEIGH
begin/end of the description of a neighboring lane
@ SUMO_TAG_EDGE
begin/end of the description of an edge
LaneSpreadFunction
Numbers representing special SUMO-XML-attribute values Information how the edge's lateral offset shal...
FringeType
classifying boundary nodes
SumoXMLEdgeFunc
Numbers representing special SUMO-XML-attribute values for representing edge functions used in netbui...
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_MAJOR
This is an uncontrolled, major link, may pass.
SumoXMLNodeType
Numbers representing special SUMO-XML-attribute values for representing node- (junction-) types used ...
RightOfWay
algorithms for computing right of way
@ SUMO_ATTR_JUNCTIONS_MINIMAL_SHAPE
@ SUMO_ATTR_DISALLOW
@ SUMO_ATTR_CONV_BOUNDARY
@ SUMO_ATTR_ALLOW
@ SUMO_ATTR_LANE
@ SUMO_ATTR_NET_OFFSET
@ SUMO_ATTR_ORIG_BOUNDARY
@ SUMO_ATTR_LATEST_END
The maximum time within the cycle for switching (for coordinated actuation)
@ SUMO_ATTR_TLLINKINDEX2
link: the index of the opposite direction link of a pedestrian crossing
@ SUMO_ATTR_RED
red duration of a phase
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_LINKDETAIL
@ SUMO_ATTR_VALUE
@ SUMO_ATTR_CORNERDETAIL
@ SUMO_ATTR_RADIUS
The turning radius at an intersection in m.
@ SUMO_ATTR_INDIRECT
Whether this connection is an indirect (left) turn.
@ SUMO_ATTR_RECTANGULAR_LANE_CUT
@ SUMO_ATTR_Y
@ SUMO_ATTR_FROM_LANE
@ SUMO_ATTR_Z
@ SUMO_ATTR_RESPONSE
@ SUMO_ATTR_LIMIT_TURN_SPEED
@ SUMO_ATTR_CHECKLANEFOES_ROUNDABOUT
@ SUMO_ATTR_OFFSET
@ SUMO_ATTR_X
@ SUMO_ATTR_AVOID_OVERLAP
@ SUMO_ATTR_YELLOW
yellow duration of a phase
@ SUMO_ATTR_CUSTOMSHAPE
whether a given shape is user-defined
@ SUMO_ATTR_INTLANES
@ SUMO_ATTR_VEHICLEEXTENSION
vehicle extension time of a phase
@ SUMO_ATTR_EDGES
the edges of a route
@ SUMO_ATTR_FRINGE
Fringe type of node.
@ SUMO_ATTR_BIDI
@ SUMO_ATTR_PROHIBITED
@ SUMO_ATTR_PRIORITY
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_LEFTHAND
@ SUMO_ATTR_NEXT
succesor phase index
@ SUMO_ATTR_CHANGE_LEFT
@ SUMO_ATTR_NAME
@ SUMO_ATTR_ORIG_PROJ
@ SUMO_ATTR_JUNCTIONS_ENDPOINT_SHAPE
@ SUMO_ATTR_CHECKLANEFOES_ALL
@ SUMO_ATTR_SPREADTYPE
The information about how to spread the lanes from the given position.
@ SUMO_ATTR_PASS
@ SUMO_ATTR_ENDOFFSET
@ SUMO_ATTR_HIGHER_SPEED
@ SUMO_ATTR_TO
@ SUMO_ATTR_FROM
@ SUMO_ATTR_ACCELERATION
@ SUMO_ATTR_CHANGE_RIGHT
@ SUMO_ATTR_TLID
link,node: the traffic light id responsible for this link
@ SUMO_ATTR_DISTANCE
@ SUMO_ATTR_TO_LANE
@ SUMO_ATTR_UNCONTROLLED
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_LENGTH
@ SUMO_ATTR_VERSION
@ SUMO_ATTR_ID
@ SUMO_ATTR_MAXDURATION
maximum duration of a phase
@ SUMO_ATTR_RIGHT_OF_WAY
How to compute right of way.
@ SUMO_ATTR_PROGRAMID
@ SUMO_ATTR_FUNCTION
@ SUMO_ATTR_VISIBILITY_DISTANCE
foe visibility distance of a link
@ SUMO_ATTR_PROHIBITOR
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_CONTPOS
@ SUMO_ATTR_WIDTH
@ SUMO_ATTR_CROSSING_EDGES
the edges crossed by a pedestrian crossing
@ SUMO_ATTR_TLS_IGNORE_INTERNAL_JUNCTION_JAM
@ SUMO_ATTR_TLLINKINDEX
link: the index of the link within the traffic light
@ SUMO_ATTR_MINDURATION
@ SUMO_ATTR_KEY
@ SUMO_ATTR_KEEP_CLEAR
Whether vehicles must keep the junction clear.
@ SUMO_ATTR_INTERNAL_JUNCTIONS_VEHICLE_WIDTH
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_FRICTION
@ SUMO_ATTR_WALKINGAREAS
@ SUMO_ATTR_EARLIEST_END
The minimum time within the cycle for switching (for coordinated actuation)
T MAX2(T a, T b)
Definition: StdDefs.h:82
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:39
static bool isReadable(std::string path)
Checks whether the given file is readable.
Definition: FileHelpers.cpp:51
void setFileName(const std::string &name)
Sets the current file name.
static methods for processing the coordinates conversion for the current net
Definition: GeoConvHelper.h:53
void resolveAbstractProjection()
init projString such as 'UTM' in loaded projection
static void setLoaded(const GeoConvHelper &loaded)
sets the coordinate transformation loaded from a location element
static const int InvalidTlIndex
Definition: NBConnection.h:123
void addRoundabout(const EdgeSet &roundabout)
add user specified roundabout
void erase(NBDistrictCont &dc, NBEdge *edge)
Removes the given edge from the container (deleting it)
Definition: NBEdgeCont.cpp:411
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
Definition: NBEdgeCont.cpp:281
bool ignoreFilterMatch(NBEdge *edge)
Returns true if this edge matches one of the removal criteria.
Definition: NBEdgeCont.cpp:203
void ignore(std::string id)
mark the given edge id as ignored
Definition: NBEdgeCont.h:486
bool wasIgnored(std::string id) const
Returns whether the edge with the id was ignored during parsing.
Definition: NBEdgeCont.h:481
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
Definition: NBEdgeCont.cpp:182
The representation of a single edge during network building.
Definition: NBEdge.h:92
void setPermittedChanging(int lane, SVCPermissions changeLeft, SVCPermissions changeRight)
set allowed classes for changing to the left and right from the given lane
Definition: NBEdge.cpp:4359
void setPermissions(SVCPermissions permissions, int lane=-1)
set allowed/disallowed classes for the given lane or for all lanes if -1 is given
Definition: NBEdge.cpp:4331
void setSpeed(int lane, double speed)
set lane specific speed (negative lane implies set for all lanes)
Definition: NBEdge.cpp:4283
double getLaneWidth() const
Returns the default width of lanes of this edge.
Definition: NBEdge.h:638
Connection & getConnectionRef(int fromLane, const NBEdge *to, int toLane)
Returns reference to the specified connection This method goes through "myConnections" and returns th...
Definition: NBEdge.cpp:1306
static const double UNSPECIFIED_FRICTION
unspecified lane friction
Definition: NBEdge.h:351
static const bool UNSPECIFIED_CONNECTION_UNCONTROLLED
TLS-controlled despite its node controlled not specified.
Definition: NBEdge.h:372
bool addLane2LaneConnection(int fromLane, NBEdge *dest, int toLane, Lane2LaneInfoType type, bool mayUseSameDestination=false, bool mayDefinitelyPass=false, KeepClear keepClear=KEEPCLEAR_UNSPECIFIED, double contPos=UNSPECIFIED_CONTPOS, double visibility=UNSPECIFIED_VISIBILITY_DISTANCE, double speed=UNSPECIFIED_SPEED, double friction=UNSPECIFIED_FRICTION, double length=myDefaultConnectionLength, const PositionVector &customShape=PositionVector::EMPTY, const bool uncontrolled=UNSPECIFIED_CONNECTION_UNCONTROLLED, SVCPermissions permissions=SVC_UNSPECIFIED, const bool indirectLeft=false, const std::string &edgeType="", SVCPermissions changeLeft=SVC_UNSPECIFIED, SVCPermissions changeRight=SVC_UNSPECIFIED, bool postProcess=false)
Adds a connection between the specified this edge's lane and an approached one.
Definition: NBEdge.cpp:1126
void setDistance(double distance)
set kilometrage at start of edge (negative value implies couting down along the edge)
Definition: NBEdge.h:1409
bool setEdgeStopOffset(int lane, const StopOffset &offset, bool overwrite=false)
set lane and vehicle class specific stopOffset (negative lane implies set for all lanes)
Definition: NBEdge.cpp:4253
bool hasLaneSpecificStopOffsets() const
whether lanes differ in stopOffsets
Definition: NBEdge.cpp:2493
const std::string & getID() const
Definition: NBEdge.h:1524
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
Definition: NBEdge.h:726
NBNode * getToNode() const
Returns the destination node of the edge.
Definition: NBEdge.h:542
static const double UNSPECIFIED_LOADED_LENGTH
no length override given
Definition: NBEdge.h:360
void setLaneWidth(int lane, double width)
set lane specific width (negative lane implies set for all lanes)
Definition: NBEdge.cpp:4154
void setAcceleration(int lane, bool accelRamp)
marks one lane as acceleration lane
Definition: NBEdge.cpp:4315
const StopOffset & getEdgeStopOffset() const
Returns the stopOffset to the end of the edge.
Definition: NBEdge.cpp:4221
void setBidi(bool isBidi)
mark this edge as a bidi edge
Definition: NBEdge.h:1414
void setFriction(int lane, double friction)
set lane specific friction (negative lane implies set for all lanes)
Definition: NBEdge.cpp:4299
static const double UNSPECIFIED_CONTPOS
unspecified internal junction position
Definition: NBEdge.h:354
static const double UNSPECIFIED_VISIBILITY_DISTANCE
unspecified foe visibility for connections
Definition: NBEdge.h:357
bool hasLaneSpecificWidth() const
whether lanes differ in width
Definition: NBEdge.cpp:2460
static const double UNSPECIFIED_SPEED
unspecified lane speed
Definition: NBEdge.h:348
@ VALIDATED
The connection was computed and validated.
bool hasLaneSpecificEndOffset() const
whether lanes differ in offset
Definition: NBEdge.cpp:2482
void setLaneShape(int lane, const PositionVector &shape)
sets a custom lane shape
Definition: NBEdge.cpp:4323
static const double UNSPECIFIED_WIDTH
unspecified lane width
Definition: NBEdge.h:342
void declareConnectionsAsLoaded(EdgeBuildingStep step=EdgeBuildingStep::LANES2LANES_USER)
declares connections as fully loaded. This is needed to avoid recomputing connections if an edge has ...
Definition: NBEdge.h:1438
double getEndOffset() const
Returns the offset to the destination node.
Definition: NBEdge.h:685
void setEndOffset(int lane, double offset)
set lane specific end-offset (negative lane implies set for all lanes)
Definition: NBEdge.cpp:4237
static const double UNSPECIFIED_OFFSET
unspecified lane offset
Definition: NBEdge.h:345
Lane & getLaneStruct(int lane)
Definition: NBEdge.h:1424
void setLoadedLength(double val)
set loaded length
Definition: NBEdge.cpp:4383
NBNode * getFromNode() const
Returns the origin node of the edge.
Definition: NBEdge.h:535
A loaded (complete) traffic light logic.
void addPhase(const SUMOTime duration, const std::string &state, const SUMOTime minDur, const SUMOTime maxDur, const SUMOTime earliestEnd, const SUMOTime latestEnd, const SUMOTime vehExt, const SUMOTime yellow, const SUMOTime red, const std::vector< int > &next, const std::string &name)
Adds a phase to the logic the new phase is inserted at the end of the list of already added phases.
void addConnection(NBEdge *from, NBEdge *to, int fromLane, int toLane, int linkIndex, int linkIndex2, bool reconstruct=true)
Adds a connection and immediately informs the edges.
Instance responsible for building networks.
Definition: NBNetBuilder.h:107
static bool transformCoordinates(PositionVector &from, bool includeInBoundary=true, GeoConvHelper *from_srs=nullptr)
NBDistrictCont & getDistrictCont()
Returns a reference the districts container.
Definition: NBNetBuilder.h:159
static int addGeometrySegments(PositionVector &from, const PositionVector &cartesian, const double maxLength)
insertion geometry points to ensure maximum segment length between points
void setHaveNetworkCrossings(bool value)
enable crossing in networks
Definition: NBNetBuilder.h:188
NBEdgeCont & getEdgeCont()
Definition: NBNetBuilder.h:139
static bool transformCoordinate(Position &from, bool includeInBoundary=true, GeoConvHelper *from_srs=nullptr)
transforms loaded coordinates handles projections, offsets (using GeoConvHelper) and import of height...
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
Definition: NBNodeCont.cpp:87
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
Definition: NBNodeCont.cpp:116
Represents a single node (junction) during network building.
Definition: NBNode.h:66
void addWalkingAreaShape(EdgeVector edges, const PositionVector &shape, double width)
add custom shape for walkingArea
Definition: NBNode.cpp:3771
RightOfWay getRightOfWay() const
Returns hint on how to compute right of way.
Definition: NBNode.h:300
NBNode::Crossing * addCrossing(EdgeVector edges, double width, bool priority, int tlIndex=-1, int tlIndex2=-1, const PositionVector &customShape=PositionVector::EMPTY, bool fromSumoNet=false, const Parameterised *params=nullptr)
add a pedestrian crossing to this node
Definition: NBNode.cpp:3837
FringeType getFringeType() const
Returns fringe type.
Definition: NBNode.h:305
SumoXMLNodeType getType() const
Returns the type of this node.
Definition: NBNode.h:285
bool isTrafficLight() const
Definition: NBNode.h:822
void setRightOfWay(RightOfWay rightOfWay)
set method for computing right-of-way
Definition: NBNode.h:569
void setCustomShape(const PositionVector &shape)
set the junction shape
Definition: NBNode.cpp:2620
void addSortedLinkFoes(const NBConnection &mayDrive, const NBConnection &mustStop)
add shorted link FOES
Definition: NBNode.cpp:1886
void setRadius(double radius)
set the turning radius
Definition: NBNode.h:559
void setName(const std::string &name)
set intersection name
Definition: NBNode.h:579
const Position & getPosition() const
Definition: NBNode.h:260
void setFringeType(FringeType fringeType)
set method for computing right-of-way
Definition: NBNode.h:574
const std::string & getProgramID() const
Returns the ProgramID.
static const SUMOTime UNSPECIFIED_DURATION
const std::map< std::string, NBTrafficLightDefinition * > & getPrograms(const std::string &id) const
Returns all programs for the given tl-id.
bool insert(NBTrafficLightDefinition *logic, bool forceInsert=false)
Adds a logic definition to the dictionary.
A connection description.
PositionVector customShape
custom shape connection
std::string tlID
The id of the traffic light that controls this connection.
double speed
custom speed for connection
std::string edgeType
optional edge type
std::string toEdgeID
The id of the target edge.
double customLength
custom length for connection
double contPos
custom position for internal junction on this connection
int toLaneIdx
The index of the target lane.
double friction
custom friction for connection
int tlLinkIndex
The index of this connection within the controlling traffic light.
bool indirectLeft
Whether this connection is an indirect left turn.
double visibility
custom foe visibility for connection
bool mayDefinitelyPass
Information about being definitely free to drive (on-ramps)
SVCPermissions changeLeft
custom lane changing permissions for connection
SVCPermissions changeRight
custom lane changing permissions for connection
bool uncontrolled
if set to true, This connection will not be TLS-controlled despite its node being controlled.
SVCPermissions permissions
custom permissions for connection
Describes the values found in an edge's definition and this edge's lanes.
std::string bidi
the bidi edge
LaneSpreadFunction lsf
The lane spread function.
std::vector< LaneAttrs * > lanes
The friction on this edge.
StopOffset edgeStopOffset
This edge's vehicle specific stop offsets (used for lanes, that do not have a specified stopOffset)
PositionVector shape
This edges's shape.
int priority
This edge's priority.
std::string toNode
The node this edge ends at.
std::string type
This edge's type.
double maxSpeed
The maximum velocity allowed on this edge (!!!)
NBEdge * builtEdge
The built edge.
SumoXMLEdgeFunc func
This edge's function.
std::string streetName
This edge's street name.
std::string fromNode
The node this edge starts at.
double length
The length of the edge if set explicitly.
std::string id
This edge's id.
double distance
The position at the start of this edge (kilometrage/mileage)
Describes the values found in a lane's definition.
double maxSpeed
The maximum velocity allowed on this lane.
double friction
The friction on this lane.
std::string changeRight
This lane's vehicle classes allowed to change right.
double endOffset
This lane's offset from the intersection.
bool accelRamp
Whether this lane is an acceleration lane.
std::string oppositeID
This lane's opposite lane.
std::string type
the type of this lane
std::vector< Connection > connections
This lane's connections.
bool customShape
Whether this lane has a custom shape.
StopOffset laneStopOffset
This lane's vehicle specific stop offsets.
PositionVector shape
This lane's shape (may be custom)
std::string changeLeft
This lane's vehicle classes allowed to change left.
double width
The width of this lane.
std::string disallow
This lane's disallowed vehicle classes.
std::string allow
This lane's allowed vehicle classes.
Importer for networks stored in SUMO format.
GeoConvHelper * myLocation
The coordinate transformation which was used to build the loaded network.
static NBLoadedSUMOTLDef * initTrafficLightLogic(const SUMOSAXAttributes &attrs, NBLoadedSUMOTLDef *currentTL)
begins the reading of a traffic lights logic
void parseProhibitionConnection(const std::string &attr, std::string &from, std::string &to, bool &ok)
parses connection string of a prohibition (very old school)
~NIImporter_SUMO()
Destructor.
NIXMLTypesHandler myTypesHandler
The handler for parsing edge types and restrictions.
int myCornerDetail
the level of corner detail in the loaded network
bool myCheckLaneFoesAll
whether foe-relationships where checked at lane-level
double myLimitTurnSpeed
whether turning speed was limited in the network
std::set< std::string > myRailSignals
list of node id with rail signals (no NBTrafficLightDefinition exists)
bool myGeomAvoidOverlap
overlap option for loaded network
std::map< std::string, std::vector< Crossing > > myPedestrianCrossings
The pedestrian crossings found in the network.
bool myCheckLaneFoesRoundabout
JunctionAttrs myCurrentJunction
The currently parsed junction definition to help in reconstructing crossings.
static GeoConvHelper * loadLocation(const SUMOSAXAttributes &attrs, bool setLoaded=true)
Parses network location description and registers it with GeoConveHelper::setLoaded.
void addJunction(const SUMOSAXAttributes &attrs)
Parses a junction and saves it in the node control.
bool myAmLefthand
whether the loaded network was built for lefthand traffic
bool myRectLaneCut
whether all lanes of an edge should have the same stop line
std::vector< Parameterised * > myLastParameterised
element to receive parameters
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
double myInternalJunctionsVehicleWidth
custom settings for internal junction computation
std::string myDefaultSpreadType
default spreadType defined in the network
bool myJunctionsHigherSpeed
higherSpeed option for loaded network
NBLoadedSUMOTLDef * myCurrentTL
The currently parsed traffic light.
static void loadNetwork(OptionsCont &oc, NBNetBuilder &nb)
Loads content of the optionally given SUMO file.
std::vector< std::vector< std::string > > myRoundabouts
loaded roundabout edges
bool myChangeLefthand
whether the the written network should have a different "handedness" (LHT/RHT) than the loaded networ...
void addConnection(const SUMOSAXAttributes &attrs)
Parses a connection and saves it into the lane's definition stored in "myCurrentLane".
void addEdge(const SUMOSAXAttributes &attrs)
Parses an edge and stores the values in "myCurrentEdge".
LaneAttrs * myCurrentLane
The currently parsed lanes's definition (to add the shape to)
void addLane(const SUMOSAXAttributes &attrs)
Parses a lane and stores the values in "myCurrentLane".
NBNodeCont & myNodeCont
The node container to fill.
EdgeAttrs * myCurrentEdge
The currently parsed edge's definition (to add loaded lanes to)
NBNetBuilder & myNetBuilder
The network builder to fill.
void addRoundabout(const SUMOSAXAttributes &attrs)
Parses a roundabout and stores it in myEdgeCont.
std::vector< Prohibition > myProhibitions
Loaded prohibitions.
MMVersion myNetworkVersion
the loaded network version
void _loadNetwork(OptionsCont &oc)
load the network
void myEndElement(int element)
Called when a closing tag occurs.
bool myTlsIgnoreInternalJunctionJam
whether some right-of-way checks at traffic light junctions should be disabled
bool myJunctionsMinimalShape
custom settings for junction shape computation
void addStopOffsets(const SUMOSAXAttributes &attrs, bool &ok)
parses stop offsets for the current lane or edge
static Position readPosition(const SUMOSAXAttributes &attrs, const std::string &id, bool &ok)
read position from the given attributes, attribute errors to id
static void addPhase(const SUMOSAXAttributes &attrs, NBLoadedSUMOTLDef *currentTL)
adds a phase to the traffic lights logic currently build
int myLinkDetail
the level of geometry detail for internal lanes in the loaded network
std::map< std::string, WalkingAreaParsedCustomShape > myWACustomShapes
Map from walkingArea edge IDs to custom shapes.
bool myWalkingAreas
whether walkingareas must be built
NBTrafficLightLogicCont & myTLLCont
The node container to fill.
NIImporter_SUMO(NBNetBuilder &nb)
Constructor.
void addProhibition(const SUMOSAXAttributes &attrs)
Parses a prohibition and saves it.
void addRequest(const SUMOSAXAttributes &attrs)
Parses a reques and saves selected attributes in myCurrentJunction.
std::set< std::string > myDiscardableParams
list of parameter keys to discard
std::map< std::string, EdgeAttrs * > myEdges
Loaded edge definitions.
bool myHaveSeenInternalEdge
whether the loaded network contains internal lanes
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag; Parses edge type information.
const std::string & getID() const
Returns the id.
Definition: Named.h:74
A storage for options typed value containers)
Definition: OptionsCont.h:89
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.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
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)
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:60
bool isUsableFileList(const std::string &name) const
Checks whether the named option is usable as a file list (with at least a single file)
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
void updateParameters(const Parameterised::Map &mapArg)
Adds or updates all given parameters from the map.
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
A list of positions.
static const PositionVector EMPTY
empty Vector
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
SUMOTime getOptSUMOTimeReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
double getFloat(int id) const
Returns the double-value of the named (by its enum-value) attribute.
SAX-handler base for SUMO-files.
static StringBijection< LaneSpreadFunction > LaneSpreadFunctions
lane spread functions
static StringBijection< TrafficLightType > TrafficLightTypes
traffic light types
static StringBijection< LinkState > LinkStates
link states
static std::string getJunctionIDFromInternalEdge(const std::string internalEdge)
return the junction id when given an edge of type internal, crossing or WalkingArea
stop offset
bool isDefined() const
check if stopOffset was defined
T get(const std::string &str) const
static MMVersion toVersion(const std::string &sData)
parse a (network) version string
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false, const bool isRoute=false, const bool isExternal=false, const bool catchExceptions=true)
Runs the given handler on the given file; returns if everything's ok.
Definition: XMLSubSys.cpp:148
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Definition: json.hpp:21884
std::string type
the type of this lane
Definition: NBEdge.h:192
std::string oppositeID
An opposite lane ID, if given.
Definition: NBEdge.h:179
Describes a pedestrian crossing.
std::vector< std::string > crossingEdges
std::vector< std::string > response
std::vector< std::string > intLanes
Describes the values found in a prohibition.
Describes custom shape for a walking area during parsing.