Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
NLHandler.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-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/****************************************************************************/
23// The XML-Handler for network loading
24/****************************************************************************/
25#include <config.h>
26
27#include <string>
28#include "NLHandler.h"
31#include "NLDetectorBuilder.h"
32#include "NLTriggerBuilder.h"
41#include <microsim/MSGlobals.h>
42#include <microsim/MSLane.h>
43#include <microsim/MSJunction.h>
50#include <mesosim/MESegment.h>
55#include <utils/shapes/Shape.h>
56
57
58// ===========================================================================
59// method definitions
60// ===========================================================================
61NLHandler::NLHandler(const std::string& file, MSNet& net,
62 NLDetectorBuilder& detBuilder,
63 NLTriggerBuilder& triggerBuilder,
64 NLEdgeControlBuilder& edgeBuilder,
65 NLJunctionControlBuilder& junctionBuilder) :
66 MSRouteHandler(file, true),
67 myNet(net), myActionBuilder(net),
68 myCurrentIsInternalToSkip(false),
69 myDetectorBuilder(detBuilder), myTriggerBuilder(triggerBuilder),
70 myEdgeControlBuilder(edgeBuilder), myJunctionControlBuilder(junctionBuilder),
71 myAmParsingTLLogicOrJunction(false), myCurrentIsBroken(false),
72 myHaveWarnedAboutInvalidTLType(false),
73 myHaveSeenInternalEdge(false),
74 myHaveJunctionHigherSpeeds(false),
75 myHaveSeenDefaultLength(false),
76 myHaveSeenNeighs(false),
77 myHaveSeenAdditionalSpeedRestrictions(false),
78 myHaveSeenMesoEdgeType(false),
79 myNetworkVersion(0, 0),
80 myNetIsLoaded(false) {
81}
82
83
85
86
87void
89 const SUMOSAXAttributes& attrs) {
90 try {
91 switch (element) {
92 case SUMO_TAG_NET: {
93 bool ok;
94 MSGlobals::gLefthand = attrs.getOpt<bool>(SUMO_ATTR_LEFTHAND, nullptr, ok, false);
95 myHaveJunctionHigherSpeeds = attrs.getOpt<bool>(SUMO_ATTR_HIGHER_SPEED, nullptr, ok, false);
96 myNetworkVersion = StringUtils::toVersion(attrs.get<std::string>(SUMO_ATTR_VERSION, nullptr, ok, false));
97 break;
98 }
99 case SUMO_TAG_EDGE:
100 beginEdgeParsing(attrs);
101 break;
102 case SUMO_TAG_LANE:
103 addLane(attrs);
104 break;
105 case SUMO_TAG_NEIGH:
108 }
109 myHaveSeenNeighs = true;
110 break;
112 openJunction(attrs);
113 initJunctionLogic(attrs);
114 break;
115 case SUMO_TAG_PHASE:
116 addPhase(attrs);
117 break;
119 addCondition(attrs);
120 break;
122 addAssignment(attrs);
123 break;
125 addFunction(attrs);
126 break;
128 addConnection(attrs);
129 break;
131 addConflict(attrs);
132 break;
133 case SUMO_TAG_TLLOGIC:
135 break;
136 case SUMO_TAG_REQUEST:
137 addRequest(attrs);
138 break;
139 case SUMO_TAG_WAUT:
140 openWAUT(attrs);
141 break;
143 addWAUTSwitch(attrs);
144 break;
146 addWAUTJunction(attrs);
147 break;
150 addE1Detector(attrs);
151 break;
154 addE2Detector(attrs);
155 break;
158 beginE3Detector(attrs);
159 break;
161 addE3Entry(attrs);
162 break;
164 addE3Exit(attrs);
165 break;
168 break;
169 case SUMO_TAG_VSS:
171 break;
174 break;
177 break;
183 break;
186 break;
190 break;
191 case SUMO_TAG_ACCESS:
193 break;
197 break;
200 break;
203 break;
206 break;
209 break;
212 break;
215 break;
218 break;
221 break;
224 break;
227 break;
229 setLocation(attrs);
230 break;
231 case SUMO_TAG_TAZ:
232 addDistrict(attrs);
233 break;
235 addDistrictEdge(attrs, true);
236 break;
237 case SUMO_TAG_TAZSINK:
238 addDistrictEdge(attrs, false);
239 break;
241 addRoundabout(attrs);
242 break;
243 case SUMO_TAG_TYPE: {
244 bool ok = true;
245 myCurrentTypeID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
246 break;
247 }
249 bool ok = true;
250 const SUMOVehicleClass svc = getVehicleClassID(attrs.get<std::string>(SUMO_ATTR_VCLASS, myCurrentTypeID.c_str(), ok));
251 const double speed = attrs.get<double>(SUMO_ATTR_SPEED, myCurrentTypeID.c_str(), ok);
252 if (ok) {
254 }
255 if (myNetIsLoaded) {
257 }
258 break;
259 }
260 case SUMO_TAG_MESO: {
261 addMesoEdgeType(attrs);
262 break;
263 }
264 case SUMO_TAG_STOPOFFSET: {
265 bool ok = true;
266 const StopOffset stopOffset(attrs, ok);
267 if (!ok) {
269 } else {
271 }
272 break;
273 }
275 bool ok = true;
276 const std::string signalID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
277 if (!MSNet::getInstance()->getTLSControl().knows(signalID)) {
278 throw InvalidArgument("Rail signal '" + signalID + "' in railSignalConstraints is not known");
279 }
281 if (myConstrainedSignal == nullptr) {
282 throw InvalidArgument("Traffic light '" + signalID + "' is not a rail signal");
283 }
284 break;
285 }
286 case SUMO_TAG_PREDECESSOR: // intended fall-through
287 case SUMO_TAG_FOE_INSERTION: // intended fall-through
288 case SUMO_TAG_INSERTION_PREDECESSOR: // intended fall-through
289 case SUMO_TAG_INSERTION_ORDER: // intended fall-through
292 break;
294 addDeadlock(attrs);
295 break;
296 default:
297 break;
298 }
299 } catch (InvalidArgument& e) {
300 myCurrentIsBroken = true;
301 WRITE_ERROR(e.what());
302 }
303 MSRouteHandler::myStartElement(element, attrs);
304 if (element == SUMO_TAG_PARAM && !myCurrentIsBroken) {
305 addParam(attrs);
306 }
307}
308
309
310void
312 switch (element) {
313 case SUMO_TAG_EDGE:
314 closeEdge();
315 break;
316 case SUMO_TAG_LANE:
319 myLastParameterised.pop_back();
320 }
321 break;
323 if (!myCurrentIsBroken) {
324 try {
326 } catch (InvalidArgument& e) {
327 WRITE_ERROR(e.what());
328 }
329 }
331 break;
332 case SUMO_TAG_TLLOGIC:
333 if (!myCurrentIsBroken) {
334 try {
336 } catch (InvalidArgument& e) {
338 delete phase;
339 }
340 WRITE_ERROR(e.what());
341 }
342 }
344 break;
347 break;
348 case SUMO_TAG_WAUT:
349 closeWAUT();
350 break;
352 myConstrainedSignal = nullptr;
353 break;
359 if (!myCurrentIsBroken) {
360 myLastParameterised.pop_back();
361 }
362 break;
366 if (!myCurrentIsBroken) {
367 myLastParameterised.pop_back();
368 }
369 break;
373 myLastParameterised.pop_back();
374 break;
380 myLastParameterised.pop_back();
381 break;
382 case SUMO_TAG_PREDECESSOR: // intended fall-through
383 case SUMO_TAG_FOE_INSERTION: // intended fall-through
384 case SUMO_TAG_INSERTION_PREDECESSOR: // intended fall-through
385 case SUMO_TAG_INSERTION_ORDER: // intended fall-through
387 myLastParameterised.pop_back();
388 break;
389 case SUMO_TAG_NET:
390 // build junction graph
391 for (JunctionGraph::iterator it = myJunctionGraph.begin(); it != myJunctionGraph.end(); ++it) {
392 MSEdge* edge = MSEdge::dictionary(it->first);
393 MSJunction* from = myJunctionControlBuilder.retrieve(it->second.first);
394 MSJunction* to = myJunctionControlBuilder.retrieve(it->second.second);
395 if (from == nullptr) {
396 WRITE_ERRORF(TL("Unknown from-node '%' for edge '%'."), it->second.first, it->first);
397 return;
398 }
399 if (to == nullptr) {
400 WRITE_ERRORF(TL("Unknown to-node '%' for edge '%'."), it->second.second, it->first);
401 return;
402 }
403 if (edge != nullptr) {
404 edge->setJunctions(from, to);
405 from->addOutgoing(edge);
406 to->addIncoming(edge);
407 }
408 }
409 myNetIsLoaded = true;
410 break;
411 default:
412 break;
413 }
415}
416
417
418
419// ---- the root/edge - element
420void
422 bool ok = true;
423 myCurrentIsBroken = false;
424 // get the id, report an error if not given or empty...
425 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
426 if (!ok) {
427 myCurrentIsBroken = true;
428 return;
429 }
430 // parse the function
432 if (!ok) {
433 myCurrentIsBroken = true;
434 return;
435 }
436 // omit internal edges if not wished
437 if (id[0] == ':') {
441 return;
442 }
443 std::string junctionID = SUMOXMLDefinitions::getJunctionIDFromInternalEdge(id);
444 myJunctionGraph[id] = std::make_pair(junctionID, junctionID);
445 } else {
447 myJunctionGraph[id] = std::make_pair(
448 attrs.get<std::string>(SUMO_ATTR_FROM, id.c_str(), ok),
449 attrs.get<std::string>(SUMO_ATTR_TO, id.c_str(), ok));
450 }
451 if (!ok) {
452 myCurrentIsBroken = true;
453 return;
454 }
456 // get the street name
457 const std::string streetName = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
458 // get the edge type
459 const std::string edgeType = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "");
460 // get the edge priority (only for visualization)
461 const int priority = attrs.getOpt<int>(SUMO_ATTR_PRIORITY, id.c_str(), ok, -1); // default taken from netbuild/NBFrame option 'default.priority'
462 // get the bidi-edge
463 const std::string bidi = attrs.getOpt<std::string>(SUMO_ATTR_BIDI, id.c_str(), ok, "");
464 // get the kilometrage/mileage (for visualization and output)
465 const double distance = attrs.getOpt<double>(SUMO_ATTR_DISTANCE, id.c_str(), ok, 0);
466
467 if (!ok) {
468 myCurrentIsBroken = true;
469 return;
470 }
471 //
472 try {
473 myEdgeControlBuilder.beginEdgeParsing(id, func, streetName, edgeType, priority, bidi, distance);
474 } catch (InvalidArgument& e) {
475 WRITE_ERROR(e.what());
476 myCurrentIsBroken = true;
477 }
478
479 if (func == SumoXMLEdgeFunc::CROSSING) {
480 //get the crossingEdges attribute (to implement the other side of the road pushbutton)
481 const std::string crossingEdges = attrs.getOpt<std::string>(SUMO_ATTR_CROSSING_EDGES, id.c_str(), ok, "");
482 if (!crossingEdges.empty()) {
483 std::vector<std::string> crossingEdgesVector;
484 StringTokenizer edges(crossingEdges);
485 while (edges.hasNext()) {
486 crossingEdgesVector.push_back(edges.next());
487 }
488 myEdgeControlBuilder.addCrossingEdges(crossingEdgesVector);
489 }
490 }
493}
494
495
496void
498 myLastParameterised.clear();
499 // omit internal edges if not wished and broken edges
501 return;
502 }
503 try {
505 MSEdge::dictionary(e->getID(), e);
507 } catch (InvalidArgument& e) {
508 WRITE_ERROR(e.what());
509 }
510}
511
512
513// ---- the root/edge/lanes/lane - element
514void
516 // omit internal edges if not wished and broken edges
518 return;
519 }
520 bool ok = true;
521 // get the id, report an error if not given or empty...
522 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
523 if (!ok) {
524 myCurrentIsBroken = true;
525 return;
526 }
527 const double maxSpeed = attrs.get<double>(SUMO_ATTR_SPEED, id.c_str(), ok);
528 const double friction = attrs.getOpt<double>(SUMO_ATTR_FRICTION, id.c_str(), ok, (double)(1.), false);
529 const double length = attrs.get<double>(SUMO_ATTR_LENGTH, id.c_str(), ok);
530 const std::string allow = attrs.getOpt<std::string>(SUMO_ATTR_ALLOW, id.c_str(), ok, "", false);
531 const std::string disallow = attrs.getOpt<std::string>(SUMO_ATTR_DISALLOW, id.c_str(), ok, "");
532 const std::string changeLeftS = attrs.getOpt<std::string>(SUMO_ATTR_CHANGE_LEFT, id.c_str(), ok, "");
533 const std::string changeRightS = attrs.getOpt<std::string>(SUMO_ATTR_CHANGE_RIGHT, id.c_str(), ok, "");
534 const double width = attrs.getOpt<double>(SUMO_ATTR_WIDTH, id.c_str(), ok, SUMO_const_laneWidth);
535 const PositionVector shape = attrs.get<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok);
536 const PositionVector outlineShape = attrs.getOpt<PositionVector>(SUMO_ATTR_OUTLINESHAPE, id.c_str(), ok, PositionVector());
537 const int index = attrs.get<int>(SUMO_ATTR_INDEX, id.c_str(), ok);
538 const bool isRampAccel = attrs.getOpt<bool>(SUMO_ATTR_ACCELERATION, id.c_str(), ok, false);
539 const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "");
540 if (shape.size() < 2) {
541 WRITE_ERRORF(TL("Shape of lane '%' is broken.\n Can not build according edge."), id);
542 myCurrentIsBroken = true;
543 return;
544 }
545 const SVCPermissions permissions = parseVehicleClasses(allow, disallow, myNetworkVersion);
546 SVCPermissions changeLeft = parseVehicleClasses(changeLeftS, "", myNetworkVersion);
547 SVCPermissions changeRight = parseVehicleClasses(changeRightS, "", myNetworkVersion);
549 // internally, changeLeft always checks for the higher lane index
550 // even though the higher lane index is to the right in a left-hand network
551 std::swap(changeLeft, changeRight);
552 }
553 if (permissions != SVCAll || changeLeft != SVCAll || changeRight != SVCAll) {
555 }
556 myCurrentIsBroken |= !ok;
557 if (!myCurrentIsBroken) {
558 try {
559 MSLane* lane = myEdgeControlBuilder.addLane(id, maxSpeed, friction, length, shape, width, permissions, changeLeft, changeRight, index, isRampAccel, type, outlineShape);
560 // insert the lane into the lane-dictionary, checking
561 if (!MSLane::dictionary(id, lane)) {
562 delete lane;
563 WRITE_ERRORF(TL("Another lane with the id '%' exists."), id);
564 myCurrentIsBroken = true;
565 myLastParameterised.push_back(nullptr);
566 } else {
567 myLastParameterised.push_back(lane);
568 }
569 } catch (InvalidArgument& e) {
570 WRITE_ERROR(e.what());
571 }
572 }
573}
574
575
576// ---- the root/junction - element
577void
579 myCurrentIsBroken = false;
580 bool ok = true;
581 // get the id, report an error if not given or empty...
582 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
583 if (!ok) {
584 myCurrentIsBroken = true;
585 return;
586 }
587 PositionVector shape;
588 if (attrs.hasAttribute(SUMO_ATTR_SHAPE)) {
589 // inner junctions have no shape
590 shape = attrs.getOpt<PositionVector>(SUMO_ATTR_SHAPE, id.c_str(), ok, PositionVector());
591 if (shape.size() > 2) {
592 shape.closePolygon();
593 }
594 }
595 double x = attrs.get<double>(SUMO_ATTR_X, id.c_str(), ok);
596 double y = attrs.get<double>(SUMO_ATTR_Y, id.c_str(), ok);
597 double z = attrs.getOpt<double>(SUMO_ATTR_Z, id.c_str(), ok, 0);
598 const SumoXMLNodeType type = attrs.get<SumoXMLNodeType>(SUMO_ATTR_TYPE, id.c_str(), ok);
599 std::string key = attrs.getOpt<std::string>(SUMO_ATTR_KEY, id.c_str(), ok, "");
600 std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
601 // incoming lanes
602 std::vector<MSLane*> incomingLanes;
603 parseLanes(id, attrs.getStringSecure(SUMO_ATTR_INCLANES, ""), incomingLanes, ok);
604 // internal lanes
605 std::vector<MSLane*> internalLanes;
607 parseLanes(id, attrs.getStringSecure(SUMO_ATTR_INTLANES, ""), internalLanes, ok);
608 }
609 if (!ok) {
610 myCurrentIsBroken = true;
611 } else {
612 try {
613 myJunctionControlBuilder.openJunction(id, key, type, Position(x, y, z), shape, incomingLanes, internalLanes, name);
614 } catch (InvalidArgument& e) {
615 WRITE_ERROR(e.what() + std::string("\n Can not build according junction."));
616 myCurrentIsBroken = true;
617 }
618 }
619}
620
621
622void
623NLHandler::parseLanes(const std::string& junctionID,
624 const std::string& def, std::vector<MSLane*>& into, bool& ok) {
625 StringTokenizer st(def, " ");
626 while (ok && st.hasNext()) {
627 std::string laneID = st.next();
628 MSLane* lane = MSLane::dictionary(laneID);
629 if (!MSGlobals::gUsingInternalLanes && laneID[0] == ':') {
630 continue;
631 }
632 if (lane == nullptr) {
633 WRITE_ERRORF(TL("An unknown lane ('%') was tried to be set as incoming to junction '%'."), laneID, junctionID);
634 ok = false;
635 continue;
636 }
637 into.push_back(lane);
638 }
639}
640// ----
641
642void
644 bool ok = true;
645 const std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, nullptr, ok);
646 // circumventing empty string test
647 const std::string val = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : "";
648 if (myLastParameterised.size() > 0 && myLastParameterised.back() != nullptr) {
649 myLastParameterised.back()->setParameter(key, val);
650 }
651 // set
653 assert(key != "");
655 }
656}
657
658
659void
661 myCurrentIsBroken = false;
662 bool ok = true;
663 // get the id, report an error if not given or empty...
664 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
665 if (!ok) {
666 myCurrentIsBroken = true;
667 return;
668 }
669 SUMOTime refTime = attrs.getOptSUMOTimeReporting(SUMO_ATTR_REF_TIME, id.c_str(), ok, 0);
670 SUMOTime period = attrs.getOptSUMOTimeReporting(SUMO_ATTR_PERIOD, id.c_str(), ok, 0);
671 std::string startProg = attrs.get<std::string>(SUMO_ATTR_START_PROG, id.c_str(), ok);
672 if (!ok) {
673 myCurrentIsBroken = true;
674 }
675 if (!myCurrentIsBroken) {
676 myCurrentWAUTID = id;
677 try {
678 myJunctionControlBuilder.getTLLogicControlToUse().addWAUT(refTime, id, startProg, period);
679 } catch (InvalidArgument& e) {
680 WRITE_ERROR(e.what());
681 myCurrentIsBroken = true;
682 }
683 }
684}
685
686
687void
689 bool ok = true;
691 std::string to = attrs.get<std::string>(SUMO_ATTR_TO, myCurrentWAUTID.c_str(), ok);
692 if (!ok) {
693 myCurrentIsBroken = true;
694 }
695 if (!myCurrentIsBroken) {
696 try {
698 } catch (InvalidArgument& e) {
699 WRITE_ERROR(e.what());
700 myCurrentIsBroken = true;
701 }
702 }
703}
704
705
706void
708 bool ok = true;
709 std::string wautID = attrs.get<std::string>(SUMO_ATTR_WAUT_ID, nullptr, ok);
710 std::string junctionID = attrs.get<std::string>(SUMO_ATTR_JUNCTION_ID, nullptr, ok);
711 std::string procedure = attrs.getOpt<std::string>(SUMO_ATTR_PROCEDURE, nullptr, ok, "");
712 bool synchron = attrs.getOpt<bool>(SUMO_ATTR_SYNCHRON, nullptr, ok, false);
713 if (!ok) {
714 myCurrentIsBroken = true;
715 }
716 try {
717 if (!myCurrentIsBroken) {
718 myJunctionControlBuilder.getTLLogicControlToUse().addWAUTJunction(wautID, junctionID, procedure, synchron);
719 }
720 } catch (InvalidArgument& e) {
721 WRITE_ERROR(e.what());
722 myCurrentIsBroken = true;
723 }
724}
725
726
727void
729 if (myCurrentIsBroken) {
730 return;
731 }
732 bool ok = true;
733 int request = attrs.get<int>(SUMO_ATTR_INDEX, nullptr, ok);
734 bool cont = false;
735 cont = attrs.getOpt<bool>(SUMO_ATTR_CONT, nullptr, ok, false);
736 std::string response = attrs.get<std::string>(SUMO_ATTR_RESPONSE, nullptr, ok);
737 std::string foes = attrs.get<std::string>(SUMO_ATTR_FOES, nullptr, ok);
738 if (!ok) {
739 return;
740 }
741 // store received information
742 if (request >= 0 && response.length() > 0) {
743 try {
744 myJunctionControlBuilder.addLogicItem(request, response, foes, cont);
745 } catch (InvalidArgument& e) {
746 WRITE_ERROR(e.what());
747 }
748 }
749}
750
751
752void
754 if (myCurrentIsBroken) {
755 return;
756 }
758 bool ok = true;
759 // we either a have a junction or a legacy network with ROWLogic
760 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
761 if (ok) {
763 }
764}
765
766
767void
769 myCurrentIsBroken = false;
771 bool ok = true;
772 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
773 std::string programID = attrs.getOpt<std::string>(SUMO_ATTR_PROGRAMID, id.c_str(), ok, "<unknown>");
775 std::string typeS;
776 if (myJunctionControlBuilder.getTLLogicControlToUse().get(id, programID) == nullptr) {
777 // SUMO_ATTR_TYPE is not needed when only modifying the offset of an
778 // existing program
779 typeS = attrs.get<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok);
780 if (!ok) {
781 myCurrentIsBroken = true;
782 return;
783 }
784 if (SUMOXMLDefinitions::TrafficLightTypes.hasString(typeS)) {
786 } else {
787 WRITE_ERRORF(TL("Traffic light '%' has unknown type '%'."), id, typeS);
788 }
791 WRITE_WARNINGF(TL("Traffic light type '%' cannot be used in mesoscopic simulation. Using '%' as fallback."), toString(type), toString(TrafficLightType::STATIC));
793 }
795 }
796 }
797 SUMOTime offset = attrs.getOptOffsetReporting(SUMO_ATTR_OFFSET, id.c_str(), ok, 0);
798 if (offset == SUMOTime_MAX) {
799 offset = string2time(OptionsCont::getOptions().getString("begin"));
800 }
801 if (!ok) {
802 myCurrentIsBroken = true;
803 return;
804 }
805 myJunctionControlBuilder.initTrafficLightLogic(id, programID, type, offset);
806}
807
808
809void
811 // try to get the phase definition
812 bool ok = true;
813 const std::string& id = myJunctionControlBuilder.getActiveKey();
815
817 const std::string state = attrs.get<std::string>(SUMO_ATTR_STATE, nullptr, ok);
818 if (duration == 0) {
819 WRITE_ERROR("Duration of phase " + toString(myJunctionControlBuilder.getLoadedPhases().size())
820 + " for tlLogic '" + myJunctionControlBuilder.getActiveKey()
821 + "' program '" + myJunctionControlBuilder.getActiveSubKey() + "' is zero.");
822 return;
823 }
824 if (!ok) {
825 return;
826 }
827 MSPhaseDefinition* phase = new MSPhaseDefinition(duration, state);
828
829 // if the traffic light is an actuated traffic light, try to get
830 // the minimum and maximum durations
831 phase->minDuration = attrs.getOptSUMOTimeReporting(SUMO_ATTR_MINDURATION, id.c_str(), ok, duration);
832 // if minDur is set but not maxDur, assume high maxDur (avoid using the absolute max in case we do some arithmetic later)
833 SUMOTime defaultMaxDur = attrs.hasAttribute(SUMO_ATTR_MINDURATION) ? std::numeric_limits<int>::max() : duration;
834 phase->maxDuration = attrs.getOptSUMOTimeReporting(SUMO_ATTR_MAXDURATION, id.c_str(), ok, defaultMaxDur);
835 phase->earliestEnd = attrs.getOptSUMOTimeReporting(SUMO_ATTR_EARLIEST_END, id.c_str(), ok, tDefault);
836 phase->latestEnd = attrs.getOptSUMOTimeReporting(SUMO_ATTR_LATEST_END, id.c_str(), ok, tDefault);
837 phase->nextPhases = attrs.getOpt<std::vector<int> >(SUMO_ATTR_NEXT, id.c_str(), ok);
838 phase->earlyTarget = attrs.getOpt<std::string>(SUMO_ATTR_EARLY_TARGET, id.c_str(), ok);
839 phase->finalTarget = attrs.getOpt<std::string>(SUMO_ATTR_FINAL_TARGET, id.c_str(), ok);
840 phase->name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok);
841
842 phase->vehext = attrs.getOptSUMOTimeReporting(SUMO_ATTR_VEHICLEEXTENSION, id.c_str(), ok, tDefault);
843 phase->yellow = attrs.getOptSUMOTimeReporting(SUMO_ATTR_YELLOW, id.c_str(), ok, tDefault);
844 phase->red = attrs.getOptSUMOTimeReporting(SUMO_ATTR_RED, id.c_str(), ok, tDefault);
845
846 if (attrs.hasAttribute(SUMO_ATTR_TYPE)) {
847 //SOTL attributes
848 //If the type attribute is not present, the parsed phase is of type "undefined" (MSPhaseDefinition constructor),
849 //in this way SOTL traffic light logic can recognize the phase as unsuitable or decides other
850 //behaviors. See SOTL traffic light logic implementations.
851 std::string phaseTypeString;
852 try {
853 phaseTypeString = attrs.get<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, false);
854 } catch (EmptyData&) {
855 MsgHandler::getWarningInstance()->inform("Empty type definition. Assuming phase type as SUMOSOTL_TagAttrDefinitions::SOTL_ATTL_TYPE_TRANSIENT");
856 phase->myTransientNotDecisional = false;
857 }
858 if (phaseTypeString.find("decisional") != std::string::npos) {
859 phase->myTransientNotDecisional = false;
860 } else if (phaseTypeString.find("transient") != std::string::npos) {
861 phase->myTransientNotDecisional = true;
862 } else {
863 MsgHandler::getWarningInstance()->inform("SOTL_ATTL_TYPE_DECISIONAL nor SOTL_ATTL_TYPE_TRANSIENT. Assuming phase type as SUMOSOTL_TagAttrDefinitions::SOTL_ATTL_TYPE_TRANSIENT");
864 phase->myTransientNotDecisional = false;
865 }
866 phase->myCommit = (phaseTypeString.find("commit") != std::string::npos);
867
868 if (phaseTypeString.find("target") != std::string::npos) {
869 std::string delimiter(" ,;");
870 //Phase declared as target, getting targetLanes attribute
871 try {
873 } catch (EmptyData&) {
874 MsgHandler::getErrorInstance()->inform("Missing targetLane definition for the target phase.");
875 delete phase;
876 return;
877 }
878 }
879 }
880
881 if (phase->maxDuration < phase->minDuration) {
882 WRITE_WARNINGF(TL("maxDur % should not be smaller than minDir % in phase of tlLogic %"), phase->maxDuration, phase->minDuration, id);
883 phase->maxDuration = phase->duration;
884 }
885
886 phase->myLastSwitch = string2time(OptionsCont::getOptions().getString("begin")) - 1; // SUMOTime-option
888}
889
890
891void
893 bool ok = true;
894 const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
895 const std::string value = attrs.get<std::string>(SUMO_ATTR_VALUE, id.c_str(), ok);
896 if (!myJunctionControlBuilder.addCondition(id, value)) {
897 WRITE_ERRORF(TL("Duplicate condition '%' in tlLogic '%'"), id, myJunctionControlBuilder.getActiveKey());
898 }
899}
900
901
902void
904 bool ok = true;
905 const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
906 const std::string check = attrs.get<std::string>(SUMO_ATTR_CHECK, nullptr, ok);
907 const std::string value = attrs.get<std::string>(SUMO_ATTR_VALUE, id.c_str(), ok);
908 myJunctionControlBuilder.addAssignment(id, check, value);
909}
910
911
912void
914 bool ok = true;
915 const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
916 const int nArgs = attrs.get<int>(SUMO_ATTR_NARGS, nullptr, ok);
918}
919
920void
924
925void
927 myCurrentIsBroken = false;
928 bool ok = true;
929 // get the id, report an error if not given or empty...
930 const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
931 if (!ok) {
932 myCurrentIsBroken = true;
933 return;
934 }
935 const SUMOTime period = attrs.getOptPeriod(id.c_str(), ok, SUMOTime_MAX_PERIOD);
936 const double position = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), ok);
937 const double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, id.c_str(), ok, 0);
938 const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), ok, false);
939 const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
940 const std::string vTypes = attrs.getOpt<std::string>(SUMO_ATTR_VTYPES, id.c_str(), ok, "");
941 const std::string nextEdges = attrs.getOpt<std::string>(SUMO_ATTR_NEXT_EDGES, id.c_str(), ok, "");
942 const std::string lane = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), ok);
943 const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok);
944 const std::string detectPersonsString = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, id.c_str(), ok, "");
945 int detectPersons = 0;
946 for (std::string mode : StringTokenizer(detectPersonsString).getVector()) {
947 if (SUMOXMLDefinitions::PersonModeValues.hasString(mode)) {
948 detectPersons |= (int)SUMOXMLDefinitions::PersonModeValues.get(mode);
949 } else {
950 WRITE_ERRORF(TL("Invalid person mode '%' in E1 detector definition '%'"), mode, id);
951 myCurrentIsBroken = true;
952 return;
953 }
954 }
955 if (!ok) {
956 myCurrentIsBroken = true;
957 return;
958 }
959 try {
960 Parameterised* det = myDetectorBuilder.buildInductLoop(id, lane, position, length, period,
962 friendlyPos, name, vTypes, nextEdges, detectPersons);
963 myLastParameterised.push_back(det);
964 } catch (InvalidArgument& e) {
965 myCurrentIsBroken = true;
966 WRITE_ERROR(e.what());
967 } catch (IOError& e) {
968 myCurrentIsBroken = true;
969 WRITE_ERROR(e.what());
970 }
971}
972
973
974void
976 myCurrentIsBroken = false;
977 bool ok = true;
978 // get the id, report an error if not given or empty...
979 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
980 if (!ok) {
981 myCurrentIsBroken = true;
982 return;
983 }
984 const double position = attrs.get<double>(SUMO_ATTR_POSITION, id.c_str(), ok);
985 const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), ok, false);
986 const std::string lane = attrs.get<std::string>(SUMO_ATTR_LANE, id.c_str(), ok);
987 const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok);
988 const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
989 const std::string vTypes = attrs.getOpt<std::string>(SUMO_ATTR_VTYPES, id.c_str(), ok, "");
990 const std::string nextEdges = attrs.getOpt<std::string>(SUMO_ATTR_NEXT_EDGES, id.c_str(), ok, "");
991 if (!ok) {
992 myCurrentIsBroken = true;
993 return;
994 }
995 try {
996 Parameterised* det = myDetectorBuilder.buildInstantInductLoop(id, lane, position, FileHelpers::checkForRelativity(file, getFileName()), friendlyPos, name, vTypes, nextEdges);
997 myLastParameterised.push_back(det);
998 } catch (InvalidArgument& e) {
999 WRITE_ERROR(e.what());
1000 } catch (IOError& e) {
1001 WRITE_ERROR(e.what());
1002 }
1003 myCurrentIsBroken = true;
1004}
1005
1006
1007void
1009 WRITE_WARNING(TL("VTypeProbes are deprecated. Use fcd-output devices (assigned to the vType) instead."));
1010 bool ok = true;
1011 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
1012 SUMOTime period = attrs.getOptPeriod(id.c_str(), ok, SUMOTime_MAX_PERIOD);
1013 std::string type = attrs.getStringSecure(SUMO_ATTR_TYPE, "");
1014 std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok);
1015 if (!ok) {
1016 return;
1017 }
1018 try {
1020 } catch (InvalidArgument& e) {
1021 WRITE_ERROR(e.what());
1022 } catch (IOError& e) {
1023 WRITE_ERROR(e.what());
1024 }
1025}
1026
1027
1028void
1030 bool ok = true;
1031 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
1032 SUMOTime period = attrs.getOptPeriod(id.c_str(), ok, SUMOTime_MAX_PERIOD);
1033 SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), ok, -1);
1034 std::string edge = attrs.get<std::string>(SUMO_ATTR_EDGE, id.c_str(), ok);
1035 std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok);
1036 const std::string vTypes = attrs.getOpt<std::string>(SUMO_ATTR_VTYPES, id.c_str(), ok, "");
1037 if (!ok) {
1038 return;
1039 }
1040 try {
1041 myDetectorBuilder.buildRouteProbe(id, edge, period, begin,
1043 } catch (InvalidArgument& e) {
1044 WRITE_ERROR(e.what());
1045 } catch (IOError& e) {
1046 WRITE_ERROR(e.what());
1047 }
1048}
1049
1050
1051
1052void
1054 myCurrentIsBroken = false;
1055 // check whether this is a detector connected to a tls and optionally to a link
1056 bool ok = true;
1057 const std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
1058 const std::string lsaid = attrs.getOpt<std::string>(SUMO_ATTR_TLID, id.c_str(), ok, "");
1059 const std::string toLane = attrs.getOpt<std::string>(SUMO_ATTR_TO, id.c_str(), ok, "");
1060 const SUMOTime haltingTimeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), ok, TIME2STEPS(1));
1061 const double haltingSpeedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), ok, 5.0f / 3.6f);
1062 const double jamDistThreshold = attrs.getOpt<double>(SUMO_ATTR_JAM_DIST_THRESHOLD, id.c_str(), ok, 10.0f);
1063 double position = attrs.getOpt<double>(SUMO_ATTR_POSITION, id.c_str(), ok, std::numeric_limits<double>::max());
1064 const double length = attrs.getOpt<double>(SUMO_ATTR_LENGTH, id.c_str(), ok, std::numeric_limits<double>::max());
1065 const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, id.c_str(), ok, false);
1066 const bool showDetector = attrs.getOpt<bool>(SUMO_ATTR_SHOW_DETECTOR, id.c_str(), ok, true);
1067 const std::string contStr = attrs.getOpt<std::string>(SUMO_ATTR_CONT, id.c_str(), ok, "");
1068 if (contStr != "") {
1069 WRITE_WARNINGF(TL("Ignoring deprecated argument 'cont' for E2 detector '%'"), id);
1070 }
1071 std::string lane = attrs.getOpt<std::string>(SUMO_ATTR_LANE, id.c_str(), ok, "");
1072 const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok);
1073 const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
1074 const std::string vTypes = attrs.getOpt<std::string>(SUMO_ATTR_VTYPES, id.c_str(), ok, "");
1075 const std::string nextEdges = attrs.getOpt<std::string>(SUMO_ATTR_NEXT_EDGES, id.c_str(), ok, "");
1076
1077 double endPosition = attrs.getOpt<double>(SUMO_ATTR_ENDPOS, id.c_str(), ok, std::numeric_limits<double>::max());
1078 const std::string lanes = attrs.getOpt<std::string>(SUMO_ATTR_LANES, id.c_str(), ok, ""); // lanes has priority to lane
1079 const std::string detectPersonsString = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, id.c_str(), ok, "");
1080 int detectPersons = 0;
1081 for (std::string mode : StringTokenizer(detectPersonsString).getVector()) {
1082 if (SUMOXMLDefinitions::PersonModeValues.hasString(mode)) {
1083 detectPersons |= (int)SUMOXMLDefinitions::PersonModeValues.get(mode);
1084 } else {
1085 WRITE_ERRORF(TL("Invalid person mode '%' in E2 detector definition '%'"), mode, id);
1086 myCurrentIsBroken = true;
1087 return;
1088 }
1089 }
1090 if (!ok) {
1091 myCurrentIsBroken = true;
1092 return;
1093 }
1094
1095 bool lanesGiven = lanes != "";
1096 bool laneGiven = lane != "";
1097 if (!(lanesGiven || laneGiven)) {
1098 // in absence of any lane-specification assume specification by id
1099 WRITE_WARNING(TL("Trying to specify detector's lane by the given id since the argument 'lane' is missing."))
1100 lane = id;
1101 laneGiven = true;
1102 }
1103 bool lengthGiven = length != std::numeric_limits<double>::max();
1104 bool posGiven = position != std::numeric_limits<double>::max();
1105 bool endPosGiven = endPosition != std::numeric_limits<double>::max();
1106 bool lsaGiven = lsaid != "";
1107 bool toLaneGiven = toLane != "";
1108
1109 MSLane* clane = nullptr;
1110 std::vector<MSLane*> clanes;
1111 if (lanesGiven) {
1112 // If lanes is given, endPos and startPos are required. lane, and length are ignored
1113 std::string seps = " ,\t\n";
1114 StringTokenizer st = StringTokenizer(lanes, seps, true);
1115// std::cout << "Parsing lanes..." << std::endl;
1116 while (st.hasNext()) {
1117 std::string nextLaneID = st.next();
1118// std::cout << "Next: " << nextLaneID << std::endl;
1119 if (nextLaneID.find_first_of(seps) != nextLaneID.npos) {
1120 continue;
1121 }
1122 clane = myDetectorBuilder.getLaneChecking(nextLaneID, SUMO_TAG_E2DETECTOR, id);
1123 clanes.push_back(clane);
1124 }
1125 if (clanes.size() == 0) {
1126 throw InvalidArgument("Malformed argument 'lanes' for E2Detector '" + id + "'.\nSpecify 'lanes' as a sequence of lane-IDs separated by whitespace or comma (',')");
1127 }
1128 if (laneGiven) {
1129 WRITE_WARNING("Ignoring argument 'lane' for E2Detector '" + id + "' since argument 'lanes' was given.\n"
1130 "Usage combinations for positional specification: [lane, pos, length], [lane, endPos, length], or [lanes, pos, endPos]");
1131 }
1132 if (lengthGiven) {
1133 WRITE_WARNING("Ignoring argument 'length' for E2Detector '" + id + "' since argument 'lanes' was given.\n"
1134 "Usage combinations for positional specification: [lane, pos, length], [lane, endPos, length], or [lanes, pos, endPos]");
1135 }
1136 if (!posGiven) {
1137 // assuming start pos == lane start
1138 position = 0;
1139 WRITE_WARNINGF(TL("Missing argument 'pos' for E2Detector '%'. Assuming detector start == lane start of lane '%'."), id, clanes[0]->getID());
1140 }
1141 if (!endPosGiven) {
1142 // assuming end pos == lane end
1143 endPosition = clanes[clanes.size() - 1]->getLength();
1144 WRITE_WARNINGF(TL("Missing argument 'endPos' for E2Detector '%'. Assuming detector end == lane end of lane '%'."), id, clanes[clanes.size() - 1]->getID());
1145 }
1146
1147 } else {
1148 if (!laneGiven) {
1149 std::stringstream ss;
1150 ss << "Missing argument 'lane' for E2Detector '" << id << "'."
1151 << "\nUsage combinations for positional specification: [lane, pos, length], [lane, endPos, length], or [lanes, pos, endPos]";
1152 throw InvalidArgument(ss.str());
1153 }
1155
1156 if (posGiven) {
1157 // start pos is given
1158 if (endPosGiven && lengthGiven) {
1159 std::stringstream ss;
1160 ss << "Ignoring argument 'endPos' for E2Detector '" << id << "' since argument 'pos' was given."
1161 << "\nUsage combinations for positional specification: [lane, pos, length], [lane, endPos, length], or [lanes, pos, endPos]";
1162 WRITE_WARNING(ss.str());
1163 endPosition = std::numeric_limits<double>::max();
1164 }
1165 if (!lengthGiven && !endPosGiven) {
1166 std::stringstream ss;
1167 ss << "Missing arguments 'length'/'endPos' for E2Detector '" << id << "'. Assuming detector end == lane end of lane '" << lane << "'.";
1168 WRITE_WARNING(ss.str());
1169 endPosition = clane->getLength();
1170 }
1171 } else if (endPosGiven) {
1172 // endPos is given, pos is not given
1173 if (!lengthGiven) {
1174 std::stringstream ss;
1175 ss << "Missing arguments 'length'/'pos' for E2Detector '" << id << "'. Assuming detector start == lane start of lane '" << lane << "'.";
1176 WRITE_WARNING(ss.str());
1177 }
1178 } else {
1179 std::stringstream ss;
1180 if (lengthGiven && fabs(length - clane->getLength()) > NUMERICAL_EPS) {
1181 ss << "Incomplete positional specification for E2Detector '" << id << "'."
1182 << "\nUsage combinations for positional specification: [lane, pos, length], [lane, endPos, length], or [lanes, pos, endPos]";
1183 throw InvalidArgument(ss.str());
1184 }
1185 endPosition = clane->getLength();
1186 position = 0;
1187 ss << "Missing arguments 'pos'/'endPos' for E2Detector '" << id << "'. Assuming that the detector covers the whole lane '" << lane << "'.";
1188 WRITE_WARNING(ss.str());
1189 }
1190 }
1191
1192 // Period
1193
1194 SUMOTime period;
1195 if (!lsaGiven) {
1196 period = attrs.getOptPeriod(id.c_str(), ok, SUMOTime_MAX_PERIOD);
1197 if (!ok) {
1198 myCurrentIsBroken = true;
1199 return;
1200 }
1201 } else {
1202 period = attrs.getPeriod(id.c_str(), ok, false);
1203 }
1204
1205 // TLS
1206 MSTLLogicControl::TLSLogicVariants* tlls = nullptr;
1207 if (lsaGiven) {
1208 tlls = &myJunctionControlBuilder.getTLLogic(lsaid);
1209 if (tlls->getActive() == nullptr) {
1210 throw InvalidArgument("The detector '" + id + "' refers to an unknown lsa '" + lsaid + "'.");
1211 }
1212 if (period != -1) {
1213 WRITE_WARNINGF(TL("Ignoring argument 'period' for E2Detector '%' since argument 'tl' was given."), id);
1214 period = -1;
1215 }
1216 }
1217
1218 // Link
1219 MSLane* cToLane = nullptr;
1220 if (toLaneGiven) {
1222 }
1223
1224 // File
1225 std::string filename;
1226 try {
1227 filename = FileHelpers::checkForRelativity(file, getFileName());
1228 } catch (IOError& e) {
1229 WRITE_ERROR(e.what());
1230 }
1231
1232 Parameterised* det;
1233 // Build detector
1234 if (lanesGiven) {
1235 // specification by a lane sequence
1236 det = myDetectorBuilder.buildE2Detector(id, clanes, position, endPosition, filename, period,
1237 haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold,
1238 name, vTypes, nextEdges, detectPersons, friendlyPos, showDetector,
1239 tlls, cToLane);
1240 } else {
1241 // specification by start or end lane
1242 det = myDetectorBuilder.buildE2Detector(id, clane, position, endPosition, length, filename, period,
1243 haltingTimeThreshold, haltingSpeedThreshold, jamDistThreshold,
1244 name, vTypes, nextEdges, detectPersons, friendlyPos, showDetector,
1245 tlls, cToLane);
1246 }
1247 myLastParameterised.push_back(det);
1248}
1249
1250
1251void
1253 myCurrentIsBroken = false;
1254 bool ok = true;
1255 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
1256 const SUMOTime period = attrs.getOptPeriod(id.c_str(), ok, SUMOTime_MAX_PERIOD);
1257 const SUMOTime haltingTimeThreshold = attrs.getOptSUMOTimeReporting(SUMO_ATTR_HALTING_TIME_THRESHOLD, id.c_str(), ok, TIME2STEPS(1));
1258 const double haltingSpeedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), ok, 5.0f / 3.6f);
1259 const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok);
1260 const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, id.c_str(), ok, "");
1261 const std::string vTypes = attrs.getOpt<std::string>(SUMO_ATTR_VTYPES, id.c_str(), ok, "");
1262 const std::string nextEdges = attrs.getOpt<std::string>(SUMO_ATTR_NEXT_EDGES, id.c_str(), ok, "");
1263 const bool openEntry = attrs.getOpt<bool>(SUMO_ATTR_OPEN_ENTRY, id.c_str(), ok, false);
1264 const bool expectArrival = attrs.getOpt<bool>(SUMO_ATTR_EXPECT_ARRIVAL, id.c_str(), ok, false);
1265 const std::string detectPersonsString = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, id.c_str(), ok, "");
1266 int detectPersons = 0;
1267 for (std::string mode : StringTokenizer(detectPersonsString).getVector()) {
1268 if (SUMOXMLDefinitions::PersonModeValues.hasString(mode)) {
1269 detectPersons |= (int)SUMOXMLDefinitions::PersonModeValues.get(mode);
1270 } else {
1271 WRITE_ERRORF(TL("Invalid person mode '%' in E3 detector definition '%'"), mode, id);
1272 myCurrentIsBroken = true;
1273 return;
1274 }
1275 }
1276 if (!ok) {
1277 myCurrentIsBroken = true;
1278 return;
1279 }
1280 try {
1283 period, haltingSpeedThreshold, haltingTimeThreshold, name, vTypes, nextEdges, detectPersons, openEntry, expectArrival);
1284 myLastParameterised.push_back(det);
1285 } catch (InvalidArgument& e) {
1286 myCurrentIsBroken = true;
1287 WRITE_ERROR(e.what());
1288 } catch (IOError& e) {
1289 myCurrentIsBroken = true;
1290 WRITE_ERROR(e.what());
1291 }
1292}
1293
1294
1295void
1297 bool ok = true;
1298 const double position = attrs.get<double>(SUMO_ATTR_POSITION, myDetectorBuilder.getCurrentE3ID().c_str(), ok);
1299 const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, myDetectorBuilder.getCurrentE3ID().c_str(), ok, false);
1300 const std::string lane = attrs.get<std::string>(SUMO_ATTR_LANE, myDetectorBuilder.getCurrentE3ID().c_str(), ok);
1301 if (!ok) {
1302 return;
1303 }
1304 myDetectorBuilder.addE3Entry(lane, position, friendlyPos);
1305}
1306
1307
1308void
1310 bool ok = true;
1311 const double position = attrs.get<double>(SUMO_ATTR_POSITION, myDetectorBuilder.getCurrentE3ID().c_str(), ok);
1312 const bool friendlyPos = attrs.getOpt<bool>(SUMO_ATTR_FRIENDLY_POS, myDetectorBuilder.getCurrentE3ID().c_str(), ok, false);
1313 const std::string lane = attrs.get<std::string>(SUMO_ATTR_LANE, myDetectorBuilder.getCurrentE3ID().c_str(), ok);
1314 if (!ok) {
1315 return;
1316 }
1317 myDetectorBuilder.addE3Exit(lane, position, friendlyPos);
1318}
1319
1320
1321void
1323 bool ok = true;
1324 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
1325 const double maxTravelTime = attrs.getOpt<double>(SUMO_ATTR_MAX_TRAVELTIME, id.c_str(), ok, 100000);
1326 const double minSamples = attrs.getOpt<double>(SUMO_ATTR_MIN_SAMPLES, id.c_str(), ok, 0);
1327 const double haltingSpeedThreshold = attrs.getOpt<double>(SUMO_ATTR_HALTING_SPEED_THRESHOLD, id.c_str(), ok, POSITION_EPS);
1328 const std::string excludeEmpty = attrs.getOpt<std::string>(SUMO_ATTR_EXCLUDE_EMPTY, id.c_str(), ok, "false");
1329 const bool withInternal = attrs.getOpt<bool>(SUMO_ATTR_WITH_INTERNAL, id.c_str(), ok, false);
1330 const bool trackVehicles = attrs.getOpt<bool>(SUMO_ATTR_TRACK_VEHICLES, id.c_str(), ok, false);
1331 const std::string detectPersonsString = attrs.getOpt<std::string>(SUMO_ATTR_DETECT_PERSONS, id.c_str(), ok, "");
1332 const std::string file = attrs.get<std::string>(SUMO_ATTR_FILE, id.c_str(), ok);
1333 const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, id.c_str(), ok, "performance");
1334 std::string vtypes = attrs.getOpt<std::string>(SUMO_ATTR_VTYPES, id.c_str(), ok, "");
1335 const std::string writeAttributes = attrs.getOpt<std::string>(SUMO_ATTR_WRITE_ATTRIBUTES, id.c_str(), ok, "");
1336 const SUMOTime period = attrs.getOptPeriod(id.c_str(), ok, -1);
1337 const SUMOTime begin = attrs.getOptSUMOTimeReporting(SUMO_ATTR_BEGIN, id.c_str(), ok, string2time(OptionsCont::getOptions().getString("begin")));
1338 const SUMOTime end = attrs.getOptSUMOTimeReporting(SUMO_ATTR_END, id.c_str(), ok, string2time(OptionsCont::getOptions().getString("end")));
1339 std::vector<std::string> edgeIDs = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, id.c_str(), ok);
1340 const std::string edgesFile = attrs.getOpt<std::string>(SUMO_ATTR_EDGESFILE, id.c_str(), ok, "");
1341 const bool aggregate = attrs.getOpt<bool>(SUMO_ATTR_AGGREGATE, id.c_str(), ok, false);
1342 if (!ok) {
1343 return;
1344 }
1345 int detectPersons = 0;
1346 for (std::string mode : StringTokenizer(detectPersonsString).getVector()) {
1347 if (SUMOXMLDefinitions::PersonModeValues.hasString(mode)) {
1348 detectPersons |= (int)SUMOXMLDefinitions::PersonModeValues.get(mode);
1349 } else {
1350 WRITE_ERRORF(TL("Invalid person mode '%' in edgeData definition '%'"), mode, id);
1351 return;
1352 }
1353 }
1354 if (edgesFile != "") {
1355 std::ifstream strm(edgesFile.c_str());
1356 if (!strm.good()) {
1357 throw ProcessError("Could not load names of edges for edgeData definition '" + id + "' from '" + edgesFile + "'.");
1358 }
1359 while (strm.good()) {
1360 std::string name;
1361 strm >> name;
1362 // maybe we're loading an edge-selection
1363 if (StringUtils::startsWith(name, "edge:")) {
1364 edgeIDs.push_back(name.substr(5));
1365 } else if (name != "") {
1366 edgeIDs.push_back(name);
1367 }
1368 }
1369 }
1370 std::vector<MSEdge*> edges;
1371 for (const std::string& edgeID : edgeIDs) {
1372 MSEdge* edge = MSEdge::dictionary(edgeID);
1373 if (edge == nullptr) {
1374 WRITE_ERRORF(TL("Unknown edge '%' in edgeData definition '%'"), edgeID, id);
1375 return;
1376 }
1377 edges.push_back(edge);
1378 }
1379 bool useLanes = objecttype == SUMO_TAG_MEANDATA_LANE;
1380 if (useLanes && MSGlobals::gUseMesoSim && !OptionsCont::getOptions().getBool("meso-lane-queue")) {
1381 WRITE_WARNINGF(TL("LaneData '%' requested for mesoscopic simulation but --meso-lane-queue is not active. Falling back to edgeData."), id);
1382 useLanes = false;
1383 }
1384 try {
1385 myDetectorBuilder.createEdgeLaneMeanData(id, period, begin, end,
1386 type, useLanes,
1387 // equivalent to TplConvert::_2bool used in SUMOSAXAttributes::getBool
1388 excludeEmpty[0] != 't' && excludeEmpty[0] != 'T' && excludeEmpty[0] != '1' && excludeEmpty[0] != 'x',
1389 excludeEmpty == "defaults", withInternal, trackVehicles, detectPersons,
1390 maxTravelTime, minSamples, haltingSpeedThreshold, vtypes, writeAttributes, edges, aggregate,
1392 } catch (InvalidArgument& e) {
1393 WRITE_ERROR(e.what());
1394 } catch (IOError& e) {
1395 WRITE_ERROR(e.what());
1396 }
1397}
1398
1399
1400void
1402 bool ok = true;
1403 const std::string fromID = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
1404 const std::string toID = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
1405 if (!MSGlobals::gUsingInternalLanes && (fromID[0] == ':' || toID[0] == ':')) {
1406 std::string tlID = attrs.getOpt<std::string>(SUMO_ATTR_TLID, nullptr, ok, "");
1407 if (tlID != "") {
1408 int tlLinkIdx = attrs.get<int>(SUMO_ATTR_TLLINKINDEX, nullptr, ok);
1410 }
1411 return;
1412 }
1413
1414 myCurrentLink = nullptr;
1415 try {
1416 const int fromLaneIdx = attrs.get<int>(SUMO_ATTR_FROM_LANE, nullptr, ok);
1417 const int toLaneIdx = attrs.get<int>(SUMO_ATTR_TO_LANE, nullptr, ok);
1418 LinkDirection dir = parseLinkDir(attrs.get<std::string>(SUMO_ATTR_DIR, nullptr, ok));
1419 LinkState state = parseLinkState(attrs.get<std::string>(SUMO_ATTR_STATE, nullptr, ok));
1420 const double foeVisibilityDistance = attrs.getOpt<double>(SUMO_ATTR_VISIBILITY_DISTANCE, nullptr, ok, state == LINKSTATE_ZIPPER ? 100 : 4.5);
1421 const bool keepClear = attrs.getOpt<bool>(SUMO_ATTR_KEEP_CLEAR, nullptr, ok, true);
1422 const bool indirect = attrs.getOpt<bool>(SUMO_ATTR_INDIRECT, nullptr, ok, false);
1423 std::string tlID = attrs.getOpt<std::string>(SUMO_ATTR_TLID, nullptr, ok, "");
1424 std::string viaID = attrs.getOpt<std::string>(SUMO_ATTR_VIA, nullptr, ok, "");
1425
1427 if (from == nullptr) {
1428 WRITE_ERRORF(TL("Unknown from-edge '%' in connection."), fromID);
1429 return;
1430 }
1431 myPreviousEdgeIdx = from->getNumericalID();
1432 MSEdge* to = MSEdge::dictionary(toID);
1433 if (to == nullptr) {
1434 WRITE_ERRORF(TL("Unknown to-edge '%' in connection."), toID);
1435 return;
1436 }
1437 if (fromLaneIdx < 0 || fromLaneIdx >= (int)from->getLanes().size() ||
1438 toLaneIdx < 0 || toLaneIdx >= (int)to->getLanes().size()) {
1439 WRITE_ERRORF(TL("Invalid lane index in connection from '%' to '%'."), from->getID(), to->getID());
1440 return;
1441 }
1442 MSLane* fromLane = from->getLanes()[fromLaneIdx];
1443 MSLane* toLane = to->getLanes()[toLaneIdx];
1444 assert(fromLane);
1445 assert(toLane);
1446
1447 MSTrafficLightLogic* logic = nullptr;
1448 int tlLinkIdx = -1;
1449 if (tlID != "") {
1450 tlLinkIdx = attrs.get<int>(SUMO_ATTR_TLLINKINDEX, nullptr, ok);
1451 // make sure that the index is in range
1453 if ((tlLinkIdx < 0 || tlLinkIdx >= (int)logic->getCurrentPhaseDef().getState().size())
1454 && logic->getLogicType() != TrafficLightType::RAIL_SIGNAL
1455 && logic->getLogicType() != TrafficLightType::RAIL_CROSSING) {
1456 WRITE_ERROR("Invalid " + toString(SUMO_ATTR_TLLINKINDEX) + " '" + toString(tlLinkIdx) +
1457 "' in connection controlled by '" + tlID + "'");
1458 return;
1459 }
1460 if (!ok) {
1461 return;
1462 }
1463 }
1464 double length;
1465 // build the link
1466 MSLane* via = nullptr;
1467 if (viaID != "" && MSGlobals::gUsingInternalLanes) {
1468 via = MSLane::dictionary(viaID);
1469 if (via == nullptr) {
1470 WRITE_ERROR("An unknown lane ('" + viaID +
1471 "') should be set as a via-lane for lane '" + toLane->getID() + "'.");
1472 return;
1473 }
1474 length = via->getLength();
1475 } else if (toLane->getEdge().isCrossing()) {
1476 length = toLane->getLength();
1477 } else {
1478 length = fromLane->getShape()[-1].distanceTo(toLane->getShape()[0]);
1479 }
1480 myCurrentLink = new MSLink(fromLane, toLane, via, dir, state, length, foeVisibilityDistance, keepClear, logic, tlLinkIdx, indirect);
1481 if (via != nullptr) {
1482 via->addIncomingLane(fromLane, myCurrentLink);
1483 } else {
1484 toLane->addIncomingLane(fromLane, myCurrentLink);
1485 }
1486 toLane->addApproachingLane(fromLane, myNetworkVersion < MMVersion(0, 25));
1487
1488 // if a traffic light is responsible for it, inform the traffic light
1489 // check whether this link is controlled by a traffic light
1490 // we can not reuse logic here because it might be an inactive one
1491 if (tlID != "") {
1492 myJunctionControlBuilder.getTLLogic(tlID).addLink(myCurrentLink, fromLane, tlLinkIdx);
1493 }
1494 // add the link
1495 fromLane->addLink(myCurrentLink);
1496
1497 } catch (InvalidArgument& e) {
1498 WRITE_ERROR(e.what());
1499 }
1500}
1501
1502
1503void
1505 if (myCurrentLink == nullptr) {
1506 throw InvalidArgument(toString(SUMO_TAG_CONFLICT) + " must occur within a " + toString(SUMO_TAG_CONNECTION) + " element");
1507 }
1509 return;
1510 }
1511 bool ok = true;
1512 const std::string fromID = attrs.get<std::string>(SUMO_ATTR_FROM, nullptr, ok);
1513 const std::string toID = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
1514 const int fromLaneIdx = attrs.get<int>(SUMO_ATTR_FROM_LANE, nullptr, ok);
1515 const int toLaneIdx = attrs.get<int>(SUMO_ATTR_TO_LANE, nullptr, ok);
1516 double startPos = attrs.get<double>(SUMO_ATTR_STARTPOS, nullptr, ok);
1517 double endPos = attrs.get<double>(SUMO_ATTR_ENDPOS, nullptr, ok);
1518 MSEdge* from = MSEdge::dictionary(fromID);
1519 if (from == nullptr) {
1520 WRITE_ERRORF(TL("Unknown from-edge '%' in conflict."), fromID);
1521 return;
1522 }
1523 MSEdge* to = MSEdge::dictionary(toID);
1524 if (to == nullptr) {
1525 WRITE_ERRORF(TL("Unknown to-edge '%' in conflict."), toID);
1526 return;
1527 }
1528 if (fromLaneIdx < 0 || fromLaneIdx >= (int)from->getLanes().size() ||
1529 toLaneIdx < 0 || toLaneIdx >= (int)to->getLanes().size()) {
1530 WRITE_ERRORF(TL("Invalid lane index in conflict with '%' to '%'."), from->getID(), to->getID());
1531 return;
1532 }
1533 MSLane* fromLane = from->getLanes()[fromLaneIdx];
1534 MSLane* toLane = to->getLanes()[toLaneIdx];
1535 assert(fromLane);
1536 assert(toLane);
1537 myCurrentLink->addCustomConflict(fromLane, toLane, startPos, endPos);
1538}
1539
1540
1542NLHandler::parseLinkDir(const std::string& dir) {
1543 if (SUMOXMLDefinitions::LinkDirections.hasString(dir)) {
1545 } else {
1546 throw InvalidArgument("Unrecognised link direction '" + dir + "'.");
1547 }
1548}
1549
1550
1552NLHandler::parseLinkState(const std::string& state) {
1553 if (SUMOXMLDefinitions::LinkStates.hasString(state)) {
1554 return SUMOXMLDefinitions::LinkStates.get(state);
1555 } else {
1556 if (state == "t") { // legacy networks
1557 // WRITE_WARNING(TL("Obsolete link state 't'. Use 'o' instead"));
1559 } else {
1560 throw InvalidArgument("Unrecognised link state '" + state + "'.");
1561 }
1562 }
1563}
1564
1565
1566// ----------------------------------
1567void
1569 if (myNetIsLoaded) {
1570 //WRITE_WARNING(TL("POIs and Polygons should be loaded using option --po-files"))
1571 return;
1572 }
1573 bool ok = true;
1574 PositionVector s = attrs.get<PositionVector>(SUMO_ATTR_NET_OFFSET, nullptr, ok);
1575 Boundary convBoundary = attrs.get<Boundary>(SUMO_ATTR_CONV_BOUNDARY, nullptr, ok);
1576 Boundary origBoundary = attrs.get<Boundary>(SUMO_ATTR_ORIG_BOUNDARY, nullptr, ok);
1577 std::string proj = attrs.get<std::string>(SUMO_ATTR_ORIG_PROJ, nullptr, ok);
1578 if (ok) {
1579 Position networkOffset = s[0];
1580 GeoConvHelper::init(proj, networkOffset, origBoundary, convBoundary);
1581 if (OptionsCont::getOptions().getBool("fcd-output.geo") && !GeoConvHelper::getFinal().usingGeoProjection()) {
1582 WRITE_WARNING(TL("no valid geo projection loaded from network. fcd-output.geo will not work"));
1583 }
1584 }
1585}
1586
1587
1588void
1590 bool ok = true;
1591 myCurrentIsBroken = false;
1592 // get the id, report an error if not given or empty...
1593 myCurrentDistrictID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
1594 if (!ok) {
1595 myCurrentIsBroken = true;
1596 return;
1597 }
1598 try {
1599 const std::string sinkID = myCurrentDistrictID + "-sink";
1600 const std::string sourceID = myCurrentDistrictID + "-source";
1601
1602 MSEdge* sink = myEdgeControlBuilder.buildEdge(sinkID, SumoXMLEdgeFunc::CONNECTOR, "", "", -1, 0);
1603 if (!MSEdge::dictionary(sinkID, sink)) {
1604 delete sink;
1605 if (OptionsCont::getOptions().getBool("junction-taz")
1607 // overwrite junction taz
1608 sink = MSEdge::dictionary(sinkID);
1610 WRITE_WARNINGF(TL("Replacing junction-taz '%' with loaded TAZ."), myCurrentDistrictID);
1611 } else {
1612 throw InvalidArgument("Another edge with the id '" + sinkID + "' exists.");
1613 }
1614 } else {
1615 sink->initialize(new std::vector<MSLane*>());
1616 }
1617 MSEdge* source = myEdgeControlBuilder.buildEdge(sourceID, SumoXMLEdgeFunc::CONNECTOR, "", "", -1, 0);
1618 if (!MSEdge::dictionary(sourceID, source)) {
1619 delete source;
1620 if (OptionsCont::getOptions().getBool("junction-taz")
1622 // overwrite junction taz
1623 source = MSEdge::dictionary(sourceID);
1625 } else {
1626 throw InvalidArgument("Another edge with the id '" + sourceID + "' exists.");
1627 }
1628 } else {
1629 source->initialize(new std::vector<MSLane*>());
1630 }
1631 sink->setOtherTazConnector(source);
1632 source->setOtherTazConnector(sink);
1633 const std::vector<std::string>& desc = attrs.getOpt<std::vector<std::string> >(SUMO_ATTR_EDGES, myCurrentDistrictID.c_str(), ok);
1634 for (const std::string& eID : desc) {
1635 MSEdge* edge = MSEdge::dictionary(eID);
1636 // check whether the edge exists
1637 if (edge == nullptr) {
1638 throw InvalidArgument("The edge '" + eID + "' within district '" + myCurrentDistrictID + "' is not known.");
1639 }
1640 source->addSuccessor(edge);
1641 edge->addSuccessor(sink);
1642 }
1643 source->setParameter("taz", myCurrentDistrictID);
1644 sink->setParameter("taz", myCurrentDistrictID);
1645 RGBColor color = attrs.getOpt<RGBColor>(SUMO_ATTR_COLOR, myCurrentDistrictID.c_str(), ok, RGBColor::parseColor("1.0,.33,.33"));
1646 const std::string name = attrs.getOpt<std::string>(SUMO_ATTR_NAME, myCurrentDistrictID.c_str(), ok, "");
1647 source->setParameter("tazColor", toString(color));
1648 sink->setParameter("tazColor", toString(color));
1649
1650 if (attrs.hasAttribute(SUMO_ATTR_SHAPE)) {
1652 const bool fill = attrs.getOpt<bool>(SUMO_ATTR_FILL, myCurrentDistrictID.c_str(), ok, false);
1653 if (shape.size() != 0) {
1654 if (!myNet.getShapeContainer().addPolygon(myCurrentDistrictID, "taz", color, 0, 0, "", false, shape, false, fill, 1.0, false, name)) {
1655 WRITE_WARNINGF(TL("Skipping visualization of taz '%', polygon already exists."), myCurrentDistrictID);
1656 } else {
1658 myCurrentIsBroken = false;
1659 }
1660 }
1661 }
1662 } catch (InvalidArgument& e) {
1663 WRITE_ERROR(e.what());
1664 myCurrentIsBroken = true;
1665 }
1666}
1667
1668
1669void
1670NLHandler::addDistrictEdge(const SUMOSAXAttributes& attrs, bool isSource) {
1671 if (myCurrentIsBroken) {
1672 // earlier error
1673 return;
1674 }
1675 bool ok = true;
1676 std::string id = attrs.get<std::string>(SUMO_ATTR_ID, myCurrentDistrictID.c_str(), ok);
1677 MSEdge* succ = MSEdge::dictionary(id);
1678 if (succ != nullptr) {
1679 // connect edge
1680 if (isSource) {
1681 MSEdge::dictionary(myCurrentDistrictID + "-source")->addSuccessor(succ);
1682 } else {
1683 succ->addSuccessor(MSEdge::dictionary(myCurrentDistrictID + "-sink"));
1684 }
1685 } else {
1686 WRITE_ERRORF(TL("At district '%': succeeding edge '%' does not exist."), myCurrentDistrictID, id);
1687 }
1688}
1689
1690
1691void
1693 bool ok = true;
1694 const std::vector<std::string>& edgeIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_EDGES, nullptr, ok);
1695 if (ok) {
1696 for (const std::string& eID : edgeIDs) {
1697 MSEdge* edge = MSEdge::dictionary(eID);
1698 if (edge == nullptr) {
1699 WRITE_ERRORF(TL("Unknown edge '%' in roundabout"), eID);
1700 } else {
1701 edge->markAsRoundabout();
1702 }
1703 }
1704 }
1705}
1706
1707
1708void
1710 bool ok = true;
1711 MESegment::MesoEdgeType edgeType = myNet.getMesoType(""); // init defaults
1712 edgeType.tauff = attrs.getOptSUMOTimeReporting(SUMO_ATTR_MESO_TAUFF, myCurrentTypeID.c_str(), ok, edgeType.tauff);
1713 edgeType.taufj = attrs.getOptSUMOTimeReporting(SUMO_ATTR_MESO_TAUFJ, myCurrentTypeID.c_str(), ok, edgeType.taufj);
1714 edgeType.taujf = attrs.getOptSUMOTimeReporting(SUMO_ATTR_MESO_TAUJF, myCurrentTypeID.c_str(), ok, edgeType.taujf);
1715 edgeType.taujj = attrs.getOptSUMOTimeReporting(SUMO_ATTR_MESO_TAUJJ, myCurrentTypeID.c_str(), ok, edgeType.taujj);
1716 edgeType.jamThreshold = attrs.getOpt<double>(SUMO_ATTR_JAM_DIST_THRESHOLD, myCurrentTypeID.c_str(), ok, edgeType.jamThreshold);
1717 edgeType.junctionControl = attrs.getOpt<bool>(SUMO_ATTR_MESO_JUNCTION_CONTROL, myCurrentTypeID.c_str(), ok, edgeType.junctionControl);
1718 edgeType.tlsPenalty = attrs.getOpt<double>(SUMO_ATTR_MESO_TLS_PENALTY, myCurrentTypeID.c_str(), ok, edgeType.tlsPenalty);
1719 edgeType.tlsFlowPenalty = attrs.getOpt<double>(SUMO_ATTR_MESO_TLS_FLOW_PENALTY, myCurrentTypeID.c_str(), ok, edgeType.tlsFlowPenalty);
1721 edgeType.overtaking = attrs.getOpt<bool>(SUMO_ATTR_MESO_OVERTAKING, myCurrentTypeID.c_str(), ok, edgeType.overtaking);
1722
1723 if (ok) {
1725 }
1726 if (myNetIsLoaded) {
1728 }
1729}
1730
1731void
1733 bool ok = true;
1734 std::vector<std::string> signalIDs = attrs.get<std::vector<std::string>>(SUMO_ATTR_SIGNALS, nullptr, ok);
1735 std::vector<const MSRailSignal*> signals;
1736 for (const std::string& id : signalIDs) {
1738 const MSRailSignal* rs = dynamic_cast<const MSRailSignal*>(tll);
1739 if (rs != nullptr) {
1740 signals.push_back(rs);
1741 } else {
1742 throw InvalidArgument("Rail signal '" + toString(id) + "' in " + toString(SUMO_TAG_DEADLOCK) + " is not known");
1743 }
1744 }
1746}
1747
1748// ----------------------------------
1749void
1751 try {
1753 } catch (InvalidArgument& e) {
1754 WRITE_ERROR(e.what());
1755 }
1756}
1757
1758
1759void
1761 if (!myCurrentIsBroken) {
1762 try {
1764 } catch (InvalidArgument& e) {
1765 WRITE_ERROR(e.what());
1766 myCurrentIsBroken = true;
1767 }
1768 }
1769 myCurrentWAUTID = "";
1770}
1771
1772
1774NLShapeHandler::getLanePos(const std::string& poiID, const std::string& laneID, double lanePos, bool friendlyPos, double lanePosLat) {
1775 MSLane* lane = MSLane::dictionary(laneID);
1776 if (lane == nullptr) {
1777 WRITE_ERRORF(TL("Lane '%' to place poi '%' on is not known."), laneID, poiID);
1778 return Position::INVALID;
1779 }
1780 if (lanePos < 0) {
1781 lanePos = lane->getLength() + lanePos;
1782 }
1783 if ((lanePos < 0) && friendlyPos) {
1784 lanePos = 0;
1785 }
1786 if ((lanePos > lane->getLength()) && friendlyPos) {
1787 lanePos = lane->getLength();
1788 }
1789 if (lanePos < 0 || lanePos > lane->getLength()) {
1790 WRITE_WARNINGF(TL("lane position % for poi '%' is not valid."), toString(lanePos), poiID);
1791 }
1792 return lane->geometryPositionAtOffset(lanePos, -lanePosLat);
1793}
1794
1795
1798 if (rs == nullptr) {
1799 throw InvalidArgument("Rail signal '" + toString((SumoXMLTag)element) + "' constraint must occur within a railSignalConstraints element");
1800 }
1801 bool ok = true;
1802 const std::string tripId = attrs.get<std::string>(SUMO_ATTR_TRIP_ID, nullptr, ok);
1803 const std::string signalID = attrs.get<std::string>(SUMO_ATTR_TLID, nullptr, ok);
1804 const std::string foesString = attrs.get<std::string>(SUMO_ATTR_FOES, nullptr, ok);
1805 const std::vector<std::string> foes = StringTokenizer(foesString).getVector();
1806 const int limit = attrs.getOpt<int>(SUMO_ATTR_LIMIT, nullptr, ok, (int)foes.size());
1807 const bool active = attrs.getOpt<bool>(SUMO_ATTR_ACTIVE, nullptr, ok, true);
1808
1809 if (!MSNet::getInstance()->getTLSControl().knows(signalID)) {
1810 throw InvalidArgument("Rail signal '" + signalID + "' in railSignalConstraints is not known");
1811 }
1812 MSRailSignal* signal = dynamic_cast<MSRailSignal*>(MSNet::getInstance()->getTLSControl().get(signalID).getDefault());
1813 if (signal == nullptr) {
1814 throw InvalidArgument("Traffic light '" + signalID + "' is not a rail signal");
1815 }
1817 switch (element) {
1820 break;
1823 break;
1826 break;
1829 break;
1832 break;
1833 default:
1834 throw InvalidArgument("Unsupported rail signal constraint '" + toString((SumoXMLTag)element) + "'");
1835 }
1836 Parameterised* result = nullptr;
1837 if (ok) {
1838 for (const std::string& foe : foes) {
1839 MSRailSignalConstraint* c = new MSRailSignalConstraint_Predecessor(type, signal, foe, limit, active);
1840 rs->addConstraint(tripId, c);
1841 // XXX if there are multiple foes, only one constraint will receive the parameters
1842 result = c;
1843 }
1844 }
1845 return result;
1846}
1847
1848
1849/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:296
#define WRITE_ERRORF(...)
Definition MsgHandler.h:305
#define WRITE_ERROR(msg)
Definition MsgHandler.h:304
#define WRITE_WARNING(msg)
Definition MsgHandler.h:295
#define TL(string)
Definition MsgHandler.h:315
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SUMOTime_MAX_PERIOD
Definition SUMOTime.h:36
#define TIME2STEPS(x)
Definition SUMOTime.h:57
SUMOVehicleClass getVehicleClassID(const std::string &name)
Returns the class id of the abstract class given by its name.
const SVCPermissions SVCAll
all VClasses are allowed
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_TRACTION_SUBSTATION
A traction substation.
@ SUMO_TAG_PHASE
a single phase description
@ SUMO_TAG_RAILSIGNAL_CONSTRAINTS
Constraints on switching a rail signal.
@ SUMO_TAG_BIDI_PREDECESSOR
Predecessor constraint for rail signal before bidirectional section.
@ SUMO_TAG_NET
root element of a network file
@ SUMO_TAG_REROUTER
A rerouter.
@ SUMO_TAG_INSERTION_PREDECESSOR
Predecessor constraint on insertion before rail signal.
@ SUMO_TAG_STOPOFFSET
Information on vClass specific stop offsets at lane end.
@ SUMO_TAG_WAUT_JUNCTION
@ SUMO_TAG_REQUEST
description of a logic request within the junction
@ SUMO_TAG_WAUT_SWITCH
@ SUMO_TAG_ROUTEPROBE
a routeprobe detector
@ SUMO_TAG_TAZ
a traffic assignment zone
@ SUMO_TAG_TIMEDEVENT
The definition of a periodic event.
@ SUMO_TAG_E2DETECTOR
an e2 detector
@ SUMO_TAG_CHARGING_STATION
A Charging Station.
@ SUMO_TAG_CONFLICT
conflict between two connections
@ SUMO_TAG_ACCESS
An access point for a train stop.
@ SUMO_TAG_CONDITION
a condition for phase switching
@ SUMO_TAG_CONTAINER_STOP
A container stop.
@ SUMO_TAG_TAZSINK
a sink within a district (connection road)
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_MESO
edge-specific meso settings
@ SUMO_TAG_FUNCTION
a sequence of assignments evaluated in the context of passed arguments
@ SUMO_TAG_MEANDATA_LANE
a lane based mean data detector
@ SUMO_TAG_LOCATION
@ SUMO_TAG_RESTRICTION
begin/end of the description of an edge restriction
@ SUMO_TAG_OVERHEAD_WIRE_CLAMP
An overhead wire clamp (connection of wires in opposite directions)
@ SUMO_TAG_CONNECTION
connectioon between two lanes
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_TAG_ROUNDABOUT
roundabout defined in junction
@ SUMO_TAG_DET_ENTRY
an e3 entry point
@ SUMO_TAG_TLLOGIC
a traffic light logic
@ SUMO_TAG_PARKING_SPACE
A parking space for a single vehicle within a parking area.
@ SUMO_TAG_FOE_INSERTION
Predecessor constraint on switching a rail signal.
@ SUMO_TAG_JUNCTION
begin/end of the description of a junction
@ SUMO_TAG_MEANDATA_EDGE
an edge based mean data detector
@ SUMO_TAG_OVERHEAD_WIRE_SECTION
An overhead wire section.
@ SUMO_TAG_VTYPEPROBE
a vtypeprobe detector
@ SUMO_TAG_TRAIN_STOP
A train stop (alias for bus stop)
@ SUMO_TAG_OVERHEAD_WIRE_SEGMENT
An overhead wire segment.
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_INSTANT_INDUCTION_LOOP
An instantenous induction loop.
@ SUMO_TAG_PARAM
parameter associated to a certain key
@ SUMO_TAG_E1DETECTOR
an e1 detector
@ SUMO_TAG_INSERTION_ORDER
Predecessor constraint on insertion before rail signal.
@ SUMO_TAG_DET_EXIT
an e3 exit point
@ SUMO_TAG_TYPE
type (edge)
@ SUMO_TAG_VAPORIZER
vaporizer of vehicles
@ SUMO_TAG_LANE_AREA_DETECTOR
alternative tag for e2 detector
@ SUMO_TAG_WAUT
@ SUMO_TAG_ASSIGNMENT
a conditional variable assignment for phase switching
@ SUMO_TAG_TAZSOURCE
a source within a district (connection road)
@ SUMO_TAG_NEIGH
begin/end of the description of a neighboring lane
@ SUMO_TAG_INDUCTION_LOOP
alternative tag for e1 detector
@ SUMO_TAG_DEADLOCK
Saved deadlock information, also for loading as an extra check.
@ SUMO_TAG_CALIBRATOR
A calibrator placed over edge.
@ SUMO_TAG_ENTRY_EXIT_DETECTOR
alternative tag for e3 detector
@ SUMO_TAG_E3DETECTOR
an e3 detector
@ SUMO_TAG_VSS
A variable speed sign.
@ SUMO_TAG_PREDECESSOR
Predecessor constraint on switching a rail signal.
@ SUMO_TAG_EDGE
begin/end of the description of an edge
LinkDirection
The different directions a link between two lanes may take (or a stream between two edges)....
SumoXMLEdgeFunc
Numbers representing special SUMO-XML-attribute values for representing edge functions used in netbui...
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_ZIPPER
This is an uncontrolled, zipper-merge link.
@ LINKSTATE_TL_OFF_BLINKING
The link is controlled by a tls which is off and blinks, has to brake.
SumoXMLNodeType
Numbers representing special SUMO-XML-attribute values for representing node- (junction-) types used ...
@ SUMO_ATTR_EXPECT_ARRIVAL
@ SUMO_ATTR_STARTPOS
@ SUMO_ATTR_DISALLOW
@ SUMO_ATTR_CONV_BOUNDARY
@ SUMO_ATTR_ALLOW
@ SUMO_ATTR_LANE
@ SUMO_ATTR_NET_OFFSET
@ SUMO_ATTR_NARGS
The number of arguments for a condition function.
@ SUMO_ATTR_CONT
@ SUMO_ATTR_ORIG_BOUNDARY
@ SUMO_ATTR_MESO_TLS_FLOW_PENALTY
@ SUMO_ATTR_LATEST_END
The maximum time within the cycle for switching (for coordinated actuation)
@ SUMO_ATTR_MESO_JUNCTION_CONTROL
@ SUMO_ATTR_RED
red duration of a phase
@ SUMO_ATTR_SPEED
@ SUMO_ATTR_VALUE
@ SUMO_ATTR_VIA
@ SUMO_ATTR_NEXT_EDGES
@ SUMO_ATTR_FILE
@ SUMO_ATTR_PROCEDURE
@ SUMO_ATTR_INDIRECT
Whether this connection is an indirect (left) turn.
@ SUMO_ATTR_Y
@ SUMO_ATTR_FROM_LANE
@ SUMO_ATTR_Z
@ SUMO_ATTR_EDGE
@ SUMO_ATTR_JAM_DIST_THRESHOLD
@ SUMO_ATTR_MESO_OVERTAKING
@ SUMO_ATTR_TRACK_VEHICLES
@ SUMO_ATTR_RESPONSE
@ SUMO_ATTR_ENDPOS
@ SUMO_ATTR_TARGETLANE
@ SUMO_ATTR_OFFSET
@ SUMO_ATTR_X
@ SUMO_ATTR_WAUT_ID
@ SUMO_ATTR_YELLOW
yellow duration of a phase
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_INTLANES
@ SUMO_ATTR_VEHICLEEXTENSION
vehicle extension time of a phase
@ SUMO_ATTR_WITH_INTERNAL
@ SUMO_ATTR_EDGES
the edges of a route
@ SUMO_ATTR_START_PROG
@ SUMO_ATTR_BIDI
@ SUMO_ATTR_AGGREGATE
@ SUMO_ATTR_HALTING_TIME_THRESHOLD
@ SUMO_ATTR_LIMIT
@ SUMO_ATTR_PRIORITY
@ SUMO_ATTR_MESO_TAUFF
@ SUMO_ATTR_LANES
@ SUMO_ATTR_VTYPES
@ SUMO_ATTR_SHAPE
edge: the shape in xml-definition
@ SUMO_ATTR_LEFTHAND
@ SUMO_ATTR_SIGNALS
@ SUMO_ATTR_NEXT
succesor phase index
@ SUMO_ATTR_MAX_TRAVELTIME
@ SUMO_ATTR_MESO_MINOR_PENALTY
@ SUMO_ATTR_INCLANES
@ SUMO_ATTR_CHANGE_LEFT
@ SUMO_ATTR_INDEX
@ SUMO_ATTR_FILL
Fill the polygon.
@ SUMO_ATTR_NAME
@ SUMO_ATTR_ORIG_PROJ
@ SUMO_ATTR_PERIOD
@ SUMO_ATTR_FINAL_TARGET
The condition expression for switching into this phase when the active phase must end.
@ SUMO_ATTR_HALTING_SPEED_THRESHOLD
@ SUMO_ATTR_HIGHER_SPEED
@ SUMO_ATTR_TRIP_ID
@ SUMO_ATTR_TO
@ SUMO_ATTR_FROM
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_ACCELERATION
@ SUMO_ATTR_CHANGE_RIGHT
@ SUMO_ATTR_TLID
link,node: the traffic light id responsible for this link
@ SUMO_ATTR_VCLASS
@ SUMO_ATTR_DISTANCE
@ SUMO_ATTR_EARLY_TARGET
The condition expression for an early switch into this phase.
@ SUMO_ATTR_MESO_TAUJF
@ SUMO_ATTR_SHOW_DETECTOR
@ SUMO_ATTR_FOES
@ SUMO_ATTR_FRIENDLY_POS
@ SUMO_ATTR_TO_LANE
@ SUMO_ATTR_MIN_SAMPLES
@ SUMO_ATTR_JUNCTION_ID
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_LENGTH
@ SUMO_ATTR_VERSION
@ SUMO_ATTR_COLOR
A color information.
@ SUMO_ATTR_ID
@ SUMO_ATTR_MAXDURATION
maximum duration of a phase
@ SUMO_ATTR_PROGRAMID
@ SUMO_ATTR_OUTLINESHAPE
edge: the outline shape in xml-definition
@ SUMO_ATTR_FUNCTION
@ SUMO_ATTR_MESO_TAUFJ
@ SUMO_ATTR_VISIBILITY_DISTANCE
foe visibility distance of a link
@ SUMO_ATTR_OPEN_ENTRY
@ SUMO_ATTR_MESO_TAUJJ
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_WIDTH
@ SUMO_ATTR_CROSSING_EDGES
the edges crossed by a pedestrian crossing
@ SUMO_ATTR_SYNCHRON
@ SUMO_ATTR_DIR
The abstract direction of a link.
@ SUMO_ATTR_TLLINKINDEX
link: the index of the link within the traffic light
@ SUMO_ATTR_MINDURATION
@ SUMO_ATTR_CHECK
The expression for a condition assignment.
@ SUMO_ATTR_MESO_TLS_PENALTY
@ SUMO_ATTR_KEY
@ SUMO_ATTR_REF_TIME
@ SUMO_ATTR_KEEP_CLEAR
Whether vehicles must keep the junction clear.
@ SUMO_ATTR_POSITION
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_FRICTION
@ SUMO_ATTR_TIME
trigger: the time of the step
@ SUMO_ATTR_WRITE_ATTRIBUTES
@ SUMO_ATTR_ACTIVE
@ SUMO_ATTR_DETECT_PERSONS
@ SUMO_ATTR_EXCLUDE_EMPTY
@ SUMO_ATTR_EDGESFILE
@ SUMO_ATTR_EARLIEST_END
The minimum time within the cycle for switching (for coordinated actuation)
const double SUMO_const_laneWidth
Definition StdDefs.h:48
std::pair< int, double > MMVersion
(M)ajor/(M)inor version for written networks and default version for loading
Definition StdDefs.h:67
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
A class that stores a 2D geometrical boundary.
Definition Boundary.h:39
static std::string checkForRelativity(const std::string &filename, const std::string &basePath)
Returns the path from a configuration so that it is accessable from the current working directory.
const std::string & getFileName() const
returns the current file name
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
static bool init(OptionsCont &oc)
Initialises the processing and the final instance using the given options.
A road/street connecting two junctions.
Definition MSEdge.h:77
bool isCrossing() const
return whether this edge is a pedestrian crossing
Definition MSEdge.h:273
void setOtherTazConnector(const MSEdge *edge)
Definition MSEdge.h:295
void setJunctions(MSJunction *from, MSJunction *to)
Definition MSEdge.cpp:1319
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
void addSuccessor(MSEdge *edge, const MSEdge *via=nullptr)
Adds an edge to the list of edges which may be reached from this edge and to the incoming of the othe...
Definition MSEdge.cpp:1243
static MSEdge * dictionaryHint(const std::string &id, const int startIdx)
Returns the MSEdge associated to the key id giving a hint with a numerical id.
Definition MSEdge.cpp:1073
void initialize(const std::vector< MSLane * > *lanes)
Initialize the edge.
Definition MSEdge.cpp:102
void resetTAZ(MSJunction *junction)
Definition MSEdge.cpp:182
static bool dictionary(const std::string &id, MSEdge *edge)
Inserts edge into the static dictionary Returns true if the key id isn't already in the dictionary....
Definition MSEdge.cpp:1047
void markAsRoundabout()
Definition MSEdge.h:725
static bool gUseMesoSim
Definition MSGlobals.h:106
static bool gLefthand
Whether lefthand-drive is being simulated.
Definition MSGlobals.h:174
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
Definition MSGlobals.h:81
The base class for an intersection.
Definition MSJunction.h:58
void addOutgoing(MSEdge *edge)
Definition MSJunction.h:128
void addIncoming(MSEdge *edge)
Definition MSJunction.h:124
Representation of a lane in the micro simulation.
Definition MSLane.h:84
void addApproachingLane(MSLane *lane, bool warnMultiCon)
Definition MSLane.cpp:2789
void addIncomingLane(MSLane *lane, MSLink *viaLink)
Definition MSLane.cpp:2779
void addLink(MSLink *link)
Delayed initialization.
Definition MSLane.cpp:325
double getLength() const
Returns the lane's length.
Definition MSLane.h:606
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition MSLane.cpp:2414
virtual const PositionVector & getShape(bool) const
Definition MSLane.h:294
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:764
const Position geometryPositionAtOffset(double offset, double lateralOffset=0) const
Definition MSLane.h:560
The simulated network and simulation perfomer.
Definition MSNet.h:89
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:185
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition MSNet.h:451
MSJunctionControl & getJunctionControl()
Returns the junctions control.
Definition MSNet.h:461
void setPermissionsFound()
Labels the network to contain vehicle class permissions.
Definition MSNet.h:213
void addMesoType(const std::string &typeID, const MESegment::MesoEdgeType &edgeType)
Adds edge type specific meso parameters.
Definition MSNet.cpp:361
ShapeContainer & getShapeContainer()
Returns the shapes container.
Definition MSNet.h:501
void addRestriction(const std::string &id, const SUMOVehicleClass svc, const double speed)
Adds a restriction for an edge type.
Definition MSNet.cpp:346
const MESegment::MesoEdgeType & getMesoType(const std::string &typeID)
Returns edge type specific meso parameters if no type specific parameters have been loaded,...
Definition MSNet.cpp:366
The definition of a single phase of a tls logic.
std::string name
Optional name or description for the current phase.
std::vector< std::string > myTargetLaneSet
SUMOTime maxDuration
The maximum duration of the phase.
bool myCommit
the phase is a commit, compulsory directive for SOTL policies
static const SUMOTime UNSPECIFIED_DURATION
SUMOTime vehext
for NEMA phase
SUMOTime latestEnd
The maximum time within the cycle for switching (for coordinated actuation)
bool myTransientNotDecisional
the phase is a transient one or a decisional one, compulsory directive for SOTL policies
SUMOTime minDuration
The minimum duration of the phase.
SUMOTime yellow
for NEMA phase
SUMOTime red
for NEMA phase
SUMOTime myLastSwitch
Stores the timestep of the last on-switched of the phase.
SUMOTime duration
The duration of the phase.
std::vector< int > nextPhases
The index of the phase that suceeds this one (or -1)
std::string finalTarget
The condition expression for switching into this phase when the active phase must end.
std::string earlyTarget
The condition expression for an early switch into this phase.
SUMOTime earliestEnd
The minimum time within the cycle for switching (for coordinated actuation)
A base class for constraints.
void addDeadlockCheck(std::vector< const MSRailSignal * > signals)
static MSRailSignalControl & getInstance()
A signal for rails.
void addConstraint(const std::string &tripId, MSRailSignalConstraint *constraint)
register constraint for signal switching
Parser and container for routes during their loading.
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
Storage for all programs of a single tls.
void addLink(MSLink *link, MSLane *lane, int pos)
MSTrafficLightLogic * getActive() const
MSTrafficLightLogic * getDefault() const
return the default program (that last used program except TRACI_PROGRAM)
void addWAUTJunction(const std::string &wautid, const std::string &tls, const std::string &proc, bool synchron)
Adds a tls to the list of tls to be switched by the named WAUT.
void addWAUT(SUMOTime refTime, const std::string &id, const std::string &startProg, SUMOTime period)
Adds a WAUT definition.
MSTrafficLightLogic * getActive(const std::string &id) const
Returns the active program of a named tls.
bool knows(const std::string &id) const
Returns the information whether the named tls is stored.
void addWAUTSwitch(const std::string &wautid, SUMOTime when, const std::string &to)
Adds a WAUT switch step to a previously built WAUT.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
void closeWAUT(const std::string &wautid)
Closes loading of a WAUT.
The parent class for traffic light logics.
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
Builds detectors for microsim.
void endE3Detector()
Builds of an e3 detector using collected values.
void createEdgeLaneMeanData(const std::string &id, SUMOTime frequency, SUMOTime begin, SUMOTime end, const std::string &type, const bool useLanes, const bool withEmpty, const bool printDefaults, const bool withInternal, const bool trackVehicles, const int detectPersons, const double maxTravelTime, const double minSamples, const double haltSpeed, const std::string &vTypes, const std::string &writeAttributes, std::vector< MSEdge * > edges, bool aggregate, const std::string &device)
Creates edge based mean data collector using the given specification.
MSLane * getLaneChecking(const std::string &laneID, SumoXMLTag type, const std::string &detid)
Returns the named lane.
void buildVTypeProbe(const std::string &id, const std::string &vtype, SUMOTime frequency, const std::string &device)
Builds a vTypeProbe and adds it to the net.
void addE3Exit(const std::string &lane, double pos, bool friendlyPos)
Builds an exit point of an e3 detector.
void buildRouteProbe(const std::string &id, const std::string &edge, SUMOTime frequency, SUMOTime begin, const std::string &device, const std::string &vTypes)
Builds a routeProbe and adds it to the net.
void addE3Entry(const std::string &lane, double pos, bool friendlyPos)
Builds an entry point of an e3 detector.
Parameterised * buildInductLoop(const std::string &id, const std::string &lane, double pos, double length, SUMOTime splInterval, const std::string &device, bool friendlyPos, const std::string name, const std::string &vTypes, const std::string &nextEdges, int detectPersons)
Builds an e1 detector and adds it to the net.
Parameterised * buildInstantInductLoop(const std::string &id, const std::string &lane, double pos, const std::string &device, bool friendlyPos, const std::string name, const std::string &vTypes, const std::string &nextEdges)
Builds an instantenous induction and adds it to the net.
Parameterised * buildE2Detector(const std::string &id, MSLane *lane, double pos, double endPos, double length, const std::string &device, SUMOTime frequency, SUMOTime haltingTimeThreshold, double haltingSpeedThreshold, double jamDistThreshold, const std::string name, const std::string &vTypes, const std::string &nextEdges, int detectPersons, bool friendlyPos, bool showDetector, MSTLLogicControl::TLSLogicVariants *tlls=0, MSLane *toLane=0)
Builds a new E2 detector and adds it to the net's detector control. Also performs some consistency ch...
Parameterised * beginE3Detector(const std::string &id, const std::string &device, SUMOTime splInterval, double haltingSpeedThreshold, SUMOTime haltingTimeThreshold, const std::string name, const std::string &vTypes, const std::string &nextEdges, int detectPersons, bool openEntry, bool expectArrival)
Stores temporary the initial information about an e3 detector to build.
std::string getCurrentE3ID() const
Returns the id of the currently built e3 detector.
void addAction(const SUMOSAXAttributes &attrs, const std::string &basePath)
Builds an action and saves it for further use.
Interface for building edges.
virtual MSEdge * closeEdge()
Closes the building of an edge; The edge is completely described by now and may not be opened again.
virtual void addNeigh(const std::string id)
Adds a neighbor to the current lane.
void closeLane()
Closes the building of a lane; The edge is completely described by now and may not be opened again.
std::string reportCurrentEdgeOrLane() const
Return info about currently processed edge or lane.
void beginEdgeParsing(const std::string &id, const SumoXMLEdgeFunc function, const std::string &streetName, const std::string &edgeType, int priority, const std::string &bidi, double distance)
Begins building of an MSEdge.
virtual void addCrossingEdges(const std::vector< std::string > &)
add the crossingEdges in a crossing edge if present
void addStopOffsets(const StopOffset &stopOffsets)
process a stopOffset element (originates either from the active edge or lane).
virtual MSLane * addLane(const std::string &id, double maxSpeed, double friction, double length, const PositionVector &shape, double width, SVCPermissions permissions, SVCPermissions changeLeft, SVCPermissions changeRight, int index, bool isRampAccel, const std::string &type, const PositionVector &outlineShape)
Adds a lane to the current edge.
virtual MSEdge * buildEdge(const std::string &id, const SumoXMLEdgeFunc function, const std::string &streetName, const std::string &edgeType, const int priority, const double distance)
Builds an edge instance (MSEdge in this case)
void addRequest(const SUMOSAXAttributes &attrs)
adds a request item to the current junction logic
bool myHaveSeenMesoEdgeType
whether edge type specific meso paramters were loaded
Definition NLHandler.h:375
std::vector< Parameterised * > myLastParameterised
Definition NLHandler.h:357
virtual void addE2Detector(const SUMOSAXAttributes &attrs)
Builds an e2 detector using the given specification.
MSLink * myCurrentLink
the link element for the connection currently being parsed
Definition NLHandler.h:387
void addRoundabout(const SUMOSAXAttributes &attrs)
void addWAUTSwitch(const SUMOSAXAttributes &attrs)
virtual void addMesoEdgeType(const SUMOSAXAttributes &attrs)
Loads edge type specific meso parameters.
bool myCurrentIsBroken
Definition NLHandler.h:352
void addE3Entry(const SUMOSAXAttributes &attrs)
Adds an entry to the currently processed e3 detector.
void beginEdgeParsing(const SUMOSAXAttributes &attrs)
begins the processing of an edge
bool myHaveSeenAdditionalSpeedRestrictions
whether additional files contained type-specific speed limits
Definition NLHandler.h:372
std::string myCurrentDistrictID
The id of the current district.
Definition NLHandler.h:335
void addPhase(const SUMOSAXAttributes &attrs)
adds a phase to the traffic lights logic currently build
MMVersion myNetworkVersion
the loaded network version
Definition NLHandler.h:378
std::string myCurrentTypeID
The id of the currently processed edge type.
Definition NLHandler.h:344
void addAssignment(const SUMOSAXAttributes &attrs)
adds a switching condition assignment to the traffic lights logic currently build
static Parameterised * addPredecessorConstraint(int element, const SUMOSAXAttributes &attrs, MSRailSignal *rs)
virtual void addVTypeProbeDetector(const SUMOSAXAttributes &attrs)
Builds a vtype-detector using the given specification.
void addDistrictEdge(const SUMOSAXAttributes &attrs, bool isSource)
std::string myCurrentWAUTID
The id of the currently processed WAUT.
Definition NLHandler.h:341
void parseLanes(const std::string &junctionID, const std::string &def, std::vector< MSLane * > &into, bool &ok)
void addFunction(const SUMOSAXAttributes &attrs)
adds a switching condition function to the traffic lights logic currently build
int myPreviousEdgeIdx
Definition NLHandler.h:393
void addLane(const SUMOSAXAttributes &attrs)
adds a lane to the previously opened edge
void initJunctionLogic(const SUMOSAXAttributes &attrs)
begins the reading of a junction row logic
Parameterised myLastEdgeParameters
Definition NLHandler.h:356
virtual void myEndElement(int element)
Called when a closing tag occurs.
bool myHaveSeenDefaultLength
whether the loaded network contains edges with default lengths
Definition NLHandler.h:366
NLTriggerBuilder & myTriggerBuilder
The trigger builder to use.
Definition NLHandler.h:326
virtual void addInstantE1Detector(const SUMOSAXAttributes &attrs)
Builds an e1 detector using the given specification.
virtual void openJunction(const SUMOSAXAttributes &attrs)
opens a junction for processing
virtual void endE3Detector()
Builds of an e3 detector using collected values.
bool myAmParsingTLLogicOrJunction
internal information whether a tls-logic is currently read
Definition NLHandler.h:338
JunctionGraph myJunctionGraph
Definition NLHandler.h:391
void addDistrict(const SUMOSAXAttributes &attrs)
bool myCurrentIsInternalToSkip
Information whether the currently parsed edge is internal and not wished, here.
Definition NLHandler.h:319
NLEdgeControlBuilder & myEdgeControlBuilder
The edge builder to use.
Definition NLHandler.h:329
void initTrafficLightLogic(const SUMOSAXAttributes &attrs)
begins the reading of a traffic lights logic
void closeWAUT()
bool myHaveSeenInternalEdge
whether the loaded network contains internal lanes
Definition NLHandler.h:360
NLHandler(const std::string &file, MSNet &net, NLDetectorBuilder &detBuilder, NLTriggerBuilder &triggerBuilder, NLEdgeControlBuilder &edgeBuilder, NLJunctionControlBuilder &junctionBuilder)
Constructor.
Definition NLHandler.cpp:61
void addCondition(const SUMOSAXAttributes &attrs)
adds a switching condition to the traffic lights logic currently build
void setLocation(const SUMOSAXAttributes &attrs)
Parses network location description.
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
Definition NLHandler.cpp:88
bool myHaveSeenNeighs
whether the loaded network contains explicit neighbor lanes
Definition NLHandler.h:369
virtual void openWAUT(const SUMOSAXAttributes &attrs)
LinkState parseLinkState(const std::string &state)
Parses the given character into an enumeration typed link state.
NLDiscreteEventBuilder myActionBuilder
A builder for object actions.
Definition NLHandler.h:316
NLDetectorBuilder & myDetectorBuilder
The detector builder to use.
Definition NLHandler.h:323
void addConflict(const SUMOSAXAttributes &attrs)
NLJunctionControlBuilder & myJunctionControlBuilder
The junction builder to use.
Definition NLHandler.h:332
virtual void addE1Detector(const SUMOSAXAttributes &attrs)
Builds an e1 detector using the given specification.
virtual ~NLHandler()
Destructor.
Definition NLHandler.cpp:84
void addE3Exit(const SUMOSAXAttributes &attrs)
Adds an exit to the currently processed e3 detector.
void beginE3Detector(const SUMOSAXAttributes &attrs)
Starts building of an e3 detector using the given specification.
virtual void closeEdge()
Closes the process of building an edge.
void closeFunction()
adds a switching condition function to the traffic lights logic currently build
bool myHaveJunctionHigherSpeeds
Whether the network was built with higher speed on junctions.
Definition NLHandler.h:363
MSNet & myNet
The net to fill (preinitialised)
Definition NLHandler.h:313
virtual void addDeadlock(const SUMOSAXAttributes &attrs)
Loads deadlock information for preparing additional rail signal checks.
MSRailSignal * myConstrainedSignal
rail signal for which constraints are being loaded
Definition NLHandler.h:384
LinkDirection parseLinkDir(const std::string &dir)
Parses the given character into an enumeration typed link direction.
bool myNetIsLoaded
whether the location element was already loadee
Definition NLHandler.h:381
void addWAUTJunction(const SUMOSAXAttributes &attrs)
virtual void addRouteProbeDetector(const SUMOSAXAttributes &attrs)
Builds a routeProbe-detector using the given specification.
virtual void addEdgeLaneMeanData(const SUMOSAXAttributes &attrs, int objecttype)
Builds edge or lane base mean data collector using the given specification.
bool myHaveWarnedAboutInvalidTLType
Definition NLHandler.h:354
void addParam(const SUMOSAXAttributes &attrs)
void addConnection(const SUMOSAXAttributes &attrs)
adds a connection
Builder of microsim-junctions and tls.
MSTLLogicControl::TLSLogicVariants & getTLLogic(const std::string &id) const
Returns a previously build tls logic.
void closeFunction()
closes a switching condition function to the traffic lights logic currently build
MSJunction * retrieve(const std::string id)
try to retrieve junction by id
void addPhase(MSPhaseDefinition *phase)
Adds a phase to the currently built traffic lights logic.
MSTLLogicControl & getTLLogicControlToUse() const
Returns the used tls control.
void addFunction(const std::string &id, int nArgs)
adds a switching condition function to the traffic lights logic currently build
const std::string & getActiveSubKey() const
Returns the active sub key.
bool addCondition(const std::string &id, const std::string &value)
Adds a condition to the currently built traffic lights logic.
void openJunction(const std::string &id, const std::string &key, const SumoXMLNodeType type, const Position pos, const PositionVector &shape, const std::vector< MSLane * > &incomingLanes, const std::vector< MSLane * > &internalLanes, const std::string &name)
Begins the processing of the named junction.
void addParam(const std::string &key, const std::string &value)
Adds a parameter.
void initJunctionLogic(const std::string &id)
Initialises a junction logic.
void initTrafficLightLogic(const std::string &id, const std::string &programID, TrafficLightType type, SUMOTime offset)
Begins the reading of a traffic lights logic.
const std::string & getActiveKey() const
Returns the active key.
void addAssignment(const std::string &id, const std::string &check, const std::string &value)
Adds an assignment to the currently built traffic lights logic.
void addLogicItem(int request, const std::string &response, const std::string &foes, bool cont)
Adds a logic item.
void closeJunction(const std::string &basePath)
Closes (ends) the processing of the current junction.
virtual void closeTrafficLightLogic(const std::string &basePath)
Ends the building of a traffic lights logic.
const MSSimpleTrafficLightLogic::Phases & getLoadedPhases() const
return the phases loaded so far (for error reporting and cleanup)
Position getLanePos(const std::string &poiID, const std::string &laneID, double lanePos, bool friendlyPos, double lanePosLat)
get position for a given laneID (Has to be implemented in all child)
Builds trigger objects for microsim.
void parseAndBuildTractionSubstation(MSNet &net, const SUMOSAXAttributes &attrs)
Parses its values and builds a traction substation.
void addAccess(MSNet &net, const SUMOSAXAttributes &attrs)
Parses the values and adds an access point to the currently parsed stopping place.
void parseAndBuildOverheadWireSegment(MSNet &net, const SUMOSAXAttributes &attrs)
Parses its values and builds an overhead wire segment.
void parseAndBuildCalibrator(MSNet &net, const SUMOSAXAttributes &attrs, const std::string &base)
Parses his values and builds a mesoscopic or microscopic calibrator.
virtual void endParkingArea()
End a parking area.
void parseAndBuildLaneSpeedTrigger(MSNet &net, const SUMOSAXAttributes &attrs, const std::string &base)
Parses his values and builds a lane speed trigger.
void parseAndAddLotEntry(const SUMOSAXAttributes &attrs)
Parses his values and adds a lot entry to current parking area.
void updateParkingAreaDefaultCapacity()
updates the parkingArea default capacity
void buildVaporizer(const SUMOSAXAttributes &attrs)
Builds a vaporization.
void parseAndBuildRerouter(MSNet &net, const SUMOSAXAttributes &attrs)
Parses his values and builds a rerouter.
void parseAndBuildOverheadWireSection(MSNet &net, const SUMOSAXAttributes &attrs)
Parses its values and builds an overhead wire section.
void parseAndBuildChargingStation(MSNet &net, const SUMOSAXAttributes &attrs)
Parses his values and builds a charging station.
void parseAndBuildOverheadWireClamp(MSNet &net, const SUMOSAXAttributes &attrs)
Parses its values and builds an overhead wire clamp.
virtual void endStoppingPlace()
End a stopping place.
MSStoppingPlace * getCurrentStop()
void parseAndBuildStoppingPlace(MSNet &net, const SUMOSAXAttributes &attrs, const SumoXMLTag element)
Parses the values and builds a stopping places for busses, trains or container vehicles.
void parseAndBeginParkingArea(MSNet &net, const SUMOSAXAttributes &attrs)
Parses his values and builds a parking area.
const std::string & getID() const
Returns the id.
Definition Named.h:74
T get(const std::string &id) const
Retrieves an item.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
An upper class for objects with additional parameters.
void clearParameter()
Clears the parameter map.
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
void updateParameters(const Parameterised::Map &mapArg)
Adds or updates all given parameters from the map.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
static const Position INVALID
used to indicate that a position is valid
Definition Position.h:322
A list of positions.
void closePolygon()
ensures that the last position equals the first
static RGBColor parseColor(std::string coldef)
Parses a color information.
Definition RGBColor.cpp:239
virtual void myEndElement(int element)
Called when a closing tag occurs.
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
SUMOTime getOptPeriod(const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read the SUMOTime 'period' attribute.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
SUMOTime getOptOffsetReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a tls offset (SUMOTime or "begin")
SUMOTime getOptSUMOTimeReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
virtual std::string getStringSecure(int id, const std::string &def) const =0
Returns the string-value of the named (by its enum-value) attribute.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
SUMOTime getPeriod(const char *objectid, bool &ok, bool report=true) const
Tries to read the SUMOTime 'period' attribute.
SUMOTime getSUMOTimeReporting(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
static StringBijection< TrafficLightType > TrafficLightTypes
traffic light types
static StringBijection< PersonMode > PersonModeValues
person modes
static StringBijection< LinkState > LinkStates
link states
static StringBijection< LinkDirection > LinkDirections
link directions
static std::string getJunctionIDFromInternalEdge(const std::string internalEdge)
return the junction id when given an edge of type internal, crossing or WalkingArea
const Polygons & getPolygons() const
Returns all polygons.
virtual bool addPolygon(const std::string &id, const std::string &type, const RGBColor &color, double layer, double angle, const std::string &imgFile, bool relativePath, const PositionVector &shape, bool geo, bool fill, double lineWidth, bool ignorePruning=false, const std::string &name=Shape::DEFAULT_NAME)
Builds a polygon using the given values and adds it to the container.
stop offset
T get(const std::string &str) const
std::vector< std::string > getVector()
return vector of strings
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 MMVersion toVersion(const std::string &sData)
parse a (network) version string
static bool startsWith(const std::string &str, const std::string prefix)
Checks whether a given string starts with the prefix.
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Definition json.hpp:21884
edge type specific meso parameters
Definition MESegment.h:55