Path: blob/main/src/netedit/frames/data/GNEGenericDataFrame.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 GNEGenericDataFrame.cpp14/// @author Pablo Alvarez Lopez15/// @date Jan 202016///17// The Widget for add genericData elements18/****************************************************************************/1920#include <netedit/elements/data/GNEDataHandler.h>21#include <netedit/elements/data/GNEDataInterval.h>22#include <netedit/elements/data/GNEEdgeData.h>23#include <netedit/elements/data/GNEEdgeRelData.h>24#include <netedit/elements/data/GNETAZRelData.h>25#include <netedit/frames/GNEAttributesEditor.h>26#include <netedit/frames/GNEPathCreator.h>27#include <netedit/GNEApplicationWindow.h>28#include <netedit/GNENet.h>29#include <netedit/GNETagPropertiesDatabase.h>30#include <netedit/GNEViewParent.h>31#include <utils/gui/div/GUIDesigns.h>3233#include "GNEGenericDataFrame.h"3435// ===========================================================================36// FOX callback mapping37// ===========================================================================3839FXDEFMAP(GNEGenericDataFrame::DataSetSelector) DataSetSelectorMap[] = {40FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEGenericDataFrame::DataSetSelector::onCmdCreateDataSet),41FXMAPFUNC(SEL_COMMAND, MID_GNE_DATASET_NEW, GNEGenericDataFrame::DataSetSelector::onCmdSetNewDataSetID),42FXMAPFUNC(SEL_COMMAND, MID_GNE_DATASET_SELECTED, GNEGenericDataFrame::DataSetSelector::onCmdSelectDataSet),43FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::DataSetSelector::onCmdSelectCheckButton)44};4546FXDEFMAP(GNEGenericDataFrame::IntervalSelector) IntervalSelectorMap[] = {47FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEGenericDataFrame::IntervalSelector::onCmdCreateInterval),48FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAINTERVAL_SELECTED, GNEGenericDataFrame::IntervalSelector::onCmdSelectInterval),49FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNEGenericDataFrame::IntervalSelector::onCmdSetIntervalAttribute),50FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::IntervalSelector::onCmdSelectCheckButton)51};5253FXDEFMAP(GNEGenericDataFrame::AttributeSelector) AttributeSelectorMap[] = {54FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::AttributeSelector::onCmdSelectAttribute)55};5657// Object implementation58FXIMPLEMENT(GNEGenericDataFrame::DataSetSelector, GNEGroupBoxModule, DataSetSelectorMap, ARRAYNUMBER(DataSetSelectorMap))59FXIMPLEMENT(GNEGenericDataFrame::IntervalSelector, GNEGroupBoxModule, IntervalSelectorMap, ARRAYNUMBER(IntervalSelectorMap))60FXIMPLEMENT(GNEGenericDataFrame::AttributeSelector, GNEGroupBoxModule, AttributeSelectorMap, ARRAYNUMBER(AttributeSelectorMap))6162// ===========================================================================63// method definitions64// ===========================================================================6566// ---------------------------------------------------------------------------67// GNEGenericDataFrame::DataSetSelector - methods68// ---------------------------------------------------------------------------6970GNEGenericDataFrame::DataSetSelector::DataSetSelector(GNEGenericDataFrame* genericDataFrameParent) :71GNEGroupBoxModule(genericDataFrameParent, TL("DataSet")),72myGenericDataFrameParent(genericDataFrameParent) {73// create check button for new data set74myNewDataSetCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Create new dataSet"), this, MID_GNE_SELECT, GUIDesignCheckButton);75// Create MFXComboBoxIcon76myDataSetsComboBox = new MFXComboBoxIcon(getCollapsableFrame(), genericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),77true, GUIDesignComboBoxVisibleItems, this, MID_GNE_DATASET_SELECTED, GUIDesignComboBox);78// create new id label79myHorizontalFrameNewID = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);80new FXLabel(myHorizontalFrameNewID, "new dataSet ID", nullptr, GUIDesignLabelThickedFixed(100));81// create new id textField82myNewDataSetIDTextField = new FXTextField(myHorizontalFrameNewID, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);83// hide horizontal frame84myHorizontalFrameNewID->hide();85// create dataSet button86myCreateDataSetButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create dataSet"), "", "", GUIIconSubSys::getIcon(GUIIcon::DATASET), this, MID_GNE_CREATE, GUIDesignButton);87myCreateDataSetButton->hide();88// refresh interval selector89refreshDataSetSelector(nullptr);90// DataSetSelector is always shown91show();92}939495GNEGenericDataFrame::DataSetSelector::~DataSetSelector() {}969798void99GNEGenericDataFrame::DataSetSelector::refreshDataSetSelector(const GNEDataSet* currentDataSet) {100// clear items101myDataSetsComboBox->clearItems();102// declare item index103int currentItemIndex = -1;104// fill myDataSetsComboBox with all DataSets105for (const auto& dataSet : myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDataSets()) {106// check if we have to set currentItemIndex107if ((currentItemIndex == -1) && (dataSet.second == currentDataSet)) {108currentItemIndex = myDataSetsComboBox->getNumItems();109}110myDataSetsComboBox->appendIconItem(dataSet.second->getID().c_str(), dataSet.second->getACIcon());111}112// check if we have to set current element113if (currentItemIndex != -1) {114myDataSetsComboBox->setCurrentItem(currentItemIndex, FALSE);115if (myGenericDataFrameParent->getIntervalSelector()) {116myGenericDataFrameParent->getIntervalSelector()->enableContents();117}118} else if (myGenericDataFrameParent->getIntervalSelector()) {119myGenericDataFrameParent->getIntervalSelector()->disableContents();120}121// recalc frame122recalc();123// refresh interval selector124if (myGenericDataFrameParent->myIntervalSelector) {125myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();126}127}128129130GNEDataSet*131GNEGenericDataFrame::DataSetSelector::getDataSet() const {132if ((myNewDataSetCheckButton->getCheck() == TRUE) || (myDataSetsComboBox->getNumItems() == 0)) {133return nullptr;134} else {135return myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDataSet(myDataSetsComboBox->getItemText(myDataSetsComboBox->getCurrentItem()), false);136}137}138139140long141GNEGenericDataFrame::DataSetSelector::onCmdCreateDataSet(FXObject*, FXSelector, void*) {142auto net = myGenericDataFrameParent->getViewNet()->getNet();143// first disable interval selector144myGenericDataFrameParent->getIntervalSelector()->disableContents();145// get string146const std::string dataSetID = myNewDataSetIDTextField->getText().text();147// check conditions148if (myNewDataSetIDTextField->getTextColor() == GUIDesignTextColorRed) {149WRITE_WARNING(TL("Invalid dataSet ID"));150} else if (dataSetID.empty()) {151WRITE_WARNING(TL("Invalid empty dataSet ID"));152} else if (net->getAttributeCarriers()->retrieveDataSet(dataSetID, false) != nullptr) {153WRITE_WARNING(TL("Invalid duplicated dataSet ID"));154} else {155// build data set156GNEDataHandler dataHandler(net, net->getACTemplates()->getTemplateAC(SUMO_TAG_DATASET)->getFileBucket(),157net->getGNEApplicationWindow()->isUndoRedoAllowed());158dataHandler.buildDataSet(dataSetID);159// refresh tag selector160refreshDataSetSelector(myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDataSet(dataSetID));161// change check button162myNewDataSetCheckButton->setCheck(FALSE, TRUE);163}164return 1;165}166167168long169GNEGenericDataFrame::DataSetSelector::onCmdSetNewDataSetID(FXObject*, FXSelector, void*) {170//171return 1;172}173174175long176GNEGenericDataFrame::DataSetSelector::onCmdSelectDataSet(FXObject*, FXSelector, void*) {177// update interval modul178myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();179return 1;180}181182183long184GNEGenericDataFrame::DataSetSelector::onCmdSelectCheckButton(FXObject*, FXSelector, void*) {185if (myNewDataSetCheckButton->getCheck() == TRUE) {186// enable textfield and label187myHorizontalFrameNewID->show();188myCreateDataSetButton->show();189// disable comboBox190myDataSetsComboBox->hide();191} else {192// disable textfield and label193myHorizontalFrameNewID->hide();194myCreateDataSetButton->hide();195// enable comboBox196myDataSetsComboBox->show();197}198// update interval modul199myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();200// set focus in text field ID201myNewDataSetIDTextField->setFocus();202return 1;203}204205// ---------------------------------------------------------------------------206// GNEGenericDataFrame::IntervalSelector - methods207// ---------------------------------------------------------------------------208209GNEGenericDataFrame::IntervalSelector::IntervalSelector(GNEGenericDataFrame* genericDataFrameParent) :210GNEGroupBoxModule(genericDataFrameParent, TL("Interval")),211myGenericDataFrameParent(genericDataFrameParent) {212// create check button for new interval213myNewIntervalCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Create new interval"), this, MID_GNE_SELECT, GUIDesignCheckButton);214// create begin label215myHorizontalFrameBegin = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);216new FXLabel(myHorizontalFrameBegin, toString(SUMO_ATTR_BEGIN).c_str(), nullptr, GUIDesignLabelThickedFixed(100));217// create begin TextField218myBeginTextField = new FXTextField(myHorizontalFrameBegin, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);219myBeginTextField->setText("0");220// hide horizontal frame begin221myHorizontalFrameBegin->hide();222// create end label223myHorizontalFrameEnd = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);224new FXLabel(myHorizontalFrameEnd, toString(SUMO_ATTR_END).c_str(), nullptr, GUIDesignLabelThickedFixed(100));225// create end textfield226myEndTextField = new FXTextField(myHorizontalFrameEnd, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);227myEndTextField->setText("3600");228// hide horizontal frame end229myHorizontalFrameEnd->hide();230// create interval button231myCreateIntervalButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("create interval"), "", "", GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL), this, MID_GNE_CREATE, GUIDesignButton);232myCreateIntervalButton->hide();233// Create tree list with fixed height234myIntervalsTreelist = new FXTreeList(getCollapsableFrame(), this, MID_GNE_DATAINTERVAL_SELECTED, GUIDesignTreeListFixedHeight);235myIntervalsTreelist->setHeight(200);236// refresh interval selector237refreshIntervalSelector();238// IntervalSelector is always shown239show();240}241242243GNEGenericDataFrame::IntervalSelector::~IntervalSelector() {}244245246void247GNEGenericDataFrame::IntervalSelector::enableContents() const {248myNewIntervalCheckButton->enable();249myHorizontalFrameBegin->enable();250myBeginTextField->enable();251myHorizontalFrameEnd->enable();252myEndTextField->enable();253myCreateIntervalButton->enable();254myIntervalsTreelist->enable();255}256257258void259GNEGenericDataFrame::IntervalSelector::disableContents() const {260myNewIntervalCheckButton->disable();261myHorizontalFrameBegin->disable();262myBeginTextField->disable();263myHorizontalFrameEnd->disable();264myEndTextField->disable();265myCreateIntervalButton->disable();266myIntervalsTreelist->disable();267}268269270void271GNEGenericDataFrame::IntervalSelector::refreshIntervalSelector() {272// first clear items from tree and intervalMap273myIntervalsTreelist->clearItems();274myTreeItemIntervalMap.clear();275// obtain data set276const GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();277// add intervals278if (dataSet) {279// insert dataSetItem in Tree list280FXTreeItem* dataSetItem = myIntervalsTreelist->insertItem(281nullptr, nullptr,282dataSet->getHierarchyName().c_str(),283GUIIconSubSys::getIcon(GUIIcon::DATASET),284GUIIconSubSys::getIcon(GUIIcon::DATASET));285// by default item is expanded286dataSetItem->setExpanded(true);287// iterate over intevals288for (const auto& interval : dataSet->getDataIntervalChildren()) {289addIntervalItem(interval.second, dataSetItem);290}291}292// refresh attribute selector293if (myGenericDataFrameParent->myAttributeSelector) {294myGenericDataFrameParent->myAttributeSelector->refreshAttributeSelector();295}296// recalc frame297recalc();298}299300301GNEDataInterval*302GNEGenericDataFrame::IntervalSelector::getDataInterval() const {303// first check if there is elements in interval tree304if (myIntervalsTreelist->getNumItems() > 0) {305for (const auto& treeItem : myTreeItemIntervalMap) {306if (treeItem.first->isSelected()) {307return treeItem.second;308}309}310}311// no GNEDataInterval found, then return nullptr312return nullptr;313}314315316long317GNEGenericDataFrame::IntervalSelector::onCmdCreateInterval(FXObject*, FXSelector, void*) {318// first check that begin and end are valid319if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text()) &&320GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {321// obtain begin and end322const double begin = GNEAttributeCarrier::parse<double>(myBeginTextField->getText().text());323const double end = GNEAttributeCarrier::parse<double>(myEndTextField->getText().text());324// get data set parent325GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();326if (dataSet && dataSet->checkNewInterval(begin, end)) {327// declare dataHandler328GNEDataHandler dataHandler(myGenericDataFrameParent->getViewNet()->getNet(), dataSet->getFileBucket(),329myGenericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());330// build data interval331dataHandler.buildDataInterval(nullptr, dataSet->getID(), begin, end);332}333// disable select interval check button334myNewIntervalCheckButton->setCheck(FALSE, TRUE);335}336return 1;337}338339340long341GNEGenericDataFrame::IntervalSelector::onCmdSelectInterval(FXObject*, FXSelector, void*) {342// refresh attribute selector343myGenericDataFrameParent->myAttributeSelector->refreshAttributeSelector();344return 1;345}346347348long349GNEGenericDataFrame::IntervalSelector::onCmdSetIntervalAttribute(FXObject* obj, FXSelector, void*) {350if (obj == myBeginTextField) {351// check if begin value can be parsed to double352if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text())) {353myBeginTextField->setTextColor(GUIDesignTextColorBlack);354myBeginTextField->killFocus();355} else {356myBeginTextField->setTextColor(GUIDesignTextColorRed);357}358} else if (obj == myEndTextField) {359// check if end value can be parsed to double360if (GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {361myEndTextField->setTextColor(GUIDesignTextColorBlack);362myEndTextField->killFocus();363} else {364myEndTextField->setTextColor(GUIDesignTextColorRed);365}366}367return 1;368}369370371long372GNEGenericDataFrame::IntervalSelector::onCmdSelectCheckButton(FXObject*, FXSelector, void*) {373if (myNewIntervalCheckButton->getCheck() == TRUE) {374// enable begin and end elements375myHorizontalFrameBegin->show();376myHorizontalFrameEnd->show();377myCreateIntervalButton->show();378// refresh begin and end text fields379const GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();380if (dataSet) {381if (dataSet->getDataIntervalChildren().empty()) {382// set default interval (1 hour)383myBeginTextField->setText("0");384myEndTextField->setText("3600");385} else {386// obtain last data interval387const GNEDataInterval* lastDataInterval = dataSet->getDataIntervalChildren().rbegin()->second;388const double intervalDuration = lastDataInterval->getAttributeDouble(SUMO_ATTR_END) - lastDataInterval->getAttributeDouble(SUMO_ATTR_BEGIN);389// set new begin end390myBeginTextField->setText(toString(lastDataInterval->getAttributeDouble(SUMO_ATTR_END)).c_str());391myEndTextField->setText(toString(lastDataInterval->getAttributeDouble(SUMO_ATTR_END) + intervalDuration).c_str());392}393}394} else {395// disable begin and end elements396myHorizontalFrameBegin->hide();397myHorizontalFrameEnd->hide();398myCreateIntervalButton->hide();399}400// refresh interval seletor401refreshIntervalSelector();402return 1;403}404405406FXTreeItem*407GNEGenericDataFrame::IntervalSelector::addIntervalItem(GNEDataInterval* dataInterval, FXTreeItem* itemParent) {408// insert item in Tree list409FXTreeItem* item = myIntervalsTreelist->insertItem(nullptr, itemParent,410dataInterval->getHierarchyName().c_str(),411GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL),412GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL));413// insert item in map414myTreeItemIntervalMap[item] = dataInterval;415// by default item is expanded416item->setExpanded(true);417// select first item418if (myTreeItemIntervalMap.size() == 1) {419item->setSelected(TRUE);420}421// return created FXTreeItem422return item;423}424425// ---------------------------------------------------------------------------426// GNEGenericDataFrame::AttributeSelector - methods427// ---------------------------------------------------------------------------428429GNEGenericDataFrame::AttributeSelector::AttributeSelector(GNEGenericDataFrame* genericDataFrameParent, SumoXMLTag tag) :430GNEGroupBoxModule(genericDataFrameParent, TL("Data attributes")),431myGenericDataFrameParent(genericDataFrameParent),432myMinMaxLabel(nullptr),433myGenericDataTag(tag) {434// Create MFXComboBoxIcon435myAttributesComboBox = new MFXComboBoxIcon(getCollapsableFrame(), genericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),436true, GUIDesignComboBoxVisibleItems, this, MID_GNE_SELECT, GUIDesignComboBox);437// build rainbow438myMinMaxLabel = buildRainbow(this);439// refresh interval selector440refreshAttributeSelector();441// AttributeSelector is always shown442show();443}444445446GNEGenericDataFrame::AttributeSelector::~AttributeSelector() {}447448449void450GNEGenericDataFrame::AttributeSelector::refreshAttributeSelector() {451// save current attribute452const auto currentAttribute = myAttributesComboBox->getText();453// clear items454myAttributesComboBox->clearItems();455// restore myMinMaxLabel456myMinMaxLabel->setText(TL("Scale: Min -> Max"));457// fill myAttributesComboBox depending of data sets458if (myGenericDataFrameParent->myDataSetSelector->getDataSet() == nullptr) {459myAttributesComboBox->appendIconItem("<no dataSet selected>");460myAttributesComboBox->disable();461} else {462// add all item463myAttributesComboBox->appendIconItem("<all>");464// add attributes depending of interval465if (myGenericDataFrameParent->myIntervalSelector->getDataInterval() == nullptr) {466const auto parameters = myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveGenericDataParameters(467myGenericDataFrameParent->myDataSetSelector->getDataSet()->getID(), toString(myGenericDataTag), "", "");468// add all parameters469for (const auto& attribute : parameters) {470myAttributesComboBox->appendIconItem(attribute.c_str());471}472} else {473// retrieve all parameters within begin and end474const auto parameters = myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveGenericDataParameters(475myGenericDataFrameParent->myDataSetSelector->getDataSet()->getID(), toString(myGenericDataTag),476myGenericDataFrameParent->myIntervalSelector->getDataInterval()->getAttribute(SUMO_ATTR_BEGIN),477myGenericDataFrameParent->myIntervalSelector->getDataInterval()->getAttribute(SUMO_ATTR_END));478// add all parameters479for (const auto& attribute : parameters) {480myAttributesComboBox->appendIconItem(attribute.c_str());481}482}483// enable combo Box484myAttributesComboBox->enable();485// set current item486for (int i = 0; i < myAttributesComboBox->getNumItems(); i++) {487if (myAttributesComboBox->getItemText(i) == currentAttribute.text()) {488myAttributesComboBox->setCurrentItem(i, TRUE);489}490}491}492// show parameters493if (myGenericDataFrameParent->myGenericDataAttributesEditor) {494myGenericDataFrameParent->myGenericDataAttributesEditor->showAttributesEditor(myGenericDataFrameParent->getViewNet()->getNet()->getACTemplates()->getTemplateAC(myGenericDataTag), true);495}496// update view net497myGenericDataFrameParent->getViewNet()->updateViewNet();498}499500501std::string502GNEGenericDataFrame::AttributeSelector::getFilteredAttribute() const {503if (myAttributesComboBox->getNumItems() == 0) {504return "";505} else if (myAttributesComboBox->getText() == TL("<all>")) {506return "";507} else {508return myAttributesComboBox->getText().text();509}510}511512513const RGBColor&514GNEGenericDataFrame::AttributeSelector::getScaledColor(const double min, const double max, const double value) const {515// update myMinMaxLabel516myMinMaxLabel->setText(("Min: " + toString(min) + " -> Max: " + toString(max)).c_str());517// return scaled color518return GNEViewNetHelper::getRainbowScaledColor(min, max, value);519}520521522SumoXMLTag523GNEGenericDataFrame::AttributeSelector::getGenericDataTag() const {524return myGenericDataTag;525}526527528long529GNEGenericDataFrame::AttributeSelector::onCmdSelectAttribute(FXObject*, FXSelector, void*) {530// empty attribute means <all>531if (myAttributesComboBox->getText().empty()) {532myAttributesComboBox->setCurrentItem(0);533}534if (myAttributesComboBox->getText() == TL("<all>")) {535myMinMaxLabel->setText(TL("Scale: Min -> Max"));536}537// update view538myGenericDataFrameParent->getViewNet()->updateViewNet();539return 1;540}541542// ---------------------------------------------------------------------------543// GNEGenericDataFrame - methods544// ---------------------------------------------------------------------------545546const GNEGenericDataFrame::DataSetSelector*547GNEGenericDataFrame::getDataSetSelector() const {548return myDataSetSelector;549}550551552const GNEGenericDataFrame::IntervalSelector*553GNEGenericDataFrame::getIntervalSelector() const {554return myIntervalSelector;555}556557558const GNEGenericDataFrame::AttributeSelector*559GNEGenericDataFrame::getAttributeSelector() const {560return myAttributeSelector;561}562563564GNEPathCreator*565GNEGenericDataFrame::getPathCreator() const {566return myPathCreator;567}568569570void571GNEGenericDataFrame::show() {572// first refresh data set selector573myDataSetSelector->refreshDataSetSelector(nullptr);574// check if there is an edge path creator575if (myPathCreator) {576myPathCreator->showPathCreatorModule(myViewNet->getNet()->getTagPropertiesDatabase()->getTagProperty(myAttributeSelector->getGenericDataTag(), true), false);577}578// show frame579GNEFrame::show();580}581582583void584GNEGenericDataFrame::hide() {585if (myPathCreator) {586// reset candidate edges587for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {588edge.second->resetCandidateFlags();589}590}591// hide frame592GNEFrame::hide();593}594595596void597GNEGenericDataFrame::updateFrameAfterUndoRedo() {598// refresh data set selector599myDataSetSelector->refreshDataSetSelector(nullptr);600// check if there is an edge path creator601if (myPathCreator) {602myPathCreator->showPathCreatorModule(myViewNet->getNet()->getTagPropertiesDatabase()->getTagProperty(myAttributeSelector->getGenericDataTag(), true), false);603}604}605606607GNEGenericDataFrame::GNEGenericDataFrame(GNEViewParent* viewParent, GNEViewNet* viewNet, SumoXMLTag tag, const bool pathCreator) :608GNEFrame(viewParent, viewNet, toString(tag)) {609// create DataSetSelector610myDataSetSelector = new DataSetSelector(this);611// create IntervalSelector module612myIntervalSelector = new IntervalSelector(this);613// create AttributeSelector module614myAttributeSelector = new AttributeSelector(this, tag);615// create parameter editor module616myGenericDataAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);617// create GNEPathCreator module618if (pathCreator) {619myPathCreator = new GNEPathCreator(this, viewNet->getNet()->getDataPathManager());620}621}622623624GNEGenericDataFrame::~GNEGenericDataFrame() {625}626627628void629GNEGenericDataFrame::intervalSelected() {630//631}632633634bool635GNEGenericDataFrame::createPath(const bool /*useLastRoute*/) {636// this function has to be reimplemented in all child frames that uses a GNEPathCreator637return false;638}639640/****************************************************************************/641642643