Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/dialogs/tools/GNERunNetgenerateDialog.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 GNERunNetgenerateDialog.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Mar 2023
17
///
18
// Dialog for running tools
19
/****************************************************************************/
20
21
#include <netedit/GNEApplicationWindow.h>
22
#include <netedit/tools/GNERunNetgenerate.h>
23
#include <utils/gui/div/GUIDesigns.h>
24
#include <utils/gui/events/GUIEvent_Message.h>
25
26
#include "GNERunNetgenerateDialog.h"
27
28
// ===========================================================================
29
// Defines
30
// ===========================================================================
31
32
#define MARGIN 4
33
34
// ===========================================================================
35
// FOX callback mapping
36
// ===========================================================================
37
38
FXDEFMAP(GNERunNetgenerateDialog) GNERunNetgenerateDialogMap[] = {
39
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_SAVE, GNERunNetgenerateDialog::onCmdSaveLog),
40
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_ABORT, GNERunNetgenerateDialog::onCmdAbort),
41
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_RERUN, GNERunNetgenerateDialog::onCmdRerun),
42
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_BACK, GNERunNetgenerateDialog::onCmdBack),
43
// threads events
44
FXMAPFUNC(FXEX::SEL_THREAD_EVENT, ID_LOADTHREAD_EVENT, GNERunNetgenerateDialog::onThreadEvent),
45
FXMAPFUNC(FXEX::SEL_THREAD, ID_LOADTHREAD_EVENT, GNERunNetgenerateDialog::onThreadEvent)
46
};
47
48
// Object implementation
49
FXIMPLEMENT(GNERunNetgenerateDialog, GNEDialog, GNERunNetgenerateDialogMap, ARRAYNUMBER(GNERunNetgenerateDialogMap))
50
51
// ============================================-===============================
52
// member method definitions
53
// ===========================================================================
54
55
GNERunNetgenerateDialog::GNERunNetgenerateDialog(GNEApplicationWindow* applicationWindow, const OptionsCont* netgenerateOptions) :
56
GNEDialog(applicationWindow, TL("Running netgenerate results"), GUIIcon::NETGENERATE,
57
GNEDialog::Buttons::ABORT_RERUN_BACK_CLOSE, OpenType::MODAL,
58
GNEDialog::ResizeMode::RESIZABLE, 640, 480) {
59
// build the thread - io
60
myThreadEvent.setTarget(this);
61
myThreadEvent.setSelector(ID_LOADTHREAD_EVENT);
62
// create run tool
63
myRunNetgenerate = new GNERunNetgenerate(this, myEvents, myThreadEvent);
64
// create header frame
65
auto headerFrame = new FXHorizontalFrame(myContentFrame, GUIDesignHorizontalFrame);
66
// adjust padding
67
headerFrame->setPadLeft(0);
68
headerFrame->setPadRight(0);
69
GUIDesigns::buildFXButton(headerFrame, "", "", + TL("Save output"),
70
GUIIconSubSys::getIcon(GUIIcon::SAVE), this, MID_GNE_BUTTON_SAVE, GUIDesignButtonIcon);
71
new FXLabel(headerFrame, TL("Console output"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));
72
// create text
73
auto textFrame = new FXVerticalFrame(myContentFrame, GUIDesignFrameThick);
74
myText = new FXText(textFrame, 0, 0, (TEXT_READONLY | LAYOUT_FILL_X | LAYOUT_FILL_Y));
75
// set styled
76
myText->setHiliteStyles(GUIMessageWindow::getStyles());
77
myText->setStyled(true);
78
// set netgenerate options
79
myNetgenerateOptions = netgenerateOptions;
80
// reset error flag
81
myError = false;
82
// open modal dialog before running netgenerate
83
openDialog();
84
// run tool
85
myRunNetgenerate->run(myNetgenerateOptions);
86
}
87
88
89
GNERunNetgenerateDialog::~GNERunNetgenerateDialog() {}
90
91
92
void
93
GNERunNetgenerateDialog::runInternalTest(const InternalTestStep::DialogArgument* /*dialogArgument*/) {
94
// nothing to do
95
}
96
97
98
void
99
GNERunNetgenerateDialog::updateDialog() {
100
/*
101
// update buttons
102
if (myRunNetgenerate->isRunning()) {
103
myAbortButton->enable();
104
myRerunButton->disable();
105
myBackButton->disable();
106
myCloseButton->disable();
107
} else {
108
myAbortButton->disable();
109
myRerunButton->enable();
110
myBackButton->enable();
111
myCloseButton->enable();
112
}
113
*/
114
// update dialog
115
GNEDialog::update();
116
}
117
118
119
long
120
GNERunNetgenerateDialog::onCmdSaveLog(FXObject*, FXSelector, void*) {
121
// get log file
122
const auto logFile = GNEApplicationWindowHelper::saveToolLog(this);
123
// check that file is valid
124
if (logFile.size() > 0) {
125
OutputDevice& dev = OutputDevice::getDevice(logFile);
126
dev << myText->getText().text();
127
dev.close();
128
}
129
return 1;
130
}
131
132
133
long
134
GNERunNetgenerateDialog::onCmdAbort(FXObject*, FXSelector, void*) {
135
// abort tool
136
myRunNetgenerate->abort();
137
return 1;
138
}
139
140
141
long
142
GNERunNetgenerateDialog::onCmdRerun(FXObject*, FXSelector, void*) {
143
// add line and info
144
std::string line("-------------------------------------------\n");
145
myText->appendStyledText(line.c_str(), (int)line.length(), 4, TRUE);
146
myText->appendStyledText("rerun tool\n", 1, TRUE);
147
myText->layout();
148
myText->update();
149
myError = false;
150
// run tool
151
myRunNetgenerate->run(myNetgenerateOptions);
152
return 1;
153
}
154
155
156
long
157
GNERunNetgenerateDialog::onCmdBack(FXObject*, FXSelector, void*) {
158
// close run dialog and open tool dialog
159
onCmdCancel(nullptr, 0, nullptr);
160
return myApplicationWindow->handle(this, FXSEL(SEL_COMMAND, MID_GNE_NETGENERATE), nullptr);
161
}
162
163
164
long
165
GNERunNetgenerateDialog::onCmdAccept(FXObject*, FXSelector, void*) {
166
// close run dialog and call postprocessing
167
onCmdCancel(nullptr, 0, nullptr);
168
myText->setText("", 0);
169
// call postprocessing dialog
170
if (myError) {
171
return 1;
172
} else {
173
// don't run this again
174
myError = true;
175
return myApplicationWindow->handle(this, FXSEL(SEL_COMMAND, MID_GNE_POSTPROCESSINGNETGENERATE), nullptr);
176
}
177
}
178
179
180
long
181
GNERunNetgenerateDialog::onCmdCancel(FXObject*, FXSelector, void*) {
182
// abort tool
183
myRunNetgenerate->abort();
184
// workaround race conditionat that prevents hiding
185
show();
186
hide();
187
return 1;
188
}
189
190
long
191
GNERunNetgenerateDialog::onThreadEvent(FXObject*, FXSelector, void*) {
192
bool toolFinished = false;
193
while (!myEvents.empty()) {
194
// get the next event
195
GUIEvent* e = myEvents.top();
196
myEvents.pop();
197
// process
198
FXint style = -1;
199
switch (e->getOwnType()) {
200
case GUIEventType::TOOL_ENDED:
201
toolFinished = true;
202
break;
203
case GUIEventType::MESSAGE_OCCURRED:
204
style = 1;
205
break;
206
case GUIEventType::OUTPUT_OCCURRED:
207
style = 2;
208
break;
209
case GUIEventType::ERROR_OCCURRED:
210
style = 3;
211
myError = true;
212
break;
213
default:
214
break;
215
}
216
if (style >= 0) {
217
GUIEvent_Message* ec = static_cast<GUIEvent_Message*>(e);
218
myText->appendStyledText(ec->getMsg().c_str(), (int)ec->getMsg().length(), style, TRUE);
219
myText->layout();
220
myText->update();
221
}
222
delete e;
223
updateDialog();
224
}
225
226
if (toolFinished) {
227
// check if close dialog immediately after running
228
if (myText->getText().find("Error") != -1) {
229
myError = true;
230
} else if ((myText->getText().find("Success") != -1) && (myText->getText().find("Warning") == -1)) {
231
onCmdClose(nullptr, 0, nullptr);
232
}
233
}
234
235
return 1;
236
}
237
238
/****************************************************************************/
239
240