Path: blob/main/src/netedit/dialogs/tools/GNEPythonToolDialogElements.cpp
193674 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2026 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->getListSeparator() != "") {210openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;211}212// get file213const GNEFileDialog xmlFileDialog(myToolDialogParent->getApplicationWindow(), myToolDialogParent,214TL("XML file"),215SUMOXMLDefinitions::XMLFileExtensions.getStrings(), openMode,216GNEFileDialog::ConfigType::NETEDIT);217// check that file is valid218if (xmlFileDialog.getResult() == GNEDialog::Result::ACCEPT) {219myFilenameTextField->setText(xmlFileDialog.getFilename().c_str(), TRUE);220}221return 1;222}223224225long226GNEPythonToolDialogElements::FileNameArgument::onCmdSetValue(FXObject*, FXSelector, void*) {227myOption->resetWritable();228if (myFilenameTextField->getText().empty()) {229reset();230} else {231myOption->set(myFilenameTextField->getText().text(), myFilenameTextField->getText().text(), false);232}233return 1;234}235236237GNEPythonToolDialogElements::FileNameArgument::FileNameArgument() {}238239240GNEPythonToolDialogElements::FileNameArgument::FileNameArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,241GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option,242const std::string& useCurrent) :243Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {244// check if create current button245if (useCurrent.size() > 0) {246myCurrentButton = new MFXButtonTooltip(myElementsFrame, applicationWindow->getStaticTooltipMenu(), "",247GUIIconSubSys::getIcon(GUIIcon::CURRENT), this, MID_GNE_USE_CURRENT, GUIDesignButtonIcon);248myCurrentButton->setTipText(TLF("Use current % file", useCurrent).c_str());249}250// Create Open button251myOpenFilenameButton = new MFXButtonTooltip(myElementsFrame, applicationWindow->getStaticTooltipMenu(), "",252GUIIconSubSys::getIcon(GUIIcon::OPEN), this, MID_GNE_SELECT, GUIDesignButtonIcon);253myOpenFilenameButton->setTipText(TLF("Select % file", useCurrent).c_str());254// create text field for filename255myFilenameTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);256// set value257myFilenameTextField->setText(option->getValueString().c_str());258}259260const std::string261GNEPythonToolDialogElements::FileNameArgument::getValue() const {262return myFilenameTextField->getText().text();263}264265// ---------------------------------------------------------------------------266// GNEPythonToolDialogElements::EdgeVectorArgument - methods267// ---------------------------------------------------------------------------268269GNEPythonToolDialogElements::EdgeVectorArgument::EdgeVectorArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,270GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :271Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {272myCurrentEdgesButton = new MFXButtonTooltip(myElementsFrame, applicationWindow->getStaticTooltipMenu(), "",273GUIIconSubSys::getIcon(GUIIcon::EDGE), this, MID_GNE_USE_CURRENT, GUIDesignButtonIcon);274myCurrentEdgesButton->setTipText(TL("Use current selected edges"));275// create text field for string276myEdgeVectorTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);277// set value278myEdgeVectorTextField->setText(option->getValueString().c_str());279}280281282void283GNEPythonToolDialogElements::EdgeVectorArgument::reset() {284myEdgeVectorTextField->setText(myDefaultValue.c_str());285myOption->set(myDefaultValue, myDefaultValue, false);286myOption->resetDefault();287}288289290long291GNEPythonToolDialogElements::EdgeVectorArgument::onCmdSetValue(FXObject*, FXSelector, void*) {292myOption->resetWritable();293if (myEdgeVectorTextField->getText().empty()) {294reset();295} else {296myOption->set(myEdgeVectorTextField->getText().text(), myEdgeVectorTextField->getText().text(), false);297}298return 1;299}300301302long303GNEPythonToolDialogElements::EdgeVectorArgument::onCmdUseCurrent(FXObject*, FXSelector, void*) {304// obtain list of selected edges305const auto selectedEdges = myToolDialogParent->getApplicationWindow()->getViewNet()->getNet()->getAttributeCarriers()->getSelectedEdges();306// convert list to string307std::string selectedEdgesStr;308for (const auto& edge : selectedEdges) {309selectedEdgesStr.append(edge->getID());310if (edge != selectedEdges.back()) {311selectedEdgesStr.append(" ");312}313}314myEdgeVectorTextField->setText(selectedEdgesStr.c_str(), TRUE);315return 1;316}317318319long320GNEPythonToolDialogElements::EdgeVectorArgument::onUpdUseCurrent(FXObject* sender, FXSelector, void*) {321// get view net322const auto viewNet = myToolDialogParent->getApplicationWindow()->getViewNet();323if (viewNet == nullptr) {324return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);325} else if (viewNet->getNet()->getAttributeCarriers()->getNumberOfSelectedEdges() == 0) {326return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);327} else {328return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);329}330}331332333GNEPythonToolDialogElements::EdgeVectorArgument::EdgeVectorArgument() {}334335336const std::string337GNEPythonToolDialogElements::EdgeVectorArgument::getValue() const {338return myEdgeVectorTextField->getText().text();339}340341// ---------------------------------------------------------------------------342// GNEPythonToolDialogElements::NetworkArgument - methods343// ---------------------------------------------------------------------------344345GNEPythonToolDialogElements::NetworkArgument::NetworkArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,346GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :347FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("network")) {348}349350351long352GNEPythonToolDialogElements::NetworkArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {353// get open mode354GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;355if (myOption->getListSeparator() != "") {356openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;357}358// get network file359const GNEFileDialog networkFileDialog(myToolDialogParent->getApplicationWindow(), myToolDialogParent,360TL("network file"),361SUMOXMLDefinitions::NetFileExtensions.getStrings(), openMode,362GNEFileDialog::ConfigType::NETEDIT);363// check that file is valid364if (networkFileDialog.getResult() == GNEDialog::Result::ACCEPT) {365myFilenameTextField->setText(networkFileDialog.getFilename().c_str(), TRUE);366}367return 1;368}369370371long372GNEPythonToolDialogElements::NetworkArgument::onCmdUseCurrentNetworkFile(FXObject*, FXSelector, void*) {373myFilenameTextField->setText(OptionsCont::getOptions().getString("sumo-net-file").c_str(), TRUE);374return 1;375}376377378long379GNEPythonToolDialogElements::NetworkArgument::onUpdUseCurrentNetworkFile(FXObject* sender, FXSelector, void*) {380if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {381return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);382} else if (OptionsCont::getOptions().getString("sumo-net-file").empty()) {383return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);384} else {385return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);386}387}388389390GNEPythonToolDialogElements::NetworkArgument::NetworkArgument() {}391392// ---------------------------------------------------------------------------393// GNEPythonToolDialogElements::AdditionalArgument - methods394// ---------------------------------------------------------------------------395396GNEPythonToolDialogElements::AdditionalArgument::AdditionalArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,397GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :398FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("additional")) {399}400401402long403GNEPythonToolDialogElements::AdditionalArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {404// get open mode405GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;406if (myOption->getListSeparator() != "") {407openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;408}409// get additional file410const GNEFileDialog additionalFileDialog(myToolDialogParent->getApplicationWindow(), myToolDialogParent,411TL("Additional elements file"),412SUMOXMLDefinitions::AdditionalFileExtensions.getStrings(), openMode,413GNEFileDialog::ConfigType::NETEDIT);414// check that file is valid415if (additionalFileDialog.getResult() == GNEDialog::Result::ACCEPT) {416myFilenameTextField->setText(additionalFileDialog.getFilename().c_str(), TRUE);417}418return 1;419}420421422long423GNEPythonToolDialogElements::AdditionalArgument::onCmdUseCurrentAdditionalFile(FXObject*, FXSelector, void*) {424myFilenameTextField->setText(OptionsCont::getOptions().getString("additional-files").c_str(), TRUE);425return 1;426}427428429long430GNEPythonToolDialogElements::AdditionalArgument::onUpdUseCurrentAdditionalFile(FXObject* sender, FXSelector, void*) {431if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {432return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);433} else if (OptionsCont::getOptions().getString("additional-files").empty()) {434return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);435} else {436return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);437}438}439440441GNEPythonToolDialogElements::AdditionalArgument::AdditionalArgument() {}442443// ---------------------------------------------------------------------------444// GNEPythonToolDialogElements::RouteArgument - methods445// ---------------------------------------------------------------------------446447GNEPythonToolDialogElements::RouteArgument::RouteArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,448GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :449FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("route")) {450}451452453long454GNEPythonToolDialogElements::RouteArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {455// get open mode456GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;457if (myOption->getListSeparator() != "") {458openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;459}460// get route file461const GNEFileDialog routeFileDialog(myToolDialogParent->getApplicationWindow(), myToolDialogParent,462TL("Route elements file"),463SUMOXMLDefinitions::RouteFileExtensions.getStrings(), openMode,464GNEFileDialog::ConfigType::NETEDIT);465// check that file is valid466if (routeFileDialog.getResult() == GNEDialog::Result::ACCEPT) {467myFilenameTextField->setText(routeFileDialog.getFilename().c_str(), TRUE);468}469return 1;470}471472473long474GNEPythonToolDialogElements::RouteArgument::onCmdUseCurrentRouteFile(FXObject*, FXSelector, void*) {475myFilenameTextField->setText(OptionsCont::getOptions().getString("route-files").c_str(), TRUE);476return 1;477}478479480long481GNEPythonToolDialogElements::RouteArgument::onUpdUseCurrentRouteFile(FXObject* sender, FXSelector, void*) {482if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {483return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);484} else if (OptionsCont::getOptions().getString("route-files").empty()) {485return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);486} else {487return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);488}489}490491492GNEPythonToolDialogElements::RouteArgument::RouteArgument() {}493494// ---------------------------------------------------------------------------495// GNEPythonToolDialogElements::DataArgument - methods496// ---------------------------------------------------------------------------497498GNEPythonToolDialogElements::DataArgument::DataArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,499GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :500FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("data")) {501}502503504long505GNEPythonToolDialogElements::DataArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {506// get open mode507GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;508if (myOption->getListSeparator() != "") {509openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;510}511// get data file512const GNEFileDialog dataFileDialog(myToolDialogParent->getApplicationWindow(), myToolDialogParent,513TL("Data elements file"),514SUMOXMLDefinitions::EdgeDataFileExtensions.getStrings(), openMode,515GNEFileDialog::ConfigType::NETEDIT);516// check that file is valid517if (dataFileDialog.getResult() == GNEDialog::Result::ACCEPT) {518myFilenameTextField->setText(dataFileDialog.getFilename().c_str(), TRUE);519}520return 1;521}522523524long525GNEPythonToolDialogElements::DataArgument::onCmdUseCurrentDataFile(FXObject*, FXSelector, void*) {526myFilenameTextField->setText(OptionsCont::getOptions().getString("data-files").c_str(), TRUE);527return 1;528}529530531long532GNEPythonToolDialogElements::DataArgument::onUpdUseCurrentDataFile(FXObject* sender, FXSelector, void*) {533if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {534return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);535} else if (OptionsCont::getOptions().getString("data-files").empty()) {536return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);537} else {538return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);539}540}541542543GNEPythonToolDialogElements::DataArgument::DataArgument() {}544545// ---------------------------------------------------------------------------546// GNEPythonToolDialogElements::SumoConfigArgument - methods547// ---------------------------------------------------------------------------548549GNEPythonToolDialogElements::SumoConfigArgument::SumoConfigArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,550GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :551FileNameArgument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option, TL("sumo config")) {552}553554555long556GNEPythonToolDialogElements::SumoConfigArgument::onCmdOpenFilename(FXObject*, FXSelector, void*) {557// get open mode558GNEFileDialog::OpenMode openMode = GNEFileDialog::OpenMode::SAVE;559if (myOption->getListSeparator() != "") {560openMode = GNEFileDialog::OpenMode::LOAD_MULTIPLE;561}562// get sumoConfig file563const GNEFileDialog sumoConfigFileDialog(myToolDialogParent->getApplicationWindow(), myToolDialogParent,564TL("sumo config file"),565SUMOXMLDefinitions::SumoConfigFileExtensions.getStrings(), openMode,566GNEFileDialog::ConfigType::NETEDIT);567// check that file is valid568if (sumoConfigFileDialog.getResult() == GNEDialog::Result::ACCEPT) {569myFilenameTextField->setText(sumoConfigFileDialog.getFilename().c_str(), TRUE);570}571return 1;572}573574575long576GNEPythonToolDialogElements::SumoConfigArgument::onCmdUseCurrentSumoConfigFile(FXObject*, FXSelector, void*) {577myFilenameTextField->setText(OptionsCont::getOptions().getString("sumocfg-file").c_str(), TRUE);578return 1;579}580581582long583GNEPythonToolDialogElements::SumoConfigArgument::onUpdUseCurrentSumoConfigFile(FXObject* sender, FXSelector, void*) {584if (myToolDialogParent->getApplicationWindow()->getViewNet() == nullptr) {585return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);586} else if (OptionsCont::getOptions().getString("sumocfg-file").empty()) {587return sender->handle(this, FXSEL(SEL_COMMAND, ID_DISABLE), nullptr);588} else {589return sender->handle(this, FXSEL(SEL_COMMAND, ID_ENABLE), nullptr);590}591}592593594GNEPythonToolDialogElements::SumoConfigArgument::SumoConfigArgument() {}595596// ---------------------------------------------------------------------------597// GNEPythonToolDialogElements::EdgeArgument - methods598// ---------------------------------------------------------------------------599600GNEPythonToolDialogElements::EdgeArgument::EdgeArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,601GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :602Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {603// create text field for int604myEdgeTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);605// set value606myEdgeTextField->setText(option->getValueString().c_str());607}608609610void611GNEPythonToolDialogElements::EdgeArgument::reset() {612myEdgeTextField->setText(myDefaultValue.c_str());613myOption->set(myDefaultValue, myDefaultValue, false);614myOption->resetDefault();615}616617618long619GNEPythonToolDialogElements::EdgeArgument::onCmdSetValue(FXObject*, FXSelector, void*) {620myOption->resetWritable();621if (myEdgeTextField->getText().empty()) {622reset();623} else {624myOption->set(myEdgeTextField->getText().text(), myEdgeTextField->getText().text(), false);625}626return 1;627}628629630const std::string631GNEPythonToolDialogElements::EdgeArgument::getValue() const {632return myEdgeTextField->getText().text();633}634635// ---------------------------------------------------------------------------636// GNEPythonToolDialogElements::StringArgument - methods637// ---------------------------------------------------------------------------638639GNEPythonToolDialogElements::StringArgument::StringArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,640GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :641Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {642// create text field for string643myStringTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);644// set value645myStringTextField->setText(option->getValueString().c_str());646}647648649void650GNEPythonToolDialogElements::StringArgument::reset() {651myStringTextField->setText(myDefaultValue.c_str());652myOption->set(myDefaultValue, myDefaultValue, false);653myOption->resetDefault();654}655656657long658GNEPythonToolDialogElements::StringArgument::onCmdSetValue(FXObject*, FXSelector, void*) {659myOption->resetWritable();660if (myStringTextField->getText().empty()) {661reset();662} else {663myOption->set(myStringTextField->getText().text(), myStringTextField->getText().text(), false);664}665return 1;666}667668669const std::string670GNEPythonToolDialogElements::StringArgument::getValue() const {671return myStringTextField->getText().text();672}673674// ---------------------------------------------------------------------------675// GNEPythonToolDialogElements::IntArgument - methods676// ---------------------------------------------------------------------------677678GNEPythonToolDialogElements::IntArgument::IntArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,679GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :680Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {681// create text field for int682myIntTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFieldRestricted(TEXTFIELD_INTEGER));683// set value684myIntTextField->setText(option->getValueString().c_str());685}686687688void689GNEPythonToolDialogElements::IntArgument::reset() {690myIntTextField->setText(myDefaultValue.c_str());691if (myDefaultValue.empty()) {692myOption->set(INVALID_INT_STR, "", false);693} else {694myOption->set(myDefaultValue, myDefaultValue, false);695}696myOption->resetDefault();697}698699700long701GNEPythonToolDialogElements::IntArgument::onCmdSetValue(FXObject*, FXSelector, void*) {702myOption->resetWritable();703if (myIntTextField->getText().empty()) {704reset();705} else {706myOption->set(myIntTextField->getText().text(), myIntTextField->getText().text(), false);707}708return 1;709}710711712const std::string713GNEPythonToolDialogElements::IntArgument::getValue() const {714return myIntTextField->getText().text();715}716717// ---------------------------------------------------------------------------718// GNEPythonToolDialogElements::FloatArgument - methods719// ---------------------------------------------------------------------------720721GNEPythonToolDialogElements::FloatArgument::FloatArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,722GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :723Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {724// create text field for float725myFloatTextField = new FXTextField(myElementsFrame, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextFieldRestricted(TEXTFIELD_REAL));726// set value727myFloatTextField->setText(option->getValueString().c_str());728}729730731void732GNEPythonToolDialogElements::FloatArgument::reset() {733myFloatTextField->setText(myDefaultValue.c_str());734if (myDefaultValue.empty()) {735myOption->set(INVALID_DOUBLE_STR, "", false);736} else {737myOption->set(myDefaultValue, myDefaultValue, false);738}739myOption->resetDefault();740}741742743long744GNEPythonToolDialogElements::FloatArgument::onCmdSetValue(FXObject*, FXSelector, void*) {745myOption->resetWritable();746if (myFloatTextField->getText().empty()) {747reset();748} else {749myOption->set(myFloatTextField->getText().text(), myFloatTextField->getText().text(), false);750}751return 1;752}753754755const std::string756GNEPythonToolDialogElements::FloatArgument::getValue() const {757return myFloatTextField->getText().text();758}759760// ---------------------------------------------------------------------------761// GNEPythonToolDialogElements::BoolArgument - methods762// ---------------------------------------------------------------------------763764GNEPythonToolDialogElements::BoolArgument::BoolArgument(GNEPythonToolDialog* toolDialogParent, const GNEPythonTool* pythonTool,765GNEApplicationWindow* applicationWindow, FXVerticalFrame* argumentFrame, const std::string name, Option* option) :766Argument(toolDialogParent, pythonTool, applicationWindow, argumentFrame, name, option) {767// create check button768myCheckButton = new FXCheckButton(myElementsFrame, "", this, MID_GNE_SET_ATTRIBUTE, GUIDesignCheckButton);769// set value770if (option->getBool()) {771myCheckButton->setCheck(TRUE);772myCheckButton->setText(TL("true"));773} else {774myCheckButton->setCheck(FALSE);775myCheckButton->setText(TL("false"));776}777}778779780void781GNEPythonToolDialogElements::BoolArgument::reset() {782if (myDefaultValue == "True") {783myCheckButton->setCheck(TRUE);784myCheckButton->setText(TL("true"));785} else {786myCheckButton->setCheck(FALSE);787myCheckButton->setText(TL("false"));788}789myOption->set(myDefaultValue, myDefaultValue, false);790myOption->resetDefault();791}792793794long795GNEPythonToolDialogElements::BoolArgument::onCmdSetValue(FXObject*, FXSelector, void*) {796myOption->resetWritable();797if (myCheckButton->getCheck() == TRUE) {798myCheckButton->setText(TL("true"));799myOption->set("True", "True", false);800if (myDefaultValue == "True") {801myOption->resetDefault();802}803} else {804myCheckButton->setText(TL("false"));805myOption->set("False", "False", false);806if (myDefaultValue == "False") {807myOption->resetDefault();808}809}810return 1;811}812813814const std::string815GNEPythonToolDialogElements::BoolArgument::getValue() const {816if (myCheckButton->getCheck() == TRUE) {817return "True";818} else {819return "False";820}821}822823/****************************************************************************/824825826