Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/elements/data/GNEGenericData.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 GNEGenericData.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jan 2020
17
///
18
// A abstract class for generic datas
19
/****************************************************************************/
20
21
#include <netedit/GNENet.h>
22
#include <netedit/GNETagPropertiesDatabase.h>
23
#include <netedit/GNEViewParent.h>
24
#include <netedit/frames/common/GNESelectorFrame.h>
25
#include <netedit/frames/data/GNEEdgeDataFrame.h>
26
#include <utils/gui/div/GLHelper.h>
27
#include <utils/gui/div/GUIDesigns.h>
28
#include <utils/gui/div/GUIParameterTableWindow.h>
29
#include <utils/gui/globjects/GUIGLObjectPopupMenu.h>
30
31
#include "GNEDataInterval.h"
32
#include "GNEGenericData.h"
33
34
// ===========================================================================
35
// member method definitions
36
// ===========================================================================
37
38
GNEGenericData::GNEGenericData(SumoXMLTag tag, GNENet* net) :
39
GNEAttributeCarrier(tag, net, "", true),
40
GUIGlObject(net->getTagPropertiesDatabase()->getTagProperty(tag, true)->getGLType(), "",
41
GUIIconSubSys::getIcon(net->getTagPropertiesDatabase()->getTagProperty(tag, true)->getGUIIcon())),
42
GNEPathElement(GNEPathElement::Options::DATA_ELEMENT),
43
myDataIntervalParent(nullptr) {
44
}
45
46
47
GNEGenericData::GNEGenericData(const SumoXMLTag tag, GNEDataInterval* dataIntervalParent, const Parameterised::Map& parameters) :
48
GNEAttributeCarrier(tag, dataIntervalParent->getNet(), dataIntervalParent->getFilename(), false),
49
GUIGlObject(dataIntervalParent->getNet()->getTagPropertiesDatabase()->getTagProperty(tag, true)->getGLType(), dataIntervalParent->getID(),
50
GUIIconSubSys::getIcon(dataIntervalParent->getNet()->getTagPropertiesDatabase()->getTagProperty(tag, true)->getGUIIcon())),
51
GNEPathElement(GNEPathElement::Options::DATA_ELEMENT),
52
Parameterised(parameters),
53
myDataIntervalParent(dataIntervalParent) {
54
}
55
56
57
GNEGenericData::~GNEGenericData() {}
58
59
60
GNEHierarchicalElement*
61
GNEGenericData::getHierarchicalElement() {
62
return this;
63
}
64
65
66
GUIGlObject*
67
GNEGenericData::getGUIGlObject() {
68
return this;
69
}
70
71
72
const GUIGlObject*
73
GNEGenericData::getGUIGlObject() const {
74
return this;
75
}
76
77
78
GNEDataInterval*
79
GNEGenericData::getDataIntervalParent() const {
80
return myDataIntervalParent;
81
}
82
83
84
void
85
GNEGenericData::drawAttribute(const PositionVector& shape) const {
86
if ((myTagProperty->getTag() == GNE_TAG_EDGEREL_SINGLE) && (shape.length() > 0)) {
87
// obtain pointer to edge data frame (only for code legibly)
88
const GNEEdgeDataFrame* edgeDataFrame = myDataIntervalParent->getNet()->getViewNet()->getViewParent()->getEdgeDataFrame();
89
// check if we have to filter generic data
90
if (edgeDataFrame->shown()) {
91
// check attribute
92
if ((edgeDataFrame->getAttributeSelector()->getFilteredAttribute().size() > 0) &&
93
(getParametersMap().count(edgeDataFrame->getAttributeSelector()->getFilteredAttribute()) > 0)) {
94
// get value
95
const std::string value = getParametersMap().at(edgeDataFrame->getAttributeSelector()->getFilteredAttribute());
96
// calculate center position
97
const Position centerPosition = shape.positionAtOffset2D(shape.length2D() / 2);
98
// Add a draw matrix
99
GLHelper::pushMatrix();
100
GLHelper::drawText(value, centerPosition, GLO_MAX, 2, RGBColor::BLUE);
101
// pop draw matrix
102
GLHelper::popMatrix();
103
}
104
}
105
}
106
}
107
108
109
bool
110
GNEGenericData::checkDrawFromContour() const {
111
return false;
112
}
113
114
115
bool
116
GNEGenericData::checkDrawToContour() const {
117
return false;
118
}
119
120
121
bool
122
GNEGenericData::checkDrawRelatedContour() const {
123
// check opened popup
124
if (myNet->getViewNet()->getPopup()) {
125
return myNet->getViewNet()->getPopup()->getGLObject() == this;
126
}
127
return false;
128
}
129
130
131
bool
132
GNEGenericData::checkDrawOverContour() const {
133
return false;
134
}
135
136
137
bool
138
GNEGenericData::checkDrawDeleteContour() const {
139
// get edit modes
140
const auto& editModes = myNet->getViewNet()->getEditModes();
141
// check if we're in delete mode
142
if (editModes.isCurrentSupermodeData() && (editModes.dataEditMode == DataEditMode::DATA_DELETE)) {
143
return myNet->getViewNet()->checkOverLockedElement(this, mySelected);
144
} else {
145
return false;
146
}
147
}
148
149
150
bool
151
GNEGenericData::checkDrawDeleteContourSmall() const {
152
return false;
153
}
154
155
156
bool
157
GNEGenericData::checkDrawSelectContour() const {
158
// get edit modes
159
const auto& editModes = myNet->getViewNet()->getEditModes();
160
// check if we're in select mode
161
if (editModes.isCurrentSupermodeData() && (editModes.dataEditMode == DataEditMode::DATA_SELECT)) {
162
return myNet->getViewNet()->checkOverLockedElement(this, mySelected);
163
} else {
164
return false;
165
}
166
}
167
168
169
bool
170
GNEGenericData::checkDrawMoveContour() const {
171
return false;
172
}
173
174
175
bool
176
GNEGenericData::isGenericDataValid() const {
177
return true;
178
}
179
180
181
std::string
182
GNEGenericData::getGenericDataProblem() const {
183
return "";
184
}
185
186
187
void
188
GNEGenericData::fixGenericDataProblem() {
189
throw InvalidArgument(getTagStr() + " cannot fix any problem");
190
}
191
192
193
GUIGLObjectPopupMenu*
194
GNEGenericData::getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) {
195
// create popup
196
GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, this);
197
// build common options
198
buildPopUpMenuCommonOptions(ret, app, myNet->getViewNet(), myTagProperty->getTag(), mySelected);
199
// show option to open additional dialog
200
if (myTagProperty->hasDialog()) {
201
GUIDesigns::buildFXMenuCommand(ret, (TLF("Open % Dialog", getTagStr())).c_str(), getACIcon(), &parent, MID_OPEN_ADDITIONAL_DIALOG);
202
new FXMenuSeparator(ret);
203
} else {
204
GUIDesigns::buildFXMenuCommand(ret, (TL("Cursor position in view: ") + toString(getPositionInView().x()) + "," + toString(getPositionInView().y())).c_str(), nullptr, nullptr, 0);
205
}
206
return ret;
207
}
208
209
210
GUIParameterTableWindow*
211
GNEGenericData::getParameterWindow(GUIMainWindow& app, GUISUMOAbstractView& /* parent */) {
212
// Create table
213
GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);
214
// Iterate over attributes
215
for (const auto& tagProperty : myTagProperty->getAttributeProperties()) {
216
// Add attribute and set it dynamic if aren't unique
217
if (tagProperty->isUnique()) {
218
ret->mkItem(tagProperty->getAttrStr().c_str(), false, getAttribute(tagProperty->getAttr()));
219
} else {
220
ret->mkItem(tagProperty->getAttrStr().c_str(), true, getAttribute(tagProperty->getAttr()));
221
}
222
}
223
// close building
224
ret->closeBuilding();
225
return ret;
226
}
227
228
229
void
230
GNEGenericData::deleteGLObject() {
231
myNet->deleteGenericData(this, myNet->getViewNet()->getUndoList());
232
}
233
234
235
void
236
GNEGenericData::selectGLObject() {
237
if (isAttributeCarrierSelected()) {
238
unselectAttributeCarrier();
239
} else {
240
selectAttributeCarrier();
241
}
242
// update information label
243
myNet->getViewNet()->getViewParent()->getSelectorFrame()->getSelectionInformation()->updateInformationLabel();
244
}
245
246
247
void
248
GNEGenericData::updateGLObject() {
249
updateGeometry();
250
}
251
252
253
bool
254
GNEGenericData::isPathElementSelected() const {
255
return mySelected;
256
}
257
258
259
const Parameterised::Map&
260
GNEGenericData::getACParametersMap() const {
261
return getParametersMap();
262
}
263
264
// ---------------------------------------------------------------------------
265
// GNEGenericData - protected methods
266
// ---------------------------------------------------------------------------
267
268
void
269
GNEGenericData::drawFilteredAttribute(const GUIVisualizationSettings& s, const PositionVector& laneShape, const std::string& attribute, const GNEDataInterval* dataIntervalParent) const {
270
if ((myDataIntervalParent == dataIntervalParent) && (getParametersMap().count(attribute) > 0)) {
271
const Position pos = laneShape.positionAtOffset2D(laneShape.length2D() * 0.5);
272
const double rot = laneShape.rotationDegreeAtOffset(laneShape.length2D() * 0.5);
273
// Add a draw matrix for details
274
GLHelper::pushMatrix();
275
// draw value
276
GLHelper::drawText(getParameter(attribute), pos, GLO_MAX - 1, 2, RGBColor::BLACK, s.getTextAngle(rot + 90));
277
// pop draw matrix
278
GLHelper::popMatrix();
279
}
280
}
281
282
283
bool
284
GNEGenericData::isVisibleInspectDeleteSelect() const {
285
// get toolbar
286
const GNEViewNetHelper::IntervalBar& toolBar = myNet->getViewNet()->getIntervalBar();
287
// declare flag
288
bool draw = true;
289
// check filter by generic data type
290
if ((toolBar.getGenericDataType() != SUMO_TAG_NOTHING) && (toolBar.getGenericDataType() != myTagProperty->getTag())) {
291
draw = false;
292
}
293
// check filter by data set
294
if (toolBar.getDataSet() && (toolBar.getDataSet() != myDataIntervalParent->getDataSetParent())) {
295
draw = false;
296
}
297
// check filter by begin
298
if ((toolBar.getBegin() != INVALID_DOUBLE) && (toolBar.getBegin() > myDataIntervalParent->getAttributeDouble(SUMO_ATTR_BEGIN))) {
299
draw = false;
300
}
301
// check filter by end
302
if ((toolBar.getEnd() != INVALID_DOUBLE) && (toolBar.getEnd() < myDataIntervalParent->getAttributeDouble(SUMO_ATTR_END))) {
303
draw = false;
304
}
305
// check filter by attribute
306
if ((toolBar.getParameter().size() > 0) && (getParametersMap().count(toolBar.getParameter()) == 0)) {
307
draw = false;
308
}
309
// return flag
310
return draw;
311
}
312
313
void
314
GNEGenericData::replaceFirstParentEdge(const std::string& value) {
315
auto newEdge = myNet->getAttributeCarriers()->retrieveEdge(value);
316
GNEHierarchicalElement::updateParent(this, 0, newEdge);
317
}
318
319
320
void
321
GNEGenericData::replaceLastParentEdge(const std::string& value) {
322
auto newEdge = myNet->getAttributeCarriers()->retrieveEdge(value);
323
GNEHierarchicalElement::updateParent(this, (int)getParentEdges().size() - 1, newEdge);
324
}
325
326
327
void
328
GNEGenericData::replaceParentTAZElement(const int index, const std::string& value) {
329
std::vector<GNEAdditional*> newTAZs = getParentAdditionals();
330
auto TAZ = myNet->getAttributeCarriers()->retrieveAdditional(SUMO_TAG_TAZ, value);
331
// continue depending of index and number of TAZs
332
if (index == 0) {
333
if (newTAZs.size() == 2) {
334
if (newTAZs.at(1)->getID() == value) {
335
newTAZs = {TAZ};
336
} else {
337
newTAZs[0] = TAZ;
338
}
339
} else if (newTAZs.at(0) != TAZ) {
340
newTAZs = {TAZ, newTAZs.at(0)};
341
}
342
} else if (index == 1) {
343
if (newTAZs.size() == 2) {
344
if (newTAZs.at(0)->getID() == value) {
345
newTAZs = {TAZ};
346
} else {
347
newTAZs[1] = TAZ;
348
}
349
} else if (newTAZs.at(0) != TAZ) {
350
newTAZs = {newTAZs.at(0), TAZ};
351
}
352
} else {
353
throw ProcessError(TL("Invalid index"));
354
}
355
GNEHierarchicalElement::updateParents(this, newTAZs);
356
}
357
358
359
std::string
360
GNEGenericData::getPartialID() const {
361
return getDataIntervalParent()->getDataSetParent()->getID() + "[" +
362
getDataIntervalParent()->getAttribute(SUMO_ATTR_BEGIN) + "," +
363
getDataIntervalParent()->getAttribute(SUMO_ATTR_END) + "]:";
364
}
365
366
/****************************************************************************/
367
368