Path: blob/main/src/netedit/dialogs/tools/GNEPythonToolDialogElements.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 GNEPythonToolDialogElements.cpp14/// @author Pablo Alvarez Lopez15/// @date Jun 202216///17// Elements used in GNEPythonToolDialog18/****************************************************************************/1920#include <netedit/GNEApplicationWindow.h>21#include <netedit/GNENet.h>22#include <netedit/tools/GNEPythonTool.h>23#include <utils/foxtools/MFXLabelTooltip.h>24#include <utils/gui/div/GUIDesigns.h>2526#include "GNEPythonToolDialogElements.h"27#include "GNEPythonToolDialog.h"2829// ===========================================================================30// static members31// ===========================================================================3233const std::string GNEPythonToolDialogElements::IntArgument::INVALID_INT_STR = toString(INVALID_INT);34const std::string GNEPythonToolDialogElements::FloatArgument::INVALID_DOUBLE_STR = toString(INVALID_DOUBLE);3536// ===========================================================================37// FOX callback mapping38// ===========================================================================3940FXDEFMAP(GNEPythonToolDialogElements::Argument) ArgumentMap[] = {41FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNEPythonToolDialogElements::Argument::onCmdSetValue),42FXMAPFUNC(SEL_COMMAND, MID_GNE_RESET, GNEPythonToolDialogElements::Argument::onCmdResetValue),43FXMAPFUNC(SEL_UPDATE, MID_GNE_RESET, GNEPythonToolDialogElements::Argument::onUpdResetValue)44};4546FXDEFMAP(GNEPythonToolDialogElements::FileNameArgument) FileNameArgumentMap[] = {47FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEPythonToolDialogElements::FileNameArgument::onCmdOpenFilename)48};4950FXDEFMAP(GNEPythonToolDialogElements::EdgeVectorArgument) EdgeVectorArgumentMap[] = {51FXMAPFUNC(SEL_COMMAND, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::EdgeVectorArgument::onCmdUseCurrent),52FXMAPFUNC(SEL_UPDATE, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::EdgeVectorArgument::onUpdUseCurrent)53};5455FXDEFMAP(GNEPythonToolDialogElements::NetworkArgument) NetworkArgumentMap[] = {56FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEPythonToolDialogElements::NetworkArgument::onCmdOpenFilename),57FXMAPFUNC(SEL_COMMAND, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::NetworkArgument::onCmdUseCurrentNetworkFile),58FXMAPFUNC(SEL_UPDATE, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::NetworkArgument::onUpdUseCurrentNetworkFile)59};6061FXDEFMAP(GNEPythonToolDialogElements::AdditionalArgument) AdditionalArgumentMap[] = {62FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEPythonToolDialogElements::AdditionalArgument::onCmdOpenFilename),63FXMAPFUNC(SEL_COMMAND, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::AdditionalArgument::onCmdUseCurrentAdditionalFile),64FXMAPFUNC(SEL_UPDATE, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::AdditionalArgument::onUpdUseCurrentAdditionalFile)65};6667FXDEFMAP(GNEPythonToolDialogElements::RouteArgument) RouteArgumentMap[] = {68FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEPythonToolDialogElements::RouteArgument::onCmdOpenFilename),69FXMAPFUNC(SEL_COMMAND, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::RouteArgument::onCmdUseCurrentRouteFile),70FXMAPFUNC(SEL_UPDATE, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::RouteArgument::onUpdUseCurrentRouteFile)71};7273FXDEFMAP(GNEPythonToolDialogElements::DataArgument) DataArgumentMap[] = {74FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEPythonToolDialogElements::DataArgument::onCmdOpenFilename),75FXMAPFUNC(SEL_COMMAND, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::DataArgument::onCmdUseCurrentDataFile),76FXMAPFUNC(SEL_UPDATE, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::DataArgument::onUpdUseCurrentDataFile)77};7879FXDEFMAP(GNEPythonToolDialogElements::SumoConfigArgument) SumoConfigArgumentMap[] = {80FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEPythonToolDialogElements::SumoConfigArgument::onCmdOpenFilename),81FXMAPFUNC(SEL_COMMAND, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::SumoConfigArgument::onCmdUseCurrentSumoConfigFile),82FXMAPFUNC(SEL_UPDATE, MID_GNE_USE_CURRENT, GNEPythonToolDialogElements::SumoConfigArgument::onUpdUseCurrentSumoConfigFile)83};8485// Object implementation86FXIMPLEMENT_ABSTRACT(GNEPythonToolDialogElements::Argument, FXHorizontalFrame, ArgumentMap, ARRAYNUMBER(ArgumentMap))87FXIMPLEMENT(GNEPythonToolDialogElements::EdgeVectorArgument, GNEPythonToolDialogElements::Argument, EdgeVectorArgumentMap, ARRAYNUMBER(EdgeVectorArgumentMap))88FXIMPLEMENT(GNEPythonToolDialogElements::FileNameArgument, GNEPythonToolDialogElements::Argument, FileNameArgumentMap, ARRAYNUMBER(FileNameArgumentMap))89FXIMPLEMENT(GNEPythonToolDialogElements::NetworkArgument, GNEPythonToolDialogElements::FileNameArgument, NetworkArgumentMap, ARRAYNUMBER(NetworkArgumentMap))90FXIMPLEMENT(GNEPythonToolDialogElements::AdditionalArgument, GNEPythonToolDialogElements::FileNameArgument, AdditionalArgumentMap, ARRAYNUMBER(AdditionalArgumentMap))91FXIMPLEMENT(GNEPythonToolDialogElements::RouteArgument, GNEPythonToolDialogElements::FileNameArgument, RouteArgumentMap, ARRAYNUMBER(RouteArgumentMap))92FXIMPLEMENT(GNEPythonToolDialogElements::DataArgument, GNEPythonToolDialogElements::FileNameArgument, DataArgumentMap, ARRAYNUMBER(DataArgumentMap))93FXIMPLEMENT(GNEPythonToolDialogElements::SumoConfigArgument, GNEPythonToolDialogElements::FileNameArgument, SumoConfigArgumentMap, ARRAYNUMBER(SumoConfigArgumentMap))949596// ===========================================================================97// member method definitions98// ===========================================================================99100// ---------------------------------------------------------------------------101// GNEPythonToolDialogElements::Category - methods102// ---------------------------------------------------------------------------103104GNEPythonToolDialogElements::Category::Category(FXVerticalFrame* argumentFrame, const std::string& category) :105FXHorizontalFrame(argumentFrame, GUIDesignAuxiliarHorizontalFrame) {106// create category label107new FXLabel(this, category.c_str(), nullptr, GUIDesignLabel(JUSTIFY_NORMAL));108}109110111GNEPythonToolDialogElements::Category::~Category() {}112113// ---------------------------------------------------------------------------114// GNEPythonToolDialogElements::Argument - methods115// ---------------------------------------------------------------------------116117GNEPythonToolDialogElements::Argument::Argument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,118GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame,119const std::string& parameter, Option* option) :120FXHorizontalFrame(argumentFrame, GUIDesignAuxiliarHorizontalFrame),121myToolDialogParent(toolDialogParent),122myOption(option),123myDefaultValue(pythonTool->getDefaultValue(parameter)) {124// create parameter label125myParameterLabel = new MFXLabelTooltip(this, applicationWindow->getStaticTooltipMenu(), parameter.c_str(), nullptr, GUIDesignLabelThickedFixed(0));126myParameterLabel->setTipText((option->getTypeName() + ": " + option->getDescription()).c_str());127// set color if is required128if (option->isRequired()) {129myParameterLabel->setTextColor(GUIDesignTextColorBlue);130}131// create horizontal frame for textField132myElementsFrame = new FXHorizontalFrame(this, GUIDesignAuxiliarFrame);133// Create reset button134myResetButton = GUIDesigns::buildFXButton(this, "", "", TL("Reset value"), GUIIconSubSys::getIcon(GUIIcon::RESET), this, MID_GNE_RESET, GUIDesignButtonIcon);135}136137138GNEPythonToolDialogElements::Argument::~Argument() {}139140141MFXLabelTooltip*142GNEPythonToolDialogElements::Argument::getParameterLabel() const {143return myParameterLabel;144}145146147const std::string148GNEPythonToolDialogElements::Argument::getArgument() const {149if (getValue() != myDefaultValue) {150return ("-" + std::string(myParameterLabel->getText().text()) + " " + getValue() + " ");151} else {152return "";153}154}155156157bool158GNEPythonToolDialogElements::Argument::requiredAttributeSet() const {159if (myOption->isRequired()) {160return getValue() != myDefaultValue;161} else {162return true;163}164}165166167long168GNEPythonToolDialogElements::Argument::onCmdResetValue(FXObject*, FXSelector, void*) {169// just reset value170reset();171return 1;172}173174175long176GNEPythonToolDialogElements::Argument::onUpdResetValue(FXObject*, FXSelector, void*) {177if (getValue() == myDefaultValue) {178return myResetButton->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);179} else {180return myResetButton->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);181}182}183184185GNEPythonToolDialogElements::Argument::Argument() {}186187// ---------------------------------------------------------------------------188// GNEPythonToolDialogElements::FileNameArgument - methods189// ---------------------------------------------------------------------------190191GNEPythonToolDialogElements::FileNameArgument::FileNameArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,192GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :193FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, "") {194}195196197void198GNEPythonToolDialogElements::FileNameArgument::reset() {199myFilenameTextField->setText(myDefaultValue.c_str());200myOption->set(myDefaultValue, myDefaultValue, false);201myOption->resetDefault();202}203204205long206GNEPythonToolDialogElements::FileNameArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {207// get open mode208GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;209if (myOption->getSubTopic() == "output") {210if (myOption->getListSeparator() != "") {211openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;212} else {213openMode = GNEFileDialog::OpenMode::LOAD_SINGLE;214}215}216// get file217const auto xmlFileDialog = GNEFileDialog(myToolDialogParent->getApplicationWindow(), TL("XML file"),218SUMOXMLDefinitions::XMLFileExtensions.getStrings(), openMode,219GNEFileDialog::ConfigType::NETEDIT);220// check that file is valid221if (xmlFileDialog.getResult() == GNEDialog::Result::ACCEPT) {222myFilenameTextField->setText(xmlFileDialog.getFilename().c_str(), TRUE);223}224return 1;225}226227228long229GNEPythonToolDialogElements::FileNameArgument::onCmdSetValue(FXObject*, FXSelector, void*) {230myOption->resetWritable();231if (myFilenameTextField->getText().empty()) {232reset();233} else {234myOption->set(myFilenameTextField->getText().text(), myFilenameTextField->getText().text(), false);235}236return 1;237}238239240GNEPythonToolDialogElements::FileNameArgument::FileNameArgument() {}241242243GNEPythonToolDialogElements::FileNameArgument::FileNameArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,244GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option,245const std::string& useCurrent) :246Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {247// check if create current button248if (useCurrent.size() > 0) {249myCurrentButton = new MFXButtonTooltip(myElementsFrame, applicationWindow->getStaticTooltipMenu(), "",250GUIIconSubSys::getIcon(GUIIcon::CURRENT), this, MID_GNE_USE_CURRENT, GUIDesignButtonIcon);251myCurrentButton->setTipText(TLF("Use current % file", useCurrent).c_str());252}253// Create Open button254myOpenFilenameButton = new MFXButtonTooltip(myElementsFrame, applicationWindow->getStaticTooltipMenu(), "",255GUIIconSubSys::getIcon(GUIIcon::OPEN), this, MID_GNE_SELECT, GUIDesignButtonIcon);256myOpenFilenameButton->setTipText(TLF("Select % file", useCurrent).c_str());257// create text field for filename258myFilenameTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);259// set value260myFilenameTextField->setText(option->getValueString().c_str());261}262263const std::string264GNEPythonToolDialogElements::FileNameArgument::getValue() const {265return myFilenameTextField->getText().text();266}267268// ---------------------------------------------------------------------------269// GNEPythonToolDialogElements::EdgeVectorArgument - methods270// ---------------------------------------------------------------------------271272GNEPythonToolDialogElements::EdgeVectorArgument::EdgeVectorArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,273GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :274Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {275myCurrentEdgesButton = new MFXButtonTooltip(myElementsFrame, applicationWindow->getStaticTooltipMenu(), "",276GUIIconSubSys::getIcon(GUIIcon::EDGE), this, MID_GNE_USE_CURRENT, GUIDesignButtonIcon);277myCurrentEdgesButton->setTipText(TL("Use current selected edges"));278// create text field for string279myEdgeVectorTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);280// set value281myEdgeVectorTextField->setText(option->getValueString().c_str());282}283284285void286GNEPythonToolDialogElements::EdgeVectorArgument::reset() {287myEdgeVectorTextField->setText(myDefaultValue.c_str());288myOption->set(myDefaultValue, myDefaultValue, false);289myOption->resetDefault();290}291292293long294GNEPythonToolDialogElements::EdgeVectorArgument::onCmdSetValue(FXObject*, FXSelector, void*) {295myOption->resetWritable();296if (myEdgeVectorTextField->getText().empty()) {297reset();298} else {299myOption->set(myEdgeVectorTextField->getText().text(), myEdgeVectorTextField->getText().text(), false);300}301return 1;302}303304305long306GNEPythonToolDialogElements::EdgeVectorArgument::onCmdUseCurrent(FXObject*, FXSelector, void*) {307// obtain list of selected edges308const auto selectedEdges = myToolDialogParent->getApplicationWindow()->getViewNet()->getNet()->getAttributeCarriers()->getSelectedEdges();309// convert list to string310std::string selectedEdgesStr;311for (const auto& edge : selectedEdges) {312selectedEdgesStr.append(edge->getID());313if (edge != selectedEdges.back()) {314selectedEdgesStr.append(" ");315}316}317myEdgeVectorTextField->setText(selectedEdgesStr.c_str(), TRUE);318return 1;319}320321322long323GNEPythonToolDialogElements::EdgeVectorArgument::onUpdUseCurrent(FXObject* sender, FXSelector, void*) {324// get view net325const auto viewNet = myToolDialogParent->getApplicationWindow()->getViewNet();326if (viewNet == nullptr) {327return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);328} else if (viewNet->getNet()->getAttributeCarriers()->getNumberOfSelectedEdges() == 0) {329return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);330} else {331return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);332}333}334335336GNEPythonToolDialogElements::EdgeVectorArgument::EdgeVectorArgument() {}337338339const std::string340GNEPythonToolDialogElements::EdgeVectorArgument::getValue() const {341return myEdgeVectorTextField->getText().text();342}343344// ---------------------------------------------------------------------------345// GNEPythonToolDialogElements::NetworkArgument - methods346// ---------------------------------------------------------------------------347348GNEPythonToolDialogElements::NetworkArgument::NetworkArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,349GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :350FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("network")) {351}352353354long355GNEPythonToolDialogElements::NetworkArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {356// get open mode357GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;358if (myOption->getSubTopic() == "output") {359if (myOption->getListSeparator() != "") {360openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;361} else {362openMode = GNEFileDialog::OpenMode::LOAD_SINGLE;363}364}365// get network file366const auto networkFileDialog = GNEFileDialog(myToolDialogParent->getApplicationWindow(), TL("network file"),367SUMOXMLDefinitions::NetFileExtensions.getStrings(), openMode,368GNEFileDialog::ConfigType::NETEDIT);369// check that file is valid370if (networkFileDialog.getResult() == GNEDialog::Result::ACCEPT) {371myFilenameTextField->setText(networkFileDialog.getFilename().c_str(), TRUE);372}373return 1;374}375376377long378GNEPythonToolDialogElements::NetworkArgument::onCmdUseCurrentNetworkFile(FXObject*, FXSelector, void*) {379myFilenameTextField->setText(OptionsCont::getOptions().getString("sumo-net-file").c_str(), TRUE);380return 1;381}382383384long385GNEPythonToolDialogElements::NetworkArgument::onUpdUseCurrentNetworkFile(FXObject* sender, FXSelector, void*) {386if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {387return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);388} else if (OptionsCont::getOptions().getString("sumo-net-file").empty()) {389return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);390} else {391return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);392}393}394395396GNEPythonToolDialogElements::NetworkArgument::NetworkArgument() {}397398// ---------------------------------------------------------------------------399// GNEPythonToolDialogElements::AdditionalArgument - methods400// ---------------------------------------------------------------------------401402GNEPythonToolDialogElements::AdditionalArgument::AdditionalArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,403GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :404FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("additional")) {405}406407408long409GNEPythonToolDialogElements::AdditionalArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {410// get open mode411GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;412if (myOption->getSubTopic() == "output") {413if (myOption->getListSeparator() != "") {414openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;415} else {416openMode = GNEFileDialog::OpenMode::LOAD_SINGLE;417}418}419// get additional file420const auto additionalFileDialog = GNEFileDialog(myToolDialogParent->getApplicationWindow(), TL("Additional elements file"),421SUMOXMLDefinitions::AdditionalFileExtensions.getStrings(), openMode,422GNEFileDialog::ConfigType::NETEDIT);423// check that file is valid424if (additionalFileDialog.getResult() == GNEDialog::Result::ACCEPT) {425myFilenameTextField->setText(additionalFileDialog.getFilename().c_str(), TRUE);426}427return 1;428}429430431long432GNEPythonToolDialogElements::AdditionalArgument::onCmdUseCurrentAdditionalFile(FXObject*, FXSelector, void*) {433myFilenameTextField->setText(OptionsCont::getOptions().getString("additional-files").c_str(), TRUE);434return 1;435}436437438long439GNEPythonToolDialogElements::AdditionalArgument::onUpdUseCurrentAdditionalFile(FXObject* sender, FXSelector, void*) {440if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {441return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);442} else if (OptionsCont::getOptions().getString("additional-files").empty()) {443return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);444} else {445return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);446}447}448449450GNEPythonToolDialogElements::AdditionalArgument::AdditionalArgument() {}451452// ---------------------------------------------------------------------------453// GNEPythonToolDialogElements::RouteArgument - methods454// ---------------------------------------------------------------------------455456GNEPythonToolDialogElements::RouteArgument::RouteArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,457GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :458FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("route")) {459}460461462long463GNEPythonToolDialogElements::RouteArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {464// get open mode465GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;466if (myOption->getSubTopic() == "output") {467if (myOption->getListSeparator() != "") {468openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;469} else {470openMode = GNEFileDialog::OpenMode::LOAD_SINGLE;471}472}473// get route file474const auto routeFileDialog = GNEFileDialog(myToolDialogParent->getApplicationWindow(), TL("Route elements file"),475SUMOXMLDefinitions::RouteFileExtensions.getStrings(), openMode,476GNEFileDialog::ConfigType::NETEDIT);477// check that file is valid478if (routeFileDialog.getResult() == GNEDialog::Result::ACCEPT) {479myFilenameTextField->setText(routeFileDialog.getFilename().c_str(), TRUE);480}481return 1;482}483484485long486GNEPythonToolDialogElements::RouteArgument::onCmdUseCurrentRouteFile(FXObject*, FXSelector, void*) {487myFilenameTextField->setText(OptionsCont::getOptions().getString("route-files").c_str(), TRUE);488return 1;489}490491492long493GNEPythonToolDialogElements::RouteArgument::onUpdUseCurrentRouteFile(FXObject* sender, FXSelector, void*) {494if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {495return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);496} else if (OptionsCont::getOptions().getString("route-files").empty()) {497return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);498} else {499return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);500}501}502503504GNEPythonToolDialogElements::RouteArgument::RouteArgument() {}505506// ---------------------------------------------------------------------------507// GNEPythonToolDialogElements::DataArgument - methods508// ---------------------------------------------------------------------------509510GNEPythonToolDialogElements::DataArgument::DataArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,511GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :512FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("data")) {513}514515516long517GNEPythonToolDialogElements::DataArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {518// get open mode519GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;520if (myOption->getSubTopic() == "output") {521if (myOption->getListSeparator() != "") {522openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;523} else {524openMode = GNEFileDialog::OpenMode::LOAD_SINGLE;525}526}527// get data file528const auto dataFileDialog = GNEFileDialog(myToolDialogParent->getApplicationWindow(), TL("Data elements file"),529SUMOXMLDefinitions::EdgeDataFileExtensions.getStrings(), openMode,530GNEFileDialog::ConfigType::NETEDIT);531// check that file is valid532if (dataFileDialog.getResult() == GNEDialog::Result::ACCEPT) {533myFilenameTextField->setText(dataFileDialog.getFilename().c_str(), TRUE);534}535return 1;536}537538539long540GNEPythonToolDialogElements::DataArgument::onCmdUseCurrentDataFile(FXObject*, FXSelector, void*) {541myFilenameTextField->setText(OptionsCont::getOptions().getString("data-files").c_str(), TRUE);542return 1;543}544545546long547GNEPythonToolDialogElements::DataArgument::onUpdUseCurrentDataFile(FXObject* sender, FXSelector, void*) {548if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {549return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);550} else if (OptionsCont::getOptions().getString("data-files").empty()) {551return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);552} else {553return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);554}555}556557558GNEPythonToolDialogElements::DataArgument::DataArgument() {}559560// ---------------------------------------------------------------------------561// GNEPythonToolDialogElements::SumoConfigArgument - methods562// ---------------------------------------------------------------------------563564GNEPythonToolDialogElements::SumoConfigArgument::SumoConfigArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,565GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :566FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("sumo config")) {567}568569570long571GNEPythonToolDialogElements::SumoConfigArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {572// get open mode573GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;574if (myOption->getSubTopic() == "output") {575if (myOption->getListSeparator() != "") {576openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;577} else {578openMode = GNEFileDialog::OpenMode::LOAD_SINGLE;579}580}581// get sumoConfig file582const auto sumoConfigFileDialog = GNEFileDialog(myToolDialogParent->getApplicationWindow(), TL("sumo config file"),583SUMOXMLDefinitions::SumoConfigFileExtensions.getStrings(), openMode,584GNEFileDialog::ConfigType::NETEDIT);585// check that file is valid586if (sumoConfigFileDialog.getResult() == GNEDialog::Result::ACCEPT) {587myFilenameTextField->setText(sumoConfigFileDialog.getFilename().c_str(), TRUE);588}589return 1;590}591592593long594GNEPythonToolDialogElements::SumoConfigArgument::onCmdUseCurrentSumoConfigFile(FXObject*, FXSelector, void*) {595myFilenameTextField->setText(OptionsCont::getOptions().getString("sumocfg-file").c_str(), TRUE);596return 1;597}598599600long601GNEPythonToolDialogElements::SumoConfigArgument::onUpdUseCurrentSumoConfigFile(FXObject* sender, FXSelector, void*) {602if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {603return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);604} else if (OptionsCont::getOptions().getString("sumocfg-file").empty()) {605return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);606} else {607return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);608}609}610611612GNEPythonToolDialogElements::SumoConfigArgument::SumoConfigArgument() {}613614// ---------------------------------------------------------------------------615// GNEPythonToolDialogElements::EdgeArgument - methods616// ---------------------------------------------------------------------------617618GNEPythonToolDialogElements::EdgeArgument::EdgeArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,619GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :620Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {621// create text field for int622myEdgeTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);623// set value624myEdgeTextField->setText(option->getValueString().c_str());625}626627628void629GNEPythonToolDialogElements::EdgeArgument::reset() {630myEdgeTextField->setText(myDefaultValue.c_str());631myOption->set(myDefaultValue, myDefaultValue, false);632myOption->resetDefault();633}634635636long637GNEPythonToolDialogElements::EdgeArgument::onCmdSetValue(FXObject*, FXSelector, void*) {638myOption->resetWritable();639if (myEdgeTextField->getText().empty()) {640reset();641} else {642myOption->set(myEdgeTextField->getText().text(), myEdgeTextField->getText().text(), false);643}644return 1;645}646647648const std::string649GNEPythonToolDialogElements::EdgeArgument::getValue() const {650return myEdgeTextField->getText().text();651}652653// ---------------------------------------------------------------------------654// GNEPythonToolDialogElements::StringArgument - methods655// ---------------------------------------------------------------------------656657GNEPythonToolDialogElements::StringArgument::StringArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,658GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :659Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {660// create text field for string661myStringTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);662// set value663myStringTextField->setText(option->getValueString().c_str());664}665666667void668GNEPythonToolDialogElements::StringArgument::reset() {669myStringTextField->setText(myDefaultValue.c_str());670myOption->set(myDefaultValue, myDefaultValue, false);671myOption->resetDefault();672}673674675long676GNEPythonToolDialogElements::StringArgument::onCmdSetValue(FXObject*, FXSelector, void*) {677myOption->resetWritable();678if (myStringTextField->getText().empty()) {679reset();680} else {681myOption->set(myStringTextField->getText().text(), myStringTextField->getText().text(), false);682}683return 1;684}685686687const std::string688GNEPythonToolDialogElements::StringArgument::getValue() const {689return myStringTextField->getText().text();690}691692// ---------------------------------------------------------------------------693// GNEPythonToolDialogElements::IntArgument - methods694// ---------------------------------------------------------------------------695696GNEPythonToolDialogElements::IntArgument::IntArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,697GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :698Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {699// create text field for int700myIntTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFieldRestricted(TEXTFIELD_INTEGER));701// set value702myIntTextField->setText(option->getValueString().c_str());703}704705706void707GNEPythonToolDialogElements::IntArgument::reset() {708myIntTextField->setText(myDefaultValue.c_str());709if (myDefaultValue.empty()) {710myOption->set(INVALID_INT_STR, "", false);711} else {712myOption->set(myDefaultValue, myDefaultValue, false);713}714myOption->resetDefault();715}716717718long719GNEPythonToolDialogElements::IntArgument::onCmdSetValue(FXObject*, FXSelector, void*) {720myOption->resetWritable();721if (myIntTextField->getText().empty()) {722reset();723} else {724myOption->set(myIntTextField->getText().text(), myIntTextField->getText().text(), false);725}726return 1;727}728729730const std::string731GNEPythonToolDialogElements::IntArgument::getValue() const {732return myIntTextField->getText().text();733}734735// ---------------------------------------------------------------------------736// GNEPythonToolDialogElements::FloatArgument - methods737// ---------------------------------------------------------------------------738739GNEPythonToolDialogElements::FloatArgument::FloatArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,740GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :741Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {742// create text field for float743myFloatTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFieldRestricted(TEXTFIELD_REAL));744// set value745myFloatTextField->setText(option->getValueString().c_str());746}747748749void750GNEPythonToolDialogElements::FloatArgument::reset() {751myFloatTextField->setText(myDefaultValue.c_str());752if (myDefaultValue.empty()) {753myOption->set(INVALID_DOUBLE_STR, "", false);754} else {755myOption->set(myDefaultValue, myDefaultValue, false);756}757myOption->resetDefault();758}759760761long762GNEPythonToolDialogElements::FloatArgument::onCmdSetValue(FXObject*, FXSelector, void*) {763myOption->resetWritable();764if (myFloatTextField->getText().empty()) {765reset();766} else {767myOption->set(myFloatTextField->getText().text(), myFloatTextField->getText().text(), false);768}769return 1;770}771772773const std::string774GNEPythonToolDialogElements::FloatArgument::getValue() const {775return myFloatTextField->getText().text();776}777778// ---------------------------------------------------------------------------779// GNEPythonToolDialogElements::BoolArgument - methods780// ---------------------------------------------------------------------------781782GNEPythonToolDialogElements::BoolArgument::BoolArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,783GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :784Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {785// create check button786myCheckButton = new FXCheckButton(myElementsFrame, "", this, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);787// set value788if (option->getBool()) {789myCheckButton->setCheck(TRUE);790myCheckButton->setText(TL("true"));791} else {792myCheckButton->setCheck(FALSE);793myCheckButton->setText(TL("false"));794}795}796797798void799GNEPythonToolDialogElements::BoolArgument::reset() {800if (myDefaultValue == "True") {801myCheckButton->setCheck(TRUE);802myCheckButton->setText(TL("true"));803} else {804myCheckButton->setCheck(FALSE);805myCheckButton->setText(TL("false"));806}807myOption->set(myDefaultValue, myDefaultValue, false);808myOption->resetDefault();809}810811812long813GNEPythonToolDialogElements::BoolArgument::onCmdSetValue(FXObject*, FXSelector, void*) {814myOption->resetWritable();815if (myCheckButton->getCheck() == TRUE) {816myCheckButton->setText(TL("true"));817myOption->set("True", "True", false);818if (myDefaultValue == "True") {819myOption->resetDefault();820}821} else {822myCheckButton->setText(TL("false"));823myOption->set("False", "False", false);824if (myDefaultValue == "False") {825myOption->resetDefault();826}827}828return 1;829}830831832const std::string833GNEPythonToolDialogElements::BoolArgument::getValue() const {834if (myCheckButton->getCheck() == TRUE) {835return "True";836} else {837return "False";838}839}840841/****************************************************************************/842843844