Path: blob/main/src/netedit/frames/demand/GNEPersonPlanFrame.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 GNEPersonPlanFrame.cpp14/// @author Pablo Alvarez Lopez15/// @date Jun 201916///17// The Widget for add PersonPlan 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 "GNEPersonPlanFrame.h"3233// ===========================================================================34// method definitions35// ===========================================================================3637GNEPersonPlanFrame::GNEPersonPlanFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :38GNEFrame(viewParent, viewNet, TL("PersonPlans")) {3940// create person types selector module41myPersonSelector = new GNEDemandElementSelector(this, {GNETagProperties::Type::PERSON});4243// Create plan selector44myPlanSelector = new GNEPlanSelector(this, SUMO_TAG_PERSON);4546// Create person parameters47myPersonPlanAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);4849// create plan creator Module50myPlanCreator = new GNEPlanCreator(this, viewNet->getNet()->getDemandPathManager());5152// Create GNEElementTree module53myPersonHierarchy = new GNEElementTree(this);5455// create plan creator legend56myPlanCreatorLegend = new GNEPlanCreatorLegend(this);57}585960GNEPersonPlanFrame::~GNEPersonPlanFrame() {}616263void64GNEPersonPlanFrame::show() {65// get persons maps66const auto& persons = myViewNet->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_PERSON);67const auto& personFlows = myViewNet->getNet()->getAttributeCarriers()->getDemandElements().at(SUMO_TAG_PERSONFLOW);68// Only show modules if there is at least one person69if ((persons.size() > 0) || (personFlows.size() > 0)) {70// show person selector71myPersonSelector->showDemandElementSelector();72// refresh tag selector73myPlanSelector->refreshPlanSelector();74} else {75// hide all modules76myPersonSelector->hideDemandElementSelector();77myPlanSelector->hidePlanSelector();78myPersonPlanAttributesEditor->hideAttributesEditor();79myPlanCreator->hidePathCreatorModule();80myPersonHierarchy->hideHierarchicalElementTree();81myPlanCreatorLegend->hidePlanCreatorLegend();82}83// show frame84GNEFrame::show();85}868788void89GNEPersonPlanFrame::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}99100101bool102GNEPersonPlanFrame::addPersonPlanElement(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 person108if (myPersonSelector->getCurrentDemandElement() == nullptr) {109if (viewObjects.getDemandElementFront() && viewObjects.getDemandElementFront()->getTagProperty()->isPerson()) {110// continue depending of number of demand elements under cursor111if (viewObjects.getDemandElements().size() > 1) {112// Filter persons113myPersonSelector->setDemandElements(viewObjects.getDemandElements());114} else {115// select new person116myPersonSelector->setDemandElement(viewObjects.getDemandElementFront());117}118return true;119} else {120myViewNet->setStatusBarText(TL("Current selected person isn't valid."));121return false;122}123}124// finally check that person plan selected is valid125if (!myPlanSelector->getCurrentPlanTemplate()) {126myViewNet->setStatusBarText(TL("Current selected person 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}146147148void149GNEPersonPlanFrame::resetSelectedPerson() {150myPersonSelector->setDemandElement(nullptr);151}152153154GNEPlanCreator*155GNEPersonPlanFrame::getPlanCreator() const {156return myPlanCreator;157}158159160GNEElementTree*161GNEPersonPlanFrame::getPersonHierarchy() const {162return myPersonHierarchy;163}164165166GNEDemandElementSelector*167GNEPersonPlanFrame::getPersonSelector() const {168return myPersonSelector;169}170171172GNEPlanSelector*173GNEPersonPlanFrame::getPlanSelector() const {174return myPlanSelector;175}176177// ===========================================================================178// protected179// ===========================================================================180181void182GNEPersonPlanFrame::tagSelected() {183// first check if person is valid184if (myPlanSelector->getCurrentPlanTemplate()) {185// show person attributes186myPersonPlanAttributesEditor->showAttributesEditor(myPlanSelector->getCurrentPlanTemplate(), true);187// set path creator mode depending if previousEdge exist188if (myPersonSelector) {189// show path creator mode190myPlanCreator->showPlanCreatorModule(myPlanSelector, myPersonSelector->getPreviousPlanElement());191// show legend192myPlanCreatorLegend->showPlanCreatorLegend();193// show person hierarchy194myPersonHierarchy->showHierarchicalElementTree(myPersonSelector->getCurrentDemandElement());195} else {196// hide modules197myPlanCreator->hidePathCreatorModule();198myPersonHierarchy->hideHierarchicalElementTree();199myPlanCreatorLegend->hidePlanCreatorLegend();200}201} else {202// hide modules if tag selected isn't valid203myPersonPlanAttributesEditor->hideAttributesEditor();204myPlanCreator->hidePathCreatorModule();205myPersonHierarchy->hideHierarchicalElementTree();206myPlanCreatorLegend->hidePlanCreatorLegend();207}208}209210211void212GNEPersonPlanFrame::demandElementSelected() {213// check if a valid person was selected214if (myPersonSelector->getCurrentDemandElement()) {215// show person plan tag selector216myPlanSelector->showPlanSelector();217// now check if person plan selected is valid218if (myPlanSelector->getCurrentPlanTemplate()) {219// call tag selected220tagSelected();221} else {222myPersonPlanAttributesEditor->hideAttributesEditor();223myPlanCreator->hidePathCreatorModule();224myPersonHierarchy->hideHierarchicalElementTree();225myPlanCreatorLegend->hidePlanCreatorLegend();226}227} else {228// hide modules if person selected isn't valid229myPlanSelector->hidePlanSelector();230myPersonPlanAttributesEditor->hideAttributesEditor();231myPlanCreator->hidePathCreatorModule();232myPersonHierarchy->hideHierarchicalElementTree();233myPlanCreatorLegend->hidePlanCreatorLegend();234}235}236237238bool239GNEPersonPlanFrame::createPath(const bool /*useLastRoute*/) {240// first check that all attributes are valid241if (!myPersonPlanAttributesEditor->checkAttributes(true)) {242return false;243} else {244// declare route handler245GNERouteHandler routeHandler(myViewNet->getNet(), myPersonSelector->getCurrentDemandElement()->getAttribute(GNE_ATTR_DEMAND_FILE),246myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());247// check if person plan can be created248if (routeHandler.buildPersonPlan(myPlanSelector->getCurrentPlanTemplate(), myPersonSelector->getCurrentDemandElement(),249myPersonPlanAttributesEditor, myPlanCreator, false)) {250// refresh GNEElementTree251myPersonHierarchy->refreshHierarchicalElementTree();252// abort path creation253myPlanCreator->abortPathCreation();254// refresh using tagSelected255tagSelected();256// refresh personPlan attributes257myPersonPlanAttributesEditor->refreshAttributesEditor();258// enable show all person plans259myViewNet->getDemandViewOptions().menuCheckShowAllPersonPlans->setChecked(TRUE);260return true;261} else {262return false;263}264}265}266267/****************************************************************************/268269270