Path: blob/main/src/netedit/elements/demand/GNETransport.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 GNETransport.cpp14/// @author Pablo Alvarez Lopez15/// @date Jun 202116///17// A class for visualizing transports in Netedit18/****************************************************************************/1920#include <netedit/changes/GNEChange_Attribute.h>21#include <netedit/GNENet.h>2223#include "GNETransport.h"242526// ===========================================================================27// method definitions28// ===========================================================================29#ifdef _MSC_VER30#pragma warning(push)31#pragma warning(disable: 4355) // mask warning about "this" in initializers32#endif33GNETransport::GNETransport(SumoXMLTag tag, GNENet* net) :34GNEDemandElement(net, tag),35GNEDemandElementPlan(this, -1, -1) {36}373839GNETransport::GNETransport(SumoXMLTag tag, GNEDemandElement* containerParent, const GNEPlanParents& planParameters,40const double arrivalPosition, const std::vector<std::string>& lines, const std::string& group) :41GNEDemandElement(containerParent, tag),42GNEDemandElementPlan(this, -1, arrivalPosition),43myLines(lines),44myGroup(group) {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#endif565758GNETransport::~GNETransport() {}596061GNEMoveElement*62GNETransport::getMoveElement() const {63return myMoveElementPlan;64}656667Parameterised*68GNETransport::getParameters() {69return nullptr;70}717273const Parameterised*74GNETransport::getParameters() const {75return nullptr;76}777879GUIGLObjectPopupMenu*80GNETransport::getPopUpMenu(GUIMainWindow& app, GUISUMOAbstractView& parent) {81return getPlanPopUpMenu(app, parent);82}838485void86GNETransport::writeDemandElement(OutputDevice& device) const {87// first write origin stop (if this element starts in a stoppingPlace)88writeOriginStop(device);89// write rest of attributes90device.openTag(SUMO_TAG_TRANSPORT);91writeLocationAttributes(device);92if (myLines.size() > 0) {93device.writeAttr(SUMO_ATTR_LINES, myLines);94}95if (myGroup.size() > 0) {96device.writeAttr(SUMO_ATTR_GROUP, myGroup);97}98device.closeTag();99}100101102GNEDemandElement::Problem103GNETransport::isDemandElementValid() const {104return isPlanPersonValid();105}106107108std::string109GNETransport::getDemandElementProblem() const {110return getPersonPlanProblem();111}112113114void115GNETransport::fixDemandElementProblem() {116// currently the only solution is removing Transport117}118119120SUMOVehicleClass121GNETransport::getVClass() const {122return SVC_IGNORING;123}124125126const RGBColor&127GNETransport::getColor() const {128return myNet->getViewNet()->getVisualisationSettings().colorSettings.transportColor;129}130131132void133GNETransport::updateGeometry() {134updatePlanGeometry();135}136137138Position139GNETransport::getPositionInView() const {140return getPlanPositionInView();141}142143144std::string145GNETransport::getParentName() const {146return getParentDemandElements().front()->getID();147}148149150Boundary151GNETransport::getCenteringBoundary() const {152return getPlanCenteringBoundary();153}154155156void157GNETransport::splitEdgeGeometry(const double /*splitPosition*/, const GNENetworkElement* /*originalElement*/, const GNENetworkElement* /*newElement*/, GNEUndoList* /*undoList*/) {158// Nothing to do159}160161162void163GNETransport::drawGL(const GUIVisualizationSettings& s) const {164drawPlanGL(checkDrawContainerPlan(), s, s.colorSettings.transportColor, s.colorSettings.selectedContainerPlanColor);165}166167168void169GNETransport::computePathElement() {170computePlanPathElement();171}172173174void175GNETransport::drawLanePartialGL(const GUIVisualizationSettings& s, const GNESegment* segment, const double offsetFront) const {176drawPlanLanePartial(checkDrawContainerPlan(), s, segment, offsetFront, s.widthSettings.transportWidth, s.colorSettings.transportColor, s.colorSettings.selectedContainerPlanColor);177}178179180void181GNETransport::drawJunctionPartialGL(const GUIVisualizationSettings& s, const GNESegment* segment, const double offsetFront) const {182drawPlanJunctionPartial(checkDrawContainerPlan(), s, segment, offsetFront, s.widthSettings.transportWidth, s.colorSettings.transportColor, s.colorSettings.selectedContainerPlanColor);183}184185186GNELane*187GNETransport::getFirstPathLane() const {188return getFirstPlanPathLane();189}190191192GNELane*193GNETransport::getLastPathLane() const {194return getLastPlanPathLane();195}196197198std::string199GNETransport::getAttribute(SumoXMLAttr key) const {200switch (key) {201// specific person plan attributes202case SUMO_ATTR_LINES:203return joinToString(myLines, " ");204case SUMO_ATTR_GROUP:205return myGroup;206default:207return getPlanAttribute(key);208}209}210211212double213GNETransport::getAttributeDouble(SumoXMLAttr key) const {214return getPlanAttributeDouble(key);215}216217218Position219GNETransport::getAttributePosition(SumoXMLAttr key) const {220return getPlanAttributePosition(key);221}222223224void225GNETransport::setAttribute(SumoXMLAttr key, const std::string& value, GNEUndoList* undoList) {226switch (key) {227case SUMO_ATTR_LINES:228case SUMO_ATTR_GROUP:229GNEChange_Attribute::changeAttribute(this, key, value, undoList);230break;231default:232setPlanAttribute(key, value, undoList);233break;234}235}236237238bool239GNETransport::isValid(SumoXMLAttr key, const std::string& value) {240switch (key) {241// specific person plan attributes242case SUMO_ATTR_LINES:243return true;244case SUMO_ATTR_GROUP:245return true;246default:247return isPlanValid(key, value);248}249}250251252bool253GNETransport::isAttributeEnabled(SumoXMLAttr key) const {254return isPlanAttributeEnabled(key);255}256257258std::string259GNETransport::getPopUpID() const {260return getTagStr();261}262263264std::string265GNETransport::getHierarchyName() const {266return getPlanHierarchyName();267}268269// ===========================================================================270// private271// ===========================================================================272273void274GNETransport::setAttribute(SumoXMLAttr key, const std::string& value) {275switch (key) {276// specific person plan attributes277case SUMO_ATTR_LINES:278myLines = GNEAttributeCarrier::parse<std::vector<std::string> >(value);279break;280case SUMO_ATTR_GROUP:281myGroup = value;282break;283default:284setPlanAttribute(key, value);285break;286}287}288289/****************************************************************************/290291292