Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/elements/GNEGeneralHandler.cpp
193823 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 GNEGeneralHandler.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Sep 2021
17
///
18
// General element handler for netedit
19
/****************************************************************************/
20
21
#include <utils/xml/XMLSubSys.h>
22
23
#include "GNEGeneralHandler.h"
24
25
// ===========================================================================
26
// method definitions
27
// ===========================================================================
28
29
GNEGeneralHandler::GNEGeneralHandler(GNENet* net, FileBucket* fileBucket, const bool allowUndoRedo) :
30
GeneralHandler(fileBucket),
31
myAdditionalHandler(net, fileBucket, allowUndoRedo),
32
myDemandHandler(net, fileBucket, allowUndoRedo, true),
33
myMeanDataHandler(net, fileBucket, allowUndoRedo) {
34
}
35
36
37
GNEGeneralHandler::~GNEGeneralHandler() {}
38
39
40
void
41
GNEGeneralHandler::forceOverwriteElements() {
42
myAdditionalHandler.forceOverwriteElements();
43
myDemandHandler.forceOverwriteElements();
44
myMeanDataHandler.forceOverwriteElements();
45
}
46
47
48
bool
49
GNEGeneralHandler::isErrorCreatingElement() const {
50
return (myAdditionalHandler.isErrorCreatingElement() ||
51
myDemandHandler.isErrorCreatingElement() ||
52
myMeanDataHandler.isErrorCreatingElement());
53
}
54
55
56
bool
57
GNEGeneralHandler::isAdditionalFile() const {
58
return fileType == TagType::Type::ADDITIONAL;
59
}
60
61
62
bool
63
GNEGeneralHandler::isRouteFile() const {
64
return fileType == TagType::Type::DEMAND;
65
}
66
67
68
bool
69
GNEGeneralHandler::isMeanDataFile() const {
70
return fileType == TagType::Type::MEANDATA;
71
}
72
73
74
void
75
GNEGeneralHandler::beginTag(SumoXMLTag tag, const SUMOSAXAttributes& attrs) {
76
// continue depending of tag
77
switch (tag) {
78
case SUMO_TAG_LOCATION:
79
// process in Network handler
80
myQueue.push_back(TagType(tag, TagType::Type::NETWORK));
81
break;
82
case SUMO_TAG_PARAM:
83
case SUMO_TAG_INTERVAL:
84
if (myQueue.size() > 0) {
85
// try to parse additional or demand element depending of last inserted tag
86
if (myQueue.back().isAdditional() && myAdditionalHandler.beginParseAttributes(tag, attrs)) {
87
myQueue.push_back(TagType(tag, TagType::Type::ADDITIONAL));
88
} else if (myQueue.back().isDemand() && myDemandHandler.beginParseAttributes(tag, attrs)) {
89
myQueue.push_back(TagType(tag, TagType::Type::DEMAND));
90
} else {
91
myQueue.push_back(TagType(tag, TagType::Type::NONE));
92
}
93
} else {
94
myQueue.push_back(TagType(tag, TagType::Type::NONE));
95
}
96
break;
97
case SUMO_TAG_FLOW:
98
if (myQueue.size() > 0) {
99
// try to parse additional or demand element depending of last inserted tag
100
if (myQueue.back().isAdditional() && myAdditionalHandler.beginParseAttributes(tag, attrs)) {
101
myQueue.push_back(TagType(tag, TagType::Type::ADDITIONAL));
102
} else if (myDemandHandler.beginParseAttributes(tag, attrs)) {
103
myQueue.push_back(TagType(tag, TagType::Type::DEMAND));
104
} else {
105
myQueue.push_back(TagType(tag, TagType::Type::NONE));
106
}
107
} else {
108
myQueue.push_back(TagType(tag, TagType::Type::NONE));
109
}
110
break;
111
default:
112
// try to parse additional or demand element
113
if (myAdditionalHandler.beginParseAttributes(tag, attrs)) {
114
myQueue.push_back(TagType(tag, TagType::Type::ADDITIONAL));
115
} else if (myDemandHandler.beginParseAttributes(tag, attrs)) {
116
myQueue.push_back(TagType(tag, TagType::Type::DEMAND));
117
} else if (myMeanDataHandler.beginParseAttributes(tag, attrs)) {
118
myQueue.push_back(TagType(tag, TagType::Type::MEANDATA));
119
} else {
120
myQueue.push_back(TagType(tag, TagType::Type::NONE));
121
}
122
break;
123
}
124
// maximum 10 tagTypes
125
if (myQueue.size() > 10) {
126
myQueue.pop_front();
127
}
128
// check if update handlers
129
const bool abortLoading = myAdditionalHandler.isAbortLoading() ||
130
myDemandHandler.isAbortLoading() ||
131
myMeanDataHandler.isAbortLoading();
132
const bool forceOverwrite = myAdditionalHandler.isForceOverwriteElements() ||
133
myDemandHandler.isForceOverwriteElements() ||
134
myMeanDataHandler.isForceOverwriteElements();
135
const bool forceRemain = myAdditionalHandler.isForceRemainElements() ||
136
myDemandHandler.isForceRemainElements() ||
137
myMeanDataHandler.isForceRemainElements();
138
if (abortLoading) {
139
myAdditionalHandler.abortLoading();
140
myDemandHandler.abortLoading();
141
myMeanDataHandler.abortLoading();
142
} else if (forceOverwrite) {
143
myAdditionalHandler.forceOverwriteElements();
144
myDemandHandler.forceOverwriteElements();
145
myMeanDataHandler.forceOverwriteElements();
146
} else if (forceRemain) {
147
myAdditionalHandler.forceRemainElements();
148
myDemandHandler.forceRemainElements();
149
myMeanDataHandler.forceRemainElements();
150
}
151
}
152
153
154
void
155
GNEGeneralHandler::endTag() {
156
// check tagType
157
if (myQueue.back().isNetwork()) {
158
// currently ignored (will be implemented in the future)
159
} else if (myQueue.back().isAdditional()) {
160
// end parse additional elements
161
myAdditionalHandler.endParseAttributes();
162
// mark file as additional
163
fileType = TagType::Type::ADDITIONAL;
164
} else if (myQueue.back().isDemand()) {
165
// end parse demand elements
166
myDemandHandler.endParseAttributes();
167
// mark file as demand
168
fileType = TagType::Type::DEMAND;
169
} else if (myQueue.back().isMeanData()) {
170
// end parse meanData elements
171
myMeanDataHandler.endParseAttributes();
172
// mark file as mean data
173
fileType = TagType::Type::MEANDATA;
174
} else {
175
// mark file as demand
176
fileType = TagType::Type::NONE;
177
}
178
}
179
180
181
GNEGeneralHandler::TagType::TagType(SumoXMLTag tag_, GNEGeneralHandler::TagType::Type type) :
182
tag(tag_),
183
myType(type) {
184
}
185
186
187
bool
188
GNEGeneralHandler::TagType::isNetwork() const {
189
return (myType == Type::NETWORK);
190
}
191
192
193
bool
194
GNEGeneralHandler::TagType::isAdditional() const {
195
return (myType == Type::ADDITIONAL);
196
}
197
198
199
bool
200
GNEGeneralHandler::TagType::isDemand() const {
201
return (myType == Type::DEMAND);
202
}
203
204
205
bool
206
GNEGeneralHandler::TagType::isData() const {
207
return (myType == Type::DATA);
208
}
209
210
211
bool
212
GNEGeneralHandler::TagType::isMeanData() const {
213
return (myType == Type::MEANDATA);
214
}
215
216
/****************************************************************************/
217
218