Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/elements/data/GNEMeanData.cpp
169684 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-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 GNEMeanData.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Nov 2022
17
///
18
// Class for representing MeanData
19
/****************************************************************************/
20
21
#include <netedit/GNENet.h>
22
#include <netedit/GNETagProperties.h>
23
#include <netedit/changes/GNEChange_Attribute.h>
24
25
#include "GNEMeanData.h"
26
27
// ===========================================================================
28
// member method definitions
29
// ===========================================================================
30
31
GNEMeanData::GNEMeanData(SumoXMLTag tag, std::string ID, GNENet* net, const std::string& filename) :
32
GNEAttributeCarrier(tag, net, filename, true),
33
myID(ID) {
34
// reset default values
35
resetDefaultValues(false);
36
}
37
38
39
GNEMeanData::GNEMeanData(SumoXMLTag tag, std::string ID, GNENet* net, const std::string& filename, const std::string& file, const SUMOTime period,
40
const SUMOTime begin, const SUMOTime end, const bool trackVehicles, const std::vector<SumoXMLAttr>& writtenAttributes,
41
const bool aggregate, const std::vector<std::string>& edges, const std::string& edgeFile, const std::string& excludeEmpty,
42
const bool withInternal, const std::vector<std::string>& detectPersons, const double minSamples, const double maxTravelTime,
43
const std::vector<std::string>& vTypes, const double speedThreshold) :
44
GNEAttributeCarrier(tag, net, filename, false),
45
myID(ID),
46
myFile(file),
47
myPeriod(period),
48
myBegin(begin),
49
myEnd(end),
50
myTrackVehicles(trackVehicles),
51
myWrittenAttributes(writtenAttributes),
52
myAggregate(aggregate),
53
myEdges(edges),
54
myEdgeFile(edgeFile),
55
myExcludeEmpty(excludeEmpty),
56
myWithInternal(withInternal),
57
myDetectPersons(detectPersons),
58
myMinSamples(minSamples),
59
myMaxTravelTime(maxTravelTime),
60
myVTypes(vTypes),
61
mySpeedThreshold(speedThreshold) {
62
// set file
63
if (myFile.empty()) {
64
myFile = (myID + ".xml");
65
}
66
}
67
68
69
GNEMeanData::~GNEMeanData() {}
70
71
72
GNEHierarchicalElement*
73
GNEMeanData::getHierarchicalElement() {
74
return this;
75
}
76
77
78
void
79
GNEMeanData::writeMeanData(OutputDevice& device) const {
80
device.openTag(getTagProperty()->getTag());
81
// write needed attributes
82
device.writeAttr(SUMO_ATTR_ID, getID());
83
if (myFile.empty()) {
84
device.writeAttr(SUMO_ATTR_FILE, myID + ".xml");
85
} else {
86
device.writeAttr(SUMO_ATTR_FILE, myFile);
87
}
88
// write optional attributes
89
if (myPeriod != myTagProperty->getDefaultTimeValue(SUMO_ATTR_PERIOD)) {
90
std::cout << myPeriod << std::endl;
91
device.writeAttr(SUMO_ATTR_PERIOD, time2string(myPeriod));
92
}
93
if (myBegin != myTagProperty->getDefaultTimeValue(SUMO_ATTR_BEGIN)) {
94
device.writeAttr(SUMO_ATTR_BEGIN, time2string(myBegin));
95
}
96
if (myEnd != myTagProperty->getDefaultTimeValue(SUMO_ATTR_END)) {
97
device.writeAttr(SUMO_ATTR_END, time2string(myEnd));
98
}
99
if (myExcludeEmpty != myTagProperty->getDefaultStringValue(SUMO_ATTR_EXCLUDE_EMPTY)) {
100
device.writeAttr(SUMO_ATTR_EXCLUDE_EMPTY, myExcludeEmpty);
101
}
102
if (myWithInternal) {
103
device.writeAttr(SUMO_ATTR_WITH_INTERNAL, true);
104
}
105
if (myMaxTravelTime != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_MAX_TRAVELTIME)) {
106
device.writeAttr(SUMO_ATTR_MAX_TRAVELTIME, myMaxTravelTime);
107
}
108
if (myMinSamples != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_MIN_SAMPLES)) {
109
device.writeAttr(SUMO_ATTR_MIN_SAMPLES, myMinSamples);
110
}
111
if (mySpeedThreshold != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_HALTING_SPEED_THRESHOLD)) {
112
device.writeAttr(SUMO_ATTR_HALTING_SPEED_THRESHOLD, mySpeedThreshold);
113
}
114
if (myVTypes.size() > 0) {
115
device.writeAttr(SUMO_ATTR_VTYPES, getAttribute(SUMO_ATTR_VTYPES));
116
}
117
if (myTrackVehicles) {
118
device.writeAttr(SUMO_ATTR_TRACK_VEHICLES, true);
119
}
120
if (myDetectPersons.size() > 0 && (myDetectPersons.at(0) != SUMOXMLDefinitions::PersonModeValues.getString(PersonMode::NONE))) {
121
device.writeAttr(SUMO_ATTR_DETECT_PERSONS, myDetectPersons);
122
}
123
if (myWrittenAttributes.size() > 0) {
124
device.writeAttr(SUMO_ATTR_WRITE_ATTRIBUTES, getAttribute(SUMO_ATTR_WRITE_ATTRIBUTES));
125
}
126
if (myEdges.size() > 0) {
127
device.writeAttr(SUMO_ATTR_EDGES, myEdges);
128
}
129
if (myEdgeFile.size() > 0) {
130
device.writeAttr(SUMO_ATTR_EDGESFILE, myEdgeFile);
131
}
132
if (myAggregate) {
133
device.writeAttr(SUMO_ATTR_AGGREGATE, true);
134
}
135
device.closeTag();
136
}
137
138
139
GUIGlObject*
140
GNEMeanData::getGUIGlObject() {
141
return nullptr;
142
}
143
144
145
const GUIGlObject*
146
GNEMeanData::getGUIGlObject() const {
147
return nullptr;
148
}
149
150
151
void
152
GNEMeanData::updateGeometry() {
153
// nothing to update
154
}
155
156
157
Position
158
GNEMeanData::getPositionInView() const {
159
return Position();
160
}
161
162
163
bool
164
GNEMeanData::checkDrawFromContour() const {
165
return false;
166
}
167
168
169
bool
170
GNEMeanData::checkDrawToContour() const {
171
return false;
172
}
173
174
175
bool
176
GNEMeanData::checkDrawRelatedContour() const {
177
return false;
178
}
179
180
181
bool
182
GNEMeanData::checkDrawOverContour() const {
183
return false;
184
}
185
186
187
bool
188
GNEMeanData::checkDrawDeleteContour() const {
189
return false;
190
}
191
192
193
bool
194
GNEMeanData::checkDrawDeleteContourSmall() const {
195
return false;
196
}
197
198
199
bool
200
GNEMeanData::checkDrawSelectContour() const {
201
return false;
202
}
203
204
205
bool
206
GNEMeanData::checkDrawMoveContour() const {
207
return false;
208
}
209
210
211
std::string
212
GNEMeanData::getAttribute(SumoXMLAttr key) const {
213
switch (key) {
214
case SUMO_ATTR_ID:
215
return myID;
216
case SUMO_ATTR_FILE:
217
return myFile;
218
case SUMO_ATTR_PERIOD:
219
if (myPeriod == myTagProperty->getDefaultTimeValue(key)) {
220
return "";
221
} else {
222
return time2string(myPeriod);
223
}
224
case SUMO_ATTR_BEGIN:
225
if (myBegin == myTagProperty->getDefaultTimeValue(key)) {
226
return "";
227
} else {
228
return time2string(myBegin);
229
}
230
case SUMO_ATTR_END:
231
if (myEnd == myTagProperty->getDefaultTimeValue(key)) {
232
return "";
233
} else {
234
return time2string(myEnd);
235
}
236
case SUMO_ATTR_EXCLUDE_EMPTY:
237
return myExcludeEmpty;
238
case SUMO_ATTR_WITH_INTERNAL:
239
return toString(myWithInternal);
240
case SUMO_ATTR_MAX_TRAVELTIME:
241
return toString(myMaxTravelTime);
242
case SUMO_ATTR_MIN_SAMPLES:
243
return toString(myMinSamples);
244
case SUMO_ATTR_HALTING_SPEED_THRESHOLD:
245
return toString(mySpeedThreshold);
246
case SUMO_ATTR_VTYPES:
247
return toString(myVTypes);
248
case SUMO_ATTR_TRACK_VEHICLES:
249
return toString(myTrackVehicles);
250
case SUMO_ATTR_DETECT_PERSONS:
251
return toString(myDetectPersons);
252
case SUMO_ATTR_WRITE_ATTRIBUTES:
253
return joinToString(myWrittenAttributes, " ");
254
case SUMO_ATTR_EDGES:
255
return toString(myEdges);
256
case SUMO_ATTR_EDGESFILE:
257
return myEdgeFile;
258
case SUMO_ATTR_AGGREGATE:
259
return toString(myAggregate);
260
default:
261
return getCommonAttribute(this, key);
262
}
263
}
264
265
266
double
267
GNEMeanData::getAttributeDouble(SumoXMLAttr key) const {
268
throw InvalidArgument(getTagStr() + " doesn't have a double attribute of type '" + toString(key) + "'");
269
}
270
271
272
void
273
GNEMeanData::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {
274
if (value == getAttribute(key)) {
275
return; //avoid needless changes, later logic relies on the fact that attributes have changed
276
}
277
switch (key) {
278
case SUMO_ATTR_ID:
279
case SUMO_ATTR_FILE:
280
case SUMO_ATTR_PERIOD:
281
case SUMO_ATTR_BEGIN:
282
case SUMO_ATTR_END:
283
case SUMO_ATTR_EXCLUDE_EMPTY:
284
case SUMO_ATTR_WITH_INTERNAL:
285
case SUMO_ATTR_MAX_TRAVELTIME:
286
case SUMO_ATTR_MIN_SAMPLES:
287
case SUMO_ATTR_HALTING_SPEED_THRESHOLD:
288
case SUMO_ATTR_VTYPES:
289
case SUMO_ATTR_TRACK_VEHICLES:
290
case SUMO_ATTR_DETECT_PERSONS:
291
case SUMO_ATTR_WRITE_ATTRIBUTES:
292
case SUMO_ATTR_EDGES:
293
case SUMO_ATTR_EDGESFILE:
294
case SUMO_ATTR_AGGREGATE:
295
GNEChange_Attribute::changeAttribute(this, key, value, undoList);
296
break;
297
default:
298
setCommonAttribute(key, value, undoList);
299
break;
300
}
301
}
302
303
304
bool
305
GNEMeanData::isValid(SumoXMLAttr key, const std::string& value) {
306
switch (key) {
307
case SUMO_ATTR_ID:
308
return SUMOXMLDefinitions::isValidNetID(value) && (myNet->getAttributeCarriers()->retrieveMeanData(myTagProperty->getTag(), value, false) == nullptr);
309
case SUMO_ATTR_FILE:
310
return SUMOXMLDefinitions::isValidFilename(value);
311
case SUMO_ATTR_PERIOD:
312
case SUMO_ATTR_BEGIN:
313
case SUMO_ATTR_END:
314
if (value.empty()) {
315
return true;
316
} else {
317
return (canParse<SUMOTime>(value) && (parse<SUMOTime>(value) >= 0));
318
}
319
case SUMO_ATTR_EXCLUDE_EMPTY:
320
if (canParse<bool>(value)) {
321
return true;
322
} else {
323
return (value == SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::DEFAULTS));
324
}
325
case SUMO_ATTR_WITH_INTERNAL:
326
return (canParse<bool>(value));
327
case SUMO_ATTR_MAX_TRAVELTIME:
328
if (value.empty()) {
329
return true;
330
} else {
331
return (canParse<double>(value) && (parse<double>(value) >= 0));
332
}
333
case SUMO_ATTR_MIN_SAMPLES:
334
return (canParse<double>(value) && (parse<double>(value) >= 0));
335
case SUMO_ATTR_HALTING_SPEED_THRESHOLD:
336
return (canParse<double>(value) && (parse<double>(value) >= 0));
337
case SUMO_ATTR_VTYPES:
338
return true;
339
case SUMO_ATTR_TRACK_VEHICLES:
340
return (canParse<bool>(value));
341
case SUMO_ATTR_DETECT_PERSONS:
342
if (value.empty()) {
343
return true;
344
} else {
345
return SUMOXMLDefinitions::PersonModeValues.hasString(value);
346
}
347
case SUMO_ATTR_WRITE_ATTRIBUTES:
348
return canParse<std::vector<SumoXMLAttr> >(value);
349
case SUMO_ATTR_EDGES:
350
return canParse<std::vector<GNEEdge*> >(myNet, value, false);
351
case SUMO_ATTR_EDGESFILE:
352
return SUMOXMLDefinitions::isValidFilename(value);
353
case SUMO_ATTR_AGGREGATE:
354
return (canParse<bool>(value));
355
default:
356
return isCommonValid(key, value);
357
}
358
}
359
360
361
std::string
362
GNEMeanData::getPopUpID() const {
363
return getTagStr();
364
}
365
366
367
std::string
368
GNEMeanData::getHierarchyName() const {
369
return getTagStr();
370
}
371
372
373
const Parameterised::Map&
374
GNEMeanData::getACParametersMap() const {
375
return getParametersMap();
376
}
377
378
379
void
380
GNEMeanData::setAttribute(SumoXMLAttr key, const std::string& value) {
381
switch (key) {
382
case SUMO_ATTR_ID:
383
myNet->getAttributeCarriers()->updateMeanDataID(this, value);
384
myID = value;
385
break;
386
case SUMO_ATTR_FILE:
387
if (value.empty()) {
388
myFile = (myID + ".xml");
389
} else {
390
myFile = value;
391
}
392
break;
393
case SUMO_ATTR_PERIOD:
394
if (value.empty()) {
395
myPeriod = myTagProperty->getDefaultTimeValue(key);
396
} else {
397
myPeriod = string2time(value);
398
}
399
break;
400
case SUMO_ATTR_BEGIN:
401
if (value.empty()) {
402
myBegin = myTagProperty->getDefaultTimeValue(key);
403
} else {
404
myBegin = string2time(value);
405
}
406
break;
407
case SUMO_ATTR_END:
408
if (value.empty()) {
409
myEnd = myTagProperty->getDefaultTimeValue(key);
410
} else {
411
myEnd = string2time(value);
412
}
413
break;
414
case SUMO_ATTR_EXCLUDE_EMPTY:
415
if (value == SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::DEFAULTS)) {
416
myExcludeEmpty = value;
417
} else if (parse<bool>(value)) {
418
myExcludeEmpty = SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::TRUES);
419
} else {
420
myExcludeEmpty = SUMOXMLDefinitions::ExcludeEmptys.getString(ExcludeEmpty::FALSES);
421
}
422
break;
423
case SUMO_ATTR_WITH_INTERNAL:
424
myWithInternal = parse<bool>(value);
425
break;
426
case SUMO_ATTR_MAX_TRAVELTIME:
427
if (value.empty()) {
428
myMaxTravelTime = myTagProperty->getDefaultDoubleValue(key);
429
} else {
430
myMaxTravelTime = parse<double>(value);
431
}
432
break;
433
case SUMO_ATTR_MIN_SAMPLES:
434
if (value.empty()) {
435
myMinSamples = myTagProperty->getDefaultDoubleValue(key);
436
} else {
437
myMinSamples = parse<double>(value);
438
}
439
break;
440
case SUMO_ATTR_HALTING_SPEED_THRESHOLD:
441
if (value.empty()) {
442
mySpeedThreshold = myTagProperty->getDefaultDoubleValue(key);
443
} else {
444
mySpeedThreshold = parse<double>(value);
445
}
446
break;
447
case SUMO_ATTR_VTYPES:
448
myVTypes = parse<std::vector<std::string> >(value);
449
break;
450
case SUMO_ATTR_TRACK_VEHICLES:
451
myTrackVehicles = parse<bool>(value);
452
break;
453
case SUMO_ATTR_DETECT_PERSONS:
454
myDetectPersons.clear();
455
if (value.empty()) {
456
myDetectPersons.push_back(SUMOXMLDefinitions::PersonModeValues.getString(PersonMode::NONE));
457
} else {
458
myDetectPersons = parse<std::vector<std::string> >(value);
459
}
460
break;
461
case SUMO_ATTR_WRITE_ATTRIBUTES:
462
myWrittenAttributes = parse<std::vector<SumoXMLAttr> >(value);
463
break;
464
case SUMO_ATTR_EDGES:
465
myEdges = parse<std::vector<std::string> >(value);
466
break;
467
case SUMO_ATTR_EDGESFILE:
468
myEdgeFile = value;
469
break;
470
case SUMO_ATTR_AGGREGATE:
471
myAggregate = parse<bool>(value);
472
break;
473
default:
474
setCommonAttribute(this, key, value);
475
break;
476
}
477
}
478
479
/****************************************************************************/
480
481