Eclipse SUMO - Simulation of Urban MObility
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-2024 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 
24 #include "GNENetgenerateDialog.h"
25 
26 #define MARGING 4
27 #define MAXNUMCOLUMNS 4
28 #define NUMROWSBYCOLUMN 20
29 
30 // ===========================================================================
31 // FOX callback mapping
32 // ===========================================================================
33 
34 FXDEFMAP(GNENetgenerateDialog) GNENetgenerateDialogMap[] = {
35  FXMAPFUNC(SEL_CLOSE, 0, GNENetgenerateDialog::onCmdCancel),
42  FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_RUN, GNENetgenerateDialog::onCmdRun),
47 };
48 
49 // Object implementation
50 FXIMPLEMENT(GNENetgenerateDialog, FXDialogBox, GNENetgenerateDialogMap, ARRAYNUMBER(GNENetgenerateDialogMap))
51 
52 // ============================================-===============================
53 // member method definitions
54 // ===========================================================================
55 
57  FXDialogBox(GNEApp->getApp(), "Netgenerate", GUIDesignDialogBox),
58  myGNEApp(GNEApp) {
59  // set icon
61  // build labels
62  auto horizontalFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
63  myGridNetworkLabel = new FXLabel(horizontalFrame, TL("Grid"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
64  mySpiderNetworkLabel = new FXLabel(horizontalFrame, TL("Spider"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
65  myRandomGridNetworkLabel = new FXLabel(horizontalFrame, TL("Random grid"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
66  myRandomNetworkLabel = new FXLabel(horizontalFrame, TL("Random"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
67  // build buttons
68  horizontalFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
69  myGridNetworkButton = new MFXCheckableButton(false, horizontalFrame, GNEApp->getStaticTooltipMenu(), "",
71  mySpiderNetworkButton = new MFXCheckableButton(false, horizontalFrame, GNEApp->getStaticTooltipMenu(), "",
73  myRandomGridNetworkButton = new MFXCheckableButton(false, horizontalFrame, GNEApp->getStaticTooltipMenu(), "",
75  myRandomNetworkButton = new MFXCheckableButton(false, horizontalFrame, GNEApp->getStaticTooltipMenu(), "",
77  // add invisible separator
78  new FXSeparator(this, SEPARATOR_NONE);
79  // build output file elements
80  horizontalFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarHorizontalFrame);
81  new FXLabel(horizontalFrame, "output-file", nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));
82  GUIDesigns::buildFXButton(horizontalFrame, "", "", TL("Select filename"),
84  myOutputTextField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);
85  // add separator
86  new FXSeparator(this);
87  // create buttons centered
88  horizontalFrame = new FXHorizontalFrame(this, GUIDesignHorizontalFrame);
89  new FXHorizontalFrame(horizontalFrame, GUIDesignAuxiliarHorizontalFrame);
90  myRunButton = GUIDesigns::buildFXButton(horizontalFrame, TL("Run"), "", TL("close accepting changes"),
92  myAdvancedButton = GUIDesigns::buildFXButton(horizontalFrame, TL("Advanced"), "", TL("open advance netgenerate dialog"),
94  GUIDesigns::buildFXButton(horizontalFrame, TL("Cancel"), "", TL("Close dialog"),
96  new FXHorizontalFrame(horizontalFrame, GUIDesignAuxiliarHorizontalFrame);
97 }
98 
99 
101 
102 
103 void
105  auto& generateOptions = myGNEApp->getNetgenerateOptions();
106  // reset buttons
107  if (generateOptions.getBool("grid")) {
108  if (generateOptions.getBool("rand.grid")) {
110  onCmdSetRandomGrid(nullptr, 0, nullptr);
111  } else {
113  onCmdSetGrid(nullptr, 0, nullptr);
114  }
115  } else if (generateOptions.getBool("spider")) {
117  onCmdSetSpider(nullptr, 0, nullptr);
118  } else if (generateOptions.getBool("random")) {
120  onCmdSetRandom(nullptr, 0, nullptr);
121  }
122  // set output
123  myOutputTextField->setText(generateOptions.getValueString("output-file").c_str());
124  // show dialog
125  FXDialogBox::show(PLACEMENT_SCREEN);
126  // refresh APP
127  getApp()->refresh();
128 }
129 
130 
131 long
132 GNENetgenerateDialog::onCmdOpenOutputFile(FXObject*, FXSelector, void*) {
133  // get output file
134  const auto outputFile = GNEApplicationWindowHelper::openNetworkFileDialog(this, true);
135  // check file
136  if (!outputFile.empty()) {
137  myOutputTextField->setText(outputFile.c_str(), TRUE);
138  }
139  return 1;
140 }
141 
142 
143 long
144 GNENetgenerateDialog::onCmdSetOutput(FXObject*, FXSelector, void*) {
145  auto& generateOptions = myGNEApp->getNetgenerateOptions();
146  generateOptions.resetWritable();
147  // check if filename is valid
148  if (SUMOXMLDefinitions::isValidFilename(myOutputTextField->getText().text()) == false) {
149  myOutputTextField->setTextColor(FXRGB(255, 0, 0));
150  } else {
151  generateOptions.set("output-file", myOutputTextField->getText().text());
152  myOutputTextField->setTextColor(FXRGB(0, 0, 0));
153  }
154  return 1;
155 }
156 
157 
158 long
159 GNENetgenerateDialog::onCmdSetGrid(FXObject*, FXSelector, void*) {
160  auto& generateOptions = myGNEApp->getNetgenerateOptions();
161  // reset all flags
162  generateOptions.resetWritable();
163  generateOptions.set("grid", "true");
164  generateOptions.set("spider", "false");
165  generateOptions.set("rand", "false");
166  generateOptions.set("rand.grid", "false");
167  // set buttons
168  myGridNetworkButton->setChecked(true, true);
169  mySpiderNetworkButton->setChecked(false, true);
171  myRandomNetworkButton->setChecked(false, true);
172  // set labels color
173  myGridNetworkLabel->setTextColor(FXRGB(0, 0, 255));
174  mySpiderNetworkLabel->setTextColor(FXRGB(0, 0, 0));
175  myRandomGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
176  myRandomNetworkLabel->setTextColor(FXRGB(0, 0, 0));
177  return 1;
178 }
179 
180 
181 long
182 GNENetgenerateDialog::onCmdSetSpider(FXObject*, FXSelector, void*) {
183  auto& generateOptions = myGNEApp->getNetgenerateOptions();
184  // reset all flags
185  generateOptions.resetWritable();
186  generateOptions.set("grid", "false");
187  generateOptions.set("spider", "true");
188  generateOptions.set("spider.omit-center", "true");
189  generateOptions.set("rand", "false");
190  generateOptions.set("rand.grid", "false");
191  // set buttons
192  myGridNetworkButton->setChecked(false, true);
193  mySpiderNetworkButton->setChecked(true, true);
195  myRandomNetworkButton->setChecked(false, true);
196  // set labels color
197  myGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
198  mySpiderNetworkLabel->setTextColor(FXRGB(0, 0, 255));
199  myRandomGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
200  myRandomNetworkLabel->setTextColor(FXRGB(0, 0, 0));
201  return 1;
202 }
203 
204 
205 long
206 GNENetgenerateDialog::onCmdSetRandomGrid(FXObject*, FXSelector, void*) {
207  auto& generateOptions = myGNEApp->getNetgenerateOptions();
208  // reset all flags
209  generateOptions.resetWritable();
210  generateOptions.set("grid", "false");
211  generateOptions.set("spider", "false");
212  generateOptions.set("rand", "true");
213  generateOptions.set("rand.grid", "true");
214  // set buttons
215  myGridNetworkButton->setChecked(false, true);
216  mySpiderNetworkButton->setChecked(false, true);
218  myRandomNetworkButton->setChecked(false, true);
219  // set labels color
220  myGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
221  mySpiderNetworkLabel->setTextColor(FXRGB(0, 0, 0));
222  myRandomGridNetworkLabel->setTextColor(FXRGB(0, 0, 255));
223  myRandomNetworkLabel->setTextColor(FXRGB(0, 0, 0));
224  return 1;
225 }
226 
227 
228 long
229 GNENetgenerateDialog::onCmdSetRandom(FXObject*, FXSelector, void*) {
230  auto& generateOptions = myGNEApp->getNetgenerateOptions();
231  // reset all flags
232  generateOptions.resetWritable();
233  generateOptions.set("grid", "false");
234  generateOptions.set("spider", "false");
235  generateOptions.set("rand", "true");
236  generateOptions.set("rand.grid", "false");
237  // set buttons
238  myGridNetworkButton->setChecked(false, true);
239  mySpiderNetworkButton->setChecked(false, true);
241  myRandomNetworkButton->setChecked(true, true);
242  // set labels color
243  myGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
244  mySpiderNetworkLabel->setTextColor(FXRGB(0, 0, 0));
245  myRandomGridNetworkLabel->setTextColor(FXRGB(0, 0, 0));
246  myRandomNetworkLabel->setTextColor(FXRGB(0, 0, 255));
247  return 1;
248 }
249 
250 
251 long
252 GNENetgenerateDialog::onCmdRun(FXObject*, FXSelector, void*) {
253  // hide dialog
254  hide();
255  // run netgenerate
256  return myGNEApp->tryHandle(this, FXSEL(SEL_COMMAND, MID_GNE_RUNNETGENERATE), nullptr);
257 }
258 
259 
260 long
261 GNENetgenerateDialog::onCmdAdvanced(FXObject*, FXSelector, void*) {
262  // hide dialog
263  hide();
264  // open netgenerate option dialog
265  return myGNEApp->tryHandle(this, FXSEL(SEL_COMMAND, MID_GNE_NETGENERATEOPTIONS), nullptr);
266 }
267 
268 
269 long
270 GNENetgenerateDialog::onUpdSettingsConfigured(FXObject* sender, FXSelector, void*) {
271  auto& generateOptions = myGNEApp->getNetgenerateOptions();
272  // check conditions
273  if ((generateOptions.getBool("grid") == false) &&
274  (generateOptions.getBool("spider") == false) &&
275  (generateOptions.getBool("rand") == false)) {
276  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
277  } else if (generateOptions.getValueString("output-file").empty()) {
278  return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);
279  } else {
280  return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);
281  }
282 }
283 
284 
285 long
286 GNENetgenerateDialog::onCmdCancel(FXObject*, FXSelector, void*) {
287  // hide dialog
288  hide();
289  return 1;
290 }
291 
292 
294  myGNEApp(nullptr) {
295 }
296 
297 /****************************************************************************/
FXDEFMAP(GNENetgenerateDialog) GNENetgenerateDialogMap[]
@ MID_GNE_NETGENERATEOPTIONS
netgenerate options
Definition: GUIAppEnum.h:758
@ MID_GNE_RUNNETGENERATE
run netgenerate tool
Definition: GUIAppEnum.h:768
@ MID_GNE_SET_ATTRIBUTE
attribute edited
Definition: GUIAppEnum.h:930
@ MID_GNE_BUTTON_RUN
run button
Definition: GUIAppEnum.h:1408
@ MID_GNE_BUTTON_CANCEL
cancel button
Definition: GUIAppEnum.h:1394
@ MID_GNE_BUTTON_ADVANCED
advanced button
Definition: GUIAppEnum.h:1410
@ MID_GNE_NETGENERATE_SPIDER
netgenerate spider network
Definition: GUIAppEnum.h:762
@ MID_GNE_NETGENERATE_RANDOM
netgenerate random network
Definition: GUIAppEnum.h:766
@ MID_GNE_NETGENERATE_RANDOMGRID
netgenerate random grid network
Definition: GUIAppEnum.h:764
@ MID_GNE_NETGENERATE_GRID
netgenerate grid network
Definition: GUIAppEnum.h:760
@ MID_GNE_OPEN
open element
Definition: GUIAppEnum.h:946
#define GUIDesignButtonIcon
button only with icon
Definition: GUIDesigns.h:97
#define GUIDesignButtonAccept
Accept Button.
Definition: GUIDesigns.h:162
#define GUIDesignTextField
Definition: GUIDesigns.h:65
#define GUIDesignButtonAdvanced
Advanced Button.
Definition: GUIDesigns.h:174
#define GUIDesignAuxiliarHorizontalFrame
design for auxiliar (Without borders) horizontal frame used to pack another frames
Definition: GUIDesigns.h:405
#define GUIDesignDialogBox
Definition: GUIDesigns.h:602
#define GUIDesignTextFieldNCol
Num of column of text field.
Definition: GUIDesigns.h:80
#define GUIDesignBigSizeElement
elements with big images
Definition: GUIDesigns.h:44
#define GUIDesignMFXCheckableButtonBig
checkable button extended over frame
Definition: GUIDesigns.h:152
#define GUIDesignButtonReset
Reset Button.
Definition: GUIDesigns.h:171
#define GUIDesignLabelThickedFixed(width)
label thicked, icon before text, text centered and custom width
Definition: GUIDesigns.h:258
#define GUIDesignHorizontalFrame
Horizontal frame extended over frame parent with padding and spacing.
Definition: GUIDesigns.h:334
@ NETGENERATE_SPIDER
@ NETGENERATE_RANDOMGRID
@ NETGENERATE_GRID
@ NETGENERATE_RANDOM
#define TL(string)
Definition: MsgHandler.h:315
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
void openDialog()
open dialog
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
Definition: GUIDesigns.cpp:128
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