Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
SAXWeightsHandler.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2007-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/****************************************************************************/
20// An XML-handler for network weights
21/****************************************************************************/
22#include <config.h>
23
25
26#include "SAXWeightsHandler.h"
27
28
29// ===========================================================================
30// method definitions
31// ===========================================================================
32
33// ---------------------------------------------------------------------------
34// SAXWeightsHandler::ToRetrieveDefinition methods
35// ---------------------------------------------------------------------------
36
38 bool edgeBased, EdgeFloatTimeLineRetriever& destination) :
39 myAttributeName(attributeName),
40 myAmEdgeBased(edgeBased),
41 myDestination(destination),
42 myAggValue(0),
43 myNoLanes(0),
44 myHadAttribute(0),
45 myHadNonNumeric(false)
46{ }
47
48
51
52// ---------------------------------------------------------------------------
53// SAXWeightsHandler methods
54// ---------------------------------------------------------------------------
55
56SAXWeightsHandler::SAXWeightsHandler(const std::vector<ToRetrieveDefinition*>& defs, const std::string& file) :
57 SUMOSAXHandler(file),
58 myDefinitions(defs),
61}
62
63
65 SUMOSAXHandler(file),
66 myDefinitions({def}),
67 myCurrentTimeBeg(-1),
68myCurrentTimeEnd(-1) {
69}
70
71
73 for (const auto& definition : myDefinitions) {
74 delete definition;
75 }
76}
77
78
79void
81 switch (element) {
82 case SUMO_TAG_INTERVAL: {
83 bool ok = true;
84 myCurrentID = attrs.getOpt<std::string>(SUMO_ATTR_ID, nullptr, ok, "");
88 WRITE_ERROR("Interval end time " + toString(myCurrentTimeEnd) + " is lower than interval begin time " + toString(myCurrentTimeBeg));
90 }
91 }
92 break;
93 case SUMO_TAG_EDGE: {
94 bool ok = true;
95 myCurrentEdgeID = attrs.getOpt<std::string>(SUMO_ATTR_ID, nullptr, ok, "");
96 tryParse(attrs, true);
97 }
98 break;
99 case SUMO_TAG_EDGEREL: {
100 tryParseEdgeRel(attrs);
101 }
102 break;
103 case SUMO_TAG_TAZREL: {
104 tryParseTazRel(attrs);
105 }
106 break;
107 break;
108 case SUMO_TAG_LANE: {
109 tryParse(attrs, false);
110 }
111 break;
112 default:
113 break;
114 }
115}
116
117
118void
120 if (isEdge) {
121 // process all that want values directly from the edge
122 for (const auto& definition : myDefinitions) {
123 if (definition->myAmEdgeBased) {
124 if (attrs.hasAttribute(definition->myAttributeName)) {
125 try {
126 definition->myAggValue = attrs.getFloat(definition->myAttributeName);
127 definition->myNoLanes = 1;
128 definition->myHadAttribute = true;
129 } catch (EmptyData&) {
130 WRITE_ERRORF(TL("Missing value '%' in edge '%'."), definition->myAttributeName, myCurrentEdgeID);
131 } catch (NumberFormatException&) {
132 if (!definition->myHadNonNumeric) {
133 // warn only once
134 definition->myHadNonNumeric = true;
135 WRITE_ERRORF(TL("The value '%' of attribute '%' should be numeric in edge '%' at time step %."),
136 attrs.getStringSecure(definition->myAttributeName, ""), definition->myAttributeName,
138 }
139 }
140 } else {
141 definition->myHadAttribute = false;
142 }
143 } else {
144 definition->myAggValue = 0;
145 definition->myNoLanes = 0;
146 }
147 }
148 } else {
149 // process the current lane values
150 for (const auto& definition : myDefinitions) {
151 if (!definition->myAmEdgeBased) {
152 try {
153 definition->myAggValue += attrs.getFloat(definition->myAttributeName);
154 definition->myNoLanes++;
155 definition->myHadAttribute = true;
156 } catch (EmptyData&) {
157 WRITE_ERRORF(TL("Missing value '%' in edge '%'."), definition->myAttributeName, myCurrentEdgeID);
158 } catch (NumberFormatException&) {
159 if (!definition->myHadNonNumeric) {
160 // warn only once
161 definition->myHadNonNumeric = true;
162 WRITE_ERRORF(TL("The value '%' of attribute '%' should be numeric in edge '%' at time step %."),
163 attrs.getStringSecure(definition->myAttributeName, ""), definition->myAttributeName,
165 }
166 }
167 }
168 }
169 }
170}
171
172
173void
176 bool ok = true;
177 const std::string from = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
178 const std::string to = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
180 if (attrs.hasAttribute(ret->myAttributeName)) {
181 ret->myDestination.addEdgeRelWeight(from, to,
182 attrs.getFloat(ret->myAttributeName),
184 }
185 }
186 }
187}
188
189void
192 bool ok = true;
193 const std::string from = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
194 const std::string to = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
196 if (attrs.hasAttribute(ret->myAttributeName)) {
197 ret->myDestination.addTazRelWeight(myCurrentID, from, to,
198 attrs.getFloat(ret->myAttributeName),
200 }
201 }
202 }
203}
204
205
206void
208 if (element == SUMO_TAG_EDGE) {
209 for (const auto& definition : myDefinitions) {
210 if (definition->myHadAttribute) {
211 definition->myDestination.addEdgeWeight(myCurrentEdgeID,
212 definition->myAggValue / (double)definition->myNoLanes,
214 }
215 }
216 }
217}
218
219
220/****************************************************************************/
#define WRITE_ERRORF(...)
Definition MsgHandler.h:305
#define WRITE_ERROR(msg)
Definition MsgHandler.h:304
#define TL(string)
Definition MsgHandler.h:315
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:69
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define TIME2STEPS(x)
Definition SUMOTime.h:57
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_EDGEREL
a relation between two edges
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_TAZREL
a relation between two TAZs
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_TO
@ SUMO_ATTR_FROM
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_ID
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
Interface for a class which obtains read weights for named edges.
Complete definition about what shall be retrieved and where to store it.
ToRetrieveDefinition(const std::string &attributeName, bool edgeBased, EdgeFloatTimeLineRetriever &destination)
Constructor.
double myCurrentTimeEnd
the end of the time period that is currently processed
double myCurrentTimeBeg
the begin of the time period that is currently processed
void myEndElement(int elemente)
Called when a closing tag occurs.
void tryParseTazRel(const SUMOSAXAttributes &attrs)
Parses the data of an tazRelation for the previously read times.
~SAXWeightsHandler()
Destructor.
void tryParseEdgeRel(const SUMOSAXAttributes &attrs)
Parses the data of an edgeRelation for the previously read times.
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
void tryParse(const SUMOSAXAttributes &attrs, bool isEdge)
Parses the data of an edge or lane for the previously read times.
SAXWeightsHandler(const std::vector< ToRetrieveDefinition * > &defs, const std::string &file)
Constructor.
std::string myCurrentEdgeID
the edge which is currently being processed
std::string myCurrentID
the id of the interval being parsed
std::vector< ToRetrieveDefinition * > myDefinitions
List of definitions what shall be read and whereto stored while parsing the file.
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.
virtual std::string getStringSecure(int id, const std::string &def) const =0
Returns the string-value of the named (by its enum-value) attribute.
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.
SUMOTime getSUMOTimeReporting(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
double getFloat(int id) const
Returns the double-value of the named (by its enum-value) attribute.
SAX-handler base for SUMO-files.