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