Eclipse SUMO - Simulation of Urban MObility
RODFDetectorHandler.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 // A handler for loading detector descriptions
22 /****************************************************************************/
23 #include <config.h>
24 
25 #include <string>
31 #include <utils/common/ToString.h>
34 #include "RODFDetectorHandler.h"
35 #include "RODFNet.h"
36 
37 
38 // ===========================================================================
39 // method definitions
40 // ===========================================================================
42  const std::string& file)
43  : SUMOSAXHandler(file),
44  myNet(optNet), myIgnoreErrors(ignoreErrors), myContainer(con) {}
45 
46 
48 
49 
50 void
52  const SUMOSAXAttributes& attrs) {
53  if (element == SUMO_TAG_DETECTOR_DEFINITION || element == SUMO_TAG_E1DETECTOR || element == SUMO_TAG_INDUCTION_LOOP) {
54  try {
55  bool ok = true;
56  // get the id, report an error if not given or empty...
57  std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
58  if (!ok) {
59  throw ProcessError();
60  }
61  std::string lane = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), ok);
62  if (!ok) {
63  throw ProcessError();
64  }
66  int laneIndex = SUMOXMLDefinitions::getIndexFromLane(lane);
67  if (edge == nullptr || laneIndex >= edge->getNumLanes()) {
68  throw ProcessError("Unknown lane '" + lane + "' for detector '" + id + "' in '" + getFileName() + "'.");
69  }
70  double pos = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), ok);
71  std::string mml_type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "");
72  if (!ok) {
73  throw ProcessError();
74  }
76  if (mml_type == "between") {
77  type = BETWEEN_DETECTOR;
78  } else if (mml_type == "source" || mml_type == "highway_source") { // !!! highway-source is legacy (removed accoring output on 06.08.2007)
79  type = SOURCE_DETECTOR;
80  } else if (mml_type == "sink") {
81  type = SINK_DETECTOR;
82  }
83  RODFDetector* detector = new RODFDetector(id, lane, pos, type);
84  if (!myContainer.addDetector(detector)) {
85  delete detector;
86  throw ProcessError(TLF("Could not add detector '%' (probably the id is already used).", id));
87  }
88  } catch (ProcessError& e) {
89  if (myIgnoreErrors) {
90  WRITE_WARNING(e.what());
91  } else {
92  throw e;
93  }
94  }
95  }
96 }
97 
98 
99 /****************************************************************************/
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:295
#define TLF(string,...)
Definition: MsgHandler.h:317
RODFDetectorType
Numerical representation of different detector types.
Definition: RODFDetector.h:56
@ BETWEEN_DETECTOR
An in-between detector.
Definition: RODFDetector.h:64
@ SINK_DETECTOR
Definition: RODFDetector.h:68
@ SOURCE_DETECTOR
A source detector.
Definition: RODFDetector.h:67
@ TYPE_NOT_DEFINED
A not yet defined detector.
Definition: RODFDetector.h:58
@ SUMO_TAG_E1DETECTOR
an e1 detector
@ SUMO_TAG_DETECTOR_DEFINITION
definition of a detector
@ SUMO_TAG_INDUCTION_LOOP
alternative tag for e1 detector
@ SUMO_ATTR_LANE
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_ID
@ SUMO_ATTR_POSITION
const std::string & getFileName() const
returns the current file name
A container for RODFDetectors.
Definition: RODFDetector.h:216
bool addDetector(RODFDetector *dfd)
RODFDetectorCon & myContainer
the container to put the detectors into
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
RODFDetectorHandler(RODFNet *optNet, bool ignoreErrors, RODFDetectorCon &con, const std::string &file)
Constructor.
virtual ~RODFDetectorHandler()
Destructor.
bool myIgnoreErrors
whether to ignore errors on parsing
RODFNet * myNet
the net
Class representing a detector within the DFROUTER.
Definition: RODFDetector.h:79
A DFROUTER-network.
Definition: RODFNet.h:42
A basic edge for routing applications.
Definition: ROEdge.h:70
int getNumLanes() const
Returns the number of lanes this edge has.
Definition: ROEdge.h:260
ROEdge * getEdge(const std::string &name) const
Retrieves an edge from the network.
Definition: RONet.h:157
Encapsulated SAX-Attributes.
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.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
SAX-handler base for SUMO-files.
static std::string getEdgeIDFromLane(const std::string laneID)
return edge id when given the lane ID
static int getIndexFromLane(const std::string laneID)
return lane index when given the lane ID