Path: blob/main/src/netedit/dialogs/tools/GNERunNetgenerateDialog.cpp
169684 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file GNERunNetgenerateDialog.cpp14/// @author Pablo Alvarez Lopez15/// @date Mar 202316///17// Dialog for running tools18/****************************************************************************/1920#include <netedit/GNEApplicationWindow.h>21#include <netedit/tools/GNERunNetgenerate.h>22#include <utils/gui/div/GUIDesigns.h>23#include <utils/gui/events/GUIEvent_Message.h>2425#include "GNERunNetgenerateDialog.h"2627// ===========================================================================28// Defines29// ===========================================================================3031#define MARGIN 43233// ===========================================================================34// FOX callback mapping35// ===========================================================================3637FXDEFMAP(GNERunNetgenerateDialog) GNERunNetgenerateDialogMap[] = {38FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_SAVE, GNERunNetgenerateDialog::onCmdSaveLog),39FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_ABORT, GNERunNetgenerateDialog::onCmdAbort),40FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_RERUN, GNERunNetgenerateDialog::onCmdRerun),41FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_BACK, GNERunNetgenerateDialog::onCmdBack),42// threads events43FXMAPFUNC(FXEX::SEL_THREAD_EVENT, ID_LOADTHREAD_EVENT, GNERunNetgenerateDialog::onThreadEvent),44FXMAPFUNC(FXEX::SEL_THREAD, ID_LOADTHREAD_EVENT, GNERunNetgenerateDialog::onThreadEvent)45};4647// Object implementation48FXIMPLEMENT(GNERunNetgenerateDialog, GNEDialog, GNERunNetgenerateDialogMap, ARRAYNUMBER(GNERunNetgenerateDialogMap))4950// ============================================-===============================51// member method definitions52// ===========================================================================5354GNERunNetgenerateDialog::GNERunNetgenerateDialog(GNEApplicationWindow* applicationWindow, const OptionsCont* netgenerateOptions) :55GNEDialog(applicationWindow, TL("Running netgenerate results"), GUIIcon::NETGENERATE,56GNEDialog::Buttons::ABORT_RERUN_BACK_CLOSE, OpenType::MODAL,57GNEDialog::ResizeMode::RESIZABLE, 640, 480) {58// build the thread - io59myThreadEvent.setTarget(this);60myThreadEvent.setSelector(ID_LOADTHREAD_EVENT);61// create run tool62myRunNetgenerate = new GNERunNetgenerate(this, myEvents, myThreadEvent);63// create header frame64auto headerFrame = new FXHorizontalFrame(myContentFrame, GUIDesignHorizontalFrame);65// adjust padding66headerFrame->setPadLeft(0);67headerFrame->setPadRight(0);68GUIDesigns::buildFXButton(headerFrame, "", "", + TL("Save output"),69GUIIconSubSys::getIcon(GUIIcon::SAVE), this, MID_GNE_BUTTON_SAVE, GUIDesignButtonIcon);70new FXLabel(headerFrame, TL("Console output"), nullptr, GUIDesignLabelThick(JUSTIFY_LEFT));71// create text72auto textFrame = new FXVerticalFrame(myContentFrame, GUIDesignFrameThick);73myText = new FXText(textFrame, 0, 0, (TEXT_READONLY | LAYOUT_FILL_X | LAYOUT_FILL_Y));74// set styled75myText->setHiliteStyles(GUIMessageWindow::getStyles());76myText->setStyled(true);77// set netgenerate options78myNetgenerateOptions = netgenerateOptions;79// reset error flag80myError = false;81// open modal dialog before running netgenerate82openDialog();83// run tool84myRunNetgenerate->run(myNetgenerateOptions);85}868788GNERunNetgenerateDialog::~GNERunNetgenerateDialog() {}899091void92GNERunNetgenerateDialog::runInternalTest(const InternalTestStep::DialogArgument* /*dialogArgument*/) {93// nothing to do94}959697void98GNERunNetgenerateDialog::updateDialog() {99/*100// update buttons101if (myRunNetgenerate->isRunning()) {102myAbortButton->enable();103myRerunButton->disable();104myBackButton->disable();105myCloseButton->disable();106} else {107myAbortButton->disable();108myRerunButton->enable();109myBackButton->enable();110myCloseButton->enable();111}112*/113// update dialog114GNEDialog::update();115}116117118long119GNERunNetgenerateDialog::onCmdSaveLog(FXObject*, FXSelector, void*) {120// get log file121const auto logFile = GNEApplicationWindowHelper::saveToolLog(this);122// check that file is valid123if (logFile.size() > 0) {124OutputDevice& dev = OutputDevice::getDevice(logFile);125dev << myText->getText().text();126dev.close();127}128return 1;129}130131132long133GNERunNetgenerateDialog::onCmdAbort(FXObject*, FXSelector, void*) {134// abort tool135myRunNetgenerate->abort();136return 1;137}138139140long141GNERunNetgenerateDialog::onCmdRerun(FXObject*, FXSelector, void*) {142// add line and info143std::string line("-------------------------------------------\n");144myText->appendStyledText(line.c_str(), (int)line.length(), 4, TRUE);145myText->appendStyledText("rerun tool\n", 1, TRUE);146myText->layout();147myText->update();148myError = false;149// run tool150myRunNetgenerate->run(myNetgenerateOptions);151return 1;152}153154155long156GNERunNetgenerateDialog::onCmdBack(FXObject*, FXSelector, void*) {157// close run dialog and open tool dialog158onCmdCancel(nullptr, 0, nullptr);159return myApplicationWindow->handle(this, FXSEL(SEL_COMMAND, MID_GNE_NETGENERATE), nullptr);160}161162163long164GNERunNetgenerateDialog::onCmdAccept(FXObject*, FXSelector, void*) {165// close run dialog and call postprocessing166onCmdCancel(nullptr, 0, nullptr);167myText->setText("", 0);168// call postprocessing dialog169if (myError) {170return 1;171} else {172// don't run this again173myError = true;174return myApplicationWindow->handle(this, FXSEL(SEL_COMMAND, MID_GNE_POSTPROCESSINGNETGENERATE), nullptr);175}176}177178179long180GNERunNetgenerateDialog::onCmdCancel(FXObject*, FXSelector, void*) {181// abort tool182myRunNetgenerate->abort();183// workaround race conditionat that prevents hiding184show();185hide();186return 1;187}188189long190GNERunNetgenerateDialog::onThreadEvent(FXObject*, FXSelector, void*) {191bool toolFinished = false;192while (!myEvents.empty()) {193// get the next event194GUIEvent* e = myEvents.top();195myEvents.pop();196// process197FXint style = -1;198switch (e->getOwnType()) {199case GUIEventType::TOOL_ENDED:200toolFinished = true;201break;202case GUIEventType::MESSAGE_OCCURRED:203style = 1;204break;205case GUIEventType::OUTPUT_OCCURRED:206style = 2;207break;208case GUIEventType::ERROR_OCCURRED:209style = 3;210myError = true;211break;212default:213break;214}215if (style >= 0) {216GUIEvent_Message* ec = static_cast<GUIEvent_Message*>(e);217myText->appendStyledText(ec->getMsg().c_str(), (int)ec->getMsg().length(), style, TRUE);218myText->layout();219myText->update();220}221delete e;222updateDialog();223}224225if (toolFinished) {226// check if close dialog immediately after running227if (myText->getText().find("Error") != -1) {228myError = true;229} else if ((myText->getText().find("Success") != -1) && (myText->getText().find("Warning") == -1)) {230onCmdClose(nullptr, 0, nullptr);231}232}233234return 1;235}236237/****************************************************************************/238239240