Path: blob/main/src/netedit/elements/demand/GNEPersonTrip.cpp
185790 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 GNEPersonTrip.cpp14/// @author Pablo Alvarez Lopez15/// @date Jun 201916///17// A class for visualizing person trips in Netedit18/****************************************************************************/1920#include <netedit/changes/GNEChange_Attribute.h>21#include <netedit/GNENet.h>2223#include "GNEPersonTrip.h"242526// ===========================================================================27// method definitions28// ===========================================================================29#ifdef _MSC_VER30#pragma warning(push)31#pragma warning(disable: 4355) // mask warning about "this" in initializers32#endif33GNEPersonTrip::GNEPersonTrip(SumoXMLTag tag, GNENet* net) :34GNEDemandElement(net, tag),35GNEDemandElementPlan(this, -1, -1) {36}373839GNEPersonTrip::GNEPersonTrip(SumoXMLTag tag, GNEDemandElement* personParent, const GNEPlanParents& planParameters,40const double arrivalPosition, const std::vector<std::string>& types, const std::vector<std::string>& modes,41const std::vector<std::string>& lines, const double walkFactor, const std::string& group) :42GNEDemandElement(personParent, tag),43GNEDemandElementPlan(this, -1, arrivalPosition),44myVTypes(types),45myModes(modes),46myLines(lines),47myWalkFactor(walkFactor),48myGroup(group) {49// set parents50setParents<GNEJunction*>(planParameters.getJunctions());51setParents<GNEEdge*>(planParameters.getEdges());52setParents<GNEAdditional*>(planParameters.getAdditionalElements());53setParents<GNEDemandElement*>(planParameters.getDemandElements(personParent));54// update centering boundary without updating grid55updatePlanCenteringBoundary(false);56}57#ifdef _MSC_VER58#pragma warning(pop)59#endif6061GNEPersonTrip::~GNEPersonTrip() {}626364GNEMoveElement*65GNEPersonTrip::getMoveElement() const {66return myMoveElementPlan;67}686970Parameterised*71GNEPersonTrip::getParameters() {72return nullptr;73}747576const Parameterised*77GNEPersonTrip::getParameters() const {78return nullptr;79}808182GUIGLObjectPopupMenu*83GNEPersonTrip::getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) {84return getPlanPopUpMenu(app, parent);85}868788void89GNEPersonTrip::writeDemandElement(OutputDevice& device) const {90// first write origin stop (if this element starts in a stoppingPlace)91writeOriginStop(device);92// write rest of attributes93device.openTag(SUMO_TAG_PERSONTRIP);94writeLocationAttributes(device);95if (myModes.size() > 0) {96device.writeAttr(SUMO_ATTR_MODES, myModes);97}98if (myLines.size() > 0) {99device.writeAttr(SUMO_ATTR_LINES, myLines);100}101if (myVTypes.size() > 0) {102device.writeAttr(SUMO_ATTR_VTYPES, myVTypes);103}104if (myWalkFactor > 0) {105device.writeAttr(SUMO_ATTR_WALKFACTOR, myWalkFactor);106}107if (myGroup.size() > 0) {108device.writeAttr(SUMO_ATTR_GROUP, myGroup);109}110device.closeTag();111}112113114GNEDemandElement::Problem115GNEPersonTrip::isDemandElementValid() const {116return isPlanPersonValid();117}118119120std::string121GNEPersonTrip::getDemandElementProblem() const {122return getPersonPlanProblem();123}124125126void127GNEPersonTrip::fixDemandElementProblem() {128// currently the only solution is removing PersonTrip129}130131132SUMOVehicleClass133GNEPersonTrip::getVClass() const {134return SVC_PEDESTRIAN;135}136137138const RGBColor&139GNEPersonTrip::getColor() const {140return myNet->getViewNet()->getVisualisationSettings().colorSettings.personTripColor;141}142143144void145GNEPersonTrip::updateGeometry() {146updatePlanGeometry();147}148149150Position151GNEPersonTrip::getPositionInView() const {152return getPlanPositionInView();153}154155156std::string157GNEPersonTrip::getParentName() const {158return getParentDemandElements().front()->getID();159}160161162Boundary163GNEPersonTrip::getCenteringBoundary() const {164return getPlanCenteringBoundary();165}166167168void169GNEPersonTrip::splitEdgeGeometry(const double /*splitPosition*/, const GNENetworkElement* /*originalElement*/, const GNENetworkElement* /*newElement*/, GNEUndoList* /*undoList*/) {170// geometry of this element cannot be splitted171}172173174void175GNEPersonTrip::drawGL(const GUIVisualizationSettings& s) const {176drawPlanGL(checkDrawPersonPlan(), s, s.colorSettings.personTripColor, s.colorSettings.selectedPersonPlanColor);177}178179180void181GNEPersonTrip::computePathElement() {182computePlanPathElement();183}184185186void187GNEPersonTrip::drawLanePartialGL(const GUIVisualizationSettings& s, const GNESegment* segment, const double offsetFront) const {188drawPlanLanePartial(checkDrawPersonPlan(), s, segment, offsetFront, s.widthSettings.personTripWidth, s.colorSettings.personTripColor, s.colorSettings.selectedPersonPlanColor);189}190191192void193GNEPersonTrip::drawJunctionPartialGL(const GUIVisualizationSettings& s, const GNESegment* segment, const double offsetFront) const {194drawPlanJunctionPartial(checkDrawPersonPlan(), s, segment, offsetFront, s.widthSettings.personTripWidth, s.colorSettings.personTripColor, s.colorSettings.selectedPersonPlanColor);195}196197198GNELane*199GNEPersonTrip::getFirstPathLane() const {200return getFirstPlanPathLane();201}202203204GNELane*205GNEPersonTrip::getLastPathLane() const {206return getLastPlanPathLane();207}208209210std::string211GNEPersonTrip::getAttribute(SumoXMLAttr key) const {212switch (key) {213// specific person plan attributes214case SUMO_ATTR_MODES:215return joinToString(myModes, " ");216case SUMO_ATTR_VTYPES:217return joinToString(myVTypes, " ");218case SUMO_ATTR_LINES:219return joinToString(myLines, " ");220case SUMO_ATTR_WALKFACTOR:221return toString(myWalkFactor);222case SUMO_ATTR_GROUP:223return toString(myGroup);224default:225return getPlanAttribute(key);226}227}228229230double231GNEPersonTrip::getAttributeDouble(SumoXMLAttr key) const {232switch (key) {233case SUMO_ATTR_WALKFACTOR:234return myWalkFactor;235default:236return getPlanAttributeDouble(key);237}238}239240241Position242GNEPersonTrip::getAttributePosition(SumoXMLAttr key) const {243return getPlanAttributePosition(key);244}245246247void248GNEPersonTrip::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {249switch (key) {250case SUMO_ATTR_MODES:251case SUMO_ATTR_VTYPES:252case SUMO_ATTR_LINES:253case SUMO_ATTR_WALKFACTOR:254case SUMO_ATTR_GROUP:255GNEChange_Attribute::changeAttribute(this, key, value, undoList);256break;257default:258setPlanAttribute(key, value, undoList);259break;260}261}262263264bool265GNEPersonTrip::isValid(SumoXMLAttr key, const std::string& value) {266switch (key) {267// specific person plan attributes268case SUMO_ATTR_MODES: {269SVCPermissions dummyModeSet;270std::string dummyError;271return SUMOVehicleParameter::parsePersonModes(value, myTagProperty->getTagStr(), "", dummyModeSet, dummyError);272}273case SUMO_ATTR_VTYPES:274case SUMO_ATTR_LINES:275return true;276case SUMO_ATTR_WALKFACTOR:277return canParse<double>(value) && (parse<double>(value) >= 0);278case SUMO_ATTR_GROUP:279return true;280default:281return isPlanValid(key, value);282}283}284285286bool287GNEPersonTrip::isAttributeEnabled(SumoXMLAttr key) const {288return isPlanAttributeEnabled(key);289}290291292std::string293GNEPersonTrip::getPopUpID() const {294return getTagStr();295}296297298std::string299GNEPersonTrip::getHierarchyName() const {300return getPlanHierarchyName();301}302303// ===========================================================================304// private305// ===========================================================================306307void308GNEPersonTrip::setAttribute(SumoXMLAttr key, const std::string& value) {309switch (key) {310// specific person plan attributes311case SUMO_ATTR_MODES:312myModes = GNEAttributeCarrier::parse<std::vector<std::string> >(value);313break;314case SUMO_ATTR_VTYPES:315myVTypes = GNEAttributeCarrier::parse<std::vector<std::string> >(value);316break;317case SUMO_ATTR_LINES:318myLines = GNEAttributeCarrier::parse<std::vector<std::string> >(value);319break;320case SUMO_ATTR_WALKFACTOR:321myWalkFactor = parse<double>(value);322break;323case SUMO_ATTR_GROUP:324myGroup = value;325break;326default:327setPlanAttribute(key, value);328break;329}330}331332/****************************************************************************/333334335