Eclipse SUMO - Simulation of Urban MObility
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>
40 #include <utils/common/RGBColor.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>
59 #include <guisim/GUICalibrator.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 // ===========================================================================
73 template std::vector< GLObjectValuePassConnector<double>* > GLObjectValuePassConnector<double>::myContainer;
75 
76 template std::vector< GLObjectValuePassConnector<std::pair<int, class MSPhaseDefinition> >* > GLObjectValuePassConnector<std::pair<int, class MSPhaseDefinition> >::myContainer;
78 
79 
80 // ===========================================================================
81 // member method definitions
82 // ===========================================================================
83 GUINet::GUINet(MSVehicleControl* vc, MSEventControl* beginOfTimestepEvents,
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
114  for (GUICalibrator* cw : myCalibratorWrapper) {
115  delete cw;
116  }
117  for (auto& item : myLoadedEdgeData) {
118  delete item.second;
119  }
120 }
121 
122 
123 const 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 
147 void
149  // go through the loaded tl-logics
150  for (MSTrafficLightLogic* const tll : getTLSControl().getAllLogics()) {
151  createTLWrapper(tll);
152  }
153 }
154 
155 
156 void
158  if (myLogics2Wrapper.count(tll) > 0) {
159  return;
160  }
161  // get the links
162  const MSTrafficLightLogic::LinkVectorVector& links = tll->getLinks();
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 
184 Position
185 GUINet::getJunctionPosition(const std::string& name) const {
186  // !!! no check for existance!
187  return myJunctions->get(name)->getPosition();
188 }
189 
190 
191 bool
192 GUINet::vehicleExists(const std::string& name) const {
193  return myVehicleControl->getVehicle(name) != nullptr;
194 }
195 
196 
197 int
198 GUINet::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 
212 int
213 GUINet::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 
225 void
229 }
230 
231 
232 void
234  FXMutexLock locker(myLock);
236 }
237 
238 
239 std::vector<GUIGlID>
240 GUINet::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 
251 std::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 
266 void
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);
275  myGrid.addAdditionalGLObject(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);
285  myGrid.addAdditionalGLObject(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 
366 void
369  if (OptionsCont::getOptions().isSet("alternative-net-file")) {
373  }
374 }
375 
376 
377 int
379  return myLastSimDuration +/*myLastVisDuration+*/myLastIdleDuration;
380 }
381 
382 
383 int
385  return myLastSimDuration;
386 }
387 
388 /*
389 int
390 GUINet::getVisDuration() const
391 {
392  return myLastVisDuration;
393 }
394 */
395 
396 
397 double
399  if (myLastSimDuration == 0) {
400  return -1;
401  }
402  return (double)DELTA_T / (double)myLastSimDuration;
403 }
404 
405 
406 double
407 GUINet::getUPS() const {
408  if (myLastSimDuration == 0) {
409  return -1;
410  }
411  return (double) myLastVehicleMovementCount / (double) myLastSimDuration * (double) 1000.;
412 }
413 
414 
415 double
416 GUINet::getMeanRTFactor(int duration) const {
417  if (myOverallSimDuration == 0) {
418  return -1;
419  }
420  return ((double)(duration) * (double) 1000. / (double)myOverallSimDuration);
421 }
422 
423 
424 double
426  if (myOverallSimDuration == 0) {
427  return -1;
428  }
429  return ((double)myVehiclesMoved / (double)myOverallSimDuration * (double) 1000.);
430 }
431 
432 
433 int
435  return myLastIdleDuration;
436 }
437 
438 
439 void
441  myLastSimDuration = val;
442  myOverallSimDuration += val;
445 }
446 
447 /*
448 void
449 GUINet::setVisDuration(int val)
450 {
451  myLastVisDuration = val;
452 }
453 */
454 
455 void
457  myLastIdleDuration = val;
458 }
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) {
479  GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);
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 
560 void
562 }
563 
564 
565 Boundary
567  return getBoundary();
568 }
569 
570 
571 GUINet*
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 
583  return dynamic_cast<GUIVehicleControl*>(myVehicleControl);
584 }
585 
586 
587 void
589  myLock.lock();
590 }
591 
592 
593 void
595  myLock.unlock();
596 }
597 
600  return dynamic_cast<GUIMEVehicleControl*>(myVehicleControl);
601 }
602 
603 
604 double
605 GUINet::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 
621 double
622 GUINet::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 
633 void
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 
653 std::vector<std::string>
655  edgeAttrs.erase(toString(SUMO_ATTR_ID));
656  return std::vector<std::string>(edgeAttrs.begin(), edgeAttrs.end());
657 }
658 
659 
660 void
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 
672 void
673 GUINet::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 
696 bool
697 GUINet::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 
727 std::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 
737 std::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 
748 std::vector<std::string>
749 GUINet::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 
759 bool
761  const auto it = myLogics2Wrapper.find(const_cast<MSTrafficLightLogic*>(tll));
762  return it != myLogics2Wrapper.end() && gSelected.isSelected(GLO_TLLOGIC, it->second->getGlID());
763 }
764 
765 void
767  try {
768  // gui only
770  // update the view
771  aw->handleEvent_SimulationStep(nullptr);
772  } catch (ProcessError&) { }
773 }
774 
775 void
776 GUINet::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 
785 void
787  mySkipFinalReset = true;
790  // update tracker windows
792 }
793 
794 #ifdef HAVE_OSG
795 void
796 GUINet::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:319
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)
Definition: GUICalibrator.h:42
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
Definition: GUIDesigns.cpp:42
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
Boundary getBoundary() const
Returns the boundary of the junction.
const MSJunction & getJunction() const
Returns the represented 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
SUMOTime firstIntervalBegin
Definition: GUINet.h:426
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
SUMORTree & getVisualisationSpeedUp()
Returns the RTree used for visualisation speed-up.
Definition: GUINet.h:285
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
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)
Definition: LayeredRTree.h:69
static const std::map< std::string, MSCalibrator * > & getInstances()
return all calibrator instances
Definition: MSCalibrator.h:94
const NamedObjectCont< MSDetectorFileOutput * > & getTypedDetectors(SumoXMLTag type) const
Returns the list of detectors of the given type.
void close(SUMOTime step)
Closes the detector outputs.
const std::vector< SumoXMLTag > getAvailableTypes() const
Returns the list of available detector types.
const std::map< std::string, std::vector< MSMeanData * > > & getMeanData() const
A road/street connecting two junctions.
Definition: MSEdge.h:77
static const MSEdgeVector & getAllEdges()
Returns all edges with a numerical id.
Definition: MSEdge.cpp:1034
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:1236
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:995
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:180
int getWaitingVehicleNo() const
Returns the number of waiting vehicles.
const Position & getPosition(bool secondaryShape=false) const
Definition: MSJunction.cpp:68
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:184
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition: MSNet.h:451
MSJunctionControl * myJunctions
Controls junctions, realizes right-of-way rules;.
Definition: MSNet.h:888
MMVersion myVersion
the network version
Definition: MSNet.h:982
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:378
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:713
SUMOTime myEdgeDataEndTime
end of loaded edgeData
Definition: MSNet.h:985
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition: MSNet.h:431
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:1176
long long int myVehiclesMoved
The overall number of vehicle movements.
Definition: MSNet.h:930
MSDetectorControl * myDetectorControl
Controls detectors;.
Definition: MSNet.h:894
static const double SIDEWALK_OFFSET
the offset for computing person positions when walking on edges without a sidewalk
Definition: MSPModel.h:62
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.
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.
Definition: OptionsCont.cpp:60
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.
Definition: XMLSubSys.cpp:148
auto get(const nlohmann::detail::iteration_proxy_value< IteratorType > &i) -> decltype(i.key())
Definition: json.hpp:4451