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