Path: blob/main/src/netedit/frames/demand/GNEContainerPlanFrame.cpp
169685 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 GNEContainerPlanFrame.cpp14/// @author Pablo Alvarez Lopez15/// @date Jun 201916///17// The Widget for add ContainerPlan elements18/****************************************************************************/1920#include <netedit/GNEApplicationWindow.h>21#include <netedit/GNENet.h>22#include <netedit/GNEViewParent.h>23#include <netedit/elements/additional/GNETAZ.h>24#include <netedit/elements/demand/GNERouteHandler.h>25#include <netedit/frames/GNEAttributesEditor.h>26#include <netedit/frames/GNEDemandSelector.h>27#include <netedit/frames/GNEElementTree.h>28#include <netedit/frames/GNEPlanCreator.h>29#include <netedit/frames/GNEPlanCreatorLegend.h>3031#include "GNEContainerPlanFrame.h"3233// ===========================================================================34// method definitions35// ===========================================================================3637GNEContainerPlanFrame::GNEContainerPlanFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :38GNEFrame(viewParent, viewNet, TL("ContainerPlans")) {3940// create container types selector module41myContainerSelector = new GNEDemandElementSelector(this, {GNETagProperties::Type::CONTAINER});4243// Create plan selector44myPlanSelector = new GNEPlanSelector(this, SUMO_TAG_CONTAINER);4546// Create attributes editor47myContainerPlanAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);4849// create plan creator Module50myPlanCreator = new GNEPlanCreator(this, viewNet->getNet()->getDemandPathManager());5152// Create GNEElementTree module53myContainerHierarchy = new GNEElementTree(this);5455// create plan creator legend56myPlanCreatorLegend = new GNEPlanCreatorLegend(this);57}585960GNEContainerPlanFrame::~GNEContainerPlanFrame() {}616263void64GNEContainerPlanFrame::show() {65// get containers maps66const auto& containers = myViewNet->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_CONTAINER);67const auto& containerFlows = myViewNet->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_CONTAINERFLOW);68// Only show modules if there is at least one container69if ((containers.size() > 0) || (containerFlows.size() > 0)) {70// show container selector71myContainerSelector->showDemandElementSelector();72// refresh tag selector73myPlanSelector->refreshPlanSelector();74} else {75// hide all modules76myContainerSelector->hideDemandElementSelector();77myPlanSelector->hidePlanSelector();78myContainerPlanAttributesEditor->hideAttributesEditor();79myPlanCreator->hidePathCreatorModule();80myContainerHierarchy->hideHierarchicalElementTree();81myPlanCreatorLegend->hidePlanCreatorLegend();82}83// show frame84GNEFrame::show();85}868788void89GNEContainerPlanFrame::hide() {90// reset candidate edges91for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {92edge.second->resetCandidateFlags();93}94// enable undo/redo95myViewNet->getViewParent()->getGNEAppWindows()->enableUndoRedoTemporally();96// hide frame97GNEFrame::hide();98}99100101bool102GNEContainerPlanFrame::addContainerPlanElement(const GNEViewNetHelper::ViewObjectsSelector& viewObjects) {103// first check that we clicked over an AC104if (viewObjects.getAttributeCarrierFront() == nullptr) {105return false;106}107// check if we have to select a new container108if (myContainerSelector->getCurrentDemandElement() == nullptr) {109if (viewObjects.getDemandElementFront() && viewObjects.getDemandElementFront()->getTagProperty()->isContainer()) {110// continue depending of number of demand elements under cursor111if (viewObjects.getDemandElements().size() > 1) {112// Filter containers113myContainerSelector->setDemandElements(viewObjects.getDemandElements());114} else {115// select new container116myContainerSelector->setDemandElement(viewObjects.getDemandElementFront());117}118return true;119} else {120myViewNet->setStatusBarText(TL("Current selected container isn't valid."));121return false;122}123}124// finally check that container plan selected is valid125if (!myPlanSelector->getCurrentPlanTemplate()) {126myViewNet->setStatusBarText(TL("Current selected container plan isn't valid."));127return false;128}129// continue depending of marked elements130if (myPlanSelector->markRoutes() && viewObjects.getDemandElementFront() &&131(viewObjects.getDemandElementFront()->getTagProperty()->getTag() == SUMO_TAG_ROUTE)) {132return myPlanCreator->addRoute(viewObjects.getDemandElementFront());133} else if (myPlanSelector->markStoppingPlaces() && viewObjects.getAdditionalFront() &&134(viewObjects.getAdditionalFront()->getTagProperty()->isStoppingPlace())) {135return myPlanCreator->addStoppingPlace(viewObjects.getAdditionalFront());136} else if (myPlanSelector->markJunctions() && viewObjects.getJunctionFront()) {137return myPlanCreator->addJunction(viewObjects.getJunctionFront());138} else if (myPlanSelector->markEdges() && viewObjects.getLaneFront()) {139return myPlanCreator->addEdge(viewObjects.getLaneFront());140} else if (myPlanSelector->markTAZs() && viewObjects.getTAZFront()) {141return myPlanCreator->addTAZ(viewObjects.getTAZFront());142} else {143return false;144}145}146147148void149GNEContainerPlanFrame::resetSelectedContainer() {150myContainerSelector->setDemandElement(nullptr);151}152153154GNEPlanCreator*155GNEContainerPlanFrame::getPlanCreator() const {156return myPlanCreator;157}158159160GNEElementTree*161GNEContainerPlanFrame::getContainerHierarchy() const {162return myContainerHierarchy;163}164165166GNEDemandElementSelector*167GNEContainerPlanFrame::getContainerSelector() const {168return myContainerSelector;169}170171172GNEPlanSelector*173GNEContainerPlanFrame::getPlanSelector() const {174return myPlanSelector;175}176177// ===========================================================================178// protected179// ===========================================================================180181void182GNEContainerPlanFrame::tagSelected() {183// first check if container is valid184if (myPlanSelector->getCurrentPlanTemplate()) {185// show container attributes186myContainerPlanAttributesEditor->showAttributesEditor(myPlanSelector->getCurrentPlanTemplate(), true);187// set path creator mode depending if previousEdge exist188if (myContainerSelector) {189// show path creator mode190myPlanCreator->showPlanCreatorModule(myPlanSelector, myContainerSelector->getPreviousPlanElement());191// show legend192myPlanCreatorLegend->showPlanCreatorLegend();193// show container hierarchy194myContainerHierarchy->showHierarchicalElementTree(myContainerSelector->getCurrentDemandElement());195} else {196// hide modules197myPlanCreator->hidePathCreatorModule();198myContainerHierarchy->hideHierarchicalElementTree();199myPlanCreatorLegend->hidePlanCreatorLegend();200}201} else {202// hide modules if tag selected isn't valid203myContainerPlanAttributesEditor->hideAttributesEditor();204myPlanCreator->hidePathCreatorModule();205myContainerHierarchy->hideHierarchicalElementTree();206myPlanCreatorLegend->hidePlanCreatorLegend();207}208}209210211void212GNEContainerPlanFrame::demandElementSelected() {213// check if a valid container was selected214if (myContainerSelector->getCurrentDemandElement()) {215// show container plan tag selector216myPlanSelector->showPlanSelector();217// now check if container plan selected is valid218if (myPlanSelector->getCurrentPlanTemplate()) {219// call tag selected220tagSelected();221} else {222myContainerPlanAttributesEditor->hideAttributesEditor();223myPlanCreator->hidePathCreatorModule();224myContainerHierarchy->hideHierarchicalElementTree();225myPlanCreatorLegend->hidePlanCreatorLegend();226}227} else {228// hide modules if container selected isn't valid229myPlanSelector->hidePlanSelector();230myContainerPlanAttributesEditor->hideAttributesEditor();231myPlanCreator->hidePathCreatorModule();232myContainerHierarchy->hideHierarchicalElementTree();233myPlanCreatorLegend->hidePlanCreatorLegend();234}235}236237238bool239GNEContainerPlanFrame::createPath(const bool /*useLastRoute*/) {240// first check that all attributes are valid241if (!myContainerPlanAttributesEditor->checkAttributes(true)) {242return false;243} else {244// declare route handler245GNERouteHandler routeHandler(myViewNet->getNet(), myContainerSelector->getCurrentDemandElement()->getAttribute(GNE_ATTR_DEMAND_FILE),246myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());247// check if container plan can be created248if (routeHandler.buildContainerPlan(myPlanSelector->getCurrentPlanTemplate(), myContainerSelector->getCurrentDemandElement(),249myContainerPlanAttributesEditor, myPlanCreator, false)) {250// refresh GNEElementTree251myContainerHierarchy->refreshHierarchicalElementTree();252// abort path creation253myPlanCreator->abortPathCreation();254// refresh using tagSelected255tagSelected();256// refresh containerPlan attributes257myContainerPlanAttributesEditor->refreshAttributesEditor();258// enable show all container plans259myViewNet->getDemandViewOptions().menuCheckShowAllContainerPlans->setChecked(TRUE);260return true;261} else {262return false;263}264}265}266267/****************************************************************************/268269270