Path: blob/main/src/netedit/elements/demand/GNETranship.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 GNETranship.cpp14/// @author Pablo Alvarez Lopez15/// @date Jun 202116///17// A class for visualizing tranships in Netedit18/****************************************************************************/1920#include <netedit/changes/GNEChange_Attribute.h>21#include <netedit/GNENet.h>2223#include "GNETranship.h"242526// ===========================================================================27// method definitions28// ===========================================================================29#ifdef _MSC_VER30#pragma warning(push)31#pragma warning(disable: 4355) // mask warning about "this" in initializers32#endif33GNETranship::GNETranship(SumoXMLTag tag, GNENet* net) :34GNEDemandElement(net, tag),35GNEDemandElementPlan(this, -1, -1) {36}373839GNETranship::GNETranship(SumoXMLTag tag, GNEDemandElement* containerParent, const GNEPlanParents& planParameters,40const double departPosition, const double arrivalPosition, const double speed, const SUMOTime duration) :41GNEDemandElement(containerParent, tag),42GNEDemandElementPlan(this, departPosition, arrivalPosition),43mySpeed(speed),44myDuration(duration) {45// set parents46setParents<GNEJunction*>(planParameters.getJunctions());47setParents<GNEEdge*>(planParameters.getEdges());48setParents<GNEAdditional*>(planParameters.getAdditionalElements());49setParents<GNEDemandElement*>(planParameters.getDemandElements(containerParent));50// update centering boundary without updating grid51updatePlanCenteringBoundary(false);52}53#ifdef _MSC_VER54#pragma warning(pop)55#endif5657GNETranship::~GNETranship() {}585960GNEMoveElement*61GNETranship::getMoveElement() const {62return myMoveElementPlan;63}646566Parameterised*67GNETranship::getParameters() {68return nullptr;69}707172const Parameterised*73GNETranship::getParameters() const {74return nullptr;75}767778GUIGLObjectPopupMenu*79GNETranship::getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) {80return getPlanPopUpMenu(app, parent);81}828384void85GNETranship::writeDemandElement(OutputDevice& device) const {86// first write origin stop (if this element starts in a stoppingPlace)87writeOriginStop(device);88// write rest of attributes89device.openTag(SUMO_TAG_TRANSHIP);90writeLocationAttributes(device);91// speed92if (mySpeed != myTagProperty->getDefaultDoubleValue(SUMO_ATTR_SPEED)) {93device.writeAttr(SUMO_ATTR_SPEED, mySpeed);94}95// duration96if (myDuration != myTagProperty->getDefaultTimeValue(SUMO_ATTR_DURATION)) {97device.writeAttr(SUMO_ATTR_DURATION, time2string(myDuration));98}99device.closeTag();100}101102103GNEDemandElement::Problem104GNETranship::isDemandElementValid() const {105return isPlanPersonValid();106}107108109std::string110GNETranship::getDemandElementProblem() const {111return getPersonPlanProblem();112}113114115void116GNETranship::fixDemandElementProblem() {117// currently the only solution is removing Tranship118}119120121SUMOVehicleClass122GNETranship::getVClass() const {123return SVC_IGNORING;124}125126127const RGBColor&128GNETranship::getColor() const {129return myNet->getViewNet()->getVisualisationSettings().colorSettings.transhipColor;130}131132133void134GNETranship::updateGeometry() {135updatePlanGeometry();136}137138139Position140GNETranship::getPositionInView() const {141return getPlanPositionInView();142}143144145std::string146GNETranship::getParentName() const {147return getParentDemandElements().front()->getID();148}149150151Boundary152GNETranship::getCenteringBoundary() const {153return getPlanCenteringBoundary();154}155156157void158GNETranship::splitEdgeGeometry(const double /*splitPosition*/, const GNENetworkElement* originalElement, const GNENetworkElement* newElement, GNEUndoList* undoList) {159// only split geometry of TranshipEdges160if (myTagProperty->getTag() == GNE_TAG_TRANSHIP_EDGES) {161// obtain new list of tranship edges162std::string newTranshipEdges = getNewListOfParents(originalElement, newElement);163// update tranship edges164if (newTranshipEdges.size() > 0) {165setAttribute(SUMO_ATTR_EDGES, newTranshipEdges, undoList);166}167}168}169170171void172GNETranship::drawGL(const GUIVisualizationSettings& s) const {173drawPlanGL(checkDrawContainerPlan(), s, s.colorSettings.transhipColor, s.colorSettings.selectedContainerPlanColor);174}175176177void178GNETranship::computePathElement() {179computePlanPathElement();180}181182183void184GNETranship::drawLanePartialGL(const GUIVisualizationSettings& s, const GNESegment* segment, const double offsetFront) const {185drawPlanLanePartial(checkDrawContainerPlan(), s, segment, offsetFront, s.widthSettings.transhipWidth, s.colorSettings.transhipColor, s.colorSettings.selectedContainerPlanColor);186}187188189void190GNETranship::drawJunctionPartialGL(const GUIVisualizationSettings& s, const GNESegment* segment, const double offsetFront) const {191drawPlanJunctionPartial(checkDrawContainerPlan(), s, segment, offsetFront, s.widthSettings.transhipWidth, s.colorSettings.transhipColor, s.colorSettings.selectedContainerPlanColor);192}193194195GNELane*196GNETranship::getFirstPathLane() const {197return getFirstPlanPathLane();198}199200201GNELane*202GNETranship::getLastPathLane() const {203return getLastPlanPathLane();204}205206207std::string208GNETranship::getAttribute(SumoXMLAttr key) const {209switch (key) {210case SUMO_ATTR_SPEED:211if (mySpeed == myTagProperty->getDefaultDoubleValue(key)) {212return "";213} else {214return toString(mySpeed);215}216case SUMO_ATTR_DURATION:217if (myDuration == myTagProperty->getDefaultTimeValue(key)) {218return "";219} else {220return time2string(myDuration);221}222default:223return getPlanAttribute(key);224}225}226227228double229GNETranship::getAttributeDouble(SumoXMLAttr key) const {230switch (key) {231case SUMO_ATTR_SPEED:232return mySpeed;233default:234return getPlanAttributeDouble(key);235}236}237238239Position240GNETranship::getAttributePosition(SumoXMLAttr key) const {241return getPlanAttributePosition(key);242}243244245void246GNETranship::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {247switch (key) {248case SUMO_ATTR_SPEED:249case SUMO_ATTR_DURATION:250GNEChange_Attribute::changeAttribute(this, key, value, undoList);251break;252default:253setPlanAttribute(key, value, undoList);254break;255}256}257258259bool260GNETranship::isValid(SumoXMLAttr key, const std::string& value) {261switch (key) {262case SUMO_ATTR_SPEED:263return canParse<double>(value) && (parse<double>(value) >= 0);264case SUMO_ATTR_DURATION:265return canParse<SUMOTime>(value) && (parse<SUMOTime>(value) >= 0);266default:267return isPlanValid(key, value);268}269}270271272bool273GNETranship::isAttributeEnabled(SumoXMLAttr key) const {274return isPlanAttributeEnabled(key);275}276277278std::string279GNETranship::getPopUpID() const {280return getTagStr();281}282283284std::string285GNETranship::getHierarchyName() const {286return getPlanHierarchyName();287}288289// ===========================================================================290// private291// ===========================================================================292293void294GNETranship::setAttribute(SumoXMLAttr key, const std::string& value) {295switch (key) {296case SUMO_ATTR_SPEED:297if (value.empty()) {298mySpeed = myTagProperty->getDefaultDoubleValue(key);299} else {300mySpeed = GNEAttributeCarrier::parse<double>(value);301}302break;303case SUMO_ATTR_DURATION:304if (value.empty()) {305myDuration = myTagProperty->getDefaultTimeValue(key);306} else {307myDuration = GNEAttributeCarrier::parse<SUMOTime>(value);308}309break;310default:311setPlanAttribute(key, value);312break;313}314}315316/****************************************************************************/317318319