Path: blob/main/src/netedit/frames/demand/GNEVehicleFrame.cpp
193904 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 GNEVehicleFrame.cpp14/// @author Pablo Alvarez Lopez15/// @date Jan 201816///17// The Widget for add Vehicles/Flows/Trips/etc. 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/GNEPathCreator.h>28#include <netedit/frames/GNEPathLegendModule.h>29#include <netedit/frames/GNETagSelector.h>30#include <utils/foxtools/MFXDynamicLabel.h>31#include <utils/gui/div/GUIDesigns.h>32#include <utils/vehicle/SUMOVehicleParserHelper.h>33#include <utils/xml/SUMOSAXAttributesImpl_Cached.h>3435#include "GNEVehicleFrame.h"3637// ===========================================================================38// method definitions39// ===========================================================================4041// ---------------------------------------------------------------------------42// GNEVehicleFrame::HelpCreation - methods43// ---------------------------------------------------------------------------4445GNEVehicleFrame::HelpCreation::HelpCreation(GNEVehicleFrame* vehicleFrameParent) :46GNEGroupBoxModule(vehicleFrameParent, TL("Help")),47myVehicleFrameParent(vehicleFrameParent) {48myInformationLabel = new MFXDynamicLabel(getCollapsableFrame(), "", 0, GUIDesignLabelFrameInformation);49}505152GNEVehicleFrame::HelpCreation::~HelpCreation() {}535455void56GNEVehicleFrame::HelpCreation::showHelpCreation() {57// first update help cration58updateHelpCreation();59// show modul60show();61}626364void65GNEVehicleFrame::HelpCreation::hideHelpCreation() {66hide();67}6869void70GNEVehicleFrame::HelpCreation::updateHelpCreation() {71// create information label72std::ostringstream information;73// set text depending of selected vehicle type74switch (myVehicleFrameParent->myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag()) {75// vehicles76case SUMO_TAG_VEHICLE:77information78<< "- " << TL("Click over a route to create a vehicle.");79break;80case SUMO_TAG_TRIP:81information82<< "- " << TL("Select two edges to create a trip.");83break;84case GNE_TAG_VEHICLE_WITHROUTE:85information86<< "- " << TL("Select two edges to create a vehicle with embedded route.");87break;88case GNE_TAG_TRIP_JUNCTIONS:89information90<< "- " << TL("Select two junctions to create a trip.");91break;92case GNE_TAG_TRIP_TAZS:93information94<< "- " << TL("Select two TAZS to create a trip.");95break;96// flows97case GNE_TAG_FLOW_ROUTE:98information99<< "- " << TL("Click over a route to create a routeFlow.");100break;101case SUMO_TAG_FLOW:102information103<< "- " << TL("Select two edges to create a flow.");104break;105case GNE_TAG_FLOW_WITHROUTE:106information107<< "- " << TL("Select two edges to create a flow with embedded route.");108break;109case GNE_TAG_FLOW_JUNCTIONS:110information111<< "- " << TL("Select two junctions to create a flow.");112break;113case GNE_TAG_FLOW_TAZS:114information115<< "- " << TL("Select two TAZs to create a flow.");116break;117default:118break;119}120// set information label121myInformationLabel->setText(information.str().c_str());122}123124// ---------------------------------------------------------------------------125// GNEVehicleFrame - methods126// ---------------------------------------------------------------------------127128GNEVehicleFrame::GNEVehicleFrame(GNEViewParent* viewParent, GNEViewNet* viewNet) :129GNEFrame(viewParent, viewNet, TL("Vehicles")),130myVehicleBaseObject(new CommonXMLStructure::SumoBaseObject(nullptr)) {131132// Create item Selector module for vehicles133myVehicleTagSelector = new GNETagSelector(this, GNETagProperties::Type::VEHICLE, SUMO_TAG_TRIP);134135// Create vehicle type selector and set DEFAULT_VTYPE_ID as default element136myTypeSelector = new GNEDemandElementSelector(this, SUMO_TAG_VTYPE, GNETagProperties::Type::VEHICLE);137138// Create attributes editor139myVehicleAttributesEditor = new GNEAttributesEditor(this, GNEAttributesEditorType::EditorType::CREATOR);140141// create GNEPathCreator Module142myPathCreator = new GNEPathCreator(this, viewNet->getNet()->getDemandPathManager());143144// Create Help Creation Module145myHelpCreation = new HelpCreation(this);146147// create legend label148myPathLegend = new GNEPathLegendModule(this);149}150151152GNEVehicleFrame::~GNEVehicleFrame() {153delete myVehicleBaseObject;154}155156157void158GNEVehicleFrame::show() {159// refresh tag selector160myVehicleTagSelector->refreshTagSelector();161// show frame162GNEFrame::show();163}164165166void167GNEVehicleFrame::hide() {168// reset edge candidates169for (const auto& edge : myViewNet->getNet()->getAttributeCarriers()->getEdges()) {170edge.second->resetCandidateFlags();171}172// reset junctioncandidates173for (const auto& junction : myViewNet->getNet()->getAttributeCarriers()->getJunctions()) {174junction.second->resetCandidateFlags();175}176// hide frame177GNEFrame::hide();178}179180181bool182GNEVehicleFrame::addVehicle(const GNEViewNetHelper::ViewObjectsSelector& viewObjects, const GNEViewNetHelper::MouseButtonKeyPressed& mouseButtonKeyPressed) {183// check template AC184if (myVehicleTagSelector->getCurrentTemplateAC() == nullptr) {185return false;186}187// begin cleaning vehicle base object188myVehicleBaseObject->clear();189// obtain tag (only for improve code legibility)190SumoXMLTag vehicleTag = myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag();191const bool addEdge = ((vehicleTag == SUMO_TAG_TRIP) || (vehicleTag == GNE_TAG_VEHICLE_WITHROUTE) || (vehicleTag == SUMO_TAG_FLOW) || (vehicleTag == GNE_TAG_FLOW_WITHROUTE));192const bool addJunction = ((vehicleTag == GNE_TAG_TRIP_JUNCTIONS) || (vehicleTag == GNE_TAG_FLOW_JUNCTIONS));193const bool addTAZ = ((vehicleTag == GNE_TAG_TRIP_TAZS) || (vehicleTag == GNE_TAG_FLOW_TAZS));194// first check that current selected vehicle is valid195if (vehicleTag == SUMO_TAG_NOTHING) {196myViewNet->setStatusBarText(TL("Current selected vehicle isn't valid."));197return false;198}199// now check if VType is valid200if (myTypeSelector->getCurrentDemandElement() == nullptr) {201myViewNet->setStatusBarText(TL("Current selected vehicle type isn't valid."));202return false;203}204// add VType205myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TYPE, myTypeSelector->getCurrentDemandElement()->getID());206// set route or edges depending of vehicle type207if (myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->vehicleRoute()) {208return buildVehicleOverRoute(vehicleTag, viewObjects.getDemandElementFront());209} else if (addEdge && viewObjects.getEdgeFront()) {210// add clicked edge in GNEPathCreator211return myPathCreator->addEdge(viewObjects.getEdgeFront(), mouseButtonKeyPressed.shiftKeyPressed(), mouseButtonKeyPressed.controlKeyPressed());212} else if (addJunction && viewObjects.getJunctionFront()) {213// add clicked junction in GNEPathCreator214return myPathCreator->addJunction(viewObjects.getJunctionFront());215} else if (addTAZ && viewObjects.getTAZFront()) {216// add clicked TAZ in GNEPathCreator217return myPathCreator->addTAZ(viewObjects.getTAZFront());218} else {219return false;220}221}222223224GNETagSelector*225GNEVehicleFrame::getVehicleTagSelector() const {226return myVehicleTagSelector;227}228229230GNEDemandElementSelector*231GNEVehicleFrame::getTypeSelector() const {232return myTypeSelector;233}234235236GNEPathCreator*237GNEVehicleFrame::getPathCreator() const {238return myPathCreator;239}240241242GNEAttributesEditor*243GNEVehicleFrame::getVehicleAttributesEditor() const {244return myVehicleAttributesEditor;245}246247// ===========================================================================248// protected249// ===========================================================================250251void252GNEVehicleFrame::tagSelected() {253if (myVehicleTagSelector->getCurrentTemplateAC()) {254// show vehicle type selector modul255myTypeSelector->showDemandElementSelector();256// show path creator modul257myPathCreator->showPathCreatorModule(myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty(), false);258// check if show path legend259if (myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->vehicleRouteEmbedded()) {260myPathLegend->hidePathLegendModule();261} else {262myPathLegend->showPathLegendModule();263}264} else {265// hide all moduls if tag isn't valid266myTypeSelector->hideDemandElementSelector();267myVehicleAttributesEditor->hideAttributesEditor();268myPathCreator->hidePathCreatorModule();269myHelpCreation->hideHelpCreation();270myPathLegend->hidePathLegendModule();271}272}273274275void276GNEVehicleFrame::demandElementSelected() {277if (myTypeSelector->getCurrentDemandElement()) {278// show vehicle attributes modul279myVehicleAttributesEditor->showAttributesEditor(myVehicleTagSelector->getCurrentTemplateAC(), true);280// clear colors281myPathCreator->clearJunctionColors();282myPathCreator->clearEdgeColors();283// set current VTypeClass in pathCreator284myPathCreator->setVClass(myTypeSelector->getCurrentDemandElement()->getVClass());285// show path creator module286myPathCreator->showPathCreatorModule(myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty(), false);287// show help creation288myHelpCreation->showHelpCreation();289} else {290// hide all moduls if selected item isn't valid291myVehicleAttributesEditor->hideAttributesEditor();292myPathCreator->hidePathCreatorModule();293myPathLegend->hidePathLegendModule();294myHelpCreation->hideHelpCreation();295}296}297298299bool300GNEVehicleFrame::createPath(const bool useLastRoute) {301// first check if parameters are valid302if (myVehicleAttributesEditor->checkAttributes(true) && myTypeSelector->getCurrentDemandElement()) {303// obtain tag (only for improve code legibility)304SumoXMLTag vehicleTag = myVehicleTagSelector->getCurrentTemplateAC()->getTagProperty()->getTag();305// begin cleaning vehicle base object306myVehicleBaseObject->clear();307// Updated myVehicleBaseObject308myVehicleAttributesEditor->fillSumoBaseObject(myVehicleBaseObject);309// add VType310myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TYPE, myTypeSelector->getCurrentDemandElement()->getID());311// declare route handler312GNERouteHandler routeHandler(myViewNet->getNet(), myViewNet->getNet()->getACTemplates()->getTemplateAC(vehicleTag)->getFileBucket(),313myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed(), true);314// check if use last route315if (useLastRoute) {316// build vehicle using last route317return buildVehicleOverRoute(vehicleTag, myViewNet->getLastCreatedRoute());318} else {319// extract via attribute320std::vector<std::string> viaEdges;321for (int i = 1; i < ((int)myPathCreator->getSelectedEdges().size() - 1); i++) {322viaEdges.push_back(myPathCreator->getSelectedEdges().at(i)->getID());323}324// continue depending of tag325if ((vehicleTag == SUMO_TAG_TRIP) && (myPathCreator->getSelectedEdges().size() > 0)) {326// set tag327myVehicleBaseObject->setTag(SUMO_TAG_TRIP);328// Add parameter departure329if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {330myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");331}332// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes333SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));334// obtain trip parameters335SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);336tripParameters->setParameters(myVehicleBaseObject->getParameters());337// check trip parameters338if (tripParameters) {339myVehicleBaseObject->setVehicleParameter(tripParameters);340myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM, myPathCreator->getSelectedEdges().front()->getID());341myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO, myPathCreator->getSelectedEdges().back()->getID());342myVehicleBaseObject->addStringListAttribute(SUMO_ATTR_VIA, viaEdges);343// parse vehicle344routeHandler.parseSumoBaseObject(myVehicleBaseObject);345// delete tripParameters and base object346delete tripParameters;347}348} else if ((vehicleTag == GNE_TAG_VEHICLE_WITHROUTE) && (myPathCreator->getPath().size() > 0)) {349// set tag350myVehicleBaseObject->setTag(SUMO_TAG_VEHICLE);351// Add parameter departure352if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {353myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");354}355// get route edges356std::vector<std::string> routeEdges;357for (const auto& subPath : myPathCreator->getPath()) {358for (const auto& edge : subPath.getSubPath()) {359routeEdges.push_back(edge->getID());360}361}362// avoid consecutive duplicated edges363routeEdges.erase(std::unique(routeEdges.begin(), routeEdges.end()), routeEdges.end());364// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes365SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));366// obtain vehicle parameters367SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);368vehicleParameters->setParameters(myVehicleBaseObject->getParameters());369// continue depending of vehicleParameters370if (vehicleParameters) {371myVehicleBaseObject->setVehicleParameter(vehicleParameters);372// create route base object373CommonXMLStructure::SumoBaseObject* embeddedRouteObject = new CommonXMLStructure::SumoBaseObject(myVehicleBaseObject);374embeddedRouteObject->setTag(SUMO_TAG_ROUTE);375embeddedRouteObject->addStringListAttribute(SUMO_ATTR_EDGES, routeEdges);376embeddedRouteObject->addColorAttribute(SUMO_ATTR_COLOR, RGBColor::INVISIBLE);377embeddedRouteObject->addIntAttribute(SUMO_ATTR_REPEAT, 0);378embeddedRouteObject->addTimeAttribute(SUMO_ATTR_CYCLETIME, 0);379embeddedRouteObject->addDoubleAttribute(SUMO_ATTR_PROB, 1.0);380// parse route381routeHandler.parseSumoBaseObject(myVehicleBaseObject);382// delete vehicleParamters383delete vehicleParameters;384}385} else if ((vehicleTag == SUMO_TAG_FLOW) && (myPathCreator->getSelectedEdges().size() > 0)) {386// set tag387myVehicleBaseObject->setTag(SUMO_TAG_FLOW);388// set flow attributes389updateFlowAttributes();390// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes391SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));392// obtain flow parameters393SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);394flowParameters->setParameters(myVehicleBaseObject->getParameters());395// check flowParameters396if (flowParameters) {397myVehicleBaseObject->setVehicleParameter(flowParameters);398myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM, myPathCreator->getSelectedEdges().front()->getID());399myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO, myPathCreator->getSelectedEdges().back()->getID());400myVehicleBaseObject->addStringListAttribute(SUMO_ATTR_VIA, viaEdges);401// parse vehicle402routeHandler.parseSumoBaseObject(myVehicleBaseObject);403// delete flowParameters and base object404delete flowParameters;405}406} else if ((vehicleTag == GNE_TAG_FLOW_WITHROUTE) && (myPathCreator->getPath().size() > 0)) {407// set tag408myVehicleBaseObject->setTag(SUMO_TAG_FLOW);409// set flow attributes410updateFlowAttributes();411// get route edges412std::vector<std::string> routeEdges;413for (const auto& subPath : myPathCreator->getPath()) {414for (const auto& edge : subPath.getSubPath()) {415routeEdges.push_back(edge->getID());416}417}418// avoid consecutive duplicated edges419routeEdges.erase(std::unique(routeEdges.begin(), routeEdges.end()), routeEdges.end());420// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes421SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));422// obtain flow parameters423SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);424flowParameters->setParameters(myVehicleBaseObject->getParameters());425// continue depending of vehicleParameters426if (flowParameters) {427myVehicleBaseObject->setVehicleParameter(flowParameters);428// create under base object429CommonXMLStructure::SumoBaseObject* embeddedRouteObject = new CommonXMLStructure::SumoBaseObject(myVehicleBaseObject);430embeddedRouteObject->setTag(SUMO_TAG_ROUTE);431embeddedRouteObject->addStringListAttribute(SUMO_ATTR_EDGES, routeEdges);432embeddedRouteObject->addColorAttribute(SUMO_ATTR_COLOR, RGBColor::INVISIBLE);433embeddedRouteObject->addIntAttribute(SUMO_ATTR_REPEAT, 0);434embeddedRouteObject->addTimeAttribute(SUMO_ATTR_CYCLETIME, 0);435embeddedRouteObject->addDoubleAttribute(SUMO_ATTR_PROB, 1.0);436// parse route437routeHandler.parseSumoBaseObject(myVehicleBaseObject);438// delete vehicleParamters439delete flowParameters;440}441} else if ((vehicleTag == GNE_TAG_TRIP_JUNCTIONS) && (myPathCreator->getSelectedJunctions().size() > 0)) {442// set tag443myVehicleBaseObject->setTag(SUMO_TAG_TRIP);444// Add parameter departure445if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {446myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");447}448// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes449SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));450// obtain trip parameters451SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);452tripParameters->setParameters(myVehicleBaseObject->getParameters());453// check trip parameters454if (tripParameters) {455myVehicleBaseObject->setVehicleParameter(tripParameters);456myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, myPathCreator->getSelectedJunctions().front()->getID());457myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_JUNCTION, myPathCreator->getSelectedJunctions().back()->getID());458// parse vehicle459routeHandler.parseSumoBaseObject(myVehicleBaseObject);460// delete tripParameters and base object461delete tripParameters;462}463} else if ((vehicleTag == GNE_TAG_TRIP_TAZS) && (myPathCreator->getSelectedTAZs().size() > 0)) {464// set tag465myVehicleBaseObject->setTag(SUMO_TAG_TRIP);466// Add parameter departure467if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {468myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");469}470// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes471SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));472// obtain trip parameters473SUMOVehicleParameter* tripParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);474tripParameters->setParameters(myVehicleBaseObject->getParameters());475// check trip parameters476if (tripParameters) {477myVehicleBaseObject->setVehicleParameter(tripParameters);478myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_TAZ, myPathCreator->getSelectedTAZs().front()->getID());479myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_TAZ, myPathCreator->getSelectedTAZs().back()->getID());480// parse vehicle481routeHandler.parseSumoBaseObject(myVehicleBaseObject);482// delete tripParameters and base object483delete tripParameters;484}485} else if ((vehicleTag == GNE_TAG_FLOW_JUNCTIONS) && (myPathCreator->getSelectedJunctions().size() > 0)) {486// set tag487myVehicleBaseObject->setTag(SUMO_TAG_FLOW);488// set flow attributes489updateFlowAttributes();490// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes491SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));492// obtain flow parameters493SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);494flowParameters->setParameters(myVehicleBaseObject->getParameters());495// check flowParameters496if (flowParameters) {497myVehicleBaseObject->setVehicleParameter(flowParameters);498myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_JUNCTION, myPathCreator->getSelectedJunctions().front()->getID());499myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_JUNCTION, myPathCreator->getSelectedJunctions().back()->getID());500// parse vehicle501routeHandler.parseSumoBaseObject(myVehicleBaseObject);502// delete flowParameters and base object503delete flowParameters;504}505} else if ((vehicleTag == GNE_TAG_FLOW_TAZS) && (myPathCreator->getSelectedTAZs().size() > 0)) {506// set tag507myVehicleBaseObject->setTag(SUMO_TAG_FLOW);508// set flow attributes509updateFlowAttributes();510// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes511SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));512// obtain flow parameters513SUMOVehicleParameter* flowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);514flowParameters->setParameters(myVehicleBaseObject->getParameters());515// check flowParameters516if (flowParameters) {517myVehicleBaseObject->setVehicleParameter(flowParameters);518myVehicleBaseObject->addStringAttribute(SUMO_ATTR_FROM_TAZ, myPathCreator->getSelectedTAZs().front()->getID());519myVehicleBaseObject->addStringAttribute(SUMO_ATTR_TO_TAZ, myPathCreator->getSelectedTAZs().back()->getID());520// parse vehicle521routeHandler.parseSumoBaseObject(myVehicleBaseObject);522// delete flowParameters and base object523delete flowParameters;524}525}526// abort path creation527myPathCreator->abortPathCreation();528// refresh attributes editor529myVehicleAttributesEditor->refreshAttributesEditor();530return true;531}532}533return false;534}535536537bool538GNEVehicleFrame::buildVehicleOverRoute(SumoXMLTag vehicleTag, GNEDemandElement* route) {539if (route && (route->getTagProperty()->isRoute())) {540// now check if parameters are valid541if (!myVehicleAttributesEditor->checkAttributes(true)) {542return false;543}544// get vehicle attributes545myVehicleAttributesEditor->fillSumoBaseObject(myVehicleBaseObject);546// declare route handler547GNERouteHandler routeHandler(myViewNet->getNet(), route->getFileBucket(),548myViewNet->getViewParent()->getGNEAppWindows()->isUndoRedoAllowed(), true);549// check if departLane is valid550if ((route->getTagProperty()->getTag() == SUMO_TAG_ROUTE) && myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPARTLANE) &&551GNEAttributeCarrier::canParse<int>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTLANE))) {552const int departLane = GNEAttributeCarrier::parse<int>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTLANE));553if (departLane >= (int)route->getParentEdges().front()->getChildLanes().size()) {554myViewNet->setStatusBarText("Invalid " + toString(SUMO_ATTR_DEPARTLANE));555return false;556}557}558// check if departSpeed is valid559if (myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPARTSPEED) && GNEAttributeCarrier::canParse<double>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTSPEED))) {560double departSpeed = GNEAttributeCarrier::parse<double>(myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPARTSPEED));561if (departSpeed >= myTypeSelector->getCurrentDemandElement()->getAttributeDouble(SUMO_ATTR_MAXSPEED)) {562myViewNet->setStatusBarText("Invalid " + toString(SUMO_ATTR_DEPARTSPEED));563return false;564}565}566// check if we're creating a vehicle or a flow567if (vehicleTag == SUMO_TAG_VEHICLE) {568// set tag569myVehicleBaseObject->setTag(SUMO_TAG_VEHICLE);570// Add parameter departure571if (!myVehicleBaseObject->hasStringAttribute(SUMO_ATTR_DEPART) || myVehicleBaseObject->getStringAttribute(SUMO_ATTR_DEPART).empty()) {572myVehicleBaseObject->addStringAttribute(SUMO_ATTR_DEPART, "0");573}574// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes575SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));576// obtain vehicle parameters in vehicleParameters577SUMOVehicleParameter* vehicleParameters = SUMOVehicleParserHelper::parseVehicleAttributes(vehicleTag, SUMOSAXAttrs, false);578vehicleParameters->setParameters(myVehicleBaseObject->getParameters());579// check if vehicle was successfully created)580if (vehicleParameters) {581vehicleParameters->routeid = route->getID();582myVehicleBaseObject->setVehicleParameter(vehicleParameters);583// parse vehicle584routeHandler.parseSumoBaseObject(myVehicleBaseObject);585// delete vehicleParameters and sumoBaseObject586delete vehicleParameters;587}588} else {589// set tag590myVehicleBaseObject->setTag(SUMO_TAG_FLOW);591// set flow attributes592updateFlowAttributes();593// declare SUMOSAXAttributesImpl_Cached to convert valuesMap into SUMOSAXAttributes594SUMOSAXAttributesImpl_Cached SUMOSAXAttrs(myVehicleBaseObject->getAllAttributes(), getPredefinedTagsMML(), toString(vehicleTag));595// obtain routeFlow parameters in routeFlowParameters596SUMOVehicleParameter* routeFlowParameters = SUMOVehicleParserHelper::parseFlowAttributes(vehicleTag, SUMOSAXAttrs, false, true, 0, SUMOTime_MAX);597routeFlowParameters->setParameters(myVehicleBaseObject->getParameters());598// check if flow was successfully created)599if (routeFlowParameters) {600routeFlowParameters->routeid = route->getID();601myVehicleBaseObject->setVehicleParameter(routeFlowParameters);602// parse flow603routeHandler.parseSumoBaseObject(myVehicleBaseObject);604// delete vehicleParameters and sumoBaseObject605delete routeFlowParameters;606}607}608// center view after creation609const auto* vehicle = myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(myVehicleBaseObject->getTag(), myVehicleBaseObject->getStringAttribute(SUMO_ATTR_ID), false);610if (vehicle && !myViewNet->getVisibleBoundary().around(vehicle->getPositionInView())) {611myViewNet->centerTo(vehicle->getPositionInView(), false);612}613// refresh attributes editor614myVehicleAttributesEditor->refreshAttributesEditor();615// all ok, then return true;616return true;617} else {618myViewNet->setStatusBarText(toString(vehicleTag) + " has to be placed within a route.");619return false;620}621}622623624void625GNEVehicleFrame::updateFlowAttributes() {626// adjust poisson value627if (myVehicleBaseObject->hasDoubleAttribute(GNE_ATTR_POISSON)) {628myVehicleBaseObject->addStringAttribute(SUMO_ATTR_PERIOD, "exp(" + toString(myVehicleBaseObject->getDoubleAttribute(GNE_ATTR_POISSON)) + ")");629}630}631632/****************************************************************************/633634635