Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/xml/SAXWeightsHandler.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2007-2025 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
/****************************************************************************/
14
/// @file SAXWeightsHandler.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date Fri, 30 Mar 2007
19
///
20
// An XML-handler for network weights
21
/****************************************************************************/
22
#include <config.h>
23
24
#include <utils/common/MsgHandler.h>
25
26
#include "SAXWeightsHandler.h"
27
28
29
// ===========================================================================
30
// method definitions
31
// ===========================================================================
32
33
// ---------------------------------------------------------------------------
34
// SAXWeightsHandler::ToRetrieveDefinition methods
35
// ---------------------------------------------------------------------------
36
37
SAXWeightsHandler::ToRetrieveDefinition::ToRetrieveDefinition(const std::string& attributeName,
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
49
SAXWeightsHandler::ToRetrieveDefinition::~ToRetrieveDefinition() {
50
}
51
52
// ---------------------------------------------------------------------------
53
// SAXWeightsHandler methods
54
// ---------------------------------------------------------------------------
55
56
SAXWeightsHandler::SAXWeightsHandler(const std::vector<ToRetrieveDefinition*>& defs, const std::string& file) :
57
SUMOSAXHandler(file),
58
myDefinitions(defs),
59
myCurrentTimeBeg(-1),
60
myCurrentTimeEnd(-1) {
61
}
62
63
64
SAXWeightsHandler::SAXWeightsHandler(ToRetrieveDefinition* def, const std::string& file) :
65
SUMOSAXHandler(file),
66
myDefinitions({def}),
67
myCurrentTimeBeg(-1),
68
myCurrentTimeEnd(-1) {
69
}
70
71
72
SAXWeightsHandler::~SAXWeightsHandler() {
73
for (const auto& definition : myDefinitions) {
74
delete definition;
75
}
76
}
77
78
79
void
80
SAXWeightsHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) {
81
switch (element) {
82
case SUMO_TAG_INTERVAL: {
83
bool ok = true;
84
myCurrentID = attrs.getOpt<std::string>(SUMO_ATTR_ID, nullptr, ok, "");
85
myCurrentTimeBeg = STEPS2TIME(attrs.getSUMOTimeReporting(SUMO_ATTR_BEGIN, nullptr, ok));
86
myCurrentTimeEnd = STEPS2TIME(attrs.getSUMOTimeReporting(SUMO_ATTR_END, nullptr, ok));
87
if (myCurrentTimeEnd < myCurrentTimeBeg) {
88
WRITE_ERROR("Interval end time " + toString(myCurrentTimeEnd) + " is lower than interval begin time " + toString(myCurrentTimeBeg));
89
myCurrentTimeEnd = 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
118
void
119
SAXWeightsHandler::tryParse(const SUMOSAXAttributes& attrs, bool isEdge) {
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,
137
myCurrentEdgeID, time2string(TIME2STEPS(myCurrentTimeBeg)));
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,
164
myCurrentEdgeID, time2string(TIME2STEPS(myCurrentTimeBeg)));
165
}
166
}
167
}
168
}
169
}
170
}
171
172
173
void
174
SAXWeightsHandler::tryParseEdgeRel(const SUMOSAXAttributes& attrs) {
175
if (attrs.hasAttribute(SUMO_ATTR_FROM) && attrs.hasAttribute(SUMO_ATTR_TO)) {
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);
179
for (ToRetrieveDefinition* ret : myDefinitions) {
180
if (attrs.hasAttribute(ret->myAttributeName)) {
181
ret->myDestination.addEdgeRelWeight(from, to,
182
attrs.getFloat(ret->myAttributeName),
183
myCurrentTimeBeg, myCurrentTimeEnd);
184
}
185
}
186
}
187
}
188
189
void
190
SAXWeightsHandler::tryParseTazRel(const SUMOSAXAttributes& attrs) {
191
if (attrs.hasAttribute(SUMO_ATTR_FROM) && attrs.hasAttribute(SUMO_ATTR_TO)) {
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);
195
for (ToRetrieveDefinition* ret : myDefinitions) {
196
if (attrs.hasAttribute(ret->myAttributeName)) {
197
ret->myDestination.addTazRelWeight(myCurrentID, from, to,
198
attrs.getFloat(ret->myAttributeName),
199
myCurrentTimeBeg, myCurrentTimeEnd);
200
}
201
}
202
}
203
}
204
205
206
void
207
SAXWeightsHandler::myEndElement(int element) {
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,
213
myCurrentTimeBeg, myCurrentTimeEnd);
214
}
215
}
216
}
217
}
218
219
220
/****************************************************************************/
221
222