Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/elements/data/GNEDataSet.cpp
193674 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 GNEDataSet.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jan 2020
17
///
18
// A abstract class for data sets
19
/****************************************************************************/
20
21
#include <netedit/changes/GNEChange_Attribute.h>
22
#include <netedit/frames/common/GNEInspectorFrame.h>
23
#include <netedit/frames/GNEElementTree.h>
24
#include <netedit/GNEApplicationWindow.h>
25
#include <netedit/GNENet.h>
26
#include <netedit/GNEViewParent.h>
27
28
#include "GNEDataSet.h"
29
#include "GNEDataInterval.h"
30
31
// ===========================================================================
32
// member method definitions
33
// ===========================================================================
34
35
// ---------------------------------------------------------------------------
36
// GNEDataSet::AttributeColors - methods
37
// ---------------------------------------------------------------------------
38
39
GNEDataSet::AttributeColors::AttributeColors() {
40
}
41
42
43
void
44
GNEDataSet::AttributeColors::updateValues(const std::string& attribute, const double value) {
45
// check if exist
46
if (myMinMaxValue.count(attribute) == 0) {
47
myMinMaxValue[attribute] = std::make_pair(value, value);
48
} else {
49
// update min value
50
if (value < myMinMaxValue.at(attribute).first) {
51
myMinMaxValue.at(attribute).first = value;
52
}
53
// update max value
54
if (value > myMinMaxValue.at(attribute).second) {
55
myMinMaxValue.at(attribute).second = value;
56
}
57
}
58
}
59
60
61
void
62
GNEDataSet::AttributeColors::updateAllValues(const AttributeColors& attributeColors) {
63
// iterate over map
64
for (const auto& attributeColor : attributeColors.myMinMaxValue) {
65
if (myMinMaxValue.count(attributeColor.first) == 0) {
66
myMinMaxValue[attributeColor.first] = attributeColor.second;
67
} else {
68
// update min value
69
if (attributeColor.second.first < myMinMaxValue.at(attributeColor.first).first) {
70
myMinMaxValue.at(attributeColor.first).first = attributeColor.second.first;
71
}
72
// update max value
73
if (attributeColor.second.second > myMinMaxValue.at(attributeColor.first).second) {
74
myMinMaxValue.at(attributeColor.first).second = attributeColor.second.second;
75
}
76
}
77
}
78
}
79
80
81
bool
82
GNEDataSet::AttributeColors::exist(const std::string& attribute) const {
83
return (myMinMaxValue.count(attribute) > 0);
84
}
85
86
87
double
88
GNEDataSet::AttributeColors::getMinValue(const std::string& attribute) const {
89
return myMinMaxValue.at(attribute).first;
90
}
91
92
93
double
94
GNEDataSet::AttributeColors::getMaxValue(const std::string& attribute) const {
95
return myMinMaxValue.at(attribute).second;
96
}
97
98
99
void
100
GNEDataSet::AttributeColors::clear() {
101
myMinMaxValue.clear();
102
}
103
104
// ---------------------------------------------------------------------------
105
// GNEDataSet - methods
106
// ---------------------------------------------------------------------------
107
108
GNEDataSet::GNEDataSet(GNENet* net) :
109
GNEAttributeCarrier(SUMO_TAG_DATASET, net) {
110
}
111
112
113
GNEDataSet::GNEDataSet(const std::string& dataSetID, GNENet* net, FileBucket* fileBucket) :
114
GNEAttributeCarrier(SUMO_TAG_DATASET, net, fileBucket),
115
myDataSetID(dataSetID) {
116
}
117
118
119
GNEDataSet::~GNEDataSet() {}
120
121
122
GNEHierarchicalElement*
123
GNEDataSet::getHierarchicalElement() {
124
return this;
125
}
126
127
128
GNEMoveElement*
129
GNEDataSet::getMoveElement() const {
130
return nullptr;
131
}
132
133
134
Parameterised*
135
GNEDataSet::getParameters() {
136
return nullptr;
137
}
138
139
140
const Parameterised*
141
GNEDataSet::getParameters() const {
142
return nullptr;
143
}
144
145
146
GUIGlObject*
147
GNEDataSet::getGUIGlObject() {
148
return nullptr;
149
}
150
151
152
const GUIGlObject*
153
GNEDataSet::getGUIGlObject() const {
154
return nullptr;
155
}
156
157
158
FileBucket*
159
GNEDataSet::getFileBucket() const {
160
return myFileBucket;
161
}
162
163
164
void
165
GNEDataSet::updateAttributeColors() {
166
// first update attribute colors in data interval childrens
167
for (const auto& interval : myDataIntervalChildren) {
168
interval.second->updateAttributeColors();
169
}
170
// continue with data sets containers
171
myAllAttributeColors.clear();
172
mySpecificAttributeColors.clear();
173
// iterate over all data interval children
174
for (const auto& interval : myDataIntervalChildren) {
175
myAllAttributeColors.updateAllValues(interval.second->getAllAttributeColors());
176
}
177
// iterate over specificdata interval children
178
for (const auto& interval : myDataIntervalChildren) {
179
for (const auto& specificAttributeColor : interval.second->getSpecificAttributeColors()) {
180
mySpecificAttributeColors[specificAttributeColor.first].updateAllValues(specificAttributeColor.second);
181
}
182
}
183
}
184
185
186
const GNEDataSet::AttributeColors&
187
GNEDataSet::getAllAttributeColors() const {
188
return myAllAttributeColors;
189
}
190
191
192
const std::map<SumoXMLTag, GNEDataSet::AttributeColors>&
193
GNEDataSet::getSpecificAttributeColors() const {
194
return mySpecificAttributeColors;
195
}
196
197
198
void
199
GNEDataSet::updateGeometry() {
200
// nothing to update
201
}
202
203
204
Position
205
GNEDataSet::getPositionInView() const {
206
return Position(0, 0);
207
}
208
209
210
void
211
GNEDataSet::writeDataSet(OutputDevice& device) const {
212
// iterate over intervals
213
for (const auto& interval : myDataIntervalChildren) {
214
// open device
215
device.openTag(SUMO_TAG_INTERVAL);
216
// write ID
217
device.writeAttr(SUMO_ATTR_ID, getID());
218
// write begin
219
device.writeAttr(SUMO_ATTR_BEGIN, interval.second->getAttribute(SUMO_ATTR_BEGIN));
220
// write end
221
device.writeAttr(SUMO_ATTR_END, interval.second->getAttribute(SUMO_ATTR_END));
222
// iterate over interval generic datas
223
for (const auto& genericData : interval.second->getGenericDataChildren()) {
224
// write generic data
225
genericData->writeGenericData(device);
226
}
227
// close device
228
device.closeTag();
229
}
230
}
231
232
233
bool
234
GNEDataSet::checkDrawFromContour() const {
235
return false;
236
}
237
238
239
bool
240
GNEDataSet::checkDrawToContour() const {
241
return false;
242
}
243
244
245
bool
246
GNEDataSet::checkDrawRelatedContour() const {
247
return false;
248
}
249
250
251
bool
252
GNEDataSet::checkDrawOverContour() const {
253
return false;
254
}
255
256
257
bool
258
GNEDataSet::checkDrawDeleteContour() const {
259
return false;
260
}
261
262
263
bool
264
GNEDataSet::checkDrawDeleteContourSmall() const {
265
return false;
266
}
267
268
269
bool
270
GNEDataSet::checkDrawSelectContour() const {
271
return false;
272
}
273
274
275
bool
276
GNEDataSet::checkDrawMoveContour() const {
277
return false;
278
}
279
280
281
void
282
GNEDataSet::addDataIntervalChild(GNEDataInterval* dataInterval) {
283
// check that dataInterval wasn't previously inserted
284
if (myDataIntervalChildren.count(dataInterval->getAttributeDouble(SUMO_ATTR_BEGIN)) == 0) {
285
// add data interval child
286
myDataIntervalChildren[dataInterval->getAttributeDouble(SUMO_ATTR_BEGIN)] = dataInterval;
287
// add reference in attributeCarriers
288
myNet->getAttributeCarriers()->insertDataInterval(dataInterval, dataInterval);
289
} else {
290
throw ProcessError(TL("DataInterval was already inserted"));
291
}
292
}
293
294
295
void
296
GNEDataSet::removeDataIntervalChild(GNEDataInterval* dataInterval) {
297
// check that dataInterval was previously inserted
298
if (myDataIntervalChildren.count(dataInterval->getAttributeDouble(SUMO_ATTR_BEGIN)) == 1) {
299
// remove data interval child
300
myDataIntervalChildren.erase(dataInterval->getAttributeDouble(SUMO_ATTR_BEGIN));
301
// remove it from inspected elements and GNEElementTree
302
myNet->getViewNet()->getInspectedElements().uninspectAC(dataInterval);
303
myNet->getViewParent()->getInspectorFrame()->getHierarchicalElementTree()->removeCurrentEditedAttributeCarrier(dataInterval);
304
// remove reference from attributeCarriers
305
myNet->getAttributeCarriers()->deleteDataInterval(dataInterval);
306
} else {
307
throw ProcessError(TL("DataInterval wasn't previously inserted"));
308
}
309
}
310
311
312
bool
313
GNEDataSet::dataIntervalChildrenExist(GNEDataInterval* dataInterval) const {
314
for (const auto& interval : myDataIntervalChildren) {
315
if (interval.second == dataInterval) {
316
return true;
317
}
318
}
319
return false;
320
}
321
322
void
323
GNEDataSet::updateDataIntervalBegin(const double oldBegin) {
324
// check that dataInterval was previously inserted
325
if (myDataIntervalChildren.count(oldBegin) == 1) {
326
// get data interval
327
GNEDataInterval* dataInterval = myDataIntervalChildren.at(oldBegin);
328
// insert again using new begin
329
myDataIntervalChildren[dataInterval->getAttributeDouble(SUMO_ATTR_BEGIN)] = dataInterval;
330
} else {
331
throw ProcessError(TL("DataInterval wasn't previously inserted"));
332
}
333
}
334
335
336
bool
337
GNEDataSet::checkNewInterval(const double newBegin, const double newEnd) {
338
return checkNewInterval(myDataIntervalChildren, newBegin, newEnd);
339
}
340
341
342
bool
343
GNEDataSet::checkNewBeginEnd(const GNEDataInterval* dataInterval, const double newBegin, const double newEnd) {
344
// make a copy of myDataIntervalChildren without dataInterval, and check checkNewInterval
345
std::map<const double, GNEDataInterval*> copyOfDataIntervalMap;
346
for (const auto& element : myDataIntervalChildren) {
347
if (element.second != dataInterval) {
348
copyOfDataIntervalMap.insert(element);
349
}
350
}
351
return checkNewInterval(copyOfDataIntervalMap, newBegin, newEnd);
352
}
353
354
355
GNEDataInterval*
356
GNEDataSet::retrieveInterval(const double begin, const double end) const {
357
if (myDataIntervalChildren.count(begin) == 0) {
358
return nullptr;
359
} else if (myDataIntervalChildren.at(begin)->getAttributeDouble(SUMO_ATTR_END) != end) {
360
return nullptr;
361
} else {
362
return myDataIntervalChildren.at(begin);
363
}
364
}
365
366
367
const std::map<const double, GNEDataInterval*>&
368
GNEDataSet::getDataIntervalChildren() const {
369
return myDataIntervalChildren;
370
}
371
372
373
std::string
374
GNEDataSet::getAttribute(SumoXMLAttr key) const {
375
switch (key) {
376
case SUMO_ATTR_ID:
377
return myDataSetID;
378
default:
379
return getCommonAttribute(key);
380
}
381
}
382
383
384
double
385
GNEDataSet::getAttributeDouble(SumoXMLAttr key) const {
386
return getCommonAttributeDouble(key);
387
}
388
389
390
Position
391
GNEDataSet::getAttributePosition(SumoXMLAttr key) const {
392
return getCommonAttributePosition(key);
393
}
394
395
396
PositionVector GNEDataSet::getAttributePositionVector(SumoXMLAttr key) const {
397
return getCommonAttributePositionVector(key);
398
}
399
400
401
void
402
GNEDataSet::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {
403
switch (key) {
404
case SUMO_ATTR_ID:
405
GNEChange_Attribute::changeAttribute(this, key, value, undoList);
406
break;
407
default:
408
setCommonAttribute(key, value, undoList);
409
break;
410
}
411
}
412
413
414
bool
415
GNEDataSet::isValid(SumoXMLAttr key, const std::string& value) {
416
switch (key) {
417
case SUMO_ATTR_ID:
418
if (SUMOXMLDefinitions::isValidNetID(value) && (myNet->getAttributeCarriers()->retrieveDataSet(value, false) == nullptr)) {
419
return true;
420
} else {
421
return false;
422
}
423
default:
424
return isCommonAttributeValid(key, value);
425
}
426
}
427
428
429
std::string
430
GNEDataSet::getPopUpID() const {
431
return getTagStr();
432
}
433
434
435
std::string
436
GNEDataSet::getHierarchyName() const {
437
return getTagStr() + ": " + myDataSetID;
438
}
439
440
441
void
442
GNEDataSet::setAttribute(SumoXMLAttr key, const std::string& value) {
443
switch (key) {
444
case SUMO_ATTR_ID:
445
myDataSetID = value;
446
// update all intervals
447
for (const auto& interval : myDataIntervalChildren) {
448
interval.second->updateGenericDataIDs();
449
}
450
break;
451
default:
452
setCommonAttribute(key, value);
453
break;
454
}
455
// mark interval toolbar for update
456
if (!isTemplate()) {
457
myNet->getViewNet()->getIntervalBar().markForUpdate();
458
}
459
}
460
461
462
bool
463
GNEDataSet::checkNewInterval(const std::map<const double, GNEDataInterval*>& dataIntervalMap, const double newBegin, const double newEnd) {
464
if (dataIntervalMap.empty()) {
465
return true;
466
} else {
467
// declare first and last element
468
const auto itFirstElement = dataIntervalMap.begin();
469
const auto itLastElement = dataIntervalMap.rbegin();
470
if (newBegin > newEnd) {
471
return false;
472
} else if (dataIntervalMap.count(newBegin) == 1) {
473
return false;
474
} else if (newBegin < itFirstElement->first) {
475
return (newEnd <= itFirstElement->first);
476
} else if (newBegin > itLastElement->first) {
477
return (newBegin >= itLastElement->second->getAttributeDouble(SUMO_ATTR_END));
478
} else {
479
// iterate over myDataIntervalChildren
480
for (auto it = itFirstElement; it != dataIntervalMap.end(); it++) {
481
if (newBegin < it->first) {
482
// obtain previous edge
483
auto itPrevious = it;
484
itPrevious--;
485
// check overlapping with end
486
if (itPrevious->second->getAttributeDouble(SUMO_ATTR_END) < newBegin) {
487
return true;
488
}
489
}
490
}
491
}
492
return false;
493
}
494
}
495
496
/****************************************************************************/
497
498