Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/elements/data/GNEDataHandler.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 GNEDataHandler.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jan 2020
17
///
18
// Builds data objects for netedit
19
/****************************************************************************/
20
21
#include <netedit/changes/GNEChange_DataInterval.h>
22
#include <netedit/changes/GNEChange_DataSet.h>
23
#include <netedit/changes/GNEChange_GenericData.h>
24
#include <netedit/dialogs/basic/GNEOverwriteElement.h>
25
#include <netedit/elements/data/GNEDataInterval.h>
26
#include <netedit/elements/data/GNEEdgeData.h>
27
#include <netedit/elements/data/GNEEdgeRelData.h>
28
#include <netedit/elements/data/GNETAZRelData.h>
29
#include <netedit/GNEApplicationWindow.h>
30
#include <netedit/GNENet.h>
31
#include <netedit/GNETagProperties.h>
32
#include <netedit/GNEUndoList.h>
33
#include <netedit/GNEViewNet.h>
34
#include <utils/gui/div/GUIDesigns.h>
35
36
#include "GNEDataHandler.h"
37
38
// ===========================================================================
39
// member method definitions
40
// ===========================================================================
41
42
GNEDataHandler::GNEDataHandler(GNENet* net, FileBucket* fileBucket, const bool allowUndoRedo) :
43
DataHandler(fileBucket),
44
myNet(net),
45
myAllowUndoRedo(allowUndoRedo) {
46
}
47
48
49
GNEDataHandler::~GNEDataHandler() {
50
// update options based in current buckets
51
myNet->getGNEApplicationWindow()->getFileBucketHandler()->updateOptions();
52
}
53
54
55
bool
56
GNEDataHandler::buildDataSet(const std::string& id) {
57
// first check if dataSet exist
58
if (!checkValidAdditionalID(SUMO_TAG_DATASET, id)) {
59
return false;
60
} else if (!checkDuplicatedDataSet(id)) {
61
return false;
62
} else {
63
GNEDataSet* dataSet = new GNEDataSet(id, myNet, myFileBucket);
64
if (myAllowUndoRedo) {
65
myNet->getUndoList()->begin(dataSet, TL("add data set"));
66
myNet->getUndoList()->add(new GNEChange_DataSet(dataSet, true), true);
67
myNet->getUndoList()->end();
68
} else {
69
// insert dataSet without allowing undo/redo
70
myNet->getAttributeCarriers()->insertDataSet(dataSet);
71
dataSet->incRef("buildDataSet");
72
}
73
return true;
74
}
75
}
76
77
78
bool
79
GNEDataHandler::buildDataInterval(const CommonXMLStructure::SumoBaseObject* /* sumoBaseObject */,
80
const std::string& dataSetID, const double begin, const double end) {
81
// get dataSet
82
GNEDataSet* dataSet = myNet->getAttributeCarriers()->retrieveDataSet(dataSetID, false);
83
// first check if dataSet exist
84
if (dataSet == nullptr) {
85
// create dataset AND data interval
86
dataSet = new GNEDataSet(dataSetID, myNet, myFileBucket);
87
GNEDataInterval* dataInterval = new GNEDataInterval(dataSet, begin, end);
88
if (myAllowUndoRedo) {
89
myNet->getUndoList()->begin(dataInterval, TL("add data set and data interval"));
90
myNet->getUndoList()->add(new GNEChange_DataSet(dataSet, true), true);
91
myNet->getUndoList()->add(new GNEChange_DataInterval(dataInterval, true), true);
92
myNet->getUndoList()->end();
93
} else {
94
// insert dataSet allowing undo/redo
95
myNet->getAttributeCarriers()->insertDataSet(dataSet);
96
dataSet->incRef("buildDataInterval");
97
// insert dataInterval without allowing undo/redo
98
dataSet->addDataIntervalChild(dataInterval);
99
dataInterval->incRef("buildDataInterval");
100
}
101
return true;
102
} else if (dataSet->retrieveInterval(begin, end) == nullptr) {
103
GNEDataInterval* dataInterval = new GNEDataInterval(dataSet, begin, end);
104
if (myAllowUndoRedo) {
105
myNet->getUndoList()->begin(dataInterval, TL("add data interval"));
106
myNet->getUndoList()->add(new GNEChange_DataInterval(dataInterval, true), true);
107
myNet->getUndoList()->end();
108
} else {
109
// insert dataInterval without allowing undo/redo
110
dataSet->addDataIntervalChild(dataInterval);
111
dataInterval->incRef("buildDataInterval");
112
}
113
return true;
114
} else {
115
return false;
116
}
117
}
118
119
120
bool
121
GNEDataHandler::buildEdgeData(const CommonXMLStructure::SumoBaseObject* sumoBaseObject, const std::string& edgeID,
122
const Parameterised::Map& parameters) {
123
// get dataSet
124
GNEDataSet* dataSet = myNet->getAttributeCarriers()->retrieveDataSet(sumoBaseObject->getParentSumoBaseObject()->getStringAttribute(SUMO_ATTR_ID), false);
125
if (dataSet) {
126
// get interval
127
GNEDataInterval* dataInterval = dataSet->retrieveInterval(
128
sumoBaseObject->getParentSumoBaseObject()->getDoubleAttribute(SUMO_ATTR_BEGIN),
129
sumoBaseObject->getParentSumoBaseObject()->getDoubleAttribute(SUMO_ATTR_END));
130
if (dataInterval) {
131
// get data
132
GNEEdge* edge = myNet->getAttributeCarriers()->retrieveEdge(edgeID, false);
133
if (edge == nullptr) {
134
return writeErrorInvalidParent(GNE_TAG_EDGEREL_SINGLE, {SUMO_TAG_EDGE});
135
} else if (dataInterval->edgeRelSingleExists(edge)) {
136
return writeError(TLF("There is already a edgeRel defined in edge '%'.", edge));
137
} else {
138
// create edge data
139
GNEGenericData* edgeData = new GNEEdgeData(dataInterval, edge, parameters);
140
if (myAllowUndoRedo) {
141
myNet->getUndoList()->begin(edgeData, TL("add edge rel"));
142
myNet->getUndoList()->add(new GNEChange_GenericData(edgeData, true), true);
143
myNet->getUndoList()->end();
144
} else {
145
dataInterval->addGenericDataChild(edgeData);
146
edge->addChildElement(edgeData);
147
edgeData->incRef("buildEdgeData");
148
}
149
return true;
150
}
151
} else {
152
return writeErrorInvalidParent(GNE_TAG_EDGEREL_SINGLE, {SUMO_TAG_DATAINTERVAL});
153
}
154
} else {
155
return writeErrorInvalidParent(GNE_TAG_EDGEREL_SINGLE, {SUMO_TAG_DATASET});
156
}
157
}
158
159
160
bool
161
GNEDataHandler::buildEdgeRelationData(const CommonXMLStructure::SumoBaseObject* sumoBaseObject, const std::string& fromEdgeID,
162
const std::string& toEdgeID, const Parameterised::Map& parameters) {
163
// get dataSet
164
GNEDataSet* dataSet = myNet->getAttributeCarriers()->retrieveDataSet(sumoBaseObject->getParentSumoBaseObject()->getStringAttribute(SUMO_ATTR_ID), false);
165
if (dataSet != nullptr) {
166
// get interval
167
GNEDataInterval* dataInterval = dataSet->retrieveInterval(
168
sumoBaseObject->getParentSumoBaseObject()->getDoubleAttribute(SUMO_ATTR_BEGIN),
169
sumoBaseObject->getParentSumoBaseObject()->getDoubleAttribute(SUMO_ATTR_END));
170
if (dataInterval != nullptr) {
171
// get data
172
GNEEdge* const fromEdge = myNet->getAttributeCarriers()->retrieveEdge(fromEdgeID, false);
173
GNEEdge* const toEdge = myNet->getAttributeCarriers()->retrieveEdge(toEdgeID, false);
174
if (fromEdge == nullptr) {
175
return writeErrorInvalidParent(SUMO_TAG_EDGEREL, {SUMO_TAG_EDGE}, fromEdgeID);
176
} else if (toEdge == nullptr) {
177
return writeErrorInvalidParent(SUMO_TAG_EDGEREL, {SUMO_TAG_EDGE}, toEdgeID);
178
} else if (dataInterval->edgeRelExists(fromEdge, toEdge)) {
179
return writeError(TLF("There is already a edgeRel defined between '%' and '%'.", fromEdgeID, toEdgeID));
180
} else {
181
GNEGenericData* edgeData = new GNEEdgeRelData(dataInterval, fromEdge, toEdge, parameters);
182
if (myAllowUndoRedo) {
183
myNet->getUndoList()->begin(edgeData, TL("add edge rel"));
184
myNet->getUndoList()->add(new GNEChange_GenericData(edgeData, true), true);
185
myNet->getUndoList()->end();
186
} else {
187
dataInterval->addGenericDataChild(edgeData);
188
fromEdge->addChildElement(edgeData);
189
toEdge->addChildElement(edgeData);
190
edgeData->incRef("buildEdgeRelationData");
191
}
192
return true;
193
}
194
} else {
195
return writeErrorInvalidParent(SUMO_TAG_EDGEREL, {SUMO_TAG_DATAINTERVAL});
196
}
197
} else {
198
return writeErrorInvalidParent(SUMO_TAG_EDGEREL, {SUMO_TAG_DATASET});
199
}
200
}
201
202
203
bool
204
GNEDataHandler::buildTAZRelationData(const CommonXMLStructure::SumoBaseObject* sumoBaseObject, const std::string& fromTAZID,
205
const std::string& toTAZID, const Parameterised::Map& parameters) {
206
// get dataSet
207
GNEDataSet* dataSet = myNet->getAttributeCarriers()->retrieveDataSet(sumoBaseObject->getParentSumoBaseObject()->getStringAttribute(SUMO_ATTR_ID), false);
208
if (dataSet != nullptr) {
209
// get interval
210
GNEDataInterval* dataInterval = dataSet->retrieveInterval(
211
sumoBaseObject->getParentSumoBaseObject()->getDoubleAttribute(SUMO_ATTR_BEGIN),
212
sumoBaseObject->getParentSumoBaseObject()->getDoubleAttribute(SUMO_ATTR_END));
213
if (dataInterval != nullptr) {
214
// get from TAZs
215
GNEAdditional* fromTAZ = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_TAZ, fromTAZID, false);
216
GNEAdditional* toTAZ = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_TAZ, toTAZID, false);
217
if (fromTAZ == nullptr) {
218
return writeErrorInvalidParent(SUMO_TAG_TAZREL, {SUMO_TAG_TAZ}, fromTAZID);
219
} else if (toTAZ == nullptr) {
220
return writeErrorInvalidParent(SUMO_TAG_TAZREL, {SUMO_TAG_TAZ}, toTAZID);
221
} else if ((fromTAZ != toTAZ) && dataInterval->TAZRelExists(fromTAZ, toTAZ)) {
222
return writeError(TLF("There is already a TAZ rel defined between '%' and '%'.", fromTAZID, toTAZID));
223
} else if ((fromTAZ == toTAZ) && dataInterval->TAZRelExists(fromTAZ)) {
224
return writeError(TLF("There is already a TAZ rel defined in '%'.", toTAZID));
225
} else if (fromTAZ == toTAZ) {
226
GNEGenericData* edgeData = new GNETAZRelData(dataInterval, fromTAZ, parameters);
227
if (myAllowUndoRedo) {
228
myNet->getUndoList()->begin(edgeData, TL("add TAZ rel"));
229
myNet->getUndoList()->add(new GNEChange_GenericData(edgeData, true), true);
230
myNet->getUndoList()->end();
231
} else {
232
dataInterval->addGenericDataChild(edgeData);
233
fromTAZ->addChildElement(edgeData);
234
edgeData->incRef("buildTAZRelationData");
235
}
236
return true;
237
} else {
238
GNEGenericData* edgeData = new GNETAZRelData(dataInterval, fromTAZ, toTAZ, parameters);
239
if (myAllowUndoRedo) {
240
myNet->getUndoList()->begin(edgeData, TL("add TAZ rel"));
241
myNet->getUndoList()->add(new GNEChange_GenericData(edgeData, true), true);
242
myNet->getUndoList()->end();
243
} else {
244
dataInterval->addGenericDataChild(edgeData);
245
fromTAZ->addChildElement(edgeData);
246
toTAZ->addChildElement(edgeData);
247
edgeData->incRef("buildTAZRelationData");
248
}
249
return true;
250
}
251
} else {
252
return writeErrorInvalidParent(SUMO_TAG_TAZREL, {SUMO_TAG_DATAINTERVAL});
253
}
254
} else {
255
return writeErrorInvalidParent(SUMO_TAG_TAZREL, {SUMO_TAG_DATASET});
256
}
257
}
258
259
260
bool
261
GNEDataHandler::checkDuplicatedDataSet(const std::string& id) {
262
// retrieve data set
263
auto dataSet = myNet->getAttributeCarriers()->retrieveDataSet(id, false);
264
// if demand exist, check if overwrite (delete)
265
if (dataSet) {
266
if (myOverwriteElements) {
267
// delete data element (and all of their childrens)
268
myNet->deleteDataSet(dataSet, myNet->getUndoList());
269
} else if (myRemainElements) {
270
// duplicated dataset
271
return writeWarningDuplicated(SUMO_TAG_DATASET, id, SUMO_TAG_DATASET);
272
} else {
273
// open overwrite dialog
274
GNEOverwriteElement overwriteElementDialog(this, dataSet);
275
// continue depending of result
276
if (overwriteElementDialog.getResult() == GNEOverwriteElement::Result::ACCEPT) {
277
// delete data element (and all of their childrens)
278
myNet->deleteDataSet(dataSet, myNet->getUndoList());
279
} else if (overwriteElementDialog.getResult() == GNEOverwriteElement::Result::CANCEL) {
280
// duplicated dataset
281
return writeWarningDuplicated(SUMO_TAG_DATASET, id, SUMO_TAG_DATASET);
282
} else {
283
return false;
284
}
285
}
286
}
287
return true;
288
}
289
290
/****************************************************************************/
291
292