Path: blob/main/src/netedit/dialogs/tools/GNENetgenerateDialog.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 GNENetgenerateDialog.cpp14/// @author Pablo Alvarez Lopez15/// @date Mar 202316///17// Dialog for netgenerate18/****************************************************************************/1920#include <netedit/GNEApplicationWindow.h>21#include <utils/gui/div/GUIDesigns.h>2223#include "GNENetgenerateDialog.h"2425// ===========================================================================26// Defines27// ===========================================================================2829#define MARGIN 430#define MAXNUMCOLUMNS 431#define NUMROWSBYCOLUMN 203233// ===========================================================================34// FOX callback mapping35// ===========================================================================3637FXDEFMAP(GNENetgenerateDialog) GNENetgenerateDialogMap[] = {38FXMAPFUNC(SEL_COMMAND, MID_GNE_OPEN, GNENetgenerateDialog::onCmdOpenOutputFile),39FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNENetgenerateDialog::onCmdSetOutput),40FXMAPFUNC(SEL_COMMAND, MID_GNE_NETGENERATE_GRID, GNENetgenerateDialog::onCmdSetGridNetwork),41FXMAPFUNC(SEL_COMMAND, MID_GNE_NETGENERATE_SPIDER, GNENetgenerateDialog::onCmdSetSpiderNetwork),42FXMAPFUNC(SEL_COMMAND, MID_GNE_NETGENERATE_RANDOMGRID, GNENetgenerateDialog::onCmdSetRandomNetworkGridNetwork),43FXMAPFUNC(SEL_COMMAND, MID_GNE_NETGENERATE_RANDOM, GNENetgenerateDialog::onCmdSetRandomNetwork),44FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_ADVANCED, GNENetgenerateDialog::onCmdAdvanced),45};4647// Object implementation48FXIMPLEMENT(GNENetgenerateDialog, GNEDialog, GNENetgenerateDialogMap, ARRAYNUMBER(GNENetgenerateDialogMap))4950// ============================================-===============================51// member method definitions52// ===========================================================================5354GNENetgenerateDialog::GNENetgenerateDialog(GNEApplicationWindow* applicationWindow) :55GNEDialog(applicationWindow, "Netgenerate", GUIIcon::NETGENERATE,56DialogType::NETGENERATE, GNEDialog::Buttons::RUN_ADVANCED_CANCEL,57GNEDialog::OpenType::MODAL, ResizeMode::STATIC) {58// build labels59auto horizontalFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);60myGridNetworkLabel = new FXLabel(horizontalFrame, TL("Grid"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));61mySpiderNetworkLabel = new FXLabel(horizontalFrame, TL("Spider"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));62myRandomGridNetworkLabel = new FXLabel(horizontalFrame, TL("Random grid"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));63myRandomNetworkLabel = new FXLabel(horizontalFrame, TL("Random"), nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));64// build buttons65horizontalFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);66myGridNetworkButton = new MFXCheckableButton(false, horizontalFrame, applicationWindow->getStaticTooltipMenu(), "",67GUIIconSubSys::getIcon(GUIIcon::NETGENERATE_GRID), this, MID_GNE_NETGENERATE_GRID, GUIDesignMFXCheckableButtonBig);68mySpiderNetworkButton = new MFXCheckableButton(false, horizontalFrame, applicationWindow->getStaticTooltipMenu(), "",69GUIIconSubSys::getIcon(GUIIcon::NETGENERATE_SPIDER), this, MID_GNE_NETGENERATE_SPIDER, GUIDesignMFXCheckableButtonBig);70myRandomGridNetworkButton = new MFXCheckableButton(false, horizontalFrame, applicationWindow->getStaticTooltipMenu(), "",71GUIIconSubSys::getIcon(GUIIcon::NETGENERATE_RANDOMGRID), this, MID_GNE_NETGENERATE_RANDOMGRID, GUIDesignMFXCheckableButtonBig);72myRandomNetworkButton = new MFXCheckableButton(false, horizontalFrame, applicationWindow->getStaticTooltipMenu(), "",73GUIIconSubSys::getIcon(GUIIcon::NETGENERATE_RANDOM), this, MID_GNE_NETGENERATE_RANDOM, GUIDesignMFXCheckableButtonBig);74// add invisible separator75new FXSeparator(myContentFrame, SEPARATOR_NONE);76// build output file elements77horizontalFrame = new FXHorizontalFrame(myContentFrame, GUIDesignAuxiliarHorizontalFrame);78new FXLabel(horizontalFrame, "output-file", nullptr, GUIDesignLabelThickedFixed(GUIDesignBigSizeElement));79GUIDesigns::buildFXButton(horizontalFrame, "", "", TL("Select filename"),80GUIIconSubSys::getIcon(GUIIcon::OPEN_NET), this, MID_GNE_OPEN, GUIDesignButtonIcon);81myOutputTextField = new FXTextField(horizontalFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);82// open dialog83auto& generateOptions = myApplicationWindow->getNetgenerateOptions();84// reset buttons85if (generateOptions.getBool("grid")) {86if (generateOptions.getBool("rand.grid")) {87myRandomGridNetworkButton->setChecked(true);88onCmdSetRandomNetworkGridNetwork(nullptr, 0, nullptr);89} else {90myGridNetworkButton->setChecked(true);91onCmdSetGridNetwork(nullptr, 0, nullptr);92}93} else if (generateOptions.getBool("spider")) {94mySpiderNetworkButton->setChecked(true);95onCmdSetSpiderNetwork(nullptr, 0, nullptr);96} else if (generateOptions.getBool("random")) {97myRandomNetworkButton->setChecked(true);98onCmdSetRandomNetwork(nullptr, 0, nullptr);99}100// set output101myOutputTextField->setText(generateOptions.getValueString("output-file").c_str());102// disable run and advanced103updateRunButtons();104// open dialog105openDialog();106}107108109GNENetgenerateDialog::~GNENetgenerateDialog() {}110111112void113GNENetgenerateDialog::runInternalTest(const InternalTestStep::DialogArgument* /*dialogArgument*/) {114// nothing to do115}116117118long119GNENetgenerateDialog::onCmdOpenOutputFile(FXObject*, FXSelector, void*) {120// get output file121const auto networkFileDialog = GNEFileDialog(myApplicationWindow, TL("network file"),122SUMOXMLDefinitions::NetFileExtensions.getStrings(),123GNEFileDialog::OpenMode::SAVE,124GNEFileDialog::ConfigType::NETEDIT);125// check file126if (networkFileDialog.getResult() == GNEDialog::Result::ACCEPT) {127myOutputTextField->setText(networkFileDialog.getFilename().c_str(), TRUE);128}129return 1;130}131132133long134GNENetgenerateDialog::onCmdSetOutput(FXObject*, FXSelector, void*) {135auto& generateOptions = myApplicationWindow->getNetgenerateOptions();136generateOptions.resetWritable();137// check if filename is valid138if (SUMOXMLDefinitions::isValidFilename(myOutputTextField->getText().text()) == false) {139myOutputTextField->setTextColor(GUIDesignTextColorRed);140} else {141generateOptions.set("output-file", myOutputTextField->getText().text());142myOutputTextField->setTextColor(GUIDesignTextColorBlack);143}144updateRunButtons();145return 1;146}147148149long150GNENetgenerateDialog::onCmdSetGridNetwork(FXObject*, FXSelector, void*) {151auto& generateOptions = myApplicationWindow->getNetgenerateOptions();152// reset all flags153generateOptions.resetWritable();154generateOptions.set("grid", "true");155generateOptions.set("spider", "false");156generateOptions.set("rand", "false");157generateOptions.set("rand.grid", "false");158// set buttons159myGridNetworkButton->setChecked(true, true);160mySpiderNetworkButton->setChecked(false, true);161myRandomGridNetworkButton->setChecked(false, true);162myRandomNetworkButton->setChecked(false, true);163// set labels color164myGridNetworkLabel->setTextColor(GUIDesignTextColorBlue);165mySpiderNetworkLabel->setTextColor(GUIDesignTextColorBlack);166myRandomGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);167myRandomNetworkLabel->setTextColor(GUIDesignTextColorBlack);168// enable flag169mySelectedNetworktypeFlag = true;170updateRunButtons();171return 1;172}173174175long176GNENetgenerateDialog::onCmdSetSpiderNetwork(FXObject*, FXSelector, void*) {177auto& generateOptions = myApplicationWindow->getNetgenerateOptions();178// reset all flags179generateOptions.resetWritable();180generateOptions.set("grid", "false");181generateOptions.set("spider", "true");182generateOptions.set("spider.omit-center", "true");183generateOptions.set("rand", "false");184generateOptions.set("rand.grid", "false");185// set buttons186myGridNetworkButton->setChecked(false, true);187mySpiderNetworkButton->setChecked(true, true);188myRandomGridNetworkButton->setChecked(false, true);189myRandomNetworkButton->setChecked(false, true);190// set labels color191myGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);192mySpiderNetworkLabel->setTextColor(GUIDesignTextColorBlue);193myRandomGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);194myRandomNetworkLabel->setTextColor(GUIDesignTextColorBlack);195// enable flag196mySelectedNetworktypeFlag = true;197updateRunButtons();198return 1;199}200201202long203GNENetgenerateDialog::onCmdSetRandomNetworkGridNetwork(FXObject*, FXSelector, void*) {204auto& generateOptions = myApplicationWindow->getNetgenerateOptions();205// reset all flags206generateOptions.resetWritable();207generateOptions.set("grid", "false");208generateOptions.set("spider", "false");209generateOptions.set("rand", "true");210generateOptions.set("rand.grid", "true");211// set buttons212myGridNetworkButton->setChecked(false, true);213mySpiderNetworkButton->setChecked(false, true);214myRandomGridNetworkButton->setChecked(true, true);215myRandomNetworkButton->setChecked(false, true);216// set labels color217myGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);218mySpiderNetworkLabel->setTextColor(GUIDesignTextColorBlack);219myRandomGridNetworkLabel->setTextColor(GUIDesignTextColorBlue);220myRandomNetworkLabel->setTextColor(GUIDesignTextColorBlack);221// enable flag222mySelectedNetworktypeFlag = true;223updateRunButtons();224return 1;225}226227228long229GNENetgenerateDialog::onCmdSetRandomNetwork(FXObject*, FXSelector, void*) {230auto& generateOptions = myApplicationWindow->getNetgenerateOptions();231// reset all flags232generateOptions.resetWritable();233generateOptions.set("grid", "false");234generateOptions.set("spider", "false");235generateOptions.set("rand", "true");236generateOptions.set("rand.grid", "false");237// set buttons238myGridNetworkButton->setChecked(false, true);239mySpiderNetworkButton->setChecked(false, true);240myRandomGridNetworkButton->setChecked(false, true);241myRandomNetworkButton->setChecked(true, true);242// set labels color243myGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);244mySpiderNetworkLabel->setTextColor(GUIDesignTextColorBlack);245myRandomGridNetworkLabel->setTextColor(GUIDesignTextColorBlack);246myRandomNetworkLabel->setTextColor(GUIDesignTextColorBlue);247// enable flag248mySelectedNetworktypeFlag = true;249updateRunButtons();250return 1;251}252253254long255GNENetgenerateDialog::onCmdRun(FXObject*, FXSelector, void*) {256// close dialog257closeDialogCanceling();258// run netgenerate259return myApplicationWindow->tryHandle(this, FXSEL(SEL_COMMAND, MID_GNE_RUNNETGENERATE), nullptr);260}261262263long264GNENetgenerateDialog::onCmdAdvanced(FXObject*, FXSelector, void*) {265// close dialog266closeDialogCanceling();267// open netgenerate option dialog268return myApplicationWindow->tryHandle(this, FXSEL(SEL_COMMAND, MID_GNE_NETGENERATEOPTIONS), nullptr);269}270271272void273GNENetgenerateDialog::updateRunButtons() {274// enable or disable run and advanced buttons depending of flags275if ((myOutputTextField->getText().length() > 0) && mySelectedNetworktypeFlag) {276myRunButton->enable();277myAdvancedButton->enable();278} else {279myRunButton->disable();280myAdvancedButton->disable();281}282}283284/****************************************************************************/285286287