Path: blob/main/src/netedit/frames/data/GNETAZRelDataFrame.cpp
193678 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 GNETAZRelDataFrame.cpp14/// @author Pablo Alvarez Lopez15/// @date May 202016///17// The Widget for add TAZRelationData elements18/****************************************************************************/1920#include <netedit/GNEApplicationWindow.h>21#include <netedit/GNEViewNet.h>22#include <netedit/GNEViewParent.h>23#include <netedit/elements/additional/GNETAZ.h>24#include <netedit/elements/data/GNEDataHandler.h>25#include <netedit/elements/data/GNEDataInterval.h>26#include <netedit/frames/GNEAttributesEditor.h>27#include <utils/gui/div/GUIDesigns.h>2829#include "GNETAZRelDataFrame.h"3031// ===========================================================================32// FOX callback mapping33// ===========================================================================3435FXDEFMAP(GNETAZRelDataFrame::ConfirmTAZRelation) ConfirmTAZRelationMap[] = {36FXMAPFUNC(SEL_COMMAND, MID_GNE_CREATE, GNETAZRelDataFrame::ConfirmTAZRelation::onCmdConfirmTAZRelation),37FXMAPFUNC(SEL_UPDATE, MID_GNE_CREATE, GNETAZRelDataFrame::ConfirmTAZRelation::onUpdConfirmTAZRelation),38FXMAPFUNC(SEL_COMMAND, MID_GNE_ABORT, GNETAZRelDataFrame::ConfirmTAZRelation::onCmdClearSelection)39};4041// Object implementation42FXIMPLEMENT(GNETAZRelDataFrame::ConfirmTAZRelation, GNEGroupBoxModule, ConfirmTAZRelationMap, ARRAYNUMBER(ConfirmTAZRelationMap))4344// ===========================================================================45// method definitions46// ===========================================================================4748// ---------------------------------------------------------------------------49// GNETAZRelDataFrame::ConfirmTAZRelation - methods50// ---------------------------------------------------------------------------5152GNETAZRelDataFrame::ConfirmTAZRelation::ConfirmTAZRelation(GNETAZRelDataFrame* TAZRelDataFrame) :53GNEGroupBoxModule(TAZRelDataFrame, TL("Confirm TAZRelation")),54myTAZRelDataFrame(TAZRelDataFrame) {55myConfirmTAZButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Create TAZRelation"), "", TL("Click fromTaz and toTaz (confirm hotkey <ENTER>)"), GUIIconSubSys::getIcon(GUIIcon::TAZRELDATA), this, MID_GNE_CREATE, GUIDesignButton);56myConfirmTAZButton->disable();57myClearTAZButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Clear selection"), "", TL("Clear selected TAZs (hotkey <ESC>)"), GUIIconSubSys::getIcon(GUIIcon::CLEARMESSAGEWINDOW), this, MID_GNE_ABORT, GUIDesignButton);58myClearTAZButton->disable();59}606162GNETAZRelDataFrame::ConfirmTAZRelation::~ConfirmTAZRelation() {}636465long66GNETAZRelDataFrame::ConfirmTAZRelation::onCmdConfirmTAZRelation(FXObject*, FXSelector, void*) {67myTAZRelDataFrame->buildTAZRelationData();68return 1;69}707172long73GNETAZRelDataFrame::ConfirmTAZRelation::onUpdConfirmTAZRelation(FXObject*, FXSelector, void*) {74if (myTAZRelDataFrame->myFirstTAZ && myTAZRelDataFrame->mySecondTAZ) {75myConfirmTAZButton->enable();76} else {77myConfirmTAZButton->disable();78}79if (myTAZRelDataFrame->myFirstTAZ || myTAZRelDataFrame->mySecondTAZ) {80myClearTAZButton->enable();81} else {82myClearTAZButton->disable();83}84return 1;85}868788long89GNETAZRelDataFrame::ConfirmTAZRelation::onCmdClearSelection(FXObject*, FXSelector, void*) {90myTAZRelDataFrame->clearTAZSelection();91myTAZRelDataFrame->getViewNet()->update();92return 1;93}9495// ---------------------------------------------------------------------------96// GNETAZRelDataFrame::TAZRelLegend - methods97// ---------------------------------------------------------------------------9899GNETAZRelDataFrame::Legend::Legend(GNETAZRelDataFrame* TAZRelDataFrame) :100GNEGroupBoxModule(TAZRelDataFrame, TL("Information")),101myFromTAZLabel(nullptr),102myToTAZLabel(nullptr) {103// create from TAZ label104myFromTAZLabel = new FXLabel(getCollapsableFrame(), "From TAZ", 0, GUIDesignLabel(JUSTIFY_LEFT));105myFromTAZLabel->setBackColor(MFXUtils::getFXColor(RGBColor::GREEN));106// create to TAZ Label107myToTAZLabel = new FXLabel(getCollapsableFrame(), "To TAZ", 0, GUIDesignLabel(JUSTIFY_LEFT));108myToTAZLabel->setBackColor(MFXUtils::getFXColor(RGBColor::MAGENTA));109}110111112GNETAZRelDataFrame::Legend::~Legend() {}113114115void116GNETAZRelDataFrame::Legend::setLabels(const GNETAZ* fromTAZ, const GNETAZ* toTAZ) {117// from TAZ118if (fromTAZ) {119myFromTAZLabel->setText(("From TAZ: " + fromTAZ->getID()).c_str());120} else {121myFromTAZLabel->setText(TL("From TAZ"));122}123// to TAZ124if (toTAZ) {125myToTAZLabel->setText(("To TAZ: " + toTAZ->getID()).c_str());126} else {127myToTAZLabel->setText(TL("To TAZ"));128}129}130131// ---------------------------------------------------------------------------132// GNETAZRelDataFrame - methods133// ------------------------------------------------------------------------134135GNETAZRelDataFrame::GNETAZRelDataFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :136GNEGenericDataFrame(viewParent, viewNet, SUMO_TAG_TAZREL, false) {137// create confirm TAZ Relation138myConfirmTAZRelation = new ConfirmTAZRelation(this);139// create legend140myLegend = new Legend(this);141}142143144GNETAZRelDataFrame::~GNETAZRelDataFrame() {}145146147bool148GNETAZRelDataFrame::setTAZ(const GNEViewNetHelper::ViewObjectsSelector& viewObjects) {149// check if myFirstTAZElement is empty150if (myFirstTAZ) {151if (mySecondTAZ) {152// both already defined153return false;154} else if (viewObjects.getTAZFront()) {155mySecondTAZ = viewObjects.getTAZFront();156myLegend->setLabels(myFirstTAZ, mySecondTAZ);157return true;158} else {159return false;160}161} else if (viewObjects.getTAZFront()) {162myFirstTAZ = viewObjects.getTAZFront();163myLegend->setLabels(myFirstTAZ, mySecondTAZ);164return true;165} else {166return false;167}168}169170171void172GNETAZRelDataFrame::buildTAZRelationData() {173// check conditions174if (myFirstTAZ && mySecondTAZ) {175if (!myDataSetSelector->getDataSet()) {176WRITE_WARNINGF(TL("A % must be defined within an dataSet."), toString(SUMO_TAG_TAZREL));177} else if (!myIntervalSelector->getDataInterval()) {178WRITE_WARNINGF(TL("A % must be defined within an interval."), toString(SUMO_TAG_TAZREL));179} else if ((myFirstTAZ == mySecondTAZ) && myIntervalSelector->getDataInterval()->TAZRelExists(myFirstTAZ)) {180WRITE_WARNINGF(TL("There is already a % defined in TAZ'%'."), toString(SUMO_TAG_TAZREL), myFirstTAZ->getID());181} else if ((myFirstTAZ != mySecondTAZ) && myIntervalSelector->getDataInterval()->TAZRelExists(myFirstTAZ, mySecondTAZ)) {182WRITE_WARNINGF(TL("There is already a % defined between TAZ'%' and '%'."), toString(SUMO_TAG_TAZREL), myFirstTAZ->getID(), mySecondTAZ->getID());183} else if (myGenericDataAttributesEditor->checkAttributes(true)) {184// declare data handler185GNEDataHandler dataHandler(myViewNet->getNet(), myDataSetSelector->getDataSet()->getFileBucket(),186myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());187// build data interval object and fill it188CommonXMLStructure::SumoBaseObject* dataIntervalObject = new CommonXMLStructure::SumoBaseObject(nullptr);189dataIntervalObject->addStringAttribute(SUMO_ATTR_ID, myIntervalSelector->getDataInterval()->getID());190dataIntervalObject->addDoubleAttribute(SUMO_ATTR_BEGIN, myIntervalSelector->getDataInterval()->getAttributeDouble(SUMO_ATTR_BEGIN));191dataIntervalObject->addDoubleAttribute(SUMO_ATTR_END, myIntervalSelector->getDataInterval()->getAttributeDouble(SUMO_ATTR_END));192// create TAZRelData193CommonXMLStructure::SumoBaseObject* TAZRelData = new CommonXMLStructure::SumoBaseObject(dataIntervalObject);194// obtain parameters195myGenericDataAttributesEditor->fillSumoBaseObject(TAZRelData);196// create TAZRelationData197dataHandler.buildTAZRelationData(TAZRelData, myFirstTAZ->getID(), mySecondTAZ->getID(), TAZRelData->getParameters());198// delete data interval object (and child)199delete dataIntervalObject;200// reset both TAZs201myFirstTAZ = nullptr;202mySecondTAZ = nullptr;203myLegend->setLabels(myFirstTAZ, mySecondTAZ);204}205}206}207208209GNEAdditional*210GNETAZRelDataFrame::getFirstTAZ() const {211return myFirstTAZ;212}213214215GNEAdditional*216GNETAZRelDataFrame::getSecondTAZ() const {217return mySecondTAZ;218}219220221void222GNETAZRelDataFrame::clearTAZSelection() {223myFirstTAZ = nullptr;224mySecondTAZ = nullptr;225myLegend->setLabels(myFirstTAZ, mySecondTAZ);226}227228/****************************************************************************/229230231