Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/dialogs/tools/GNENetgenerateDialog.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 GNENetgenerateDialog.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Mar 2023
17
///
18
// Dialog for netgenerate
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <utils/gui/div/GUIDesigns.h>
23
24
#include "GNENetgenerateDialog.h"
25
26
// ===========================================================================
27
// Defines
28
// ===========================================================================
29
30
#define MARGIN 4
31
#define MAXNUMCOLUMNS 4
32
#define NUMROWSBYCOLUMN 20
33
34
// ===========================================================================
35
// FOX callback mapping
36
// ===========================================================================
37
38
FXDEFMAP(GNENetgenerateDialog) GNENetgenerateDialogMap[] = {
39
FXMAPFUNC(SEL_COMMAND, MID_GNE_OPEN, GNENetgenerateDialog::onCmdOpenOutputFile),
40
FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNENetgenerateDialog::onCmdSetOutput),
41
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETGENERATE_GRID, GNENetgenerateDialog::onCmdSetGridNetwork),
42
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETGENERATE_SPIDER, GNENetgenerateDialog::onCmdSetSpiderNetwork),
43
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETGENERATE_RANDOMGRID, GNENetgenerateDialog::onCmdSetRandomNetworkGridNetwork),
44
FXMAPFUNC(SEL_COMMAND, MID_GNE_NETGENERATE_RANDOM, GNENetgenerateDialog::onCmdSetRandomNetwork),
45
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_ADVANCED, GNENetgenerateDialog::onCmdAdvanced),
46
};
47
48
// Object implementation
49
FXIMPLEMENT(GNENetgenerateDialog, GNEDialog, GNENetgenerateDialogMap, ARRAYNUMBER(GNENetgenerateDialogMap))
50
51
// ============================================-===============================
52
// member method definitions
53
// ===========================================================================
54
55
GNENetgenerateDialog::GNENetgenerateDialog(GNEApplicationWindow* applicationWindow) :
56
GNEDialog(applicationWindow, "Netgenerate", GUIIcon::NETGENERATE,
57
DialogType::NETGENERATE, GNEDialog::Buttons::RUN_ADVANCED_CANCEL,
58
GNEDialog::OpenType::MODAL, ResizeMode::STATIC) {
59
// build labels
60
auto horizontalFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);
61
myGridNetworkLabel = new FXLabel(horizontalFrame, TL("Grid"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
62
mySpiderNetworkLabel = new FXLabel(horizontalFrame, TL("Spider"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
63
myRandomGridNetworkLabel = new FXLabel(horizontalFrame, TL("Random grid"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
64
myRandomNetworkLabel = new FXLabel(horizontalFrame, TL("Random"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
65
// build buttons
66
horizontalFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);
67
myGridNetworkButton = new MFXCheckableButton(false, horizontalFrame, applicationWindow->getStaticTooltipMenu(), "",
68
GUIIconSubSys::getIcon(GUIIcon::NETGENERATE_GRID), this, MID_GNE_NETGENERATE_GRID, GUIDesignMFXCheckableButtonBig);
69
mySpiderNetworkButton = new MFXCheckableButton(false, horizontalFrame, applicationWindow->getStaticTooltipMenu(), "",
70
GUIIconSubSys::getIcon(GUIIcon::NETGENERATE_SPIDER), this, MID_GNE_NETGENERATE_SPIDER, GUIDesignMFXCheckableButtonBig);
71
myRandomGridNetworkButton = new MFXCheckableButton(false, horizontalFrame, applicationWindow->getStaticTooltipMenu(), "",
72
GUIIconSubSys::getIcon(GUIIcon::NETGENERATE_RANDOMGRID), this, MID_GNE_NETGENERATE_RANDOMGRID, GUIDesignMFXCheckableButtonBig);
73
myRandomNetworkButton = new MFXCheckableButton(false, horizontalFrame, applicationWindow->getStaticTooltipMenu(), "",
74
GUIIconSubSys::getIcon(GUIIcon::NETGENERATE_RANDOM), this, MID_GNE_NETGENERATE_RANDOM, GUIDesignMFXCheckableButtonBig);
75
// add invisible separator
76
new FXSeparator(myContentFrame, SEPARATOR_NONE);
77
// build output file elements
78
horizontalFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);
79
new FXLabel(horizontalFrame, "output-file", nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
80
GUIDesigns::buildFXButton(horizontalFrame, "", "", TL("Select filename"),
81
GUIIconSubSys::getIcon(GUIIcon::OPEN_NET), this, MID_GNE_OPEN, GUIDesignButtonIcon);
82
myOutputTextField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
83
// open dialog
84
auto& generateOptions = myApplicationWindow->getNetgenerateOptions();
85
// reset buttons
86
if (generateOptions.getBool("grid")) {
87
if (generateOptions.getBool("rand.grid")) {
88
myRandomGridNetworkButton->setChecked(true);
89
onCmdSetRandomNetworkGridNetwork(nullptr, 0, nullptr);
90
} else {
91
myGridNetworkButton->setChecked(true);
92
onCmdSetGridNetwork(nullptr, 0, nullptr);
93
}
94
} else if (generateOptions.getBool("spider")) {
95
mySpiderNetworkButton->setChecked(true);
96
onCmdSetSpiderNetwork(nullptr, 0, nullptr);
97
} else if (generateOptions.getBool("random")) {
98
myRandomNetworkButton->setChecked(true);
99
onCmdSetRandomNetwork(nullptr, 0, nullptr);
100
}
101
// set output
102
myOutputTextField->setText(generateOptions.getValueString("output-file").c_str());
103
// disable run and advanced
104
updateRunButtons();
105
// open dialog
106
openDialog();
107
}
108
109
110
GNENetgenerateDialog::~GNENetgenerateDialog() {}
111
112
113
void
114
GNENetgenerateDialog::runInternalTest(const InternalTestStep::DialogArgument* /*dialogArgument*/) {
115
// nothing to do
116
}
117
118
119
long
120
GNENetgenerateDialog::onCmdOpenOutputFile(FXObject*, FXSelector, void*) {
121
// get output file
122
const auto networkFileDialog = GNEFileDialog(myApplicationWindow, TL("network file"),
123
SUMOXMLDefinitions::NetFileExtensions.getStrings(),
124
GNEFileDialog::OpenMode::SAVE,
125
GNEFileDialog::ConfigType::NETEDIT);
126
// check file
127
if (networkFileDialog.getResult() == GNEDialog::Result::ACCEPT) {
128
myOutputTextField->setText(networkFileDialog.getFilename().c_str(), TRUE);
129
}
130
return 1;
131
}
132
133
134
long
135
GNENetgenerateDialog::onCmdSetOutput(FXObject*, FXSelector, void*) {
136
auto& generateOptions = myApplicationWindow->getNetgenerateOptions();
137
generateOptions.resetWritable();
138
// check if filename is valid
139
if (SUMOXMLDefinitions::isValidFilename(myOutputTextField->getText().text()) == false) {
140
myOutputTextField->setTextColor(GUIDesignTextColorRed);
141
} else {
142
generateOptions.set("output-file", myOutputTextField->getText().text());
143
myOutputTextField->setTextColor(GUIDesignTextColorBlack);
144
}
145
updateRunButtons();
146
return 1;
147
}
148
149
150
long
151
GNENetgenerateDialog::onCmdSetGridNetwork(FXObject*, FXSelector, void*) {
152
auto& generateOptions = myApplicationWindow->getNetgenerateOptions();
153
// reset all flags
154
generateOptions.resetWritable();
155
generateOptions.set("grid", "true");
156
generateOptions.set("spider", "false");
157
generateOptions.set("rand", "false");
158
generateOptions.set("rand.grid", "false");
159
// set buttons
160
myGridNetworkButton->setChecked(true, true);
161
mySpiderNetworkButton->setChecked(false, true);
162
myRandomGridNetworkButton->setChecked(false, true);
163
myRandomNetworkButton->setChecked(false, true);
164
// set labels color
165
myGridNetworkLabel->setTextColor(GUIDesignTextColorBlue);
166
mySpiderNetworkLabel->setTextColor(GUIDesignTextColorBlack);
167
myRandomGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);
168
myRandomNetworkLabel->setTextColor(GUIDesignTextColorBlack);
169
// enable flag
170
mySelectedNetworktypeFlag = true;
171
updateRunButtons();
172
return 1;
173
}
174
175
176
long
177
GNENetgenerateDialog::onCmdSetSpiderNetwork(FXObject*, FXSelector, void*) {
178
auto& generateOptions = myApplicationWindow->getNetgenerateOptions();
179
// reset all flags
180
generateOptions.resetWritable();
181
generateOptions.set("grid", "false");
182
generateOptions.set("spider", "true");
183
generateOptions.set("spider.omit-center", "true");
184
generateOptions.set("rand", "false");
185
generateOptions.set("rand.grid", "false");
186
// set buttons
187
myGridNetworkButton->setChecked(false, true);
188
mySpiderNetworkButton->setChecked(true, true);
189
myRandomGridNetworkButton->setChecked(false, true);
190
myRandomNetworkButton->setChecked(false, true);
191
// set labels color
192
myGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);
193
mySpiderNetworkLabel->setTextColor(GUIDesignTextColorBlue);
194
myRandomGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);
195
myRandomNetworkLabel->setTextColor(GUIDesignTextColorBlack);
196
// enable flag
197
mySelectedNetworktypeFlag = true;
198
updateRunButtons();
199
return 1;
200
}
201
202
203
long
204
GNENetgenerateDialog::onCmdSetRandomNetworkGridNetwork(FXObject*, FXSelector, void*) {
205
auto& generateOptions = myApplicationWindow->getNetgenerateOptions();
206
// reset all flags
207
generateOptions.resetWritable();
208
generateOptions.set("grid", "false");
209
generateOptions.set("spider", "false");
210
generateOptions.set("rand", "true");
211
generateOptions.set("rand.grid", "true");
212
// set buttons
213
myGridNetworkButton->setChecked(false, true);
214
mySpiderNetworkButton->setChecked(false, true);
215
myRandomGridNetworkButton->setChecked(true, true);
216
myRandomNetworkButton->setChecked(false, true);
217
// set labels color
218
myGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);
219
mySpiderNetworkLabel->setTextColor(GUIDesignTextColorBlack);
220
myRandomGridNetworkLabel->setTextColor(GUIDesignTextColorBlue);
221
myRandomNetworkLabel->setTextColor(GUIDesignTextColorBlack);
222
// enable flag
223
mySelectedNetworktypeFlag = true;
224
updateRunButtons();
225
return 1;
226
}
227
228
229
long
230
GNENetgenerateDialog::onCmdSetRandomNetwork(FXObject*, FXSelector, void*) {
231
auto& generateOptions = myApplicationWindow->getNetgenerateOptions();
232
// reset all flags
233
generateOptions.resetWritable();
234
generateOptions.set("grid", "false");
235
generateOptions.set("spider", "false");
236
generateOptions.set("rand", "true");
237
generateOptions.set("rand.grid", "false");
238
// set buttons
239
myGridNetworkButton->setChecked(false, true);
240
mySpiderNetworkButton->setChecked(false, true);
241
myRandomGridNetworkButton->setChecked(false, true);
242
myRandomNetworkButton->setChecked(true, true);
243
// set labels color
244
myGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);
245
mySpiderNetworkLabel->setTextColor(GUIDesignTextColorBlack);
246
myRandomGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);
247
myRandomNetworkLabel->setTextColor(GUIDesignTextColorBlue);
248
// enable flag
249
mySelectedNetworktypeFlag = true;
250
updateRunButtons();
251
return 1;
252
}
253
254
255
long
256
GNENetgenerateDialog::onCmdRun(FXObject*, FXSelector, void*) {
257
// close dialog
258
closeDialogCanceling();
259
// run netgenerate
260
return myApplicationWindow->tryHandle(this, FXSEL(SEL_COMMAND, MID_GNE_RUNNETGENERATE), nullptr);
261
}
262
263
264
long
265
GNENetgenerateDialog::onCmdAdvanced(FXObject*, FXSelector, void*) {
266
// close dialog
267
closeDialogCanceling();
268
// open netgenerate option dialog
269
return myApplicationWindow->tryHandle(this, FXSEL(SEL_COMMAND, MID_GNE_NETGENERATEOPTIONS), nullptr);
270
}
271
272
273
void
274
GNENetgenerateDialog::updateRunButtons() {
275
// enable or disable run and advanced buttons depending of flags
276
if ((myOutputTextField->getText().length() > 0) && mySelectedNetworktypeFlag) {
277
myRunButton->enable();
278
myAdvancedButton->enable();
279
} else {
280
myRunButton->disable();
281
myAdvancedButton->disable();
282
}
283
}
284
285
/****************************************************************************/
286
287