Path: blob/main/src/netedit/frames/data/GNEGenericDataFrame.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 GNEGenericDataFrame.cpp14/// @author Pablo Alvarez Lopez15/// @date Jan 202016///17// The Widget for add genericData elements18/****************************************************************************/1920#include <netedit/GNEApplicationWindow.h>21#include <netedit/GNENet.h>22#include <netedit/GNEViewParent.h>23#include <netedit/elements/data/GNEDataHandler.h>24#include <netedit/elements/data/GNEDataInterval.h>25#include <netedit/elements/data/GNEEdgeData.h>26#include <netedit/elements/data/GNEEdgeRelData.h>27#include <netedit/elements/data/GNETAZRelData.h>28#include <netedit/frames/GNEAttributesEditor.h>29#include <netedit/frames/GNEPathCreator.h>30#include <utils/gui/div/GUIDesigns.h>3132#include "GNEGenericDataFrame.h"3334// ===========================================================================35// FOX callback mapping36// ===========================================================================3738FXDEFMAP(GNEGenericDataFrame::DataSetSelector) DataSetSelectorMap[] = {39FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEGenericDataFrame::DataSetSelector::onCmdCreateDataSet),40FXMAPFUNC(SEL_COMMAND, MID_GNE_DATASET_NEW, GNEGenericDataFrame::DataSetSelector::onCmdSetNewDataSetID),41FXMAPFUNC(SEL_COMMAND, MID_GNE_DATASET_SELECTED, GNEGenericDataFrame::DataSetSelector::onCmdSelectDataSet),42FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::DataSetSelector::onCmdSelectCheckButton)43};4445FXDEFMAP(GNEGenericDataFrame::IntervalSelector) IntervalSelectorMap[] = {46FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNEGenericDataFrame::IntervalSelector::onCmdCreateInterval),47FXMAPFUNC(SEL_COMMAND, MID_GNE_DATAINTERVAL_SELECTED, GNEGenericDataFrame::IntervalSelector::onCmdSelectInterval),48FXMAPFUNC(SEL_COMMAND, MID_GNE_SET_ATTRIBUTE, GNEGenericDataFrame::IntervalSelector::onCmdSetIntervalAttribute),49FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::IntervalSelector::onCmdSelectCheckButton)50};5152FXDEFMAP(GNEGenericDataFrame::AttributeSelector) AttributeSelectorMap[] = {53FXMAPFUNC(SEL_COMMAND, MID_GNE_SELECT, GNEGenericDataFrame::AttributeSelector::onCmdSelectAttribute)54};5556// Object implementation57FXIMPLEMENT(GNEGenericDataFrame::DataSetSelector, MFXGroupBoxModule, DataSetSelectorMap, ARRAYNUMBER(DataSetSelectorMap))58FXIMPLEMENT(GNEGenericDataFrame::IntervalSelector, MFXGroupBoxModule, IntervalSelectorMap, ARRAYNUMBER(IntervalSelectorMap))59FXIMPLEMENT(GNEGenericDataFrame::AttributeSelector, MFXGroupBoxModule, AttributeSelectorMap, ARRAYNUMBER(AttributeSelectorMap))6061// ===========================================================================62// method definitions63// ===========================================================================6465// ---------------------------------------------------------------------------66// GNEGenericDataFrame::DataSetSelector - methods67// ---------------------------------------------------------------------------6869GNEGenericDataFrame::DataSetSelector::DataSetSelector(GNEGenericDataFrame* genericDataFrameParent) :70MFXGroupBoxModule(genericDataFrameParent, TL("DataSet")),71myGenericDataFrameParent(genericDataFrameParent) {72// create check button for new data set73myNewDataSetCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Create new dataSet"), this, MID_GNE_SELECT, GUIDesignCheckButton);74// Create MFXComboBoxIcon75myDataSetsComboBox = new MFXComboBoxIcon(getCollapsableFrame(), genericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),76true, GUIDesignComboBoxVisibleItems, this, MID_GNE_DATASET_SELECTED, GUIDesignComboBox);77// create new id label78myHorizontalFrameNewID = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);79new FXLabel(myHorizontalFrameNewID, "new dataSet ID", nullptr, GUIDesignLabelThickedFixed(100));80// create new id textField81myNewDataSetIDTextField = new FXTextField(myHorizontalFrameNewID, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);82// hide horizontal frame83myHorizontalFrameNewID->hide();84// create dataSet button85myCreateDataSetButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create dataSet"), "", "", GUIIconSubSys::getIcon(GUIIcon::DATASET), this, MID_GNE_CREATE, GUIDesignButton);86myCreateDataSetButton->hide();87// refresh interval selector88refreshDataSetSelector(nullptr);89// DataSetSelector is always shown90show();91}929394GNEGenericDataFrame::DataSetSelector::~DataSetSelector() {}959697void98GNEGenericDataFrame::DataSetSelector::refreshDataSetSelector(const GNEDataSet* currentDataSet) {99// clear items100myDataSetsComboBox->clearItems();101// declare item index102int currentItemIndex = -1;103// fill myDataSetsComboBox with all DataSets104for (const auto& dataSet : myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->getDataSets()) {105// check if we have to set currentItemIndex106if ((currentItemIndex == -1) && (dataSet.second == currentDataSet)) {107currentItemIndex = myDataSetsComboBox->getNumItems();108}109myDataSetsComboBox->appendIconItem(dataSet.second->getID().c_str(), dataSet.second->getACIcon());110}111// check if we have to set current element112if (currentItemIndex != -1) {113myDataSetsComboBox->setCurrentItem(currentItemIndex, FALSE);114if (myGenericDataFrameParent->getIntervalSelector()) {115myGenericDataFrameParent->getIntervalSelector()->enableContents();116}117} else if (myGenericDataFrameParent->getIntervalSelector()) {118myGenericDataFrameParent->getIntervalSelector()->disableContents();119}120// recalc frame121recalc();122// refresh interval selector123if (myGenericDataFrameParent->myIntervalSelector) {124myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();125}126}127128129GNEDataSet*130GNEGenericDataFrame::DataSetSelector::getDataSet() const {131if ((myNewDataSetCheckButton->getCheck() == TRUE) || (myDataSetsComboBox->getNumItems() == 0)) {132return nullptr;133} else {134return myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDataSet(myDataSetsComboBox->getItemText(myDataSetsComboBox->getCurrentItem()), false);135}136}137138139long140GNEGenericDataFrame::DataSetSelector::onCmdCreateDataSet(FXObject*, FXSelector, void*) {141// first disable interval selector142myGenericDataFrameParent->getIntervalSelector()->disableContents();143// get string144const std::string dataSetID = myNewDataSetIDTextField->getText().text();145// check conditions146if (myNewDataSetIDTextField->getTextColor() == GUIDesignTextColorRed) {147WRITE_WARNING(TL("Invalid dataSet ID"));148} else if (dataSetID.empty()) {149WRITE_WARNING(TL("Invalid empty dataSet ID"));150} else if (myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDataSet(dataSetID, false) != nullptr) {151WRITE_WARNING(TL("Invalid duplicated dataSet ID"));152} else {153// build data set154GNEDataHandler dataHandler(myGenericDataFrameParent->getViewNet()->getNet(), "",155myGenericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());156dataHandler.buildDataSet(dataSetID);157// refresh tag selector158refreshDataSetSelector(myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveDataSet(dataSetID));159// change check button160myNewDataSetCheckButton->setCheck(FALSE, TRUE);161}162return 1;163}164165166long167GNEGenericDataFrame::DataSetSelector::onCmdSetNewDataSetID(FXObject*, FXSelector, void*) {168//169return 1;170}171172173long174GNEGenericDataFrame::DataSetSelector::onCmdSelectDataSet(FXObject*, FXSelector, void*) {175// update interval modul176myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();177return 1;178}179180181long182GNEGenericDataFrame::DataSetSelector::onCmdSelectCheckButton(FXObject*, FXSelector, void*) {183if (myNewDataSetCheckButton->getCheck() == TRUE) {184// enable textfield and label185myHorizontalFrameNewID->show();186myCreateDataSetButton->show();187// disable comboBox188myDataSetsComboBox->hide();189} else {190// disable textfield and label191myHorizontalFrameNewID->hide();192myCreateDataSetButton->hide();193// enable comboBox194myDataSetsComboBox->show();195}196// update interval modul197myGenericDataFrameParent->myIntervalSelector->refreshIntervalSelector();198// set focus in text field ID199myNewDataSetIDTextField->setFocus();200return 1;201}202203// ---------------------------------------------------------------------------204// GNEGenericDataFrame::IntervalSelector - methods205// ---------------------------------------------------------------------------206207GNEGenericDataFrame::IntervalSelector::IntervalSelector(GNEGenericDataFrame* genericDataFrameParent) :208MFXGroupBoxModule(genericDataFrameParent, TL("Interval")),209myGenericDataFrameParent(genericDataFrameParent) {210// create check button for new interval211myNewIntervalCheckButton = new FXCheckButton(getCollapsableFrame(), TL("Create new interval"), this, MID_GNE_SELECT, GUIDesignCheckButton);212// create begin label213myHorizontalFrameBegin = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);214new FXLabel(myHorizontalFrameBegin, toString(SUMO_ATTR_BEGIN).c_str(), nullptr, GUIDesignLabelThickedFixed(100));215// create begin TextField216myBeginTextField = new FXTextField(myHorizontalFrameBegin, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);217myBeginTextField->setText("0");218// hide horizontal frame begin219myHorizontalFrameBegin->hide();220// create end label221myHorizontalFrameEnd = new FXHorizontalFrame(getCollapsableFrame(), GUIDesignAuxiliarHorizontalFrame);222new FXLabel(myHorizontalFrameEnd, toString(SUMO_ATTR_END).c_str(), nullptr, GUIDesignLabelThickedFixed(100));223// create end textfield224myEndTextField = new FXTextField(myHorizontalFrameEnd, GUIDesignTextFieldNCol, this, MID_GNE_SET_ATTRIBUTE, GUIDesignTextField);225myEndTextField->setText("3600");226// hide horizontal frame end227myHorizontalFrameEnd->hide();228// create interval button229myCreateIntervalButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("create interval"), "", "", GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL), this, MID_GNE_CREATE, GUIDesignButton);230myCreateIntervalButton->hide();231// Create tree list with fixed height232myIntervalsTreelist = new FXTreeList(getCollapsableFrame(), this, MID_GNE_DATAINTERVAL_SELECTED, GUIDesignTreeListFixedHeight);233myIntervalsTreelist->setHeight(200);234// refresh interval selector235refreshIntervalSelector();236// IntervalSelector is always shown237show();238}239240241GNEGenericDataFrame::IntervalSelector::~IntervalSelector() {}242243244void245GNEGenericDataFrame::IntervalSelector::enableContents() const {246myNewIntervalCheckButton->enable();247myHorizontalFrameBegin->enable();248myBeginTextField->enable();249myHorizontalFrameEnd->enable();250myEndTextField->enable();251myCreateIntervalButton->enable();252myIntervalsTreelist->enable();253}254255256void257GNEGenericDataFrame::IntervalSelector::disableContents() const {258myNewIntervalCheckButton->disable();259myHorizontalFrameBegin->disable();260myBeginTextField->disable();261myHorizontalFrameEnd->disable();262myEndTextField->disable();263myCreateIntervalButton->disable();264myIntervalsTreelist->disable();265}266267268void269GNEGenericDataFrame::IntervalSelector::refreshIntervalSelector() {270// first clear items from tree and intervalMap271myIntervalsTreelist->clearItems();272myTreeItemIntervalMap.clear();273// obtain data set274const GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();275// add intervals276if (dataSet) {277// insert dataSetItem in Tree list278FXTreeItem* dataSetItem = myIntervalsTreelist->insertItem(279nullptr, nullptr,280dataSet->getHierarchyName().c_str(),281GUIIconSubSys::getIcon(GUIIcon::DATASET),282GUIIconSubSys::getIcon(GUIIcon::DATASET));283// by default item is expanded284dataSetItem->setExpanded(true);285// iterate over intevals286for (const auto& interval : dataSet->getDataIntervalChildren()) {287addIntervalItem(interval.second, dataSetItem);288}289}290// refresh attribute selector291if (myGenericDataFrameParent->myAttributeSelector) {292myGenericDataFrameParent->myAttributeSelector->refreshAttributeSelector();293}294// recalc frame295recalc();296}297298299GNEDataInterval*300GNEGenericDataFrame::IntervalSelector::getDataInterval() const {301// first check if there is elements in interval tree302if (myIntervalsTreelist->getNumItems() > 0) {303for (const auto& treeItem : myTreeItemIntervalMap) {304if (treeItem.first->isSelected()) {305return treeItem.second;306}307}308}309// no GNEDataInterval found, then return nullptr310return nullptr;311}312313314long315GNEGenericDataFrame::IntervalSelector::onCmdCreateInterval(FXObject*, FXSelector, void*) {316// first check that begin and end are valid317if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text()) &&318GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {319// obtain begin and end320const double begin = GNEAttributeCarrier::parse<double>(myBeginTextField->getText().text());321const double end = GNEAttributeCarrier::parse<double>(myEndTextField->getText().text());322// get data set parent323GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();324if (dataSet && dataSet->checkNewInterval(begin, end)) {325// declare dataHandler326GNEDataHandler dataHandler(myGenericDataFrameParent->getViewNet()->getNet(), "",327myGenericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());328// build data interval329dataHandler.buildDataInterval(nullptr, dataSet->getID(), begin, end);330}331// disable select interval check button332myNewIntervalCheckButton->setCheck(FALSE, TRUE);333}334return 1;335}336337338long339GNEGenericDataFrame::IntervalSelector::onCmdSelectInterval(FXObject*, FXSelector, void*) {340// refresh attribute selector341myGenericDataFrameParent->myAttributeSelector->refreshAttributeSelector();342return 1;343}344345346long347GNEGenericDataFrame::IntervalSelector::onCmdSetIntervalAttribute(FXObject* obj, FXSelector, void*) {348if (obj == myBeginTextField) {349// check if begin value can be parsed to double350if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text())) {351myBeginTextField->setTextColor(GUIDesignTextColorBlack);352myBeginTextField->killFocus();353} else {354myBeginTextField->setTextColor(GUIDesignTextColorRed);355}356} else if (obj == myEndTextField) {357// check if end value can be parsed to double358if (GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {359myEndTextField->setTextColor(GUIDesignTextColorBlack);360myEndTextField->killFocus();361} else {362myEndTextField->setTextColor(GUIDesignTextColorRed);363}364}365return 1;366}367368369long370GNEGenericDataFrame::IntervalSelector::onCmdSelectCheckButton(FXObject*, FXSelector, void*) {371if (myNewIntervalCheckButton->getCheck() == TRUE) {372// enable begin and end elements373myHorizontalFrameBegin->show();374myHorizontalFrameEnd->show();375myCreateIntervalButton->show();376// refresh begin and end text fields377const GNEDataSet* dataSet = myGenericDataFrameParent->myDataSetSelector->getDataSet();378if (dataSet) {379if (dataSet->getDataIntervalChildren().empty()) {380// set default interval (1 hour)381myBeginTextField->setText("0");382myEndTextField->setText("3600");383} else {384// obtain last data interval385const GNEDataInterval* lastDataInterval = dataSet->getDataIntervalChildren().rbegin()->second;386const double intervalDuration = lastDataInterval->getAttributeDouble(SUMO_ATTR_END) - lastDataInterval->getAttributeDouble(SUMO_ATTR_BEGIN);387// set new begin end388myBeginTextField->setText(toString(lastDataInterval->getAttributeDouble(SUMO_ATTR_END)).c_str());389myEndTextField->setText(toString(lastDataInterval->getAttributeDouble(SUMO_ATTR_END) + intervalDuration).c_str());390}391}392} else {393// disable begin and end elements394myHorizontalFrameBegin->hide();395myHorizontalFrameEnd->hide();396myCreateIntervalButton->hide();397}398// refresh interval seletor399refreshIntervalSelector();400return 1;401}402403404FXTreeItem*405GNEGenericDataFrame::IntervalSelector::addIntervalItem(GNEDataInterval* dataInterval, FXTreeItem* itemParent) {406// insert item in Tree list407FXTreeItem* item = myIntervalsTreelist->insertItem(nullptr, itemParent,408dataInterval->getHierarchyName().c_str(),409GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL),410GUIIconSubSys::getIcon(GUIIcon::DATAINTERVAL));411// insert item in map412myTreeItemIntervalMap[item] = dataInterval;413// by default item is expanded414item->setExpanded(true);415// select first item416if (myTreeItemIntervalMap.size() == 1) {417item->setSelected(TRUE);418}419// return created FXTreeItem420return item;421}422423// ---------------------------------------------------------------------------424// GNEGenericDataFrame::AttributeSelector - methods425// ---------------------------------------------------------------------------426427GNEGenericDataFrame::AttributeSelector::AttributeSelector(GNEGenericDataFrame* genericDataFrameParent, SumoXMLTag tag) :428MFXGroupBoxModule(genericDataFrameParent, TL("Data attributes")),429myGenericDataFrameParent(genericDataFrameParent),430myMinMaxLabel(nullptr),431myGenericDataTag(tag) {432// Create MFXComboBoxIcon433myAttributesComboBox = new MFXComboBoxIcon(getCollapsableFrame(), genericDataFrameParent->getViewNet()->getViewParent()->getGNEAppWindows()->getStaticTooltipMenu(),434true, GUIDesignComboBoxVisibleItems, this, MID_GNE_SELECT, GUIDesignComboBox);435// build rainbow436myMinMaxLabel = buildRainbow(this);437// refresh interval selector438refreshAttributeSelector();439// AttributeSelector is always shown440show();441}442443444GNEGenericDataFrame::AttributeSelector::~AttributeSelector() {}445446447void448GNEGenericDataFrame::AttributeSelector::refreshAttributeSelector() {449// save current attribute450const auto currentAttribute = myAttributesComboBox->getText();451// clear items452myAttributesComboBox->clearItems();453// restore myMinMaxLabel454myMinMaxLabel->setText(TL("Scale: Min -> Max"));455// fill myAttributesComboBox depending of data sets456if (myGenericDataFrameParent->myDataSetSelector->getDataSet() == nullptr) {457myAttributesComboBox->appendIconItem("<no dataSet selected>");458myAttributesComboBox->disable();459} else {460// add all item461myAttributesComboBox->appendIconItem("<all>");462// add attributes depending of interval463if (myGenericDataFrameParent->myIntervalSelector->getDataInterval() == nullptr) {464const auto parameters = myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveGenericDataParameters(465myGenericDataFrameParent->myDataSetSelector->getDataSet()->getID(), toString(myGenericDataTag), "", "");466// add all parameters467for (const auto& attribute : parameters) {468myAttributesComboBox->appendIconItem(attribute.c_str());469}470} else {471// retrieve all parameters within begin and end472const auto parameters = myGenericDataFrameParent->getViewNet()->getNet()->getAttributeCarriers()->retrieveGenericDataParameters(473myGenericDataFrameParent->myDataSetSelector->getDataSet()->getID(), toString(myGenericDataTag),474myGenericDataFrameParent->myIntervalSelector->getDataInterval()->getAttribute(SUMO_ATTR_BEGIN),475myGenericDataFrameParent->myIntervalSelector->getDataInterval()->getAttribute(SUMO_ATTR_END));476// add all parameters477for (const auto& attribute : parameters) {478myAttributesComboBox->appendIconItem(attribute.c_str());479}480}481// enable combo Box482myAttributesComboBox->enable();483// set current item484for (int i = 0; i < myAttributesComboBox->getNumItems(); i++) {485if (myAttributesComboBox->getItemText(i) == currentAttribute.text()) {486myAttributesComboBox->setCurrentItem(i, TRUE);487}488}489}490// show parameters491if (myGenericDataFrameParent->myTemplateGenericData) {492myGenericDataFrameParent->myGenericDataAttributesEditor->showAttributesEditor(myGenericDataFrameParent->myTemplateGenericData, true);493}494// update view net495myGenericDataFrameParent->getViewNet()->updateViewNet();496}497498499std::string500GNEGenericDataFrame::AttributeSelector::getFilteredAttribute() const {501if (myAttributesComboBox->getNumItems() == 0) {502return "";503} else if (myAttributesComboBox->getText() == TL("<all>")) {504return "";505} else {506return myAttributesComboBox->getText().text();507}508}509510511const RGBColor&512GNEGenericDataFrame::AttributeSelector::getScaledColor(const double min, const double max, const double value) const {513// update myMinMaxLabel514myMinMaxLabel->setText(("Min: " + toString(min) + " -> Max: " + toString(max)).c_str());515// return scaled color516return GNEViewNetHelper::getRainbowScaledColor(min, max, value);517}518519520long521GNEGenericDataFrame::AttributeSelector::onCmdSelectAttribute(FXObject*, FXSelector, void*) {522// empty attribute means <all>523if (myAttributesComboBox->getText().empty()) {524myAttributesComboBox->setCurrentItem(0);525}526if (myAttributesComboBox->getText() == TL("<all>")) {527myMinMaxLabel->setText(TL("Scale: Min -> Max"));528}529// update view530myGenericDataFrameParent->getViewNet()->updateViewNet();531return 1;532}533534// ---------------------------------------------------------------------------535// GNEGenericDataFrame - methods536// ---------------------------------------------------------------------------537538const GNEGenericDataFrame::DataSetSelector*539GNEGenericDataFrame::getDataSetSelector() const {540return myDataSetSelector;541}542543544const GNEGenericDataFrame::IntervalSelector*545GNEGenericDataFrame::getIntervalSelector() const {546return myIntervalSelector;547}548549550const GNEGenericDataFrame::AttributeSelector*551GNEGenericDataFrame::getAttributeSelector() const {552return myAttributeSelector;553}554555556GNEPathCreator*557GNEGenericDataFrame::getPathCreator() const {558return myPathCreator;559}560561562void563GNEGenericDataFrame::show() {564// first refresh data set selector565myDataSetSelector->refreshDataSetSelector(nullptr);566// check if there is an edge path creator567if (myPathCreator) {568myPathCreator->showPathCreatorModule(myTemplateGenericData->getTagProperty(), false);569}570// show frame571GNEFrame::show();572}573574575void576GNEGenericDataFrame::hide() {577if (myPathCreator) {578// reset candidate edges579for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {580edge.second->resetCandidateFlags();581}582}583// hide frame584GNEFrame::hide();585}586587588void589GNEGenericDataFrame::updateFrameAfterUndoRedo() {590// refresh data set selector591myDataSetSelector->refreshDataSetSelector(nullptr);592// check if there is an edge path creator593if (myPathCreator) {594myPathCreator->showPathCreatorModule(myTemplateGenericData->getTagProperty(), false);595}596}597598599GNEGenericDataFrame::GNEGenericDataFrame(GNEViewParent* viewParent, GNEViewNet* viewNet, SumoXMLTag tag, const bool pathCreator) :600GNEFrame(viewParent, viewNet, toString(tag)) {601// create DataSetSelector602myDataSetSelector = new DataSetSelector(this);603// create IntervalSelector module604myIntervalSelector = new IntervalSelector(this);605// create AttributeSelector module606myAttributeSelector = new AttributeSelector(this, tag);607// create parameter editor module608myGenericDataAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);609// create GNEPathCreator module610if (pathCreator) {611myPathCreator = new GNEPathCreator(this, viewNet->getNet()->getDataPathManager());612}613// create AC depending of tag614if (tag == GNE_TAG_EDGEREL_SINGLE) {615myTemplateGenericData = new GNEEdgeData(viewNet->getNet());616} else if (tag == SUMO_TAG_EDGEREL) {617myTemplateGenericData = new GNEEdgeRelData(viewNet->getNet());618} else if (tag == SUMO_TAG_TAZREL) {619myTemplateGenericData = new GNETAZRelData(viewNet->getNet());620} else {621throw ProcessError("Invalid data tag");622}623}624625626GNEGenericDataFrame::~GNEGenericDataFrame() {627delete myTemplateGenericData;628}629630631void632GNEGenericDataFrame::intervalSelected() {633//634}635636637bool638GNEGenericDataFrame::createPath(const bool /*useLastRoute*/) {639// this function has to be reimplemented in all child frames that uses a GNEPathCreator640return false;641}642643/****************************************************************************/644645646