Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
GUINet.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/****************************************************************************/
21// A MSNet extended by some values for usage within the gui
22/****************************************************************************/
23#include <config.h>
24
25#include <utility>
26#include <set>
27#include <vector>
28#include <map>
37#include <utils/xml/XMLSubSys.h>
43#include <microsim/MSNet.h>
45#include <microsim/MSJunction.h>
47#include <microsim/MSEdge.h>
54#include <guisim/GUIEdge.h>
55#include <guisim/GUILane.h>
63#include <gui/GUIGlobals.h>
65#include "GUINet.h"
66
68
69
70// ===========================================================================
71// definition of static variables used for visualisation of objects' values
72// ===========================================================================
73template std::vector< GLObjectValuePassConnector<double>* > GLObjectValuePassConnector<double>::myContainer;
75
76template std::vector< GLObjectValuePassConnector<std::pair<int, class MSPhaseDefinition> >* > GLObjectValuePassConnector<std::pair<int, class MSPhaseDefinition> >::myContainer;
78
79
80// ===========================================================================
81// member method definitions
82// ===========================================================================
84 MSEventControl* endOfTimestepEvents,
85 MSEventControl* insertionEvents) :
86 MSNet(vc, beginOfTimestepEvents, endOfTimestepEvents, insertionEvents, new GUIShapeContainer(myGrid)),
87 GUIGlObject(GLO_NETWORK, "", nullptr),
88 myLastSimDuration(0), /*myLastVisDuration(0),*/ myLastIdleDuration(0),
89 myLastVehicleMovementCount(0), myOverallVehicleCount(0), myOverallSimDuration(0) {
91}
92
93
95 if (myLock.locked()) {
96 myLock.unlock();
97 }
98 // delete allocated wrappers
99 // of junctions
100 for (std::vector<GUIJunctionWrapper*>::iterator i1 = myJunctionWrapper.begin(); i1 != myJunctionWrapper.end(); i1++) {
101 delete (*i1);
102 }
103 // of additional structures
105 // of tl-logics
106 for (Logics2WrapperMap::iterator i3 = myLogics2Wrapper.begin(); i3 != myLogics2Wrapper.end(); i3++) {
107 delete (*i3).second;
108 }
109 // of detectors
110 for (std::vector<GUIDetectorWrapper*>::iterator i = myDetectorWrapper.begin(); i != myDetectorWrapper.end(); ++i) {
111 delete *i;
112 }
113 // of calibrators
115 delete cw;
116 }
117 for (auto& item : myLoadedEdgeData) {
118 delete item.second;
119 }
120}
121
122
123const Boundary&
125 return myBoundary;
126}
127
128
131 if (myPersonControl == nullptr) {
133 }
134 return *myPersonControl;
135}
136
137
140 if (myContainerControl == nullptr) {
142 }
143 return *myContainerControl;
144}
145
146
147void
149 // go through the loaded tl-logics
150 for (MSTrafficLightLogic* const tll : getTLSControl().getAllLogics()) {
151 createTLWrapper(tll);
152 }
153}
154
155
156void
158 if (myLogics2Wrapper.count(tll) > 0) {
159 return;
160 }
161 // get the links
163 if (links.size() == 0) { // @legacy this should never happen in 0.13.0+ networks
164 return;
165 }
166 // build the wrapper
168 if (tll->hasParameter("hotkeyAbort")) {
170 }
171 // build the association link->wrapper
172 MSTrafficLightLogic::LinkVectorVector::const_iterator j;
173 for (j = links.begin(); j != links.end(); ++j) {
174 MSTrafficLightLogic::LinkVector::const_iterator j2;
175 for (j2 = (*j).begin(); j2 != (*j).end(); ++j2) {
176 myLinks2Logic[*j2] = tll->getID();
177 }
178 }
180 myLogics2Wrapper[tll] = tllw;
181}
182
183
185GUINet::getJunctionPosition(const std::string& name) const {
186 // !!! no check for existance!
187 return myJunctions->get(name)->getPosition();
188}
189
190
191bool
192GUINet::vehicleExists(const std::string& name) const {
193 return myVehicleControl->getVehicle(name) != nullptr;
194}
195
196
197int
198GUINet::getLinkTLID(const MSLink* const link) const {
199 if (myLinks2Logic.count(link) == 0) {
200 //assert(false);
201 return 0;
202 }
203 MSTrafficLightLogic* tll = myLogics->getActive(myLinks2Logic.find(link)->second);
204 if (myLogics2Wrapper.count(tll) == 0) {
205 // tll may have been added via traci. @see ticket #459
206 return 0;
207 }
208 return myLogics2Wrapper.find(tll)->second->getGlID();
209}
210
211
212int
213GUINet::getLinkTLIndex(const MSLink* const link) const {
214 Links2LogicMap::const_iterator i = myLinks2Logic.find(link);
215 if (i == myLinks2Logic.end()) {
216 return -1;
217 }
218 if (myLogics2Wrapper.find(myLogics->getActive((*i).second)) == myLogics2Wrapper.end()) {
219 return -1;
220 }
221 return myLogics2Wrapper.find(myLogics->getActive((*i).second))->second->getLinkIndex(link);
222}
223
224
225void
230
231
232void
234 FXMutexLock locker(myLock);
236}
237
238
239std::vector<GUIGlID>
240GUINet::getJunctionIDs(bool includeInternal) const {
241 std::vector<GUIGlID> ret;
242 for (std::vector<GUIJunctionWrapper*>::const_iterator i = myJunctionWrapper.begin(); i != myJunctionWrapper.end(); ++i) {
243 if (!(*i)->isInternal() || includeInternal) {
244 ret.push_back((*i)->getGlID());
245 }
246 }
247 return ret;
248}
249
250
251std::vector<GUIGlID>
253 std::vector<GUIGlID> ret;
254 std::vector<std::string> ids;
255 for (std::map<MSTrafficLightLogic*, GUITrafficLightLogicWrapper*>::const_iterator i = myLogics2Wrapper.begin(); i != myLogics2Wrapper.end(); ++i) {
256 std::string sid = (*i).second->getMicrosimID();
257 if (find(ids.begin(), ids.end(), sid) == ids.end()) {
258 ret.push_back((*i).second->getGlID());
259 ids.push_back(sid);
260 }
261 }
262 return ret;
263}
264
265
266void
268 // initialise detector storage for gui
269 const std::vector<SumoXMLTag> types = myDetectorControl->getAvailableTypes();
270 for (std::vector<SumoXMLTag>::const_iterator i = types.begin(); i != types.end(); ++i) {
271 for (const auto& j : myDetectorControl->getTypedDetectors(*i)) {
272 GUIDetectorWrapper* wrapper = j.second->buildDetectorGUIRepresentation();
273 if (wrapper != nullptr) {
274 myDetectorWrapper.push_back(wrapper);
276 }
277 }
278 }
279 // let's always track emission parameters for the GUI
281 // initialise calibrators
282 for (auto& item : MSCalibrator::getInstances()) {
283 GUICalibrator* wrapper = new GUICalibrator(item.second);
284 myCalibratorWrapper.push_back(wrapper);
286 }
287 // initialise the tl-map
288 initTLMap();
289 // initialise edge storage for gui
290 const MSEdgeVector& edges = MSEdge::getAllEdges();
291 myEdgeWrapper.reserve(edges.size());
292 for (MSEdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
293 // VISIM connector edges shall be drawn (they have lanes)
294 if (!(*i)->isTazConnector() || (*i)->getLanes().size() > 0) {
295 myEdgeWrapper.push_back(static_cast<GUIEdge*>(*i));
296 }
297 }
298 // initialise junction storage for gui
299 int size = myJunctions->size();
300 myJunctionWrapper.reserve(size);
301 std::map<MSJunction*, std::string> junction2TLL;
302 for (const auto tls : getTLSControl().getAllLogics()) {
303 for (const auto& links : tls->getLinks()) {
304 for (const MSLink* l : links) {
305 junction2TLL[l->getJunction()] = l->getTLLogic()->getID();
306 }
307 }
308 }
309 for (const auto& i : *myJunctions) {
310 myJunctionWrapper.push_back(new GUIJunctionWrapper(*i.second, junction2TLL[i.second]));
311 }
312 // build the visualization tree
313 for (std::vector<GUIEdge*>::iterator i = myEdgeWrapper.begin(); i != myEdgeWrapper.end(); ++i) {
314 GUIEdge* edge = *i;
315 Boundary b;
316 const std::vector<MSLane*>& lanes = edge->getLanes();
317 for (std::vector<MSLane*>::const_iterator j = lanes.begin(); j != lanes.end(); ++j) {
318 b.add((*j)->getShape().getBoxBoundary());
319 }
320 // make sure persons are always drawn and selectable since they depend on their edge being drawn
321 b.grow(MSPModel::SIDEWALK_OFFSET + 1 + lanes.front()->getWidth() / 2);
322 const float cmin[2] = { (float)b.xmin(), (float)b.ymin() };
323 const float cmax[2] = { (float)b.xmax(), (float)b.ymax() };
324 myGrid.Insert(cmin, cmax, edge);
325 myBoundary.add(b);
326 if (myBoundary.getWidth() > 10e16 || myBoundary.getHeight() > 10e16) {
327 throw ProcessError(TL("Network size exceeds 1 Lightyear. Please reconsider your inputs.\n"));
328 }
329 }
330 for (std::vector<GUIJunctionWrapper*>::iterator i = myJunctionWrapper.begin(); i != myJunctionWrapper.end(); ++i) {
331 GUIJunctionWrapper* junction = *i;
332 Boundary b = junction->getBoundary();
333 b.grow(2.);
334 const float cmin[2] = { (float)b.xmin(), (float)b.ymin() };
335 const float cmax[2] = { (float)b.xmax(), (float)b.ymax() };
336 myGrid.Insert(cmin, cmax, junction);
337 myBoundary.add(b);
338 }
340
341 if (OptionsCont::getOptions().isSet("alternative-net-file")) {
342 // build secondary visualization tree
343 for (GUIEdge* edge : myEdgeWrapper) {
344 Boundary b;
345 for (MSLane* lane : edge->getLanes()) {
346 b.add(static_cast<GUILane*>(lane)->getShape(true).getBoxBoundary());
347 }
348 // make sure persons are always drawn and selectable since they depend on their edge being drawn
350 const float cmin[2] = { (float)b.xmin(), (float)b.ymin() };
351 const float cmax[2] = { (float)b.xmax(), (float)b.ymax() };
352 myGrid2.Insert(cmin, cmax, edge);
353 }
354 for (std::vector<GUIJunctionWrapper*>::iterator i = myJunctionWrapper.begin(); i != myJunctionWrapper.end(); ++i) {
355 GUIJunctionWrapper* junction = *i;
356 Position pos = junction->getJunction().getPosition(true);
357 Boundary b = Boundary(pos.x() - 3., pos.y() - 3., pos.x() + 3., pos.y() + 3.);
358 const float cmin[2] = { (float)b.xmin(), (float)b.ymin() };
359 const float cmax[2] = { (float)b.xmax(), (float)b.ymax() };
360 myGrid2.Insert(cmin, cmax, junction);
361 }
362 }
363}
364
365
366void
375
376
377int
379 return myLastSimDuration +/*myLastVisDuration+*/myLastIdleDuration;
380}
381
382
383int
385 return myLastSimDuration;
386}
387
388/*
389int
390GUINet::getVisDuration() const
391{
392 return myLastVisDuration;
393}
394*/
395
396
397double
399 if (myLastSimDuration == 0) {
400 return -1;
401 }
402 return (double)DELTA_T / (double)myLastSimDuration;
403}
404
405
406double
408 if (myLastSimDuration == 0) {
409 return -1;
410 }
411 return (double) myLastVehicleMovementCount / (double) myLastSimDuration * (double) 1000.;
412}
413
414
415double
416GUINet::getMeanRTFactor(int duration) const {
417 if (myOverallSimDuration == 0) {
418 return -1;
419 }
420 return ((double)(duration) * (double) 1000. / (double)myOverallSimDuration);
421}
422
423
424double
426 if (myOverallSimDuration == 0) {
427 return -1;
428 }
429 return ((double)myVehiclesMoved / (double)myOverallSimDuration * (double) 1000.);
430}
431
432
433int
437
438
439void
446
447/*
448void
449GUINet::setVisDuration(int val)
450{
451 myLastVisDuration = val;
452}
453*/
454
455void
459
460
463 GUISUMOAbstractView& parent) {
464 GUIGLObjectPopupMenu* ret = new GUIGLObjectPopupMenu(app, parent, *this);
465 buildPopupHeader(ret, app);
468 buildPositionCopyEntry(ret, app);
469 if (GeoConvHelper::getFinal().usingGeoProjection()) {
470 GUIDesigns::buildFXMenuCommand(ret, TL("Copy view geo-boundary to clipboard"), nullptr, ret, MID_COPY_VIEW_GEOBOUNDARY);
471 }
472 return ret;
473}
474
475
478 GUISUMOAbstractView& parent) {
480 // add items
481 ret->mkItem(TL("loaded vehicles [#]"), true,
483 ret->mkItem(TL("insertion-backlogged vehicles [#]"), true,
485 ret->mkItem(TL("departed vehicles [#]"), true,
487 ret->mkItem(TL("running vehicles [#]"), true,
489 ret->mkItem(TL("arrived vehicles [#]"), true,
491 ret->mkItem(TL("discarded vehicles [#]"), true,
493 ret->mkItem(TL("collisions [#]"), true,
495 ret->mkItem(TL("teleports [#]"), true,
497 ret->mkItem(TL("halting [#]"), true,
499 ret->mkItem(TL("stopped [#]"), true,
501 ret->mkItem(TL("avg. speed [m/s]"), true,
503 ret->mkItem(TL("avg. relative speed"), true,
505 if (myPersonControl != nullptr) {
506 ret->mkItem(TL("loaded persons [#]"), true,
508 ret->mkItem(TL("running persons [#]"), true,
510 ret->mkItem(TL("jammed persons [#]"), true,
512 }
513 ret->mkItem(TL("end time [s]"), false, OptionsCont::getOptions().getString("end"));
514 ret->mkItem(TL("begin time [s]"), false, OptionsCont::getOptions().getString("begin"));
515// ret->mkItem(TL("time step [s]"), true, new FunctionBinding<GUINet, SUMOTime>(this, &GUINet::getCurrentTimeStep));
516 if (logSimulationDuration()) {
517 ret->mkItem(TL("step duration [ms]"), true, new FunctionBinding<GUINet, int>(this, &GUINet::getWholeDuration));
519 ret->mkItem(TL("simulation duration [ms]"), true, new FunctionBinding<GUINet, int>(this, &GUINet::getSimDuration));
520 /*
521 ret->mkItem(TL("visualisation duration [ms]"), true,
522 new CastingFunctionBinding<GUINet, double, int>(
523 &(getNet()), &GUINet::getVisDuration));
524 */
525 ret->mkItem(TL("idle duration [ms]"), true, new FunctionBinding<GUINet, int>(this, &GUINet::getIdleDuration));
526 ret->mkItem(TL("duration factor"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getRTFactor));
527 /*
528 ret->mkItem(TL("mean duration factor []"), true,
529 new FuncBinding_IntParam<GUINet, double>(
530 &(getNet()), &GUINet::getMeanRTFactor), 1);
531 */
532 ret->mkItem(TL("updates per second"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getUPS));
533 ret->mkItem(TL("avg. updates per second"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getMeanUPS));
534 }
535 if (OptionsCont::getOptions().isSet("tripinfo-output") || OptionsCont::getOptions().getBool("duration-log.statistics")) {
536 ret->mkItem(TL("avg. trip length [m]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgRouteLength));
537 ret->mkItem(TL("avg. trip duration [s]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgDuration));
538 ret->mkItem(TL("avg. trip waiting time [s]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgWaitingTime));
539 ret->mkItem(TL("avg. trip time loss [s]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgTimeLoss));
540 ret->mkItem(TL("avg. trip depart delay [s]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgDepartDelay));
541 ret->mkItem(TL("avg. trip speed [m/s]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgTripSpeed));
542 if (myPersonControl != nullptr) {
543 ret->mkItem(TL("avg. walk length [m]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgWalkRouteLength));
544 ret->mkItem(TL("avg. walk duration [s]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgWalkDuration));
545 ret->mkItem(TL("avg. walk time loss [s]"), true, new FunctionBinding<GUINet, double>(this, &GUINet::getAvgWalkTimeLoss));
546 }
547 }
548 ret->mkItem(TL("nodes [#]"), false, (int)getJunctionIDs(false).size());
549 ret->mkItem(TL("edges [#]"), false, (int)GUIEdge::getIDs(false).size());
550 ret->mkItem(TL("total edge length [km]"), false, GUIEdge::getTotalLength(false, false) / 1000);
551 ret->mkItem(TL("total lane length [km]"), false, GUIEdge::getTotalLength(false, true) / 1000);
552 ret->mkItem(TL("network version "), false, toString(myVersion));
553
554 // close building
555 ret->closeBuilding();
556 return ret;
557}
558
559
560void
562}
563
564
567 return getBoundary();
568}
569
570
571GUINet*
573 GUINet* net = dynamic_cast<GUINet*>(MSNet::getInstance());
574 if (net != nullptr) {
575 return net;
576 }
577 throw ProcessError("A gui-network was not yet constructed.");
578}
579
580
585
586
587void
589 myLock.lock();
590}
591
592
593void
595 myLock.unlock();
596}
597
602
603
604double
605GUINet::getEdgeData(const MSEdge* edge, const std::string& attr) {
606 auto it = myLoadedEdgeData.find(attr);
607 if (it != myLoadedEdgeData.end()) {
608 double value;
609 bool found = it->second->retrieveExistingEffort(edge, STEPS2TIME(getCurrentTimeStep()), value);
610 if (found) {
611 return value;
612 } else {
614 }
615 } else {
617 }
618}
619
620
621double
622GUINet::getMeanData(const MSLane* lane, const std::string& id, const std::string& attr) {
623 auto item = myDetectorControl->getMeanData().find(id);
624 if (item != myDetectorControl->getMeanData().end() && !item->second.empty()) {
626 return item->second.front()->getAttributeValue(lane, a, GUIVisualizationSettings::MISSING_DATA);
627 } else {
629 }
630}
631
632
633void
635 if (element == SUMO_TAG_EDGE || element == SUMO_TAG_LANE) {
636 std::vector<std::string> tmp = attrs.getAttributeNames();
637 edgeAttrs.insert(tmp.begin(), tmp.end());
638 } else if (element == SUMO_TAG_EDGEREL) {
639 for (const std::string& a : attrs.getAttributeNames()) {
640 if (a != "from" && a != "to") {
641 edgeAttrs.insert(a);
642 }
643 }
644 } else if (element == SUMO_TAG_INTERVAL) {
645 bool ok;
646 numIntervals++;
649 }
650}
651
652
653std::vector<std::string>
655 edgeAttrs.erase(toString(SUMO_ATTR_ID));
656 return std::vector<std::string>(edgeAttrs.begin(), edgeAttrs.end());
657}
658
659
660void
662 double value, double begTime, double endTime) const {
663 MSEdge* const edge = MSEdge::dictionary(id);
664 if (edge != nullptr) {
665 myWeightStorage->addEffort(edge, begTime, endTime, value);
666 } else {
667 WRITE_WARNINGF(TL("Trying to set data value for the unknown edge '%'."), id);
668 }
669}
670
671
672void
673GUINet::EdgeFloatTimeLineRetriever_GUI::addEdgeRelWeight(const std::string& from, const std::string& to,
674 double val, double beg, double end) const {
675 MSEdge* const fromEdge = MSEdge::dictionary(from);
676 MSEdge* const toEdge = MSEdge::dictionary(to);
677 bool haveRel = false;
678 if (fromEdge != nullptr && toEdge != nullptr) {
679 for (auto item : fromEdge->getViaSuccessors()) {
680 if (item.first == toEdge) {
681 const MSEdge* edge = item.second;
682 while (edge != nullptr && edge->isInternal()) {
683 myWeightStorage->addEffort(edge, beg, end, val);
684 edge = edge->getViaSuccessors().front().second;
685 haveRel = true;
686 }
687 }
688 }
689 }
690 if (!haveRel) {
691 WRITE_WARNINGF(TL("Trying to set data value for the unknown relation from edge '%' to edge '%'."), from, to);
692 }
693}
694
695
696bool
697GUINet::loadEdgeData(const std::string& file) {
698 // discover edge attributes
699 DiscoverAttributes discoveryHandler(file);
700 XMLSubSys::runParser(discoveryHandler, file);
701 std::vector<std::string> attrs = discoveryHandler.getEdgeAttrs();
702 WRITE_MESSAGE("Loading edgedata from '" + file + "':"
703 + "\n " + toString(discoveryHandler.numIntervals) + " intervals between"
704 + " " + time2string(discoveryHandler.firstIntervalBegin) + " and"
705 + " " + time2string(discoveryHandler.lastIntervalEnd)
706 + ".\n Found " + toString(attrs.size())
707 + " attributes: " + toString(attrs));
708 if (discoveryHandler.lastIntervalEnd < string2time(OptionsCont::getOptions().getString("begin"))) {
709 WRITE_WARNING(TL("No data defined after simulation begin time."));
710 }
712 // create a retriever for each attribute
713 std::vector<EdgeFloatTimeLineRetriever_GUI> retrieverDefsInternal;
714 retrieverDefsInternal.reserve(attrs.size());
715 std::vector<SAXWeightsHandler::ToRetrieveDefinition*> retrieverDefs;
716 for (const std::string& attr : attrs) {
718 myLoadedEdgeData[attr] = ws;
719 retrieverDefsInternal.push_back(EdgeFloatTimeLineRetriever_GUI(ws));
720 retrieverDefs.push_back(new SAXWeightsHandler::ToRetrieveDefinition(attr, true, retrieverDefsInternal.back()));
721 }
722 SAXWeightsHandler handler(retrieverDefs, "");
723 return XMLSubSys::runParser(handler, file);
724}
725
726
727std::vector<std::string>
729 std::vector<std::string> result;
730 for (const auto& item : myLoadedEdgeData) {
731 result.push_back(item.first);
732 }
733 return result;
734}
735
736
737std::vector<std::string>
739 std::vector<std::string> result;
740
741 for (auto item : myDetectorControl->getMeanData()) {
742 result.push_back(item.first);
743 }
744 std::sort(result.begin(), result.end());
745 return result;
746}
747
748std::vector<std::string>
749GUINet::getMeanDataAttrs(const std::string& meanDataID) const {
750 auto item = myDetectorControl->getMeanData().find(meanDataID);
751 if (item != myDetectorControl->getMeanData().end() && !item->second.empty()) {
752 return item->second.front()->getAttributeNames();
753 } else {
754 return std::vector<std::string>();
755 }
756}
757
758
759bool
761 const auto it = myLogics2Wrapper.find(const_cast<MSTrafficLightLogic*>(tll));
762 return it != myLogics2Wrapper.end() && gSelected.isSelected(GLO_TLLOGIC, it->second->getGlID());
763}
764
765void
767 try {
768 // gui only
770 // update the view
771 aw->handleEvent_SimulationStep(nullptr);
772 } catch (ProcessError&) { }
773}
774
775void
776GUINet::addHotkey(int key, Command* press, Command* release) {
777 try {
778 // gui only
780 // update the view
781 aw->addHotkey(key, press, release);
782 } catch (ProcessError&) { }
783}
784
785void
787 mySkipFinalReset = true;
790 // update tracker windows
792}
793
794#ifdef HAVE_OSG
795void
796GUINet::updateColor(const GUIVisualizationSettings& s) {
797 for (std::vector<GUIEdge*>::const_iterator i = myEdgeWrapper.begin(); i != myEdgeWrapper.end(); ++i) {
798 if (!(*i)->isInternal()) {
799 const std::vector<MSLane*>& lanes = (*i)->getLanes();
800 for (std::vector<MSLane*>::const_iterator j = lanes.begin(); j != lanes.end(); ++j) {
801 static_cast<GUILane*>(*j)->updateColor(s);
802 }
803 }
804 }
805 for (std::vector<GUIJunctionWrapper*>::iterator i = myJunctionWrapper.begin(); i != myJunctionWrapper.end(); ++i) {
806 (*i)->updateColor(s);
807 }
808}
809#endif
810
811
812/****************************************************************************/
@ MID_COPY_VIEW_GEOBOUNDARY
Copy view geo-coordinate boundary - popup entry.
Definition GUIAppEnum.h:465
@ GLO_NETWORK
The network - empty.
@ GLO_TLLOGIC
a tl-logic
GUISelectedStorage gSelected
A global holder of selected objects.
std::vector< MSEdge * > MSEdgeVector
Definition MSEdge.h:73
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:296
#define WRITE_MESSAGE(msg)
Definition MsgHandler.h:297
#define WRITE_WARNING(msg)
Definition MsgHandler.h:295
#define TL(string)
Definition MsgHandler.h:315
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:69
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define SIMSTEP
Definition SUMOTime.h:61
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_EDGEREL
a relation between two edges
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_EDGE
begin/end of the description of an edge
SumoXMLAttr
Numbers representing SUMO-XML - attributes.
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_ID
T MIN2(T a, T b)
Definition StdDefs.h:76
T MAX2(T a, T b)
Definition StdDefs.h:82
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
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition Boundary.cpp:78
double ymin() const
Returns minimum y-coordinate.
Definition Boundary.cpp:130
double xmin() const
Returns minimum x-coordinate.
Definition Boundary.cpp:118
Boundary & grow(double by)
extends the boundary by the given amount
Definition Boundary.cpp:343
double getHeight() const
Returns the height of the boundary (y-axis)
Definition Boundary.cpp:160
double getWidth() const
Returns the width of the boudary (x-axis)
Definition Boundary.cpp:154
double ymax() const
Returns maximum y-coordinate.
Definition Boundary.cpp:136
double xmax() const
Returns maximum x-coordinate.
Definition Boundary.cpp:124
static bool registerHotkey(const std::string &key, MSTrafficLightLogic &tll)
register hotkey actions
Base (microsim) event class.
Definition Command.h:50
Class passing values from a GUIGlObject to another object.
static void updateAll()
Updates all instances (passes values)
The main window of the SUMO-gui.
void handleEvent_SimulationStep(GUIEvent *e)
called when event "simulation step" ocurred
void addHotkey(int key, Command *press, Command *release)
register custom hotkey action
Changes the speed allowed on a set of lanes (gui version)
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
A road/street connecting two junctions (gui-version)
Definition GUIEdge.h:51
static double getTotalLength(bool includeInternal, bool eachLane)
Definition GUIEdge.cpp:119
static std::vector< GUIGlID > getIDs(bool includeInternal)
Definition GUIEdge.cpp:104
The popup menu of a globject.
static void clearDictionary()
Clears the dictionary (the objects will not be deleted)
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
void setNetObject(GUIGlObject *object)
Sets the given object as the "network" object.
static GUIGlObjectStorage gIDStorage
A single static instance of this class.
static bool gSecondaryShape
whether secondary shapes are currently being drawn
Definition GUIGlobals.h:49
const MSJunction & getJunction() const
Returns the represented junction.
Boundary getBoundary() const
Returns the boundary of the junction.
Representation of a lane in the micro simulation (gui-version)
Definition GUILane.h:60
const PositionVector & getShape(bool secondary) const override
Definition GUILane.cpp:1091
The class responsible for building and deletion of vehicles (gui-version)
static GUIMainWindow * getInstance()
get instance
class for discovering edge attributes
Definition GUINet.h:419
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Callback method for an opening tag to implement by derived classes.
Definition GUINet.cpp:634
std::set< std::string > edgeAttrs
Definition GUINet.h:430
std::vector< std::string > getEdgeAttrs()
Definition GUINet.cpp:654
void addEdgeWeight(const std::string &id, double val, double beg, double end) const
Adds an effort for a given edge and time period.
Definition GUINet.cpp:661
void addEdgeRelWeight(const std::string &from, const std::string &to, double val, double beg, double end) const
Definition GUINet.cpp:673
A MSNet extended by some values for usage within the gui.
Definition GUINet.h:82
double getAvgTripSpeed() const
Definition GUINet.h:221
double getAvgRouteLength() const
Definition GUINet.h:206
double getAvgDuration() const
Definition GUINet.h:209
int getWholeDuration() const
Returns the duration of the last step (sim+visualisation+idle) (in ms)
Definition GUINet.cpp:378
Boundary getCenteringBoundary() const override
Returns the boundary to which the view shall be centered in order to show the object.
Definition GUINet.cpp:566
void setIdleDuration(int val)
Sets the duration of the last step's idle part.
Definition GUINet.cpp:456
GUIVehicleControl * getGUIVehicleControl()
Returns the vehicle control.
Definition GUINet.cpp:582
void unlock()
release exclusive access to the simulation state
Definition GUINet.cpp:594
double getUPS() const
Returns the update per seconds rate.
Definition GUINet.cpp:407
bool loadEdgeData(const std::string &file)
load edgeData from file
Definition GUINet.cpp:697
void drawGL(const GUIVisualizationSettings &s) const override
Draws the object.
Definition GUINet.cpp:561
long myLastVehicleMovementCount
Definition GUINet.h:410
std::vector< GUIGlID > getJunctionIDs(bool includeInternal) const
Definition GUINet.cpp:240
MSTransportableControl & getPersonControl() override
Returns the person control.
Definition GUINet.cpp:130
FXMutex myLock
The mutex used to avoid concurrent updates of the vehicle buffer.
Definition GUINet.h:460
void flushOutputsAtEnd()
flush outputs once the simulation has reached its end
Definition GUINet.cpp:786
bool mySkipFinalReset
Definition GUINet.h:416
bool isSelected(const MSTrafficLightLogic *tll) const override
return wheter the given logic (or rather it's wrapper) is selected in the GUI
Definition GUINet.cpp:760
~GUINet()
Destructor.
Definition GUINet.cpp:94
long myOverallVehicleCount
Definition GUINet.h:410
void simulationStep()
Performs a single simulation step (locking the simulation)
Definition GUINet.cpp:233
int getSimDuration() const
Returns the duration of the last step's simulation part (in ms)
Definition GUINet.cpp:384
SUMORTree myGrid2
The visualization speed-up for secondary shapes.
Definition GUINet.h:378
void initGUIStructures()
Initialises gui wrappers.
Definition GUINet.cpp:267
long myOverallSimDuration
Definition GUINet.h:411
std::vector< std::string > getEdgeDataAttrs() const
return list of loaded edgeData attributes
Definition GUINet.cpp:728
const Boundary & getBoundary() const
returns the bounder of the network
Definition GUINet.cpp:124
double getRTFactor() const
Returns the simulation speed as a factor to real time.
Definition GUINet.cpp:398
void registerRenderedObject(GUIGlObject *o)
add object into rtree
Definition GUINet.cpp:367
std::vector< GUIEdge * > myEdgeWrapper
Wrapped MS-edges.
Definition GUINet.h:384
double getAvgWalkDuration() const
Definition GUINet.h:227
int getLinkTLID(const MSLink *const link) const
Definition GUINet.cpp:198
void setSimDuration(int val)
Sets the duration of the last step's simulation part.
Definition GUINet.cpp:440
SUMORTree & getVisualisationSpeedUp()
Returns the RTree used for visualisation speed-up.
Definition GUINet.h:285
std::vector< GUICalibrator * > myCalibratorWrapper
A calibrator dictionary.
Definition GUINet.h:393
std::vector< std::string > getMeanDataIDs() const
return list of loaded edgeData ids (being computed in the current simulation)
Definition GUINet.cpp:738
double getMeanUPS() const
Returns the update per seconds rate.
Definition GUINet.cpp:425
double getMeanData(const MSLane *lane, const std::string &id, const std::string &attr)
retrieve live lane/edge weight for the given meanData id and attribute
Definition GUINet.cpp:622
void initTLMap()
Initialises the tl-logic map and wrappers.
Definition GUINet.cpp:148
int getLinkTLIndex(const MSLink *const link) const
Definition GUINet.cpp:213
Boundary myBoundary
The networks boundary.
Definition GUINet.h:381
double getAvgWalkTimeLoss() const
Definition GUINet.h:230
std::vector< GUIGlID > getTLSIDs() const
Returns the gl-ids of all traffic light logics within the net.
Definition GUINet.cpp:252
std::map< std::string, MSEdgeWeightsStorage * > myLoadedEdgeData
loaded edge data for visualization
Definition GUINet.h:414
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own parameter window.
Definition GUINet.cpp:477
Logics2WrapperMap myLogics2Wrapper
The traffic light-to-wrapper map.
Definition GUINet.h:404
int getIdleDuration() const
Returns the duration of the last step's idle part (in ms)
Definition GUINet.cpp:434
double getMeanRTFactor(int duration) const
Returns the simulation speed as a factor to real time.
Definition GUINet.cpp:416
void createTLWrapper(MSTrafficLightLogic *tll) override
creates a wrapper for the given logic
Definition GUINet.cpp:157
bool vehicleExists(const std::string &name) const
returns the information whether the vehicle still exists
Definition GUINet.cpp:192
std::vector< GUIDetectorWrapper * > myDetectorWrapper
A detector dictionary.
Definition GUINet.h:390
void addHotkey(int key, Command *press, Command *release=nullptr)
register custom hotkey action
Definition GUINet.cpp:776
double getAvgWalkRouteLength() const
Definition GUINet.h:224
void lock()
grant exclusive access to the simulation state
Definition GUINet.cpp:588
std::vector< GUIJunctionWrapper * > myJunctionWrapper
Wrapped MS-junctions.
Definition GUINet.h:387
void updateGUI() const override
update view after simulation.loadState
Definition GUINet.cpp:766
static GUINet * getGUIInstance()
Returns the pointer to the unique instance of GUINet (singleton).
Definition GUINet.cpp:572
double getAvgTimeLoss() const
Definition GUINet.h:215
double getAvgDepartDelay() const
Definition GUINet.h:218
double getEdgeData(const MSEdge *edge, const std::string &attr)
retrieve loaded edged weight for the given attribute and the current simulation time
Definition GUINet.cpp:605
double getAvgWaitingTime() const
Definition GUINet.h:212
friend class GUITrafficLightLogicWrapper
Definition GUINet.h:84
std::vector< std::string > getMeanDataAttrs(const std::string &meanDataID) const
return list of available attributes for the given meanData id
Definition GUINet.cpp:749
int myLastSimDuration
The step durations (simulation, /*visualisation, *‍/idle)
Definition GUINet.h:408
Position getJunctionPosition(const std::string &name) const
returns the position of a junction
Definition GUINet.cpp:185
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent) override
Returns an own popup-menu.
Definition GUINet.cpp:462
int myLastIdleDuration
Definition GUINet.h:408
void guiSimulationStep()
Some further steps needed for gui processing.
Definition GUINet.cpp:226
MSTransportableControl & getContainerControl() override
Returns the container control.
Definition GUINet.cpp:139
GUINet(MSVehicleControl *vc, MSEventControl *beginOfTimestepEvents, MSEventControl *endOfTimestepEvents, MSEventControl *insertionEvents)
Constructor.
Definition GUINet.cpp:83
GUIMEVehicleControl * getGUIMEVehicleControl()
Returns the vehicle control.
Definition GUINet.cpp:599
Links2LogicMap myLinks2Logic
The link-to-logic-id map.
Definition GUINet.h:398
LayeredRTree myGrid
The visualization speed-up.
Definition GUINet.h:375
A window containing a gl-object's parameter.
void mkItem(const char *name, bool dynamic, ValueSource< T > *src)
Adds a row which obtains its value from a ValueSource.
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
double getFPS() const
retrieve FPS
bool isSelected(GUIGlObjectType type, GUIGlID id)
Returns the information whether the object with the given type and id is selected.
Storage for geometrical objects extended by mutexes.
GUI-version of the transportable control for building gui persons and containers.
The class responsible for building and deletion of vehicles (gui-version)
Stores the information about how to visualize structures.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
void Insert(const float a_min[2], const float a_max[2], GUIGlObject *const &a_dataId)
Insert entry (delegate to appropriate layer)
static const std::map< std::string, MSCalibrator * > & getInstances()
return all calibrator instances
const NamedObjectCont< MSDetectorFileOutput * > & getTypedDetectors(SumoXMLTag type) const
Returns the list of detectors of the given type.
const std::map< std::string, std::vector< MSMeanData * > > & getMeanData() const
void close(SUMOTime step)
Closes the detector outputs.
const std::vector< SumoXMLTag > getAvailableTypes() const
Returns the list of available detector types.
A road/street connecting two junctions.
Definition MSEdge.h:77
static const MSEdgeVector & getAllEdges()
Returns all edges with a numerical id.
Definition MSEdge.cpp:1086
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
const MSConstEdgePairVector & getViaSuccessors(SUMOVehicleClass vClass=SVC_IGNORING, bool ignoreTransientPermissions=false) const
Returns the following edges with internal vias, restricted by vClass.
Definition MSEdge.cpp:1288
bool isInternal() const
return whether this edge is an internal edge
Definition MSEdge.h:268
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
A storage for edge travel times and efforts.
Stores time-dependant events and executes them at the proper time.
static bool gHaveEmissions
Whether emission output of some type is needed (files or GUI)
Definition MSGlobals.h:183
int getWaitingVehicleNo() const
Returns the number of waiting vehicles.
const Position & getPosition(bool secondaryShape=false) const
Representation of a lane in the micro simulation.
Definition MSLane.h:84
The simulated network and simulation perfomer.
Definition MSNet.h:89
MSTransportableControl * myPersonControl
Controls person building and deletion;.
Definition MSNet.h:882
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:185
MSJunctionControl * myJunctions
Controls junctions, realizes right-of-way rules;.
Definition MSNet.h:888
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition MSNet.h:451
MMVersion myVersion
the network version
Definition MSNet.h:982
MSVehicleControl * myVehicleControl
Controls vehicle building and deletion;.
Definition MSNet.h:880
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:320
MSTransportableControl * myContainerControl
Controls container building and deletion;.
Definition MSNet.h:884
void simulationStep(const bool onlyMove=false)
Performs a single simulation step.
Definition MSNet.cpp:714
SUMOTime myEdgeDataEndTime
end of loaded edgeData
Definition MSNet.h:985
MSTLLogicControl * myLogics
Controls tls logics, realizes waiting on tls rules;.
Definition MSNet.h:890
bool logSimulationDuration() const
Returns whether duration shall be logged.
Definition MSNet.cpp:1183
long long int myVehiclesMoved
The overall number of vehicle movements.
Definition MSNet.h:930
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition MSNet.h:431
MSDetectorControl * myDetectorControl
Controls detectors;.
Definition MSNet.h:894
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:378
static const double SIDEWALK_OFFSET
the offset for computing person positions when walking on edges without a sidewalk
Definition MSPModel.h:62
std::vector< MSTrafficLightLogic * > getAllLogics() const
Returns a vector which contains all logics.
MSTrafficLightLogic * getActive(const std::string &id) const
Returns the active program of a named tls.
The parent class for traffic light logics.
const LinkVectorVector & getLinks() const
Returns the list of lists of all affected links.
int getLinkIndex(const MSLink *const link) const
Returns the index of the given link.
std::vector< LinkVector > LinkVectorVector
Definition of a list that holds lists of links that do have the same attribute.
int getRunningNumber() const
Returns the number of build and inserted, but not yet deleted transportables.
int getLoadedNumber() const
Returns the number of build transportables.
int getJammedNumber() const
Returns the number of times a transportables was jammed.
The class responsible for building and deletion of vehicles.
int getRunningVehicleNo() const
Returns the number of build and inserted, but not yet deleted vehicles.
int getLoadedVehicleNo() const
Returns the number of build vehicles.
int getCollisionCount() const
return the number of collisions
int getStoppedVehiclesCount() const
return the number of vehicles that are currently stopped
double getVehicleMeanSpeed() const
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
int getDepartedVehicleNo() const
Returns the number of inserted vehicles.
int getArrivedVehicleNo() const
Returns the number of arrived vehicles.
virtual int getHaltingVehicleNo() const
Returns the number of halting vehicles.
int getTeleportCount() const
return the number of teleports (including collisions)
double getVehicleMeanSpeedRelative() const
int getDiscardedVehicleNo() const
Returns the number of discarded vehicles.
const std::string & getID() const
Returns the id.
Definition Named.h:74
T get(const std::string &id) const
Retrieves an item.
int size() const
Returns the number of stored items within the container.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
static OptionsCont & getOptions()
Retrieves the options.
static void flushAll()
bool hasParameter(const std::string &key) const
Returns whether the parameter is set.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
double x() const
Returns the x-position.
Definition Position.h:55
double y() const
Returns the y-position.
Definition Position.h:60
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
Complete definition about what shall be retrieved and where to store it.
An XML-handler for network weights.
void addAdditionalGLObject(GUIGlObject *o, const double exaggeration=1)
Adds an additional object (detector/shape/trigger) for visualisation.
Definition SUMORTree.h:124
virtual void Insert(const float a_min[2], const float a_max[2], GUIGlObject *const &a_dataId)
Insert entry.
Definition SUMORTree.h:91
Encapsulated SAX-Attributes.
virtual std::vector< std::string > getAttributeNames() const =0
Retrieves all attribute names.
SUMOTime getSUMOTimeReporting(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
static SequentialStringBijection Attrs
The names of SUMO-XML attributes for use in netbuild.
static bool runParser(GenericSAXHandler &handler, const std::string &file, const bool isNet=false, const bool isRoute=false, const bool isExternal=false, const bool catchExceptions=true)
Runs the given handler on the given file; returns if everything's ok.