Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
SUMOVehicleParameter.cpp
Go to the documentation of this file.
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/****************************************************************************/
20// Structure representing possible vehicle parameter
21/****************************************************************************/
22#include <config.h>
30
32
33// ===========================================================================
34// member method definitions
35// ===========================================================================
36
38 : tag(SUMO_TAG_NOTHING), vtypeid(DEFAULT_VTYPE_ID), color(RGBColor::DEFAULT_COLOR),
39 depart(-1), departProcedure(DepartDefinition::GIVEN),
40 departLane(0), departLaneProcedure(DepartLaneDefinition::DEFAULT),
41 departPos(0), departPosProcedure(DepartPosDefinition::DEFAULT),
42 departPosLat(0), departPosLatProcedure(DepartPosLatDefinition::DEFAULT),
43 departSpeed(-1), departSpeedProcedure(DepartSpeedDefinition::DEFAULT),
44 departEdge(0), departEdgeProcedure(RouteIndexDefinition::DEFAULT),
45 arrivalLane(0), arrivalLaneProcedure(ArrivalLaneDefinition::DEFAULT),
46 arrivalPos(0), arrivalPosProcedure(ArrivalPosDefinition::DEFAULT),
47 arrivalPosLat(0), arrivalPosLatProcedure(ArrivalPosLatDefinition::DEFAULT),
48 arrivalSpeed(-1), arrivalSpeedProcedure(ArrivalSpeedDefinition::DEFAULT),
49 arrivalEdge(-1), arrivalEdgeProcedure(RouteIndexDefinition::DEFAULT),
50 repetitionNumber(-1),
51 repetitionsDone(-1),
52 repetitionOffset(-1),
53 repetitionTotalOffset(0),
54 repetitionProbability(-1),
55 poissonRate(0),
56 repetitionEnd(-1),
57 line(), fromTaz(), toTaz(), personNumber(0), containerNumber(0),
58 speedFactor(-1),
59 calibratorSpeed(-1),
60 insertionChecks((int)InsertionCheck::ALL),
61 parametersSet(0)
62{ }
63
64
67
68
69bool
70SUMOVehicleParameter::defaultOptionOverrides(const OptionsCont& oc, const std::string& optionName) const {
71 return oc.exists(optionName) && oc.isSet(optionName) && oc.getBool("defaults-override");
72}
73
74
75void
76SUMOVehicleParameter::write(OutputDevice& dev, const OptionsCont& oc, const SumoXMLTag altTag, const std::string& typeID) const {
77 if (!id.empty()) {
78 // only used by calibrator flows
79 dev.openTag(altTag).writeAttr(SUMO_ATTR_ID, id);
80 }
81 if (typeID == "") {
84 }
85 } else {
86 dev.writeAttr(SUMO_ATTR_TYPE, typeID);
87 }
88 // write depart depending of tag
89 if (altTag == SUMO_TAG_FLOW
90 || altTag == SUMO_TAG_PERSONFLOW
91 || altTag == SUMO_TAG_CONTAINERFLOW
92 || altTag == GNE_TAG_FLOW_ROUTE
93 || altTag == GNE_TAG_FLOW_WITHROUTE
94 || altTag == SUMO_TAG_FLOWSTATE) {
96 } else {
98 }
99 // optional parameter
100 // departlane
101 if (wasSet(VEHPARS_DEPARTLANE_SET) && !defaultOptionOverrides(oc, "departlane")) {
103 } else if (oc.exists("departlane") && oc.isSet("departlane")) {
104 dev.writeNonEmptyAttr(SUMO_ATTR_DEPARTLANE, oc.getString("departlane"));
105 }
106 // departpos
107 if (wasSet(VEHPARS_DEPARTPOS_SET) && !defaultOptionOverrides(oc, "departpos")) {
109 } else if (oc.exists("departpos") && oc.isSet("departpos")) {
110 dev.writeNonEmptyAttr(SUMO_ATTR_DEPARTPOS, oc.getString("departpos"));
111 }
112 // departPosLat
115 }
116 // departspeed
117 if (wasSet(VEHPARS_DEPARTSPEED_SET) && !defaultOptionOverrides(oc, "departspeed")) {
119 } else if (oc.exists("departspeed") && oc.isSet("departspeed")) {
120 dev.writeNonEmptyAttr(SUMO_ATTR_DEPARTSPEED, oc.getString("departspeed"));
121 }
122 // departedge
123 if (wasSet(VEHPARS_DEPARTEDGE_SET) && !defaultOptionOverrides(oc, "departedge")) {
125 } else if (oc.exists("departedge") && oc.isSet("departedge")) {
126 dev.writeNonEmptyAttr(SUMO_ATTR_DEPARTEDGE, oc.getString("departedge"));
127 }
128 // arrivallane
129 if (wasSet(VEHPARS_ARRIVALLANE_SET) && !defaultOptionOverrides(oc, "arrivallane")) {
131 } else if (oc.exists("arrivallane") && oc.isSet("arrivallane")) {
132 dev.writeNonEmptyAttr(SUMO_ATTR_ARRIVALLANE, oc.getString("arrivallane"));
133 }
134 // arrivalpos
135 if (wasSet(VEHPARS_ARRIVALPOS_SET) && !defaultOptionOverrides(oc, "arrivalpos")) {
137 } else if (oc.exists("arrivalpos") && oc.isSet("arrivalpos")) {
138 dev.writeNonEmptyAttr(SUMO_ATTR_ARRIVALPOS, oc.getString("arrivalpos"));
139 }
140 // arrivalPosLat
143 }
144 // arrivalspeed
145 if (wasSet(VEHPARS_ARRIVALSPEED_SET) && !defaultOptionOverrides(oc, "arrivalspeed")) {
147 } else if (oc.exists("arrivalspeed") && oc.isSet("arrivalspeed")) {
148 dev.writeNonEmptyAttr(SUMO_ATTR_ARRIVALSPEED, oc.getString("arrivalspeed"));
149 }
150 // arrivalEdge
151 if (wasSet(VEHPARS_ARRIVALEDGE_SET) && !defaultOptionOverrides(oc, "arrivaledge") && arrivalEdge >= 0) {
153 } else if (oc.exists("arrivaledge") && oc.isSet("arrivaledge")) {
154 dev.writeNonEmptyAttr(SUMO_ATTR_ARRIVALEDGE, oc.getString("arrivaledge"));
155 }
156 // color
159 }
160 // line
163 }
164 // from TAZ
167 }
168 // to TAZ
171 }
172 // person number
175 }
176 // container number
179 }
180 // individual speedFactor
182 // might be saving state with custom precision
183 const int precision = dev.getPrecision();
184 dev.setPrecision(MAX2(gPrecisionRandom, precision));
186 dev.setPrecision(precision);
187 }
188 // speed (only used by calibrators)
191 }
192 // insertionChecks
194 std::vector<std::string> checks;
196 checks.push_back(toString(InsertionCheck::NONE));
197 } else {
199 if (((int)it & insertionChecks) != 0) {
200 checks.push_back(toString(it));
201 }
202 }
203 }
205 }
206 // parking access rights
209 }
210}
211
212
213void
214SUMOVehicleParameter::Stop::write(OutputDevice& dev, const bool close, const bool writeTagAndParents) const {
215 if (writeTagAndParents) {
217 if (busstop != "") {
219 }
220 if (containerstop != "") {
222 }
223 if (chargingStation != "") {
225 }
226 if (parkingarea != "") {
228 }
229 if ((busstop == "") && (containerstop == "") && (parkingarea == "") && (chargingStation == "")) {
230 if (lane != "") {
232 } else {
234 }
235 if ((parametersSet & STOP_START_SET) != 0) {
237 }
238 if ((parametersSet & STOP_END_SET) != 0) {
240 }
241 }
242 }
243 if (index > 0) {
245 }
248 }
249 if ((parametersSet & STOP_ARRIVAL_SET) && (arrival >= 0)) {
251 }
252 if ((parametersSet & STOP_DURATION_SET) && (duration >= 0)) {
254 }
255 if ((parametersSet & STOP_UNTIL_SET) && (until >= 0)) {
257 }
258 if ((parametersSet & STOP_STARTED_SET) && (started >= 0)) {
260 }
261 if ((parametersSet & STOP_ENDED_SET) && (ended >= 0)) {
263 }
264 if ((parametersSet & STOP_EXTENSION_SET) && (extension >= 0)) {
266 }
267 if ((parametersSet & STOP_TRIGGER_SET) != 0) {
268 const std::vector<std::string> triggers = getTriggers();
269 if (triggers.size() > 0) {
270 dev.writeAttr(SUMO_ATTR_TRIGGERED, triggers);
271 }
272 }
273 if ((parametersSet & STOP_PARKING_SET) != 0) {
275 }
276 if ((parametersSet & STOP_EXPECTED_SET) != 0 && awaitedPersons.size() > 0) {
278 }
279 if ((parametersSet & STOP_PERMITTED_SET) != 0 && permitted.size() > 0) {
281 }
284 }
285 if ((parametersSet & STOP_TRIP_ID_SET) != 0) {
287 }
288 if ((parametersSet & STOP_LINE_SET) != 0) {
290 }
291 if ((parametersSet & STOP_SPLIT_SET) != 0) {
293 }
294 if ((parametersSet & STOP_JOIN_SET) != 0) {
296 }
297 if ((parametersSet & STOP_SPEED_SET) != 0) {
299 }
300 if ((parametersSet & STOP_ONDEMAND_SET) != 0) {
302 }
303 if ((parametersSet & STOP_JUMP_SET) != 0 && jump >= 0) {
305 }
306 if ((parametersSet & STOP_JUMP_UNTIL_SET) != 0 && jumpUntil >= 0) {
308 }
309 if ((parametersSet & STOP_PRIORITY_SET) != 0 && priority >= 0) {
311 }
312 if (collision) {
314 }
315 // only write friendly position if is true
316 if (friendlyPos) {
318 }
319 // only write act type if isn't empty
320 if (!actType.empty()) {
322 }
323 if (close) {
324 // the user is closing the stop it is responsible for writing params
325 writeParams(dev);
326 dev.closeTag();
327 }
328}
329
330std::vector<std::string>
332 std::vector<std::string> result;
333 if (busstop != "") {
334 result.push_back(busstop);
335 }
336 if (containerstop != "") {
337 result.push_back(containerstop);
338 }
339 if (chargingStation != "") {
340 result.push_back(chargingStation);
341 }
342 if (parkingarea != "") {
343 result.push_back(parkingarea);
344 }
345 return result;
346}
347
348bool
349SUMOVehicleParameter::parseDepart(const std::string& val, const std::string& element, const std::string& id,
350 SUMOTime& depart, DepartDefinition& dd, std::string& error, const std::string& attr) {
351 if (val == "triggered") {
353 } else if (val == "containerTriggered") {
355 } else if (val == "now") {
356 // only used via TraCI. depart must be set by the calling code
358 } else if (val == "split") {
360 } else if (val == "begin") {
362 } else {
363 try {
364 depart = string2time(val);
366 if (depart < 0) {
367 error = "Negative " + attr + " time in the definition of " + element + " '" + id + "'.";
368 return false;
369 }
370 } catch (...) {
371 if (id.empty()) {
372 error = "Invalid " + attr + " time for " + element + ". Must be one of (\"triggered\", \"containerTriggered\", \"now\", or a float >= 0)";
373 } else {
374 error = "Invalid " + attr + " time for " + element + " '" + id + "';\n must be one of (\"triggered\", \"containerTriggered\", \"now\", or a float >= 0)";
375 }
376 return false;
377 }
378 }
379 return true;
380}
381
382
383bool
384SUMOVehicleParameter::parseDepartLane(const std::string& val, const std::string& element, const std::string& id,
385 int& lane, DepartLaneDefinition& dld, std::string& error) {
386 bool ok = true;
387 lane = 0;
389 if (val == "random") {
391 } else if (val == "free") {
393 } else if (val == "allowed") {
395 } else if (val == "best") {
397 } else if (val == "best_prob") {
399 } else if (val == "first") {
401 } else {
402 try {
403 lane = StringUtils::toInt(val);
404 if (lane < 0) {
405 ok = false;
406 }
407 } catch (...) {
408 ok = false;
409 }
410 }
411 if (!ok) {
412 if (id.empty()) {
413 error = "Invalid departLane definition for " + element + ". Must be one of (\"random\", \"free\", \"allowed\", \"best\", \"best_prob\", \"first\", or an int>=0)";
414 } else {
415 error = "Invalid departLane definition for " + element + " '" + id + "';\n must be one of (\"random\", \"free\", \"allowed\", \"best\", \"best_prob\", \"first\", or an int>=0)";
416 }
417 }
418 return ok;
419}
420
421
422bool
423SUMOVehicleParameter::parseDepartPos(const std::string& val, const std::string& element, const std::string& id,
424 double& pos, DepartPosDefinition& dpd, std::string& error) {
425 bool ok = true;
426 pos = 0.;
428 if (val == "random") {
430 } else if (val == "random_free") {
432 } else if (val == "random_location") {
434 } else if (val == "free") {
436 } else if (val == "base") {
438 } else if (val == "last") {
440 } else if (val == "splitFront") {
442 } else if (val == "stop") {
444 } else {
445 try {
446 pos = StringUtils::toDouble(val);
447 } catch (...) {
448 ok = false;
449 }
450 }
451 if (!ok) {
452 if (id.empty()) {
453 error = "Invalid departPos definition for " + element + ". Must be one of (\"random\", \"random_free\", \"free\", \"base\", \"last\" or a float)";
454 } else {
455 error = "Invalid departPos definition for " + element + " '" + id + "';\n must be one of (\"random\", \"random_free\", \"free\", \"base\", \"last\" or a float)";
456 }
457 }
458 return ok;
459}
460
461
462bool
463SUMOVehicleParameter::parseDepartPosLat(const std::string& val, const std::string& element, const std::string& id,
464 double& pos, DepartPosLatDefinition& dpd, std::string& error) {
465 bool ok = true;
466 pos = 0.;
468 if (val == "random") {
470 } else if (val == "random_free") {
472 } else if (val == "free") {
474 } else if (val == "right") {
476 } else if (val == "center") {
478 } else if (val == "left") {
480 } else {
481 try {
482 pos = StringUtils::toDouble(val);
483 } catch (...) {
484 ok = false;
485 }
486 }
487 if (!ok) {
488 if (id.empty()) {
489 error = "Invalid departPosLat definition for " + element + ". Must be one of (\"random\", \"random_free\", \"free\", \"right\", \"center\", \"left\", or a float)";
490 } else {
491 error = "Invalid departPosLat definition for " + element + " '" + id + "';\n must be one of (\"random\", \"random_free\", \"free\", \"right\", \"center\", \"left\", or a float)";
492 }
493 }
494 return ok;
495}
496
497
498bool
499SUMOVehicleParameter::parseDepartSpeed(const std::string& val, const std::string& element, const std::string& id,
500 double& speed, DepartSpeedDefinition& dsd, std::string& error) {
501 bool ok = true;
502 speed = -1.;
504 if (val == "random") {
506 } else if (val == "max") {
508 } else if (val == "desired") {
510 } else if (val == "speedLimit") {
512 } else if (val == "last") {
514 } else if (val == "avg") {
516 } else {
517 try {
518 speed = StringUtils::toDouble(val);
519 if (speed < 0) {
520 ok = false;
521 }
522 } catch (...) {
523 ok = false;
524 }
525 }
526 if (!ok) {
527 if (id.empty()) {
528 error = "Invalid departSpeed definition for " + element + ". Must be one of (\"random\", \"max\", or a float>=0)";
529 } else {
530 error = "Invalid departSpeed definition for " + element + " '" + id + "';\n must be one of (\"random\", \"max\", or a float>=0)";
531 }
532 }
533 return ok;
534}
535
536
537bool
538SUMOVehicleParameter::parseRouteIndex(const std::string& val, const std::string& element, const std::string& id,
539 const SumoXMLAttr attr, int& edgeIndex, RouteIndexDefinition& rid, std::string& error) {
540 bool ok = true;
541 edgeIndex = -1;
543 if (val == "random") {
545 } else {
546 try {
547 edgeIndex = StringUtils::toInt(val);
548 if (edgeIndex < 0) {
549 ok = false;
550 }
551 } catch (...) {
552 ok = false;
553 }
554 }
555 if (!ok) {
556 if (id.empty()) {
557 error = "Invalid " + toString(attr) + " definition for " + element + ". Must be one of (\"random\", \"free\", or an int>=0)";
558 } else {
559 error = "Invalid " + toString(attr) + " definition for " + element + " '" + id + "';\n must be one of (\"random\", \"free\", or an int>=0)";
560 }
561 }
562 return ok;
563}
564
565
566bool
567SUMOVehicleParameter::parseArrivalLane(const std::string& val, const std::string& element, const std::string& id,
568 int& lane, ArrivalLaneDefinition& ald, std::string& error) {
569 bool ok = true;
570 lane = 0;
572 if (val == "current") {
574 } else if (val == "random") {
576 } else if (val == "first") {
578 } else {
579 try {
580 lane = StringUtils::toInt(val);
581 if (lane < 0) {
582 ok = false;
583 }
584 } catch (...) {
585 ok = false;
586 }
587 }
588 if (!ok) {
589 if (id.empty()) {
590 error = "Invalid arrivalLane definition for " + element + ". Must be one of (\"current\", or an int>=0)";
591 } else {
592 error = "Invalid arrivalLane definition for " + element + " '" + id + "';\n must be one of (\"current\", or an int>=0)";
593 }
594 }
595 return ok;
596}
597
598
599bool
600SUMOVehicleParameter::parseArrivalPos(const std::string& val, const std::string& element, const std::string& id,
601 double& pos, ArrivalPosDefinition& apd, std::string& error) {
602 bool ok = true;
603 pos = 0.;
605 if (val == "random") {
607 } else if (val == "center") {
609 } else if (val == "max") {
611 } else {
612 try {
613 pos = StringUtils::toDouble(val);
614 } catch (...) {
615 ok = false;
616 }
617 }
618 if (!ok) {
619 if (id.empty()) {
620 error = "Invalid arrivalPos definition for " + element + ". Must be one of (\"random\", \"max\", or a float)";
621 } else {
622 error = "Invalid arrivalPos definition for " + element + " '" + id + "';\n must be one of (\"random\", \"max\", or a float)";
623 }
624 }
625 return ok;
626}
627
628
629bool
630SUMOVehicleParameter::parseArrivalPosLat(const std::string& val, const std::string& element, const std::string& id,
631 double& pos, ArrivalPosLatDefinition& apd, std::string& error) {
632 bool ok = true;
633 pos = 0.;
635 if (val == "right") {
637 } else if (val == "center") {
639 } else if (val == "left") {
641 } else {
642 try {
643 pos = StringUtils::toDouble(val);
644 } catch (...) {
645 ok = false;
646 }
647 }
648 if (!ok) {
649 if (id.empty()) {
650 error = "Invalid arrivalPosLat definition for " + element + ". Must be one of (\"right\", \"center\", \"left\", or a float)";
651 } else {
652 error = "Invalid arrivalPosLat definition for " + element + " '" + id + "';\n must be one of (\"right\", \"center\", \"left\", or a float)";
653 }
654 }
655 return ok;
656}
657
658
659bool
660SUMOVehicleParameter::parseArrivalSpeed(const std::string& val, const std::string& element, const std::string& id,
661 double& speed, ArrivalSpeedDefinition& asd, std::string& error) {
662 bool ok = true;
663 speed = -1.;
665 if (val == "current") {
667 } else {
668 try {
669 speed = StringUtils::toDouble(val);
670 if (speed < 0) {
671 ok = false;
672 }
673 } catch (...) {
674 ok = false;
675 }
676 }
677 if (!ok) {
678 if (id.empty()) {
679 error = "Invalid arrivalSpeed definition for " + element + ". Must be one of (\"current\", or a float>=0)";
680 } else {
681 error = "Invalid arrivalSpeed definition for " + element + " '" + id + "';\n must be one of (\"current\", or a float>=0)";
682 }
683 }
684 return ok;
685}
686
687
688double
689SUMOVehicleParameter::interpretEdgePos(double pos, double maximumValue, SumoXMLAttr attr, const std::string& id, bool silent) {
690 if (pos < 0) {
691 pos = maximumValue + pos;
692 }
693 if (pos > maximumValue && pos != std::numeric_limits<double>::infinity()) {
694 if (!silent) {
695 WRITE_WARNINGF(TL("Invalid % % given for %. Using edge end instead."), toString(attr), toString(pos), id);
696 }
697 pos = maximumValue;
698 }
699 return pos;
700}
701
702
703bool
704SUMOVehicleParameter::parsePersonModes(const std::string& modes, const std::string& element, const std::string& id, SVCPermissions& modeSet, std::string& error) {
705 // separte modes in different strings, and check if modes are valid
706 for (StringTokenizer st(modes); st.hasNext();) {
707 const std::string mode = st.next();
708 if (mode == "car") {
709 modeSet |= SVC_PASSENGER;
710 } else if (mode == "taxi") {
711 modeSet |= SVC_TAXI;
712 } else if (mode == "bicycle") {
713 modeSet |= SVC_BICYCLE;
714 } else if (mode == "public") {
715 modeSet |= SVC_BUS;
716 } else {
717 if (id.empty()) {
718 error = "Unknown person mode '" + mode + "'. Must be a combination of (\"car\", \"taxi\", \"bicycle\" or \"public\")";
719 } else {
720 error = "Unknown person mode '" + mode + "' for " + element + " '" + id + "';\n must be a combination of (\"car\", \"taxi\", \"bicycle\" or \"public\")";
721 }
722 return false;
723 }
724 }
725 return true;
726}
727
728
729void
730SUMOVehicleParameter::parseStopTriggers(const std::vector<std::string>& triggers, bool expectTrigger, Stop& stop) {
731 if (triggers.size() == 0 && expectTrigger) {
732 stop.triggered = true;
733 }
734 for (std::string val : triggers) {
735 if (val == toString(SUMO_TAG_PERSON)) {
736 stop.triggered = true;
737 } else if (val == toString(SUMO_TAG_CONTAINER)) {
738 stop.containerTriggered = true;
739 } else if (val == toString(SUMO_ATTR_JOIN)) {
740 stop.joinTriggered = true;
741 } else {
742 try {
743 stop.triggered = StringUtils::toBool(val);
744 } catch (BoolFormatException&) {
745 WRITE_ERROR(TL("Value of stop attribute 'trigger' must be 'person', 'container', 'join' or a boolean"));
746 }
747 }
748 }
749}
750
751
753SUMOVehicleParameter::parseParkingType(const std::string& value) {
754 if (value == toString(ParkingType::OPPORTUNISTIC)) {
756 } else {
758 }
759}
760
761
762std::vector<std::string>
764 std::vector<std::string> triggers;
765 if (triggered) {
766 triggers.push_back(toString(SUMO_TAG_PERSON));
767 }
768 if (containerTriggered) {
769 triggers.push_back(toString(SUMO_TAG_CONTAINER));
770 }
771 if (joinTriggered) {
772 triggers.push_back(toString(SUMO_ATTR_JOIN));
773 }
774 return triggers;
775}
776
777int
779 return (((parking == ParkingType::OFFROAD) ? 1 : 0) +
780 (triggered ? 2 : 0) +
781 (containerTriggered ? 4 : 0) +
782 (busstop != "" ? 8 : 0) +
783 (containerstop != "" ? 16 : 0) +
784 (chargingStation != "" ? 32 : 0) +
785 (parkingarea != "" ? 64 : 0) +
786 (overheadWireSegment != "" ? 128 : 0));
787}
788
789
790std::string
793 return "triggered";
795 return "containerTriggered";
796// } else if (departProcedure == DepartDefinition::NOW) { // TODO check whether this is useful in XML input (currently TraCI only)
797// return "now";
799 return "split";
801 return "begin";
802 } else {
803 return time2string(depart);
804 }
805}
806
807
808std::string
810 std::string val;
811 switch (departLaneProcedure) {
813 val = toString(departLane);
814 break;
816 val = "random";
817 break;
819 val = "free";
820 break;
822 val = "allowed";
823 break;
825 val = "best";
826 break;
828 val = "best_prob";
829 break;
831 val = "first";
832 break;
834 default:
835 break;
836 }
837 return val;
838}
839
840
841std::string
843 std::string val;
844 switch (departPosProcedure) {
846 val = toString(departPos);
847 break;
850 break;
852 val = "random";
853 break;
855 val = "random_free";
856 break;
858 val = "random_location";
859 break;
861 val = "free";
862 break;
864 val = "last";
865 break;
867 val = "base";
868 break;
870 val = "splitFront";
871 break;
873 val = "stop";
874 break;
876 default:
877 break;
878 }
879 return val;
880}
881
882
883std::string
885 std::string val;
886 switch (departPosLatProcedure) {
888 val = toString(departPosLat);
889 break;
892 break;
894 val = "random";
895 break;
897 val = "random_free";
898 break;
900 val = "free";
901 break;
903 val = "right";
904 break;
906 val = "center";
907 break;
909 val = "left";
910 break;
912 default:
913 break;
914 }
915 return val;
916}
917
918
919std::string
921 std::string val;
922 switch (departSpeedProcedure) {
924 val = toString(departSpeed);
925 break;
928 break;
930 val = "random";
931 break;
933 val = "max";
934 break;
936 val = "desired";
937 break;
939 val = "speedLimit";
940 break;
942 val = "last";
943 break;
945 val = "avg";
946 break;
948 default:
949 break;
950 }
951 return val;
952}
953
954
955std::string
957 std::string val;
958 switch (departEdgeProcedure) {
960 val = toString(departEdge);
961 break;
963 val = "random";
964 break;
966 default:
967 break;
968 }
969 return val;
970}
971
972std::string
974 std::string val;
975 switch (arrivalEdgeProcedure) {
977 val = toString(arrivalEdge);
978 break;
980 val = "random";
981 break;
983 default:
984 break;
985 }
986 return val;
987}
988
989
990
991
992std::string
994 std::string val;
995 switch (arrivalLaneProcedure) {
997 val = toString(arrivalLane);
998 break;
1000 val = "current";
1001 break;
1003 val = "random";
1004 break;
1006 val = "first";
1007 break;
1009 default:
1010 break;
1011 }
1012 return val;
1013}
1014
1015
1016std::string
1018 std::string val;
1019 switch (arrivalPosProcedure) {
1021 val = toString(arrivalPos);
1022 break;
1024 val = "random";
1025 break;
1027 val = "center";
1028 break;
1030 val = "max";
1031 break;
1033 default:
1034 break;
1035 }
1036 return val;
1037}
1038
1039
1040std::string
1042 std::string val;
1043 switch (arrivalPosLatProcedure) {
1045 val = toString(arrivalPosLat);
1046 break;
1048 val = "right";
1049 break;
1051 val = "center";
1052 break;
1054 val = "left";
1055 break;
1057 default:
1058 break;
1059 }
1060 return val;
1061}
1062
1063
1064std::string
1066 std::string val;
1067 switch (arrivalSpeedProcedure) {
1069 val = toString(arrivalSpeed);
1070 break;
1072 val = "current";
1073 break;
1075 default:
1076 break;
1077 }
1078 return val;
1079}
1080
1081
1082void
1085 // equidistant or exponential offset (for poisson distributed arrivals)
1086 if (repetitionProbability < 0) {
1087 if (repetitionOffset >= 0) {
1088 repetitionTotalOffset += (SUMOTime)((double)repetitionOffset / scale);
1089 } else {
1090 assert(poissonRate > 0);
1091 // we need to cache this do avoid double generation of the rng in the TIME2STEPS macro
1092 const double r = RandHelper::randExp(poissonRate, rng);
1093 repetitionTotalOffset += TIME2STEPS(r / scale);
1094 }
1095 }
1096}
1097
1098
1099std::string
1101 if ((insertionChecks == 0) || (insertionChecks == (int)InsertionCheck::ALL)) {
1103 } else {
1104 std::vector<std::string> insertionChecksStrs;
1105 const auto insertionCheckValues = SUMOXMLDefinitions::InsertionChecks.getValues();
1106 // iterate over values
1107 for (const auto insertionCheckValue : insertionCheckValues) {
1108 if ((insertionCheckValue != InsertionCheck::ALL) && (insertionChecks & (int)insertionCheckValue) != 0) {
1109 insertionChecksStrs.push_back(SUMOXMLDefinitions::InsertionChecks.getString(insertionCheckValue));
1110 }
1111 }
1112 return toString(insertionChecksStrs);
1113 }
1114}
1115
1116
1117bool
1118SUMOVehicleParameter::areInsertionChecksValid(const std::string& value) const {
1119 if (value.empty()) {
1120 return true;
1121 } else {
1122 // split value in substrinsg
1123 StringTokenizer valueStrs(value, " ");
1124 // iterate over values
1125 while (valueStrs.hasNext()) {
1126 if (!SUMOXMLDefinitions::InsertionChecks.hasString(valueStrs.next())) {
1127 return false;
1128 }
1129 }
1130 return true;
1131 }
1132}
1133
1134
1135int
1137 // first reset insertionChecks
1138 int result = 0;
1139 if (value.empty()) {
1140 return (int)InsertionCheck::ALL;
1141 } else {
1142 // split value in substrinsg
1143 StringTokenizer insertionCheckStrs(value, " ");
1144 while (insertionCheckStrs.hasNext()) {
1145 std::string val = insertionCheckStrs.next();
1146 if (SUMOXMLDefinitions::InsertionChecks.hasString(val)) {
1147 result |= (int)SUMOXMLDefinitions::InsertionChecks.get(val);
1148 } else {
1149 throw InvalidArgument("Unknown value '" + val + "' in " + toString(SUMO_ATTR_INSERTIONCHECKS) + ".");
1150 }
1151 }
1152 }
1153 return result;
1154}
1155
1156/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ DEFAULT
default cursor
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:288
#define WRITE_ERROR(msg)
Definition MsgHandler.h:296
#define TL(string)
Definition MsgHandler.h:305
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define TIME2STEPS(x)
Definition SUMOTime.h:57
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
const std::string DEFAULT_VTYPE_ID
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_TAXI
vehicle is a taxi
@ SVC_BUS
vehicle is a bus
const long long int VEHPARS_ARRIVALSPEED_SET
const long long int VEHPARS_DEPARTPOSLAT_SET
const long long int VEHPARS_ARRIVALPOSLAT_SET
const long long int VEHPARS_PERSON_NUMBER_SET
const long long int VEHPARS_DEPARTSPEED_SET
RouteIndexDefinition
Possible ways to choose the departure and arrival edge.
@ RANDOM
The edge is chosen randomly.
@ GIVEN
The edge index is given.
@ DEFAULT
No information given; use default.
const int STOP_ARRIVAL_SET
const int STOP_DURATION_SET
const int STOP_POSLAT_SET
const int STOP_EXPECTED_SET
DepartLaneDefinition
Possible ways to choose a lane on depart.
@ RANDOM
The lane is chosen randomly.
@ BEST_FREE
The least occupied lane from best lanes.
@ GIVEN
The lane is given.
@ ALLOWED_FREE
The least occupied lane from lanes which allow the continuation.
@ DEFAULT
No information given; use default.
@ FIRST_ALLOWED
The rightmost lane the vehicle may use.
@ FREE
The least occupied lane is used.
@ BEST_PROB
The lane most likely according the speedFactor (from best lanes)
ArrivalSpeedDefinition
Possible ways to choose the arrival speed.
@ GIVEN
The speed is given.
@ DEFAULT
No information given; use default.
@ CURRENT
The current speed is used.
DepartPosLatDefinition
Possible ways to choose the lateral departure position.
@ RANDOM
The lateral position is chosen randomly.
@ RIGHT
At the rightmost side of the lane.
@ GIVEN
The position is given.
@ GIVEN_VEHROUTE
The position is set by the vehroute device.
@ DEFAULT
No information given; use default.
@ LEFT
At the leftmost side of the lane.
@ FREE
A free lateral position is chosen.
@ CENTER
At the center of the lane.
@ RANDOM_FREE
If a fixed number of random choices fails, a free lateral position is chosen.
DepartPosDefinition
Possible ways to choose the departure position.
@ RANDOM
A random position is chosen.
@ GIVEN
The position is given.
@ GIVEN_VEHROUTE
The position is set by the vehroute device.
@ DEFAULT
No information given; use default.
@ STOP
depart position is endPos of first stop
@ FREE
A free position is chosen.
@ SPLIT_FRONT
depart position for a split vehicle is in front of the continuing vehicle
@ RANDOM_LOCATION
The position may be chosen freely in a polygon defined by a taz.
@ BASE
Back-at-zero position.
@ LAST
Insert behind the last vehicle as close as possible to still allow the specified departSpeed....
@ RANDOM_FREE
If a fixed number of random choices fails, a free position is chosen.
const int STOP_SPEED_SET
const int STOP_JUMP_UNTIL_SET
const int STOP_UNTIL_SET
const int STOP_LINE_SET
const int STOP_PARKING_SET
const int STOP_TRIP_ID_SET
ArrivalLaneDefinition
Possible ways to choose the arrival lane.
@ RANDOM
The lane is chosen randomly.
@ GIVEN
The arrival lane is given.
@ DEFAULT
No information given; use default.
@ FIRST_ALLOWED
The rightmost lane the vehicle may use.
@ CURRENT
The current lane shall be used.
const long long int VEHPARS_COLOR_SET
const int STOP_PERMITTED_SET
DepartSpeedDefinition
Possible ways to choose the departure speed.
@ RANDOM
The speed is chosen randomly.
@ MAX
The maximum safe speed is used.
@ GIVEN
The speed is given.
@ GIVEN_VEHROUTE
The speed is set by the vehroute device.
@ LIMIT
The maximum lane speed is used (speedLimit)
@ DEFAULT
No information given; use default.
@ DESIRED
The maximum lane speed is used (speedLimit * speedFactor)
@ LAST
The speed of the last vehicle. Fallback to DepartSpeedDefinition::DESIRED if there is no vehicle on t...
@ AVG
The average speed on the lane. Fallback to DepartSpeedDefinition::DESIRED if there is no vehicle on t...
const int STOP_SPLIT_SET
const long long int VEHPARS_TO_TAZ_SET
const long long int VEHPARS_ARRIVALLANE_SET
const long long int VEHPARS_DEPARTLANE_SET
const int STOP_START_SET
const long long int VEHPARS_DEPARTPOS_SET
const int STOP_JOIN_SET
const long long int VEHPARS_ARRIVALPOS_SET
const long long int VEHPARS_ARRIVALEDGE_SET
const int STOP_EXTENSION_SET
const long long int VEHPARS_CONTAINER_NUMBER_SET
const long long int VEHPARS_FROM_TAZ_SET
const long long int VEHPARS_PARKING_BADGES_SET
const int STOP_ENDED_SET
const long long int VEHPARS_SPEEDFACTOR_SET
const int STOP_TRIGGER_SET
const int STOP_PRIORITY_SET
const long long int VEHPARS_VTYPE_SET
ArrivalPosDefinition
Possible ways to choose the arrival position.
@ RANDOM
The arrival position is chosen randomly.
@ MAX
The maximum arrival position is used.
@ GIVEN
The arrival position is given.
@ DEFAULT
No information given; use default.
@ CENTER
Half the road length.
const int STOP_JUMP_SET
const int STOP_ONDEMAND_SET
const int STOP_END_SET
const int STOP_STARTED_SET
const int STOP_EXPECTED_CONTAINERS_SET
const long long int VEHPARS_CALIBRATORSPEED_SET
ArrivalPosLatDefinition
Possible ways to choose the lateral arrival position.
@ RIGHT
At the rightmost side of the lane.
@ GIVEN
The position is given.
@ DEFAULT
No information given; use default.
@ LEFT
At the leftmost side of the lane.
@ CENTER
At the center of the lane.
const long long int VEHPARS_LINE_SET
const long long int VEHPARS_DEPARTEDGE_SET
const long long int VEHPARS_INSERTION_CHECKS_SET
DepartDefinition
Possible ways to depart.
@ BEGIN
The departure is at simulation start.
@ GIVEN
The time is given.
@ NOW
The vehicle is discarded if emission fails (not fully implemented yet)
@ SPLIT
The departure is triggered by a train split.
@ CONTAINER_TRIGGERED
The departure is container triggered.
@ TRIGGERED
The departure is person triggered.
InsertionCheck
different checking levels for vehicle insertion
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_NOTHING
invalid tag, must be the last one
@ SUMO_TAG_CONTAINERFLOW
@ SUMO_TAG_FLOWSTATE
a flow state definition (used when saving and loading simulatino state)
@ SUMO_TAG_STOP
stop for vehicles
@ GNE_TAG_FLOW_ROUTE
a flow definition using a route instead of a from-to edges route
@ GNE_TAG_FLOW_WITHROUTE
description of a vehicle with an embedded route
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_CONTAINER
@ SUMO_TAG_PERSON
@ SUMO_TAG_PERSONFLOW
ParkingType
Numbers representing special SUMO-XML-attribute values Information on whether a car is parking on the...
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_STARTPOS
@ SUMO_ATTR_PARKING
@ SUMO_ATTR_EXTENSION
@ SUMO_ATTR_ARRIVALSPEED
@ SUMO_ATTR_LANE
@ SUMO_ATTR_ARRIVALLANE
@ SUMO_ATTR_DEPART
@ SUMO_ATTR_DEPARTEDGE
@ SUMO_ATTR_COLLISION
@ SUMO_ATTR_ARRIVALEDGE
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_STARTED
@ SUMO_ATTR_CONTAINER_STOP
@ SUMO_ATTR_PARKING_AREA
@ SUMO_ATTR_EDGE
@ SUMO_ATTR_DEPARTPOS_LAT
@ SUMO_ATTR_PARKING_BADGES
@ SUMO_ATTR_BUS_STOP
@ SUMO_ATTR_ENDPOS
@ SUMO_ATTR_ARRIVALPOS
@ SUMO_ATTR_SPLIT
@ SUMO_ATTR_ACTTYPE
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_POSITION_LAT
@ SUMO_ATTR_CONTAINER_NUMBER
@ SUMO_ATTR_EXPECTED
@ SUMO_ATTR_PRIORITY
@ SUMO_ATTR_LINE
@ SUMO_ATTR_CHARGING_STATION
@ SUMO_ATTR_DEPARTPOS
@ SUMO_ATTR_ENDED
@ SUMO_ATTR_ONDEMAND
@ SUMO_ATTR_INDEX
@ SUMO_ATTR_ARRIVAL
@ SUMO_ATTR_TO_TAZ
@ SUMO_ATTR_DEPARTSPEED
@ SUMO_ATTR_TRIP_ID
@ SUMO_ATTR_PERMITTED
@ SUMO_ATTR_FROM_TAZ
@ SUMO_ATTR_DEPARTLANE
@ SUMO_ATTR_JOIN
@ SUMO_ATTR_JUMP
@ SUMO_ATTR_FRIENDLY_POS
@ SUMO_ATTR_SPEEDFACTOR
@ SUMO_ATTR_EXPECTED_CONTAINERS
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_PERSON_NUMBER
@ SUMO_ATTR_COLOR
A color information.
@ SUMO_ATTR_ID
@ SUMO_ATTR_UNTIL
@ SUMO_ATTR_ARRIVALPOS_LAT
@ SUMO_ATTR_JUMP_UNTIL
@ SUMO_ATTR_INSERTIONCHECKS
@ SUMO_ATTR_TRIGGERED
@ SUMO_ATTR_DURATION
int gPrecision
the precision for floating point outputs
Definition StdDefs.cpp:26
int gPrecisionRandom
Definition StdDefs.cpp:29
const double INVALID_DOUBLE
invalid double
Definition StdDefs.h:68
T MAX2(T a, T b)
Definition StdDefs.h:86
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
Definition ToString.h:283
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
A storage for options typed value containers)
Definition OptionsCont.h:89
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool exists(const std::string &name) const
Returns the information whether the named option is known.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
OutputDevice & writeNonEmptyAttr(const SumoXMLAttr attr, const std::string &val)
writes a string attribute only if it is not the empty string and not the string "default"
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
int getPrecision()
Returns the precision of the underlying stream.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
static double randExp(double rate, SumoRNG *rng=nullptr)
Access to a random number from an exponential distribution.
Definition of vehicle stop (position and duration)
int getFlags() const
return flags as per Vehicle::getStops
SUMOTime started
the time at which this stop was reached
std::string edge
The edge to stop at.
ParkingType parking
whether the vehicle is removed from the net while stopping
std::string lane
The lane to stop at.
SUMOTime extension
The maximum time extension for boarding / loading.
bool friendlyPos
enable or disable friendly position (used by netedit)
double speed
the speed at which this stop counts as reached (waypoint mode)
std::string parkingarea
(Optional) parking area if one is assigned to the stop
std::string split
the id of the vehicle (train portion) that splits of upon reaching this stop
double startPos
The stopping position start.
std::string line
the new line id of the trip within a cyclical public transport route
double posLat
the lateral offset when stopping
bool onDemand
whether the stop may be skipped
std::string chargingStation
(Optional) charging station if one is assigned to the stop
std::vector< std::string > getTriggers() const
write trigger attribute
std::set< std::string > permitted
IDs of persons or containers that may board/load at this stop.
SUMOTime jumpUntil
earlierst jump end if there shall be a jump from this stop to the next route edge
int parametersSet
Information for the output which parameter were set.
double priority
priority for weighting/skipping stops
int index
at which position in the stops list
SUMOTime jump
transfer time if there shall be a jump from this stop to the next route edge
std::string join
the id of the vehicle (train portion) to which this vehicle shall be joined
SUMOTime until
The time at which the vehicle may continue its journey.
std::string actType
act Type (only used by Persons) (used by netedit)
bool triggered
whether an arriving person lets the vehicle continue
void write(OutputDevice &dev, const bool close=true, const bool writeTagAndParents=true) const
Writes the stop as XML.
SUMOTime ended
the time at which this stop was ended
double endPos
The stopping position end.
std::vector< std::string > getStoppingPlaceIDs() const
return list of stopping place ids
std::set< std::string > awaitedPersons
IDs of persons the vehicle has to wait for until departing.
std::set< std::string > awaitedContainers
IDs of containers the vehicle has to wait for until departing.
std::string busstop
(Optional) bus stop if one is assigned to the stop
bool joinTriggered
whether an joined vehicle lets this vehicle continue
std::string tripId
id of the trip within a cyclical public transport route
std::string containerstop
(Optional) container stop if one is assigned to the stop
bool containerTriggered
whether an arriving container lets the vehicle continue
bool collision
Whether this stop was triggered by a collision.
SUMOTime arrival
The (expected) time at which the vehicle reaches the stop.
SUMOTime duration
The stopping duration.
double departPosLat
(optional) The lateral position the vehicle shall depart from
double arrivalPosLat
(optional) The lateral position the vehicle shall arrive on
virtual ~SUMOVehicleParameter()
Destructor.
std::string getArrivalSpeed() const
obtain arrival speed parameter in string format
double repetitionProbability
The probability for emitting a vehicle per second.
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
ArrivalSpeedDefinition arrivalSpeedProcedure
Information how the vehicle's end speed shall be chosen.
double departSpeed
(optional) The initial speed of the vehicle
void incrementFlow(double scale, SumoRNG *rng=nullptr)
increment flow
std::string vtypeid
The vehicle's type id.
std::string getDepartLane() const
obtain depart lane parameter in string format
SUMOTime repetitionOffset
The time offset between vehicle reinsertions.
double speedFactor
individual speedFactor (overriding distribution from vType)
static bool parseArrivalLane(const std::string &val, const std::string &element, const std::string &id, int &lane, ArrivalLaneDefinition &ald, std::string &error)
Validates a given arrivalLane value.
int repetitionsDone
The number of times the vehicle was already inserted.
static bool parseArrivalPosLat(const std::string &val, const std::string &element, const std::string &id, double &pos, ArrivalPosLatDefinition &apd, std::string &error)
Validates a given arrivalPosLat value.
ArrivalLaneDefinition arrivalLaneProcedure
Information how the vehicle shall choose the lane to arrive on.
SUMOTime repetitionTotalOffset
The offset between depart and the time for the next vehicle insertions.
void write(OutputDevice &dev, const OptionsCont &oc, const SumoXMLTag altTag=SUMO_TAG_VEHICLE, const std::string &typeID="") const
Writes the parameters as a beginning element.
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
std::string getArrivalLane() const
obtain arrival lane parameter in string format
static bool parseDepartSpeed(const std::string &val, const std::string &element, const std::string &id, double &speed, DepartSpeedDefinition &dsd, std::string &error)
Validates a given departSpeed value.
static bool parseArrivalPos(const std::string &val, const std::string &element, const std::string &id, double &pos, ArrivalPosDefinition &apd, std::string &error)
Validates a given arrivalPos value.
int personNumber
The static number of persons in the vehicle when it departs (not including boarding persons)
static bool parseArrivalSpeed(const std::string &val, const std::string &element, const std::string &id, double &speed, ArrivalSpeedDefinition &asd, std::string &error)
Validates a given arrivalSpeed value.
double poissonRate
The rate for emitting vehicles with a poisson distribution.
RouteIndexDefinition arrivalEdgeProcedure
Information how the vehicle's final edge shall be chosen.
DepartPosLatDefinition departPosLatProcedure
Information how the vehicle shall choose the lateral departure position.
SVCPermissions modes
The modes a person or container can use.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
std::string getDepartSpeed() const
obtain depart speed parameter in string format
std::string getArrivalPos() const
obtain arrival pos parameter in string format
std::string getDepart() const
obtain depart parameter in string format
double departPos
(optional) The position the vehicle shall depart from
std::string getDepartEdge() const
obtain depart edge parameter in string format
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
RGBColor color
The vehicle's color, TraCI may change this.
bool areInsertionChecksValid(const std::string &value) const
check if given insertion checks are valid
double arrivalPos
(optional) The position the vehicle shall arrive on
static int parseInsertionChecks(const std::string &value)
parses insertion checks
double calibratorSpeed
speed (used by calibrator flows
static bool parseDepartLane(const std::string &val, const std::string &element, const std::string &id, int &lane, DepartLaneDefinition &dld, std::string &error)
Validates a given departLane value.
std::string getInsertionChecks() const
get insertion checks in string format
std::string getArrivalEdge() const
obtain arrival edge parameter in string format
std::vector< std::string > parkingBadges
The parking access rights.
int departEdge
(optional) The initial edge within the route of the vehicle
static bool parseDepart(const std::string &val, const std::string &element, const std::string &id, SUMOTime &depart, DepartDefinition &dd, std::string &error, const std::string &attr="departure")
Validates a given depart value.
static bool parsePersonModes(const std::string &modes, const std::string &element, const std::string &id, SVCPermissions &modeSet, std::string &error)
Validates a given person modes value.
ArrivalPosDefinition arrivalPosProcedure
Information how the vehicle shall choose the arrival position.
static bool parseRouteIndex(const std::string &val, const std::string &element, const std::string &id, const SumoXMLAttr attr, int &edgeIndex, RouteIndexDefinition &rid, std::string &error)
Validates a given departEdge or arrivalEdge value.
static bool parseDepartPosLat(const std::string &val, const std::string &element, const std::string &id, double &pos, DepartPosLatDefinition &dpd, std::string &error)
Validates a given departPosLat value.
std::string getDepartPosLat() const
obtain depart pos lat parameter in string format
std::string getArrivalPosLat() const
obtain arrival pos lat parameter in string format
std::string getDepartPos() const
obtain depart pos parameter in string format
std::string toTaz
The vehicle's destination zone (district)
double arrivalSpeed
(optional) The final speed of the vehicle (not used yet)
static double interpretEdgePos(double pos, double maximumValue, SumoXMLAttr attr, const std::string &id, bool silent=false)
Interprets negative edge positions and fits them onto a given edge.
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
static bool parseDepartPos(const std::string &val, const std::string &element, const std::string &id, double &pos, DepartPosDefinition &dpd, std::string &error)
Validates a given departPos value.
int insertionChecks
bitset of InsertionCheck
bool defaultOptionOverrides(const OptionsCont &oc, const std::string &optionName) const
Returns whether the defaults shall be used.
int arrivalEdge
(optional) The final edge within the route of the vehicle
std::string fromTaz
The vehicle's origin zone (district)
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
std::string line
The vehicle's line (mainly for public transport)
int containerNumber
The static number of containers in the vehicle when it departs.
static ParkingType parseParkingType(const std::string &value)
parses parking type value
static void parseStopTriggers(const std::vector< std::string > &triggers, bool expectTrigger, Stop &stop)
parses stop trigger values
RouteIndexDefinition departEdgeProcedure
Information how the vehicle's initial edge shall be chosen.
ArrivalPosLatDefinition arrivalPosLatProcedure
Information how the vehicle shall choose the lateral arrival position.
static StringBijection< InsertionCheck > InsertionChecks
traffic light layouts
const std::string & getString(const T key) const
get string
std::vector< T > getValues() const
get all keys
bool hasNext()
returns the information whether further substrings exist
std::string next()
returns the next substring when it exists. Otherwise the behaviour is undefined
static std::string pruneZeros(const std::string &str, int max)
Removes trailing zeros (at most 'max')
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter