SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SUMOVehicleClass.cpp
Go to the documentation of this file.
1 /****************************************************************************/
10 // Definitions of SUMO vehicle classes and helper functions
11 /****************************************************************************/
12 // SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
13 // Copyright (C) 2001-2014 DLR (http://www.dlr.de/) and contributors
14 /****************************************************************************/
15 //
16 // This file is part of SUMO.
17 // SUMO is free software: you can redistribute it and/or modify
18 // it under the terms of the GNU General Public License as published by
19 // the Free Software Foundation, either version 3 of the License, or
20 // (at your option) any later version.
21 //
22 /****************************************************************************/
23 
24 
25 // ===========================================================================
26 // included modules
27 // ===========================================================================
28 #ifdef _MSC_VER
29 #include <windows_config.h>
30 #else
31 #include <config.h>
32 #endif
33 
34 #include <string>
35 #include <map>
36 #include "SUMOVehicleClass.h"
38 #include <utils/common/ToString.h>
41 
42 
43 #ifdef CHECK_MEMORY_LEAKS
44 #include <foreign/nvwa/debug_new.h>
45 #endif // CHECK_MEMORY_LEAKS
46 
47 
48 // ===========================================================================
49 // static members
50 // ===========================================================================
52  {"ignoring", SVC_IGNORING},
53  {"private", SVC_PRIVATE},
54  {"public_emergency", SVC_EMERGENCY}, // !!! deprecated
55  {"emergency", SVC_EMERGENCY},
56  {"public_authority", SVC_AUTHORITY}, // !!! deprecated
57  {"authority", SVC_AUTHORITY},
58  {"public_army", SVC_ARMY}, // !!! deprecated
59  {"army", SVC_ARMY},
60  {"vip", SVC_VIP},
61  {"passenger", SVC_PASSENGER},
62  {"hov", SVC_HOV},
63  {"taxi", SVC_TAXI},
64  {"public_transport", SVC_BUS}, // !!! deprecated
65  {"bus", SVC_BUS},
66  {"coach", SVC_COACH},
67  {"delivery", SVC_DELIVERY},
68  {"transport", SVC_TRUCK},
69  {"truck", SVC_TRUCK},
70  {"trailer", SVC_TRAILER},
71  {"lightrail", SVC_TRAM}, // !!! deprecated
72  {"tram", SVC_TRAM},
73  {"cityrail", SVC_RAIL_URBAN}, // !!! deprecated
74  {"rail_urban", SVC_RAIL_URBAN},
75  {"rail_slow", SVC_RAIL}, // !!! deprecated
76  {"rail", SVC_RAIL},
77  {"rail_fast", SVC_RAIL_ELECTRIC}, // !!! deprecated
78  {"rail_electric", SVC_RAIL_ELECTRIC},
79  {"motorcycle", SVC_MOTORCYCLE},
80  {"moped", SVC_MOPED},
81  {"bicycle", SVC_BICYCLE},
82  {"pedestrian", SVC_PEDESTRIAN},
83  {"evehicle", SVC_E_VEHICLE},
84  {"custom1", SVC_CUSTOM1},
85  {"custom2", SVC_CUSTOM2}
86 };
87 
89  sumoVehicleClassStringInitializer, SVC_CUSTOM2, false);
90 
91 std::set<std::string> deprecatedVehicleClassesSeen;
92 
93 
95  {"pedestrian", SVS_PEDESTRIAN},
96  {"bicycle", SVS_BICYCLE},
97  {"moped", SVS_MOPED},
98  {"motorcycle", SVS_MOTORCYCLE},
99  {"passenger", SVS_PASSENGER},
100  {"passenger/sedan", SVS_PASSENGER_SEDAN},
101  {"passenger/hatchback", SVS_PASSENGER_HATCHBACK},
102  {"passenger/wagon", SVS_PASSENGER_WAGON},
103  {"passenger/van", SVS_PASSENGER_VAN},
104  {"delivery", SVS_DELIVERY},
105  {"transport", SVS_TRUCK}, // !!! deprecated
106  {"truck", SVS_TRUCK},
107  {"transport/semitrailer", SVS_TRUCK_SEMITRAILER}, // !!! deprecated
108  {"truck/semitrailer", SVS_TRUCK_SEMITRAILER},
109  {"transport/trailer", SVS_TRUCK_1TRAILER}, // !!! deprecated
110  {"truck/trailer", SVS_TRUCK_1TRAILER},
111  {"bus/city", SVS_BUS}, // !!! deprecated
112  {"bus", SVS_BUS},
113  {"bus/overland", SVS_BUS_COACH}, // !!! deprecated
114  {"bus/coach", SVS_BUS_COACH},
115  {"bus/flexible", SVS_BUS_FLEXIBLE},
116  {"bus/trolley", SVS_BUS_TROLLEY},
117  {"rail/slow", SVS_RAIL}, // !!! deprecated
118  {"rail/fast", SVS_RAIL}, // !!! deprecated
119  {"rail", SVS_RAIL},
120  {"rail/light", SVS_RAIL_CAR}, // !!! deprecated
121  {"rail/city", SVS_RAIL_CAR}, // !!! deprecated
122  {"rail/railcar", SVS_RAIL_CAR},
123  {"rail/cargo", SVS_RAIL_CARGO},
124  {"evehicle", SVS_E_VEHICLE},
125  {"ant", SVS_ANT},
126  {"", SVS_UNKNOWN}
127 };
128 
129 
131  sumoVehicleShapeStringInitializer, SVS_UNKNOWN, false);
132 
133 
134 // ===========================================================================
135 // additional constants
136 // ===========================================================================
137 
139 const SVCPermissions SVCAll = 2 * SUMOVehicleClass_MAX - 1; // all relevant bits set to 1
140 
141 
142 // ===========================================================================
143 // method definitions
144 // ===========================================================================
145 // ------------ Conversion of SUMOVehicleClass
146 
147 std::string
149  std::string ret;
150  const std::vector<std::string> names = SumoVehicleClassStrings.getStrings();
151  for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
152  if ((id & SumoVehicleClassStrings.get(*it))) {
153  ret += ("|" + *it);
154  }
155  }
156  if (ret.length() > 0) {
157  return ret.substr(1);
158  } else {
159  return ret;
160  }
161 }
162 
163 
164 std::string
166  if (permissions == SVCAll) {
167  return "all";
168  }
169  return joinToString(getVehicleClassNamesList(permissions), ' ');
170 }
171 
172 
173 std::vector<std::string>
176  const std::vector<std::string> classNames = SumoVehicleClassStrings.getStrings();
177  std::vector<std::string> result;
178  for (std::vector<std::string>::const_iterator it = classNames.begin(); it != classNames.end(); it++) {
179  const int svc = (int)SumoVehicleClassStrings.get(*it);
180  if ((svc & permissions) == svc && svc != SVC_IGNORING) {
181  result.push_back(*it);
182  }
183  }
184  return result;
185 }
186 
187 
189 getVehicleClassID(const std::string& name) {
190  if (SumoVehicleClassStrings.hasString(name)) {
191  return SumoVehicleClassStrings.get(name);
192  }
193  throw ProcessError("Unknown vehicle class '" + name + "'.");
194 }
195 
196 
197 int
198 getVehicleClassCompoundID(const std::string& name) {
199  int ret = SVC_IGNORING;
200  const std::vector<std::string> names = SumoVehicleClassStrings.getStrings();
201  for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
202  if (name.find(*it) != std::string::npos) {
203  ret = ret | (int) SumoVehicleClassStrings.get(*it);
204  }
205  }
206  return ret;
207 }
208 
209 
211 parseVehicleClasses(const std::string& allowedS) {
212  if (allowedS == "all") {
213  return SVCAll;
214  }
215  SVCPermissions result = 0;
216  StringTokenizer sta(allowedS, " ");
217  while (sta.hasNext()) {
218  const std::string s = sta.next();
219  const SUMOVehicleClass vc = getVehicleClassID(s);
220  const std::string& realName = SumoVehicleClassStrings.getString(vc);
221  if (realName != s) {
223  }
224  result |= vc;
225  }
226  return result;
227 }
228 
229 
230 bool
231 canParseVehicleClasses(const std::string& classes) {
232  if (classes == "all") {
233  return true;
234  }
235  StringTokenizer sta(classes, " ");
236  while (sta.hasNext()) {
237  if (!SumoVehicleClassStrings.hasString(sta.next())) {
238  return false;
239  }
240  }
241  return true;
242 }
243 
244 
245 extern SVCPermissions parseVehicleClasses(const std::string& allowedS, const std::string& disallowedS) {
246  if (allowedS.size() == 0 && disallowedS.size() == 0) {
247  return SVCAll;
248  } else if (allowedS.size() > 0 && disallowedS.size() > 0) {
249  WRITE_WARNING("SVCPermissions must be specified either via 'allow' or 'disallow'. Ignoring 'disallow'");
250  return parseVehicleClasses(allowedS);
251  } else if (allowedS.size() > 0) {
252  return parseVehicleClasses(allowedS);
253  } else {
254  return SVCAll & ~parseVehicleClasses(disallowedS);
255  }
256 }
257 
258 
260 parseVehicleClasses(const std::vector<std::string>& allowedS) {
261  SVCPermissions result = 0;
262  for (std::vector<std::string>::const_iterator i = allowedS.begin(); i != allowedS.end(); ++i) {
263  const SUMOVehicleClass vc = getVehicleClassID(*i);
264  const std::string& realName = SumoVehicleClassStrings.getString(vc);
265  if (realName != *i) {
266  WRITE_WARNING("The vehicle class '" + (*i) + "' is deprecated, use '" + realName + "' instead.");
267  }
268  result |= getVehicleClassID(*i);
269  }
270  return result;
271 }
272 
273 
275 getVehicleShapeID(const std::string& name) {
276  if (SumoVehicleShapeStrings.hasString(name)) {
277  return SumoVehicleShapeStrings.get(name);
278  } else {
279  throw ProcessError("Unknown vehicle shape '" + name + "'.");
280  }
281 }
282 
283 
284 std::string
286  return SumoVehicleShapeStrings.getString(id);
287 }
288 
289 
290 bool isRailway(SVCPermissions permissions) {
291  return (permissions & (SVC_RAIL_ELECTRIC | SVC_RAIL | SVC_RAIL_URBAN | SVC_TRAM)) > 0 && (permissions & SVC_PASSENGER) == 0;
292 }
293 
294 
295 bool isForbidden(SVCPermissions permissions) {
296  return (permissions & SVCAll) == 0;
297 }
298 
299 
300 const std::string DEFAULT_VTYPE_ID("DEFAULT_VEHTYPE");
301 
302 const SUMOReal DEFAULT_VEH_PROB(1.);
303 
304 const SUMOReal DEFAULT_PEDESTRIAN_SPEED(5. / 3.6);
305 
306 /****************************************************************************/
307 
SUMOVehicleClass getVehicleClassID(const std::string &name)
Returns the class id of the abstract class given by its name.
std::string getVehicleClassCompoundName(int id)
vehicle is a motorcycle
vehicle is a coach
render as a rail
std::set< std::string > deprecatedVehicleClassesSeen
is a pedestrian
std::string next()
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types...
StringBijection< SUMOVehicleShape > SumoVehicleShapeStrings(sumoVehicleShapeStringInitializer, SVS_UNKNOWN, false)
render as a motorcycle
vehicle is a not electrified rail
render as a transport vehicle
vehicle is a bicycle
render as a flexible city bus
int SVCPermissions
vehicle is a small delivery vehicle
std::vector< std::string > getVehicleClassNamesList(SVCPermissions permissions)
Returns the ids of the given classes, divided using a ' '.
vehicle is a light rail
render as a delivery vehicle
StringBijection< SUMOVehicleClass >::Entry sumoVehicleClassStringInitializer[]
StringBijection< SUMOVehicleShape >::Entry sumoVehicleShapeStringInitializer[]
render as a sedan passenger vehicle ("Stufenheck")
bool isForbidden(SVCPermissions permissions)
Returns whether an edge with the given permission is a forbidden edge.
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
const SVCPermissions SVCAll
vehicle is a HOV
vehicle is a (possibly fast moving) electric rail
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:200
authorities vehicles
vehicle is a city rail
std::string getVehicleShapeName(SUMOVehicleShape id)
Returns the class name of the shape class given by its id.
vehicle is a large transport vehicle
is a user-defined type
const int SUMOVehicleClass_MAX
const SUMOReal DEFAULT_VEH_PROB(1.)
render as a hatchback passenger vehicle ("Fliessheck")
render as a bus
army vehicles
private vehicles
not defined
render as a bicycle
render as a (city) rail without locomotive
int getVehicleClassCompoundID(const std::string &name)
Returns the OR'ed id of the compound class given by its name.
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
render as a van
StringBijection< SUMOVehicleClass > SumoVehicleClassStrings(sumoVehicleClassStringInitializer, SVC_CUSTOM2, false)
render as a passenger vehicle
const SUMOReal DEFAULT_PEDESTRIAN_SPEED(5./3.6)
std::string getVehicleClassNames(SVCPermissions permissions)
Returns the ids of the given classes, divided using a ' '.
vehicle is a passenger car (a "normal" car)
vehicle is a moped
bool canParseVehicleClasses(const std::string &classes)
Checks whether the given string contains only known vehicle classes.
render as a cargo train
vehicle is a taxi
vehicle is a bus
render as a giant ant
render as a pedestrian
render as a moped
SUMOVehicleShape
Definition of vehicle classes to differ between different appearences.
vip vehicles
vehicle is a large transport vehicle
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=OUTPUT_ACCURACY)
Definition: ToString.h:153
render as a (futuristic) e-vehicle
SUMOVehicleShape getVehicleShapeID(const std::string &name)
Returns the class id of the shape class given by its name.
#define SUMOReal
Definition: config.h:215
public emergency vehicles
render as a transport vehicle with one trailer
render as a wagon passenger vehicle ("Combi")
const std::string DEFAULT_VTYPE_ID("DEFAULT_VEHTYPE")
render as a coach
render as a semi-trailer transport vehicle ("Sattelschlepper")
vehicles ignoring classes
render as a trolley bus
is a user-defined type
is an electric vehicle