Path: blob/main/src/netedit/frames/demand/GNEPersonFrame.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 GNEPersonFrame.cpp14/// @author Pablo Alvarez Lopez15/// @date May 201916///17// The Widget for add Person elements18/****************************************************************************/1920#include <netedit/GNEApplicationWindow.h>21#include <netedit/GNENet.h>22#include <netedit/GNEUndoList.h>23#include <netedit/GNEViewParent.h>24#include <netedit/elements/additional/GNETAZ.h>25#include <netedit/elements/demand/GNERouteHandler.h>26#include <netedit/frames/GNEAttributesEditor.h>27#include <netedit/frames/GNEDemandSelector.h>28#include <netedit/frames/GNEPlanCreator.h>29#include <netedit/frames/GNEPlanCreatorLegend.h>30#include <utils/vehicle/SUMOVehicleParserHelper.h>31#include <utils/xml/SUMOSAXAttributesImpl_Cached.h>3233#include "GNEPersonFrame.h"3435// ===========================================================================36// method definitions37// ===========================================================================3839GNEPersonFrame::GNEPersonFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :40GNEFrame(viewParent, viewNet, TL("Persons")),41myPersonBaseObject(new CommonXMLStructure::SumoBaseObject(nullptr)) {4243// create tag Selector module for persons44myPersonTagSelector = new GNETagSelector(this, GNETagProperties::Type::PERSON, SUMO_TAG_PERSON);4546// create person types selector module and set DEFAULT_PEDTYPE_ID as default element47myTypeSelector = new GNEDemandElementSelector(this, SUMO_TAG_VTYPE, GNETagProperties::Type::PERSON);4849// create person attributes50myPersonAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);5152// create plan selector module for person plans53myPlanSelector = new GNEPlanSelector(this, SUMO_TAG_PERSON);5455// create person plan attributes56myPersonPlanAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);5758// create GNEPlanCreator Module59myPlanCreator = new GNEPlanCreator(this, viewNet->getNet()->getDemandPathManager());6061// create plan creator legend62myPlanCreatorLegend = new GNEPlanCreatorLegend(this);63}646566GNEPersonFrame::~GNEPersonFrame() {67delete myPersonBaseObject;68}697071void72GNEPersonFrame::show() {73// refresh tag selector74myPersonTagSelector->refreshTagSelector();75myTypeSelector->refreshDemandElementSelector();76myPlanSelector->refreshPlanSelector();77// show frame78GNEFrame::show();79}808182void83GNEPersonFrame::hide() {84// reset candidate edges85for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {86edge.second->resetCandidateFlags();87}88// hide frame89GNEFrame::hide();90}919293bool94GNEPersonFrame::addPerson(const GNEViewNetHelper::ViewObjectsSelector& viewObjects) {95// first check that we clicked over an AC96if (viewObjects.getAttributeCarrierFront() == nullptr) {97return false;98}99// obtain tags (only for improve code legibility)100SumoXMLTag personTag = myPersonTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag();101// first check that current selected person is valid102if (personTag == SUMO_TAG_NOTHING) {103myViewNet->setStatusBarText(TL("Current selected person isn't valid."));104return false;105}106// now check that pType is valid107if (myTypeSelector->getCurrentDemandElement() == nullptr) {108myViewNet->setStatusBarText(TL("Current selected person type isn't valid."));109return false;110}111// finally check that person plan selected is valid112if (myPlanSelector->getCurrentPlanTemplate() == nullptr) {113myViewNet->setStatusBarText(TL("Current selected person plan isn't valid."));114return false;115}116for (GNEAdditional* o : viewObjects.getAdditionals()) {117if (o->getTagProperty()->isStoppingPlace()) {118return myPlanCreator->addStoppingPlace(o);119}120}121for (GNEDemandElement* o : viewObjects.getDemandElements()) {122if (o->getTagProperty()->getTag() == SUMO_TAG_ROUTE) {123return myPlanCreator->addRoute(o);124}125}126if (viewObjects.getAttributeCarrierFront() == viewObjects.getJunctionFront()) {127return myPlanCreator->addJunction(viewObjects.getJunctions().front());128}129if (viewObjects.getAttributeCarrierFront() == viewObjects.getLaneFront()) {130return myPlanCreator->addEdge(viewObjects.getLanes().front());131}132if (viewObjects.getAttributeCarrierFront() == viewObjects.getTAZFront()) {133return myPlanCreator->addTAZ(viewObjects.getTAZs().front());134}135return false;136}137138139GNEPlanCreator*140GNEPersonFrame::getPlanCreator() const {141return myPlanCreator;142}143144145GNEDemandElementSelector*146GNEPersonFrame::getTypeSelector() const {147return myTypeSelector;148}149150151GNEPlanSelector*152GNEPersonFrame::getPlanSelector() const {153return myPlanSelector;154}155156157GNEAttributesEditor*158GNEPersonFrame::getPersonAttributesEditor() const {159return myPersonAttributesEditor;160}161162// ===========================================================================163// protected164// ===========================================================================165166void167GNEPersonFrame::tagSelected() {168// first check if person is valid169if (myPersonTagSelector->getCurrentTemplateAC()) {170// show PType selector and person plan selector171myTypeSelector->showDemandElementSelector();172// check if current person type selected is valid173if (myTypeSelector->getCurrentDemandElement()) {174// show person attributes depending of myPlanSelector175myPersonAttributesEditor->showAttributesEditor(myPersonTagSelector->getCurrentTemplateAC(), true);176// show person plan tag selector177myPlanSelector->showPlanSelector();178// check current plan template179if (myPlanSelector->getCurrentPlanTemplate()) {180// show person plan attributes181myPersonPlanAttributesEditor->showAttributesEditor(myPlanSelector->getCurrentPlanTemplate(), false);182// show edge path creator module183myPlanCreator->showPlanCreatorModule(myPlanSelector, nullptr);184// show path legend185myPlanCreatorLegend->showPlanCreatorLegend();186} else {187// hide modules188myPersonPlanAttributesEditor->hideAttributesEditor();189myPlanCreator->hidePathCreatorModule();190myPlanCreatorLegend->hidePlanCreatorLegend();191}192} else {193// hide modules194myPlanSelector->hidePlanSelector();195myPersonAttributesEditor->hideAttributesEditor();196myPersonPlanAttributesEditor->hideAttributesEditor();197myPlanCreator->hidePathCreatorModule();198myPlanCreatorLegend->hidePlanCreatorLegend();199}200} else {201// hide all modules if person isn't valid202myTypeSelector->hideDemandElementSelector();203myPlanSelector->hidePlanSelector();204myPersonPlanAttributesEditor->hideAttributesEditor();205myPersonPlanAttributesEditor->hideAttributesEditor();206myPlanCreator->hidePathCreatorModule();207myPlanCreatorLegend->hidePlanCreatorLegend();208}209}210211212void213GNEPersonFrame::demandElementSelected() {214if (myTypeSelector->getCurrentDemandElement() && myPlanSelector->getCurrentPlanTemplate()) {215// show person attributes216myPersonAttributesEditor->showAttributesEditor(myPersonTagSelector->getCurrentTemplateAC(), true);217// show person plan tag selector218myPlanSelector->showPlanSelector();219// now check if person plan selected is valid220if (myPlanSelector->getCurrentPlanTagProperties()->getTag() != SUMO_TAG_NOTHING) {221// show person plan attributes222myPersonPlanAttributesEditor->showAttributesEditor(myPlanSelector->getCurrentPlanTemplate(), false);223// show edge path creator module224myPlanCreator->showPlanCreatorModule(myPlanSelector, nullptr);225// show legend226myPlanCreatorLegend->showPlanCreatorLegend();227} else {228// hide modules229myPersonPlanAttributesEditor->hideAttributesEditor();230myPlanCreator->hidePathCreatorModule();231}232} else {233// hide modules234myPlanSelector->hidePlanSelector();235myPersonAttributesEditor->hideAttributesEditor();236myPersonPlanAttributesEditor->hideAttributesEditor();237myPlanCreator->hidePathCreatorModule();238}239}240241242bool243GNEPersonFrame::createPath(const bool /*useLastRoute*/) {244// first check that all attributes are valid245if (!myPersonAttributesEditor->checkAttributes(true) || !myPersonPlanAttributesEditor->checkAttributes(true)) {246return false;247} else if (myPlanCreator->planCanBeCreated(myPlanSelector->getCurrentPlanTemplate())) {248// begin undo-redo operation249myViewNet->getUndoList()->begin(myPersonTagSelector->getCurrentTemplateAC(), "create " +250myPersonTagSelector->getCurrentTemplateAC()->getTagProperty()->getTagStr() + " and " +251myPlanSelector->getCurrentPlanTagProperties()->getTagStr());252// create person253GNEDemandElement* person = buildPerson();254// declare route handler255GNERouteHandler routeHandler(myViewNet->getNet(), person->getAttribute(GNE_ATTR_DEMAND_FILE),256myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());257// check if person and person plan can be created258if (routeHandler.buildPersonPlan(myPlanSelector->getCurrentPlanTemplate(),259person, myPersonPlanAttributesEditor, myPlanCreator, true)) {260// end undo-redo operation261myViewNet->getUndoList()->end();262// abort path creation263myPlanCreator->abortPathCreation();264// refresh person and personPlan attributes265myPersonAttributesEditor->refreshAttributesEditor();266myPersonPlanAttributesEditor->refreshAttributesEditor();267// compute person268person->computePathElement();269// enable show all person plans270myViewNet->getDemandViewOptions().menuCheckShowAllPersonPlans->setChecked(TRUE);271return true;272} else {273// abort person creation274myViewNet->getUndoList()->abortAllChangeGroups();275return false;276}277} else {278return false;279}280}281282// ---------------------------------------------------------------------------283// GNEPersonFrame - private methods284// ---------------------------------------------------------------------------285286GNEDemandElement*287GNEPersonFrame::buildPerson() {288// first person base object289myPersonBaseObject->clear();290// obtain person tag (only for improve code legibility)291SumoXMLTag personTag = myPersonTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag();292// set tag293myPersonBaseObject->setTag(personTag);294// get attribute ad values295myPersonAttributesEditor->fillSumoBaseObject(myPersonBaseObject);296// add pType parameter297myPersonBaseObject->addStringAttribute(SUMO_ATTR_TYPE, myTypeSelector->getCurrentDemandElement()->getID());298// declare route handler299GNERouteHandler routeHandler(myViewNet->getNet(), myPersonBaseObject->hasStringAttribute(GNE_ATTR_DEMAND_FILE) ?300myPersonBaseObject->getStringAttribute(GNE_ATTR_DEMAND_FILE) : "",301myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed());302// check if we're creating a person or personFlow303if (personTag == SUMO_TAG_PERSON) {304// Add parameter departure305if (!myPersonBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myPersonBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {306myPersonBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");307}308// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes309SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myPersonBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(personTag));310// obtain person parameters311SUMOVehicleParameter* personParameters = SUMOVehicleParserHelper::parseVehicleAttributes(SUMO_TAG_PERSON, SUMOSAXAttrs, false, false, false);312// check personParameters313if (personParameters) {314myPersonBaseObject->setVehicleParameter(personParameters);315// parse vehicle316routeHandler.parseSumoBaseObject(myPersonBaseObject);317// delete personParameters318delete personParameters;319}320} else {321// set begin and end attributes322if (!myPersonBaseObject->hasStringAttribute(SUMO_ATTR_BEGIN) || myPersonBaseObject->getStringAttribute(SUMO_ATTR_BEGIN).empty()) {323myPersonBaseObject->addStringAttribute(SUMO_ATTR_BEGIN, "0");324}325// adjust poisson value326if (myPersonBaseObject->hasDoubleAttribute(GNE_ATTR_POISSON)) {327myPersonBaseObject->addStringAttribute(SUMO_ATTR_PERIOD, "exp(" + toString(myPersonBaseObject->getDoubleAttribute(GNE_ATTR_POISSON)) + ")");328}329// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes330SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myPersonBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(personTag));331// obtain personFlow parameters332SUMOVehicleParameter* personFlowParameters = SUMOVehicleParserHelper::parseFlowAttributes(SUMO_TAG_PERSONFLOW, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);333// check personParameters334if (personFlowParameters) {335myPersonBaseObject->setVehicleParameter(personFlowParameters);336// parse vehicle337routeHandler.parseSumoBaseObject(myPersonBaseObject);338// delete personParameters339delete personFlowParameters;340}341}342// refresh person and personPlan attributes343myPersonAttributesEditor->refreshAttributesEditor();344myPersonPlanAttributesEditor->refreshAttributesEditor();345// return created person346return myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(personTag, myPersonBaseObject->getStringAttribute(SUMO_ATTR_ID));347}348349/****************************************************************************/350351352