Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2025 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 ROMARouteHandler.cpp
15 : /// @author Daniel Krajzewicz
16 : /// @author Jakob Erdmann
17 : /// @author Sascha Krieg
18 : /// @author Michael Behrisch
19 : /// @date Mon, 9 Jul 2001
20 : ///
21 : // Parser and container for routes during their loading
22 : /****************************************************************************/
23 : #include <config.h>
24 :
25 : #include <utils/common/MsgHandler.h>
26 : #include <utils/options/OptionsCont.h>
27 : #include <utils/vehicle/SUMOVehicleParameter.h>
28 : #include <utils/vehicle/SUMOVehicleParserHelper.h>
29 : #include <od/ODMatrix.h>
30 : #include "ROMARouteHandler.h"
31 :
32 :
33 : // ===========================================================================
34 : // method definitions
35 : // ===========================================================================
36 80 : ROMARouteHandler::ROMARouteHandler(ODMatrix& matrix) :
37 80 : SUMOSAXHandler(""), myMatrix(matrix),
38 80 : myIgnoreTaz(OptionsCont::getOptions().getBool("ignore-taz")),
39 80 : myScale(OptionsCont::getOptions().getFloat("scale")),
40 160 : myNumLoaded(0) {
41 160 : if (OptionsCont::getOptions().isSet("taz-param")) {
42 2 : myTazParamKeys = OptionsCont::getOptions().getStringVector("taz-param");
43 : }
44 80 : }
45 :
46 :
47 80 : ROMARouteHandler::~ROMARouteHandler() {
48 80 : }
49 :
50 :
51 : void
52 1353 : ROMARouteHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) {
53 1353 : if (element == SUMO_TAG_TRIP || element == SUMO_TAG_VEHICLE || element == SUMO_TAG_FLOW) {
54 1104 : myVehicleParameter = (element == SUMO_TAG_FLOW
55 12 : ? SUMOVehicleParserHelper::parseFlowAttributes(SUMO_TAG_FLOW, attrs, true, true, 0, TIME2STEPS(3600))
56 1092 : : SUMOVehicleParserHelper::parseVehicleAttributes(element, attrs, true));
57 1104 : if (!myVehicleParameter->wasSet(VEHPARS_FROM_TAZ_SET) || myIgnoreTaz) {
58 68 : if (attrs.hasAttribute(SUMO_ATTR_FROM)) {
59 70 : myVehicleParameter->fromTaz = attrs.getString(SUMO_ATTR_FROM);
60 33 : } else if (attrs.hasAttribute(SUMO_ATTR_FROM_JUNCTION)) {
61 66 : myVehicleParameter->fromTaz = attrs.getString(SUMO_ATTR_FROM_JUNCTION) + "-source";
62 : }
63 :
64 : }
65 1104 : if (!myVehicleParameter->wasSet(VEHPARS_TO_TAZ_SET) || myIgnoreTaz) {
66 68 : if (attrs.hasAttribute(SUMO_ATTR_TO)) {
67 70 : myVehicleParameter->toTaz = attrs.getString(SUMO_ATTR_TO);
68 33 : } else if (attrs.hasAttribute(SUMO_ATTR_TO_JUNCTION)) {
69 66 : myVehicleParameter->toTaz = attrs.getString(SUMO_ATTR_TO_JUNCTION) + "-sink";
70 : }
71 : }
72 249 : } else if (element == SUMO_TAG_PARAM && !myTazParamKeys.empty()) {
73 22 : if (attrs.getString(SUMO_ATTR_KEY) == myTazParamKeys[0]) {
74 11 : myVehicleParameter->fromTaz = attrs.getString(SUMO_ATTR_VALUE);
75 11 : myVehicleParameter->parametersSet |= VEHPARS_FROM_TAZ_SET;
76 : }
77 44 : if (myTazParamKeys.size() > 1 && attrs.getString(SUMO_ATTR_KEY) == myTazParamKeys[1]) {
78 11 : myVehicleParameter->toTaz = attrs.getString(SUMO_ATTR_VALUE);
79 11 : myVehicleParameter->parametersSet |= VEHPARS_TO_TAZ_SET;
80 : }
81 : }
82 1353 : }
83 :
84 :
85 : void
86 1353 : ROMARouteHandler::myEndElement(int element) {
87 1353 : if (element == SUMO_TAG_TRIP || element == SUMO_TAG_VEHICLE || element == SUMO_TAG_FLOW) {
88 1104 : if (myVehicleParameter->fromTaz == "" || myVehicleParameter->toTaz == "") {
89 0 : WRITE_WARNINGF(TL("No origin or no destination given, ignoring '%'!"), myVehicleParameter->id);
90 : } else {
91 : int quota = 1;
92 : SUMOTime departOffset = 0;
93 1104 : if (element == SUMO_TAG_FLOW) {
94 : int flowSize = 1;
95 12 : double flowDur = STEPS2TIME(myVehicleParameter->repetitionEnd - myVehicleParameter->depart);
96 12 : if (myVehicleParameter->repetitionNumber != std::numeric_limits<int>::max()) {
97 : flowSize = myVehicleParameter->repetitionNumber;
98 0 : } else if (myVehicleParameter->poissonRate > 0) {
99 0 : flowSize = (int)(flowDur * myVehicleParameter->poissonRate);
100 0 : } else if (myVehicleParameter->repetitionProbability > 0) {
101 0 : flowSize = (int)(flowDur * myVehicleParameter->repetitionProbability);
102 : }
103 12 : quota = (int)(flowSize * myScale + 0.5);
104 12 : myNumLoaded += flowSize;
105 12 : departOffset = TIME2STEPS(flowDur) / quota;
106 : } else {
107 1092 : quota = getScalingQuota(myScale, myNumLoaded);
108 1092 : myNumLoaded += 1;
109 : }
110 1104 : SUMOTime depart = myVehicleParameter->depart;
111 2608 : for (int i = 0; i < quota; i++) {
112 1504 : SUMOVehicleParameter veh = *myVehicleParameter;
113 4512 : veh.id = i == 0 ? myVehicleParameter->id : myVehicleParameter->id + "." + toString(i);
114 1504 : veh.depart = depart;
115 2965 : myMatrix.add(veh,
116 1504 : !myVehicleParameter->wasSet(VEHPARS_FROM_TAZ_SET) || myIgnoreTaz,
117 1504 : !myVehicleParameter->wasSet(VEHPARS_TO_TAZ_SET) || myIgnoreTaz);
118 1504 : depart += departOffset;
119 1504 : }
120 : }
121 1104 : delete myVehicleParameter;
122 : }
123 1353 : }
124 :
125 :
126 : /****************************************************************************/
|