Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file MSStageTranship.cpp
15 : /// @author Melanie Weber
16 : /// @author Andreas Kendziorra
17 : /// @date Thu, 12 Jun 2014
18 : ///
19 : // The class for modelling transportable movements without interaction
20 : /****************************************************************************/
21 : #include <config.h>
22 :
23 : #include <string>
24 : #include <vector>
25 : #include <utils/iodevices/OutputDevice.h>
26 : #include <utils/options/OptionsCont.h>
27 : #include <utils/common/ToString.h>
28 : #include <utils/common/StringUtils.h>
29 : #include <utils/geom/GeomHelper.h>
30 : #include <microsim/MSNet.h>
31 : #include <microsim/MSEdge.h>
32 : #include <microsim/MSLane.h>
33 : #include <microsim/MSStoppingPlace.h>
34 : #include <microsim/transportables/MSPModel.h>
35 : #include <microsim/transportables/MSTransportableControl.h>
36 : #include <microsim/MSInsertionControl.h>
37 : #include <microsim/MSVehicle.h>
38 : #include <microsim/MSVehicleControl.h>
39 : #include "MSStageTranship.h"
40 :
41 :
42 : // ===========================================================================
43 : // method definitions
44 : // ===========================================================================
45 134051 : MSStageTranship::MSStageTranship(const std::vector<const MSEdge*>& route,
46 : MSStoppingPlace* toStop,
47 : double speed,
48 134051 : double departPos, double arrivalPos) :
49 268102 : MSStageMoving(MSStageType::TRANSHIP, route, "", toStop, speed, departPos, arrivalPos, 0., -1) {
50 134051 : myDepartPos = SUMOVehicleParameter::interpretEdgePos(
51 : departPos, myRoute.front()->getLength(), SUMO_ATTR_DEPARTPOS,
52 268102 : "container getting transhipped from " + myRoute.front()->getID());
53 134051 : myArrivalPos = SUMOVehicleParameter::interpretEdgePos(
54 : arrivalPos, route.back()->getLength(), SUMO_ATTR_ARRIVALPOS,
55 134051 : "container getting transhipped to " + route.back()->getID());
56 134051 : }
57 :
58 :
59 268102 : MSStageTranship::~MSStageTranship() {
60 268102 : }
61 :
62 :
63 : MSStage*
64 133564 : MSStageTranship::clone() const {
65 133564 : MSStage* const clon = new MSStageTranship(myRoute, myDestinationStop, mySpeed, myDepartPos, myArrivalPos);
66 133564 : clon->setParameters(*this);
67 133564 : return clon;
68 : }
69 :
70 :
71 : void
72 130239 : MSStageTranship::proceed(MSNet* net, MSTransportable* transportable, SUMOTime now, MSStage* previous) {
73 130239 : myDeparted = now;
74 : //MSPModel_NonInteracting moves the transportable straight from start to end in
75 : //a single step and assumes that moveToNextEdge is only called once)
76 : //therefore we define that the transportable is already on its destination edge
77 130239 : myRouteStep = myRoute.end() - 1;
78 130239 : myDepartPos = previous->getEdgePos(now);
79 130239 : if (transportable->isPerson()) {
80 0 : myPState = net->getPersonControl().getNonInteractingModel()->add(transportable, this, now);
81 0 : (*myRouteStep)->addTransportable(transportable);
82 : } else {
83 130239 : myPState = net->getContainerControl().getNonInteractingModel()->add(transportable, this, now);
84 130239 : (*myRouteStep)->addTransportable(transportable);
85 : }
86 130239 : }
87 :
88 :
89 : double
90 464 : MSStageTranship::getDistance() const {
91 464 : if (myArrived >= 0) {
92 464 : const SUMOTime duration = myArrived - myDeparted;
93 464 : return mySpeed * STEPS2TIME(duration);
94 : } else {
95 : return -1;
96 : }
97 : }
98 :
99 :
100 : void
101 464 : MSStageTranship::tripInfoOutput(OutputDevice& os, const MSTransportable* const) const {
102 464 : os.openTag("tranship");
103 928 : os.writeAttr("depart", time2string(myDeparted));
104 464 : os.writeAttr("departPos", myDepartPos);
105 928 : os.writeAttr("arrival", time2string(myArrived));
106 464 : os.writeAttr("arrivalPos", myArrivalPos);
107 928 : os.writeAttr("duration", myArrived >= 0 ? time2string(getDuration()) : "-1");
108 464 : os.writeAttr("routeLength", getDistance());
109 464 : os.writeAttr("maxSpeed", mySpeed);
110 464 : os.closeTag();
111 464 : }
112 :
113 :
114 : void
115 60 : MSStageTranship::routeOutput(const bool /*isPerson*/, OutputDevice& os, const bool withRouteLength, const MSStage* const /* previous */) const {
116 60 : os.openTag("tranship").writeAttr(SUMO_ATTR_EDGES, myRoute);
117 60 : std::string comment = "";
118 60 : if (myDestinationStop != nullptr) {
119 16 : os.writeAttr(toString(myDestinationStop->getElement()), myDestinationStop->getID());
120 16 : if (myDestinationStop->getMyName() != "") {
121 0 : comment = " <!-- " + StringUtils::escapeXML(myDestinationStop->getMyName(), true) + " -->";
122 : }
123 : }
124 60 : os.writeAttr(SUMO_ATTR_SPEED, mySpeed);
125 60 : if (withRouteLength) {
126 0 : os.writeAttr("routeLength", mySpeed * STEPS2TIME(myArrived - myDeparted));
127 : }
128 120 : if (OptionsCont::getOptions().getBool("vehroute-output.exit-times")) {
129 12 : os.writeAttr(SUMO_ATTR_STARTED, myDeparted >= 0 ? time2string(myDeparted) : "-1");
130 24 : os.writeAttr(SUMO_ATTR_ENDED, myArrived >= 0 ? time2string(myArrived) : "-1");
131 : }
132 120 : if (OptionsCont::getOptions().getBool("vehroute-output.cost")) {
133 0 : os.writeAttr(SUMO_ATTR_COST, getCosts());
134 : }
135 60 : os.closeTag(comment);
136 60 : }
137 :
138 :
139 : bool
140 128527 : MSStageTranship::moveToNextEdge(MSTransportable* transportable, SUMOTime currentTime, int /*prevDir*/, MSEdge* /* nextInternal */, const bool /* isReplay */) {
141 128527 : getEdge()->removeTransportable(transportable);
142 : // transship does a direct move so we are already at our destination
143 128527 : if (myDestinationStop != nullptr) {
144 26788 : myDestinationStop->addTransportable(transportable); //jakob
145 : }
146 128527 : if (!transportable->proceed(MSNet::getInstance(), currentTime)) {
147 128299 : if (transportable->isPerson()) {
148 0 : MSNet::getInstance()->getPersonControl().erase(transportable);
149 : } else {
150 128299 : MSNet::getInstance()->getContainerControl().erase(transportable);
151 : }
152 : }
153 128527 : return true;
154 : }
155 :
156 :
157 : std::string
158 0 : MSStageTranship::getStageSummary(const bool /*isPerson*/) const {
159 0 : const std::string dest = (getDestinationStop() == nullptr ?
160 0 : " edge '" + getDestination()->getID() + "'" :
161 0 : " stop '" + getDestinationStop()->getID() + "'");
162 0 : return "transhipped to " + dest;
163 : }
164 :
165 :
166 : /****************************************************************************/
|