Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/frames/common/GNEDeleteFrame.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 GNEDeleteFrame.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Dec 2016
17
///
18
// The Widget for remove network-elements
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/GNENet.h>
23
#include <netedit/GNEInternalTest.h>
24
#include <netedit/GNEViewParent.h>
25
#include <netedit/GNETagProperties.h>
26
#include <netedit/GNEUndoList.h>
27
#include <netedit/dialogs/basic/GNEWarningBasicDialog.h>
28
#include <netedit/elements/additional/GNEPoly.h>
29
#include <netedit/elements/additional/GNETAZ.h>
30
#include <netedit/elements/network/GNEConnection.h>
31
#include <netedit/elements/network/GNECrossing.h>
32
#include <utils/gui/div/GUIDesigns.h>
33
34
#include "GNEDeleteFrame.h"
35
36
// ===========================================================================
37
// FOX callback mapping
38
// ===========================================================================
39
40
FXDEFMAP(GNEDeleteFrame::DeleteOptions) DeleteOptionsMap[] = {
41
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNEDeleteFrame::DeleteOptions::onCmdSetOption),
42
};
43
44
FXDEFMAP(GNEDeleteFrame::ProtectElements) ProtectElementsMap[] = {
45
FXMAPFUNC(SEL_COMMAND, MID_GNE_PROTECT_ALL, GNEDeleteFrame::ProtectElements::onCmdProtectAll),
46
FXMAPFUNC(SEL_UPDATE, MID_GNE_PROTECT_ALL, GNEDeleteFrame::ProtectElements::onUpdProtectAll),
47
FXMAPFUNC(SEL_COMMAND, MID_GNE_UNPROTECT_ALL, GNEDeleteFrame::ProtectElements::onCmdUnprotectAll),
48
FXMAPFUNC(SEL_UPDATE, MID_GNE_UNPROTECT_ALL, GNEDeleteFrame::ProtectElements::onUpdUnprotectAll),
49
};
50
51
// Object implementation
52
FXIMPLEMENT(GNEDeleteFrame::DeleteOptions, MFXGroupBoxModule, DeleteOptionsMap, ARRAYNUMBER(DeleteOptionsMap))
53
FXIMPLEMENT(GNEDeleteFrame::ProtectElements, MFXGroupBoxModule, ProtectElementsMap, ARRAYNUMBER(ProtectElementsMap))
54
55
// ---------------------------------------------------------------------------
56
// GNEDeleteFrame::DeleteOptions - methods
57
// ---------------------------------------------------------------------------
58
59
GNEDeleteFrame::DeleteOptions::DeleteOptions(GNEDeleteFrame* deleteFrameParent) :
60
MFXGroupBoxModule(deleteFrameParent, TL("Options")),
61
myDeleteFrameParent(deleteFrameParent) {
62
// Create checkbox for enable/disable delete only geomtery point(by default, disabled)
63
myDeleteOnlyGeometryPoints = new FXCheckButton(getCollapsableFrame(), TL("Delete geometry points"), this, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);
64
myDeleteOnlyGeometryPoints->setCheck(FALSE);
65
}
66
67
68
GNEDeleteFrame::DeleteOptions::~DeleteOptions() {}
69
70
71
bool
72
GNEDeleteFrame::DeleteOptions::deleteOnlyGeometryPoints() const {
73
return (myDeleteOnlyGeometryPoints->getCheck() == TRUE);
74
}
75
76
77
long
78
GNEDeleteFrame::DeleteOptions::onCmdSetOption(FXObject*, FXSelector, void*) {
79
myDeleteFrameParent->getViewNet()->update();
80
return 1;
81
}
82
83
// ---------------------------------------------------------------------------
84
// GNEDeleteFrame::SubordinatedElements - methods
85
// ---------------------------------------------------------------------------
86
87
GNEDeleteFrame::SubordinatedElements::SubordinatedElements(const GNEJunction* junction) :
88
SubordinatedElements(junction, junction->getNet()->getViewNet(), junction) {
89
// add the number of subodinated elements of child edges
90
for (const auto& edge : junction->getChildEdges()) {
91
addValuesFromSubordinatedElements(this, edge);
92
}
93
}
94
95
96
GNEDeleteFrame::SubordinatedElements::SubordinatedElements(const GNEEdge* edge) :
97
SubordinatedElements(edge, edge->getNet()->getViewNet(), edge) {
98
// add the number of subodinated elements of child lanes
99
for (const auto& lane : edge->getChildLanes()) {
100
addValuesFromSubordinatedElements(this, lane);
101
}
102
}
103
104
105
GNEDeleteFrame::SubordinatedElements::SubordinatedElements(const GNELane* lane) :
106
SubordinatedElements(lane, lane->getNet()->getViewNet(), lane) {
107
}
108
109
110
GNEDeleteFrame::SubordinatedElements::SubordinatedElements(const GNEAdditional* additional) :
111
SubordinatedElements(additional, additional->getNet()->getViewNet()) {
112
}
113
114
115
GNEDeleteFrame::SubordinatedElements::SubordinatedElements(const GNEDemandElement* demandElement) :
116
SubordinatedElements(demandElement, demandElement->getNet()->getViewNet()) {
117
}
118
119
120
GNEDeleteFrame::SubordinatedElements::SubordinatedElements(const GNEGenericData* genericData) :
121
SubordinatedElements(genericData, genericData->getNet()->getViewNet()) {
122
}
123
124
125
GNEDeleteFrame::SubordinatedElements::~SubordinatedElements() {}
126
127
128
bool
129
GNEDeleteFrame::SubordinatedElements::checkElements(const ProtectElements* protectElements) {
130
// check if running internal tests
131
const auto internalTest = protectElements->getDeleteFrameParent()->getViewNet()->getViewParent()->getGNEAppWindows()->getInternalTest();
132
const bool runningInternalTests = internalTest ? internalTest->isRunning() : false;
133
// check every parent/child
134
if ((myAdditionalParents > 0) && protectElements->protectAdditionals()) {
135
openWarningDialog("additional", myAdditionalParents, false, runningInternalTests);
136
} else if ((myAdditionalChilds > 0) && protectElements->protectAdditionals()) {
137
openWarningDialog("additional", myAdditionalChilds, true, runningInternalTests);
138
} else if ((myDemandElementParents > 0) && protectElements->protectDemandElements()) {
139
openWarningDialog("demand", myDemandElementParents, false, runningInternalTests);
140
} else if ((myDemandElementChilds > 0) && protectElements->protectDemandElements()) {
141
openWarningDialog("demand", myDemandElementChilds, true, runningInternalTests);
142
} else if ((myGenericDataParents > 0) && protectElements->protectGenericDatas()) {
143
openWarningDialog("data", myGenericDataParents, false, runningInternalTests);
144
} else if ((myGenericDataChilds > 0) && protectElements->protectGenericDatas()) {
145
openWarningDialog("data", myGenericDataChilds, true, runningInternalTests);
146
} else {
147
// all checks ok, then return true, to remove element
148
return true;
149
}
150
return false;
151
}
152
153
154
GNEDeleteFrame::SubordinatedElements::SubordinatedElements(const GNEAttributeCarrier* attributeCarrier, GNEViewNet* viewNet) :
155
myAttributeCarrier(attributeCarrier),
156
myViewNet(viewNet),
157
myAdditionalParents(0),
158
myAdditionalChilds(0),
159
myDemandElementParents(0),
160
myDemandElementChilds(0),
161
myGenericDataParents(0),
162
myGenericDataChilds(0) {
163
}
164
165
166
GNEDeleteFrame::SubordinatedElements::SubordinatedElements(const GNEAttributeCarrier* attributeCarrier, GNEViewNet* viewNet,
167
const GNEHierarchicalElement* hierarchicalElement) :
168
myAttributeCarrier(attributeCarrier),
169
myViewNet(viewNet),
170
myAdditionalParents(hierarchicalElement->getParentAdditionals().size()),
171
myAdditionalChilds(hierarchicalElement->getChildAdditionals().size()),
172
myDemandElementParents(hierarchicalElement->getParentDemandElements().size()),
173
myDemandElementChilds(hierarchicalElement->getChildDemandElements().size()),
174
myGenericDataParents(hierarchicalElement->getParentGenericDatas().size()),
175
myGenericDataChilds(hierarchicalElement->getChildGenericDatas().size()) {
176
// add the number of subodinated elements of additionals, demand elements and generic datas
177
for (const auto& additionalParent : hierarchicalElement->getParentAdditionals()) {
178
addValuesFromSubordinatedElements(this, additionalParent);
179
}
180
for (const auto& demandParent : hierarchicalElement->getParentDemandElements()) {
181
addValuesFromSubordinatedElements(this, demandParent);
182
}
183
for (const auto& genericDataParent : hierarchicalElement->getParentGenericDatas()) {
184
addValuesFromSubordinatedElements(this, genericDataParent);
185
}
186
for (const auto& additionalChild : hierarchicalElement->getChildAdditionals()) {
187
addValuesFromSubordinatedElements(this, additionalChild);
188
}
189
for (const auto& demandChild : hierarchicalElement->getChildDemandElements()) {
190
addValuesFromSubordinatedElements(this, demandChild);
191
}
192
for (const auto& genericDataChild : hierarchicalElement->getChildGenericDatas()) {
193
addValuesFromSubordinatedElements(this, genericDataChild);
194
}
195
}
196
197
198
void
199
GNEDeleteFrame::SubordinatedElements::addValuesFromSubordinatedElements(SubordinatedElements* originalSE, const SubordinatedElements& newSE) {
200
originalSE->myAdditionalParents += newSE.myAdditionalParents;
201
originalSE->myAdditionalChilds += newSE.myAdditionalChilds;
202
originalSE->myDemandElementParents += newSE.myDemandElementParents;
203
originalSE->myDemandElementChilds += newSE.myDemandElementChilds;
204
originalSE->myGenericDataParents += newSE.myGenericDataParents;
205
originalSE->myGenericDataChilds += newSE.myGenericDataChilds;
206
}
207
208
209
void
210
GNEDeleteFrame::SubordinatedElements::openWarningDialog(const std::string& type, const size_t number, const bool isChild, const bool runningInternalTests) {
211
// declare plural depending of "number"
212
const std::string plural = (number > 1) ? "s" : "";
213
// declare header
214
const std::string header = "Problem deleting " + myAttributeCarrier->getTagProperty()->getTagStr() + " '" + myAttributeCarrier->getID() + "'";
215
// declare message
216
std::string msg;
217
// set message depending of isChild
218
if (isChild) {
219
msg = myAttributeCarrier->getTagProperty()->getTagStr() + " '" + myAttributeCarrier->getID() +
220
"' cannot be deleted because it has " + toString(number) + " " + type + " element" + plural + ".\n" +
221
"To delete it, uncheck 'protect " + type + " elements'.";
222
} else {
223
msg = myAttributeCarrier->getTagProperty()->getTagStr() + " '" + myAttributeCarrier->getID() +
224
"' cannot be deleted because it is part of " + toString(number) + " " + type + " element" + plural + ".\n" +
225
"To delete it, uncheck 'protect " + type + " elements'.";
226
}
227
// open message box only if we're not running internal tests
228
if (!runningInternalTests) {
229
GNEWarningBasicDialog(myViewNet->getViewParent()->getGNEAppWindows(), header, msg);
230
}
231
}
232
233
// ---------------------------------------------------------------------------
234
// GNEDeleteFrame::ProtectElements - methods
235
// ---------------------------------------------------------------------------
236
237
GNEDeleteFrame::ProtectElements::ProtectElements(GNEDeleteFrame* deleteFrameParent) :
238
MFXGroupBoxModule(deleteFrameParent, TL("Protect Elements")),
239
myDeleteFrameParent(deleteFrameParent) {
240
// Create "Protect all" Button
241
myProtectAllButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Protect all"), "", TL("Protect all elements"), nullptr, this, MID_GNE_PROTECT_ALL, GUIDesignButton);
242
// start disabled (because allelements are protected)
243
myProtectAllButton->disable();
244
// Create "Unprotect all" Button
245
myUnprotectAllButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Unprotect all"), "", TL("Unprotect all elements"), nullptr, this, MID_GNE_UNPROTECT_ALL, GUIDesignButton);
246
// Create checkbox for enable/disable delete only geomtery point(by default, disabled)
247
myProtectAdditionals = new FXCheckButton(getCollapsableFrame(), TL("Protect additional elements"), deleteFrameParent, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);
248
myProtectAdditionals->setCheck(TRUE);
249
// Create checkbox for enable/disable delete only geomtery point(by default, disabled)
250
myProtectTAZs = new FXCheckButton(getCollapsableFrame(), TL("Protect TAZ elements"), deleteFrameParent, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);
251
myProtectTAZs->setCheck(TRUE);
252
// Create checkbox for enable/disable delete only geomtery point(by default, disabled)
253
myProtectDemandElements = new FXCheckButton(getCollapsableFrame(), TL("Protect demand elements"), deleteFrameParent, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);
254
myProtectDemandElements->setCheck(TRUE);
255
// Create checkbox for enable/disable delete only geomtery point(by default, disabled)
256
myProtectGenericDatas = new FXCheckButton(getCollapsableFrame(), TL("Protect data elements"), deleteFrameParent, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);
257
myProtectGenericDatas->setCheck(TRUE);
258
}
259
260
261
GNEDeleteFrame::ProtectElements::~ProtectElements() {}
262
263
264
GNEDeleteFrame*
265
GNEDeleteFrame::ProtectElements::getDeleteFrameParent() const {
266
return myDeleteFrameParent;
267
}
268
269
270
bool
271
GNEDeleteFrame::ProtectElements::protectAdditionals() const {
272
return (myProtectAdditionals->getCheck() == TRUE);
273
}
274
275
276
bool
277
GNEDeleteFrame::ProtectElements::protectTAZs() const {
278
return (myProtectTAZs->getCheck() == TRUE);
279
}
280
281
282
bool
283
GNEDeleteFrame::ProtectElements::protectDemandElements() const {
284
return (myProtectDemandElements->getCheck() == TRUE);
285
}
286
287
288
bool
289
GNEDeleteFrame::ProtectElements::protectGenericDatas() const {
290
return (myProtectGenericDatas->getCheck() == TRUE);
291
}
292
293
294
long
295
GNEDeleteFrame::ProtectElements::onCmdProtectAll(FXObject*, FXSelector, void*) {
296
myProtectAdditionals->setCheck(TRUE);
297
myProtectTAZs->setCheck(TRUE);
298
myProtectDemandElements->setCheck(TRUE);
299
myProtectGenericDatas->setCheck(TRUE);
300
myUnprotectAllButton->enable();
301
return 1;
302
}
303
304
305
long
306
GNEDeleteFrame::ProtectElements::onCmdUnprotectAll(FXObject*, FXSelector, void*) {
307
myProtectAdditionals->setCheck(FALSE);
308
myProtectTAZs->setCheck(FALSE);
309
myProtectDemandElements->setCheck(FALSE);
310
myProtectGenericDatas->setCheck(FALSE);
311
myProtectAllButton->enable();
312
return 1;
313
}
314
315
316
long
317
GNEDeleteFrame::ProtectElements::onUpdProtectAll(FXObject* sender, FXSelector, void*) {
318
if (myProtectAdditionals->getCheck() && myProtectTAZs->getCheck() &&
319
myProtectDemandElements->getCheck() && myProtectGenericDatas->getCheck()) {
320
return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
321
} else {
322
return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
323
}
324
}
325
326
327
long
328
GNEDeleteFrame::ProtectElements::onUpdUnprotectAll(FXObject* sender, FXSelector, void*) {
329
if (!myProtectAdditionals->getCheck() && !myProtectTAZs->getCheck() &&
330
!myProtectDemandElements->getCheck() && !myProtectGenericDatas->getCheck()) {
331
return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
332
} else {
333
return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
334
}
335
}
336
337
// ===========================================================================
338
// method definitions
339
// ===========================================================================
340
341
GNEDeleteFrame::GNEDeleteFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :
342
GNEFrame(viewParent, viewNet, TL("Delete")) {
343
// create delete options module
344
myDeleteOptions = new DeleteOptions(this);
345
// create protect elements module
346
myProtectElements = new ProtectElements(this);
347
}
348
349
350
GNEDeleteFrame::~GNEDeleteFrame() {
351
}
352
353
354
void
355
GNEDeleteFrame::show() {
356
GNEFrame::show();
357
}
358
359
360
void
361
GNEDeleteFrame::hide() {
362
GNEFrame::hide();
363
}
364
365
366
void
367
GNEDeleteFrame::removeSelectedAttributeCarriers() {
368
// get attribute carriers
369
const auto& attributeCarriers = myViewNet->getNet()->getAttributeCarriers();
370
// first check if there is additional to remove
371
if (selectedACsToDelete()) {
372
// remove all selected attribute carriers using the following parent-child sequence
373
myViewNet->getUndoList()->begin(GUIIcon::MODEDELETE, TL("remove selected items"));
374
// disable update geometry
375
myViewNet->getNet()->disableUpdateGeometry();
376
// delete selected attribute carriers depending of current supermode
377
if (myViewNet->getEditModes().isCurrentSupermodeNetwork()) {
378
//junctions
379
const auto selectedJunctions = attributeCarriers->getSelectedJunctions();
380
for (const auto& selectedJunction : selectedJunctions) {
381
myViewNet->getNet()->deleteJunction(selectedJunction, myViewNet->getUndoList());
382
}
383
// edges
384
const auto selectedEdges = attributeCarriers->getSelectedEdges();
385
for (const auto& selectedEdge : selectedEdges) {
386
myViewNet->getNet()->deleteEdge(selectedEdge, myViewNet->getUndoList(), false);
387
}
388
// lanes
389
const auto selectedLanes = attributeCarriers->getSelectedLanes();
390
for (const auto& selectedLane : selectedLanes) {
391
myViewNet->getNet()->deleteLane(selectedLane, myViewNet->getUndoList(), false);
392
}
393
// connections
394
const auto selectedConnections = attributeCarriers->getSelectedConnections();
395
for (const auto& selectedConnection : selectedConnections) {
396
myViewNet->getNet()->deleteConnection(selectedConnection, myViewNet->getUndoList());
397
}
398
// crossings
399
const auto selectedCrossings = attributeCarriers->getSelectedCrossings();
400
for (const auto& selectedCrossing : selectedCrossings) {
401
myViewNet->getNet()->deleteCrossing(selectedCrossing, myViewNet->getUndoList());
402
}
403
// additionals (including Polygons, POIs, TAZs and Wires)
404
while (attributeCarriers->getNumberOfSelectedAdditionals() > 0) {
405
myViewNet->getNet()->deleteAdditional(attributeCarriers->getSelectedAdditionals().front(), myViewNet->getUndoList());
406
}
407
} else if (myViewNet->getEditModes().isCurrentSupermodeDemand()) {
408
// demand elements
409
while (attributeCarriers->getNumberOfSelectedDemandElements() > 0) {
410
myViewNet->getNet()->deleteDemandElement(attributeCarriers->getSelectedDemandElements().front(), myViewNet->getUndoList());
411
}
412
} else if (myViewNet->getEditModes().isCurrentSupermodeData()) {
413
// generic datas
414
auto selectedGenericDatas = attributeCarriers->getSelectedGenericDatas();
415
for (const auto& selectedGenericData : selectedGenericDatas) {
416
myViewNet->getNet()->deleteGenericData(selectedGenericData, myViewNet->getUndoList());
417
}
418
}
419
// enable update geometry
420
myViewNet->getNet()->enableUpdateGeometry();
421
// finish deletion
422
myViewNet->getUndoList()->end();
423
}
424
}
425
426
427
void
428
GNEDeleteFrame::removeAttributeCarrier(const GNEViewNetHelper::ViewObjectsSelector& viewObjects) {
429
// disable update geometry
430
myViewNet->getNet()->disableUpdateGeometry();
431
// first check if there more than one clicked GL object under cursor
432
if (viewObjects.getGLObjects().size() > 1) {
433
std::vector<GUIGlObject*> filteredGLObjects;
434
// filter objects
435
for (const auto& glObject : viewObjects.getGLObjects()) {
436
if (glObject->isGLObjectLocked()) {
437
continue;
438
}
439
filteredGLObjects.push_back(glObject);
440
}
441
// now filter elements based on the first element
442
filteredGLObjects = GNEViewNetHelper::filterElementsByLayer(filteredGLObjects);
443
// after filter, check if there is more than one element
444
if (filteredGLObjects.size() > 1) {
445
// use Cursor dialog
446
myViewNet->openDeleteDialogAtCursor(filteredGLObjects);
447
} else if (filteredGLObjects.size() > 0) {
448
filteredGLObjects.front()->deleteGLObject();
449
}
450
} else if ((viewObjects.getGLObjects().size() > 0) &&
451
!viewObjects.getGLObjects().front()->isGLObjectLocked()) {
452
viewObjects.getGLObjects().front()->deleteGLObject();
453
}
454
// enable update geometry
455
myViewNet->getNet()->enableUpdateGeometry();
456
}
457
458
459
bool
460
GNEDeleteFrame::removeGeometryPoint(const GNEViewNetHelper::ViewObjectsSelector& viewObjects) {
461
// get clicked position
462
const Position clickedPosition = myViewNet->getPositionInformation();
463
// filter elements with geometry points
464
for (const auto& AC : viewObjects.getAttributeCarriers()) {
465
if (AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
466
viewObjects.getEdgeFront()->removeGeometryPoint(clickedPosition, myViewNet->getUndoList());
467
return true;
468
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_POLY) {
469
viewObjects.getPolyFront()->removeGeometryPoint(clickedPosition, myViewNet->getUndoList());
470
return true;
471
} else if (AC->getTagProperty()->getTag() == SUMO_TAG_TAZ) {
472
viewObjects.getTAZFront()->removeGeometryPoint(clickedPosition, myViewNet->getUndoList());
473
return true;
474
}
475
}
476
return false;
477
}
478
479
480
GNEDeleteFrame::DeleteOptions*
481
GNEDeleteFrame::getDeleteOptions() const {
482
return myDeleteOptions;
483
}
484
485
486
GNEDeleteFrame::ProtectElements*
487
GNEDeleteFrame::getProtectElements() const {
488
return myProtectElements;
489
}
490
491
// ---------------------------------------------------------------------------
492
// GNEAdditionalFrame - protected methods
493
// ---------------------------------------------------------------------------
494
495
bool
496
GNEDeleteFrame::selectedACsToDelete() const {
497
// invert selection of elements depending of current supermode
498
if (myViewNet->getEditModes().isCurrentSupermodeNetwork()) {
499
// iterate over junctions
500
for (const auto& junction : myViewNet->getNet()->getAttributeCarriers()->getJunctions()) {
501
if (junction.second->isAttributeCarrierSelected()) {
502
return true;
503
}
504
// since we iterate over all junctions, it's only necessary to iterate over incoming edges
505
for (const auto& edge : junction.second->getGNEIncomingEdges()) {
506
if (edge->isAttributeCarrierSelected()) {
507
return true;
508
}
509
// check lanes
510
for (const auto& lane : edge->getChildLanes()) {
511
if (lane->isAttributeCarrierSelected()) {
512
return true;
513
}
514
}
515
// check connections
516
for (const auto& connection : edge->getGNEConnections()) {
517
if (connection->isAttributeCarrierSelected()) {
518
return true;
519
}
520
}
521
}
522
// check crossings
523
for (const auto& crossing : junction.second->getGNECrossings()) {
524
if (crossing->isAttributeCarrierSelected()) {
525
return true;
526
}
527
}
528
}
529
// check additionals
530
for (const auto& additionalTag : myViewNet->getNet()->getAttributeCarriers()->getAdditionals()) {
531
for (const auto& additional : additionalTag.second) {
532
if (additional.second->isAttributeCarrierSelected()) {
533
return true;
534
}
535
}
536
}
537
} else if (myViewNet->getEditModes().isCurrentSupermodeDemand()) {
538
// check demand elements
539
for (const auto& demandElementTag : myViewNet->getNet()->getAttributeCarriers()->getDemandElements()) {
540
for (const auto& demandElement : demandElementTag.second) {
541
if (demandElement.second->isAttributeCarrierSelected()) {
542
return true;
543
}
544
}
545
}
546
} else if (myViewNet->getEditModes().isCurrentSupermodeData()) {
547
// iterate over all generic datas
548
for (const auto& genericDataTag : myViewNet->getNet()->getAttributeCarriers()->getGenericDatas()) {
549
for (const auto& genericData : genericDataTag.second) {
550
if (genericData.second->isAttributeCarrierSelected()) {
551
return true;
552
}
553
}
554
}
555
}
556
return false;
557
}
558
559
/****************************************************************************/
560
561