Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/dialogs/fix/GNEFixNetworkElements.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 GNEFixNetworkElements.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jun 2022
17
///
18
// Dialog used to fix network elements during saving
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/GNENet.h>
23
#include <netedit/GNETagProperties.h>
24
#include <netedit/GNEUndoList.h>
25
26
#include "GNEFixNetworkElements.h"
27
28
// ===========================================================================
29
// FOX callback mapping
30
// ===========================================================================
31
32
FXDEFMAP(GNEFixNetworkElements::FixEdgeOptions) FixEdgeOptionsMap[] = {
33
FXMAPFUNC(SEL_COMMAND, MID_CHOOSEN_OPERATION, GNEFixNetworkElements::FixEdgeOptions::onCmdSelectOption)
34
};
35
36
FXDEFMAP(GNEFixNetworkElements::FixCrossingOptions) FixCrossingOptionsMap[] = {
37
FXMAPFUNC(SEL_COMMAND, MID_CHOOSEN_OPERATION, GNEFixNetworkElements::FixCrossingOptions::onCmdSelectOption)
38
};
39
40
// Object abstract implementation
41
FXIMPLEMENT(GNEFixNetworkElements::FixEdgeOptions, MFXGroupBoxModule, FixEdgeOptionsMap, ARRAYNUMBER(FixEdgeOptionsMap))
42
FXIMPLEMENT(GNEFixNetworkElements::FixCrossingOptions, MFXGroupBoxModule, FixCrossingOptionsMap, ARRAYNUMBER(FixCrossingOptionsMap))
43
44
// ===========================================================================
45
// member method definitions
46
// ===========================================================================
47
48
// ---------------------------------------------------------------------------
49
// GNEFixNetworkElements::FixEdgeOptions - methods
50
// ---------------------------------------------------------------------------
51
52
GNEFixNetworkElements::FixEdgeOptions::FixEdgeOptions(GNEFixNetworkElements* fixNetworkElementsParent) :
53
GNEFixElementsDialog<GNENetworkElement*>::FixOptions(fixNetworkElementsParent, fixNetworkElementsParent->myLeftFrame, "Edges") {
54
// Remove invalid edges
55
myRemoveInvalidEdges = GUIDesigns::buildFXRadioButton(myLeftFrameOptions,
56
TL("Remove invalid edges"), "",
57
TL("Remove invalid edges"),
58
this, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
59
// Save invalid edges
60
mySaveInvalidEdges = GUIDesigns::buildFXRadioButton(myLeftFrameOptions,
61
TL("Save invalid edges"), "",
62
TL("Save invalid edges"),
63
this, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
64
// Select invalid edges
65
mySelectInvalidEdges = GUIDesigns::buildFXRadioButton(myRightFrameOptions,
66
TL("Select invalid edges"), "",
67
TL("Select invalid edges and abort saving"),
68
this, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
69
// register options
70
registerOption(myRemoveInvalidEdges);
71
registerOption(mySaveInvalidEdges);
72
registerOption(mySelectInvalidEdges);
73
// set option "removeInvalidEdges" as default
74
myRemoveInvalidEdges->setCheck(true);
75
}
76
77
78
void
79
GNEFixNetworkElements::FixEdgeOptions::selectInternalTestSolution(const std::string& /*solution*/) {
80
// finish
81
}
82
83
84
bool
85
GNEFixNetworkElements::FixEdgeOptions::applyFixOption() {
86
if (myConflictedElements.size() > 0) {
87
auto net = myFixElementDialogParent->getApplicationWindow()->getViewNet()->getNet();
88
auto undoList = myFixElementDialogParent->getApplicationWindow()->getUndoList();
89
// continue depending of solution
90
if (myRemoveInvalidEdges->getCheck() == TRUE) {
91
// begin undo list
92
undoList->begin(GUIIcon::EDGE, TL("delete invalid edges"));
93
// iterate over invalid edges to delete it
94
for (const auto& conflictedElement : myConflictedElements) {
95
net->deleteEdge(net->getAttributeCarriers()->retrieveEdge(conflictedElement.getID()), undoList, false);
96
}
97
// end undo list
98
undoList->end();
99
} else if (mySelectInvalidEdges->getCheck() == TRUE) {
100
// begin undo list
101
undoList->begin(GUIIcon::EDGE, TL("select invalid edges"));
102
// iterate over invalid single lane elements to select all elements
103
for (const auto& conflictedElement : myConflictedElements) {
104
conflictedElement.getElement()->setAttribute(GNE_ATTR_SELECTED, "true", undoList);
105
}
106
// end undo list
107
undoList->end();
108
// abort saving
109
return false;
110
}
111
}
112
return true;
113
}
114
115
116
long
117
GNEFixNetworkElements::FixEdgeOptions::onCmdSelectOption(FXObject* obj, FXSelector, void*) {
118
if (obj == myRemoveInvalidEdges) {
119
myRemoveInvalidEdges->setCheck(true);
120
mySaveInvalidEdges->setCheck(false);
121
mySelectInvalidEdges->setCheck(false);
122
} else if (obj == mySaveInvalidEdges) {
123
myRemoveInvalidEdges->setCheck(false);
124
mySaveInvalidEdges->setCheck(true);
125
mySelectInvalidEdges->setCheck(false);
126
} else if (obj == mySelectInvalidEdges) {
127
myRemoveInvalidEdges->setCheck(false);
128
mySaveInvalidEdges->setCheck(false);
129
mySelectInvalidEdges->setCheck(true);
130
}
131
return 1;
132
}
133
134
// ---------------------------------------------------------------------------
135
// GNEFixNetworkElements::FixCrossingOptions - methods
136
// ---------------------------------------------------------------------------
137
138
GNEFixNetworkElements::FixCrossingOptions::FixCrossingOptions(GNEFixNetworkElements* fixNetworkElementsParent) :
139
GNEFixElementsDialog<GNENetworkElement*>::FixOptions(fixNetworkElementsParent, fixNetworkElementsParent->myLeftFrame, "Crossings") {
140
// Remove invalid crossings
141
myRemoveInvalidCrossings = GUIDesigns::buildFXRadioButton(myLeftFrameOptions,
142
TL("Remove invalid crossings"), "",
143
TL("Remove invalid crossings"),
144
this, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
145
// Save invalid crossings
146
mySaveInvalidCrossings = GUIDesigns::buildFXRadioButton(myLeftFrameOptions,
147
TL("Save invalid crossings"), "",
148
TL("Save invalid crossings"),
149
this, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
150
// Select invalid crossing
151
mySelectInvalidCrossings = GUIDesigns::buildFXRadioButton(myRightFrameOptions,
152
TL("Select invalid crossing"), "",
153
TL("Select invalid crossing and abort saving"),
154
this, MID_CHOOSEN_OPERATION, GUIDesignRadioButtonFix);
155
// register options
156
registerOption(myRemoveInvalidCrossings);
157
registerOption(mySaveInvalidCrossings);
158
registerOption(mySelectInvalidCrossings);
159
// by default remove invalid crossings
160
myRemoveInvalidCrossings->setCheck(TRUE);
161
}
162
163
164
void
165
GNEFixNetworkElements::FixCrossingOptions::selectInternalTestSolution(const std::string& solution) {
166
// choose solution
167
if (solution == "removeInvalidCrossings") {
168
myRemoveInvalidCrossings->setCheck(TRUE, TRUE);
169
} else if (solution == "saveInvalidCrossings") {
170
mySaveInvalidCrossings->setCheck(TRUE, TRUE);
171
} else if (solution == "selectInvalidCrossings") {
172
mySelectInvalidCrossings->setCheck(TRUE, TRUE);
173
}
174
}
175
176
177
bool
178
GNEFixNetworkElements::FixCrossingOptions::applyFixOption() {
179
if (myConflictedElements.size() > 0) {
180
auto net = myFixElementDialogParent->getApplicationWindow()->getViewNet()->getNet();
181
auto undoList = myFixElementDialogParent->getApplicationWindow()->getUndoList();
182
// continue depending of solution
183
if (myRemoveInvalidCrossings->getCheck() == TRUE) {
184
// begin undo list
185
undoList->begin(GUIIcon::CROSSING, TL("delete invalid crossings"));
186
// iterate over invalid crossings to delete it
187
for (const auto& conflictedElement : myConflictedElements) {
188
net->deleteCrossing(net->getAttributeCarriers()->retrieveCrossing(conflictedElement.getElement()), undoList);
189
}
190
// end undo list
191
undoList->end();
192
} else if (mySelectInvalidCrossings->getCheck() == TRUE) {
193
// begin undo list
194
undoList->begin(GUIIcon::CROSSING, TL("select invalid crossings"));
195
// iterate over invalid single lane elements to select all elements
196
for (const auto& conflictedElement : myConflictedElements) {
197
conflictedElement.getElement()->setAttribute(GNE_ATTR_SELECTED, "true", undoList);
198
}
199
// end undo list
200
undoList->end();
201
// abort saving
202
return false;
203
}
204
}
205
return true;
206
}
207
208
209
long
210
GNEFixNetworkElements::FixCrossingOptions::onCmdSelectOption(FXObject* obj, FXSelector, void*) {
211
if (obj == myRemoveInvalidCrossings) {
212
myRemoveInvalidCrossings->setCheck(true);
213
mySaveInvalidCrossings->setCheck(false);
214
mySelectInvalidCrossings->setCheck(false);
215
} else if (obj == mySaveInvalidCrossings) {
216
myRemoveInvalidCrossings->setCheck(false);
217
mySaveInvalidCrossings->setCheck(true);
218
mySelectInvalidCrossings->setCheck(false);
219
} else if (obj == mySelectInvalidCrossings) {
220
myRemoveInvalidCrossings->setCheck(false);
221
mySaveInvalidCrossings->setCheck(false);
222
mySelectInvalidCrossings->setCheck(true);
223
}
224
return 1;
225
}
226
227
// ---------------------------------------------------------------------------
228
// GNEFixNetworkElements - methods
229
// ---------------------------------------------------------------------------
230
231
GNEFixNetworkElements::GNEFixNetworkElements(GNEApplicationWindow* mainWindow,
232
const std::vector<GNENetworkElement*>& elements) :
233
GNEFixElementsDialog(mainWindow, TL("Fix network elements problems"), GUIIcon::SUPERMODENETWORK,
234
DialogType::FIX_NETWORKELEMENTS) {
235
// create fix edge options
236
myFixEdgeOptions = new FixEdgeOptions(this);
237
// create fix crossing options
238
myFixCrossingOptions = new FixCrossingOptions(this);
239
// split invalidNetworkElements in four groups
240
std::vector<ConflictElement> invalidEdges, invalidCrossings;
241
// fill groups
242
for (const auto& invalidNetworkElement : elements) {
243
// create conflict element
244
auto fixElement = ConflictElement(invalidNetworkElement,
245
invalidNetworkElement->getID(),
246
invalidNetworkElement->getACIcon(),
247
invalidNetworkElement->getNetworkElementProblem());
248
// add depending of element type
249
if (invalidNetworkElement->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
250
invalidEdges.push_back(fixElement);
251
} else if (invalidNetworkElement->getTagProperty()->getTag() == SUMO_TAG_CROSSING) {
252
invalidCrossings.push_back(fixElement);
253
}
254
}
255
// fill options
256
myFixEdgeOptions->setInvalidElements(invalidEdges);
257
myFixCrossingOptions->setInvalidElements(invalidCrossings);
258
// open modal dialog
259
openDialog();
260
}
261
262
263
GNEFixNetworkElements::~GNEFixNetworkElements() {}
264
265
/****************************************************************************/
266
267