Eclipse SUMO - Simulation of Urban MObility
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
GNENetgenerateDialog.cpp
Go to the documentation of this file.
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/****************************************************************************/
18// Dialog for netgenerate
19/****************************************************************************/
20
23
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
52
53// Object implementation
54FXIMPLEMENT(GNENetgenerateDialog, FXDialogBox, GNENetgenerateDialogMap, ARRAYNUMBER(GNENetgenerateDialogMap))
55
56// ============================================-===============================
57// member method definitions
58// ===========================================================================
59
61 FXDialogBox(GNEApp->getApp(), "Netgenerate", GUIDesignDialogBox),
62 myGNEApp(GNEApp) {
63 // set icon
65 // build labels
66 auto horizontalFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
67 myGridNetworkLabel = new FXLabel(horizontalFrame, TL("Grid"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
68 mySpiderNetworkLabel = new FXLabel(horizontalFrame, TL("Spider"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
69 myRandomGridNetworkLabel = new FXLabel(horizontalFrame, TL("Random grid"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
70 myRandomNetworkLabel = new FXLabel(horizontalFrame, TL("Random"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
71 // build buttons
72 horizontalFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
73 myGridNetworkButton = new MFXCheckableButton(false, horizontalFrame, GNEApp->getStaticTooltipMenu(), "",
75 mySpiderNetworkButton = new MFXCheckableButton(false, horizontalFrame, GNEApp->getStaticTooltipMenu(), "",
77 myRandomGridNetworkButton = new MFXCheckableButton(false, horizontalFrame, GNEApp->getStaticTooltipMenu(), "",
79 myRandomNetworkButton = new MFXCheckableButton(false, horizontalFrame, GNEApp->getStaticTooltipMenu(), "",
81 // add invisible separator
82 new FXSeparator(this, SEPARATOR_NONE);
83 // build output file elements
84 horizontalFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
85 new FXLabel(horizontalFrame, "output-file", nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
86 GUIDesigns::buildFXButton(horizontalFrame, "", "", TL("Select filename"),
88 myOutputTextField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
89 // add separator
90 new FXSeparator(this);
91 // create buttons centered
92 horizontalFrame = new FXHorizontalFrame(this, GUIDesignHorizontalFrame);
93 new FXHorizontalFrame(horizontalFrame, GUIDesignAuxiliarHorizontalFrame);
94 myRunButton = GUIDesigns::buildFXButton(horizontalFrame, TL("Run"), "", TL("close accepting changes"),
96 myAdvancedButton = GUIDesigns::buildFXButton(horizontalFrame, TL("Advanced"), "", TL("open advance netgenerate dialog"),
98 GUIDesigns::buildFXButton(horizontalFrame, TL("Cancel"), "", TL("Close dialog"),
100 new FXHorizontalFrame(horizontalFrame, GUIDesignAuxiliarHorizontalFrame);
101}
102
103
105
106
107void
109 auto& generateOptions = myGNEApp->getNetgenerateOptions();
110 // reset buttons
111 if (generateOptions.getBool("grid")) {
112 if (generateOptions.getBool("rand.grid")) {
114 onCmdSetRandomGrid(nullptr, 0, nullptr);
115 } else {
117 onCmdSetGrid(nullptr, 0, nullptr);
118 }
119 } else if (generateOptions.getBool("spider")) {
121 onCmdSetSpider(nullptr, 0, nullptr);
122 } else if (generateOptions.getBool("random")) {
124 onCmdSetRandom(nullptr, 0, nullptr);
125 }
126 // set output
127 myOutputTextField->setText(generateOptions.getValueString("output-file").c_str());
128 // show dialog
129 FXDialogBox::show(PLACEMENT_SCREEN);
130 // refresh APP
131 getApp()->refresh();
132}
133
134
135long
136GNENetgenerateDialog::onCmdOpenOutputFile(FXObject*, FXSelector, void*) {
137 // get output file
138 const auto outputFile = GNEApplicationWindowHelper::openNetworkFileDialog(this, true);
139 // check file
140 if (!outputFile.empty()) {
141 myOutputTextField->setText(outputFile.c_str(), TRUE);
142 }
143 return 1;
144}
145
146
147long
148GNENetgenerateDialog::onCmdSetOutput(FXObject*, FXSelector, void*) {
149 auto& generateOptions = myGNEApp->getNetgenerateOptions();
150 generateOptions.resetWritable();
151 // check if filename is valid
152 if (SUMOXMLDefinitions::isValidFilename(myOutputTextField->getText().text()) == false) {
153 myOutputTextField->setTextColor(FXRGB(255, 0, 0));
154 } else {
155 generateOptions.set("output-file", myOutputTextField->getText().text());
156 myOutputTextField->setTextColor(FXRGB(0, 0, 0));
157 }
158 return 1;
159}
160
161
162long
163GNENetgenerateDialog::onCmdSetGrid(FXObject*, FXSelector, void*) {
164 auto& generateOptions = myGNEApp->getNetgenerateOptions();
165 // reset all flags
166 generateOptions.resetWritable();
167 generateOptions.set("grid", "true");
168 generateOptions.set("spider", "false");
169 generateOptions.set("rand", "false");
170 generateOptions.set("rand.grid", "false");
171 // set buttons
172 myGridNetworkButton->setChecked(true, true);
173 mySpiderNetworkButton->setChecked(false, true);
175 myRandomNetworkButton->setChecked(false, true);
176 // set labels color
177 myGridNetworkLabel->setTextColor(FXRGB(0, 0, 255));
178 mySpiderNetworkLabel->setTextColor(FXRGB(0, 0, 0));
179 myRandomGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
180 myRandomNetworkLabel->setTextColor(FXRGB(0, 0, 0));
181 return 1;
182}
183
184
185long
186GNENetgenerateDialog::onCmdSetSpider(FXObject*, FXSelector, void*) {
187 auto& generateOptions = myGNEApp->getNetgenerateOptions();
188 // reset all flags
189 generateOptions.resetWritable();
190 generateOptions.set("grid", "false");
191 generateOptions.set("spider", "true");
192 generateOptions.set("spider.omit-center", "true");
193 generateOptions.set("rand", "false");
194 generateOptions.set("rand.grid", "false");
195 // set buttons
196 myGridNetworkButton->setChecked(false, true);
199 myRandomNetworkButton->setChecked(false, true);
200 // set labels color
201 myGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
202 mySpiderNetworkLabel->setTextColor(FXRGB(0, 0, 255));
203 myRandomGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
204 myRandomNetworkLabel->setTextColor(FXRGB(0, 0, 0));
205 return 1;
206}
207
208
209long
210GNENetgenerateDialog::onCmdSetRandomGrid(FXObject*, FXSelector, void*) {
211 auto& generateOptions = myGNEApp->getNetgenerateOptions();
212 // reset all flags
213 generateOptions.resetWritable();
214 generateOptions.set("grid", "false");
215 generateOptions.set("spider", "false");
216 generateOptions.set("rand", "true");
217 generateOptions.set("rand.grid", "true");
218 // set buttons
219 myGridNetworkButton->setChecked(false, true);
220 mySpiderNetworkButton->setChecked(false, true);
222 myRandomNetworkButton->setChecked(false, true);
223 // set labels color
224 myGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
225 mySpiderNetworkLabel->setTextColor(FXRGB(0, 0, 0));
226 myRandomGridNetworkLabel->setTextColor(FXRGB(0, 0, 255));
227 myRandomNetworkLabel->setTextColor(FXRGB(0, 0, 0));
228 return 1;
229}
230
231
232long
233GNENetgenerateDialog::onCmdSetRandom(FXObject*, FXSelector, void*) {
234 auto& generateOptions = myGNEApp->getNetgenerateOptions();
235 // reset all flags
236 generateOptions.resetWritable();
237 generateOptions.set("grid", "false");
238 generateOptions.set("spider", "false");
239 generateOptions.set("rand", "true");
240 generateOptions.set("rand.grid", "false");
241 // set buttons
242 myGridNetworkButton->setChecked(false, true);
243 mySpiderNetworkButton->setChecked(false, true);
246 // set labels color
247 myGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
248 mySpiderNetworkLabel->setTextColor(FXRGB(0, 0, 0));
249 myRandomGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
250 myRandomNetworkLabel->setTextColor(FXRGB(0, 0, 255));
251 return 1;
252}
253
254
255long
256GNENetgenerateDialog::onCmdRun(FXObject*, FXSelector, void*) {
257 // hide dialog
258 hide();
259 // run netgenerate
260 return myGNEApp->tryHandle(this, FXSEL(SEL_COMMAND, MID_GNE_RUNNETGENERATE), nullptr);
261}
262
263
264long
265GNENetgenerateDialog::onCmdAdvanced(FXObject*, FXSelector, void*) {
266 // hide dialog
267 hide();
268 // open netgenerate option dialog
269 return myGNEApp->tryHandle(this, FXSEL(SEL_COMMAND, MID_GNE_NETGENERATEOPTIONS), nullptr);
270}
271
272
273long
274GNENetgenerateDialog::onUpdSettingsConfigured(FXObject* sender, FXSelector, void*) {
275 auto& generateOptions = myGNEApp->getNetgenerateOptions();
276 // check conditions
277 if ((generateOptions.getBool("grid") == false) &&
278 (generateOptions.getBool("spider") == false) &&
279 (generateOptions.getBool("rand") == false)) {
280 return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
281 } else if (generateOptions.getValueString("output-file").empty()) {
282 return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
283 } else {
284 return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
285 }
286}
287
288
289long
290GNENetgenerateDialog::onCmdCancel(FXObject*, FXSelector, void*) {
291 // hide dialog
292 hide();
293 return 1;
294}
295
296
298 myGNEApp(nullptr) {
299}
300
301/****************************************************************************/
FXDEFMAP(GNENetgenerateDialog) GNENetgenerateDialogMap[]
@ MID_GNE_NETGENERATEOPTIONS
netgenerate options
Definition GUIAppEnum.h:763
@ MID_GNE_RUNNETGENERATE
run netgenerate tool
Definition GUIAppEnum.h:773
@ MID_GNE_SET_ATTRIBUTE
attribute edited
Definition GUIAppEnum.h:939
@ MID_GNE_BUTTON_RUN
run button
@ MID_GNE_BUTTON_CANCEL
cancel button
@ MID_GNE_BUTTON_ADVANCED
advanced button
@ MID_GNE_NETGENERATE_SPIDER
netgenerate spider network
Definition GUIAppEnum.h:767
@ MID_GNE_NETGENERATE_RANDOM
netgenerate random network
Definition GUIAppEnum.h:771
@ MID_GNE_NETGENERATE_RANDOMGRID
netgenerate random grid network
Definition GUIAppEnum.h:769
@ MID_GNE_NETGENERATE_GRID
netgenerate grid network
Definition GUIAppEnum.h:765
@ MID_GNE_OPEN
open element
Definition GUIAppEnum.h:955
#define GUIDesignButtonIcon
button only with icon
Definition GUIDesigns.h:91
#define GUIDesignButtonAccept
Accept Button.
Definition GUIDesigns.h:156
#define GUIDesignTextField
Definition GUIDesigns.h:59
#define GUIDesignButtonAdvanced
Advanced Button.
Definition GUIDesigns.h:168
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition GUIDesigns.h:399
#define GUIDesignDialogBox
Definition GUIDesigns.h:599
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition GUIDesigns.h:74
#define GUIDesignBigSizeElement
elements with big images
Definition GUIDesigns.h:44
#define GUIDesignMFXCheckableButtonBig
checkable button extended over frame
Definition GUIDesigns.h:146
#define GUIDesignButtonReset
Reset Button.
Definition GUIDesigns.h:165
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
Definition GUIDesigns.h:252
#define GUIDesignHorizontalFrame
Horizontal frame extended over frame parent with padding and spacing.
Definition GUIDesigns.h:328
@ NETGENERATE_SPIDER
@ NETGENERATE_RANDOMGRID
@ NETGENERATE_GRID
@ NETGENERATE_RANDOM
#define TL(string)
Definition MsgHandler.h:305
The main window of Netedit.
OptionsCont & getNetgenerateOptions()
get netgenerate options container
Dialog for netgenerate tool dialog.
long onCmdSetRandom(FXObject *, FXSelector, void *)
set random
long onCmdSetRandomGrid(FXObject *, FXSelector, void *)
set random grid
FXLabel * mySpiderNetworkLabel
grid network
long onCmdSetOutput(FXObject *, FXSelector, void *)
set output file
MFXCheckableButton * myRandomNetworkButton
grid network
long onCmdOpenOutputFile(FXObject *, FXSelector, void *)
open output file
long onCmdSetGrid(FXObject *, FXSelector, void *)
set grid mode
long onCmdAdvanced(FXObject *, FXSelector, void *)
event after press advanced button
FXLabel * myGridNetworkLabel
grid network
long onCmdSetSpider(FXObject *, FXSelector, void *)
set spider
MFXCheckableButton * myGridNetworkButton
grid network
MFXCheckableButton * mySpiderNetworkButton
grid network
long onCmdRun(FXObject *, FXSelector, void *)
event after press run button
GNEApplicationWindow * myGNEApp
pointer to GNEApplicationWindow
MFXCheckableButton * myRandomGridNetworkButton
random grid network
long onUpdSettingsConfigured(FXObject *, FXSelector, void *)
check if settings are enabled
FXLabel * myRandomGridNetworkLabel
random grid network
FXLabel * myRandomNetworkLabel
grid network
long onCmdCancel(FXObject *, FXSelector, void *)
event after press cancel button
FXTextField * myOutputTextField
output text field
GNENetgenerateDialog()
FOX needs this.
static FXButton * buildFXButton(FXComposite *p, const std::string &text, const std::string &tip, const std::string &help, FXIcon *ic, FXObject *tgt, FXSelector sel, FXuint opts=BUTTON_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
build button
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
void setChecked(bool val, const bool inform=false)
check or uncheck this MFXCheckableButton
void resetWritable()
Resets all options to be writeable.
static bool isValidFilename(const std::string &value)
whether the given string is a valid attribute for a filename (for example, a name)
static std::string openNetworkFileDialog(FXWindow *window, bool save, bool multi=false)
open netconvert file dialog