Path: blob/main/src/netedit/frames/data/GNETAZRelDataFrame.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 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, MFXGroupBoxModule, ConfirmTAZRelationMap, ARRAYNUMBER(ConfirmTAZRelationMap))4344// ===========================================================================45// method definitions46// ===========================================================================4748// ---------------------------------------------------------------------------49// GNETAZRelDataFrame::ConfirmTAZRelation - methods50// ---------------------------------------------------------------------------5152GNETAZRelDataFrame::ConfirmTAZRelation::ConfirmTAZRelation(GNETAZRelDataFrame* TAZRelDataFrame) :53MFXGroupBoxModule(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) :100MFXGroupBoxModule(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 (!myIntervalSelector->getDataInterval()) {176WRITE_WARNINGF(TL("A % must be defined within an interval."), toString(SUMO_TAG_TAZREL));177} else if ((myFirstTAZ == mySecondTAZ) && myIntervalSelector->getDataInterval()->TAZRelExists(myFirstTAZ)) {178WRITE_WARNINGF(TL("There is already a % defined in TAZ'%'."), toString(SUMO_TAG_TAZREL), myFirstTAZ->getID());179} else if ((myFirstTAZ != mySecondTAZ) && myIntervalSelector->getDataInterval()->TAZRelExists(myFirstTAZ, mySecondTAZ)) {180WRITE_WARNINGF(TL("There is already a % defined between TAZ'%' and '%'."), toString(SUMO_TAG_TAZREL), myFirstTAZ->getID(), mySecondTAZ->getID());181} else if (myGenericDataAttributesEditor->checkAttributes(true)) {182// declare data handler183GNEDataHandler dataHandler(myViewNet->getNet(), "", myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());184// build data interval object and fill it185CommonXMLStructure::SumoBaseObject* dataIntervalObject = new CommonXMLStructure::SumoBaseObject(nullptr);186dataIntervalObject->addStringAttribute(SUMO_ATTR_ID, myIntervalSelector->getDataInterval()->getID());187dataIntervalObject->addDoubleAttribute(SUMO_ATTR_BEGIN, myIntervalSelector->getDataInterval()->getAttributeDouble(SUMO_ATTR_BEGIN));188dataIntervalObject->addDoubleAttribute(SUMO_ATTR_END, myIntervalSelector->getDataInterval()->getAttributeDouble(SUMO_ATTR_END));189// create TAZRelData190CommonXMLStructure::SumoBaseObject* TAZRelData = new CommonXMLStructure::SumoBaseObject(dataIntervalObject);191// obtain parameters192myGenericDataAttributesEditor->fillSumoBaseObject(TAZRelData);193// create TAZRelationData194dataHandler.buildTAZRelationData(TAZRelData, myFirstTAZ->getID(), mySecondTAZ->getID(), TAZRelData->getParameters());195// delete data interval object (and child)196delete dataIntervalObject;197// reset both TAZs198myFirstTAZ = nullptr;199mySecondTAZ = nullptr;200myLegend->setLabels(myFirstTAZ, mySecondTAZ);201}202}203}204205206GNEAdditional*207GNETAZRelDataFrame::getFirstTAZ() const {208return myFirstTAZ;209}210211212GNEAdditional*213GNETAZRelDataFrame::getSecondTAZ() const {214return mySecondTAZ;215}216217218void219GNETAZRelDataFrame::clearTAZSelection() {220myFirstTAZ = nullptr;221mySecondTAZ = nullptr;222myLegend->setLabels(myFirstTAZ, mySecondTAZ);223}224225/****************************************************************************/226227228